From f89719902615823be2a1ddc1b5082f52eed31984 Mon Sep 17 00:00:00 2001
From: nidapeng <jp@doumee.com>
Date: 星期四, 25 四月 2024 09:11:47 +0800
Subject: [PATCH] 最新版本

---
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberRoleMapper.java                                         |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeRequest.java                     |   11 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java                                                  |  113 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AccountLoginDTO.java                                       |   28 
 server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerConfig.java                                                  |  123 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/InterfaceLogService.java                                  |   99 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserTimeRangeInfoResponse.java            |   57 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskPersonDetailRequest.java              |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/UserActionMapper.java                                         |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/FacePictureCheckResponse.java             |   29 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentListRequest.java               |   36 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/CardInfoResponse.java                     |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentCancelRequest.java        |   11 
 server/visits/dmvisit_service/src/main/resources/application-testYL.yml                                                           |   80 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/EmpowerJoinMapper.java                                   |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java                                 |  164 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java                                       |   12 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroToken.java                                                       |   80 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/PrivilegeGroupRequest.java                |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKResponseCode.java                                     |   52 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/ProblemLogJoinMapper.java                                |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddFaceRequest.java                   |   12 
 server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java                                             |   45 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java                               | 1169 +++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java                     |  292 +
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AcsDeviceStatusListRequest.java           |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java                                             |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/EventDeviceDataRequest.java     |   65 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ProblemsVO.java                                           |   43 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java                                       |  107 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java                                                  |   30 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java                              |  159 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkReservationAddResponse.java           |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java                                         |   70 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkInResultRequest.java |    9 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentMDJRequest.java           |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseResponse.java                                 |   20 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TempCarInRecordListRequest.java           |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/LaborMemberDTO.java                                      |   50 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserInfoResponse.java                     |   23 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserAuthorRequest.java                      |   24 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleInfoResponse.java                  |   28 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java                              |  198 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionFaceRequest.java          |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskAdditionRequest.java                  |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/OrgDelRequest.java                        |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/TemplateData.java                                                  |   19 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ProblemsService.java                                      |  115 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ParkReservationDelRequest.java            |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgTimeRangeInfoResponse.java             |   20 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroConfig.java                                                      |  147 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java                      |   53 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/CarAuthorRequest.java                       |   28 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/EventSubRequest.java                      |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitMemberDTO.java                                        |   22 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/TrainTimeMapper.java                                          |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/sdk/HIKCSDemo.java                                            |  151 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressResponse.java                 |   13 
 server/visits/dmvisit_service/db/business.empower.permissions.sql                                                                 |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitEventJoinMapper.java                                |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserAddResponse.java                      |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionRequest.java              |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WxMiniUtilService.java                                             |   53 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AuthItemListResponse.java                 |   13 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java                                         |  164 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserFailRequest.java                    |   23 
 server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java                                       |   23 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ApproveVO.java                                            |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java                                         |   90 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java                                                |   25 
 server/visits/dmvisit_service/db/business.problem_log.permissions.sql                                                             |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigParam.java                                    |   24 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CarEventMapper.java                                           |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/VisitEventVo.java                                          |   47 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberRoleServiceImpl.java                           |  136 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentInfoResponse.java              |   53 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/EmpowerMapper.java                                            |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/TokenRequest.java                           |   19 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/CarEventJoinMapper.java                                  |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CarChargeDelRequest.java                  |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitsJoinMapper.java                                    |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddRequest.java                       |   24 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceEventServiceImpl.java                          |  423 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailFaceInfoResponse.java     |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/VisitEventDTO.java                                      |  137 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkRlsRequest.java      |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WXConstant.java                                                    |   19 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserInfoRequest.java                    |   26 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCache.java                                                       |  159 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java                                       |   86 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/VisitListRequest.java                       |   37 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/CarEventDTO.java                                        |  192 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ApproveParamDataVO.java                                    |   24 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ProblemsServiceImpl.java                             |  251 +
 server/visits/dmvisit_service/db/business.approve.permissions.sql                                                                 |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CompanyMapper.java                                            |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsInfoResponse.java                    |   31 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CompanyEconomicsVo.java                                    |   84 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java                                        |  210 +
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/RoleListRequest.java                        |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProblemLogVo.java                                          |   37 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardLossRequest.java                      |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkCrossRecordInfoResponse.java          |   37 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/OptionsObject.java                                       |   18 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitRecordDTO.java                                        |   37 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/DeviceJoinMapper.java                                    |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/DevicePictureRequest.java                 |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java                           |  484 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/AccessTokenResponse.java                   |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ProblemLog.java                                         |  104 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java                         |  164 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/ApproveNoticeRequest.java                   |   31 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/StagingDataVO.java                                      |   47 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/SortRequest.java                          |   12 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java                                              |   85 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AscDeviceStatusInfoResponse.java          |   29 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java                                           |   36 
 server/visits/dmvisit_service/src/main/resources/application-dev.yml                                                              |   83 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/CarEventListResponse.java                  |   67 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberCardMapper.java                                         |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CarEventService.java                                      |  114 
 server/visits/dmvisit_service/db/business.device.permissions.sql                                                                  |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddResponse.java                 |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CategoryMapper.java                                           |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressDetailResponse.java           |   11 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java                                          |   40 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/InterfaceLog.java                                       |   98 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java                                             |  300 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java                                    |   86 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/DoorEventListRequest.java                   |   27 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java       |  279 +
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AcsDeviceInfoResponse.java                |   40 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java                                        | 1029 ++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CompanyService.java                                       |  127 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/systembiz/SystemDictDataBizService.java                            |   44 
 server/visits/dmvisit_service/db/business.retention.permissions.sql                                                               |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java                                           |   69 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/DeviceListResponse.java                    |   21 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpUserListResponse.java               |   48 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddFailureResponse.java          |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardDeletionRequest.java                  |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitParamRequest.java   |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkParamRequest.java    |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/MemberRoleJoinMapper.java                                |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/ErpConstants.java                                                 |    8 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/DevWgResponseParam.java                                 |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java              |   37 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroRealm.java                                                       |   84 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberCardService.java                                    |  103 
 server/visits/dmvisit_service/src/main/resources/application-proHS.yml.bck                                                        |   81 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailResponse.java             |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java                                               |  178 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java                                             |  257 +
 server/system_gateway/src/main/java/com/doumee/SystemGatewayApplication.java                                                      |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java                                        |  107 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentPermissonRequest.java     |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsListResponse.java                    |   15 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailCardFaceResponse.java     |   14 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/TrainTimeService.java                                     |   98 
 server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java                                                |   44 
 server/system_gateway/src/main/resources/application.yml                                                                          |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/OrgUpdateRequest.java                       |   34 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java                              |  583 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpOrgListResponse.java                |   35 
 server/visits/dmvisit_service/db/business.device_event.permissions.sql                                                            |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java                  |  419 ++
 166 files changed, 12,533 insertions(+), 0 deletions(-)

diff --git a/server/system_gateway/src/main/java/com/doumee/SystemGatewayApplication.java b/server/system_gateway/src/main/java/com/doumee/SystemGatewayApplication.java
index 361805f..c32da4a 100644
--- a/server/system_gateway/src/main/java/com/doumee/SystemGatewayApplication.java
+++ b/server/system_gateway/src/main/java/com/doumee/SystemGatewayApplication.java
@@ -1,17 +1,23 @@
 package com.doumee;
 
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.context.ApplicationContext;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 /**
  * 鍚姩绫�
  * @author Eva.Caesar Liu
  * @date 2023/03/21 14:49
  */
+@Slf4j
+@EnableAsync
 @SpringBootApplication
 @EnableDiscoveryClient
+@MapperScan("com.doumee.dao")
 public class SystemGatewayApplication {
     public static void main(String[] args) {
         ApplicationContext context = SpringApplication.run(SystemGatewayApplication.class);
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
new file mode 100644
index 0000000..30d7dc0
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroAuthFilter.java
@@ -0,0 +1,30 @@
+package com.doumee.config.shiro;
+
+import com.alibaba.fastjson.JSON;
+import com.doumee.core.model.ApiResponse;
+import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
+import org.springframework.http.HttpStatus;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Shiro璁よ瘉杩囨护鍣紝澶勭悊鏈璇佹儏鍐电殑鍝嶅簲
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+public class ShiroAuthFilter extends FormAuthenticationFilter {
+
+    public ShiroAuthFilter() {
+        super();
+    }
+
+    @Override
+    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletResponse servletResponse = (HttpServletResponse) response;
+        servletResponse.setHeader("content-type", "application/json;charset=UTF-8");
+        servletResponse.getWriter().write(JSON.toJSONString(ApiResponse.failed(HttpStatus.UNAUTHORIZED.value(), "鏈櫥褰曟垨鐧诲綍淇℃伅宸茶繃鏈�")));
+        return Boolean.FALSE;
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCache.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCache.java
new file mode 100644
index 0000000..4e61661
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCache.java
@@ -0,0 +1,159 @@
+package com.doumee.config.shiro;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.apache.shiro.util.CollectionUtils;
+import org.springframework.context.annotation.Scope;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.SerializationException;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Shiro缂撳瓨
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+@Scope(value = "prototype")
+@Slf4j
+@Component
+public class ShiroCache implements Cache<Object, Serializable> {
+
+    private String keyPrefix = "";
+
+    @Resource(name="sessionRedisTemplate")
+    private RedisTemplate<Object, Serializable> redisTemplate;
+
+    public ShiroCache () {
+        log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]");
+    }
+
+    public ShiroCache(String keyPrefix) {
+        log.debug("ShiroCache: new, keyPrefix = [" + keyPrefix + "]");
+        this.keyPrefix = keyPrefix;
+    }
+
+    @Override
+    public Serializable get(Object key) throws CacheException {
+        if (key == null) {
+            return null;
+        }
+        return redisTemplate.opsForValue().get(getKey(key));
+    }
+
+    @Override
+    public Serializable put(Object key, Serializable value) throws CacheException {
+        if (key == null) {
+            return null;
+        }
+        redisTemplate.opsForValue().set(getKey(key), value);
+        return value;
+    }
+
+    public Serializable put(Object key, Serializable value, int timeout) throws CacheException {
+        if (key == null) {
+            return null;
+        }
+        redisTemplate.opsForValue().set(getKey(key), value, timeout, TimeUnit.SECONDS);
+        return value;
+    }
+
+    @Override
+    public void clear() throws CacheException {
+        Set<Object> keys = this.keys();
+        redisTemplate.delete(keys);
+    }
+
+    @Override
+    public int size() {
+        return this.keys().size();
+    }
+
+    @Override
+    public Set<Object> keys() {
+        Set<Object> keys = redisTemplate.keys(keyPrefix + "*");
+        if (CollectionUtils.isEmpty(keys)) {
+            return Collections.emptySet();
+        }
+        return keys;
+    }
+
+    @Override
+    public Collection<Serializable> values() {
+        Collection<Serializable> values = new ArrayList<>();
+        Set<Object> keys = this.keys();
+        if (CollectionUtils.isEmpty(keys)) {
+            return values;
+        }
+        for (Object k : keys) {
+            values.add(redisTemplate.opsForValue().get(k));
+        }
+        return values;
+    }
+
+    @Override
+    public Serializable remove(Object key) throws CacheException {
+        if (key == null) {
+            return null;
+        }
+        Serializable value = this.get(getKey(key));
+        redisTemplate.delete(getKey(key));
+        return value;
+    }
+
+    private Object getKey (Object key) {
+        if (key instanceof PrincipalCollection) {
+            return this.keyPrefix + getRedisKeyFromPrincipalIdField((PrincipalCollection)key);
+        }
+        return (key instanceof String ? (this.keyPrefix + key) : key);
+    }
+
+    /**
+     * 鑾峰彇redis cache key
+     */
+    private String getRedisKeyFromPrincipalIdField(PrincipalCollection key) {
+        Object principalObject = key.getPrimaryPrincipal();
+        if (principalObject instanceof String) {
+            return principalObject.toString();
+        } else {
+            Method pincipalIdGetter = this.getPrincipalIdGetter(principalObject);
+            return this.getIdObj(principalObject, pincipalIdGetter);
+        }
+    }
+
+    private Method getPrincipalIdGetter(Object principalObject) {
+        Method pincipalIdGetter;
+        String principalIdMethodName = this.getPrincipalIdMethodName();
+
+        try {
+            pincipalIdGetter = principalObject.getClass().getMethod(principalIdMethodName);
+            return pincipalIdGetter;
+        } catch (NoSuchMethodException e) {
+            throw new SerializationException(e.getMessage(), e);
+        }
+    }
+
+    private String getIdObj(Object principalObject, Method pincipalIdGetter) {
+        try {
+            Object idObj = pincipalIdGetter.invoke(principalObject);
+            String redisKey = idObj.toString();
+            return redisKey;
+        } catch (Exception e) {
+            throw new SerializationException(e.getMessage(), e);
+        }
+    }
+
+    private String getPrincipalIdMethodName() {
+        return "getId";
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
new file mode 100644
index 0000000..4c11155
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCacheManager.java
@@ -0,0 +1,44 @@
+package com.doumee.config.shiro;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.cache.CacheManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * 鑷畾涔塖hiro CacheManager
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+@Slf4j
+@Component
+public class ShiroCacheManager implements CacheManager {
+
+    private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap();
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
+        log.debug("get cache, name=" + name);
+        Cache cache = this.caches.get(name);
+        if (cache == null) {
+            cache = applicationContext.getBean(ShiroCache.class, "shiro:cache:");
+            this.caches.put(name, cache);
+        }
+        return cache;
+    }
+
+    @Autowired
+    public void setApplicationContext (ApplicationContext applicationContext) {
+        if (ShiroCacheManager.applicationContext == null) {
+            ShiroCacheManager.applicationContext = applicationContext;
+        }
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroConfig.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroConfig.java
new file mode 100644
index 0000000..d156a78
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroConfig.java
@@ -0,0 +1,147 @@
+package com.doumee.config.shiro;
+
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.util.ThreadContext;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.servlet.Filter;
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Shiro閰嶇疆
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Configuration
+public class ShiroConfig {
+
+    @Value("${cache.session.expire}")
+    private int sessionExpireTime;
+
+    @Autowired
+    private ShiroCredentialsMatcher shiroCredentialsMatcher;
+
+    @Autowired
+    private ShiroSessionDAO shiroSessionDAO;
+
+    @Autowired
+    private ShiroCacheManager shiroCacheManager;
+
+    @Autowired
+    private ShiroRealm shiroRealm;
+
+    @Bean("sessionRedisTemplate")
+    public RedisTemplate<Object, Serializable> sessionRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
+        RedisTemplate<Object, Serializable> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+        // 榛樿搴忓垪鍖栨柟寮�
+        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
+        // 鍊煎簭鍒楀寲鏂瑰紡
+        ShiroSessionSerializer serializer = new ShiroSessionSerializer();
+        redisTemplate.setValueSerializer(serializer);
+        redisTemplate.setHashValueSerializer(serializer);
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+
+    @Bean
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator autoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        autoProxyCreator.setProxyTargetClass(true);
+        return autoProxyCreator;
+    }
+
+    @Bean
+    public SessionManager sessionManager() {
+        ShiroSessionManager sessionManager = new ShiroSessionManager();
+        sessionManager.setSessionDAO(shiroSessionDAO);
+        sessionManager.setGlobalSessionTimeout(sessionExpireTime*1000);
+        // 鍒犻櫎澶辨晥鐨剆ession
+        sessionManager.setDeleteInvalidSessions(true);
+        return sessionManager;
+    }
+
+    @Bean
+    public SecurityManager securityManager() {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        ThreadContext.bind(securityManager);//鍔犱笂杩欏彞浠g爜鎵嬪姩缁戝畾
+        securityManager.setRealm(shiroRealm);
+        securityManager.setSessionManager(this.sessionManager());
+        securityManager.setCacheManager(shiroCacheManager);
+        return securityManager;
+    }
+
+    @Bean
+    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+        Map<String, String> map = new LinkedHashMap<>();
+        // 璺緞鎷︽埅閰嶇疆
+        map.put("/system/login", "anon");
+        map.put("/system/syncLingCountData", "anon");
+        map.put("/system/wxLogin", "anon");
+        map.put("/system/wxProgramLogin", "anon");
+        map.put("/system/wxAccountLogin", "anon");
+        map.put("/system/initCompany", "anon");
+        map.put("/system/logout", "anon");
+        map.put("/common/captcha", "anon");
+        map.put("/cloud/**", "anon");
+        map.put("/statistics/**", "anon");
+        map.put("/business/hksync/push/**", "anon");
+        map.put("/business/member/empowerByList", "anon");
+        map.put("/dingding/push", "anon");
+//        map.put("/ext/workorderExt/freshStatistics", "anon");
+        map.put("/dingding/jsapiTicket", "anon");
+        map.put("/dingding/ddLogin", "anon");
+        map.put("/dingding/getDingdingCorpId", "anon");
+        map.put("/lingyang/login", "anon");
+        map.put("/lingyang/loginDemo", "anon");
+        map.put("/lingyang/importBatch", "anon");
+        map.put("/edgp/**", "anon");
+        // - 鏀捐swagger
+        map.put("/doc.html", "anon");
+        map.put("/webjars/**", "anon");
+        map.put("/template/**", "anon");
+        map.put("/swagger-resources/**", "anon");
+        map.put("/v2/api-docs/**", "anon");
+        // - 鍏朵粬鎺ュ彛缁熶竴鎷︽埅
+        map.put("/**", "authc");
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
+        // 娣诲姞璁よ瘉杩囨护鍣�
+        Map<String, Filter> filters = new LinkedHashMap<>();
+        filters.put("authc", new ShiroAuthFilter());
+        shiroFilterFactoryBean.setFilters(filters);
+        return shiroFilterFactoryBean;
+    }
+
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+        return authorizationAttributeSourceAdvisor;
+    }
+
+    @Bean
+    public ShiroSessionDAO getShiroSessionDAO () {
+        shiroSessionDAO.setExpireTime(sessionExpireTime);
+        return shiroSessionDAO;
+    }
+
+    @Bean
+    public ShiroRealm getShiroRealm () {
+        shiroRealm.setCredentialsMatcher(shiroCredentialsMatcher);
+        return shiroRealm;
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
new file mode 100644
index 0000000..09156e0
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroCredentialsMatcher.java
@@ -0,0 +1,40 @@
+package com.doumee.config.shiro;
+
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.system.SystemUserService;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * Shiro瀵嗙爜姣斿澶勭悊
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+@Component
+public class ShiroCredentialsMatcher extends HashedCredentialsMatcher {
+    @Lazy
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @Override
+    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
+        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
+        SystemUser queryUserDto = new SystemUser();
+        queryUserDto.setUsername(usernamePasswordToken.getUsername());
+        queryUserDto.setDeleted(Boolean.FALSE);
+        SystemUser systemUser = systemUserService.findOne(queryUserDto);
+        if (systemUser == null) {
+            return Boolean.FALSE;
+        }
+        // 鍔犲瘑瀵嗙爜
+        String pwd = Utils.Secure.encryptPassword(new String(usernamePasswordToken.getPassword()), systemUser.getSalt());
+        // 姣旇緝瀵嗙爜
+        return this.equals(pwd, systemUser.getPassword());
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroRealm.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroRealm.java
new file mode 100644
index 0000000..690addf
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroRealm.java
@@ -0,0 +1,84 @@
+package com.doumee.config.shiro;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.dao.system.model.SystemPermission;
+import com.doumee.dao.system.model.SystemRole;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.system.SystemPermissionService;
+import com.doumee.service.system.SystemRoleService;
+import com.doumee.service.system.SystemUserService;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 鑷畾涔塕ealm锛屽鐞嗚璇佸拰鏉冮檺
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+@Component
+public class ShiroRealm extends AuthorizingRealm {
+
+    @Lazy
+    @Autowired
+    private SystemUserService systemUserService;
+
+    @Lazy
+    @Autowired
+    private SystemRoleService systemRoleService;
+
+    @Lazy
+    @Autowired
+    private SystemPermissionService systemPermissionService;
+
+    /**
+     * 鏉冮檺澶勭悊
+     * @author Eva.Caesar Liu
+     * @date 2023/03/21 14:49
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo)principalCollection.getPrimaryPrincipal();
+        // 璁剧疆鐢ㄦ埛瑙掕壊鍜屾潈闄�
+        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
+        authorizationInfo.addRoles(loginUserInfo.getRoles());
+        authorizationInfo.addStringPermissions(loginUserInfo.getPermissions());
+        return authorizationInfo;
+    }
+
+    /**
+     * 璁よ瘉澶勭悊
+     * @author Eva.Caesar Liu
+     * @date 2023/03/21 14:49
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
+        // 鑾峰彇鐢ㄦ埛鍚�
+        String username = authenticationToken.getPrincipal().toString();
+        // 鏍规嵁鐢ㄦ埛鍚嶆煡璇㈢敤鎴峰璞�
+        SystemUser queryDto = new SystemUser();
+        queryDto.setUsername(username);
+        queryDto.setDeleted(Boolean.FALSE);
+        SystemUser user = systemUserService.findOne(queryDto);
+        if (user == null) {
+            return null;
+        }
+        // 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
+        List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
+        List<SystemPermission> permissions = systemPermissionService.findByUserId(user.getId());
+        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions);
+        // 楠岃瘉鐢ㄦ埛
+        return new SimpleAuthenticationInfo(userInfo, user.getPassword(), this.getName());
+    }
+
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
new file mode 100644
index 0000000..1fe90bf
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionDAO.java
@@ -0,0 +1,113 @@
+package com.doumee.config.shiro;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.session.UnknownSessionException;
+import org.apache.shiro.session.mgt.SimpleSession;
+import org.apache.shiro.session.mgt.eis.SessionDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * 鑷畾涔塖hiro SessionDAO锛屽皢浼氳瘽淇℃伅瀛樺叆缂撳瓨涓�
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+@Data
+@Slf4j
+@Component
+public class ShiroSessionDAO implements SessionDAO {
+
+    private static final String KEY_PREFIX = "shiro:session:";
+
+    @Autowired
+    private ShiroCache shiroCache;
+
+    private int expireTime = 60 * 60 * 24;
+
+    @Autowired
+    private ShiroTokenManager shiroTokenManager;
+
+    @Override
+    public Serializable create(Session session) {
+        if (session == null) {
+            log.error("session is null");
+            throw new UnknownSessionException("session is null");
+        }
+        Serializable sessionId = shiroTokenManager.build();
+        ((SimpleSession)session).setId(sessionId);
+        this.saveSession(session);
+        return sessionId;
+    }
+
+    @Override
+    public Session readSession(Serializable sessionId) throws UnknownSessionException{
+        if (sessionId == null) {
+            log.warn("session id is null");
+            return null;
+        }
+        if (sessionId instanceof String) {
+            // 瀵筍essionId杩涜楠岃瘉锛堝彲鐢ㄤ簬闃叉Session鎹曡幏銆佹毚鍔涙崟鎹夌瓑涓�绯诲垪瀹夊叏闂锛屾渶缁堝畨鍏ㄦ�у彇鍐充簬check濡備綍瀹炵幇锛�
+            shiroTokenManager.check((String) sessionId);
+        }
+        log.debug("read session from cache");
+        Session session = getSessionFromCache(sessionId);
+        if (session == null) {
+            throw new UnknownSessionException("There is no session with id [" + sessionId + "]");
+        }
+        return session;
+    }
+
+    @Override
+    public void update(Session session) throws UnknownSessionException {
+        this.saveSession(session);
+    }
+
+    @Override
+    public void delete(Session session) {
+        if (session != null && session.getId() != null) {
+            shiroCache.remove(KEY_PREFIX + session.getId());
+        }
+    }
+
+    @Override
+    public Collection<Session> getActiveSessions() {
+        Set<Session> sessions = new HashSet<>();
+        Set<Object> keys = shiroCache.keys();
+        if (keys != null && keys.size() > 0) {
+            Iterator iter = keys.iterator();
+            while(iter.hasNext()) {
+                sessions.add((Session) shiroCache.get(iter.next()));
+            }
+        }
+        return sessions;
+    }
+
+    private void saveSession(Session session) throws UnknownSessionException {
+        if (session == null || session.getId() == null) {
+            log.error("session or session id is null");
+            throw new UnknownSessionException("session or session id is null");
+        }
+        shiroCache.put(KEY_PREFIX + session.getId(), (SimpleSession)session, expireTime);
+    }
+
+    private Session getSessionFromCache (Serializable sessionId) {
+        Serializable object = shiroCache.get(KEY_PREFIX + sessionId);
+        Session session = null;
+        if (object != null) {
+            session = (Session)shiroCache.get(KEY_PREFIX + sessionId);
+        }
+        return session;
+    }
+
+    public void setExpireTime (int expireTime) {
+        this.expireTime = expireTime;
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
new file mode 100644
index 0000000..32b0379
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionManager.java
@@ -0,0 +1,85 @@
+package com.doumee.config.shiro;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.session.mgt.DefaultSessionManager;
+import org.apache.shiro.session.mgt.SessionContext;
+import org.apache.shiro.session.mgt.SessionKey;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.WebSessionManager;
+import org.apache.shiro.web.util.WebUtils;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.Serializable;
+
+/**
+ * 鑷畾涔変細璇濈鐞嗗櫒
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+@Slf4j
+public class ShiroSessionManager extends DefaultSessionManager implements WebSessionManager {
+
+    private static final String AUTH_TOKEN = "eva-auth-token";
+
+    @Override
+    protected void onStart(Session session, SessionContext context) {
+        super.onStart(session, context);
+        if (!WebUtils.isHttp(context)) {
+            log.debug("SessionContext argument is not Http compatible or does not have an Http request/response pair. No session ID cookie will be set.");
+            return;
+        }
+        HttpServletRequest request = WebUtils.getHttpRequest(context);
+        HttpServletResponse response = WebUtils.getHttpResponse(context);
+        Serializable sessionId = session.getId();
+        this.storeSessionId(sessionId, request, response);
+        request.removeAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE);
+        request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_IS_NEW, Boolean.TRUE);
+    }
+
+    @Override
+    public Serializable getSessionId(SessionKey key) {
+        Serializable sessionId = super.getSessionId(key);
+        if (sessionId == null && WebUtils.isWeb(key)) {
+            ServletRequest servletRequest = WebUtils.getRequest(key);
+            if (!(servletRequest instanceof HttpServletRequest)) {
+                log.trace("Can not get sessionId from header, the request is not HttpServletRequest");
+                return null;
+            }
+            HttpServletRequest request = (HttpServletRequest) servletRequest;
+            // 浠巆ookie涓幏鍙栬璇�
+            javax.servlet.http.Cookie[] cookies = request.getCookies();
+            if (cookies != null) {
+                for (javax.servlet.http.Cookie cookie : cookies) {
+                    if (AUTH_TOKEN.equals(cookie.getName())) {
+                        return cookie.getValue();
+                    }
+                }
+            }
+            // 浠巋eader涓幏鍙栬璇�
+            return request.getHeader(AUTH_TOKEN);
+        }
+        return sessionId;
+    }
+    @Override
+    public boolean isServletContainerSessions() {
+        return false;
+    }
+
+    private void storeSessionId(Serializable currentId, HttpServletRequest request, HttpServletResponse response) {
+        if (currentId == null) {
+            String msg = "sessionId cannot be null when persisting for subsequent requests.";
+            throw new IllegalArgumentException(msg);
+        }
+        Cookie cookie = new SimpleCookie(AUTH_TOKEN);
+        cookie.setHttpOnly(false);
+        String idString = currentId.toString();
+        cookie.setValue(idString);
+        cookie.saveTo(request, response);
+        log.trace("Set session ID cookie for session with id {}", idString);
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java
new file mode 100644
index 0000000..d334adf
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroSessionSerializer.java
@@ -0,0 +1,36 @@
+package com.doumee.config.shiro;
+
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.shiro.codec.Base64;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+
+import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Session搴忓垪鍖�
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+public class ShiroSessionSerializer implements RedisSerializer<Serializable> {
+
+    @Override
+    public byte[] serialize(Serializable obj) throws SerializationException {
+        if (obj == null) {
+            return new byte[0];
+        }
+        String sessionBase64 = Base64.encodeToString(SerializationUtils.serialize(obj));
+        return sessionBase64.getBytes(StandardCharsets.UTF_8);
+    }
+
+    @Override
+    public Serializable deserialize(byte[] bytes) throws SerializationException {
+        if (bytes == null || bytes.length == 0) {
+            return null;
+        }
+        String sessionString = new String(bytes, StandardCharsets.UTF_8);
+        byte[] sessionBytes = Base64.decode(sessionString);
+        return SerializationUtils.deserialize(sessionBytes);
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroToken.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroToken.java
new file mode 100644
index 0000000..4a27415
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroToken.java
@@ -0,0 +1,80 @@
+package com.doumee.config.shiro;
+
+import com.doumee.core.model.LoginUserInfo;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鑷畾涔塗oken 锛屽鐞嗚璇佸拰鏉冮檺
+ * @author Eva.Caesar Liu
+ * @date 2022/04/18 18:12
+ */
+@Component
+public class ShiroToken extends UsernamePasswordToken {
+
+    /**
+     * 鍏徃ID
+     */
+    Integer companyId;
+    Boolean isDdLogin;
+    Boolean isWxLogin;
+    LoginUserInfo updateUser;
+
+    int updateFlag;
+
+    public ShiroToken() {
+    }
+    public ShiroToken(Integer companyId, String username, String password, boolean isDdLogin, boolean isWxLogin) {
+        super(username,  password, false, (String)null);
+        this.companyId = companyId;
+        this.isDdLogin = isDdLogin;
+        this.isWxLogin = isWxLogin;
+    }
+    public ShiroToken(LoginUserInfo user,int updateFlag) {
+        super(user.getUsername(), "", false, (String)null);
+        this.updateUser = user;
+        this.updateFlag = updateFlag;
+        this.isDdLogin = true;
+    }
+
+    public Boolean getDdLogin() {
+        return isDdLogin;
+    }
+
+    public void setDdLogin(Boolean ddLogin) {
+        isDdLogin = ddLogin;
+    }
+
+
+    public Boolean getWxLogin() {
+        return isWxLogin;
+    }
+
+    public void setWxLogin(Boolean wxLogin) {
+        isWxLogin = wxLogin;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public LoginUserInfo getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(LoginUserInfo updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    public int getUpdateFlag() {
+        return updateFlag;
+    }
+
+    public void setUpdateFlag(int updateFlag) {
+        this.updateFlag = updateFlag;
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
new file mode 100644
index 0000000..ba35da6
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/shiro/ShiroTokenManager.java
@@ -0,0 +1,25 @@
+package com.doumee.config.shiro;
+
+import com.doumee.core.exception.UnSafeSessionException;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+/**
+ * 榛樿Token绠$悊鍣�
+ * @author Eva.Caesar Liu
+ * @date 2023/04/17 12:11
+ */
+@Component
+public class ShiroTokenManager {
+
+    String build() {
+        return UUID.randomUUID().toString();
+    }
+
+    void check(String token) throws UnSafeSessionException {
+        if (token == null || token.length() != 36) {
+            throw new UnSafeSessionException();
+        }
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerConfig.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
new file mode 100644
index 0000000..1a237ee
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
@@ -0,0 +1,123 @@
+package com.doumee.config.swagger;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.RequestHandler;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.function.Predicate;
+
+/**
+ * Swagger閰嶇疆
+ * @author Eva.Caesar Liu
+ * @date 2022/03/11 10:24
+ */
+@Configuration
+@EnableOpenApi
+@EnableKnife4j
+public class SwaggerConfig {
+
+    @Value("${swagger.host:}")
+    private String host;
+
+    @Value("${swagger.title:鎺ュ彛鏂囨。}")
+    private String title;
+
+    @Value("${swagger.description:}")
+    private String description;
+
+    @Value("${project.version:}")
+    private String version;
+
+    @Bean
+    public ApiInfo getApiInfo() {
+        return new ApiInfoBuilder()
+                .title(title)
+                .description(description)
+                .version(version)
+                .build();
+    }
+    @Bean
+    public Docket getDocket() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(this.getApiInfo()).groupName("銆愮郴缁熺鐞嗘帴鍙PI銆�")
+                .host(host)
+                .select()
+                .apis( basePackage("com.doumee.api.system;"))
+                // 璁剧疆闇�瑕佽鎵弿鐨勭被锛岃繖閲岃缃负娣诲姞浜咢Api娉ㄨВ鐨勭被
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any())
+                .build();
+    }
+    @Bean
+    public Docket getDocket2() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(this.getApiInfo()).groupName("銆愪笟鍔$鐞嗘帴鍙PI銆�")
+                .host(host)
+                .select()
+                .apis( basePackage("com.doumee.api.business;"))
+                // 璁剧疆闇�瑕佽鎵弿鐨勭被锛岃繖閲岃缃负娣诲姞浜咢Api娉ㄨВ鐨勭被
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any())
+                .build();
+    }
+    @Bean
+    public Docket getDocket4() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(this.getApiInfo()).groupName("銆愬畾鏃朵换鍔℃帴鍙PI銆�")
+                .host(host)
+                .select()
+                .apis( basePackage("com.doumee.api.timer;"))
+                // 璁剧疆闇�瑕佽鎵弿鐨勭被锛岃繖閲岃缃负娣诲姞浜咢Api娉ㄨВ鐨勭被
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any())
+                .build();
+    }
+    @Bean
+    public Docket getDocket1() {
+        return new Docket(DocumentationType.SWAGGER_2)
+            .apiInfo(this.getApiInfo()).groupName("銆愬叕鍏辨帴鍙PI銆�")
+            .host(host)
+            .select()
+            .apis( basePackage("com.doumee.api.common"))
+            // 璁剧疆闇�瑕佽鎵弿鐨勭被锛岃繖閲岃缃负娣诲姞浜咢Api娉ㄨВ鐨勭被
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+            .paths(PathSelectors.any())
+            .build();
+    }
+    /**
+     * 閲嶅啓basePackage鏂规硶锛屼娇鑳藉瀹炵幇澶氬寘璁块棶锛屽鍒惰创涓婂幓
+     * @author  teavamc
+     * @date 2019/1/26
+     * @return com.google.common.base.Predicate<springfox.documentation.RequestHandler>
+     */
+    public static Predicate<RequestHandler> basePackage(String basePackage) {
+        return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
+    }
+
+    private static Function<Class<?>, Boolean> handlerPackage(String basePackage)     {
+        return input -> {
+            // 寰幆鍒ゆ柇鍖归厤
+            for (String strPackage : basePackage.split(";")) {
+                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
+                if (isMatch) {
+                    return true;
+                }
+            }
+            return false;
+        };
+    }
+
+    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
+        return Optional.fromNullable(input.declaringClass());
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
new file mode 100644
index 0000000..8fd55c6
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptor.java
@@ -0,0 +1,45 @@
+package com.doumee.config.swagger;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * Swagger鎷︽埅鍣�
+ * @author Eva.Caesar Liu
+ * @date 2022/04/18 18:12
+ */
+@Slf4j
+@Component
+public class SwaggerInterceptor implements HandlerInterceptor {
+
+    @Value("${swagger.enabled:false}")
+    private Boolean enabledSwagger;
+
+    @Value("${swagger.redirect-uri:/}")
+    private String redirectUri;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        if (!enabledSwagger) {
+            String uri = request.getContextPath();
+            if (StringUtils.isNotBlank(redirectUri))
+                uri = request.getContextPath() + redirectUri;
+            if (StringUtils.isBlank(uri))
+                uri = "/";
+            try {
+                response.sendRedirect(uri);
+            } catch (IOException e) {
+                log.error(String.format("Redirect to '%s' for swagger throw an exception : %s", uri, e.getMessage()), e);
+            }
+            return Boolean.FALSE;
+        }
+        return Boolean.TRUE;
+    }
+}
diff --git a/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
new file mode 100644
index 0000000..f67e9a8
--- /dev/null
+++ b/server/system_gateway/src/main/java/com/doumee/config/swagger/SwaggerInterceptorConfig.java
@@ -0,0 +1,23 @@
+package com.doumee.config.swagger;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Swagger鎷︽埅鍣ㄩ厤缃�
+ * @author Eva.Caesar Liu
+ * @date 2022/04/18 18:12
+ */
+@Configuration
+public class SwaggerInterceptorConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private SwaggerInterceptor swaggerInterceptor;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(swaggerInterceptor).addPathPatterns("/swagger-ui.html", "/doc.html");
+    }
+}
diff --git a/server/system_gateway/src/main/resources/application.yml b/server/system_gateway/src/main/resources/application.yml
index 076be11..d1e7a41 100644
--- a/server/system_gateway/src/main/resources/application.yml
+++ b/server/system_gateway/src/main/resources/application.yml
@@ -25,6 +25,7 @@
       enabled: true
   main:
     allow-circular-references: true
+#    web-application-type: reactive
 # MyBatis閰嶇疆
 mybatis-plus:
   mapper-locations: classpath*:/mappers/**/*.xml
diff --git a/server/visits/dmvisit_service/db/business.approve.permissions.sql b/server/visits/dmvisit_service/db/business.approve.permissions.sql
new file mode 100644
index 0000000..65eb0f1
--- /dev/null
+++ b/server/visits/dmvisit_service/db/business.approve.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:approve:create', '鏂板缓瀹℃壒淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:approve:delete', '鍒犻櫎瀹℃壒淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:approve:update', '淇敼瀹℃壒淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:approve:query', '鏌ヨ瀹℃壒淇℃伅璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:approve:exportExcel', '瀵煎嚭瀹℃壒淇℃伅璁板綍琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_service/db/business.device.permissions.sql b/server/visits/dmvisit_service/db/business.device.permissions.sql
new file mode 100644
index 0000000..1ff2fca
--- /dev/null
+++ b/server/visits/dmvisit_service/db/business.device.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:device:create', '鏂板缓璁惧淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:device:delete', '鍒犻櫎璁惧淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:device:update', '淇敼璁惧淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:device:query', '鏌ヨ璁惧淇℃伅琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:device:exportExcel', '瀵煎嚭璁惧淇℃伅琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_service/db/business.device_event.permissions.sql b/server/visits/dmvisit_service/db/business.device_event.permissions.sql
new file mode 100644
index 0000000..3a0f26d
--- /dev/null
+++ b/server/visits/dmvisit_service/db/business.device_event.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:deviceevent:create', '鏂板缓闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:deviceevent:delete', '鍒犻櫎闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:deviceevent:update', '淇敼闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:deviceevent:query', '鏌ヨ闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:deviceevent:exportExcel', '瀵煎嚭闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_service/db/business.empower.permissions.sql b/server/visits/dmvisit_service/db/business.empower.permissions.sql
new file mode 100644
index 0000000..0cfc7b4
--- /dev/null
+++ b/server/visits/dmvisit_service/db/business.empower.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:empower:create', '鏂板缓浜哄憳鎺堟潈瀵煎叆璁板綍', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:empower:delete', '鍒犻櫎浜哄憳鎺堟潈瀵煎叆璁板綍', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:empower:update', '淇敼浜哄憳鎺堟潈瀵煎叆璁板綍', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:empower:query', '鏌ヨ浜哄憳鎺堟潈瀵煎叆璁板綍', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:empower:exportExcel', '瀵煎嚭浜哄憳鎺堟潈瀵煎叆璁板綍(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_service/db/business.problem_log.permissions.sql b/server/visits/dmvisit_service/db/business.problem_log.permissions.sql
new file mode 100644
index 0000000..97893c4
--- /dev/null
+++ b/server/visits/dmvisit_service/db/business.problem_log.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:problemlog:create', '鏂板缓璁垮绛旈璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:problemlog:delete', '鍒犻櫎璁垮绛旈璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:problemlog:update', '淇敼璁垮绛旈璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:problemlog:query', '鏌ヨ璁垮绛旈璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:problemlog:exportExcel', '瀵煎嚭璁垮绛旈璁板綍琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_service/db/business.retention.permissions.sql b/server/visits/dmvisit_service/db/business.retention.permissions.sql
new file mode 100644
index 0000000..22de20f
--- /dev/null
+++ b/server/visits/dmvisit_service/db/business.retention.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:retention:create', '鏂板缓鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:retention:delete', '鍒犻櫎鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:retention:update', '淇敼鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:retention:query', '鏌ヨ鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:retention:exportExcel', '瀵煎嚭鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java b/server/visits/dmvisit_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
new file mode 100644
index 0000000..abf47d7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright 2018-2020 stylefeng & fengshuonan (sn93@qq.com)
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.doumee.config.Jwt;
+
+
+import io.jsonwebtoken.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * <p>鍚庡彴绯荤粺jwt token宸ュ叿绫�</p>
+ * <pre>
+ *     jwt鐨刢laim閲屼竴鑸寘鍚互涓嬪嚑绉嶆暟鎹�:
+ *         1. iss -- token鐨勫彂琛岃��
+ *         2. sub -- 璇WT鎵�闈㈠悜鐨勭敤鎴�
+ *         3. aud -- 鎺ユ敹璇WT鐨勪竴鏂�
+ *         4. exp -- token鐨勫け鏁堟椂闂�
+ *         5. nbf -- 鍦ㄦ鏃堕棿娈典箣鍓�,涓嶄細琚鐞�
+ *         6. iat -- jwt鍙戝竷鏃堕棿
+ *         7. jti -- jwt鍞竴鏍囪瘑,闃叉閲嶅浣跨敤
+ * </pre>
+ *
+ * @author fengshuonan
+ * @Date 2017/8/25 10:59
+ */
+public class JwtTokenUtil {
+    //Header 鍚嶇О
+    public static final String HEADER_KEY = "token";
+    //鍙栧�煎悕绉�
+    public static final String UserId_Name = "AppUserId";
+    //鍙栧�煎悕绉�
+    public static final String MEMBER = "MEMBER";
+    //鍔犲瘑瀵嗛挜
+    private final static String jwtSecret = "MhAjU9poLf8ko54K25XBDtonaL33vtt1";
+    //杩囨湡鏃堕棿(s) 86400L=1澶� 604800L=7澶�
+    private static final long expire = 86400L;
+
+    /**
+     * 鐢熸垚token,鏍规嵁userId鍜岄粯璁よ繃鏈熸椂闂�
+     */
+    public static String generateToken(JwtPayLoad jwtPayLoad) {
+        Long expiredSeconds = getExpireSeconds();
+        final Date expirationDate = new Date(System.currentTimeMillis() + expiredSeconds * 1000);
+        return generateToken(jwtPayLoad.getMemberId(), expirationDate, jwtPayLoad.toMap());
+    }
+
+    /**
+     * 楠岃瘉token鏄惁澶辨晥
+     */
+    public static Boolean isTokenExpired(String token) {
+        try {
+            final Date expiration = getExpirationDateFromToken(token);
+            return expiration.before(new Date());
+        } catch (ExpiredJwtException expiredJwtException) {
+            return true;
+        }
+    }
+
+    /**
+     * 鐢熸垚token,鏍规嵁userId鍜岄粯璁よ繃鏈熸椂闂�
+     */
+    public static String generateTokenOld(JwtPayLoad jwtPayLoad) {
+        Long expiredSeconds = getExpireSeconds();
+        final Date expirationDate = new Date(System.currentTimeMillis() + expiredSeconds * 1000);
+        return generateToken(jwtPayLoad.getMemberId(), expirationDate, jwtPayLoad.toMap());
+    }
+
+    /**
+     * 鑾峰彇jwt鐨刾ayload閮ㄥ垎
+     */
+    public static JwtPayLoad getJwtPayLoad(String token) {
+        Claims claimFromToken = getClaimFromToken(token);
+        return JwtPayLoad.toBean(claimFromToken);
+    }
+
+    /**
+     * 瑙f瀽token鏄惁姝g‘(true-姝g‘, false-閿欒)
+     */
+    public static Boolean checkToken(String token) {
+        try {
+            String jwtSecret = getJwtSecret();
+            Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();
+            return true;
+        } catch (JwtException e) {
+            return false;
+        }
+    }
+
+    /**
+     * 楠岃瘉token鏄惁澶辨晥
+     */
+    public static Boolean isTokenExpiredOld(String token) {
+        try {
+            final Date expiration = getExpirationDateFromToken(token);
+            return expiration.before(new Date());
+        } catch (ExpiredJwtException expiredJwtException) {
+            return true;
+        }
+    }
+
+    // 浠巘oken涓幏鍙栫敤鎴稩D
+    public static String getUserId(String token){
+        return getClaimFromToken(token).getSubject();
+    }
+
+    /**
+     * 鑾峰彇jwt澶辨晥鏃堕棿
+     */
+    public static Date getExpirationDateFromToken(String token) {
+        return getClaimFromToken(token).getExpiration();
+    }
+
+    /**
+     * 鐢熸垚token,鏍规嵁userId鍜岃繃鏈熸椂闂�
+     */
+    public static String generateToken(String userId, Date exppiredDate, Map<String, Object> claims) {
+
+        final Date createdDate = new Date();
+        String secret = getJwtSecret();
+
+        if (claims == null) {
+            return Jwts.builder()
+                    .setSubject(userId.toString())
+                    .setIssuedAt(createdDate)
+                    .setExpiration(exppiredDate)
+                    .signWith(SignatureAlgorithm.HS512, secret)
+                    .compact();
+        } else {
+            return Jwts.builder()
+                    .setClaims(claims)
+                    .setSubject(userId.toString())
+                    .setIssuedAt(createdDate)
+                    .setExpiration(exppiredDate)
+                    .signWith(SignatureAlgorithm.HS512, secret)
+                    .compact();
+        }
+    }
+
+    /**
+     * 鑾峰彇jwt鐨刾ayload閮ㄥ垎
+     */
+    public static Claims getClaimFromToken(String token) {
+        if (StringUtils.isBlank(token)) {
+            throw new IllegalArgumentException("token鍙傛暟涓虹┖锛�");
+        }
+        String jwtSecret = getJwtSecret();
+        return Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();
+    }
+
+    /**
+     * 鑾峰彇绯荤粺鍦板瘑閽�
+     */
+    private static String getJwtSecret() {
+        return jwtSecret;
+    }
+
+    /**
+     * 鑾峰彇绯荤粺鍦板瘑閽ヨ繃鏈熸椂闂达紙鍗曚綅锛氱锛�
+     */
+    private static Long getExpireSeconds() {
+        return expire;
+    }
+}
\ No newline at end of file
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/ErpConstants.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/ErpConstants.java
new file mode 100644
index 0000000..5371bad
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/ErpConstants.java
@@ -0,0 +1,8 @@
+package com.doumee.core.erp;
+
+public class ErpConstants {
+    public static String orgListUrl;
+    public static String userListUrl;
+    public static String approveUrl;
+    public static String userStatusUrl;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/ApproveNoticeRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/ApproveNoticeRequest.java
new file mode 100644
index 0000000..d40397e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/ApproveNoticeRequest.java
@@ -0,0 +1,31 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import com.doumee.core.haikang.model.param.BaseRequst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("璁垮鐢宠瀹℃壒缁撴灉閫氱煡璇锋眰淇℃伅")
+public class ApproveNoticeRequest extends BaseRequst {
+    @ApiModelProperty(value = "瀹℃壒璁板綍鍞竴鏍囪瘑锛圗RP绔疘D锛�" ,example = "1")
+    private String id;
+    @ApiModelProperty(value = "瀹℃壒缁撴灉 0-涓嶉�氳繃 1-閫氳繃,榛樿 0" ,example = "1")
+    private Integer status;
+    @ApiModelProperty(value = "瀹℃牳鏃堕棿 yyyy-MM-dd HH:mm:ss" )
+    private String approveDate ;
+    @ApiModelProperty(value = "瀹℃牳鍚庡厑璁歌繘鍦烘椂闂� 鏍煎紡锛歽yyy-MM-dd HH:mm:ss,涓虹┖琛ㄧず淇濇寔鐢宠鏁版嵁" )
+    private Date startTime ;
+    @ApiModelProperty(value = "瀹℃壒鍚庡厑璁哥寮�鏃堕棿 鏍煎紡锛歽yyy-MM-dd HH:mm:ss,涓虹┖琛ㄧず淇濇寔鐢宠鏁版嵁"  )
+    private Date endTime ;
+    @ApiModelProperty(value = "瀹℃壒鍚庡厑璁歌瀹㈤棬绂佺粍缂栫爜,澶氫釜璇蜂娇鐢ㄨ嫳鏂囬�楀彿,闅斿紑锛屽1,2,涓虹┖琛ㄧず淇濇寔鐢宠鏁版嵁"  )
+    private String doors;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/CarAuthorRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/CarAuthorRequest.java
new file mode 100644
index 0000000..f88a05c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/CarAuthorRequest.java
@@ -0,0 +1,28 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel(value = "杞﹁締鎺堟潈鍋滆溅鍦鸿姹備俊鎭�" )
+public class CarAuthorRequest {
+    @ApiModelProperty(value = "浜哄憳鍞竴鏍囪瘑锛圗RP绔疘D锛夛紝濡傛灉涓虹┖锛屽垯娓呯┖杞﹁締褰掑睘浜轰俊鎭�", required = true)
+    private String userId;
+    @ApiModelProperty(value = "杞︾墝鍙�" , required = true)
+    private String carCode;
+    @ApiModelProperty(value = "鎺堟潈鏈夋晥鏈燂紙寮�濮嬫椂闂达級锛屼负绌烘椂榛樿闀挎湡鏈夋晥锛屽2023-11-24 11:39:23"  )
+    private Date validStartTime;
+    @ApiModelProperty(value = "鎺堟潈鏈夋晥鏈燂紙鎴鏃堕棿锛夛紝涓虹┖鏃堕粯璁ら暱鏈熸湁鏁堬紝濡�2023-11-24 11:39:23"  )
+    private Date validEndTime;
+    @ApiModelProperty(value = "鍋滆溅鍦虹粍鍞竴鏍囪瘑闆嗗悎锛堣瀹㈢ID锛�,濡傛灉涓簄ull锛屽垯娓呯┖杞﹁締鎺堟潈淇℃伅"  )
+    private List<Integer> parkIdList;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/DoorEventListRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/DoorEventListRequest.java
new file mode 100644
index 0000000..575b101
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/DoorEventListRequest.java
@@ -0,0 +1,27 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import com.doumee.core.haikang.model.param.BaseRequst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("闂ㄧ鍑哄叆浜嬩欢鍚屾璇锋眰淇℃伅")
+public class DoorEventListRequest extends BaseRequst {
+    @ApiModelProperty(value = "鍞竴鏍囪瘑")
+    private String eventId;
+    @ApiModelProperty(value = "濮撳悕,鏀寔妯$硦鍖归厤" )
+    private String name;
+    @ApiModelProperty(value = "韬唤璇佸彿" )
+    private String idNo;
+    @ApiModelProperty(value = "鏃堕棿鑼冨洿-寮�濮嬶紝鏍煎紡yyyy-MM-dd HH:mm:ss锛屽2023-11-24 09:17:11" )
+    private String startTime ;
+    @ApiModelProperty(value = "鏃堕棿鑼冨洿-鎴锛屾牸寮弝yyy-MM-dd HH:mm:ss锛屽2023-11-24 09:17:11" )
+    private String endTime ;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/OrgUpdateRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/OrgUpdateRequest.java
new file mode 100644
index 0000000..8f00eb4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/OrgUpdateRequest.java
@@ -0,0 +1,34 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import com.doumee.core.haikang.model.param.BaseRequst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("缁勭粐淇℃伅鏇存柊璇锋眰淇℃伅")
+public class OrgUpdateRequest extends BaseRequst {
+    @ApiModelProperty(value = "鍞竴鏍囪瘑" ,required = true)
+    private String id;
+    @ApiModelProperty(value = "鍚嶇О" ,required = true)
+    private String name;
+    @ApiModelProperty(value = "涓婄骇缁勭粐缂栫爜")
+    private String parentId;
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�",example = "0")
+    private int isdeleted  ;
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤",example = "0")
+    private int status  ;
+    @ApiModelProperty(value = "鏇存柊鏃堕棿,濡�2023-11-24 09:47:36")
+    private Date editDate;
+    @ApiModelProperty(value = "鑱旂郴浜哄鍚�" )
+    private String linkName;
+    @ApiModelProperty(value = "鑱旂郴鐢佃瘽" )
+    private String linkPhone;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/RoleListRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/RoleListRequest.java
new file mode 100644
index 0000000..2401cbd
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/RoleListRequest.java
@@ -0,0 +1,21 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import com.doumee.core.haikang.model.param.BaseRequst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("闂ㄧ缁勬帴鍙h姹備俊鎭�")
+public class RoleListRequest extends BaseRequst {
+    @ApiModelProperty(value = "闂ㄧ缁勫敮涓�鏍囪瘑" ,example = "1")
+    private Integer id;
+    @ApiModelProperty(value = "鍚嶇О,鏀寔妯$硦鍖归厤" )
+    private String name;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/TokenRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/TokenRequest.java
new file mode 100644
index 0000000..5cc86c3
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/TokenRequest.java
@@ -0,0 +1,19 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("Token鑾峰彇绫�")
+public class TokenRequest {
+    @ApiModelProperty(value = "璁块棶key" ,example = "1")
+    private String accessKey;
+    @ApiModelProperty(value = "璁块棶绉橀挜" )
+    private String accessSecret;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserAuthorRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserAuthorRequest.java
new file mode 100644
index 0000000..058d2c1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserAuthorRequest.java
@@ -0,0 +1,24 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浜哄憳闂ㄧ缁勬巿鏉冩洿鏂拌姹備俊鎭�")
+public class UserAuthorRequest {
+    @ApiModelProperty(value = "浜哄憳鍞竴鏍囪瘑锛圗RP绔疘D锛�" , required = true)
+    private String userId;
+    @ApiModelProperty(value = "鎺堟潈闂ㄧ缁勭紪鐮侀泦鍚堥棬绂佺粍鍞竴鏍囪瘑锛堣瀹㈢ID锛�,濡傛灉涓簄ull锛屽垯娓呯┖浜哄憳鎺堟潈淇℃伅"  )
+    private Integer[] roleIds;
+    @ApiModelProperty(value = "鎺堟潈鏈夋晥鏈燂紙寮�濮嬫椂闂达級锛屼负绌烘椂榛樿闀挎湡鏈夋晥锛屽2023-11-24 11:39:23"  )
+    private Date validStartTime;
+    @ApiModelProperty(value = "鎺堟潈鏈夋晥鏈燂紙鎴鏃堕棿锛夛紝涓虹┖鏃堕粯璁ら暱鏈熸湁鏁堬紝濡�2023-11-24 11:39:23"  )
+    private Date validEndTime;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java
new file mode 100644
index 0000000..050eb23
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java
@@ -0,0 +1,53 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import com.doumee.core.haikang.model.param.BaseRequst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浜哄憳淇℃伅鏇存柊璇锋眰淇℃伅")
+public class UserUpdateRequest extends BaseRequst {
+    @ApiModelProperty(value = "鍞竴鏍囪瘑" ,required = true)
+    private String id;
+    @ApiModelProperty(value = "濮撳悕"  ,required = true)
+    private String name;
+    @ApiModelProperty(value = "璇佷欢鍙�"  ,required = true)
+    private String idNo;
+//    @ApiModelProperty(value = "鍥哄畾杞﹁締,鍙兘缁戝畾涓�杈嗚溅" )
+//    private String carNo;
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境閫氳璇� 2鎶ょ収 ,榛樿涓�0"  ,required = true)
+    private int idType;
+    @ApiModelProperty(value = "璁垮鎬у埆 1-鐢� 2-濂�"  ,required = true)
+    private Integer sex;
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�",example = "0")
+    private int isdeleted  ;
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤",example = "0")
+    private int status  ;
+    @ApiModelProperty(value = "鏇存柊鏃堕棿,濡�2023-11-24 09:47:36")
+    private Date editDate;
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮�" ,required = true)
+    private String orgId;
+    @ApiModelProperty(value = "浜鸿劯鐓х墖鍦板潃" )
+    private String faceImg;
+    @ApiModelProperty(value = "宸ュ彿" ,required = true)
+    private String code;
+    @ApiModelProperty(value = "鎵嬫満鍙�" , required = true)
+    private String phone;
+    @ApiModelProperty(value = "鍗″彿闆嗗悎" )
+    private List<String> cardList;
+    //2024骞�1鏈�9鏃� 娌熼�氫笉浠庢涓氬姟瑙﹀彂
+//    @ApiModelProperty(value = "鎺堟潈闂ㄧ缁勭紪鐮侀泦鍚�,銆愯瀹㈢銆戝敮涓�鏍囪瘑" ,hidden = true )
+//    private Integer[] roleIds;
+    @ApiModelProperty(value = "鎺堟潈鏈夋晥鏈燂紙寮�濮嬫椂闂达級锛屼负绌烘椂榛樿闀挎湡鏈夋晥锛屽2023-11-24 11:39:23"  )
+    private Date validStartTime;
+    @ApiModelProperty(value = "鎺堟潈鏈夋晥鏈燂紙鎴鏃堕棿锛夛紝涓虹┖鏃堕粯璁ら暱鏈熸湁鏁堬紝濡�2023-11-24 11:39:23"  )
+    private Date validEndTime;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/VisitListRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/VisitListRequest.java
new file mode 100644
index 0000000..96f20ba
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/VisitListRequest.java
@@ -0,0 +1,37 @@
+package com.doumee.core.erp.model.openapi.request;
+
+import com.doumee.core.haikang.model.param.BaseRequst;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("璁垮鍑哄叆浜嬩欢鍚屾璇锋眰淇℃伅")
+public class VisitListRequest extends BaseRequst {
+    @ApiModelProperty(value = "鍞竴鏍囪瘑" )
+    private String eventId;
+    @ApiModelProperty(value = "璁垮鍚嶇О,鏀寔妯$硦鍖归厤" )
+    private String visitorName;
+    @ApiModelProperty(value = "璁垮韬唤璇佸彿" )
+    private String idNo;
+    @ApiModelProperty(value = "琚闂汉Id锛坋rp绔敤鎴风紪鐮侊級" )
+    private String beVisitedPersonId ;
+    @ApiModelProperty(value = "琚闂汉鎵�灞炵粍缁嘔d(erp绔粍缁囩紪鐮�)" )
+    private String beVisitedPersonOrgId	 ;
+    @ApiModelProperty(value = "鏉ヨ鏃堕棿鑼冨洿-寮�濮嬶紝鏍煎紡yyyy-MM-dd HH:mm:ss锛屽2023-11-24 09:17:11" )
+    private String inStartTime ;
+    @ApiModelProperty(value = "鏉ヨ鏃堕棿鑼冨洿-鎴锛屾牸寮弝yyy-MM-dd HH:mm:ss锛屽2023-11-24 09:17:11" )
+    private String inEndTime ;
+    @ApiModelProperty(value = "绂诲紑鏃堕棿鑼冨洿-寮�濮嬶紝鏍煎紡yyyy-MM-dd HH:mm:ss锛屽2023-11-24 09:17:11" )
+    private String outStartTime ;
+    @ApiModelProperty(value = "绂诲紑鏃堕棿鑼冨洿-鎴锛屾牸寮弝yyy-MM-dd HH:mm:ss锛屽2023-11-24 09:17:11" )
+    private String outEndTime ;
+    @ApiModelProperty(value = "鏉ヨ鍗曚綅,鏀寔妯$硦鍖归厤" )
+    private String visitorWorkUint ;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserFailRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserFailRequest.java
new file mode 100644
index 0000000..fa678e2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserFailRequest.java
@@ -0,0 +1,23 @@
+package com.doumee.core.erp.model.openapi.request.erp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel(value = "鍛樺伐鍚屾澶辫触鎺ㄩ�佽姹傚弬鏁�" )
+public class UserFailRequest  {
+
+    @ApiModelProperty(value = "鍛樺伐id"  )
+    private  String userId;
+    @ApiModelProperty(value = "澶辫触绫诲瀷 0浜哄憳鍚屾澶辫触 1鏉冮檺涓嬪彂澶辫触 "  )
+    private  Integer type;
+
+    @ApiModelProperty(value = "澶囨敞淇℃伅锛屾弿杩板け璐ュ師鍥�")
+    private String info;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserInfoRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserInfoRequest.java
new file mode 100644
index 0000000..7feb315
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/erp/UserInfoRequest.java
@@ -0,0 +1,26 @@
+package com.doumee.core.erp.model.openapi.request.erp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel(value = "鐢ㄦ埛鍩烘湰淇℃伅璇锋眰淇℃伅" )
+public class UserInfoRequest {
+    @ApiModelProperty(value = "濮撳悕" , required = true)
+    private String name;
+    @ApiModelProperty(value = "韬唤璇佸彿" , required = true)
+    private String idNo;
+    @ApiModelProperty(value = "鎵嬫満鍙�" , required = true)
+    private String phone;
+    @ApiModelProperty(value = "璁垮鎬у埆 1-鐢� 2-濂�" ,example = "1")
+    private Integer sex;
+    @ApiModelProperty(value = "浜鸿劯鐓х墖" )
+    private String faceImg;
+    @ApiModelProperty(value = "鍋ュ悍璇�" )
+    private String healthImg;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/AccessTokenResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/AccessTokenResponse.java
new file mode 100644
index 0000000..cc086da
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/AccessTokenResponse.java
@@ -0,0 +1,21 @@
+package com.doumee.core.erp.model.openapi.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("鎺ュ彛璋冪敤鍑瘉杩斿洖淇℃伅")
+public class AccessTokenResponse {
+
+    @ApiModelProperty(value = "璋冪敤鍑瘉" )
+    private String token;
+    @ApiModelProperty(value = "鏈夋晥鏃堕棿锛堢锛�", example = "1")
+    private long expireTime;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/CarEventListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/CarEventListResponse.java
new file mode 100644
index 0000000..4cf8866
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/CarEventListResponse.java
@@ -0,0 +1,67 @@
+package com.doumee.core.erp.model.openapi.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("杞﹁締鍑哄叆浜嬩欢鍚屾杩斿洖淇℃伅")
+public class CarEventListResponse {
+
+    @ApiModelProperty(value = "鍞竴鏍囪瘑" )
+    private String eventId;
+    @ApiModelProperty(value = "杩涘嚭鍦虹被鍨嬶紝0锛氳繘鍦猴紝1锛氬嚭鍦�" )
+    private Integer inoutType;
+
+    @ApiModelProperty(value = "鏄惁榛戝悕鍗曟爣璇嗭紙1-榛戝悕鍗� 0-闈為粦鍚嶅崟锛�" ,example = "1")
+    private Integer alarmCar;
+    @ApiModelProperty(value = "鏃堕棿绫诲瀷锛氶粦鍚嶅崟\t771756034\n" +
+            "杞︿綅鍗犵敤-771764225\n" +
+            "鍏ュ満鍘嬬嚎浜嬩欢-771760130\n" +
+            "鍏ュ満鏀捐浜嬩欢-771760131\n" +
+            "鍑哄満鍘嬬嚎浜嬩欢-771760133\n" +
+            "鍑哄満鏀捐浜嬩欢-771760134\n" +
+            "杞﹁締鍋滃叆杞︿綅-771764226\n" +
+            "杞﹁締绂诲紑杞︿綅-771764227" ,example = "1")
+    private Integer eventType;
+    @ApiModelProperty(value = "杞﹁締灞炴�у悕绉�" )
+    private String carAttributeName;
+    @ApiModelProperty(value = "鍗″彿" )
+    private String cardNo;
+    @ApiModelProperty(value = "浜嬩欢鍙�" )
+    private String eventCmd;
+    @ApiModelProperty(value = "鍑哄叆鍙g紪鍙�" )
+    private String gateIndex;
+    @ApiModelProperty(value = "鍑哄叆鍙e悕绉�" )
+    private String gateName;
+    @ApiModelProperty(value = "杞﹁締涓诲搧鐗�" )
+    private String mainLogo;
+    @ApiModelProperty(value = "鍋滆溅搴撶紪鐮�" ,example = "1")
+    private Integer parkId;
+    @ApiModelProperty(value = "鍋滆溅搴撳悕绉�" )
+    private String parkName;
+    @ApiModelProperty(value = "杞︾墝鍥剧墖" )
+    private String platePicUrl;
+    @ApiModelProperty(value = "杞﹁締鐓х墖" )
+    private String vehiclePicUrl;
+    @ApiModelProperty(value = "杞︾墝鍙�" )
+    private String plateNo;
+    @ApiModelProperty(value = "杞︾墝棰滆壊" )
+    private String plateColor;
+    @ApiModelProperty(value = "杞﹂亾鍚嶇О" )
+    private String roadwayName;
+    @ApiModelProperty(value = "杞﹂亾绫诲瀷 1锛氬叆鍦鸿溅閬� 2锛氬嚭鍦轰笉鏀惰垂杞﹂亾 3锛氬嚭鍦虹即璐硅溅閬� 4锛氫腑澶即璐硅溅閬�",example = "1")
+    private Integer roadwayType;
+    @ApiModelProperty(value = "杞﹁締瀛愬搧鐗�")
+    private String subLogo;
+    @ApiModelProperty(value = "瀛愬搧鐗屽勾娆�")
+    private Integer subModel;
+    @ApiModelProperty(value = "浜х敓鏃堕棿" )
+    private String createTime ;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/DeviceListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/DeviceListResponse.java
new file mode 100644
index 0000000..80a98af
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/DeviceListResponse.java
@@ -0,0 +1,21 @@
+package com.doumee.core.erp.model.openapi.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("闂ㄧ缁勫叧鑱旈棬绂佽繑鍥炰俊鎭�")
+public class DeviceListResponse {
+
+    @ApiModelProperty(value = "闂ㄧ璁惧鍞竴鏍囪瘑" ,example = "1")
+    private Integer id;
+    @ApiModelProperty(value = "鍚嶇О" )
+    private String name;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpOrgListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpOrgListResponse.java
new file mode 100644
index 0000000..ca8f270
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpOrgListResponse.java
@@ -0,0 +1,35 @@
+package com.doumee.core.erp.model.openapi.response.erp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("缁勭粐淇℃伅鍚屾杩斿洖淇℃伅")
+public class ErpOrgListResponse {
+    @ApiModelProperty(value = "鍞竴鏍囪瘑" ,example = "1")
+    private String id;
+    @ApiModelProperty(value = "鍚嶇О" )
+    private String name;
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�",example = "0")
+    private int isdeleted  ;
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤",example = "0")
+    private int status  ;
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿,濡�2023-11-24 09:47:36")
+    private Date createDate;
+    @ApiModelProperty(value = "鏇存柊鏃堕棿,濡�2023-11-24 09:47:36")
+    private Date editDate;
+    @ApiModelProperty(value = "鎵�灞炵埗绾х粍缁囩紪鐮�")
+    private String parentOrgId;
+    @ApiModelProperty(value = "璐熻矗浜虹紪鐮�")
+    private String headId;
+    @ApiModelProperty(value = "缁勭粐浠g爜")
+    private String code;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpUserListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpUserListResponse.java
new file mode 100644
index 0000000..de3685c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/response/erp/ErpUserListResponse.java
@@ -0,0 +1,48 @@
+package com.doumee.core.erp.model.openapi.response.erp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("浜哄憳淇℃伅鍚屾杩斿洖淇℃伅")
+public class ErpUserListResponse {
+    @ApiModelProperty(value = "鍞竴鏍囪瘑" ,example = "1")
+    private String id;
+    @ApiModelProperty(value = "濮撳悕" )
+    private String name;
+    @ApiModelProperty(value = "韬唤璇佸彿" )
+    private String idNo;
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境閫氳璇� 2鎶ょ収 ,榛樿涓�0" ,example = "0")
+    private int idType;
+    @ApiModelProperty(value = "璁垮鎬у埆 1-鐢� 2-濂�" ,example = "1")
+    private Integer sex;
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�",example = "0")
+    private int isdeleted  ;
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤",example = "0")
+    private int status  ;
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿,濡�2023-11-24 09:47:36")
+    private Date createDate;
+    @ApiModelProperty(value = "鏇存柊鏃堕棿,濡�2023-11-24 09:47:36")
+    private Date editDate;
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮�")
+    private String orgId;
+    @ApiModelProperty(value = "浜鸿劯鐓х墖鍦板潃,鍥剧墖鍏綉璁块棶鍦板潃")
+    private String faceImg;
+    @ApiModelProperty(value = "宸ュ彿")
+    private String code;
+    @ApiModelProperty(value = "鎵嬫満鍙�" , required = true)
+    private String phone;
+    @ApiModelProperty(value = "鍗″彿闆嗗悎" )
+    private List<String> cardList;
+    @ApiModelProperty(value = "鎺堟潈闂ㄧ缁勭紪鐮侀泦鍚�,銆愯瀹㈢銆戝敮涓�鏍囪瘑" )
+    private Integer[] roleIds;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKResponseCode.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKResponseCode.java
new file mode 100644
index 0000000..3bf5665
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKResponseCode.java
@@ -0,0 +1,52 @@
+package com.doumee.core.haikang.model;
+
+import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Data
+public class HKResponseCode {
+    private Logger logger = LoggerFactory.getLogger(HKResponseCode.class);
+    //娴峰悍骞冲彴鏍规嵁鐜板満鐜閰嶇疆http杩樻槸https
+
+    /**
+     * 鍗$姸鎬�
+     */
+    public  enum ReturnCode {
+
+        RESPONSE_FACE_ERROR("0x1540350c", "鍥炶皟閿欒锛氫汉鑴稿缓妯″け璐�"),
+        RESPONSE_DEVICE_NOFAVOR("0x15403016", "璁惧涓嶆敮鎸佷笅鍙�"),
+        RESPONSE_SUCCEE("0", "鎴愬姛"),
+        RESPONSE_FACE_ERROR2("0x1540350d", "鍥炶皟閿欒锛氫汉鑴哥溂闂磋窛澶皬");
+
+        // 鎴愬憳鍙橀噺
+        private String name;
+        private String key;
+
+        // 鏋勯�犳柟娉�
+        ReturnCode(String key, String name ) {
+            this.name = name;
+            this.key = key;
+        }
+
+        // get set 鏂规硶
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getKey() {
+            return key;
+        }
+
+        public void setKey(String key) {
+            this.key = key;
+        }
+
+    }
+
+}
+
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseResponse.java
new file mode 100644
index 0000000..cb4b066
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseResponse.java
@@ -0,0 +1,20 @@
+package com.doumee.core.haikang.model.param;
+
+import lombok.Data;
+
+@Data
+public class BaseResponse<T> {
+
+    private T data;
+    /**
+     * 杩斿洖鐮�
+     * 0锛氭垚鍔�
+     * 鍏朵粬锛氬け璐�
+     * 鍙傝�冮檮褰旹.other.1 璧勬簮鐩綍閿欒鐮�
+     */
+    private String code;
+    /**
+     * 鎺ュ彛鎵ц鎯呭喌璇存槑淇℃伅
+     */
+    private String msg;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AcsDeviceStatusListRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AcsDeviceStatusListRequest.java
new file mode 100644
index 0000000..cb40e32
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AcsDeviceStatusListRequest.java
@@ -0,0 +1,15 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class AcsDeviceStatusListRequest {
+  private String  regionId	;// string	False	鍖哄煙id , 鍒嗛〉鑾峰彇鍖哄煙鍒楄〃鎺ュ彛鍙互鑾峰彇
+  private String   ip;//	string	False	璁惧ip锛岀敤鎴峰彲浠ヨ嚜宸辨墜鍔ㄨ緭鍏ワ紝涔熷彲浠ユ牴鎹煡璇㈤棬绂佽澶囧垪琛╲2鎺ュ彛鍙互鑾峰彇
+  private String[]   indexCodes;//i	string[]	False	闂ㄧ璁惧鍒楄〃锛屾渶澶�500锛屾煡璇㈤棬绂佽澶囧垪琛╲2鎺ュ彛鍙互鑾峰彇
+  private String   status	;//istring	False	鐘舵��1: 鍦ㄧ嚎0: 绂荤嚎-1: 鏈娴�
+  private String   includeSubNode;// i	string	False	鏄惁鍖呭惈涓嬬骇,锛堣嫢regionId涓虹┖锛屽垯璇ュ弬鏁颁笉璧蜂綔鐢級1: 鍖呭惈 0: 涓嶅寘鍚�
+  private Integer  pageNo	;//integer	True	椤电爜,pageNo鈮�1
+  private Integer  pageSize;//	integer	True	鍒嗛〉澶у皬
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentListRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentListRequest.java
new file mode 100644
index 0000000..f2f93c2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentListRequest.java
@@ -0,0 +1,36 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class AppointmentListRequest {
+    private String  receptionistId;//	string	False	琚浜哄敮涓�鏍囪瘑,鏌ヨ浜哄憳鍒楄〃v2鎺ュ彛鑾峰彇杩斿洖鎶ユ枃涓殑personId瀛楁
+    private String  visitorName;//	string	False	璁垮濮撳悕锛岄暱搴︿笉瓒呰繃32锛屾敮鎸佷腑鑻辨枃瀛楃锛屼笉鑳藉寘鍚� 鈥� / \ : * ? " < >
+    private String   phoneNo	;//string	False	鑱旂郴鐢佃瘽寤鸿濉啓鎵嬫満鍙风爜
+    private String   visitStartTimeBegin;//	string	False	鏃堕棿鍙傛暟闇�婊¤冻ISO8601鏍煎紡锛�    yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛�   渚嬪鍖椾含鏃堕棿锛� 2018-07-26T15:00:00+08:00
+    private String    visitStartTimeEnd	;//string	False	鏃堕棿鍙傛暟闇�婊¤冻ISO8601鏍煎紡锛� yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛�  渚嬪鍖椾含鏃堕棿锛�  2018-07-26T15:00:00+08:00
+    private String    visitEndTimeBegin;//	string	False	鏃堕棿鍙傛暟闇�婊¤冻ISO8601鏍煎紡锛�  yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛�  渚嬪鍖椾含鏃堕棿锛� 2018-07-26T15:00:00+08:00
+    private String     visitEndTimeEnd;//	string	False	鏃堕棿鍙傛暟闇�婊¤冻ISO8601鏍煎紡锛�  yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛�  渚嬪鍖椾含鏃堕棿锛�  2018-07-26T15:00:00+08:00
+    private int    pageNo;//	integer	True	pageNo瑕佹眰澶т簬0涓嶈秴杩�2147483647
+    private int    pageSize;//	integer	True	pageSize瑕佹眰澶т簬0涓斾笉瓒呰繃1000
+    private String     verificationCode;//	string	False	璁垮楠岃瘉鐮佷负璁垮绠$悊缁勪欢鎻愪緵锛岀敤浜庤瀹㈠湪璁垮鏈虹櫥璁扮殑鍑瘉
+    /**
+     * 璁垮鐘舵��,
+     * 0锛氬緟瀹℃牳锛堥绾﹀緟瀹℃壒锛夈��
+     * 1锛氭甯革紙棰勭害鎴愬姛鎴栭绾﹀鎵规垚鍔熷悗<鏈櫥璁�>锛氬綋鍓嶆椂闂存湭瓒呰繃棰勮鏉ヨ鏃堕棿锛夈��
+     * 2锛氳繜鍒帮紙棰勭害鎴愬姛鎴栭绾﹀鎵规垚鍔熷悗<鏈櫥璁�>锛氬綋鍓嶆椂闂磋秴杩囬璁℃潵璁挎椂闂达紝浣嗘湭瓒呰繃棰勮绂诲紑鏃堕棿锛夈��
+     * 3锛氬け鏁堬紙棰勭害鎴愬姛鎴栭绾﹀鎵规垚鍔熷悗<鏈櫥璁�>锛氬綋鍓嶆椂闂村凡瓒呰繃棰勮绂诲紑鏃堕棿锛夈��
+     * 4锛氬鏍搁��鍥烇紙棰勭害寰呭鎵癸紝瀹℃壒浜哄憳瀹℃壒閫�鍥烇級銆�
+     * 5锛氳秴鏈熻嚜鍔ㄧ绂伙紙瓒呮湡鏈绂昏褰曡瀹紝鐢卞悗鍙颁换鍔″畾鏃跺鐞嗙绂伙級銆�
+     * 6锛氬凡绛剧锛堣瀹㈢绂伙級銆�
+     * 7锛氳秴鏈熸湭绛剧锛堣瀹㈢櫥璁帮紝褰撳墠鏃堕棿宸茶秴杩囬璁$寮�鏃堕棿锛岃繕鏈繘琛岀绂伙級銆�
+     * 8锛氬凡鍒拌揪锛涳紙璁垮鐧昏锛屽綋鍓嶆椂闂存湭瓒呰繃棰勮绂诲紑鏃堕棿锛夈��
+     * 9锛氬鏍稿け鏁堬紙棰勭害寰呭鎵癸紝涓�鐩村埌褰撳墠鏃堕棿瓒呰繃棰勮绂诲紑鏃堕棿锛岃繕鏈鎵归�氳繃锛夈��
+     * 10锛氶個绾︿腑锛堝憳宸ュ彂璧烽個绾︼紝璁垮杩樻湭搴旈個锛夈��
+     * 11锛氶個绾﹀け鏁堬紙鍛樺伐鍙戣捣閭�绾︼紝涓�鐩村埌褰撳墠鏃堕棿瓒呰繃棰勮绂诲紑鏃堕棿锛岃瀹㈣繕鏈簲閭�锛�
+     */
+    private String     visitorStatus;//	integer	False	
+    private String   QRCode	;//string	False	璁垮浜岀淮鐮佸唴瀹�,鏀寔鍔ㄦ�佷簩缁寸爜鎴栬�呴潤鎬佷簩缁寸爜
+    private String   orderId;//	string	False	棰勭害璁板綍ID锛岃瀹㈤绾2鎺ュ彛鑾峰彇杩斿洖鎶ユ枃涓殑orderId瀛楁
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CarChargeDelRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CarChargeDelRequest.java
new file mode 100644
index 0000000..af0e117
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CarChargeDelRequest.java
@@ -0,0 +1,10 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class CarChargeDelRequest {
+
+    private String    parkSyscode;//	string	False	鍋滆溅搴撳敮涓�鏍囪瘑,涓虹┖鏃跺垯鍙栨秷褰撳墠杞﹁締鎵�鏈夊仠杞﹀簱鐨勫寘鏈燂紝鍙�氳繃鑾峰彇鍋滆溅搴撳垪琛ㄦ帴鍙h幏鍙�
+    private String      plateNo;//	string	True	杞︾墝鍙风爜
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardDeletionRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardDeletionRequest.java
new file mode 100644
index 0000000..4ca9add
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardDeletionRequest.java
@@ -0,0 +1,10 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class CardDeletionRequest {
+
+   private String cardNumber;//	string	True	鍗″彿锛屾牴鎹幏鍙栧崱鐗囧垪琛ㄦ帴鍙h幏鍙栬繑鍥炲弬鏁癱ardNo
+   private String personId	;//string	True	浜哄憳Id锛岃幏鍙栦汉鍛樺垪琛╲2 鎺ュ彛鑾峰彇杩斿洖鍙傛暟personId
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardLossRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardLossRequest.java
new file mode 100644
index 0000000..35d149a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/CardLossRequest.java
@@ -0,0 +1,10 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CardLossRequest {
+  private List<CardDeletionRequest> cardList;//	object[]	True	浜哄崱鍏宠仈缁撳悎鏁扮粍(鎵归噺鎸傚け鏁伴噺涓嶈兘瓒呰繃200涓�)
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/DevicePictureRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/DevicePictureRequest.java
new file mode 100644
index 0000000..0c2112d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/DevicePictureRequest.java
@@ -0,0 +1,10 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class DevicePictureRequest {
+
+    private String  svrIndexCode	;//	string	True	鎻愪緵picUri澶勪細鎻愪緵姝ゅ瓧娈�
+    private String  picUri	;//	string	True	鍥剧墖鐩稿鍦板潃
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/EventSubRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/EventSubRequest.java
new file mode 100644
index 0000000..152ed4e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/EventSubRequest.java
@@ -0,0 +1,14 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class EventSubRequest {
+
+ private String   name	;//string	False	鍚嶇О锛屾ā绯婃悳绱紝鏈�澶ч暱搴�32锛岃嫢鍖呭惈涓枃锛屾渶澶ч暱搴︽寚涓嶈秴杩囨寜鐓ф寚瀹氱紪鐮佺殑瀛楄妭闀垮害锛屽嵆getBytes(鈥渦tf-8鈥�).length
+   private Integer[]    eventTypes;//	number[]	True	浜嬩欢绫诲瀷,璇﹁闄勫綍D
+   private String    eventDest;//	string	True	鎸囧畾浜嬩欢鎺ユ敹鐨勫湴鍧�锛岄噰鐢╮estful鍥炶皟妯″紡锛屾敮鎸乭ttp鍜宧ttps锛屾牱寮忓涓嬶細http://ip:port/eventRcv鎴栬�卙ttps://ip:port/eventRcv涓嶈秴杩�1024涓瓧绗︿簨浠舵帴鏀跺湴鍧�鐢卞簲鐢ㄦ柟璐熻矗鎸夋寚瀹氱殑瑙勮寖鎻愪緵锛屼簨浠舵帴鏀舵帴鍙d笉闇�瑕佽璇佷笁鏂瑰鎴锋敹鍒版秷鎭紝璇锋敞鎰忕珛鍗宠繑鍥濰TTP/1.1 200 OK锛� 鍚﹀垯鍥犱负鎺ユ敹澶參锛屽鑷翠簨浠剁Н鍘�
+   private Integer[]     subType;//	number	False	璁㈤槄绫诲瀷锛�0-璁㈤槄鍘熷浜嬩欢锛�1-鑱斿姩浜嬩欢锛�2-鍘熷浜嬩欢鍜岃仈鍔ㄤ簨浠讹紝涓嶅~浣跨敤榛樿鍊�0
+   private Integer[]     eventLvl;//	number[]	False	浜嬩欢绛夌骇锛�0-鏈厤缃紝1-浣庯紝2-涓紝3-楂� 姝ゅ浜嬩欢绛夌骇鏄寚鍦ㄤ簨浠惰仈鍔ㄤ腑閰嶇疆鐨勭瓑绾ц闃呯被鍨嬩负0鏃讹紝姝ゅ弬鏁版棤鏁堬紝浣跨敤榛樿鍊�0鍦ㄨ闃呯被鍨嬩负1鏃讹紝涓嶅~浣跨敤榛樿鍊糩1,2,3]   鍦ㄨ闃呯被鍨嬩负2鏃讹紝涓嶅~浣跨敤榛樿鍊糩0,1,2,3]鏁扮粍澶у皬涓嶈秴杩�32锛屼簨浠剁瓑绾уぇ灏忎笉瓒呰繃31
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/OrgDelRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/OrgDelRequest.java
new file mode 100644
index 0000000..bb5f4d7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/OrgDelRequest.java
@@ -0,0 +1,8 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class OrgDelRequest {
+    private String[] indexCodes;//	string[]	True	寰呭垹闄ょ殑缁勭粐indexCode鍒楄〃锛屽崟娆℃彁浜や笂闄愪负1000鏉�  浠庤幏鍙栫粍缁囧垪琛� 鎺ュ彛鑾峰彇杩斿洖鍙傛暟orgIndexCode
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ParkReservationDelRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ParkReservationDelRequest.java
new file mode 100644
index 0000000..a9c1a39
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ParkReservationDelRequest.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class ParkReservationDelRequest {
+
+    private String  reserveOrderNo	;//string	True	棰勭害鍗曞彿
+    private String  way	;//number	False	鍙栨秷鏂瑰紡1:鐢ㄦ埛鍙栨秷锛堥粯璁わ級         5:璁垮骞冲彴鍙栨秷
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/PrivilegeGroupRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/PrivilegeGroupRequest.java
new file mode 100644
index 0000000..4090c3d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/PrivilegeGroupRequest.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class PrivilegeGroupRequest {
+
+    private String  name;//	string	False	璁垮鏉冮檺缁勫悕绉�
+    private int pageNo	;//number	True	褰撳墠椤电爜锛岃姹傚ぇ浜�0
+    private int  pageSize	;//number	True	姣忛〉璁板綍鎬绘暟锛岃姹傚ぇ浜�0涓斾笉瓒呰繃1000
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/SortRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/SortRequest.java
new file mode 100644
index 0000000..da9eeec
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/SortRequest.java
@@ -0,0 +1,12 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class SortRequest {
+
+
+    private String  field	;//	string	False	鎺掑簭瀛楁锛屽搴旀煡璇㈢敤鐨勫弬鏁板悕绉�
+    private String sort	;//	string	False	鎺掑簭瑙勫垯锛宎sc锛氭搴忥紝    desc锛氬�掑簭
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskAdditionRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskAdditionRequest.java
new file mode 100644
index 0000000..69779e9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskAdditionRequest.java
@@ -0,0 +1,10 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class TaskAdditionRequest {
+
+   private Integer taskType;//s	number	True	涓嬭浇浠诲姟绫诲瀷1锛氬崱鐗�4锛氫汉鑴�    鍏朵粬鍙傝�冮檮褰旳.53 浠诲姟涓嬭浇绫诲瀷璇存槑
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionFaceRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionFaceRequest.java
new file mode 100644
index 0000000..1cdddc2
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionFaceRequest.java
@@ -0,0 +1,12 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class TaskDataAdditionFaceRequest {
+
+   private String card	;//string	False	鏀寔8-20浣嶆暟瀛�+澶у啓瀛楁瘝鐨勫崱鍙凤紱浠ュ崱涓轰腑蹇冭澶囧繀濉紝璇锋牴鎹澶囧疄闄呰兘鍔涘~鍐�
+   private Map<String,String> data	;//object	True	浜鸿劯鏁版嵁锛孠ey锛氫负浜鸿劯缂栧彿 Value锛氫负浜鸿劯鍥剧墖https涓嬭浇鐨刄RL锛屽浘鐗囪姹傛祻瑙堝櫒鍙互鐩存帴鎵撳紑锛屼笉鏀寔閲嶅畾鍚�
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionRequest.java
new file mode 100644
index 0000000..2f117e6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskDataAdditionRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TaskDataAdditionRequest {
+
+   private String taskId;//string	True	涓嬭浇浠诲姟鍞竴鏍囪瘑
+   private List<TaskDataAdditionResourceRequest> resourceInfos;//	object[]	True	璧勬簮瀵硅薄
+   private List<TaskDataAdditionPersonRequest> personInfos;//		object[]	True	浜哄憳淇℃伅
+   private  List<TaskDataAdditionCardRequest> cards;//		object[]	True	浜哄憳淇℃伅
+   private TaskDataAdditionFaceRequest face;//	object	False	浜鸿劯淇℃伅锛屼笅杞界郴缁熷浜哄憳浜鸿劯鏉冮檺鏃跺繀濉�
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskPersonDetailRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskPersonDetailRequest.java
new file mode 100644
index 0000000..694389d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TaskPersonDetailRequest.java
@@ -0,0 +1,21 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TaskPersonDetailRequest {
+
+   private String  downloadResultId;//		string	False	涓嬭浇璁板綍鍞竴ID,浣跨敤downloadResultId鏌ヨ璁惧閫氶亾涓嬭浇璁板綍璇︽儏鏃讹紝蹇界暐taskId涓巖esourceInfo瀛楁锛堚�滀笅杞借褰曞敮涓�ID鈥濆拰鈥滀笅杞戒换鍔℃爣璇�+璁惧閫氶亾瀵硅薄鈥濅袱鑰呭繀椤绘湁涓�涓笉涓虹┖锛夛紝浠庢煡璇㈣澶囬�氶亾鏉冮檺涓嬭浇璁板綍鍒楄〃鎺ュ彛鑾峰彇杩斿洖鍙傛暟downloadResultId
+   private String taskId;//		string	False	涓嬭浇浠诲姟鍞竴鏍囪瘑锛屼粠鏌ヨ璁惧閫氶亾鏉冮檺涓嬭浇璁板綍鍒楄〃鎺ュ彛鑾峰彇杩斿洖鍙傛暟taskId
+   private  TaskDataAdditionResourceRequest   resourceInfo	;//	object	False	璁惧閫氶亾瀵硅薄
+   private  String[] personIds;//		string[]	False	浜哄憳缂栧彿鍒楄〃锛屾煡璇汉鍛樺垪琛╲2鎺ュ彛鑾峰彇杩斿洖鎶ユ枃涓殑personId瀛楁锛屾渶澶ч暱搴�1000
+   private String[]  orgIds;//		string[]	False	缁勭粐缂栧彿锛屾煡璇㈢粍缁囧垪琛╲2鎺ュ彛鑾峰彇杩斿洖鎶ユ枃涓殑orgIndexCode瀛楁锛屾渶澶ч暱搴�1000
+   private Integer downloadResult;//	integer	False	涓嬭浇缁撴灉锛�           0 鎴愬姛锛�           1 澶辫触锛�           2 閮ㄥ垎鎴愬姛
+   private TimeRangeRequest downloadTime;//	object	False	涓嬭浇鏃堕棿鏌ヨ瀵硅薄
+   private List<SortRequest> sortObjects	;//object[]	False	鐩墠鍙敮鎸侀厤缃椂闂�
+   private Integer pageNo	;//number	True	椤电爜,pageNo>0
+   private Integer pageSize	;//number	True	椤靛ぇ灏�,0<pageSize<=1000
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TempCarInRecordListRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TempCarInRecordListRequest.java
new file mode 100644
index 0000000..28f4689
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TempCarInRecordListRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class TempCarInRecordListRequest {
+  private String   parkSyscode;//	string	False	鍋滆溅搴撳敮涓�鏍囪瘑锛屽彲浠庤幏鍙栧仠杞﹀簱鍒楄〃鎺ュ彛鑾峰彇杩斿洖鍙傛暟parkIndexCode锛� 涓嶅~鍒欓拡瀵规墍鏈夊仠杞﹀簱杩涜鏌ヨ
+  private String   plateNo;//	string	False	杞︾墝鍙风爜锛岃嚦灏戝寘鍚�3涓瓧绗�
+  private String   cardNo	;//string	False	鍗″彿
+  private String   parkTime	;//string	False	鍋滆溅鏃堕暱锛屽崟浣嶏細灏忔椂锛屼笌鈥滄煡璇㈠紑濮嬫椂闂淬�佹煡璇㈢粨鏉熸椂闂粹�濅簰鏂ヤ娇鐢�
+  private String   startTime;//	string	False	涓庘�滃仠杞︽椂闀库�濇煡璇簰鏂ヤ娇鐢�  ISO8601鏍煎紡锛�  yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛屼緥濡傚寳浜椂闂达細          2018-07-26T15:00:00+08:00
+  private String  endTime	;//string	False	涓庘�滃仠杞︽椂闀库�濇煡璇簰鏂ヤ娇鐢� ISO8601鏍煎紡锛�  yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛屼緥濡傚寳浜椂闂达細          2018-07-26T15:00:00+08:00
+  private Integer  pageNo	;//integer	True	椤电爜,pageNo鈮�1
+  private Integer  pageSize;//	integer	True	鍒嗛〉澶у皬
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeRequest.java
new file mode 100644
index 0000000..d11b047
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeRequest.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class TimeRangeRequest {
+
+    private String startTime;//	string	False	寮�濮嬫棩鏈�,閲囩敤ISO8601鏃堕棿鏍煎紡锛屾渶澶ч暱搴�32涓瓧绗︼紝濡�2018-09-03T17:30:08.000+08:00
+    private String endTime	;//string	False	缁撴潫鏃ユ湡,閲囩敤ISO8601鏃堕棿鏍煎紡锛屾渶澶ч暱搴�32涓瓧绗︼紝濡�2018-09-03T17:30:08.000+08:00
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddFaceRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddFaceRequest.java
new file mode 100644
index 0000000..c61f23f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddFaceRequest.java
@@ -0,0 +1,12 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+/**
+ * 浜鸿劯base64璇锋眰鍙傛暟
+ */
+@Data
+public class UserAddFaceRequest {
+
+    private String  faceData;//	string	True	浜鸿劯鍥剧墖base64缂栫爜鍚庣殑瀛楃
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddRequest.java
new file mode 100644
index 0000000..0904bc4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserAddRequest.java
@@ -0,0 +1,24 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 鐢ㄦ埛鏂板璇锋眰鍙傛暟
+ */
+@Data
+public class UserAddRequest {
+    private Integer  clientId;//number	False	浜哄憳涓存椂鏍囧織锛屽綋璋冪敤鏂规湭鎸囧畾personId鏃讹紝clientId浣滀负浜哄憳鏍囧織锛屽湪杩斿洖鍊间腑鏍囧織姣忎釜浜哄憳鐨勬坊鍔犵粨鏋溿�傛墍浠ユ瘡娆℃帴鍙h皟鐢紝姣忎釜浜哄憳鐨刢lientid闇�淇濇寔鍞竴锛�1~10涓瓧绗︼紝鍙敮鎸佹暟瀛椼�傛敞锛歝lientid鍙鏈璋冪敤鏈夋晥
+    private String   personId	;//string	False	浜哄憳ID锛屽彲浠ユ寚瀹氫汉鍛榩ersonId锛屼笉鍏佽涓庡叾浠栦汉鍛榩ersonId閲嶅锛屽寘鎷凡鍒犻櫎鐨勪汉鍛樸�� 涓虹┖鏃跺钩鍙拌嚜鍔ㄧ敓鎴愪汉鍛業D
+    private String   personName;//	string	True	浜哄憳鍚嶇О锛�1~32涓瓧绗︼紱涓嶈兘鍖呭惈 鈥� / \ : * ? " < >
+    private String   gender;//	string	True	鎬у埆锛�1锛氱敺锛�2锛氬コ锛�0锛氭湭鐭�
+    private String   orgIndexCode;//	string	True	鎵�灞炵粍缁囨爣璇嗭紝蹇呴』鏄凡瀛樺湪缁勭粐锛屼粠鑾峰彇缁勭粐鍒楄〃鎺ュ彛鑾峰彇杩斿洖鍙傛暟orgIndexCode
+    private String   birthday	;//string	False	鍑虹敓鏃ユ湡锛屼妇渚嬶細1992-09-12
+    private String   phoneNo	;//string	False	鎵嬫満鍙凤紝1-20浣嶆暟瀛�,骞冲彴涓婁汉鍛樹俊鎭疄鍚嶆爣璇嗛�夋嫨涓烘墜鏈哄彿鐮佹椂蹇呭~
+    private String   email;//	string	False	閭锛屼妇渚嬶細hic@163.com
+    private String   certificateType;//	string	False	璇佷欢绫诲瀷锛屽弬鑰冮檮褰旳 鏁版嵁瀛楀吀锛屽钩鍙颁笂浜哄憳淇℃伅瀹炲悕鏍囪瘑閫夋嫨涓鸿韩浠借瘉浠舵椂蹇呭~
+    private String   certificateNo;//	string	False	璇佷欢鍙风爜锛�1-20浣嶆暟瀛楀瓧姣嶏紝骞冲彴涓婁汉鍛樹俊鎭疄鍚嶆爣璇嗛�夋嫨涓鸿韩浠借瘉浠舵椂蹇呭~
+    private String   jobNo;//	string	False	宸ュ彿锛�1-32涓瓧绗︼紝骞冲彴涓婁汉鍛樹俊鎭疄鍚嶆爣璇嗛�夋嫨涓哄伐鍙锋椂蹇呭~
+    private List<UserAddFaceRequest> faces;//	object[]	False	浜鸿劯淇℃伅
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentCancelRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentCancelRequest.java
new file mode 100644
index 0000000..684e68d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentCancelRequest.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class VisitAppointmentCancelRequest {
+
+    private String[] appointRecordIds;//	string[]	True	棰勭害璁板綍ID鐨勬暟缁勶紝涓庢煡璇㈣瀹㈤绾﹁褰晇2鎺ュ彛涓殑appointRecordId瀵瑰簲
+}
\ No newline at end of file
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentMDJRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentMDJRequest.java
new file mode 100644
index 0000000..2bb87fd
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentMDJRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class VisitAppointmentMDJRequest {
+
+    private String receptionistId;//		string	True	琚浜哄敮涓�鏍囪瘑锛屾煡璇汉鍛樺垪琛╲2鎺ュ彛鑾峰彇杩斿洖鎶ユ枃涓殑personId瀛楁
+    private VisitAppointmentPermissonRequest visitorPermissionSet	;//object	False	鏉冮檺闆嗗悎灏佽瀵硅薄
+    private String   visitStartTime;//		string	True	棰勮鏉ヨ鏃堕棿锛屾椂闂村弬鏁伴渶婊¤冻ISO8601鏍煎紡锛歽yyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛屼緥濡傚寳浜椂闂达細2018-07-26T15:00:00+08:00
+    private String   visitEndTime	;//	string	True	棰勮绂诲紑鏃堕棿锛屾椂闂村弬鏁伴渶婊¤冻ISO8601鏍煎紡锛歽yyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛屼緥濡傚寳浜椂闂达細2018-07-26T15:00:00+08:00棰勮绂诲紑鏃堕棿蹇呴』鏅氫簬褰撳墠鏃堕棿鍜岄璁℃潵璁挎椂闂�
+    private String  visitPurpose;//		string	False	鏉ヨ浜嬬敱锛岄暱搴︿负0锝�32涓瓧绗�
+    private VisitAppointmentVistorRequest visitorInfo	;//object	 	True	璁垮淇℃伅
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentPermissonRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentPermissonRequest.java
new file mode 100644
index 0000000..728f6b4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitAppointmentPermissonRequest.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.request;
+
+import lombok.Data;
+
+@Data
+public class VisitAppointmentPermissonRequest {
+
+    private String    defaultPrivilegeGroupFlag	;//	string	False	鏄惁浣跨敤榛樿鏉冮檺缁�(1锛氫娇鐢紱闈�1锛氫笉浣跨敤)
+ private String[] privilegeGroupIds	;//string[]	False	鏉冮檺缁刬ds锛屾煡璇㈣瀹㈡潈闄愮粍鎺ュ彛鑾峰彇杩斿洖鎶ユ枃涓殑privilegeGroupId瀛楁
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/EventDeviceDataRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/EventDeviceDataRequest.java
new file mode 100644
index 0000000..95ab60b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/EventDeviceDataRequest.java
@@ -0,0 +1,65 @@
+package com.doumee.core.haikang.model.param.request.event.acs;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class EventDeviceDataRequest {
+
+    @JsonProperty(value = "ExtEventIdentityCardInfo")
+    private  ExtEventIdentityCardInfo extEventIdentityCardInfo;//	浜哄憳韬唤璇佷俊鎭�	鍚�	涓嶉檺
+    @JsonProperty(value = "ExtEventCustomerNumInfo")
+    private ExtEventCustomerNumInfo  extEventCustomerNumInfo;//		閫氶亾浜嬩欢淇℃伅	鍚�	涓嶉檺
+    @JsonProperty(value = "ExtAccessChannel")
+    private Integer  extAccessChannel	;//Number	浜哄憳閫氶亾鍙�	鍚�	32
+    @JsonProperty(value = "ExtEventAlarmInID")
+    private Integer extEventAlarmInID;//	Number	鎶ヨ杈撳叆/闃插尯閫氶亾	鍚�	32
+    @JsonProperty(value = "ExtEventAlarmOutID")
+    private Integer  extEventAlarmOutID	;//Number	鎶ヨ杈撳嚭閫氶亾	鍚�	32
+    @JsonProperty(value = "ExtEventCardNo")
+    private String   extEventCardNo;//String	鍗″彿	鍚�	32
+    @JsonProperty(value = "ExtEventCaseID")
+    private Integer  extEventCaseID	;//Number	浜嬩欢杈撳叆閫氶亾	鍚�	32
+    @JsonProperty(value = "ExtEventCode")
+    private Integer extEventCode;//	Number	浜嬩欢绫诲瀷浠g爜	鍚�	32	鍙傝闄勫綍D.2.1.1 闂ㄧ浜嬩欢绫诲瀷
+    @JsonProperty(value = "ExtEventDoorID")
+    private Integer   extEventDoorID;//	Number	闂ㄧ紪鍙�	鍚�	32
+    @JsonProperty(value = "ExtEventIDCardPictureURL")
+    private String   extEventIDCardPictureURL;//	String	韬唤璇佸浘鐗嘦RL	鍚�	200
+    @JsonProperty(value = "ExtEventInOut")
+    private Integer   extEventInOut;//	Number	杩涘嚭鏂瑰悜	鍚�	32	杩涘嚭绫诲瀷1锛氳繘0锛氬嚭-1:鏈煡    瑕佹眰锛氳繘闂ㄨ鍗″櫒鎷ㄧ爜璁剧疆涓�1锛屽嚭闂ㄨ鍗″櫒鎷ㄧ爜璁剧疆涓�2
+    @JsonProperty(value = "ExtEventLocalControllerID")
+    private Integer  extEventLocalControllerID;//	Number	灏卞湴鎺у埗鍣╥d	鍚�	32	灏卞湴鎺у埗鍣ㄧ紪鍙�,0-闂ㄧ涓绘満,1-255浠h〃灏卞湴鎺у埗鍣�
+    @JsonProperty(value = "ExtEventMainDevID")
+    private Integer   extEventMainDevID;//	Number	涓昏澶囨嫧鐮�	鍚�	32
+    @JsonProperty(value = "ExtEventPersonNo")
+    private String   extEventPersonNo;//	String	浜哄憳缂栧彿	鍚�	32	浠ヤ汉涓轰腑蹇冭澶囦細涓婃姤
+    @JsonProperty(value = "ExtEventPictureURL")
+    private String  extEventPictureURL;//	String	鍥剧墖鐨剈rl	鍚�	32
+    @JsonProperty(value = "ExtEventReaderID")
+    private Integer extEventReaderID;//	Number	璇诲崱鍣╥d	鍚�	32
+    @JsonProperty(value = "ExtEventReaderKind")
+    private Integer  extEventReaderKind;//	Number	璇诲崱鍣ㄧ被鍒�	鍚�	32	0-鏃犳晥1-IC璇诲崱鍣�2-韬唤璇佽鍗″櫒3-浜岀淮鐮佽鍗″櫒4-鎸囩汗澶�
+    @JsonProperty(value = "ExtEventReportChannel")
+    private Integer extEventReportChannel;//	Number	鎶ュ憡涓婁紶閫氶亾	鍚�	32	1-甯冮槻涓婁紶2-涓績缁�1涓婁紶3-涓績缁�2涓婁紶0-鏃犳晥
+    @JsonProperty(value = "ExtEventRoleID")
+    private Integer extEventRoleID;//	Number	缇ょ粍缂栧彿	鍚�	32
+    @JsonProperty(value = "ExtEventSubDevID")
+    private Integer extEventSubDevID;//	Number	鍒嗘帶鍒跺櫒纭欢ID	鍚�	32
+    @JsonProperty(value = "ExtEventSwipNum")
+    private Integer  extEventSwipNum;//	Number	鍒峰崱娆℃暟	鍚�	32
+    @JsonProperty(value = "ExtEventType")
+    private Integer extEventType;//	Number	浜嬩欢绫诲瀷	鍚�	32	浜嬩欢绫诲瀷锛屽鏅�氶棬绂佷簨浠朵负0,韬唤璇佷俊鎭簨浠朵负1锛屽娴侀噺缁熻涓�2
+    @JsonProperty(value = "ExtEventVerifyID")
+    private Long   extEventVerifyID;//	Number	澶氶噸璁よ瘉搴忓彿	鍚�	32
+    @JsonProperty(value = "ExtEventWhiteListNo")
+    private Integer   extEventWhiteListNo;//	Number	鐧藉悕鍗曞崟鍙�	鍚�	32	1-8锛屼负0鏃犳晥
+    @JsonProperty(value = "ExtReceiveTime")
+    private String   extReceiveTime;//	String	浜嬩欢涓婃姤椹卞姩鐨勬椂闂�	鏄�	32	鐢ㄤ簬缁熻浜嬩欢涓婃姤寤舵椂锛孶nix鏃堕棿鎴筹紝绮剧‘鍒板井绉掞紝渚嬶細 "1558576265810000"浠h〃 2019/5/23 9:51:5.000
+    @JsonProperty(value = "Seq")
+    private Integer    seq;//	Number	浜嬩欢娴佹按鍙�	鏄�	32	浜嬩欢娴佹按鍙凤紝涓�0鏃犳晥
+    @JsonProperty(value = "UserType")
+    private Integer     userType;//	Number 鐢ㄦ埛绫诲瀷	鍚�	32	浜哄憳绫诲瀷锛�0 鏈煡锛�1 鏅�氾紝2 鏉ュ锛�3 榛戝悕鍗曪紝4 绠$悊鍛�
+    private String    svrIndexCode	;//String	鍥剧墖鏈嶅姟鍣ㄥ敮涓�缂栫爜	鍚�	32
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkInResultRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkInResultRequest.java
new file mode 100644
index 0000000..723c017
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkInResultRequest.java
@@ -0,0 +1,9 @@
+package com.doumee.core.haikang.model.param.request.event.parks;
+
+import lombok.Data;
+
+@Data
+public class EventParkInResultRequest {
+
+        private  EventParkRlsRequest rlsResult	;//	鏀捐缁撴灉鏁版嵁	鏄�
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkParamRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkParamRequest.java
new file mode 100644
index 0000000..5bf59bc
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkParamRequest.java
@@ -0,0 +1,14 @@
+package com.doumee.core.haikang.model.param.request.event.parks;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EventParkParamRequest {
+
+
+    private String   sendTime;//	P	String	浜嬩欢浠庢帴鏀惰�咃紙绋嬪簭澶勭悊鍚庯級鍙戝嚭鐨勬椂闂�	鏄�	32	浜嬩欢鍙戦�佹椂闂�
+    private String    ability;//	P	String	浜嬩欢绫诲埆	鏄�	64	鏍囪瘑鍋滆溅鍦轰簨浠�
+    private List<EventParkInfoRequest> events;//	P	Events[]	浜嬩欢淇℃伅	鏄�	涓嶉檺
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkRlsRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkRlsRequest.java
new file mode 100644
index 0000000..3ba0ca1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventParkRlsRequest.java
@@ -0,0 +1,15 @@
+package com.doumee.core.haikang.model.param.request.event.parks;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EventParkRlsRequest {
+        private Integer   releaseAuth	;//	Number	鏀捐鏉冮檺	鏄�	64	鍙傝闄勫綍A.65 鏀捐鏉冮檺
+        private Integer releaseReason	;//	Number	鏀捐鍘熷洜	鏄�	64	鍙傝鍙傝闄勫綍A.67 鏀捐鍘熷洜
+        private Integer releaseResult	;//	Number	鏀捐缁撴灉	鏄�	64	鍙傝闄勫綍A.66 鏀捐缁撴灉
+        private Integer releaseResultEx		;//Number	鏂颁綋绯绘斁琛岀粨鏋�	鏄�	64	鍙傝闄勫綍A.68 鏂颁綋绯绘斁琛岀粨鏋�
+        private Integer releaseWay	;//	Number	鏀捐鏂瑰紡	鏄�	64	鍙傝闄勫綍A.69 鏀捐鏂瑰紡
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitParamRequest.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitParamRequest.java
new file mode 100644
index 0000000..4cdca15
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitParamRequest.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 EventVisitParamRequest {
+
+
+    private String   sendTime;//	P	String	浜嬩欢浠庢帴鏀惰�咃紙绋嬪簭澶勭悊鍚庯級鍙戝嚭鐨勬椂闂�	鏄�	32	浜嬩欢鍙戦�佹椂闂�
+    private String    ability;//	P	String	浜嬩欢绫诲埆	鏄�	64	鏍囪瘑鍋滆溅鍦轰簨浠�
+    private String[] uids;//	String[]	鐢ㄦ埛id	鍚�	涓嶉檺
+    private String[] clients	;//String[]	缁勪欢鏍囪瘑	鍚�	涓嶉檺
+    private List<EventVisitInfoRequest> events;//	P	Events[]	浜嬩欢淇℃伅	鏄�	涓嶉檺
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AcsDeviceInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AcsDeviceInfoResponse.java
new file mode 100644
index 0000000..976a301
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AcsDeviceInfoResponse.java
@@ -0,0 +1,40 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class AcsDeviceInfoResponse {
+
+private String   indexCode	;//string	False	璧勬簮鍞竴缂栫爜
+private String   resourceType;//	string	False	璧勬簮绫诲瀷锛岃瑙侀檮褰旳.2 璧勬簮绫诲瀷
+private String   name;//	string	False	璧勬簮鍚嶇О
+private String   parentIndexCode;//	string	False	鐖剁骇璧勬簮缂栧彿
+private String   devTypeCode;//	string	False	闂ㄧ璁惧绫诲瀷缂栫爜锛岃瑙侀檮褰旳.7 闂ㄧ璁惧绫诲瀷涓棬绂佽澶囩被鍨嬬紪鍙�
+private String   devTypeDesc;//	string	False	闂ㄧ璁惧绫诲瀷鍨嬪彿锛岃瑙侀檮褰旳.7 闂ㄧ璁惧绫诲瀷涓棬绂佽澶囩被鍨�
+private String   deviceCode	;//string	False	涓诲姩璁惧缂栧彿
+private String   manufacturer;//	string	False	鍘傚晢
+private String   regionIndexCode;//	string	False	鎵�灞炲尯鍩�
+private String   regionPath	;//string	False	鎵�灞炲尯鍩熻矾寰�,浠绗﹀彿鍒嗗壊锛屽寘鍚湰鑺傜偣
+private String   treatyType;//	string	False	鎺ュ叆鍗忚锛岃瑙侀檮褰旳.6 缂栫爜璁惧鎺ュ叆鍗忚
+private Integer   cardCapacity;//	number	False	璁惧鍗″閲�
+private Integer   fingerCapacity;//	number	False	鎸囩汗瀹归噺
+private Integer   veinCapacity;//	number	False	鎸囬潤鑴夊閲�
+private Integer faceCapacity	;//number	False	浜鸿劯瀹归噺
+private Integer   doorCapacity;//	number	False	闂ㄥ閲�
+private String   deployId	;//string	False	鎷ㄧ爜
+private String   createTime	;//string	False	鍒涘缓鏃堕棿
+private String   updateTime	;//string	False	鏇存柊鏃堕棿
+private String   description;//	string	False	鎻忚堪
+private String   netZoneId	;//string	False	鎵�灞炵綉鍩�
+private String   acsReaderVerifyModeAbility	;//string	False	鏀寔璁よ瘉鏂瑰紡锛屾暟鎹负鍗佽繘鍒�
+private String   regionName	;//string	False	鍖哄煙鍚嶇О
+private String   regionPathName;//	string	False	鎵�灞炲尯鍩熻矾寰勫悕锛屼互"/"鍒嗛殧
+private String   ip	;//string	False	闂ㄧ璁惧IP
+private String   port;//	string	False	闂ㄧ璁惧绔彛
+private String   capability;//	string	False	璁惧鑳藉姏闆�(鍚澶囦笂鐨勬櫤鑳借兘鍔�)锛岃瑙侀檮褰旳.44 璁惧鑳藉姏闆�
+private String   devSerialNum;//	string	False	璁惧搴忓垪鍙�
+private String   dataVersion;//	string	False	鐗堟湰鍙�
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentInfoResponse.java
new file mode 100644
index 0000000..91dd02f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentInfoResponse.java
@@ -0,0 +1,53 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class AppointmentInfoResponse {
+
+
+    private String appointRecordId		;//string	False	棰勭害璁板綍ID锛屽彲浣滀负淇敼棰勭害鐨勪緷鎹�
+    private String receptionistId		;//string	False	琚浜哄敮涓�鏍囪瘑
+    private String receptionistName		;//string	False	琚浜哄鍚嶏紝鏀寔涓嫳鏂囧瓧绗︼紝涓嶈兘鍖呭惈 鈥� / \ : * ? " < >
+    private String receptionistCode		;//string	False	琚浜烘墍灞炵粍缁囩紪鐮�
+    private String visitStartTime		;//string	False	鏃堕棿鍙傛暟闇�婊¤冻ISO8601鏍煎紡锛� yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛�
+    private String visitEndTime		;//string	False	鏃堕棿鍙傛暟闇�婊¤冻ISO8601鏍煎紡锛�  yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛� 棰勮绂诲紑鏃堕棿蹇呴』鏅氫簬褰撳墠鏃堕棿鍜岄璁℃潵璁挎椂闂�
+    private String visitPurpose		;//string	False	鏉ヨ浜嬬敱
+    private String visitorName		;//string	False	璁垮濮撳悕
+    private String visitorWorkUnit		;//string	False	鏉ヨ鍗曚綅
+    private String visitorAddress		;//string	False	璁垮浣忓潃
+    private String visitorId		;//string	False	璁垮Id
+    private String verificationCode		;//string	False	璁垮楠岃瘉鐮侊紝鐢ㄤ簬璁垮鍦ㄨ瀹㈡満鐧昏鐨勫嚟璇�
+    private String QRCode		;//string	False	鍔ㄦ�佷簩缁寸爜锛屽闇�瑕佷娇鐢紝鍙皢璁垮浜岀淮鐮佸唴瀹硅浆鎴愪簩缁寸爜鍥剧墖鍗冲彲
+    private Integer gender;//	integer	False	1-鐢�,  2-濂�
+    private String phoneNo		;//string	False	鑱旂郴鐢佃瘽寤鸿濉啓鎵嬫満鍙风爜锛屼粎鏀寔绾暟瀛椼��
+    private String plateNo		;//string	False	璁垮杞︾墝鍙�
+    private Integer certificateType	;//	integer	False	璇佷欢绫诲瀷锛岃瑙侀檮褰旳.11 璇佷欢绫诲瀷
+    private String certificateNo		;//string	False	璇佷欢鍙凤紝鏍煎紡涓猴細1~20涓暟瀛椼�佸瓧姣嶇粍鎴�
+    private String picUri		;//string	False	杩斿洖鍥剧墖鐨勭浉瀵筓ri锛涢渶瑕佽皟鐢ㄨ幏鍙栬瀹㈣褰曚腑鐨勫浘鐗囨帴鍙o紝鏉ヨ幏鍙栧浘鐗囩殑鏁版嵁
+    private String svrIndexCode		;//string	False	涓巔icUri閰嶅杈撳嚭鐨勫瓧娈典俊鎭紝鐢ㄤ簬鈥滆幏鍙栬瀹㈣褰曠殑鍥剧墖鈥濇帴鍙g殑杈撳叆鍙傛暟
+    /**
+     * 璁垮鍗曠姸鎬�,
+     *             0:寰呭鏍搞��
+     *             1锛氭甯搞��
+     *             2锛氳繜鍒般��
+     *             3锛氬け鏁堛��
+     *             4锛氬鏍搁��鍥炪��
+     *             9锛氬鏍稿け鏁堛��
+     *             10锛氶個绾︿腑銆�
+     *             11:閭�绾﹀け鏁�
+     */
+    private Integer visitorStatus		;//integer	False
+    private String certAddr		;//string	False	璇佷欢鍦板潃
+    private String certIssuer		;//string	False	鍙戣瘉鏈哄叧
+    private Integer nation	;//integer	False
+    private String birthplace		;//string	False	绫嶈疮
+    private String orderId		;//string	False	璁垮璁板綍鍞竴鏍囪瘑锛岀敤浜庡凡棰勭害鐧昏銆佽瀹㈢绂荤瓑鎿嶄綔
+    private List<AppointmentResInfoResponse> designatedResources;//	object	False	鏉冮檺涓嬪彂鎸囧畾鐨勮祫婧愮偣闆嗗悎
+    private String[] privilegeGroupNames;//	string[]	False	鏉冮檺缁勫悕绉伴泦鍚�
+    private String identityUri		;//string	False	璇佷欢鐓�,鍥剧墖鐨勭浉瀵筓RL
+    private String identitySvrCode		;//string	False	璇佷欢鐓у搴斿浘鐗囨湇鍔″櫒serviceNodes
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AscDeviceStatusInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AscDeviceStatusInfoResponse.java
new file mode 100644
index 0000000..dd0676e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AscDeviceStatusInfoResponse.java
@@ -0,0 +1,29 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class AscDeviceStatusInfoResponse {
+     private String vehicleId;//string	False	dataId
+     private String deviceType;//string	False	璁惧鍨嬪彿
+     private String deviceIndexCode;//	string	False	璁惧鍞竴缂栫爜
+     private String regionIndexCode;//	string	False	鍖哄煙缂栫爜
+     private String collectTime;//string	False	閲囬泦鏃堕棿
+     private String regionName;//	string	False	鍖哄煙鍚嶅瓧
+     private String indexCode;//string	False	璧勬簮鍞竴缂栫爜
+     private String cn;//string	False	璁惧鍚嶇О
+     /**
+      * 鍗忚绫诲瀷锛�   hiksdk_net: 娴峰悍绉佹湁鍗忚
+      * gb_reg: GB/T28181
+      * ehome_reg: eHome鍗忚
+      * dhsdk_net: 澶у崕绉佹湁鍗忚
+      * onvif_net: ONVIF鍗忚
+      * ezviz_net: 钀ょ煶鍗忚
+      * cascade: 绾ц仈
+      */
+     private String treatyType;//string	False
+     private String manufacturer;//	string	False	鍘傚晢锛宧ikvision-娴峰悍锛宒ahua-澶у崕
+     private String ip;//string	False	ip鍦板潃
+     private String port;//	number	False	绔彛
+     private Integer online;//	number	False	鍦ㄧ嚎鐘舵�侊紝0绂荤嚎锛�1鍦ㄧ嚎
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AuthItemListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AuthItemListResponse.java
new file mode 100644
index 0000000..5783820
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AuthItemListResponse.java
@@ -0,0 +1,13 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AuthItemListResponse {
+
+   private Integer  total;//	number	False	鎬绘潯鏁�
+   private List<AuthItemListDetailResponse> list;//object[]	False	璁惧閫氶亾鐨勪笅杞借褰�
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/CardInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/CardInfoResponse.java
new file mode 100644
index 0000000..f1ac5aa
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/CardInfoResponse.java
@@ -0,0 +1,13 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class CardInfoResponse {
+
+
+   private String   cardNo		;//string	True	鍗″彿,8~20涓瓧绗︼紝鏀寔鏁板瓧鍜屽ぇ鍐欏瓧姣嶃�� 寤鸿鏄敱璇诲崱鍣ㄧ洿鎺ヨ鍑烘潵鐨勩�� 濡傛灉鏄笁鏂圭郴缁熷悓姝ヨ繃鏉ワ紝闇�瑕佹彁鍓嶈皟鐮斿崱鍙风殑瑙勫垯鎵�璐拱鐨勮澶囦笂鏄惁鍏煎
+   private String  personId	;//	string	True	浜哄憳ID锛屾牴鎹� 鑾峰彇浜哄憳鍒楄〃v2 鎺ュ彛鑾峰彇杩斿洖鍙傛暟personId
+   private String  orgIndexCode	;//	string	False	浜哄憳鎵�灞炵粍缁嘔ndexCode锛屼笉浼犻粯璁や娇鐢ㄦ牴缁勭粐锛�  浠庤幏鍙栫粍缁囧垪琛� 鎺ュ彛鑾峰彇杩斿洖鍙傛暟orgIndexCode
+   private Integer  cardType		;//number	False	鍗$墖绫诲瀷锛岄粯璁ゆ槸1锛欼C鍗�1锛欼C鍗�2锛欳PU鍗�3锛氳繙璺濈鍗�4锛歁鍗�
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsInfoResponse.java
new file mode 100644
index 0000000..bb1a753
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsInfoResponse.java
@@ -0,0 +1,31 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class DoorsInfoResponse {
+    
+   private String   indexCode	;//string	False	璧勬簮鍞竴缂栫爜
+private String   resourceType	;//string	False	璧勬簮绫诲瀷锛岃瑙侀檮褰旳.2 璧勬簮绫诲瀷
+private String   name;//	string	False	璧勬簮鍚嶇О
+private String   doorNo;//	string	False	闂ㄧ鐐圭紪鍙�
+private String   channelNo	;//string	False	閫氶亾鍙�
+private String   parentIndexCode	;//string	False	鐖剁骇璧勬簮缂栧彿
+private String   controlOneId	;//string	False	涓�绾ф帶鍒跺櫒id
+private String   controlTwoId;//	string	False	浜岀骇鎺у埗鍣╥d
+private String   readerInId	;//string	False	璇诲崱鍣�1
+private String   readerOutId	;//string	False	璇诲崱鍣�2
+private String   treatyType	;//string	False	鎺ュ叆鍗忚锛岃瑙侀檮褰旳.6 缂栫爜璁惧鎺ュ叆鍗忚
+private String   doorSerial	;//number	False	闂ㄥ簭鍙�
+private String   regionIndexCode;//	string	False	鎵�灞炲尯鍩�
+private String   regionPath	;//string	False	鎵�灞炲尯鍩熻矾寰�,浠绗﹀彿鍒嗗壊锛屽寘鍚湰鑺傜偣
+private String   createTime	;//string	False	鍒涘缓鏃堕棿
+private String   updateTime;//	string	False	鏇存柊鏃堕棿
+private String   description;//	string	False	鎻忚堪
+private String   channelType;//	string	False	閫氶亾绫诲瀷锛宒oor锛氶棬绂佺偣
+private String   regionName	;//string	False	鍖哄煙鍚嶇О
+private String   regionPathName	;//string	False	鎵�灞炲尯鍩熻矾寰勫悕锛岀鍙�"/"杩涜鍒嗛殧
+private String   installLocation;//	string	False	瀹夎浣嶇疆锛岃瑙侀檮褰曢檮褰旳.81 瀹夎浣嶇疆
+    
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsListResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsListResponse.java
new file mode 100644
index 0000000..39f0304
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/DoorsListResponse.java
@@ -0,0 +1,15 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DoorsListResponse {
+
+   private int total;//	number	False	鏌ヨ鏁版嵁璁板綍鎬绘暟
+   private int pageSize;//	number	False	姣忛〉璁板綍鎬绘暟
+   private int pageNo	;// number	False	褰撳墠椤电爜
+   private List<DoorsInfoResponse> list	;// object[]	False
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/FacePictureCheckResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/FacePictureCheckResponse.java
new file mode 100644
index 0000000..99c4d52
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/FacePictureCheckResponse.java
@@ -0,0 +1,29 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FacePictureCheckResponse {
+
+   private Integer  total;//	number	False	鎬绘潯鏁�
+
+   private Boolean checkResult;//	boolean	False	浜鸿劯鍥剧墖妫�娴嬬粨鏋滐紝true-璇勫垎鍚堟牸false-璇勫垎涓�           鍚堟牸
+   /**
+    * 0x1f902300-浜鸿劯妫�娴嬮敊璇紙鍥剧墖鏍煎紡涓嶇鍚堣姹傘�佹娴嬩笉鍒颁汉鑴哥瓑鎯呭喌鏃讹級
+    * 0x1f902301-浜鸿劯妫�娴嬭秴鏃�
+    * 0x1f902303-鍥剧墖涓ょ溂闂磋窛杩囧皬
+    * 0x1f902304-鍥剧墖褰╄壊缃俊搴﹁繃浣�
+    * 0x1f902305-鍥剧墖浜鸿劯瑙掑害杩囧ぇ
+    * 0x1f902306-鍥剧墖娓呮櫚搴﹁繃浣�
+    * 0x1f902307-鍥剧墖杩囨洕鎴栬繃鏆楋紙鐏伴樁鍊间笉绗﹀悎瑕佹眰锛�
+    * 0x1f902308-鍥剧墖閬尅涓ラ噸
+    * 0x1f902309-鍥剧墖鍒嗘暟杩囦綆
+    */
+   private String statusCode	;//string	False	璇勫垎澶辫触璇︾粏閿欒鐮侊紝
+   private String statusMessage;//	string	False	璇勫垎澶辫触璇︽儏鎻忚堪
+   private String faceScore	;//number	False	浜鸿劯璇勫垎锛岃寖鍥达細  1-100
+   private String facePicAnalysisResult	;//object	False	璇勫垎鎴愬姛鍚庣殑浜鸿劯 淇℃伅锛岀敤浜庝汉鑴歌鍓�
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddFailureResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddFailureResponse.java
new file mode 100644
index 0000000..8144308
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddFailureResponse.java
@@ -0,0 +1,10 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class OrgOrUserAddFailureResponse {
+    private String   clientId	;//number	False	璋冪敤鏂规寚瀹欼d
+    private String   code	;//string	False	閿欒鐮�
+    private String   msg	;//string	False	閿欒淇℃伅
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddResponse.java
new file mode 100644
index 0000000..3ed9d8d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddResponse.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OrgOrUserAddResponse {
+  private List<OrgOrUserAddSuccessResponse> successes	;//object[]	False	鎵归噺娣诲姞鎴愬姛鐨勮褰�
+  private List<OrgOrUserAddFailureResponse> failures;//	object[]	False	鎵归噺娣诲姞澶辫触鐨勮褰�
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgTimeRangeInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgTimeRangeInfoResponse.java
new file mode 100644
index 0000000..59df4d7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgTimeRangeInfoResponse.java
@@ -0,0 +1,20 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class OrgTimeRangeInfoResponse {
+
+  private String orgIndexCode;//	缁勭粐鍞竴鏍囪瘑鐮侊紙鏈�澶ч暱搴�64锛�
+    private String  organizationCode;//	string	False	缁勭粐缂栫爜
+    private String orgName;//	string	False	缁勭粐鍚嶇О锛堟渶澶ч暱搴�64锛�  褰撳墠缁勭粐鐨勫悕绉帮紝濡傞粯璁ら儴闂�
+    private String orgPath	;//string	False	缁勭粐鐩綍锛堟渶澶ч暱搴�64锛� 渚嬪锛氶粯璁ら儴闂�/缁煎悎瀹夐槻/寮�鍙戝皬缁�
+    private String  parentOrgIndexCode;//	-1鈥濅唬琛ㄦ棤鐖剁粍缁囷紝鍏跺畠浠h〃璇ヨ祫婧愮埗缁勭粐鍞竴鏍囪瘑鐮侊紝渚嬧�渞oot000000鈥�
+
+  private Integer sort	;//	number	False	鏄剧ず椤哄簭
+  private Boolean available		;//boolean	False	鐢ㄤ簬鏍囪瘑缁勭粐鑺傜偣鏄惁鏈夋潈闄愭搷浣滐紝true锛氭湁鏉冮檺锛宖alse锛氭棤鏉冮檺
+  private Boolean leaf	;//	boolean	False	鏍囪瘑缁勭粐鑺傜偣鏄惁鍙跺瓙鑺傜偣锛宼rue锛氫负鍙跺瓙缁撶偣锛宖alse锛氶潪鍙跺瓙缁撶偣
+  private String createTime		;//string	False	鍒涘缓鏃堕棿锛孖OS8601鏍煎紡锛屽弬鑰冮檮褰旴 ISO8601鏃堕棿鏍煎紡璇存槑
+  private String updateTime	;//	string	False	淇敼鏃堕棿锛孖OS8601鏍煎紡锛屽弬鑰冮檮褰旴 ISO8601鏃堕棿鏍煎紡璇存槑
+  private Integer status		;//number	False	璧勬簮鐘舵�侊紝灏忎簬0鍒欎唬琛ㄨ祫婧愬凡琚垹闄わ紝0浠h〃鏈夋晥璧勬簮
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkCrossRecordInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkCrossRecordInfoResponse.java
new file mode 100644
index 0000000..30d1ab6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkCrossRecordInfoResponse.java
@@ -0,0 +1,37 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class ParkCrossRecordInfoResponse {
+
+
+
+     private String vehicleId	;//	string	False	杞﹁締ID锛堟渶澶ч暱搴�64锛�
+         private String crossRecordSyscode;//	string	False	杩囪溅璁板綍鍞竴鏍囪瘑锛堟渶澶ч暱搴�64锛�
+                  private String parkSyscode;//	string	False	鍋滆溅搴撳敮涓�鏍囪瘑锛堟渶澶ч暱搴�64锛�
+                  private String parkName	;//string	False	鍋滆溅搴撳悕绉帮紙鏈�澶ч暱搴�64锛�
+                  private String entranceSyscode	;//string	False	鍑哄叆鍙e敮涓�鏍囪瘑锛堟渶澶ч暱搴�64锛�
+                  private String entranceName;//	string	False	鍑哄叆鍙e悕绉帮紙鏈�澶ч暱搴�64锛�
+                  private String roadwaySyscode	;//string	False	杞﹂亾鍞竴鏍囪瘑
+     private String roadwayName;//	string	False	杞﹂亾鍚嶇О
+     private Integer vehicleOut	;//number	False	鏄惁鍑哄満0-杩涘満锛�1-鍑哄満
+     private Integer releaseMode	;//number	False	鏀捐妯″紡0-绂佹鏀捐锛�1-鍥哄畾杞﹀寘鏈燂紝2-涓存椂杞﹀叆鍦猴紝3-棰勭害杞﹀叆鍦猴紝10-绂荤嚎鍑哄満锛�11-缂磋垂鍑哄満锛�12-棰勪粯璐瑰嚭鍦猴紝13-鍏嶈垂鍑哄満锛�30- 闈炴硶鍗′笉鏀捐锛�31-鎵嬪姩鏀捐锛�32-鐗规畩杞﹁締鏀捐锛�33-鑺傚亣鏃ユ斁琛岋紝35-缇ょ粍鏀捐锛�36-閬ユ帶鍣ㄥ紑闂�
+     private Integer releaseResult	;//number	False	鏀捐缁撴灉0-鏈斁琛�1-姝e父鏀捐2-绂荤嚎鏀捐
+     private Integer releaseWay;//	number	False	鏀捐鏂瑰紡10-鏈紑闂�11-鑷姩寮�闂�12-浜哄伐/浜哄伐寮�闂�13-閬ユ帶鍣ㄥ紑闂�
+     private Integer releaseReason;//	number	False	鏀捐鍘熷洜锛�100-鍥哄畾杞﹁嚜鍔ㄦ斁琛�101-涓存椂杞﹁嚜鍔ㄦ斁琛�102-棰勭害杞﹁嚜鍔ㄦ斁琛�103-涓�鎴峰杞﹁嚜鍔ㄦ斁琛�
+     private String plateNo	;//string	False	杞︾墝鍙风爜锛堟渶澶ч暱搴�16锛�
+     private String cardNo	;//string	False	鍗$墖鍙风爜锛堟渶澶ч暱搴�32锛�
+     private Integer vehicleColor;//	number	False	杞﹁締棰滆壊0锛氬叾浠栭鑹诧紱1锛氱櫧鑹诧紱2锛氶摱鑹诧紱3锛氱伆鑹诧紱4锛氶粦鑹诧紱 5锛氱孩鑹诧紱  6锛氭繁钃濊壊锛� 7锛氳摑鑹诧紱8锛氶粍鑹诧紱9锛氱豢鑹诧紱10锛氭鑹诧紱 11锛氱矇鑹诧紱 12锛氱传鑹测��
+    private Integer vehicleType	;//number	False	杞﹁締绫诲瀷0锛氬叾浠栬溅锛�1锛氬皬鍨嬭溅锛�2锛氬ぇ鍨嬭溅锛�  3锛氭懇鎵樿溅
+     private Integer plateColor	;//	number	False	杞︾墝棰滆壊0:钃濊壊,1:榛勮壊,2:鐧借壊,3:榛戣壊,4:缁胯壊,5:姘戣埅榛戣壊, 255:鍏朵粬棰滆壊
+     private Integer plateType	;//	number	False	杞︾墝绫诲瀷0:鏍囧噯姘戠敤杞�,1:02寮忔皯鐢ㄨ溅,3:璀﹁溅,4:姘戠敤杞﹀弻琛屽熬鐗岃溅,5:浣块杞�,6:鍐滅敤杞�,7:鎽╂墭杞�,8:鏂拌兘婧愯溅
+     private String carCategory;//	string	False	杞﹁締鍒嗙被
+     private String carCategoryName;//	string	False	杞﹁締鍒嗙被鍚嶇О
+     private String vehiclePicUri;//	string	False	杞﹁締鍥剧墖uri锛堟渶澶ч暱搴�256锛�
+     private String plateNoPicUri;//	string	False	杞︾墝鍥剧墖uri锛堟渶澶ч暱搴�256锛�
+     private String facePicUri;//	string	False	浜鸿劯鍥剧墖uri锛堟渶澶ч暱搴�256锛�
+      private String aswSyscode	;//string	False	鍥剧墖鏈嶅姟鍞竴鏍囪瘑锛堟渶澶ч暱搴�64锛�
+      private String crossTime	;//string	False	閫氳繃鏃堕棿ISO8601鏍煎紡锛� yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛屼緥濡傚寳浜椂闂达細 2018-07-26T15:00:00+08:00 璇﹁ISO8601鍗忚瑙i噴
+     private String createTime;//	string	False	鍒涘缓鏃堕棿  ISO8601鏍煎紡锛� yyyy-MM-ddTHH:mm:ss+褰撳墠鏃跺尯锛屼緥濡傚寳浜椂闂达細  2018-07-26T15:00:00+08:00璇﹁ISO8601鍗忚瑙i噴
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkReservationAddResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkReservationAddResponse.java
new file mode 100644
index 0000000..64fb11a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkReservationAddResponse.java
@@ -0,0 +1,9 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class ParkReservationAddResponse {
+    private String reserveOrderNo	;//string	False	棰勭害鍗曞彿
+    private String reserveTime	;//number	False	棰勭害鏈夋晥鏃堕棿锛屽崟浣嶏細鍒嗛挓
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailCardFaceResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailCardFaceResponse.java
new file mode 100644
index 0000000..3cc227f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailCardFaceResponse.java
@@ -0,0 +1,14 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TaskPersonDetailCardFaceResponse {
+
+
+    private List<TaskPersonDetailCardInfoResponse> cards;//		object[]	False	鍗$墖涓嬭浇璁板綍
+    private List<TaskPersonDetailFaceInfoResponse> faces;//		object[]	False 浜鸿劯涓嬭浇璁板綍
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailFaceInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailFaceInfoResponse.java
new file mode 100644
index 0000000..183dee5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailFaceInfoResponse.java
@@ -0,0 +1,14 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class TaskPersonDetailFaceInfoResponse {
+
+
+    private  String id;//	string	False	鍗″彿
+    private  String  operatorType;//	number	False	鎿嶄綔绫诲瀷锛�1. 涓嬭浇鏉冮檺 2. 鍒犻櫎鏉冮檺
+    private  String  errorCode;//	string	False	閿欒鐮侊紝0 鈥� 鎴愬姛锛屽叾浠�- 澶辫触锛屽弬鑰冮檮褰旹.2.3 鍑哄叆鎺у埗鏉冮檺閿欒鐮�
+    private  String errorMsg;//	string	False	閿欒鎻忚堪锛屾瘮濡傦細褰撳嚭鐜颁汉鑴搁噸澶嶏紝鎸囩汗閲嶅鏃讹紝璇ュ瓧娈佃繑鍥為噸澶嶇殑鍗″彿銆�
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailResponse.java
new file mode 100644
index 0000000..662cb59
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskPersonDetailResponse.java
@@ -0,0 +1,15 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class TaskPersonDetailResponse {
+
+
+    private String  downloadResultId;//	string	False	涓嬭浇璁板綍鍞竴ID
+    private String  personId;//	string	False	浜哄憳缂栫爜
+    private String  persondownloadResult;//	string	False	涓嬭浇璁板綍鐘舵�侊紙鍙湁鎴愬姛/澶辫触鐘舵�侊紝0:鎴愬姛,1:澶辫触锛�
+    private String  downloadTime;//	string	False	涓嬭浇鏃堕棿锛岄噰鐢↖SO8601鏃堕棿鏍煎紡锛屾渶澶ч暱搴�32涓瓧绗︼紝濡�2018-09-03T17:30:08.000+08:00
+    private TaskPersonDetailCardFaceResponse personDownloadDetail;//	object	False	涓嬭浇鐨勮缁嗘弿杩�
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressDetailResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressDetailResponse.java
new file mode 100644
index 0000000..035a441
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressDetailResponse.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class TaskProgressDetailResponse {
+   private String downloadResultId;//	string	False	涓嬭浇璁板綍鍞竴ID
+   private String  personId;//	string	False	浜哄憳缂栫爜
+   private String  persondownloadResult;//	string	False	涓嬭浇璁板綍鐘舵�侊紙鍙湁鎴愬姛/澶辫触鐘舵�侊紝0:鎴愬姛,1:澶辫触锛�
+   private String  downloadTime	;//string	False	涓嬭浇鏃堕棿锛岄噰鐢↖SO8601鏃堕棿鏍煎紡锛屾渶澶ч暱搴�32涓瓧绗︼紝濡�2018-09-
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressResponse.java
new file mode 100644
index 0000000..9c919da
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/TaskProgressResponse.java
@@ -0,0 +1,13 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TaskProgressResponse {
+
+   private Integer  total;//	number	False	鎬绘潯鏁�
+   private List<TaskProgressDetailResponse> list;//object[]	False	璁惧閫氶亾鐨勪笅杞借褰�
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserAddResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserAddResponse.java
new file mode 100644
index 0000000..d5ed5d4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserAddResponse.java
@@ -0,0 +1,11 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserAddResponse {
+  private String personId	;//string	False	鎴愬姛娣诲姞鐨勪汉鍛業d
+  private String faceId;//	string	False	鎴愬姛娣诲姞鐨勪汉鑴窱d
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserInfoResponse.java
new file mode 100644
index 0000000..dacd650
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserInfoResponse.java
@@ -0,0 +1,23 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserInfoResponse {
+
+private String personId	;//string	False	浜哄憳ID
+private String personName	;//string	False	濮撳悕
+private Integer gender	;//number	False
+private String orgIndexCode;//	string	False	鎵�灞炵粍缁囧敮涓�鏍囪瘑鐮�
+private String phoneNo;//	string	False	鑱旂郴鐢佃瘽
+private String jobNo;//	string	False	宸ュ彿
+private Integer certificateType;//	number	False	璇佷欢绫诲瀷111:韬唤璇�414:鎶ょ収113:鎴峰彛绨�335:椹鹃┒璇�131:宸ヤ綔璇�133:瀛︾敓璇�990:鍏朵粬 ;
+private String certificateNo	;//string	False	璇佷欢鍙风爜   涓�涓叉暟瀛楀瓧绗︿覆
+private String createTime	;//string	False	鍒涘缓鏃堕棿 瑕佹眰閬靛畧ISO8601鏍囧噯锛屽2018-07-26T21:30:08.000+08:00 琛ㄧず鍖椾含鏃堕棿2017骞�7鏈�26鏃�21鏃�30鍒�08绉�
+private String updateTime;//	string	False	鏇存柊鏃堕棿  瑕佹眰閬靛畧ISO8601鏍囧噯锛屽2018-07-26T21:30:08.000+08:00  琛ㄧず鍖椾含鏃堕棿2017骞�7鏈�26鏃�21鏃�30鍒�08绉�
+private String orgPath;//	string	False	鎵�灞炵粍缁囩洰褰曪紝@杩涜鍒嗗壊锛屼緥濡� @root000000@
+private String orgPathName;//	string	False	鎵�灞炵粍缁囧悕绉帮紝@杩涜鍒嗗壊锛屽@榛樿閮ㄩ棬@
+private List<UserPhotoResponse> personPhoto;//	object	False	浜哄憳鍥剧墖淇℃伅
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserTimeRangeInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserTimeRangeInfoResponse.java
new file mode 100644
index 0000000..a22d2de
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserTimeRangeInfoResponse.java
@@ -0,0 +1,57 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class UserTimeRangeInfoResponse {
+
+        private String personId	;//string	False	浜哄憳ID
+        private String personName;//	string	False	濮撳悕
+        private Integer gender;//	number	False
+        private String orgPath	;//string	False	鎵�灞炵粍缁囩洰褰曪紝浠绗﹀彿鍒嗗壊锛屽寘鍚湰缁勭粐锛屼緥濡侤root000000@
+        private String orgPathName;//	string	False	鎵�灞炵粍缁囩洰褰曞悕绉帮紝浠�/鍒嗛殧
+        private String orgIndexCode;//	string	False	鎵�灞炵粍缁囧敮涓�鏍囪瘑鐮�
+        private Integer certificateType;//	number	False	璇佷欢绫诲瀷锛屽弬鑰冮檮褰旳 鏁版嵁瀛楀吀
+        private String certificateNo;//	string	False	璇佷欢鍙风爜
+        private String jobNo;//	string	False	宸ュ彿
+        private String birthday;//	string	False	鍑虹敓鏃ユ湡锛屼緥"1990-01-01"
+        private String phoneNo;//	string	False	鑱旂郴鐢佃瘽
+        private String address;//	string	False	鑱旂郴鍦板潃
+        private String email;//	string	False	閭
+        private Integer education	;//number	False	瀛﹀巻锛岃瑙侀檮褰旳.12 瀛﹀巻绫诲瀷
+        private String lastName;//	string	False	浜哄憳濮撴皬
+        private String givenName;//	string	False	浜哄憳鍚嶇О
+        private String job;//string	False	鑱屼笟
+        private String staffProperty;//	string	False	鑱屽伐鎬ц川
+        private String company;//	string	False	宸ヤ綔鍗曚綅
+        private String employeePost;//	string	False	鑱屼綅
+        private String employeeNumber;//	string	False	鍛樺伐缂栧彿
+        private String postType;//	string	False	宀椾綅绫诲埆
+        private String identityType;//	string	False	韬唤绫诲瀷
+        private String nationality;//	string	False	鍥界睄
+        private Integer nation;//	number	False
+        private String birthplace	;//string	False	绫嶈疮
+        private String censusRegister;//	string	False	鎴风睄
+        private Integer marriaged;//	number	False	濠氬Щ鐘跺喌锛岃瑙侀檮褰旳.58 濠氬Щ鐘跺喌
+        private String politicalStatus;//	string	False	鏀挎不闈㈣矊
+        private String roomNum;//	string	False	鎴块棿鍙�
+        private String houseHolderRel;//	string	False	涓庢埛涓诲叧绯�
+        private String studentId;//	string	False	瀛﹀彿
+        private String stuStartTime;//	string	False	瀛︾敓鍏ュ鏃堕棿锛屼緥"1990-01-01"
+        private String stuEndTime;//	string	False	瀛︾敓姣曚笟鏃堕棿锛屼緥"1990-01-01"
+        private String stuGrade;//	string	False	骞寸骇
+        private String stuClass;//	string	False	鐝骇
+        private String academy	;//string	False	瀛﹂櫌
+        private String profession;//	string	False	瀛︾敓涓撲笟
+        private String dormitory;//	string	False	瀹胯垗妤�
+        private Integer lodge;//	number	False	鏄惁浣忔牎锛�1:鏄紱2:鍚�
+        private String personDesc	;//string	False	浜哄憳鎻忚堪
+        private Integer syncFlag	;//number	False	鍚屾鏍囧織绫诲瀷锛岃瑙侀檮褰旳.77 鍚屾鏍囧織绫诲瀷
+        private String pinyin	;//string	False	鎷奸煶
+        private String certIssuer	;//string	False	鍙戣瘉鏈烘瀯
+        private String certAddr	;//string	False	鍙戣瘉鍦板潃
+        private String certExpireTime;//	string	False	璇佷欢鏈夋晥鏈�
+        private Integer status	;//integer	False	鐘舵�佸皬浜�0鍒欎唬琛ㄨ祫婧愬凡琚垹闄�
+        private String createTime;//	string	False	鍒涘缓鏃堕棿锛孖OS8601鏍煎紡锛屽弬鑰冮檮褰旴 ISO8601鏃堕棿鏍煎紡璇存槑
+        private String updateTime;//	string	False	鏇存柊鏃堕棿锛孖OS8601鏍煎紡锛屽弬鑰冮檮褰旴 ISO8601鏃堕棿鏍煎紡璇存槑
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleInfoResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleInfoResponse.java
new file mode 100644
index 0000000..b6c5588
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleInfoResponse.java
@@ -0,0 +1,28 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class VehicleInfoResponse {
+
+     private String vehicleId	;//	string	False	杞﹁締ID锛堟渶澶ч暱搴�64锛�
+     private String plateNo	;//	string	False	杞︾墝鍙风爜锛堟渶澶ч暱搴�64锛�
+     private Integer isBandPerson	;//	number	False	鏄惁鍏宠仈浜哄憳
+     private String personId		;//string	False	浜哄憳ID锛堟渶澶ч暱搴�64锛�
+     private String personName	;//	string	False	浜哄憳濮撳悕
+     private Integer plateType	;//	number	False	杞︾墝绫诲瀷锛岃瑙侀檮褰旳.14 杞︾墝绫诲瀷
+     private Integer plateColor		;//number	False	杞︾墝棰滆壊锛岃瑙侀檮褰旳.15 杞︾墝棰滆壊
+     private Integer vehicleType		;//number	False	杞﹁締绫诲瀷锛岃瑙侀檮褰旳.16 杞﹁締绫诲瀷
+     private Integer vehicleColor		;//number	False	杞﹁締棰滆壊锛岃瑙侀檮褰旳.17 杞﹁締棰滆壊
+     private String description 	;//	string	False	杞﹁締鎻忚堪
+     private String regionIndexCode	;//	string	False	鎵�灞炲尯鍩�
+     private String regionName		;//string	False	鎵�灞炲尯鍩熷悕
+     private String regionPath		;//string	False	鎵�灞炲尯鍩熻矾寰勶紝@鍒嗛殧
+     private String regionPathName		;//string	False	鎵�灞炲尯鍩熻矾寰勫悕锛�/鍒嗛殧
+     private String orgPath	;//	string	False	鎵�灞炵粍缁囩洰褰曪紝@鍒嗛殧
+     private String orgPathName	;//	string	False	鎵�灞炲尯鍩熻矾寰勫悕锛�/鍒嗛殧
+     private String createTime	;//	string	False	鍒涘缓鏃堕棿 2019-12-11T11:30:51.502+08:00
+     private String updateTime	;//	string	False	淇敼鏃堕棿 2019-12-11T11:30:51.502+08:00
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/sdk/HIKCSDemo.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/sdk/HIKCSDemo.java
new file mode 100644
index 0000000..f270213
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/sdk/HIKCSDemo.java
@@ -0,0 +1,151 @@
+package com.doumee.core.haikang.sdk;
+
+import com.sun.jna.Pointer;
+
+public class HIKCSDemo {
+	
+	static HCUsbSDK hCUsbSDK = HCUsbSDK.INSTANCE;
+	static int iHandle = -1;
+	
+	
+	
+	public static void main(String[] args) throws InterruptedException{
+		HIKCSDemo csdemo = new HIKCSDemo();		
+		hCUsbSDK.USB_Init();
+		hCUsbSDK.USB_SetLogToFile(3, ".\\", false);
+		System.out.println(System.getProperty("user.dir"));
+		csdemo.getVersion(); //鑾峰彇鐗堟湰
+		
+		csdemo.EnumDevices();	//鏋氫妇璁惧
+		csdemo.Login();
+		csdemo.ActivateCard();
+
+		while(true);
+	}
+	
+	
+	public void getVersion(){
+		int iVersion = hCUsbSDK.USB_GetSDKVersion();
+		
+		String v1 = Integer.toString((iVersion>>24) & 0xff);
+		String v2 = Integer.toString((iVersion>>16) & 0xff);
+		String v3 = Integer.toString((iVersion>>8) & 0xff);
+		String v4 = Integer.toString((iVersion) & 0xff);		
+		System.out.println("USB_GetSDKVersion succeed, version:" + v1 + "." + v2 + "." + v3 + "." + v4);		
+	}
+	
+	public void EnumDevices(){
+		int iNum = hCUsbSDK.USB_GetDeviceCount();
+		System.out.println("iNum:" + iNum);
+		if(iNum < 1){
+			System.out.println("鏃犺澶囨帴鍏�");
+			return ;
+		}
+		
+		//鏍规嵁鑾峰彇鍒扮殑璁惧鏁伴噺锛岀敵璇峰搴斿ぇ灏忕殑璁惧淇℃伅缁撴瀯浣撴暟缁�
+    	//瀵圭粨鏋勪綋鏁扮粍涓殑姣忎釜鎴愬憳杩涜鍒濆鍖�
+    	HCUsbSDK.OUT_USB_DEVICE_INFO  struOutDevice = new HCUsbSDK.OUT_USB_DEVICE_INFO();
+    	struOutDevice.init(iNum);
+    	struOutDevice.write();
+
+    	Pointer pStruDeviceInfo = struOutDevice.getPointer();
+    	if(hCUsbSDK.USB_EnumDevices(iNum, pStruDeviceInfo))
+    	{
+    		struOutDevice.read();
+    		while((--iNum) >= 0)
+    		{
+    			String s1, s2, s3, s4, s5, s6;
+        		s1 = String.valueOf(struOutDevice.struDeviceArr[iNum].dwIndex);
+        		s2 = String.valueOf(struOutDevice.struDeviceArr[iNum].dwVID);
+        		s3 = String.valueOf(struOutDevice.struDeviceArr[iNum].dwPID);
+        		s4 = new String(struOutDevice.struDeviceArr[iNum].szManufacturer).trim();
+        		s5 = new String(struOutDevice.struDeviceArr[iNum].szDeviceName).trim();
+        		s6 = new String(struOutDevice.struDeviceArr[iNum].szSerialNumber).trim();
+        		System.out.println("device:" + s1 + ",dwVID:" +s2 + ",dwPID:" + s3 + ",szManufacturer:" + s4 + ",szDeviceName:" +s5 + ",szSerialNumber:" + s6);
+    		}
+    		System.out.println("USB_EnumDevices succeed");
+    	}
+    	else
+    	{
+    		System.out.println("USB_EnumDevices failed, error:" + hCUsbSDK.USB_GetLastError());
+		}
+	}
+	
+	public void Login(){
+		HCUsbSDK.USB_DEVICE_REG_RES struDeviceReg = new HCUsbSDK.USB_DEVICE_REG_RES();
+		struDeviceReg.dwSize = struDeviceReg.size();
+		struDeviceReg.write();
+		
+		HCUsbSDK.USB_USER_LOGIN_INFO struUserLoginInfo = new HCUsbSDK.USB_USER_LOGIN_INFO();
+		struUserLoginInfo.dwSize = struUserLoginInfo.size();
+		struUserLoginInfo.dwTimeout = 5000;
+		struUserLoginInfo.dwDevIndex = 1; 
+		struUserLoginInfo.dwVID = 1155;
+		struUserLoginInfo.dwPID = 22352;	
+		System.arraycopy("813717552".getBytes(), 0, struUserLoginInfo.szSerialNumber, 0, "813717552".length());
+		System.arraycopy("admin".getBytes(), 0, struUserLoginInfo.szUserName, 0, "admin".length());
+		System.arraycopy("12345".getBytes(), 0, struUserLoginInfo.szPassword, 0, "12345".length());
+		
+		struUserLoginInfo.write();
+		
+		iHandle = hCUsbSDK.USB_Login(struUserLoginInfo, struDeviceReg);
+		System.out.println("iHandle:" + iHandle);
+		if(iHandle < 0){
+			System.out.println("USB_Login failed, error:" + hCUsbSDK.USB_GetLastError());
+		}
+		else{
+			System.out.println("USB_Login succeed, lHandle:" + iHandle);
+		}
+	}
+	
+	
+	public void ActivateCard(){
+		HCUsbSDK.USB_WAIT_SECOND StruWaitSecond = new HCUsbSDK.USB_WAIT_SECOND();
+		StruWaitSecond.dwSize = StruWaitSecond.size();
+		StruWaitSecond.byWait = 5;
+		
+		HCUsbSDK.USB_ACTIVATE_CARD_RES StruActivateRes = new HCUsbSDK.USB_ACTIVATE_CARD_RES();
+		StruActivateRes.dwSize = StruActivateRes.size();
+		
+		HCUsbSDK.USB_CONFIG_INPUT_INFO StruInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();
+		StruInput.dwInBufferSize = StruWaitSecond.size();
+		Pointer ptrwaitSecond = StruWaitSecond.getPointer();
+		StruWaitSecond.write();
+		StruInput.lpInBuffer = ptrwaitSecond;
+		
+		HCUsbSDK.USB_CONFIG_OUTPUT_INFO StruOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();
+		StruOutput.dwOutBufferSize = StruActivateRes.size();
+		Pointer ptrActivateRes = StruActivateRes.getPointer();
+		StruActivateRes.write();
+		StruOutput.lpOutBuffer = ptrActivateRes;
+		
+		if(!hCUsbSDK.USB_GetDeviceConfig(iHandle, HCUsbSDK.USB_GET_ACTIVATE_CARD, StruInput, StruOutput))
+		{
+			System.out.println("USB_GET_ACTIVATE_CARD failed, error:" + hCUsbSDK.USB_GetLastError());
+		}
+		else{
+			StruActivateRes.read();
+			System.out.println("byCardType:" + StruActivateRes.byCardType + ",bySerialLen:" + StruActivateRes.bySerialLen);
+			
+			System.out.println("USB_GET_ACTIVATE_CARD succeed");	
+			
+			String SerialNumber = "";
+			//杩斿洖鐨刡ySerial鏁扮粍闇�瑕佸弽搴忎箣鍚庯紝灏嗗崄鍏繘鍒惰浆鎹㈡垚鍗佽繘鍒跺氨鏄崱鍙�
+			for(int i = 0; i < StruActivateRes.bySerialLen; i++)
+			{
+				String hex = Integer.toHexString(StruActivateRes.bySerial[StruActivateRes.bySerialLen-i-1] & 0xff); 
+				if(hex.length() == 1)
+				{
+					hex += '0';
+				}
+				SerialNumber += hex.toUpperCase();
+			}
+			System.out.println("SerialNumber:0x" + SerialNumber);
+			System.out.println("cardNo:" + Long.parseLong(SerialNumber,  16));
+			
+		}
+		
+	}
+	
+//class 缁撴潫	
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
new file mode 100644
index 0000000..b61accf
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -0,0 +1,1029 @@
+package com.doumee.core.haikang.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.HKTools;
+import com.doumee.core.haikang.model.param.BaseListPageResponse;
+import com.doumee.core.haikang.model.param.BaseRequst;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.*;
+import com.doumee.core.haikang.model.param.respose.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InputStream;
+import java.util.List;
+
+@Slf4j
+public class HKService {
+    private Logger logger = LoggerFactory.getLogger(HKService.class);
+    /**
+     * 鑾峰彇鏍圭粍缁囨暟鎹�
+     * @return
+     */
+    public  static  BaseResponse<OrgInfoResponse>  getRootOrg(BaseRequst param){
+        log.info("銆愭捣搴疯幏鍙栨牴缁勭粐銆�================寮�濮�====");
+        try {
+            String res = HKTools.getRootOrg ();
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<OrgInfoResponse>>(){};
+            BaseResponse<OrgInfoResponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鑾峰彇鏍圭粍缁�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯幏鍙栨牴缁勭粐銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     * 淇敼缁勭粐鏁版嵁
+     * @return
+     */
+    public  static  BaseResponse editOrg(OrgEditRequest param){
+        log.info("銆愭捣搴蜂慨鏀圭粍缁囥��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+
+            String res = HKTools.editOrg(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍淇敼缁勭粐");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂慨鏀圭粍缁囥��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鎵归噺鏂板缁勭粐鏁版嵁
+     * @return
+     */
+    public  static  BaseResponse<OrgOrUserAddResponse>  addBatchOrg(List<OrgAddRequest> param){
+        log.info("銆愭捣搴锋柊澧炵粍缁囥��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.addBatchOrg(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<OrgOrUserAddResponse>>(){};
+            BaseResponse<OrgOrUserAddResponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鏂板缁勭粐");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋柊澧炵粍缁囥��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鎵归噺鍒犻櫎缁勭粐鏁版嵁
+     * @return
+     */
+    public  static  BaseResponse<List<OrgUpdateFailureResponse>>   delBatchOrg(OrgDelRequest param){
+        log.info("銆愭捣搴峰垹闄ょ粍缁囥��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+
+            String res = HKTools.delOrg(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse<List<OrgUpdateFailureResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍒犻櫎缁勭粐");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰垹闄ょ粍缁囥��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鏂板浜哄憳淇℃伅锛堟敮鎸佷汉鑴告暟鎹級
+     * @return
+     */
+    public  static  BaseResponse<UserAddResponse>  addUser(UserAddRequest param){
+        log.info("銆愭捣搴锋柊澧炰汉鍛樸��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.addUser(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<UserAddResponse>>(){};
+            BaseResponse<UserAddResponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鏂板浜哄憳");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋柊澧炰汉鍛樸��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *淇敼浜哄憳淇℃伅锛堜笉鏀寔浜鸿劯鏁版嵁锛�
+     * @return
+     */
+    public  static  BaseResponse editUser(UserAddRequest param){
+        log.info("銆愭捣搴蜂慨鏀逛汉鍛樸��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.editUser(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<UserAddResponse>>(){};
+            BaseResponse<UserAddResponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍淇敼浜哄憳");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂慨鏀逛汉鍛樸��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鎵归噺鏂板浜哄憳淇℃伅(鏃犱汉鑴革級
+     * @return
+     */
+    public  static  BaseResponse<OrgOrUserAddResponse>  addBatchUser(List<UserAddRequest> param){
+        log.info("銆愭捣搴锋壒閲忔柊澧炰汉鍛樸��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.addBatchUser(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<OrgOrUserAddResponse>>(){};
+            BaseResponse<OrgOrUserAddResponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鎵归噺鏂板浜哄憳");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋壒閲忔柊澧炰汉鍛樸��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鎵归噺鍒犻櫎浜哄憳淇℃伅
+     * @return
+     */
+    public  static  BaseResponse<List<UserDelResponse>>  delBatchUser(UserDelRequest param){
+        log.info("銆愭捣搴锋壒閲忓垹闄や汉鍛樸��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.delBatchUser(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<List<UserDelResponse>>>(){};
+            BaseResponse<List<UserDelResponse >> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鎵归噺鍒犻櫎浜哄憳");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋壒閲忓垹闄や汉鍛樸��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *娣诲姞浜鸿劯淇℃伅
+     * @return
+     */
+    public  static  BaseResponse<FaceAddOrEditesponse>  addFace( FaceAddRequest  param){
+        log.info("銆愭捣搴锋坊鍔犱汉鑴镐俊鎭��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.addFace(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<FaceAddOrEditesponse>>(){};
+            BaseResponse<FaceAddOrEditesponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍娣诲姞浜鸿劯淇℃伅");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋坊鍔犱汉鑴镐俊鎭��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *缂栬緫浜鸿劯淇℃伅
+     * @return
+     */
+    public  static  BaseResponse<FaceAddOrEditesponse>  editFace( FaceEditRequest  param){
+        log.info("銆愭捣搴风紪杈戜汉鑴镐俊鎭��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.editFace(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<FaceAddOrEditesponse>>(){};
+            BaseResponse<FaceAddOrEditesponse> result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍缂栬緫浜鸿劯淇℃伅");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴风紪杈戜汉鑴镐俊鎭��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍒犻櫎浜鸿劯淇℃伅
+     * @return
+     */
+    public  static  BaseResponse   delFace(List<FaceEditRequest> param){
+        log.info("銆愭捣搴峰垹闄や汉鑴镐俊鎭��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.delFace(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍒犻櫎浜鸿劯淇℃伅");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰垹闄や汉鑴镐俊鎭��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     * 鑾峰彇娴峰悍浜鸿劯璁块棶鍦板潃
+     * @return
+     */
+    public static InputStream getFaceInputStream(FacePictureRequest param) {
+        log.info("銆愭捣搴蜂汉鑴歌闂浘鐗囨祦銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            InputStream res = HKTools.getFaceInputStream(JSONObject.toJSONString(param));
+            log.error("銆愭捣搴蜂汉鑴歌闂浘鐗囨祦銆�================鎴愬姛====\n");
+            return  res;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂汉鑴歌闂浘鐗囨祦銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     * 鑾峰彇璁垮璁板綍涓殑鍥剧墖
+     * @return
+     */
+    public static InputStream getVisitPicture(VisitPictureRequest param) {
+        log.info("銆愭捣搴疯瀹㈠浘鐗囨祦銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            InputStream res = HKTools.getVisitPicture(JSONObject.toJSONString(param));
+            log.error("銆愭捣搴疯瀹㈠浘鐗囨祦銆�================鎴愬姛====\n");
+            return  res;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈠浘鐗囨祦銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     * 鑾峰彇闂ㄧ浜嬩欢鐨勫浘鐗�
+     * @return
+     */
+    public static InputStream getDevicePicture(DevicePictureRequest param) {
+        log.info("銆愭捣搴烽棬绂佷簨浠跺浘鐗囨祦銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            InputStream res = HKTools.getDevicePicture(JSONObject.toJSONString(param));
+            log.error("銆愭捣搴烽棬绂佷簨浠跺浘鐗囨祦銆�================鎴愬姛====\n");
+            return  res;
+        }catch (Exception e){
+            log.error("銆愭捣搴烽棬绂佷簨浠跺浘鐗囨祦銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     * 鏌ヨ杞﹁締鎶撴媿鍥剧墖
+     * @return
+     */
+    public static InputStream getCarPicture(CarPictureRequest param) {
+        log.info("銆愭捣搴疯溅杈嗘姄鎷嶅浘鐗囧浘鐗囨祦銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            InputStream res = HKTools.getCarPicture(JSONObject.toJSONString(param));
+            log.error("銆愭捣搴疯溅杈嗘姄鎷嶅浘鐗囧浘鐗囨祦銆�================鎴愬姛====\n");
+            return  res;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯溅杈嗘姄鎷嶅浘鐗囧浘鐗囨祦銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+
+    /**
+     *鑾峰彇杞﹀簱鍒楄〃鏁版嵁锛堝叏閲忥級
+     * @return
+     */
+    public  static  BaseResponse<List<ParkListResponse>>   parkList(ParkListRequest param){
+        log.info("銆愭捣搴疯幏鍙栬溅搴撳垪琛ㄦ暟鎹��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.parkList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<List<ParkListResponse>>>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鑾峰彇杞﹀簱鍒楄〃鏁版嵁");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯幏鍙栬溅搴撳垪琛ㄦ暟鎹��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鑾峰彇杞﹀簱鍒楄〃鏁版嵁锛堝叏閲忥級
+     * @return
+     */
+    public  static  BaseResponse<List<EntranceListResponse>>   entranceList(EntranceListRequest param){
+        log.info("銆愭捣鑾峰彇杞﹀簱鍒楄〃鏁版嵁銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.entranceList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<List<EntranceListResponse>>>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鑾峰彇杞﹀簱鍒楄〃鏁版嵁");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯幏鍙栬溅搴撳垪琛ㄦ暟鎹��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍥哄畾杞﹁締鍏呭�硷紙鍖呮湡锛�
+     * @return
+     */
+    public  static  BaseResponse   carChargeAddtion(CarChargeAddRequest param){
+        log.info("銆愭捣搴峰浐瀹氳溅杈嗗厖鍊笺��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.carChargeAddtion(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍥哄畾杞﹁締鍏呭��");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰浐瀹氳溅杈嗗厖鍊笺��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍥哄畾杞﹁締鍙栨秷鍖呮湡
+     * @return
+     */
+    public  static  BaseResponse   carChargeDeletion(CarChargeDelRequest param){
+        log.info("銆愭捣搴峰浐瀹氳溅杈嗗彇娑堝寘鏈熴��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.carChargeDeletion(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍥哄畾杞﹁締鍙栨秷鍖呮湡");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰浐瀹氳溅杈嗗彇娑堝寘鏈熴��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *杞︿綅棰勭害
+     * @return
+     */
+    public  static  BaseResponse<ParkReservationAddResponse>   parkReservationAddition(ParkReservationAddRequest param){
+        log.info("銆愭捣搴疯溅浣嶉绾︺��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.parkAddition(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<ParkReservationAddResponse>>(){};
+            BaseResponse<ParkReservationAddResponse>  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍杞︿綅棰勭害");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯溅浣嶉绾︺��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *杞︿綅鍙栨秷棰勭害
+     * @return
+     */
+    public  static  BaseResponse   parkReservationDeletion(ParkReservationDelRequest param){
+        log.info("銆愭捣搴疯溅浣嶅彇娑堥绾︺��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.carChargeDeletion(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍杞︿綅鍙栨秷棰勭害");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯溅浣嶅彇娑堥绾︺��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *璁垮棰勭害
+     * @return
+     */
+    public  static  BaseResponse<VisitAppointmentResponse>   visitAppiontment(VisitAppointmentRequest param){
+        log.info("銆愭捣搴疯瀹㈤绾︺��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.visitAppiontment(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<VisitAppointmentResponse>>(){};
+            BaseResponse<VisitAppointmentResponse>  result = JSONObject.parseObject(res, typeReference.getType());
+           logResult(result,"娴峰悍璁垮棰勭害");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈤绾︺��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *璁垮棰勭害鍙栨秷
+     * @return
+     */
+    public  static  BaseResponse   cancelVisitAppiontment(VisitAppointmentCancelRequest param){
+        log.info("銆愭捣搴疯瀹㈤绾﹀彇娑堛��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.visitCancel(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+           logResult(result,"娴峰悍璁垮棰勭害鍙栨秷");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈤绾﹀彇娑堛��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *璁垮棰勭害绛剧
+     * @return
+     */
+    public  static  BaseResponse  outVisitAppiontment(VisitAppointmentOutRequest param){
+        log.info("銆愭捣搴疯瀹㈤绾︾绂汇��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.visitOut(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse>(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+           logResult(result,"娴峰悍璁垮棰勭害绛剧");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈤绾︾绂汇��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *璁垮鍏嶇櫥璁伴绾�
+     * @return
+     */
+    public  static  BaseResponse<VisitAppointmentMDJResponse>   visitAppiontmentMDJ(VisitAppointmentMDJRequest param){
+        log.info("銆愭捣搴疯瀹㈠厤鐧昏棰勭害銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.visitAppiontmentMDJ(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<VisitAppointmentMDJResponse> >(){};
+            BaseResponse<VisitAppointmentMDJResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍璁垮鍏嶇櫥璁伴绾�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈠厤鐧昏棰勭害銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *璁垮鏉冮檺缁勫垪琛ㄦ煡璇紙鍒嗛〉锛�
+     * @return
+     */
+    public  static  BaseResponse<PrivilegeGroupListResponse>   privilegeGroup(PrivilegeGroupRequest param){
+        log.info("銆愭捣搴疯瀹㈡潈闄愮粍鍒楄〃鏌ヨ銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.privilegeGroup(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<PrivilegeGroupListResponse> >(){};
+            BaseResponse<PrivilegeGroupListResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍璁垮鏉冮檺缁勫垪琛ㄦ煡璇�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈡潈闄愮粍鍒楄〃鏌ヨ銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍闂ㄧ鐐规煡璇紙鍒嗛〉锛�
+     * @return
+     */
+    public  static  BaseResponse<DoorsListResponse>   doorSearch(DoorsListRequest param){
+        log.info("銆愭捣搴烽棬绂佺偣鏌ヨ銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.doorSearch(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<DoorsListResponse> >(){};
+            BaseResponse<DoorsListResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍闂ㄧ鐐规煡璇�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴烽棬绂佺偣鏌ヨ銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *闂ㄧ璁惧鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<AcsDeviceListResponse>   acsDeviceList(AcsDeviceListRequest param){
+        log.info("銆愭捣搴烽棬绂佽澶囨煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.acsDeviceList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<AcsDeviceListResponse> >(){};
+            BaseResponse<AcsDeviceListResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍闂ㄧ璁惧鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴烽棬绂佽澶囨煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *浜嬩欢璁㈤槄
+     * @return
+     */
+    public  static  BaseResponse   eventSub(EventSubRequest param){
+        log.info("銆愭捣搴蜂簨浠惰闃呫��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.eventSub(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍浜嬩欢璁㈤槄");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂簨浠惰闃呫��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *浜嬩欢璁㈤槄
+     * @return
+     */
+    public  static  BaseResponse   cancelEventSub(EventSubRequest param){
+        log.info("銆愭捣搴峰彇娑堜簨浠惰闃呫��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.cancelEventSub(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍙栨秷浜嬩欢璁㈤槄");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰彇娑堜簨浠惰闃呫��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍鍒涘缓涓�鍗¢�氫笅杞戒换鍔�
+     * @return
+     */
+    public  static  BaseResponse<TaskAdditionResponse>   taskAddition(TaskAdditionRequest param){
+        log.info("銆愭捣搴峰垱寤轰竴鍗¢�氫笅杞戒换鍔°��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.taskAddition(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<TaskAdditionResponse>>(){};
+            BaseResponse<TaskAdditionResponse>      result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍒涘缓涓�鍗¢�氫笅杞戒换鍔�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰垱寤轰竴鍗¢�氫笅杞戒换鍔°��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍涓�鍗¢�氫换鍔℃坊鍔犳暟鎹�
+     * @return
+     */
+    public  static  BaseResponse    taskDataAddition(TaskDataAdditionRequest param){
+        log.info("銆愭捣搴蜂竴鍗¢�氫换鍔℃坊鍔犳暟鎹��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.taskDataAddition(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍涓�鍗¢�氫换鍔℃坊鍔犳暟鎹�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂竴鍗¢�氫换鍔℃坊鍔犳暟鎹��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍涓�鍗¢�氫换鍔¤繘搴︽煡璇�
+     * @return
+     */
+    public  static  BaseResponse<TaskProgressNumResponse>    taskProgressNum(TaskProgressRequest param){
+        log.info("銆愭捣搴蜂竴鍗¢�氫换鍔¤繘搴︽煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.taskProgressNum(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<TaskProgressNumResponse> >(){};
+            BaseResponse<TaskProgressNumResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍涓�鍗¢�氫换鍔¤繘搴︽煡璇�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂竴鍗¢�氫换鍔¤繘搴︽煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍涓�鍗¢�氳澶囬�氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟v2
+     * @return
+     */
+    public  static  BaseResponse<TaskProgressResponse>    taskProgress(TaskProgressRequest param){
+        log.info("銆愭捣搴蜂竴鍗¢�氳澶囬�氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.taskProgress(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<TaskProgressResponse> >(){};
+            BaseResponse<TaskProgressResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍涓�鍗¢�氳澶囬�氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂竴鍗¢�氳澶囬�氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呮�绘暟銆�================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍鏌ヨ鏉冮檺鏉$洰鍒楄〃
+     * @return
+     */
+    public  static  BaseResponse<AuthItemListResponse>    authItemList(AuthItemListRequest param){
+        log.info("銆愭捣搴锋煡璇㈡潈闄愭潯鐩垪琛ㄣ��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.authItemList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<AuthItemListResponse> >(){};
+            BaseResponse<AuthItemListResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鏌ヨ鏉冮檺鏉$洰鍒楄〃");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋煡璇㈡潈闄愭潯鐩垪琛ㄣ��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍涓�鍗¢�氫换鍔″紑濮嬫墽琛�
+     * @return
+     */
+    public  static  BaseResponse     taskStart(TaskProgressRequest param){
+        log.info("銆愭捣搴蜂竴鍗¢�氫换鍔″紑濮嬫墽琛屻��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.taskStart(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍涓�鍗¢�氫换鍔″紑濮嬫墽琛�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴蜂竴鍗¢�氫换鍔″紑濮嬫墽琛屻��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+           // saveInterfaceLog(param,res);
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍鎵归噺寮�鍗�
+     * @return
+     */
+    public  static  BaseResponse<List<CardInfoResponse>>     cardBingding(CardBingdingRequest param){
+        log.info("銆愭捣搴锋壒閲忓紑鍗°��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.cardBingding(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse <List<CardInfoResponse>>  >(){};
+            BaseResponse<List<CardInfoResponse>>    result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鎵归噺寮�鍗�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋壒閲忓紑鍗°��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍閫�鍗�
+     * @return
+     */
+    public  static  BaseResponse    cardDeletion(CardDeletionRequest param){
+        log.info("銆愭捣搴烽��鍗°��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.cardDeletion(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍閫�鍗�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴烽��鍗°��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍鎵归噺鎸傚け
+     * @return
+     */
+    public  static  BaseResponse    cardLoss(CardLossRequest param){
+        log.info("銆愭捣搴锋壒閲忔寕澶便��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.cardLoss(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse     result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鎵归噺鎸傚け");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋壒閲忔寕澶便��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍鎵归噺瑙f寕
+     * @return
+     */
+    public  static  BaseResponse    cardUnLoss(CardLossRequest param){
+        log.info("銆愭捣搴锋壒閲忚В鎸傘��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.cardUnloss(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse >(){};
+            BaseResponse     result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鎵归噺瑙f寕");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋壒閲忚В鎸傘��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+        }
+        return  null;
+    }
+    /**
+     *娴峰悍鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯�
+     * @return
+     */
+    public  static  BaseResponse<TaskPersonDetailListResponse>  taskPersoDetail(TaskPersonDetailRequest param){
+        log.info("銆愭捣搴锋煡璇㈣澶囬�氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呫��================寮�濮�===="+JSONObject.toJSONString(param));
+        String res = null;
+        try {
+            res = HKTools.taskPersoDetail(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse <TaskPersonDetailListResponse>>(){};
+            BaseResponse<TaskPersonDetailListResponse>    result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鏌ヨ璁惧閫氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋煡璇㈣澶囬�氶亾鐨勪汉鍛樻潈闄愪笅杞借鎯呫��================澶辫触====锛歕n"+ e.getMessage());
+        }finally {
+        }
+        return  null;
+    }
+    /**
+     *鏌ヨ璁垮棰勭害璁板綍锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<AppointmentInfoResponse>>   appointmentRecords(AppointmentListRequest param){
+        log.info("銆愭捣搴疯瀹㈤绾﹁褰曟煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.appointmentRecords(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference<BaseResponse<BaseListPageResponse<AppointmentInfoResponse>>>(){};
+            BaseResponse<BaseListPageResponse<AppointmentInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍璁垮棰勭害璁板綍鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈤绾﹁褰曟煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鏌ヨ璁垮鏉ヨ璁板綍锛堝凡鐧昏锛夛紙鍒嗛〉锛�
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<VisitingInfoResponse>>   visitingRecords(VisitingInfoRequest param){
+        log.info("銆愭捣搴疯瀹㈡潵璁胯褰曟煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.visitingRecords(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference<BaseResponse<BaseListPageResponse<VisitingInfoResponse>>>(){};
+            BaseResponse<BaseListPageResponse<VisitingInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍璁垮鏉ヨ璁板綍鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈡潵璁胯褰曟煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍏ㄩ噺缁勭粐鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<OrgInfoResponse>>   orgAllList(TimeRangeListRequest param){
+        log.info("銆愭捣搴峰叏閲忕粍缁囨煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.orgAllList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<OrgInfoResponse>>> (){};
+            BaseResponse<BaseListPageResponse<OrgInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍏ㄩ噺缁勭粐鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰叏閲忕粍缁囨煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *澧為噺缁勭粐鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<OrgTimeRangeInfoResponse>>   orgTimeRangeList(TimeRangeListRequest param){
+        log.info("銆愭捣搴峰閲忕粍缁囨煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.orgTimeRangeList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<OrgTimeRangeInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<OrgTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍澧為噺缁勭粐鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰閲忕粍缁囨煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍏ㄩ噺浜哄憳鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<UserInfoResponse>>   userAllList(TimeRangeListRequest param){
+        log.info("銆愭捣搴峰叏閲忎汉鍛樻煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.userAllList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<UserInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<UserInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍏ㄩ噺浜哄憳鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰叏閲忎汉鍛樻煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍏ㄩ噺浜哄憳鏌ヨ2锛堟牴鎹潯浠舵煡璇㈠垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<UserInfoResponse>>   personList(UserByParamListRequest param){
+        log.info("銆愭捣搴锋牴鎹潯浠舵煡璇汉鍛樺垪琛ㄣ��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.personList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<UserInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<UserInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鏍规嵁鏉′欢鏌ヨ浜哄憳鍒楄〃");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋牴鎹潯浠舵煡璇汉鍛樺垪琛ㄣ��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *澧為噺浜哄憳鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<UserTimeRangeInfoResponse>>   userTimeRangeList(TimeRangeListRequest param){
+        log.info("銆愭捣搴峰閲忎汉鍛樻煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.userTimeRangeList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<UserTimeRangeInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<UserTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍澧為噺浜哄憳鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰閲忎汉鍛樻煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鍏ㄩ噺杞﹁締鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<VehicleInfoResponse>>   vehicleList(TimeRangeListRequest param){
+        log.info("銆愭捣搴峰叏閲忎汉鍛樻煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.vehicleList(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<VehicleInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<VehicleInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鍏ㄩ噺浜哄憳鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰叏閲忎汉鍛樻煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *杩囪溅璁板綍鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>>   parkCrossRecords(ParkCrossRecordListRequest param){
+        log.info("銆愭捣搴疯繃杞﹁褰曟煡璇㈡煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.parkCrossRecords(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍杩囪溅璁板綍鏌ヨ鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯繃杞﹁褰曟煡璇㈡煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *澧為噺杞﹁締鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   vehicleTimeRangeList(TimeRangeListRequest 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,"娴峰悍澧為噺浜哄憳鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰閲忎汉鍛樻煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *澧為噺杞﹁締鏌ヨ锛堝垎椤碉級
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   facePictureCheck(TimeRangeListRequest param){
+        log.info("銆愭捣搴峰閲忎汉鍛樻煡璇€��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.facePictureCheck(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍澧為噺浜哄憳鏌ヨ");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴峰閲忎汉鍛樻煡璇€��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鑾峰彇闂ㄧ璁惧鍦ㄧ嚎鐘舵�侊紙鍒嗛〉锛�
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<AscDeviceStatusInfoResponse>>   acsDeviceStatus(AcsDeviceStatusListRequest param){
+        log.info("銆愭捣搴疯幏鍙栭棬绂佽澶囧湪绾跨姸鎬併��================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.acsDeviceStatus(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<AscDeviceStatusInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<AscDeviceStatusInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鑾峰彇闂ㄧ璁惧鍦ㄧ嚎鐘舵��");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯幏鍙栭棬绂佽澶囧湪绾跨姸鎬併��================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
+     *鏌ヨ鍦哄唴杞﹀仠杞︿俊鎭紙鍒嗛〉锛�
+     * @return
+     */
+    public  static  BaseResponse<BaseListPageResponse<TempCarInRecordInfoResponse>>   tempCarInRecords(TempCarInRecordListRequest param){
+        log.info("銆愭捣搴锋煡璇㈠満鍐呰溅鍋滆溅淇℃伅銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.tempCarInRecords(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<BaseListPageResponse<TempCarInRecordInfoResponse>> >(){};
+            BaseResponse<BaseListPageResponse<TempCarInRecordInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍鏌ヨ鍦哄唴杞﹀仠杞︿俊鎭�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴锋煡璇㈠満鍐呰溅鍋滆溅淇℃伅銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    private static void logResult(BaseResponse res,String name) {
+        if(StringUtils.equals(res.getCode(),HKConstants.RESPONSE_SUCCEE)){
+            log.info("銆�"+name+"銆�================鎴愬姛====\n"+res);
+        }else{
+            log.error("銆�"+name+"銆�================澶辫触====锛歕n"+ res);
+        }
+    }
+
+}
+
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/TemplateData.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/TemplateData.java
new file mode 100644
index 0000000..aad9cf6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/TemplateData.java
@@ -0,0 +1,19 @@
+package com.doumee.core.wx;
+
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2022/12/7 17:28
+ */
+@Data
+public class TemplateData {
+    private String value;
+
+    public TemplateData(String value) {
+        this.value = value;
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WXConstant.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WXConstant.java
new file mode 100644
index 0000000..d2e0d23
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WXConstant.java
@@ -0,0 +1,19 @@
+package com.doumee.core.wx;
+
+/**
+ * 鍏紬鍙锋帴鍙e湴鍧�绫�
+ *
+ * @Author : Rk
+ * @create 2023/12/7 10:42
+ */
+public class WXConstant {
+
+    //鑾峰彇鍏紬鍙� access_token
+    public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
+
+    //鑾峰彇鐢ㄦ埛淇℃伅
+    public static final String GET_USER_INFO_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WxMiniUtilService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
new file mode 100644
index 0000000..8dca404
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
@@ -0,0 +1,53 @@
+package com.doumee.core.wx;
+
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.ID;
+//import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
+//import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+//import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
+//import com.github.binarywang.wxpay.exception.WxPayException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+
+/**
+ * 寰俊灏忕▼搴�-鍏叡鏂规硶
+ */
+@Service
+@Slf4j
+public class WxMiniUtilService {
+
+//
+//    /**
+//     * 璁㈠崟寰俊閫�娆�
+//     * orderNo:鍟嗘埛璁㈠崟鍙�
+//     * totalPrice锛氳鍗曟�婚噾棰�
+//     * refundPrice锛涢��娆鹃噾棰�
+//     */
+//    @Transactional(rollbackFor = Exception.class)
+//    public static String wxRefund(String orderNo, BigDecimal totalPrice, BigDecimal refundPrice) {
+//        try {
+//            // 鍙戦�侀��娆捐姹�
+//            String refNum = ID.nextGUID();
+//            WxPayRefundRequest request = new WxPayRefundRequest();
+//            request.setOutTradeNo(orderNo);
+//            request.setOutRefundNo(refNum);
+//           // request.setTotalFee(2);
+//          //  request.setRefundFee(1);
+//            request.setTotalFee(BaseWxPayRequest.yuanToFen(totalPrice.toString()));
+//            request.setRefundFee(BaseWxPayRequest.yuanToFen(refundPrice.toString()));
+//            WxPayRefundResult response = WxMiniConfig.wxPayService.refund(request);
+//            if ("SUCCESS".equals(response.getReturnCode()) && "SUCCESS".equals(response.getResultCode())) {
+//                return refNum;
+//            } else {
+//                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),response.getErrCode() + response.getErrCodeDes());
+//            }
+//        } catch (WxPayException e) {
+//            e.printStackTrace();
+//        }
+//        throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閫�娆惧彂鐢熷紓甯歌鑱旂郴绠$悊鍛�");
+//    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java
new file mode 100644
index 0000000..57febaf
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wx/wxPlat/WxPlatNotice.java
@@ -0,0 +1,69 @@
+package com.doumee.core.wx.wxPlat;
+
+import com.doumee.dao.business.model.Visits;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+/**
+ * 寰俊鍏紬鍙烽�氱煡
+ *
+ * @Author : Rk
+ * @create 2023/12/27 9:19
+ */
+@Slf4j
+@Component
+public class WxPlatNotice {
+
+    /**
+     * 寰俊鍏紬鍙稟PI鐨凷ervice
+     */
+    private final WxMpService wxMpService;
+
+    public WxPlatNotice(WxMpService wxMpService) {
+        this.wxMpService = wxMpService;
+    }
+
+    /**
+     * 璁垮璁板綍瀹℃壒涓氬姟閫氱煡
+     */
+    public Boolean  sendVisitAuditTemplateNotice(Visits visits,String prefix,String tempId){
+        if(StringUtils.isBlank(visits.getOpenid())){
+            return false;
+        }
+        WxMpTemplateMessage templateMessage =  WxMpTemplateMessage.builder()
+                .toUser(visits.getOpenid())
+                .templateId(tempId)
+                .url(prefix + visits.getId())
+                .build();
+        String thing1 = "寰呭鎵�";
+        if(visits.getStatus()==2){
+            thing1 = "瀹℃牳閫氳繃";
+        }else if(visits.getStatus()==3){
+            thing1 = "瀹℃牳涓嶉�氳繃";
+        }else if(visits.getStatus()==5){
+            thing1 = "璁惧鎺堟潈鎴愬姛";
+        }else if(visits.getStatus()==6){
+            thing1 = "璁惧鎺堟潈鏈垚鍔�";
+        }
+        // 娣诲姞妯℃澘鏁版嵁
+        templateMessage.addData(new WxMpTemplateData("thing1", thing1))
+                .addData(new WxMpTemplateData("thing2", visits.getName()))
+                .addData(new WxMpTemplateData("phone_number6", visits.getPhone()));
+        String msgId = null;
+        try {
+            // 鍙戦�佹ā鏉挎秷鎭�
+            msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        log.warn("路==++--路鎺ㄩ�佸井淇℃ā鏉夸俊鎭細{}路--++==路", msgId != null ? "鎴愬姛" : "澶辫触");
+        return msgId != null;
+    }
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/LaborMemberDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/LaborMemberDTO.java
new file mode 100644
index 0000000..bd60ab8
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/LaborMemberDTO.java
@@ -0,0 +1,50 @@
+package com.doumee.dao.admin.request;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author T14
+ */
+@Data
+public class LaborMemberDTO {
+
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮�(鍏宠仈company琛�)")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "浜鸿劯鐓х墖")
+    private String faceImg;
+
+    @ApiModelProperty(value = "鍋ュ悍鐮�")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳")
+    private Integer type;
+
+    @ApiModelProperty(value = "璁垮鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "韬唤璇佸彿")
+    private String idcardNo;
+
+    @ApiModelProperty(value = "璇佷欢鏄剧ず淇℃伅")
+    private String idcardDecode;
+
+    @ApiModelProperty(value = "鍩硅鏈夋晥鏈熻捣濮�")
+    private Date startTime;
+
+    @ApiModelProperty(value = "鍩硅鏈夋晥鏈熺粨鏉�")
+    private Date endTime;
+
+    @ApiModelProperty(value = "鎬у埆 1 : 鐢� 锛� 0 : 濂�")
+    private Integer sex;
+
+    @ApiModelProperty(value = "娣诲姞浜虹紪鐮侊紙鑷叧鑱旓級", example = "1")
+    private Integer parentId;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
new file mode 100644
index 0000000..d285e67
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
@@ -0,0 +1,70 @@
+package com.doumee.dao.admin.request;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author T14
+ */
+@Data
+@ApiModel("浜哄憳鏌ヨ 鍙傛暟")
+public class MemberQuery implements Serializable {
+
+    @ApiModelProperty(value = "濮撳悕/鎵嬫満鍙�/宸ュ彿")
+    private String keyword;
+
+    @ApiModelProperty(value = "鏄惁鏈変汉鑴� 0 鍚� 1 鏄�")
+    private Integer hasFace;
+
+    @ApiModelProperty(value = "鍙嫓璁�")
+    private Integer canVisit;
+
+    @ApiModelProperty(value = "鐘舵��")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍏徃IDs")
+    private List<Integer> companyIds;
+
+    @ApiModelProperty(value = "濮撳悕")
+    private String name;
+
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "鍏徃鍚嶇О")
+    private String companyName;
+
+    @ApiModelProperty(value = "韬唤璇佸彿")
+    private String idcardNo;
+
+    @ApiModelProperty(value = " 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳")
+    private Integer type;
+
+
+    @ApiModelProperty(value = " 宸ュ彿鍛�")
+    private Integer code;
+
+    @ApiModelProperty(value = "娴峰悍鐘舵�� 0寰呬笅鍙� 1鎴愬姛2澶辫触")
+    private Integer hkStatus;
+
+    @ApiModelProperty(value = "鎿嶄綔浜哄憳 ")
+    private Integer createrId;
+
+
+
+    @ApiModelProperty(value = "erp鏈烘瀯涓婚敭 ")
+    private String erpOrgId;
+    @ApiModelProperty(value = "鏈烘瀯涓婚敭 ")
+    private String companyId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/OptionsObject.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/OptionsObject.java
new file mode 100644
index 0000000..4a04385
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/OptionsObject.java
@@ -0,0 +1,18 @@
+package com.doumee.dao.admin.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author LS
+ */
+@Data
+@ApiModel("閫夐」瀵硅薄闆�")
+public class OptionsObject {
+
+    @ApiModelProperty("閫夐」缂栧彿")
+    private String code;
+    @ApiModelProperty("閫夐」鍐呭")
+    private String value;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigParam.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigParam.java
new file mode 100644
index 0000000..2b56626
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/VisitConfigParam.java
@@ -0,0 +1,24 @@
+package com.doumee.dao.admin.request;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鎸囧畾鍙傛暟
+ */
+@Data
+public class VisitConfigParam {
+
+    @ApiModelProperty(value = "鏉ヨ棰勭害鏂瑰紡")
+    private Integer reservationWay;
+
+    @ApiModelProperty(value = "琚浜烘牎楠屾柟寮�")
+    private Integer checkVisit;
+
+    @ApiModelProperty(value = "鍋ュ悍璇佹槸鍚﹀繀濉�")
+    private Integer healthCard;
+
+    @ApiModelProperty(value = "鍔冲姟鏄惁绛旈")
+    private Integer isAnswer;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/CarEventDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/CarEventDTO.java
new file mode 100644
index 0000000..525e3ca
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/CarEventDTO.java
@@ -0,0 +1,192 @@
+package com.doumee.dao.admin.response;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author T14
+ */
+@Data
+@ApiModel("鍋滆溅鍦轰簨浠舵帹閫佽褰曡〃")
+public class CarEventDTO {
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浜嬩欢鍞竴鏍囪瘑锛屽悓涓�浜嬩欢鑻ヤ笂鎶ュ娆★紝鍒欎笂鎶ヤ簨浠剁殑eventId鐩稿悓")
+    private String eventId;
+
+    @ApiModelProperty(value = "浜嬩欢婧愮紪鍙凤紝鐗╃悊璁惧鏄祫婧愮紪鍙�")
+    private String srcIndex;
+
+    @ApiModelProperty(value = "浜嬩欢婧愮被鍨�")
+    private String srcType;
+
+    @ApiModelProperty(value = "浜嬩欢婧愬悕绉�")
+    private String srcName;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷")
+    private Integer eventType;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷鍚嶇О")
+    @ExcelColumn(name="浜嬩欢绫诲瀷",index = 4,width = 18)
+    private String eventTypeName;
+
+    @ApiModelProperty(value = "浜嬩欢鐘舵��,0-鐬椂 1-寮�濮�2-鍋滄4-浜嬩欢鑱斿姩缁撴灉鏇存柊5-浜嬩欢鍥剧墖寮傛涓婁紶")
+    private Integer status;
+
+    @ApiModelProperty(value = "鑴夊啿瓒呮椂鏃堕棿")
+    private String timeout;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鏃堕棿锛堣澶囨椂闂�")
+    @ExcelColumn(name="浜嬩欢鏃堕棿",index = 10,width = 16)
+    private String happenTime;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鐨勪簨浠舵簮鐖惰澶�")
+    private String srcParentIndex;
+
+    @ApiModelProperty(value = "鏄惁榛戝悕鍗曟爣璇嗭紙1-榛戝悕鍗� 0-闈為粦鍚嶅崟锛�")
+    private String alarmCar;
+
+    @ApiModelProperty(value = "杞﹁締灞炴�у悕绉�")
+    private String carAttributeName;
+
+    @ApiModelProperty(value = "鍗″彿")
+    private String cardNo;
+    /**鍏宠仈浜哄憳淇℃伅**/
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name="鎵嬫満鍙�",index = 8,width = 16)
+    private String personPhone;
+
+    @ApiModelProperty(value = "浜哄憳绫诲瀷")
+    @ExcelColumn(name="浜哄憳绫诲瀷",index = 6,width = 10,valueMapping = "0=鍔冲姟璁垮;1=鏅�氳瀹�;2=鍐呴儴浜哄憳;")
+    private Integer personType;
+
+    @ApiModelProperty(value = "浜哄憳韬唤璇佸彿")
+    private String personIdcardDecode;
+
+    @ApiModelProperty(value = "浜哄憳缁勭粐鍏徃")
+    @ExcelColumn(name="鍏徃/閮ㄩ棬",index = 9,width = 16)
+    private String personCompanyName;
+    @ApiModelProperty(value = "璁垮鍏徃1")
+    private String visitCompanyName;
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelColumn(name="濮撳悕",index = 7,width = 16)
+    private String personName;
+
+    @ApiModelProperty(value = "浜嬩欢鍙�,1:鍘嬬嚎浜嬩欢2:涓婁紶鍥剧墖3:鍏ュ満4:鍑哄満5:杞︾墝鐭6:鍥剧墖閲嶄紶")
+    private Integer eventCmd;
+
+    @ApiModelProperty(value = "浜嬩欢缂栧彿")
+    private String eventIndex;
+
+    @ApiModelProperty(value = "鍑哄叆鍙g紪鍙�")
+    private String gateIndex;
+
+    @ApiModelProperty(value = "鍑哄叆鍙e悕绉�")
+    @ExcelColumn(name="鍑哄叆鍙e悕绉�",index = 3,width = 18)
+    private String gateName;
+
+    @ApiModelProperty(value = "鏀捐鏉冮檺")
+    private Integer releaseAuth;
+
+    @ApiModelProperty(value = "鏀捐鍘熷洜")
+    private Integer releaseReason;
+
+    @ApiModelProperty(value = "鏀捐缁撴灉")
+    private Integer releaseResult;
+
+    @ApiModelProperty(value = "鏂颁綋绯绘斁琛岀粨鏋�")
+    private Integer releaseResultEx;
+
+    @ApiModelProperty(value = "鏀捐鏂瑰紡")
+    private Integer releaseWay;
+
+    @ApiModelProperty(value = "杩涘嚭鍦虹被鍨嬶紝0锛氳繘鍦猴紝1锛氬嚭鍦�")
+    @ExcelColumn(name="鍑哄叆绫诲瀷",index = 5,width = 10,valueMapping = "0=杩涘満;1=鍑哄満;")
+    private Integer inoutType;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    @ExcelColumn(name="杞︾墝鍙�",index = 1,width = 12)
+    private String plateNos;
+
+    @ApiModelProperty(value = "杞﹁締涓诲搧鐗�")
+    private Integer mainLogo;
+
+    @ApiModelProperty(value = "鍋滆溅搴撶紪鍙�")
+    private String parkIndex;
+
+    @ApiModelProperty(value = "鍋滆溅搴撳悕绉�")
+    @ExcelColumn(name="鍋滆溅搴撳悕绉�",index = 2,width = 18)
+    private String parkName;
+
+    @ApiModelProperty(value = "杞︾墝棰滆壊")
+    private String plateColor;
+
+    @ApiModelProperty(value = "杞︾墝缃俊搴�")
+    private BigDecimal plateBelieve;
+
+    @ApiModelProperty(value = "杞︾墝绫诲瀷")
+    private Integer plateType;
+
+    @ApiModelProperty(value = "杞﹂亾缂栧彿")
+    private String roadwayIndex;
+
+    @ApiModelProperty(value = "杞﹂亾鍚嶇О")
+    private String roadwayName;
+
+    @ApiModelProperty(value = "杞﹂亾绫诲瀷 1锛氬叆鍦鸿溅閬� 2锛氬嚭鍦轰笉鏀惰垂杞﹂亾 3锛氬嚭鍦虹即璐硅溅閬� 4锛氫腑澶即璐硅溅閬�")
+    private Integer roadwayType;
+
+    @ApiModelProperty(value = "杞﹁締瀛愬搧鐗�")
+    private Integer subLogo;
+
+    @ApiModelProperty(value = "瀛愬搧鐗屽勾娆�")
+    private Integer subModel;
+
+    @ApiModelProperty(value = "鏃堕棿 ISO鏍煎紡")
+    private String timestr;
+
+    @ApiModelProperty(value = "杞﹁締灞炴��")
+    private Integer vehicleClass;
+
+    @ApiModelProperty(value = "杞﹁締棰滆壊")
+    private Integer vehicleColor;
+
+    @ApiModelProperty(value = "杞﹁締绫诲瀷")
+    private Integer vehicleType;
+
+    @ApiModelProperty(value = "杞﹁締鍥剧墖")
+    private String vehiclePicUrl;
+
+    @ApiModelProperty(value = "杞︾墝鍥剧墖")
+    private String platePicUrl;
+
+    @ApiModelProperty(value = "鍥剧墖鏈嶅姟鍣ㄧ紪鍙�")
+    private String svrIndex;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/DevWgResponseParam.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/DevWgResponseParam.java
new file mode 100644
index 0000000..1d0e406
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/DevWgResponseParam.java
@@ -0,0 +1,16 @@
+package com.doumee.dao.admin.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鎵弿杩斿洖寰厜璁惧淇℃伅
+ */
+@Data
+public class DevWgResponseParam {
+
+    @ApiModelProperty(value = "浜岀淮鐮佷俊鎭�")
+    private String vgdecoderesult;
+    @ApiModelProperty(value = "璁惧鍨嬪彿")
+    private String devicenumber;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/StagingDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/StagingDataVO.java
new file mode 100644
index 0000000..6ece8b1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/StagingDataVO.java
@@ -0,0 +1,47 @@
+package com.doumee.dao.admin.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/2/26 11:02
+ */
+@Data
+@ApiModel("宸ヤ綔鍙版暟鎹�")
+public class StagingDataVO {
+
+    @ApiModelProperty(value = "鍐呴儴鍛樺伐")
+    private Long workerCount;
+
+    @ApiModelProperty(value = "璁垮浜哄憳")
+    private Long visitorCount;
+
+    @ApiModelProperty(value = "鍔冲姟浜哄憳")
+    private Long lwCount;
+
+    @ApiModelProperty(value = "鍦ㄥ満杞﹁締")
+    private Integer presenceCarCount;
+
+    @ApiModelProperty(value = "棰勭害杞﹁締")
+    private Integer visitorCarCount;
+
+    @ApiModelProperty(value = "闀挎湡杞﹁締")
+    private Integer longCarCount;
+
+    @ApiModelProperty(value = "渚涘簲鍟嗘暟閲�")
+    private Integer supplierCount;
+
+    @ApiModelProperty(value = "鍔冲姟鍏徃浜哄憳鏁�")
+    private List<Map<String,Object>> companyUsers;
+
+    @ApiModelProperty(value = "婊炵暀浜哄憳鏁版嵁")
+    private List<Map<String,Object>> retentionUsers;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/VisitEventDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/VisitEventDTO.java
new file mode 100644
index 0000000..09f4d91
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/response/VisitEventDTO.java
@@ -0,0 +1,137 @@
+package com.doumee.dao.admin.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * @author T14
+ */
+@Data
+@ApiModel("璁垮浜嬩欢鎺ㄩ�佽褰曡〃")
+public class VisitEventDTO {
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浜嬩欢鍞竴鏍囪瘑锛屽悓涓�浜嬩欢鑻ヤ笂鎶ュ娆★紝鍒欎笂鎶ヤ簨浠剁殑eventId鐩稿悓")
+    private String eventId;
+
+    @ApiModelProperty(value = "浜嬩欢婧愮紪鍙凤紝鐗╃悊璁惧鏄祫婧愮紪鍙�")
+    private String srcIndex;
+
+    @ApiModelProperty(value = "浜嬩欢婧愮被鍨�")
+    private String srcType;
+
+    @ApiModelProperty(value = "浜嬩欢婧愬悕绉�")
+    private String srcName;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷")
+    private Integer eventType;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷鍚嶇О")
+    private String eventTypeName;
+
+    @ApiModelProperty(value = "浜嬩欢鐘舵��,0-鐬椂1-寮�濮�2-鍋滄4-浜嬩欢鑱斿姩缁撴灉鏇存柊5-浜嬩欢鍥剧墖寮傛涓婁紶")
+    private Integer status;
+
+    @ApiModelProperty(value = "鑴夊啿瓒呮椂鏃堕棿")
+    private String timeout;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鏃堕棿锛堣澶囨椂闂�")
+    private String happenTime;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鐨勪簨浠舵簮鐖惰澶�")
+    private String srcParentIndex;
+
+    @ApiModelProperty(value = "璁垮Is锛�,瀵瑰簲璁垮鏉ヨ璁板綍涓殑orderId瀛楁")
+    private String visitorId;
+
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "浜哄憳绫诲瀷")
+    private String personType;
+
+    @ApiModelProperty(value = "浜哄憳韬唤璇佸彿")
+    private String personIdcardDecode;
+
+    @ApiModelProperty(value = "浜哄憳缁勭粐鍏徃")
+    private String personCompanyName;
+
+
+    @ApiModelProperty(value = "濮撳悕")
+    private String personName;
+
+    @ApiModelProperty(value = "鎬у埆 1-鐢�2-濂�")
+    private Integer sex;
+
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 111韬唤璇�")
+    private String idType;
+
+    @ApiModelProperty(value = "璇佷欢鍙� ")
+    private String idNo;
+
+    @ApiModelProperty(value = "琚闂汉濮撳悕")
+    private String beVisitedPersonName;
+
+    @ApiModelProperty(value = "琚闂汉鎵�灞炵粍缁�")
+    private String beVisitedPersonOrg;
+
+    @ApiModelProperty(value = "鏉ヨ鍗曚綅")
+    private String visitorWorkUint;
+
+    @ApiModelProperty(value = "璁垮楠岃瘉鐮�")
+    private String visitorCode;
+
+    @ApiModelProperty(value = "鏉ヨ浜嬬敱")
+    private String purpose;
+
+    @ApiModelProperty(value = "璇佷欢绛惧彂鏈哄叧")
+    private String signOrg;
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private String startTime;
+
+    @ApiModelProperty(value = "绂诲紑鏃堕棿")
+    private String endTime;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    private String carNo;
+
+    @ApiModelProperty(value = "鐓х墖uri")
+    private String photoUrl;
+
+    @ApiModelProperty(value = "鎶撴媿鍥緐ri")
+    private String captureUrl;
+
+    @ApiModelProperty(value = "鍥剧墖瀛樺偍鏈嶅姟鍣ㄥ敮涓�鏍囪瘑")
+    private String svrIndexCode;
+
+    @ApiModelProperty(value = "琚闂汉id")
+    private String beVisitedPersonId;
+
+    @ApiModelProperty(value = "琚闂汉鎵�灞炵粍缁噄d")
+    private String beVisitedPersonOrgId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CarEventMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CarEventMapper.java
new file mode 100644
index 0000000..f502dbe
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CarEventMapper.java
@@ -0,0 +1,15 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.CarEvent;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface CarEventMapper extends BaseMapper<CarEvent> {
+
+    void insertBatchSomeColumn(List<CarEvent> list);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CategoryMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CategoryMapper.java
new file mode 100644
index 0000000..420b930
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CategoryMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Category;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface CategoryMapper extends BaseMapper<Category> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CompanyMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CompanyMapper.java
new file mode 100644
index 0000000..6ed1e68
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/CompanyMapper.java
@@ -0,0 +1,15 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Company;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface CompanyMapper extends BaseMapper<Company> {
+
+    void insertBatchSomeColumn(List<Company> addList);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/EmpowerMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/EmpowerMapper.java
new file mode 100644
index 0000000..bea29ec
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/EmpowerMapper.java
@@ -0,0 +1,15 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Empower;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface EmpowerMapper extends BaseMapper<Empower> {
+
+    void insertBatchSomeColumn(List<Empower> list);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java
new file mode 100644
index 0000000..5626f4b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.InterfaceLog;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface InterfaceLogMapper extends BaseMapper<InterfaceLog> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberCardMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberCardMapper.java
new file mode 100644
index 0000000..0032769
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberCardMapper.java
@@ -0,0 +1,16 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.MemberCard;
+import com.doumee.dao.business.model.MemberRole;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface MemberCardMapper extends BaseMapper<MemberCard> {
+
+    void insertBatchSomeColumn(List<MemberCard> list);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberRoleMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberRoleMapper.java
new file mode 100644
index 0000000..cff3a2e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/MemberRoleMapper.java
@@ -0,0 +1,17 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.MemberRole;
+import com.doumee.dao.business.model.VisitEvent;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface MemberRoleMapper extends BaseMapper<MemberRole> {
+
+    void insertBatchSomeColumn(List<MemberRole> list);
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/TrainTimeMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/TrainTimeMapper.java
new file mode 100644
index 0000000..e40946b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/TrainTimeMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.TrainTime;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface TrainTimeMapper extends BaseMapper<TrainTime> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/UserActionMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/UserActionMapper.java
new file mode 100644
index 0000000..f5d61e0
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/UserActionMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.UserAction;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/12/14 13:57
+ */
+public interface UserActionMapper extends BaseMapper<UserAction> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java
new file mode 100644
index 0000000..977569f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/VisitsMapper.java
@@ -0,0 +1,15 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Visits;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface VisitsMapper extends BaseMapper<Visits> {
+
+    void insertBatchSomeColumn(List<Visits> withUserList);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/CarEventJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/CarEventJoinMapper.java
new file mode 100644
index 0000000..371b2f6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/CarEventJoinMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business.join;
+
+import com.doumee.dao.business.model.CarEvent;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author T14
+ */
+//@Repository
+public interface CarEventJoinMapper extends MPJJoinMapper<CarEvent> {
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/DeviceJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/DeviceJoinMapper.java
new file mode 100644
index 0000000..73bbfd7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/DeviceJoinMapper.java
@@ -0,0 +1,8 @@
+package com.doumee.dao.business.join;
+
+import com.doumee.dao.business.model.Device;
+import com.doumee.dao.business.model.UserAction;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+public interface DeviceJoinMapper extends MPJJoinMapper<Device> {
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/EmpowerJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/EmpowerJoinMapper.java
new file mode 100644
index 0000000..f920075
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/EmpowerJoinMapper.java
@@ -0,0 +1,15 @@
+package com.doumee.dao.business.join;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Empower;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface EmpowerJoinMapper extends MPJJoinMapper<Empower> {
+    void insertBatchSomeColumn(List<Empower> list);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/MemberRoleJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/MemberRoleJoinMapper.java
new file mode 100644
index 0000000..8eb63a7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/MemberRoleJoinMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business.join;
+
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.MemberRole;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+/**
+ * @author T14
+ */
+//@Repository
+public interface MemberRoleJoinMapper extends MPJJoinMapper<MemberRole> {
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/ProblemLogJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/ProblemLogJoinMapper.java
new file mode 100644
index 0000000..b8a2b8c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/ProblemLogJoinMapper.java
@@ -0,0 +1,10 @@
+package com.doumee.dao.business.join;
+
+import com.doumee.dao.business.model.ProblemLog;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+/**
+ * @author T14
+ */
+public interface ProblemLogJoinMapper extends MPJJoinMapper<ProblemLog> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitEventJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitEventJoinMapper.java
new file mode 100644
index 0000000..ae61a90
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitEventJoinMapper.java
@@ -0,0 +1,11 @@
+package com.doumee.dao.business.join;
+
+import com.doumee.dao.business.model.VisitEvent;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+/**
+ * @author T14
+ */
+//@Repository
+public interface VisitEventJoinMapper extends MPJJoinMapper<VisitEvent> {
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitsJoinMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitsJoinMapper.java
new file mode 100644
index 0000000..21acf16
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitsJoinMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business.join;
+
+import com.doumee.dao.business.model.MemberCard;
+import com.doumee.dao.business.model.Visits;
+import com.github.yulichang.base.mapper.MPJJoinMapper;
+
+/**
+ * @author T14
+ */
+//@Repository
+public interface VisitsJoinMapper extends MPJJoinMapper<Visits> {
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java
new file mode 100644
index 0000000..d38c87d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java
@@ -0,0 +1,86 @@
+package com.doumee.dao.business.model;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 瀹℃壒妯$増閰嶇疆淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/12/28 11:46
+ */
+@Data
+@ApiModel("瀹℃壒妯$増閰嶇疆淇℃伅琛�")
+@TableName("`approve_param`")
+public class ApproveParam {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "绫诲瀷 0瀹℃壒 1鎶勯��", example = "1")
+    @ExcelColumn(name="绫诲瀷 0瀹℃壒 1鎶勯��")
+    private Integer type;
+
+    @ApiModelProperty(value = "瀹℃壒浜虹被鍨� 0琚浜� 1鎸囧畾浜哄憳 2閮ㄩ棬涓荤")
+    @ExcelColumn(name="瀹℃壒浜虹被鍨� 0琚浜� 1鎸囧畾浜哄憳 2閮ㄩ棬涓荤")
+    private Integer memberType;
+
+    @ApiModelProperty(value = "绛夌骇", example = "1")
+    @ExcelColumn(name="绛夌骇")
+    private Integer level;
+
+    @ApiModelProperty(value = "瀹℃壒浜哄鍚嶏紝澶氫釜鐢ㄨ嫳鏂囬�楀彿闅斿紑")
+    @ExcelColumn(name="瀹℃壒浜哄鍚嶏紝澶氫釜鐢ㄨ嫳鏂囬�楀彿闅斿紑")
+    private String objNames;
+
+    @ApiModelProperty(value = "瀹℃壒浜虹紪鐮侊紝澶氫釜鐢ㄨ嫳鏂囬�楀彿闅斿紑")
+    @ExcelColumn(name="瀹℃壒浜虹紪鐮侊紝澶氫釜鐢ㄨ嫳鏂囬�楀彿闅斿紑")
+    private String objIds;
+
+    @ApiModelProperty(value = "瀹℃壒涓荤绛夌骇 0鐩存帴涓荤 1浜岀骇涓荤 2涓夌骇涓荤 4鍥涚骇涓荤", example = "1")
+    @ExcelColumn(name="瀹℃壒涓荤绛夌骇 0鐩存帴涓荤 1浜岀骇涓荤 2涓夌骇涓荤 4鍥涚骇涓荤")
+    private Integer objLevel;
+
+    @ApiModelProperty(value = "澶氫汉瀹℃壒鏂瑰紡 0鎴栫 1浼氱", example = "1")
+    @ExcelColumn(name="澶氫汉瀹℃壒鏂瑰紡 0鎴栫 1浼氱")
+    private Integer approveType;
+
+    @ApiModelProperty(value = "鏃犱富绠¢�夐」 0娴佺▼缁撴潫 1鐢变笂绾т富绠′唬鏇垮鏍�", example = "1")
+    @ExcelColumn(name="鏃犱富绠¢�夐」 0娴佺▼缁撴潫 1鐢变笂绾т富绠′唬鏇垮鏍�")
+    private Integer noleaderOpt;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/InterfaceLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/InterfaceLog.java
new file mode 100644
index 0000000..e6ef8f7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/InterfaceLog.java
@@ -0,0 +1,98 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍")
+@TableName("`interface_log`")
+public class InterfaceLog {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "绫诲瀷 0璋冪敤 1鎺ㄩ�佹帴鍙�", example = "1")
+    @ExcelColumn(name="绫诲瀷 0璋冪敤 1鎺ㄩ�佹帴鍙�")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎺ュ彛鍚嶇О")
+    @ExcelColumn(name="鎺ュ彛鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鍦板潃淇℃伅")
+    @ExcelColumn(name="鍦板潃淇℃伅")
+    private String url;
+
+    @ApiModelProperty(value = "璇锋眰鍙傛暟")
+    @ExcelColumn(name="璇锋眰鍙傛暟")
+    private String request;
+
+    @ApiModelProperty(value = "鍝嶅簲鍙傛暟")
+    @ExcelColumn(name="鍝嶅簲鍙傛暟")
+    private String repose;
+
+    @ApiModelProperty(value = "璋冪敤缁撴灉 0鎴愬姛 1澶辫触", example = "1")
+    @ExcelColumn(name="璋冪敤缁撴灉 0鎴愬姛 1澶辫触")
+    private Integer success;
+
+    @ApiModelProperty(value = "骞冲彴 0娴峰悍瀹夐槻骞冲彴 1ERP绯荤粺", example = "1")
+    @ExcelColumn(name="骞冲彴 0娴峰悍瀹夐槻骞冲彴 1ERP绯荤粺")
+    private Integer plat;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷  0缁勭粐 1浜哄憳 2闂ㄧ浜嬩欢 3璁惧", example = "1")
+    @ExcelColumn(name="鍏宠仈瀵硅薄绫诲瀷  0缁勭粐 1浜哄憳 2闂ㄧ浜嬩欢 3璁惧")
+    private Integer objType;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜锛堝涓敤鑻辨枃閫楀彿闅斿紑锛�")
+    @ExcelColumn(name="鍏宠仈瀵硅薄缂栫爜锛堝涓敤鑻辨枃閫楀彿闅斿紑锛�")
+    private String objId;
+
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @TableField(exist = false)
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @TableField(exist = false)
+    private Date endDate;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
new file mode 100644
index 0000000..7de820b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -0,0 +1,257 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("浜哄憳淇℃伅琛�")
+@TableName("`member`")
+public class Member {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮�(鍏宠仈company琛�)", example = "1")
+    @ExcelColumn(name="鎵�灞炵粍缁囩紪鐮�(鍏宠仈company琛�)")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "浜鸿劯鐓х墖")
+    @ExcelColumn(name="浜鸿劯鐓х墖")
+    private String faceImg;
+    @ApiModelProperty(value = "浜鸿劯瀛樺偍鏈嶅姟鍣ㄦ爣璇嗭紙娴峰悍锛�")
+    @ExcelColumn(name="浜鸿劯瀛樺偍鏈嶅姟鍣ㄦ爣璇嗭紙娴峰悍锛�")
+    private String faceServerIndexCode;
+    @ApiModelProperty(value = "浜鸿劯缂栫爜锛堟捣搴凤級")
+    @ExcelColumn(name="浜鸿劯缂栫爜锛堟捣搴凤級")
+    private String faceId;
+    @ApiModelProperty(value = "浜鸿劯鍚屾鐘舵�侊紙娴峰悍锛� 0鏈悓姝� 1宸插悓姝� 2鍚屾澶辫触 3涓嶅悎鏍�")
+    @ExcelColumn(name="浜鸿劯鍚屾鐘舵�侊紙娴峰悍锛� 0鏈悓姝� 1宸插悓姝�  2鍚屾澶辫触 3涓嶅悎鏍�")
+    private Integer faceStatus;
+    @ApiModelProperty(value = "浜鸿劯鍚屾淇℃伅锛堟捣搴凤級")
+    @ExcelColumn(name="浜鸿劯鍚屾淇℃伅锛堟捣搴凤級")
+    private String faceInfo;
+    @ApiModelProperty(value = "鍋ュ悍鐮�")
+    @ExcelColumn(name="鍋ュ悍鐮�")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳")
+    private Integer type;
+
+    @ApiModelProperty(value = "璁垮鍚嶇О/鍐呴儴浜哄憳")
+    @ExcelColumn(name="璁垮鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "璁垮骞撮緞")
+    @ExcelColumn(name="璁垮骞撮緞")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthday;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name="鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "韬唤璇佸彿锛圡D4鍔犲瘑锛�")
+    @ExcelColumn(name="韬唤璇佸彿锛圡D4鍔犲瘑锛�")
+    private String idcardNo;
+
+    @ApiModelProperty(value = "璇佷欢鏄剧ず淇℃伅")
+    @ExcelColumn(name="璇佷欢鏄剧ず淇℃伅")
+    private String idcardDecode;
+
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収", example = "1")
+    @ExcelColumn(name="璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収")
+    private Integer idcardType;
+
+    @ApiModelProperty(value = "宸ュ彿")
+    @ExcelColumn(name="宸ュ彿")
+    private String code;
+
+    @ApiModelProperty(value = "鐝 0鐧界彮 1澶滅彮")
+    @ExcelColumn(name="鐝 0鐧界彮 1澶滅彮")
+    private Integer classes;
+
+    @ApiModelProperty(value = "鐘舵�� 0姝e父 1绂佺敤 2鎷夐粦/鍐荤粨", example = "1")
+    @ExcelColumn(name="鐘舵�� 0姝e父 1绂佺敤 2鎷夐粦/鍐荤粨")
+    private Integer status;
+    @ApiModelProperty(value = "鎬у埆 1鐢� 2濂� ", example = "1")
+    @ExcelColumn(name="鎬у埆 1鐢� 2濂�")
+    private Integer sex;
+    @ApiModelProperty(value = "娣诲姞浜虹紪鐮侊紙鑷叧鑱旓級", example = "1")
+    @ExcelColumn(name="娣诲姞浜虹紪鐮侊紙鑷叧鑱旓級")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "寰俊openid")
+    @ExcelColumn(name="寰俊openid")
+    private String openid;
+
+    @ApiModelProperty(value = "椋炰功鏍囪瘑")
+    @ExcelColumn(name="椋炰功鏍囪瘑")
+    private String fsId;
+
+    @ApiModelProperty(value = "椋炰功鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�", example = "1")
+    @ExcelColumn(name="椋炰功鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�")
+    private Integer fsStatus;
+
+    @ApiModelProperty(value = "椋炰功鏈�杩戝悓姝ユ椂闂�")
+    @ExcelColumn(name="椋炰功鏈�杩戝悓姝ユ椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date fsDate;
+
+    @ApiModelProperty(value = "娴峰悍鏍囪瘑", example = "1")
+    @ExcelColumn(name="娴峰悍鏍囪瘑")
+    private String hkId;
+
+    @ApiModelProperty(value = "娴峰悍鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝� 2鍚屾澶辫触 3涓嶇鍚堜笅鍙戞潯浠� 4绛夊緟鍒犻櫎鏉冮檺  ", example = "1")
+    @ExcelColumn(name="娴峰悍鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝� 2鍚屾澶辫触 3涓嶇鍚堜笅鍙戞潯浠� 4绛夊緟鍒犻櫎鏉冮檺")
+    private Integer hkStatus;
+
+    @ApiModelProperty(value = "娴峰悍鏈�杩戝悓姝ユ椂闂�")
+    @ExcelColumn(name="娴峰悍鏈�杩戝悓姝ユ椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date hkDate;
+
+    @ApiModelProperty(value = "ERP鏍囪瘑", example = "1")
+    @ExcelColumn(name="ERP鏍囪瘑")
+    private String erpId;
+
+    @ApiModelProperty(value = "ERP鍚屾鏃堕棿")
+    @ExcelColumn(name="ERP鍚屾鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date erpDate;
+
+    @ApiModelProperty(value = "ERP鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�", example = "1")
+    @ExcelColumn(name="ERP鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�")
+    private Integer erpStatus;
+
+    @ApiModelProperty(value = "閽夐拤鏍囪瘑", example = "1")
+    @ExcelColumn(name="閽夐拤鏍囪瘑")
+    private Integer ddId;
+
+    @ApiModelProperty(value = "閽夐拤鍚屾鏃堕棿")
+    @ExcelColumn(name="閽夐拤鍚屾鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date ddDate;
+
+    @ApiModelProperty(value = "閽夐拤P鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�", example = "1")
+    @ExcelColumn(name="閽夐拤P鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�")
+    private Integer ddStatus;
+
+    @ApiModelProperty(value = "鐧婚檰瀵嗙爜")
+    @ExcelColumn(name="鐧婚檰瀵嗙爜")
+    private String passward;
+
+    @ApiModelProperty(value = "鏄惁鍙嫓璁夸汉 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍙嫓璁夸汉 0鍚� 1鏄�")
+    private Integer canVisit;
+
+    @ApiModelProperty(value = "鏄惁楂樼骇瀹℃壒浜� 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁楂樼骇瀹℃壒浜� 0鍚� 1鏄�")
+    private Integer highCheckor;
+
+    @ApiModelProperty(value = "闂ㄧ瑙掕壊缂栫爜锛堝叧鑱攄evice_role),澶氫釜鑻辨枃閫楀彿闅斿紑", example = "1")
+    @ExcelColumn(name="闂ㄧ瑙掕壊缂栫爜 ")
+    private String roleId;
+
+    @ApiModelProperty(value = "闂ㄧ瑙掕壊鎺堟潈鏃堕棿")
+    @ExcelColumn(name="闂ㄧ瑙掕壊鎺堟潈鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date roleDate;
+
+    @ApiModelProperty(value = "ERP缁勭粐缂栫爜")
+    @ExcelColumn(name="ERP缁勭粐缂栫爜")
+    private String erpOrgId;
+
+    @ApiModelProperty(value = "璁垮鍏徃鍚嶇О")
+    @ExcelColumn(name="璁垮鍏徃鍚嶇О")
+    private String visitCompanyName;
+
+    @ApiModelProperty(value = "缁勭粐鍚嶇О")
+    @TableField(exist = false)
+    private String companyName;
+    @ApiModelProperty(value = "缁勭粐娴峰悍缂栫爜")
+    @TableField(exist = false)
+    private String hkOrgId;
+    @ApiModelProperty(value = "瑙掕壊缂栫爜鏌ヨ")
+    @TableField(exist = false)
+    private String roleIdParam;
+
+    @ApiModelProperty(value = "鍓嶇紑鍦板潃")
+    @TableField(exist = false)
+    private String prefixUrl;
+
+    @ApiModelProperty(value = "鎺堟潈闂ㄧ缁勭紪鐮侀泦鍚�,銆愯瀹㈢銆戝敮涓�鏍囪瘑",hidden = true )
+    @TableField(exist = false)
+    private Integer[] roleIds;
+
+    //鏆傛棤浣跨敤
+    @ApiModelProperty(value = "濮撳悕/鎵嬫満鍙�/宸ュ彿")
+    @TableField(exist = false)
+    private String keyword;
+
+    @ApiModelProperty(value = "鏄惁鏈変汉鑴革細0=鏃狅紱1=鏈夛紱")
+    @TableField(exist = false)
+    private Integer isFace;
+
+    @ApiModelProperty(value = "璁块棶娆℃暟")
+    @TableField(exist = false)
+    private Integer visitTimes;
+
+    @ApiModelProperty(value = "鏈�鍚庤闂椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date lastVisitDate;
+
+    @ApiModelProperty(value = "闂ㄧ鏈夋晥鏈熷紑濮�")
+    @ExcelColumn(name="闂ㄧ鏈夋晥鏈熷紑濮�",index= 5,dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+    @ApiModelProperty(value = "缂栫爜闆嗗悎")
+    @TableField(exist = false)
+    private List<Integer> idList;
+
+    @ApiModelProperty(value = "闂ㄧ鏈夋晥鏈熺粨鏉�", example = "1")
+    @ExcelColumn(name="闂ㄧ鏈夋晥鏈熺粨鏉�",index= 6,dateFormat = "yyyy-MM-dd")
+    private Date endTime;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ProblemLog.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ProblemLog.java
new file mode 100644
index 0000000..d8b3069
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ProblemLog.java
@@ -0,0 +1,104 @@
+package com.doumee.dao.business.model;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.config.mybatis.JSONObjectHandler;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 璁垮绛旈璁板綍琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("璁垮绛旈璁板綍琛�")
+@TableName(value = "`problem_log`",autoResultMap = true)
+public class ProblemLog {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "璁垮缂栫爜", example = "1")
+    @ExcelColumn(name="璁垮缂栫爜")
+    private Integer userId;
+
+    @ApiModelProperty(value = "鏄惁宸插畬鎴愮敵璇� 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁宸插畬鎴愮敵璇� 0鍚� 1鏄�")
+    private Integer status;
+
+    @ApiModelProperty(value = "缁戝畾鐢宠缂栫爜")
+    @ExcelColumn(name="缁戝畾鐢宠缂栫爜")
+    private Integer logId;
+
+    @ApiModelProperty(value = "寰楀垎", example = "1")
+    @ExcelColumn(name="寰楀垎")
+    private BigDecimal score;
+
+    @ApiModelProperty(value = "绛旈鏄庣粏锛宩son瀛樺偍")
+    @ExcelColumn(name="绛旈鏄庣粏锛宩son瀛樺偍")
+    @TableField(value = "content", typeHandler = JSONObjectHandler.class)
+    private JSONObject content;
+
+    @ApiModelProperty(value = "绛旈浜哄鍚�")
+    @ExcelColumn(name="绛旈浜哄鍚�")
+    private String name;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳")
+    @ExcelColumn(name="绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳")
+    @TableField(exist = false)
+    private Integer type;
+
+    @ApiModelProperty(value = "绛旈浜烘墜鏈哄悗")
+    @ExcelColumn(name="绛旈浜烘墜鏈哄悗")
+    private String phone;
+
+    @ApiModelProperty(value = "绛旈浜烘墍灞炵粍缁囩紪鐮�", example = "1")
+    @ExcelColumn(name="绛旈浜烘墍灞炵粍缁囩紪鐮�")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "缁勭粐鍚嶇О")
+    @ExcelColumn(name="缁勭粐鍚嶇О")
+    private String companyName;
+
+    @ApiModelProperty(value = "openid")
+    @ExcelColumn(name="openid")
+    private String openid;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java
new file mode 100644
index 0000000..62e3bf7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java
@@ -0,0 +1,90 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 浜哄憳鎿嶄綔璁板綍鏃ュ織
+ * @author 姹熻箘韫�
+ * @date 2023/12/14 13:57
+ */
+@Data
+@ApiModel("浜哄憳鎿嶄綔璁板綍鏃ュ織")
+@TableName("`user_action`")
+public class UserAction {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "绫诲瀷 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎", example = "1")
+    @ExcelColumn(name="绫诲瀷 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎")
+    private Integer type;
+
+    @ApiModelProperty(value = "浜哄憳鎿嶄綔璁板綍鏃ュ織")
+    @ExcelColumn(name="浜哄憳鎿嶄綔璁板綍鏃ュ織")
+    private String memberId;
+
+    @ApiModelProperty(value = "鎿嶄綔鍓嶇姸鎬� 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎", example = "1")
+    @ExcelColumn(name="鎿嶄綔鍓嶇姸鎬� 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎")
+    private Integer beforeStatus;
+
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕绉�", example = "1")
+    @TableField(exist = false)
+    private String createName;
+
+    @ApiModelProperty(value = "浜哄憳绫诲瀷锛�0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳", example = "1")
+    @TableField(exist = false)
+    private String memberType;
+
+    @ApiModelProperty(value = "鎿嶄綔瀵硅薄", example = "1")
+    @TableField(exist = false)
+    private String memberName;
+
+    @ApiModelProperty(value = "鍏徃鍚嶇О", example = "1")
+    @TableField(exist = false)
+    private String companyName;
+
+    @ApiModelProperty(value = "璁垮鍏徃鍚嶇О", example = "1")
+    @TableField(exist = false)
+    private String visitCompanyName;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�", example = "1")
+    @TableField(exist = false)
+    private String mobile;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java
new file mode 100644
index 0000000..cae7ab9
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java
@@ -0,0 +1,164 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 璁垮浜嬩欢鎺ㄩ�佽褰曡〃
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("璁垮浜嬩欢鎺ㄩ�佽褰曡〃")
+@TableName("`visit_event`")
+public class VisitEvent {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浜嬩欢鍞竴鏍囪瘑锛屽悓涓�浜嬩欢鑻ヤ笂鎶ュ娆★紝鍒欎笂鎶ヤ簨浠剁殑eventId鐩稿悓")
+    private String eventId;
+
+    @ApiModelProperty(value = "浜嬩欢婧愮紪鍙凤紝鐗╃悊璁惧鏄祫婧愮紪鍙�")
+    private String srcIndex;
+
+    @ApiModelProperty(value = "浜嬩欢婧愮被鍨�")
+    private String srcType;
+
+    @ApiModelProperty(value = "浜嬩欢婧愬悕绉�")
+    private String srcName;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷锛堢櫥璁� 绛剧锛�")
+    private Integer eventType;
+
+    @ApiModelProperty(value = "浜嬩欢鐘舵��,0-鐬椂1-寮�濮�2-鍋滄4-浜嬩欢鑱斿姩缁撴灉鏇存柊5-浜嬩欢鍥剧墖寮傛涓婁紶", example = "1")
+    private Integer status;
+
+    @ApiModelProperty(value = "鑴夊啿瓒呮椂鏃堕棿")
+    private Integer timeout;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鏃堕棿锛堣澶囨椂闂�")
+    @ExcelColumn(name="浜嬩欢鏃堕棿",index = 9,width = 16)
+    private String happenTime;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鐨勪簨浠舵簮鐖惰澶�")
+    private String srcParentIndex;
+
+    @ApiModelProperty(value = "璁垮Is锛�,瀵瑰簲璁垮鏉ヨ璁板綍涓殑orderId瀛楁")
+    private String visitorId;
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelColumn(name="濮撳悕" ,index = 1,width = 10)
+    private String personName;
+
+    @ApiModelProperty(value = "鎬у埆 1-鐢�2-濂�", example = "1")
+    private Integer sex;
+
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 111韬唤璇�")
+    private Integer idType;
+
+    @ApiModelProperty(value = "璇佷欢鍙� ")
+    private String idNo;
+
+    @ApiModelProperty(value = "琚闂汉濮撳悕")
+    @ExcelColumn(name="琚闂汉濮撳悕",index = 6,width = 16)
+    private String beVisitedPersonName;
+
+    @ApiModelProperty(value = "琚闂汉鎵�灞炵粍缁�")
+    @ExcelColumn(name="琚闂汉缁勭粐",index = 7,width = 30)
+    private String beVisitedPersonOrg;
+
+    @ApiModelProperty(value = "鏉ヨ鍗曚綅")
+    @ExcelColumn(name="鍏徃",index = 4,width = 20)
+    private String visitorWorkUint;
+
+    @ApiModelProperty(value = "璁垮楠岃瘉鐮�")
+    private String visitorCode;
+
+    @ApiModelProperty(value = "鏉ヨ浜嬬敱")
+    private String purpose;
+
+    @ApiModelProperty(value = "璇佷欢绛惧彂鏈哄叧")
+    private String signOrg;
+
+    @ApiModelProperty(value = "鏉ヨ鏃堕棿")
+    private String startTime;
+
+    @ApiModelProperty(value = "绂诲紑鏃堕棿")
+    private String endTime;
+    @ApiModelProperty(value = "鎵嬫満鍙风爜")
+    @ExcelColumn(name="鎵嬫満鍙风爜",index = 2,width = 10)
+    private String phone;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    @ExcelColumn(name="杞︾墝鍙�",index = 5,width = 16)
+    private String carNo;
+
+    @ApiModelProperty(value = "鐓х墖uri")
+    private String photoUrl;
+
+    @ApiModelProperty(value = "鎶撴媿鍥緐ri")
+    private String captureUrl;
+
+    @ApiModelProperty(value = "鍥剧墖瀛樺偍鏈嶅姟鍣ㄥ敮涓�鏍囪瘑")
+    private String svrIndexCode;
+
+    @ApiModelProperty(value = "琚闂汉id")
+    private String beVisitedPersonId;
+
+    @ApiModelProperty(value = "琚闂汉鎵�灞炵粍缁噄d")
+    private String beVisitedPersonOrgId;
+
+    @ApiModelProperty(value = "璇佷欢鍙�")
+    @ExcelColumn(name="璇佷欢鍙�" ,index = 3,width = 16)
+    private String idcardDecode;
+
+    // 鏉′欢鏌ヨ鍙傛暟
+    @ApiModelProperty(value = "濮撳悕/鎵嬫満鍙�")
+    @TableField(exist = false)
+    private String keyWords;
+
+    @ApiModelProperty(value = "鍏徃/閮ㄩ棬鍚嶇О")
+    @TableField(exist = false)
+    private String companyName;
+
+    @ApiModelProperty(value = "缁熻鏁伴噺 ")
+    @TableField(exist = false)
+    private int num  ;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷鍚嶇О")
+    @TableField(exist = false)
+    @ExcelColumn(name="浜嬩欢绫诲瀷",index = 8,width = 16)
+    private String eventTypeName;
+
+    @ApiModelProperty(value = "鎶撴媿鍥緐ri瀹屾暣")
+    @TableField(exist = false)
+    private String captureUrlFull;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
new file mode 100644
index 0000000..9068475
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -0,0 +1,300 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 璁垮鐢宠淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("璁垮鐢宠淇℃伅琛�")
+@TableName("`visits`")
+public class Visits {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐢宠浜虹紪鐮侊紙鍏宠仈member琛�)", example = "1")
+    @ExcelColumn(name="鐢宠浜虹紪鐮侊紙鍏宠仈member琛�)")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "鎵�灞炵粍缁囩紪鐮�(鍏宠仈company琛�)", example = "1")
+    @ExcelColumn(name="鎵�灞炵粍缁囩紪鐮�(鍏宠仈company琛�)")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "浜鸿劯鐓х墖")
+    @ExcelColumn(name="浜鸿劯鐓х墖")
+    private String faceImg;
+
+    @ApiModelProperty(value = "鍋ュ悍鐮�")
+    @ExcelColumn(name="鍋ュ悍鐮�")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹� ", example = "1")
+    @ExcelColumn(name="绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹� ")
+    private Integer type;
+
+    @ApiModelProperty(value = "璁垮鍚嶇О")
+    @ExcelColumn(name="璁垮鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "璁垮骞撮緞")
+    @ExcelColumn(name="璁垮骞撮緞")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthday;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name="鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "浼佷笟鍚嶇О")
+    @ExcelColumn(name="浼佷笟鍚嶇О")
+    private String companyName;
+
+    @ApiModelProperty(value = "韬唤璇佸彿")
+    @ExcelColumn(name="韬唤璇佸彿")
+    private String idcardNo;
+
+    @ApiModelProperty(value = "宸ュ彿")
+    @ExcelColumn(name="宸ュ彿")
+    private String code;
+
+    @ApiModelProperty(value = "鐝 0鐧界彮 1澶滅彮", example = "1")
+    @ExcelColumn(name="鐝 0鐧界彮 1澶滅彮")
+    private Integer classes;
+
+    @ApiModelProperty(value = "闅忕▼浜哄憳鏁�", example = "1")
+    @ExcelColumn(name="闅忕▼浜哄憳鏁�")
+    private Integer memberNum;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "闂ㄧ鏈夋晥鏈熷紑濮�")
+    @ExcelColumn(name="闂ㄧ鏈夋晥鏈熷紑濮�")
+    private Date starttime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "闂ㄧ鏈夋晥鏈熸埅姝�")
+    @ExcelColumn(name="闂ㄧ鏈夋晥鏈熸埅姝�")
+    private Date endtime;
+    @ApiModelProperty(value = "杩涘巶鏃堕棿")
+    @ExcelColumn(name="杩涘巶鏃堕棿")
+    private Date inDate;
+    @ApiModelProperty(value = "绂诲満鏃堕棿")
+    @ExcelColumn(name="绂诲満鏃堕棿")
+    private Date outDate;
+    @ApiModelProperty(value = "绂诲満鏂瑰紡 0姝e父绛剧 1绠$悊鍛樻墜鍔ㄧ绂�")
+    @ExcelColumn(name="绂诲満鏂瑰紡 0姝e父绛剧 1绠$悊鍛樻墜鍔ㄧ绂�")
+    private Integer outType;
+    @ApiModelProperty(value = "寮哄埗绛剧绠$悊鍛樼紪鐮�")
+    @ExcelColumn(name="寮哄埗绛剧绠$悊鍛樼紪鐮�")
+    private Integer outUserId;
+    @ApiModelProperty(value = "绛剧澶囨敞")
+    @ExcelColumn(name="绛剧澶囨敞")
+    private String outInfo;
+
+    @ApiModelProperty(value = "鏉ヨ浜嬬敱")
+    @ExcelColumn(name="鏉ヨ浜嬬敱")
+    private String reason;
+
+    @ApiModelProperty(value = "鏄惁闇�瑕侀�夋嫨闂ㄧ 0涓嶉渶瑕� 1闇�瑕�", example = "1")
+    @ExcelColumn(name="鏄惁闇�瑕侀�夋嫨闂ㄧ 0涓嶉渶瑕� 1闇�瑕�")
+    private Integer doorSelect;
+
+    @ApiModelProperty(value = "闂ㄧ缂栫爜锛屽涓敤鑻辨枃閫楀彿闅斿紑")
+    @ExcelColumn(name="闂ㄧ缂栫爜锛屽涓敤鑻辨枃閫楀彿闅斿紑")
+    private String doors;
+
+    @ApiModelProperty(value = "鎺ュ緟浜哄憳", example = "1")
+    @ExcelColumn(name="鎺ュ緟浜哄憳")
+    private Integer receptMemberId;
+
+    @ApiModelProperty(value = "瀹℃牳鐘舵�� 0寰呭鏍� 1宸叉彁浜RP瀹℃壒  2瀹℃牳閫氳繃 3瀹℃牳涓嶉�氳繃 4鍙栨秷 5涓嬪彂鎴愬姛 6涓嬪彂澶辫触 7鎷滆涓� 8宸茬绂�", example = "1")
+    @ExcelColumn(name="瀹℃牳鐘舵�� 0寰呭鏍� 1宸叉彁浜RP瀹℃壒  2瀹℃牳閫氳繃 3瀹℃牳涓嶉�氳繃 4鍙栨秷 5涓嬪彂鎴愬姛 6涓嬪彂澶辫触 7鎷滆涓� 8宸茬绂�")
+    private Integer status;
+
+    @ApiModelProperty(value = "鍒濆浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒濆浜虹紪鐮�")
+    private Integer checkorId;
+
+    @ApiModelProperty(value = "鍒濆鏃堕棿")
+    @ExcelColumn(name="鍒濆鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date checkDate;
+
+    @ApiModelProperty(value = "鍒濆澶囨敞")
+    @ExcelColumn(name="鍒濆澶囨敞")
+    private String checkInfo;
+
+    @ApiModelProperty(value = "缁堝浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="缁堝浜虹紪鐮�")
+    private Integer endCheckorId;
+
+    @ApiModelProperty(value = "缁堝鏃堕棿")
+    @ExcelColumn(name="缁堝鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endCheckDate;
+
+    @ApiModelProperty(value = "缁堝澶囨敞")
+    @ExcelColumn(name="缁堝澶囨敞")
+    private String endCheckInfo;
+    @ApiModelProperty(value = "璇佷欢鏄剧ず淇℃伅")
+    @ExcelColumn(name="璇佷欢鏄剧ず淇℃伅")
+    private String idcardDecode;
+    @ApiModelProperty(value = "璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収", example = "1")
+    @ExcelColumn(name="璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収")
+    private Integer idcardType;
+    @ApiModelProperty(value = "鎬у埆 1鐢� 2濂� ", example = "1")
+    @ExcelColumn(name="鎬у埆 1鐢� 2濂�")
+    private Integer sex;
+    @ApiModelProperty(value = "杞︾墝鍙凤紝澶氫釜鐢ㄨ嫳鏂囬�楀彿闅斿紑")
+    @ExcelColumn(name="杞︾墝鍙凤紝澶氫釜鐢ㄨ嫳鏂囬�楀彿闅斿紑")
+    private String carNos;
+
+    @ApiModelProperty(value = "鐖剁骇鐢宠缂栫爜锛堣嚜鍏宠仈锛�", example = "1")
+    @ExcelColumn(name="鐖剁骇鐢宠缂栫爜锛堣嚜鍏宠仈锛�")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "绛旈璁板綍缂栫爜锛堝叧鑱攗ser_answer)", example = "1")
+    @ExcelColumn(name="绛旈璁板綍缂栫爜锛堝叧鑱攗ser_answer)")
+    private Integer userAnswerId;
+
+    @ApiModelProperty(value = "娴峰悍鏍囪瘑")
+    @ExcelColumn(name="娴峰悍鏍囪瘑")
+    private String hkId;
+    @ApiModelProperty(value = "openid")
+    @ExcelColumn(name="openid")
+    private String openid;
+    @ApiModelProperty(value = "璁垮浜岀淮鐮�")
+    @ExcelColumn(name="璁垮浜岀淮鐮�")
+    private String qrcode;
+
+
+    @ApiModelProperty(value = "璁垮棰勭害鏂瑰紡锛�0鐧昏棰勭害 1鍏嶇櫥璁伴绾�", example = "1")
+    @ExcelColumn(name="璁垮棰勭害鏂瑰紡锛�0鐧昏棰勭害 1鍏嶇櫥璁伴绾�")
+    private Integer visitType;
+
+    @ApiModelProperty(value = "娴峰悍鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝� ", example = "1")
+    @ExcelColumn(name="娴峰悍鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�")
+    private Integer hkStatus;
+
+    @ApiModelProperty(value = "娴峰悍鏈�杩戝悓姝ユ椂闂�")
+    @ExcelColumn(name="娴峰悍鏈�杩戝悓姝ユ椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date hkDate;
+
+    @ApiModelProperty(value = "ERP鐢宠璁板綍缂栫爜")
+    @ExcelColumn(name="ERP鐢宠璁板綍缂栫爜")
+    private String erpId;
+
+
+    @ApiModelProperty(value = "缁熻鏁伴噺 ")
+    @TableField(exist = false)
+    private int num  ;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮侊紙鍏宠仈member琛�)", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮侊紙鍏宠仈member琛�)")
+    private Integer createMemberId;
+
+    @ApiModelProperty(value = "鏉ユ簮绫诲瀷锛�0=鏈郴缁燂紱1=ERP", example = "1")
+    private Integer sourceType;
+
+    @ApiModelProperty(value = "鏅�氳瀹㈢敵璇烽殢璁夸汉鍛�")
+    @TableField(exist = false)
+    private List<Visits> withUserList;
+//    @ApiModelProperty(value = "鐝")
+//    private String memberClasses;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳", example = "1")
+    @TableField(exist = false)
+    private Integer memberType;
+    @ApiModelProperty(value = "鍔冲姟璁垮鐢宠闅忚浜哄憳")
+    @TableField(exist = false)
+    private List<Integer> lwWithUserList;
+
+
+
+    @ApiModelProperty(value = "鍥剧墖鍓嶇紑")
+    @TableField(exist = false)
+    private String prefixUrl;
+
+    @ApiModelProperty(value = "琚浜哄憳濮撳悕", example = "1")
+    @ExcelColumn(name="琚浜哄憳濮撳悕")
+    @TableField(exist = false)
+    private String receptMemberName;
+    @ApiModelProperty(value = "琚浜哄憳娴峰悍缂栫爜", example = "1")
+    @ExcelColumn(name="琚浜哄憳濮撳悕")
+    @TableField(exist = false)
+    private String receptMemberHkId;
+
+    @ApiModelProperty(value = "琚浜哄憳閮ㄩ棬", example = "1")
+    @ExcelColumn(name="琚浜哄憳閮ㄩ棬")
+    @TableField(exist = false)
+    private String receptMemberDepartment;
+
+    @ApiModelProperty(value = "闂ㄧ缁勯泦鍚�", example = "1")
+    @ExcelColumn(name="闂ㄧ缁勯泦鍚�")
+    @TableField(exist = false)
+    private List<DeviceRole> deviceRoleList;
+
+    @ApiModelProperty(value = "闅忚浜哄憳鍒楄〃", example = "1")
+    @ExcelColumn(name="闅忚浜哄憳鍒楄〃")
+    @TableField(exist = false)
+    private List<Visits> visitsList;
+
+    @ApiModelProperty(value = "瓒呮椂鏃堕暱", example = "1")
+    @TableField(exist = false)
+    private Integer timeOut;
+
+    @ApiModelProperty(value = "闅忚杞﹁締鏁伴噺", example = "1")
+    @TableField(exist = false)
+    private Integer carNum;
+
+    @ApiModelProperty(value = "瓒呮椂鐘舵��0鏈秴鏃讹紝1宸茶秴鏃讹紝2鍗冲皢瓒呮椂", example = "1")
+    @TableField(exist = false)
+    private Integer outStatus;
+
+    @ApiModelProperty(value = "绂诲満鐘舵�侊紱0=鏈鍦�", example = "1",hidden = true)
+    @TableField(exist = false)
+    private Integer levelStatus;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ApproveParamDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ApproveParamDataVO.java
new file mode 100644
index 0000000..b9a5778
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ApproveParamDataVO.java
@@ -0,0 +1,24 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.dao.business.model.ApproveParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 瀹℃壒妯$増閰嶇疆淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/12/28 11:46
+ */
+@Data
+public class ApproveParamDataVO {
+
+    @ApiModelProperty(value = "瀹℃壒浜哄憳閰嶇疆淇℃伅")
+    private List<ApproveParam> auditApproveList;
+
+    @ApiModelProperty(value = "鎶勯�佷汉鍛橀厤缃俊鎭�")
+    private ApproveParam  copyForConfig;
+
+}
+
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CompanyEconomicsVo.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CompanyEconomicsVo.java
new file mode 100644
index 0000000..08abf2a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CompanyEconomicsVo.java
@@ -0,0 +1,84 @@
+package com.doumee.dao.business.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel("鏁版嵁鏉冮檺鍒楄〃瑙嗗浘瀵硅薄")
+public class CompanyEconomicsVo {
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    @TableId(value = "id",type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "浼佷笟缂栫爜锛堝叧鑱攃ompany琛級", example = "1")
+    @ExcelColumn(name="浼佷笟缂栫爜锛堝叧鑱攃ompany琛級")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "浼佷笟缂栫爜锛堝叧鑱攃ompany琛級", example = "1")
+    @ExcelColumn(name="浼佷笟鍚嶇О锛堝叧鑱攃ompany琛級")
+    private String companyName;
+    @ApiModelProperty(value = "骞翠唤", example = "1")
+    @ExcelColumn(name="骞翠唤")
+    private Integer years;
+
+    @ApiModelProperty(value = "鎬昏祫浜э紙涓囧厓锛�", example = "1")
+    @ExcelColumn(name="鎬昏祫浜э紙涓囧厓锛�")
+    private BigDecimal assets;
+
+    @ApiModelProperty(value = "閿�鍞敹鍏ワ紙涓囧厓锛�", example = "1")
+    @ExcelColumn(name="閿�鍞敹鍏ワ紙涓囧厓锛�")
+    private BigDecimal income;
+
+    @ApiModelProperty(value = "璧勪骇璐熷�虹巼")
+    @ExcelColumn(name="璧勪骇璐熷�虹巼")
+    private String ratio;
+
+    @ApiModelProperty(value = "鐮斿彂璐圭敤锛堜竾鍏冿級", example = "1")
+    @ExcelColumn(name="鐮斿彂璐圭敤锛堜竾鍏冿級")
+    private BigDecimal develop;
+
+    @ApiModelProperty(value = "鍒╂鼎鎬婚锛堜竾鍏冿級", example = "1")
+    @ExcelColumn(name="鍒╂鼎鎬婚锛堜竾鍏冿級")
+    private BigDecimal profit;
+
+    @ApiModelProperty(value = "涓婄即绋庨噾锛堜竾鍏冿級", example = "1")
+    @ExcelColumn(name="涓婄即绋庨噾锛堜竾鍏冿級")
+    private BigDecimal taxes;
+
+    @ApiModelProperty(value = "浼佷笟浜烘暟", example = "1")
+    @ExcelColumn(name="浼佷笟浜烘暟")
+    private Integer employee;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProblemLogVo.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProblemLogVo.java
new file mode 100644
index 0000000..3376a7e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProblemLogVo.java
@@ -0,0 +1,37 @@
+package com.doumee.dao.business.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel("绛旈璁板綍瀵煎嚭瑙嗗浘")
+public class ProblemLogVo {
+
+    @ApiModelProperty(value = "绛旈浜哄鍚�")
+    @ExcelColumn(name="绛旈浜哄鍚�")
+    private String name;
+
+    @ApiModelProperty(value = "绛旈浜烘墜鏈哄悗")
+    @ExcelColumn(name="绛旈浜烘墜鏈哄悗")
+    private String phone;
+
+    @ApiModelProperty(value = "缁勭粐鍚嶇О")
+    @ExcelColumn(name="缁勭粐鍚嶇О")
+    private String companyName;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍔冲姟璁垮 1鏅�氳瀹�  2鍐呴儴浜哄憳")
+    @ExcelColumn(name="绫诲瀷")
+    @TableField(exist = false)
+    private String typeName;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/VisitEventVo.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/VisitEventVo.java
new file mode 100644
index 0000000..01db374
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/VisitEventVo.java
@@ -0,0 +1,47 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("璁垮鍑哄叆浜嬩欢瑙嗗浘")
+public class VisitEventVo {
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelColumn(name="濮撳悕")
+    private String personName;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    @ExcelColumn(name = "鎵嬫満鍙�")
+    private String personPhone;
+
+    @ApiModelProperty(value = "璇佷欢鍙� ")
+    @ExcelColumn(name = "韬唤璇佸彿鐮�")
+    private String idNo;
+
+    @ApiModelProperty(value = "浜哄憳缁勭粐鍏徃")
+    @ExcelColumn(name = "鍏徃")
+    private String personCompanyName;
+
+    @ApiModelProperty(value = "杞︾墝鍙�")
+    @ExcelColumn(name = "杞︾墝鍙�")
+    private String carNo;
+
+    @ApiModelProperty(value = "琚闂汉鎵�灞炵粍缁�")
+    private String beVisitedPersonOrg;
+
+    @ApiModelProperty(value = "琚闂汉濮撳悕")
+    @ExcelColumn(name = "琚浜�")
+    private String beVisitedPersonName;
+
+    @ApiModelProperty(value = "浜嬩欢绫诲瀷鍚嶇О")
+    @ExcelColumn(name = "浜嬩欢绫诲瀷")
+    private String eventTypeName;
+
+    @ApiModelProperty(value = "浜嬩欢鍙戠敓鏃堕棿锛堣澶囨椂闂�")
+    @ExcelColumn(name = "浜嬩欢鏃堕棿")
+    private String happenTime;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AccountLoginDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AccountLoginDTO.java
new file mode 100644
index 0000000..95b38f6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AccountLoginDTO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.web.reqeust;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/12/7 11:19
+ */
+@Data
+public class AccountLoginDTO {
+
+    @NotBlank(message = "韬唤璇佸彿鐮佹湭褰曞叆")
+    @ApiModelProperty(value = "韬唤璇佸彿鐮�")
+    private String account;
+
+    @NotBlank(message = "瀵嗙爜鏈綍鍏�")
+    @ApiModelProperty(value = "瀵嗙爜")
+    private String password;
+
+    @ApiModelProperty(value = "openId")
+    private String openId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitMemberDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitMemberDTO.java
new file mode 100644
index 0000000..33b2e09
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitMemberDTO.java
@@ -0,0 +1,22 @@
+package com.doumee.dao.web.reqeust;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/12/7 11:19
+ */
+@Data
+public class VisitMemberDTO {
+
+    @ApiModelProperty(value = "鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitRecordDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitRecordDTO.java
new file mode 100644
index 0000000..5613c7d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitRecordDTO.java
@@ -0,0 +1,37 @@
+package com.doumee.dao.web.reqeust;
+
+import com.doumee.core.utils.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/12/7 11:19
+ */
+@Data
+public class VisitRecordDTO {
+
+    @ApiModelProperty(value = "鏉ヨ浜哄憳鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿寮�濮� yyyy-MM-dd HH:mm:ss")
+    private String createTimeS;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿缁撴潫 yyyy-MM-dd HH:mm:ss")
+    private String createTimeE;
+
+    @ApiModelProperty(value = "璁垮璁板綍绫诲瀷: 0鍔冲姟璁垮 1鏅�氳瀹�")
+    private Integer type;
+
+    @ApiModelProperty(value = "鏌ヨ鐘舵�侊細0=寰呭鎵癸紱1=宸插鎵癸紱2=鎴戝彂璧风殑")
+    private Integer state;
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭",hidden = true)
+    private Integer memberId;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ApproveVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ApproveVO.java
new file mode 100644
index 0000000..b3ba322
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ApproveVO.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.web.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ApproveVO {
+
+    @ApiModelProperty(value = "涓婚敭")
+    private Integer id;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ProblemsVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ProblemsVO.java
new file mode 100644
index 0000000..28424f1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/ProblemsVO.java
@@ -0,0 +1,43 @@
+package com.doumee.dao.web.response;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/12/7 11:19
+ */
+@Data
+public class ProblemsVO {
+
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    private Integer id;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "棰樼洰")
+    private String title;
+
+    @ApiModelProperty(value = "閫夐」闆嗗悎")
+    private String options;
+
+    @ApiModelProperty(value = "姝g‘绛旀")
+    private String answer;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍗曢�� 1澶氶�� ", example = "1")
+    private Integer type;
+
+    @ApiModelProperty(value = "鍒嗗��", example = "1")
+    private BigDecimal score;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java
new file mode 100644
index 0000000..d773779
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java
@@ -0,0 +1,107 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Approve;
+import com.doumee.dao.web.response.InternalHomeVO;
+
+import java.util.List;
+
+/**
+ * 瀹℃壒淇℃伅璁板綍琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/12/28 14:09
+ */
+public interface ApproveService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param approve 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Approve approve);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param approve 瀹炰綋瀵硅薄
+     */
+    void delete(Approve approve);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param approve 瀹炰綋瀵硅薄
+     */
+    void updateById(Approve approve);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param approves 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Approve> approves);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Approve
+     */
+    Approve findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param approve 瀹炰綋瀵硅薄
+     * @return Approve
+     */
+    Approve findOne(Approve approve);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param approve 瀹炰綋瀵硅薄
+     * @return List<Approve>
+     */
+    List<Approve> findList(Approve approve);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Approve>
+     */
+    PageData<Approve> findPage(PageWrap<Approve> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param approve 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Approve approve);
+
+
+    /**
+     * 鑾峰彇鍐呴儴浜哄憳棣栭〉鏁版嵁
+     * @param memberId
+     * @return
+     */
+    InternalHomeVO getHomeData(Integer memberId);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CarEventService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CarEventService.java
new file mode 100644
index 0000000..0d49e34
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CarEventService.java
@@ -0,0 +1,114 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.admin.response.CarEventDTO;
+import com.doumee.dao.business.model.CarEvent;
+import com.doumee.dao.business.vo.CarEventVo;
+
+import java.util.List;
+
+/**
+ * 鍋滆溅鍦轰簨浠舵帹閫佽褰曡〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface CarEventService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param carEvent 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(CarEvent carEvent);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+    /**
+     * 鍒犻櫎
+     *
+     * @param carEvent 瀹炰綋瀵硅薄
+     */
+    void delete(CarEvent carEvent);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param carEvent 瀹炰綋瀵硅薄
+     */
+    void updateById(CarEvent carEvent);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param carEvents 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<CarEvent> carEvents);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return CarEvent
+     */
+    CarEvent findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param carEvent 瀹炰綋瀵硅薄
+     * @return CarEvent
+     */
+    CarEvent findOne(CarEvent carEvent);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param carEvent 瀹炰綋瀵硅薄
+     * @return List<CarEvent>
+     */
+    List<CarEvent> findList(CarEvent carEvent);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<CarEvent>
+     */
+    PageData<CarEvent> findPage(PageWrap<CarEvent> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param carEvent 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(CarEvent carEvent);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<CarEvent>
+     */
+    PageData<CarEventDTO> findVisitCarPage(PageWrap<CarEvent> pageWrap);
+
+    /**
+     * 瀵煎嚭
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<CarEventVo>
+     */
+    List<CarEventVo> findPageExcel(PageWrap<CarEvent> pageWrap);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CompanyService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CompanyService.java
new file mode 100644
index 0000000..a2baf7c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CompanyService.java
@@ -0,0 +1,127 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.admin.request.UpdateCompanySortDTO;
+import com.doumee.dao.admin.response.CompanyDTO;
+import com.doumee.dao.business.model.Company;
+import java.util.List;
+
+/**
+ * 浼佷笟淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface CompanyService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Company company);
+
+    /**
+     * 鍒涘缓鍔冲姟鍏徃
+     * @param company
+     * @return
+     */
+    Integer createLaborServices(Company company);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param company 瀹炰綋瀵硅薄
+     */
+    void delete(Company company);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param company 瀹炰綋瀵硅薄
+     */
+    void updateById(Company company);
+
+
+    /**
+     * 淇敼鍔冲姟鍏徃
+     * @param company
+     * @return
+     */
+    Integer updateLaborServicesById(Company company);
+
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param companys 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Company> companys);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Company
+     */
+    Company findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return Company
+     */
+    Company findOne(Company company);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return List<Company>
+     */
+    List<Company> findList(Company company);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Company>
+     */
+    PageData<Company> findPage(PageWrap<Company> pageWrap);
+
+    void updateStatusById(Company company);
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param company 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Company company);
+
+    /**
+     * 鏌ヨ閮ㄩ棬鍙婂叾瀛愰儴闂ㄤ俊鎭�
+     * @param type 0 鏌ヨ鎵�鏈変俊鎭� 1 鏌ヨ鍐呴儴淇℃伅
+     * @return
+     */
+    List<CompanyDTO> findCompanyTreePage(Integer type);
+
+    List<Company> companyTree(Integer type);
+
+    void updateSort(UpdateCompanySortDTO dto);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
new file mode 100644
index 0000000..272e3e1
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
@@ -0,0 +1,107 @@
+package com.doumee.service.business;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Device;
+import java.util.List;
+
+/**
+ * 璁惧淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface DeviceService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param device 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Device device);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param device 瀹炰綋瀵硅薄
+     */
+    void delete(Device device);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param device 瀹炰綋瀵硅薄
+     */
+    void updateById(Device device);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param devices 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Device> devices);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Device
+     */
+    Device findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param device 瀹炰綋瀵硅薄
+     * @return Device
+     */
+    Device findOne(Device device);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param device 瀹炰綋瀵硅薄
+     * @return List<Device>
+     */
+    List<Device> findList(Device device);
+
+    /**
+     * 鏍规嵁鏉′欢鏌ヨ,鎵�鏈夐棬绂佺殑ID鍜屽悕绉�
+     * @param device
+     * @return
+     */
+    List<Device> findIdAndNameList(Device device);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Device>
+     */
+    PageData<Device> findPage(PageWrap<Device> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param device 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Device device);
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/InterfaceLogService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/InterfaceLogService.java
new file mode 100644
index 0000000..01d40d7
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/InterfaceLogService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.InterfaceLog;
+import java.util.List;
+
+/**
+ * 涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface InterfaceLogService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(InterfaceLog interfaceLog);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     */
+    void delete(InterfaceLog interfaceLog);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     */
+    void updateById(InterfaceLog interfaceLog);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param interfaceLogs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<InterfaceLog> interfaceLogs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return InterfaceLog
+     */
+    InterfaceLog findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return InterfaceLog
+     */
+    InterfaceLog findOne(InterfaceLog interfaceLog);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return List<InterfaceLog>
+     */
+    List<InterfaceLog> findList(InterfaceLog interfaceLog);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<InterfaceLog>
+     */
+    PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(InterfaceLog interfaceLog);
+
+    void clearThreeMonthLog();
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberCardService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberCardService.java
new file mode 100644
index 0000000..1f256fa
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberCardService.java
@@ -0,0 +1,103 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.MemberCard;
+
+import java.util.List;
+
+/**
+ * 鐢ㄦ埛鍗$墖缁戝畾淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface MemberCardService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param memberCard 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(MemberCard memberCard);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param memberCard 瀹炰綋瀵硅薄
+     */
+    void delete(MemberCard memberCard);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param memberCard 瀹炰綋瀵硅薄
+     */
+    void updateById(MemberCard memberCard);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param memberCards 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<MemberCard> memberCards,Integer type);
+
+
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return MemberCard
+     */
+    MemberCard findById(Integer id);
+
+    void  updateRefundCard(MemberCard memberCard);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param memberCard 瀹炰綋瀵硅薄
+     * @return MemberCard
+     */
+    MemberCard findOne(MemberCard memberCard);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param memberCard 瀹炰綋瀵硅薄
+     * @return List<MemberCard>
+     */
+    List<MemberCard> findList(MemberCard memberCard);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<MemberCard>
+     */
+    PageData<MemberCard> findPage(PageWrap<MemberCard> pageWrap);
+    void dealMemberRoleEmpowerById(Integer memberId );
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param memberCard 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(MemberCard memberCard);
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
new file mode 100644
index 0000000..4236800
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -0,0 +1,210 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.admin.request.LaborEmpowerDTO;
+import com.doumee.dao.admin.request.LaborMemberDTO;
+import com.doumee.dao.admin.request.MemberQuery;
+import com.doumee.dao.admin.response.MemberInfoDTO;
+import com.doumee.dao.admin.response.StagingDataVO;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.web.reqeust.AccountLoginDTO;
+import com.doumee.dao.web.reqeust.CheckVisitedDTO;
+import com.doumee.dao.web.reqeust.VisitMemberDTO;
+import com.doumee.dao.web.response.MemberVO;
+import com.doumee.dao.web.response.WxAuthorizeVO;
+
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface MemberService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Member member);
+
+    /**
+     *
+     * 鍒涘缓鍔冲姟浜哄憳淇℃伅
+     * @param member
+     * @return
+     */
+    Integer laborMemberCreate(LaborMemberDTO member);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    void roleAuthById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param member 瀹炰綋瀵硅薄
+     */
+    void delete(Member member);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    void batchBlock(List<Integer> ids,Integer type);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param member 瀹炰綋瀵硅薄
+     */
+    void updateById(Member member);
+    void updateFace(Member member);
+
+
+    /**
+     * 涓婚敭鏇存柊鍔冲姟浜哄憳鐘舵��
+     *
+     * @param member 瀹炰綋瀵硅薄
+     */
+    void updateStatusById(Member member);
+
+    void updateVisitsStatusById(Member member);
+
+    void updateRemoveStatusById(List<Member> members);
+
+    void updateCanVisitById(Member member);
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param members 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Member> members);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Member
+     */
+    Member findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return Member
+     */
+    Member findOne(Member member);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return List<Member>
+     */
+    List<Member> findList(Member member);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Member>
+     */
+    PageData<Member> findPage(PageWrap<Member> pageWrap);
+
+
+
+    /**
+     * 鍒嗛〉鍔冲姟鐢ㄦ埛淇℃伅鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Member>
+     */
+    PageData<MemberInfoDTO> findLaborMemberInfoPage(PageWrap<MemberInfoDTO> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param member 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Member member);
+
+
+    /**
+     * 瀵煎叆鍔冲姟浜哄憳闂ㄧ淇℃伅
+     * @param laborEmpowerDTO
+     * @return
+     */
+    void importMemberBatch(LaborEmpowerDTO laborEmpowerDTO);
+
+
+    /**
+     *
+     * 鍒嗛〉鏌ヨ鍐呴儴浜哄憳淇℃伅
+     * @param pageWrap
+     * @return
+     */
+    PageData<MemberInfoDTO> findMemberInfoPage(PageWrap<MemberQuery> pageWrap);
+
+    PageData<MemberInfoDTO> findVisitPage(PageWrap<MemberQuery> pageWrap);
+
+    PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap);
+
+    /**
+     * 瀹氭椂鍐荤粨鍐呴儴浜哄憳
+     */
+    void memberFreeze();
+    /********************************************鍏紬鍙锋帴鍙�***********************************************************************/
+
+
+    /**
+     * 寰俊鎺堟潈鎺ュ彛
+     * @param code
+     * @return
+     */
+    WxAuthorizeVO wxAuthorize(String code);
+
+
+
+    MemberVO getVisitedMember(CheckVisitedDTO checkVisitedDTO);
+
+
+    /**
+     * 璐﹀彿瀵嗙爜
+     * 鍐呴儴浜哄憳/鍔冲姟璁垮鐧诲綍
+     * @param accountLoginDTO
+     * @return
+     */
+    WxAuthorizeVO accountLogin(AccountLoginDTO accountLoginDTO);
+
+    /**
+     * 鍐呴儴鍙嫓璁夸汉鍛樺垎椤�
+     * @param param
+     * @return
+     */
+    PageData<MemberVO> getVisitedMemberList(PageWrap<VisitMemberDTO> param);
+
+    /**
+     * 琛ュ厖鏁版嵁
+     */
+    StagingDataVO stagingHead(StagingDataVO stagingHeadVO);
+
+    StagingDataVO stagingBody(StagingDataVO stagingHeadVO);
+
+    void empowerByList(Member member);
+
+    void delHkForce(Member member);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ProblemsService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ProblemsService.java
new file mode 100644
index 0000000..64367d5
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ProblemsService.java
@@ -0,0 +1,115 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.admin.response.ProblemDTO;
+import com.doumee.dao.business.model.Problems;
+import com.doumee.dao.web.response.ProblemsVO;
+
+import java.util.List;
+
+/**
+ * 璇曢淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface ProblemsService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param problems 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Problems problems);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param problems 瀹炰綋瀵硅薄
+     */
+    void delete(Problems problems);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param problems 瀹炰綋瀵硅薄
+     */
+    void updateById(Problems problems);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param problemss 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Problems> problemss);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Problems
+     */
+    Problems findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param problems 瀹炰綋瀵硅薄
+     * @return Problems
+     */
+    Problems findOne(Problems problems);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param problems 瀹炰綋瀵硅薄
+     * @return List<Problems>
+     */
+    List<Problems> findList(Problems problems);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Problems>
+     */
+    PageData<Problems> findPage(PageWrap<Problems> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param problems 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Problems problems);
+
+
+    /**
+     * 鑾峰彇棰樼洰淇℃伅
+     * @param useType
+     * @return
+     */
+    List<ProblemsVO> getProblemsVO(Integer useType);
+
+    /**
+     * 鑾峰彇涓嶅悓鐢ㄦ埛绫诲瀷鐨勯鐩�
+     * @param useType
+     * @return
+     */
+    List<ProblemDTO> findListByUseType(Integer useType);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/TrainTimeService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/TrainTimeService.java
new file mode 100644
index 0000000..d2b202f
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/TrainTimeService.java
@@ -0,0 +1,98 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.admin.request.RetentionQuery;
+import com.doumee.dao.business.model.TrainTime;
+import java.util.List;
+
+/**
+ * 浜哄憳鍩硅鏈夋晥鏈熻褰昐ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface TrainTimeService {
+
+    /**
+     * 鍒涘缓
+     *
+     * @param trainTime 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(TrainTime trainTime);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param trainTime 瀹炰綋瀵硅薄
+     */
+    void delete(TrainTime trainTime);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param trainTime 瀹炰綋瀵硅薄
+     */
+    void updateById(TrainTime trainTime);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param trainTimes 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<TrainTime> trainTimes);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return TrainTime
+     */
+    TrainTime findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param trainTime 瀹炰綋瀵硅薄
+     * @return TrainTime
+     */
+    TrainTime findOne(TrainTime trainTime);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param trainTime 瀹炰綋瀵硅薄
+     * @return List<TrainTime>
+     */
+    List<TrainTime> findList(TrainTime trainTime);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<TrainTime>
+     */
+    PageData<TrainTime> findPage(PageWrap<TrainTime> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param trainTime 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(TrainTime trainTime);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
new file mode 100644
index 0000000..7af1926
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -0,0 +1,86 @@
+package com.doumee.service.business.ext;
+
+import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
+import com.doumee.core.haikang.model.param.request.DoorsListRequest;
+import com.doumee.core.haikang.model.param.request.ParkListRequest;
+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.EventVisitRequest;
+import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
+import com.doumee.dao.business.model.ParkBook;
+import io.swagger.models.auth.In;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+
+/**
+ * 鍋滆溅鍦轰簨浠舵帹閫佽褰曡〃Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface HkSyncService {
+    /**
+     * 鍚屾娴峰悍闂ㄧ璁惧
+     * @param param
+     * @return
+     */
+    String syncHkDevices(AcsDeviceListRequest param);
+
+    /**
+     * 鍚屾娴峰悍鍋滆溅搴�
+     * @param param
+     * @return
+     */
+
+    String syncHkParks(ParkListRequest param);
+
+    /**
+     * 鍚屾娴峰悍闂ㄧ鐐瑰垪琛ㄤ俊鎭紙鏆傛棤鐢級
+     * @param param
+     * @return
+     */
+    String syncDoors(DoorsListRequest param);
+
+    /**
+     * 鍚屾娴峰悍璁垮鏉冮檺缁�
+     * @param param
+     * @return
+     */
+    String syncPrivilege(PrivilegeGroupRequest param);
+
+
+    String dealAcsEvent(EventAcsRequest param, HttpServletResponse response);
+
+    String dealVisitEvent(EventVisitRequest param, HttpServletResponse response);
+
+    String dealParkEvent(EventParkRequest param, HttpServletResponse response);
+    String downHKImgs(int type);
+    void cancelEventSub();
+
+    void syncOrgData();
+
+    void syncUserData();
+    void syncVistAppointData(Date date);
+    void syncVehicleData();
+    void syncVehicleUpdateData(Date date);
+    void syncUserUpdateData(Date start, Date end);
+
+    void syncOrgUpdateData(Date start, Date end);
+
+    void syncVisitData();
+    void getOutTimeVisitRecord( );
+    Integer syncEmpowerData(Integer startPage);
+    Integer syncEmpowerFailData(Integer startPage);
+    void syncEmpowerDataNew(int start,int end);
+    void syncParkBookData();
+    void syncParkBookBySingleModel(ParkBook c);
+    Integer syncEmpowerResultData(Integer endId);
+    Integer   syncEmpowerDetailData(Integer endId);
+    void syncParkRecords(Date date);
+    void getAscDeviceStatus();
+
+    void syncMemberFailData();
+
+    void syncMemberDelData();
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
new file mode 100644
index 0000000..e4859e6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -0,0 +1,198 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.biz.system.SystemDictDataBiz;
+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.ApproveMapper;
+import com.doumee.dao.business.model.Approve;
+import com.doumee.dao.web.response.InternalHomeVO;
+import com.doumee.service.business.ApproveService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 瀹℃壒淇℃伅璁板綍琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/12/28 14:09
+ */
+@Service
+public class ApproveServiceImpl implements ApproveService {
+
+    @Autowired
+    private ApproveMapper approveMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    public Integer create(Approve approve) {
+        approveMapper.insert(approve);
+        return approve.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        approveMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Approve approve) {
+        UpdateWrapper<Approve> deleteWrapper = new UpdateWrapper<>(approve);
+        approveMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        approveMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Approve approve) {
+        approveMapper.updateById(approve);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Approve> approves) {
+        if (CollectionUtils.isEmpty(approves)) {
+            return;
+        }
+        for (Approve approve: approves) {
+            this.updateById(approve);
+        }
+    }
+
+    @Override
+    public Approve findById(Integer id) {
+        return approveMapper.selectById(id);
+    }
+
+    @Override
+    public Approve findOne(Approve approve) {
+        QueryWrapper<Approve> wrapper = new QueryWrapper<>(approve);
+        return approveMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Approve> findList(Approve approve) {
+        QueryWrapper<Approve> wrapper = new QueryWrapper<>(approve);
+        return approveMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Approve> findPage(PageWrap<Approve> pageWrap) {
+        IPage<Approve> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Approve> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Approve::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(Approve::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(Approve::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(Approve::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEdirot() != null) {
+            queryWrapper.lambda().eq(Approve::getEdirot, pageWrap.getModel().getEdirot());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(Approve::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(Approve::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(Approve::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(Approve::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getChekorId() != null) {
+            queryWrapper.lambda().eq(Approve::getChekorId, pageWrap.getModel().getChekorId());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().eq(Approve::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getTemplatId() != null) {
+            queryWrapper.lambda().eq(Approve::getTemplatId, pageWrap.getModel().getTemplatId());
+        }
+        if (pageWrap.getModel().getErpId() != null) {
+            queryWrapper.lambda().eq(Approve::getErpId, pageWrap.getModel().getErpId());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(Approve::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getStatusInfo() != null) {
+            queryWrapper.lambda().eq(Approve::getStatusInfo, pageWrap.getModel().getStatusInfo());
+        }
+        if (pageWrap.getModel().getCheckInfo() != null) {
+            queryWrapper.lambda().eq(Approve::getCheckInfo, pageWrap.getModel().getCheckInfo());
+        }
+        if (pageWrap.getModel().getCheorId() != null) {
+            queryWrapper.lambda().eq(Approve::getCheorId, pageWrap.getModel().getCheorId());
+        }
+        if (pageWrap.getModel().getCheckorName() != null) {
+            queryWrapper.lambda().eq(Approve::getCheckorName, pageWrap.getModel().getCheckorName());
+        }
+        if (pageWrap.getModel().getIsEndCheck() != null) {
+            queryWrapper.lambda().eq(Approve::getIsEndCheck, pageWrap.getModel().getIsEndCheck());
+        }
+        if (pageWrap.getModel().getVisitId() != null) {
+            queryWrapper.lambda().eq(Approve::getVisitId, pageWrap.getModel().getVisitId());
+        }
+        if (pageWrap.getModel().getLevel() != null) {
+            queryWrapper.lambda().eq(Approve::getLevel, pageWrap.getModel().getLevel());
+        }
+        if (pageWrap.getModel().getApproveType() != null) {
+            queryWrapper.lambda().eq(Approve::getApproveType, pageWrap.getModel().getApproveType());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(approveMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Approve approve) {
+        QueryWrapper<Approve> wrapper = new QueryWrapper<>(approve);
+        return approveMapper.selectCount(wrapper);
+    }
+
+
+
+    /**
+     * 鍐呴儴浜哄憳H5椤甸潰棣栭〉
+     * @param memberId
+     * @return
+     */
+    @Override
+    public InternalHomeVO getHomeData(Integer memberId){
+        InternalHomeVO internalHomeVO = new InternalHomeVO();
+        internalHomeVO.setHomeImg(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.HOME_IMAGE).getCode());
+        internalHomeVO.setTaskNum(approveMapper.selectCount(new QueryWrapper<Approve>().lambda().eq(Approve::getChekorId,memberId).eq(Approve::getStatus,Constants.ZERO)));
+        return internalHomeVO;
+    }
+
+
+
+
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
new file mode 100644
index 0000000..4a8efab
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
@@ -0,0 +1,164 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.admin.request.CarsQuery;
+import com.doumee.dao.admin.response.CarsDTO;
+import com.doumee.dao.admin.response.MemberInfoDTO;
+import com.doumee.dao.business.CarsMapper;
+import com.doumee.dao.business.join.CarJoinMapper;
+import com.doumee.dao.business.join.ParkBookJoinMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.service.business.CarsService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 杞﹁締淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class CarsServiceImpl implements CarsService {
+
+    @Autowired
+    private CarsMapper carsMapper;
+
+    @Autowired
+    private CarJoinMapper carJoinMapper;
+
+    @Autowired
+    private ParkBookJoinMapper parkBookJoinMapper;
+
+    @Override
+    public Integer create(Cars cars) {
+        carsMapper.insert(cars);
+        return cars.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        carsMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Cars cars) {
+        UpdateWrapper<Cars> deleteWrapper = new UpdateWrapper<>(cars);
+        carsMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        carsMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Cars cars) {
+        carsMapper.updateById(cars);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Cars> carss) {
+        if (CollectionUtils.isEmpty(carss)) {
+            return;
+        }
+        for (Cars cars: carss) {
+            this.updateById(cars);
+        }
+    }
+
+    @Override
+    public Cars findById(Integer id) {
+        return carsMapper.selectById(id);
+    }
+
+    @Override
+    public Cars findOne(Cars cars) {
+        QueryWrapper<Cars> wrapper = new QueryWrapper<>(cars);
+        return carsMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Cars> findList(Cars cars) {
+        QueryWrapper<Cars> wrapper = new QueryWrapper<>(cars);
+        return carsMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Cars> findPage(PageWrap<Cars> pageWrap) {
+
+
+        IPage<Cars> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Cars> queryWrapper = new MPJLambdaWrapper<>();
+
+        queryWrapper.selectAll(Cars.class);
+        queryWrapper.selectAs(Parks::getName,Cars::getParksName);
+        queryWrapper.selectAs(Member::getType,Cars::getMemberType);
+        queryWrapper.selectAs(Member::getName,Cars::getMemberName);
+        queryWrapper.selectAs(Member::getPhone,Cars::getMemberPhone);
+        queryWrapper.selectAs(Company::getName,Cars::getCompanyName);
+
+        queryWrapper.leftJoin(Parks.class,Parks::getId,Cars::getParkId);
+        queryWrapper.leftJoin(Member.class,Member::getId,Cars::getMemberId);
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+
+
+        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
+                .or().like(Member::getPhone,pageWrap.getModel().getMemberName()));
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName());
+        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getMemberType()),Member::getType,pageWrap.getModel().getMemberType());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()),Cars::getCode,pageWrap.getModel().getCode());
+        queryWrapper.eq(Cars::getIsdeleted,Constants.ZERO);
+
+        queryWrapper.orderByDesc(Cars::getCreateDate);
+        IPage<Cars> result = carJoinMapper.selectJoinPage(page, Cars.class,queryWrapper);
+        return PageData.from(result);
+    }
+
+    @Override
+    public long count(Cars cars) {
+        QueryWrapper<Cars> wrapper = new QueryWrapper<>(cars);
+        return carsMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public PageData<CarsDTO> findCarPage(PageWrap<CarsQuery> pageWrap) {
+        MPJLambdaWrapper<ParkBook> wrapper = new MPJLambdaWrapper<>();
+        IPage<Cars> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        Utils.MP.blankToNull(pageWrap.getModel());
+        wrapper.leftJoin(Member.class,Member::getId,ParkBook::getMemberId)
+                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
+                .leftJoin(Parks.class,Parks::getId,ParkBook::getParkId);
+        wrapper.selectAs(ParkBook::getCarCode,CarsDTO::getCode)
+                .selectAs(ParkBook::getParkId,CarsDTO::getParkId)
+                .selectAs(ParkBook::getRemark,CarsDTO::getRemark)
+                .selectAs(Parks::getName,CarsDTO::getParkName)
+                .selectAs(ParkBook::getMemberId,CarsDTO::getMemberId)
+                .selectAs(Member::getName,CarsDTO::getMemberName)
+                .selectAs(Member::getType,CarsDTO::getMemberType)
+                .selectAs(Company::getName,CarsDTO::getCompanyName)
+                .selectAs(ParkBook::getTimeType,CarsDTO::getTimeType)
+                .selectAs(ParkBook::getStartTime,CarsDTO::getStartTime)
+                .selectAs(ParkBook::getEndTime,CarsDTO::getEndTime)
+                .selectAs(ParkBook::getCreateDate,CarsDTO::getCreateDate);
+        wrapper.orderByDesc(ParkBook::getCreateDate);
+        IPage<CarsDTO> carsDTOIPage = parkBookJoinMapper.selectJoinPage(page, CarsDTO.class, wrapper);
+
+        return PageData.from(carsDTOIPage);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
new file mode 100644
index 0000000..8e15e01
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -0,0 +1,583 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.DataSyncConfig;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.OrgAddRequest;
+import com.doumee.core.haikang.model.param.request.OrgDelRequest;
+import com.doumee.core.haikang.model.param.request.OrgEditRequest;
+import com.doumee.core.haikang.model.param.respose.OrgOrUserAddResponse;
+import com.doumee.core.haikang.model.param.respose.OrgUpdateFailureResponse;
+import com.doumee.core.haikang.service.HKService;
+import com.doumee.core.model.LoginUserInfo;
+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.admin.request.UpdateCompanySortDTO;
+import com.doumee.dao.admin.response.CompanyDTO;
+import com.doumee.dao.business.CompanyMapper;
+import com.doumee.dao.business.join.CompanyJoinMapper;
+import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Company;
+import com.doumee.dao.business.model.Member;
+import com.doumee.service.business.CompanyService;
+import com.doumee.dao.business.vo.CompanyTree;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 浼佷笟淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private DataSyncConfig dataSyncConfig;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private CompanyJoinMapper companyJoinMapper;
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public Integer create(Company company) {
+        if(StringUtils.isBlank(company.getName())){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鏌ヨ鍚嶇О涓嶈兘閲嶅
+        if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
+//                .eq(Company::getType,Constants.ONE)
+                .eq(Company::getName,company.getName())
+                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝缁勭粐鍚嶇О涓嶈兘閲嶅~");
+        }
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        String rootOrgId = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode();
+        company.setHkParentId(rootOrgId);
+        if(company.getParentId() !=null){
+            Company parent = findById(company.getParentId());
+            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
+                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇缁勭粐淇℃伅涓嶅瓨鍦▇");
+            }
+            if(StringUtils.isBlank(parent.getHkId())){
+                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇缁勭粐淇℃伅灏氭湭鍚屾涓嬪彂鎴愬姛~");
+            }
+            company.setHkParentId(parent.getHkId());
+        }
+        company.setCreateDate(new Date());
+        company.setCreator(user.getId());
+        company.setIsdeleted(Constants.ZERO);
+        company.setHkStatus(Constants.ONE);
+        company.setStatus(Constants.ZERO);
+        company.setHkDate(company.getHkDate());
+        company.setHkId(UUID.randomUUID().toString().replace("-",""));
+
+        companyMapper.insert(company);
+        //涓嬪彂娴峰悍瀹夐槻骞冲彴
+        if(!addHkOrg(company)){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+        return company.getId();
+    }
+
+    private boolean addHkOrg(Company company) {
+        List<OrgAddRequest> addList = new ArrayList<>();
+        addList.add(getOrgAddModel(company));
+
+        BaseResponse<OrgOrUserAddResponse> result =  HKService.addBatchOrg(addList);
+        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
+            OrgOrUserAddResponse data = result.getData();
+            if(data.getSuccesses()!=null && data.getSuccesses().size()>0){
+                //澶勭悊鏂板鎴愬姛鐨勬暟鎹紝淇敼娴峰悍鍚屾鐘舵��
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    private boolean editHkOrg(Company company) {
+        OrgEditRequest request = (getOrgHkEditModel(company));
+        BaseResponse result =  HKService.editOrg(request);
+        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
+                //澶勭悊鏂板鎴愬姛鐨勬暟鎹紝淇敼娴峰悍鍚屾鐘舵��
+                return true;
+        }
+        return false;
+    }
+    private boolean delHkOrg(Company company) {
+        OrgDelRequest request =new OrgDelRequest();
+        request.setIndexCodes(new String[]{company.getHkId()});
+        BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
+        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
+                //澶勭悊鏂板鎴愬姛鐨勬暟鎹紝淇敼娴峰悍鍚屾鐘舵��
+            if(result.getData()!=null && result.getData().size()==0){
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    private OrgAddRequest getOrgAddModel(Company c ) {
+        OrgAddRequest model = new OrgAddRequest();
+        model.setOrgIndexCode(c.getHkId());
+        model.setOrgName(c.getName());
+//        model.setOrgCode(c.getCode());
+        model.setParentIndexCode(c.getHkParentId());
+        return  model;
+    }
+    private OrgEditRequest getOrgHkEditModel(Company c ) {
+        OrgEditRequest model = new OrgEditRequest();
+        model.setOrgIndexCode(c.getHkId());
+        model.setOrgName(c.getName());
+        return  model;
+    }
+    @Override
+    public Integer createLaborServices(Company company) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        checkUnique(company);
+        Company insert = new Company();
+        insert.setCreator(loginUserInfo.getId());
+        insert.setCreateDate(new Date());
+        insert.setEditor(loginUserInfo.getId());
+        insert.setEditDate(new Date());
+        insert.setIsdeleted(Constants.ZERO);
+        insert.setName(company.getName());
+        insert.setRemark(company.getRemark());
+        insert.setStatus(Constants.ZERO);
+        insert.setSortnum(company.getSortnum());
+        insert.setImgurl(company.getImgurl());
+        insert.setType(Constants.ZERO);
+        insert.setCategoryId(company.getCategoryId());
+        insert.setCode(company.getCode());
+        insert.setParentId(company.getParentId());
+        insert.setLinkName(company.getLinkName());
+        insert.setLinkPhone(company.getLinkPhone());
+        companyMapper.insert(insert);
+        return insert.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        if(id== null ){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Company model = findById(id);
+        if(model == null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝缁勭粐淇℃伅涓嶅瓨鍦▇");
+        }
+        if(StringUtils.isBlank(model.getHkId())){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝缁勭粐淇℃伅灏氭湭鍚屾涓嬪彂鎴愬姛,鏆備笉鏀寔淇敼锛岃灏濊瘯鍒犻櫎鍚庨噸鏂版坊鍔爚");
+        }
+
+        Company company = new Company();
+        company.setId(id);
+        company.setEditDate(new Date());
+        company.setEditor(user.getId());
+        company.setIsdeleted(Constants.ONE);
+        company.setHkStatus(Constants.ONE);
+        company.setHkDate(company.getHkDate());
+        companyMapper.updateById(company);
+        //涓嬪彂娴峰悍瀹夐槻骞冲彴
+        if(!delHkOrg(model)){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍒犻櫎涓嬪彂澶辫触锛岃纭璇ョ粍缁囨棤涓嬬骇缁勭粐鎴栫粍缁囦汉鍛樹俊鎭瘇");
+        }
+    }
+
+    @Override
+    public void delete(Company company) {
+        UpdateWrapper<Company> deleteWrapper = new UpdateWrapper<>(company);
+        companyMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        ids.stream().forEach(s->{
+            Company company = new Company();
+            deleteById(s);
+        });
+    }
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void updateById(Company company) {
+        if(company.getId() == null|| StringUtils.isBlank(company.getName())){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        //鏌ヨ鍚嶇О涓嶈兘閲嶅
+        if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
+//                .eq(Company::getType,Constants.ONE)
+                .eq(Company::getName,company.getName())
+                .ne(Company::getId,company.getId())
+                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝缁勭粐鍚嶇О涓嶈兘閲嶅~");
+        }
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Company model = findById(company.getId());
+        if(model == null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝缁勭粐淇℃伅涓嶅瓨鍦▇");
+        }
+        if(StringUtils.isBlank(model.getHkId())){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝缁勭粐淇℃伅灏氭湭鍚屾涓嬪彂鎴愬姛,鏆備笉鏀寔淇敼锛岃灏濊瘯鍒犻櫎鍚庨噸鏂版坊鍔爚");
+        }
+        company.setEditDate(new Date());
+        company.setEditor(user.getId());
+        company.setHkStatus(Constants.ONE);
+        company.setHkDate(company.getHkDate());
+        company.setHkId(model.getHkId());
+        companyMapper.updateById(company);
+        //涓嬪彂娴峰悍瀹夐槻骞冲彴
+        if(StringUtils.isNotBlank(company.getHkId())
+                && Constants.equalsObject(Constants.ONE,model.getHkId())
+                && !editHkOrg(company)){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+
+    }
+
+    @Override
+    public Integer updateLaborServicesById(Company company) {
+        checkUnique(company);
+        companyMapper.updateById(company);
+        return null;
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Company> companys) {
+        if (CollectionUtils.isEmpty(companys)) {
+            return;
+        }
+        for (Company company: companys) {
+            this.updateById(company);
+        }
+    }
+
+    @Override
+    public Company findById(Integer id) {
+        return companyMapper.selectById(id);
+    }
+
+    @Override
+    public Company findOne(Company company) {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
+        return companyMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Company> findList(Company company) {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
+        return companyMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Company> findPage(PageWrap<Company> pageWrap) {
+        IPage<Company> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Company> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.eq(Company::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.eq(Company::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.ge(Company::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.le(Company::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.eq(Company::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.ge(Company::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.le(Company::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.eq(Company::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.like(Company::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.eq(Company::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.eq(Company::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getSortnum() != null) {
+            queryWrapper.eq(Company::getSortnum, pageWrap.getModel().getSortnum());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.eq(Company::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.eq(Company::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getCategoryId() != null) {
+            queryWrapper.eq(Company::getCategoryId, pageWrap.getModel().getCategoryId());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.eq(Company::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getParentId() != null) {
+            queryWrapper.eq(Company::getParentId, pageWrap.getModel().getParentId());
+        }
+        if (pageWrap.getModel().getLinkName() != null) {
+            queryWrapper.eq(Company::getLinkName, pageWrap.getModel().getLinkName());
+        }
+        if (pageWrap.getModel().getLinkPhone() != null) {
+            queryWrapper.eq(Company::getLinkPhone, pageWrap.getModel().getLinkPhone());
+        }
+        if (pageWrap.getModel().getHkId() != null) {
+            queryWrapper.eq(Company::getHkId, pageWrap.getModel().getHkId());
+        }
+        if (pageWrap.getModel().getHkStatus() != null) {
+            queryWrapper.eq(Company::getHkStatus, pageWrap.getModel().getHkStatus());
+        }
+        if (pageWrap.getModel().getHkDate() != null) {
+            queryWrapper.ge(Company::getHkDate, Utils.Date.getStart(pageWrap.getModel().getHkDate()));
+            queryWrapper.le(Company::getHkDate, Utils.Date.getEnd(pageWrap.getModel().getHkDate()));
+        }
+        if (pageWrap.getModel().getErpId() != null) {
+            queryWrapper.eq(Company::getErpId, pageWrap.getModel().getErpId());
+        }
+        if (pageWrap.getModel().getErpDate() != null) {
+            queryWrapper.ge(Company::getErpDate, Utils.Date.getStart(pageWrap.getModel().getErpDate()));
+            queryWrapper.le(Company::getErpDate, Utils.Date.getEnd(pageWrap.getModel().getErpDate()));
+        }
+        if (pageWrap.getModel().getErpStatus() != null) {
+            queryWrapper.eq(Company::getErpStatus, pageWrap.getModel().getErpStatus());
+        }
+        if (pageWrap.getModel().getDdId() != null) {
+            queryWrapper.eq(Company::getDdId, pageWrap.getModel().getDdId());
+        }
+        if (pageWrap.getModel().getDdDate() != null) {
+            queryWrapper.ge(Company::getDdDate, Utils.Date.getStart(pageWrap.getModel().getDdDate()));
+            queryWrapper.le(Company::getDdDate, Utils.Date.getEnd(pageWrap.getModel().getDdDate()));
+        }
+        if (pageWrap.getModel().getDdStatus() != null) {
+            queryWrapper.eq(Company::getDdStatus, pageWrap.getModel().getDdStatus());
+        }
+        if (pageWrap.getModel().getFsId() != null) {
+            queryWrapper.eq(Company::getFsId, pageWrap.getModel().getFsId());
+        }
+        if (pageWrap.getModel().getFsStatus() != null) {
+            queryWrapper.eq(Company::getFsStatus, pageWrap.getModel().getFsStatus());
+        }
+        if (pageWrap.getModel().getFsDate() != null) {
+            queryWrapper.ge(Company::getFsDate, Utils.Date.getStart(pageWrap.getModel().getFsDate()));
+            queryWrapper.le(Company::getFsDate, Utils.Date.getEnd(pageWrap.getModel().getFsDate()));
+        }
+        queryWrapper.orderByDesc(Company::getCreateDate);
+        queryWrapper.leftJoin(Category.class,Category::getId,Company::getCategoryId);
+        /*        .leftJoin(Member.class, Member::getId,Company::getHeadId)*/
+      /*  queryWrapper.leftJoin(" company c on c.id=t.parent_id");*/
+        queryWrapper.selectAll(Company.class)
+                .select("(select count(m.id) from member m where m.COMPANY_ID=t.id and m.ISDELETED=0) as countNum")
+                /*.select("c.name as parentName");*/
+                  .selectAs(Category::getName,Company::getCategoryName);
+                   /*   .selectAs(Member::getName,Company::getHeadName)
+                    .selectAs(Member::getPhone,Company::getHeadPhone)
+                    .select("count(t1.id) as countNum");*/
+//        queryWrapper.eq(Company::getType,Constants.ZERO);
+        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getStatus()),Company::getStatus,Constants.ZERO);
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Company::getName,pageWrap.getModel().getName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getParentName()),"c.name",pageWrap.getModel().getParentName());
+        IPage<Company> companyIPage = companyJoinMapper.selectJoinPage(page, Company.class, queryWrapper);
+        return PageData.from(companyIPage);
+    }
+
+    @Override
+    public void updateStatusById(Company company) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        company.setEditDate(new Date());
+        company.setEditor(loginUserInfo.getId());
+        company.setStatus(company.getStatus());
+        companyMapper.updateById(company);
+    }
+
+
+    @Override
+    public long count(Company company) {
+        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
+        return companyMapper.selectCount(wrapper);
+    }
+
+
+    @Override
+    public List<CompanyDTO> findCompanyTreePage(Integer type) {
+        //閰嶇疆缁勫憳浜哄憳绫诲瀷鏉ユ簮鏂瑰紡 0鑷缓 1ERP
+        LambdaQueryWrapper<Company> wrapper = new LambdaQueryWrapper<>();
+
+        wrapper.eq(Company::getIsdeleted,Constants.ZERO)
+                .eq(Constants.equalsInteger(type,Constants.ONE),Company::getType,type);
+        List<Company> companies = companyMapper.selectList(wrapper);
+        return getCompanyTree( companies, null);
+    }
+
+
+    private List<CompanyDTO> getCompanyTree(List<Company> companies, String parentId){
+        if (CollectionUtils.isEmpty(companies)){
+            return null;
+        }
+        int  origin =Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin());
+        List<Company> collect = null;
+        if(origin == DataSyncConfig.origin.erp){
+            collect=  companies.stream().filter(s -> ( StringUtils.defaultString(s.getErpParentId(),"").equals(StringUtils.defaultString(parentId)))).collect(Collectors.toList());
+        }else if(origin == DataSyncConfig.origin.hk){
+            collect= companies.stream().filter(s -> ( StringUtils.defaultString(s.getHkParentId(),"").equals(StringUtils.defaultString(parentId)))).collect(Collectors.toList());
+        }else{
+            collect=  companies.stream().filter(s -> (StringUtils.defaultString(s.getParentId()+"","").equals(StringUtils.defaultString(parentId)))).collect(Collectors.toList());
+        }
+        if (CollectionUtils.isEmpty(collect)){
+            return null;
+        }
+        List<CompanyDTO> companyDTOList = new ArrayList<>();
+        for (int i = 0; i < collect.size(); i++) {
+            Company company = collect.get(i);
+            CompanyDTO companyDTO = new CompanyDTO();
+            BeanUtils.copyProperties(company,companyDTO);
+            String pId = company.getId()+"";
+            if(origin == 1){
+                pId = company.getErpId();
+            }else if(origin == 2){
+                pId = company.getHkParentId();
+            }
+            companyDTO.setCompanyDTOList(getCompanyTree(companies,pId));
+            companyDTOList.add(companyDTO);
+        }
+        return companyDTOList;
+    }
+
+
+    /**
+     * 鍔冲姟鍏徃鍞竴鎬ф牎楠�
+     * @param company
+     */
+    private void checkUnique(Company company){
+        QueryWrapper<Company> wrapper = new QueryWrapper<>();
+        wrapper.lambda()
+                .eq(Company::getIsdeleted,Constants.ZERO)
+                .eq(Company::getType,Constants.ZERO)
+                .eq(Company::getName,company.getName());
+        List<Company> companies = companyMapper.selectList(wrapper);
+        if (CollectionUtils.isEmpty(companies)){
+            return;
+        }
+        //鏂板鐨勬儏鍐靛瓨鍦ㄨ褰�
+        if (Objects.isNull(company.getId())){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"鍏徃鍚嶇О宸插瓨鍦�");
+        }
+        //淇敼鐨勬儏鍐靛瓨鍦ㄨ褰� 鍖归厤涓嶅埌 own
+        if (!companies.stream().map(s -> s.getId()).anyMatch(s -> s.equals(company.getId()))){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"鍏徃鍚嶇О宸插瓨鍦�");
+        }
+    }
+
+
+
+    @Override
+    public List<Company> companyTree(Integer type) {
+        MPJLambdaWrapper<Company> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Company.class);
+        queryWrapper.selectAs(Member::getName,Company::getHeadName);
+        queryWrapper.selectAs(Member::getPhone,Company::getHeadPhone);
+        queryWrapper.leftJoin(Member.class,Member::getId,Company::getHeadId);
+        queryWrapper.eq(Company::getIsdeleted,Constants.ZERO);
+        queryWrapper.eq(Company::getType,type);
+        List<Company> companyList = companyJoinMapper.selectJoinList(Company.class,queryWrapper);
+        //閰嶇疆缁勫憳浜哄憳绫诲瀷鏉ユ簮鏂瑰紡 0鑷缓 1ERP
+        CompanyTree treeBuild = new CompanyTree(companyList, dataSyncConfig.getOrgUserDataOrigin());
+        companyList = treeBuild.buildTree();
+        return companyList;
+    }
+
+
+    @Override
+    public void updateSort(UpdateCompanySortDTO dto) {
+        Company company = companyMapper.selectById(dto.getId());
+        if(Objects.isNull(company)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+
+        List<Company> companyPool;
+        if (company.getParentId() == null) {
+            companyPool = companyMapper.selectList(new QueryWrapper<Company>().lambda()
+                    .eq(Company::getIsdeleted,Constants.ZERO)
+                    .isNull(Company::getParentId)
+                    .orderByAsc(Company::getSortnum)
+            );
+        } else {
+            companyPool = companyMapper.selectList(new QueryWrapper<Company>().lambda()
+                    .eq(Company::getIsdeleted,Constants.ZERO)
+                    .eq(Company::getParentId,company.getParentId())
+                    .orderByAsc(Company::getSortnum)
+            );
+        }
+        int currentMenuIndex = 0;
+        for (int i = 0; i < companyPool.size(); i++) {
+            if (companyPool.get(i).getId().equals(dto.getId())) {
+                currentMenuIndex = i;
+                break;
+            }
+        }
+        // 涓婄Щ
+        if ("top".equals(dto.getDirection())) {
+            if (currentMenuIndex - 1 < 0) {
+                return;
+            }
+            Company preMenu = companyPool.remove(currentMenuIndex - 1);
+            companyPool.add(currentMenuIndex, preMenu);
+        }
+        // 涓嬬Щ
+        else {
+            if (currentMenuIndex + 1 > companyPool.size() - 1) {
+                return;
+            }
+            Company nextMenu = companyPool.remove(currentMenuIndex + 1);
+            companyPool.add(currentMenuIndex, nextMenu);
+        }
+        for (int i = 0; i < companyPool.size(); i++) {
+            companyPool.get(i).setSortnum(i);
+        }
+
+        for (Company updCompany:companyPool) {
+            companyMapper.updateById(updCompany);
+        }
+
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceEventServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceEventServiceImpl.java
new file mode 100644
index 0000000..24e14f4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceEventServiceImpl.java
@@ -0,0 +1,423 @@
+package com.doumee.service.business.impl;
+
+import cn.hutool.core.lang.PatternPool;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.ReUtil;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.admin.response.DeviceEventDTO;
+import com.doumee.dao.business.DeviceEventMapper;
+import com.doumee.dao.business.join.DeviceEventJoinMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.business.vo.DeviceEventVo;
+import com.doumee.dao.system.SystemDictDataMapper;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.service.business.DeviceEventService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.text.ParseException;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class DeviceEventServiceImpl implements DeviceEventService {
+
+    @Autowired
+    private DeviceEventMapper deviceEventMapper;
+
+
+    @Autowired
+    private DeviceEventJoinMapper deviceEventJoinMapper;
+
+    @Autowired
+    private SystemDictDataMapper systemDictDataMapper;
+
+    @Override
+    public Integer create(DeviceEvent deviceEvent) {
+        deviceEventMapper.insert(deviceEvent);
+        return deviceEvent.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        deviceEventMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(DeviceEvent deviceEvent) {
+        UpdateWrapper<DeviceEvent> deleteWrapper = new UpdateWrapper<>(deviceEvent);
+        deviceEventMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        deviceEventMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(DeviceEvent deviceEvent) {
+        deviceEventMapper.updateById(deviceEvent);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<DeviceEvent> deviceEvents) {
+        if (CollectionUtils.isEmpty(deviceEvents)) {
+            return;
+        }
+        for (DeviceEvent deviceEvent: deviceEvents) {
+            this.updateById(deviceEvent);
+        }
+    }
+
+    @Override
+    public DeviceEvent findById(Integer id) {
+        return deviceEventMapper.selectById(id);
+    }
+
+    @Override
+    public DeviceEvent findOne(DeviceEvent deviceEvent) {
+        QueryWrapper<DeviceEvent> wrapper = new QueryWrapper<>(deviceEvent);
+        return deviceEventMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<DeviceEvent> findList(DeviceEvent deviceEvent) {
+        QueryWrapper<DeviceEvent> wrapper = new QueryWrapper<>(deviceEvent);
+        return deviceEventMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<DeviceEvent> findPage(PageWrap<DeviceEvent> pageWrap) {
+        IPage<DeviceEvent> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<DeviceEvent> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(DeviceEvent::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(DeviceEvent::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(DeviceEvent::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(DeviceEvent::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getEventId() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getEventId, pageWrap.getModel().getEventId());
+        }
+        if (pageWrap.getModel().getEventType() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getEventType, pageWrap.getModel().getEventType());
+        }
+        if (pageWrap.getModel().getSrcType() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getSrcType, pageWrap.getModel().getSrcType());
+        }
+        if (pageWrap.getModel().getHappenTime() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getHappenTime, pageWrap.getModel().getHappenTime());
+        }
+        if (pageWrap.getModel().getSrcIndex() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getSrcIndex, pageWrap.getModel().getSrcIndex());
+        }
+        if (pageWrap.getModel().getSrcName() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getSrcName, pageWrap.getModel().getSrcName());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getTimeout() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getTimeout, pageWrap.getModel().getTimeout());
+        }
+        if (pageWrap.getModel().getExtAccessChannel() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtAccessChannel, pageWrap.getModel().getExtAccessChannel());
+        }
+        if (pageWrap.getModel().getExtEventAlarmInID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventAlarmInID, pageWrap.getModel().getExtEventAlarmInID());
+        }
+        if (pageWrap.getModel().getExtEventAlarmOutID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventAlarmOutID, pageWrap.getModel().getExtEventAlarmOutID());
+        }
+        if (pageWrap.getModel().getExtEventCardNo() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventCardNo, pageWrap.getModel().getExtEventCardNo());
+        }
+        if (pageWrap.getModel().getExtEventCaseID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventCaseID, pageWrap.getModel().getExtEventCaseID());
+        }
+        if (pageWrap.getModel().getExtEventCode() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventCode, pageWrap.getModel().getExtEventCode());
+        }
+        if (pageWrap.getModel().getExtEventDoorID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventDoorID, pageWrap.getModel().getExtEventDoorID());
+        }
+        if (pageWrap.getModel().getExtEventIDCardPictureURL() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventIDCardPictureURL, pageWrap.getModel().getExtEventIDCardPictureURL());
+        }
+        if (pageWrap.getModel().getExtEventInOut() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventInOut, pageWrap.getModel().getExtEventInOut());
+        }
+        if (pageWrap.getModel().getExtEventLocalControllerID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventLocalControllerID, pageWrap.getModel().getExtEventLocalControllerID());
+        }
+        if (pageWrap.getModel().getExtEventMainDevID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventMainDevID, pageWrap.getModel().getExtEventMainDevID());
+        }
+        if (pageWrap.getModel().getExtEventPersonNo() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventPersonNo, pageWrap.getModel().getExtEventPersonNo());
+        }
+        if (pageWrap.getModel().getExtEventReaderKind() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventReaderKind, pageWrap.getModel().getExtEventReaderKind());
+        }
+        if (pageWrap.getModel().getExtEventReaderID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventReaderID, pageWrap.getModel().getExtEventReaderID());
+        }
+        if (pageWrap.getModel().getExtEventPictureURL() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventPictureURL, pageWrap.getModel().getExtEventPictureURL());
+        }
+        if (pageWrap.getModel().getSvrIndexCode() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getSvrIndexCode, pageWrap.getModel().getSvrIndexCode());
+        }
+        if (pageWrap.getModel().getExtEventReportChannel() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventReportChannel, pageWrap.getModel().getExtEventReportChannel());
+        }
+        if (pageWrap.getModel().getExtEventRoleID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventRoleID, pageWrap.getModel().getExtEventRoleID());
+        }
+        if (pageWrap.getModel().getExtEventEubDevID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventEubDevID, pageWrap.getModel().getExtEventEubDevID());
+        }
+        if (pageWrap.getModel().getExtEventEwipNum() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventEwipNum, pageWrap.getModel().getExtEventEwipNum());
+        }
+        if (pageWrap.getModel().getExtEventType() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventType, pageWrap.getModel().getExtEventType());
+        }
+        if (pageWrap.getModel().getExtEventVerifyID() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventVerifyID, pageWrap.getModel().getExtEventVerifyID());
+        }
+        if (pageWrap.getModel().getExtEventWhiteListNo() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtEventWhiteListNo, pageWrap.getModel().getExtEventWhiteListNo());
+        }
+        if (pageWrap.getModel().getExtReceiveTime() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExtReceiveTime, pageWrap.getModel().getExtReceiveTime());
+        }
+        if (pageWrap.getModel().getSeq() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getSeq, pageWrap.getModel().getSeq());
+        }
+        if (pageWrap.getModel().getUserType() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getUserType, pageWrap.getModel().getUserType());
+        }
+        if (pageWrap.getModel().getAddress() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getAddress, pageWrap.getModel().getAddress());
+        }
+        if (pageWrap.getModel().getBirth() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getBirth, pageWrap.getModel().getBirth());
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getEndDate, pageWrap.getModel().getEndDate());
+        }
+        if (pageWrap.getModel().getIdNum() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getIdNum, pageWrap.getModel().getIdNum());
+        }
+        if (pageWrap.getModel().getIssuingAuthority() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getIssuingAuthority, pageWrap.getModel().getIssuingAuthority());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().like(DeviceEvent::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getSex() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getSex, pageWrap.getModel().getSex());
+        }
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getStartDate, pageWrap.getModel().getStartDate());
+        }
+        if (pageWrap.getModel().getTermOfValidity() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getTermOfValidity, pageWrap.getModel().getTermOfValidity());
+        }
+        if (pageWrap.getModel().getAccessChannel() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getAccessChannel, pageWrap.getModel().getAccessChannel());
+        }
+        if (pageWrap.getModel().getEntryTimes() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getEntryTimes, pageWrap.getModel().getEntryTimes());
+        }
+        if (pageWrap.getModel().getExitTimes() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getExitTimes, pageWrap.getModel().getExitTimes());
+        }
+        if (pageWrap.getModel().getTotalTimes() != null) {
+            queryWrapper.lambda().eq(DeviceEvent::getTotalTimes, pageWrap.getModel().getTotalTimes());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(deviceEventMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(DeviceEvent deviceEvent) {
+        QueryWrapper<DeviceEvent> wrapper = new QueryWrapper<>(deviceEvent);
+        return deviceEventMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public PageData<DeviceEventDTO> findDeviceEventDTOPage(PageWrap<DeviceEvent> pageWrap) {
+
+        IPage<DeviceEventDTO> deviceEventDTOIPage = getDataInfo(pageWrap);
+        if(null != deviceEventDTOIPage && deviceEventDTOIPage.getRecords().size() > 0) {
+            deviceEventDTOIPage.setRecords(newDeviceEvent(deviceEventDTOIPage.getRecords()));
+        }
+        return PageData.from(deviceEventDTOIPage);
+    }
+
+    @Override
+    public List<DeviceEventVo> findDeviceEventExcel(PageWrap<DeviceEvent> pageWrap) {
+        IPage<DeviceEventDTO> deviceEventExcel = getDataInfo(pageWrap);
+        List<DeviceEventVo> voList = new ArrayList<>();
+        if(null != deviceEventExcel && deviceEventExcel.getRecords().size() > 0) {
+            deviceEventExcel.getRecords().stream().forEach(obj-> {
+                DeviceEventVo eventVo = new DeviceEventVo();
+                if(null != obj.getPersonType()) {
+                    if(Constants.ZERO == obj.getPersonType()){
+                        eventVo.setPersonTypeName(Constants.Status.LW_FK.getDes());
+                    }else if(Constants.ONE == obj.getPersonType()) {
+                        eventVo.setPersonTypeName(Constants.Status.PT_FK.getDes());
+                    }else {
+                        eventVo.setPersonTypeName(Constants.Status.NB_FK.getDes());
+                    }
+                }else {
+                    eventVo.setPersonTypeName("");
+                }
+                eventVo.setPersonName(obj.getPersonName());
+                eventVo.setPersonPhone(obj.getPersonName());
+                eventVo.setPersonIdcardDecode(obj.getPersonIdcardDecode());
+                eventVo.setPersonCompanyName(obj.getPersonCompanyName());
+                eventVo.setDevName(obj.getDevName());
+                eventVo.setSrcName(obj.getSrcName());
+                if(null != obj.getExtEventInOut()) {
+                    if(Constants.ZERO == obj.getExtEventInOut()){
+                        eventVo.setExtEventInOutName(Constants.Status.OUT.getDes());
+                    }else if(Constants.ONE == obj.getPersonType()) {
+                        eventVo.setExtEventInOutName(Constants.Status.PT_FK.getDes());
+                    }
+                }else {
+                    eventVo.setExtEventInOutName("");
+                }
+                eventVo.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType())) ;
+                try {
+                    eventVo.setHappenTime(DateUtil.timeEscape(obj.getHappenTime()));
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+                voList.add(eventVo);
+            });
+        }
+        return voList;
+    }
+
+    private IPage<DeviceEventDTO> getDataInfo(PageWrap<DeviceEvent> pageWrap) {
+        IPage<DeviceEvent> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<DeviceEvent> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+
+        //鏄惁鏄暟瀛�
+        boolean number = Validator.isNumber(pageWrap.getModel().getKeyWords());
+        //鏄惁鍖呭惈涓枃
+        boolean b = Validator.hasChinese(pageWrap.getModel().getKeyWords());
+        //鏄惁鍖呭惈鑻辨枃
+        boolean hasWord = ReUtil.contains(PatternPool.WORD, pageWrap.getModel().getKeyWords());
+        queryWrapper.leftJoin(Member.class,Member::getHkId,DeviceEvent::getExtEventPersonNo)
+                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
+                .leftJoin(Device.class,Device::getHkId,DeviceEvent::getSrcParentIndex)
+                .selectAll(DeviceEvent.class)
+                .selectAs(Member::getName,DeviceEventDTO::getPersonName)
+                .selectAs(Member::getId,DeviceEventDTO::getMemberId)
+                .selectAs(Member::getType,DeviceEventDTO::getPersonType)
+                .selectAs(Member::getPhone,DeviceEventDTO::getPersonPhone)
+                .selectAs(Member::getIdcardDecode,DeviceEventDTO::getPersonIdcardDecode)
+                .selectAs(Device::getName,DeviceEventDTO::getDevName)
+                .selectAs(Company::getName,DeviceEventDTO::getPersonCompanyName);
+        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),w->
+                        w.like(Member::getName,pageWrap.getModel().getKeyWords()).or().like(Member::getPhone,pageWrap.getModel().getKeyWords()))
+                .eq(StringUtils.equals(pageWrap.getModel().getPersonType(),Constants.TWO+""),
+                        Member::getType,
+                        pageWrap.getModel().getPersonType())
+                .eq(Objects.nonNull(pageWrap.getModel().getEventType()),
+                        DeviceEvent::getEventType,
+                        pageWrap.getModel().getEventType())
+                .like(Objects.nonNull(pageWrap.getModel().getCompanyName()),Company::getName,
+                        pageWrap.getModel().getCompanyName())
+                .ge(Objects.nonNull(pageWrap.getModel().getStartTime()),
+                        DeviceEvent::getCreateDate,
+                        pageWrap.getModel().getStartTime())
+                .le(Objects.nonNull(pageWrap.getModel().getEndTime()),
+                        DeviceEvent::getCreateDate,
+                        pageWrap.getModel().getEndTime())
+                .isNull(StringUtils.isNotBlank(pageWrap.getModel().getPersonType()) && !StringUtils.equals(pageWrap.getModel().getPersonType(),Constants.TWO+""),Member::getId)//闄や簡鍐呴儴浜哄憳閮芥槸澶栨潵璁垮
+                .orderByDesc(DeviceEvent::getCreateDate);
+        queryWrapper.orderByDesc(DeviceEvent::getHappenTime);
+        IPage<DeviceEventDTO> deviceEventDTOIPage = deviceEventJoinMapper.selectJoinPage(page, DeviceEventDTO.class, queryWrapper);
+        return deviceEventDTOIPage;
+    }
+
+    // 瀵瑰浘鐗囪繘琛屽垽鏂鐞�
+    private List<DeviceEventDTO> newDeviceEvent(List<DeviceEventDTO> DeviceEventDTOList) {
+        List<DeviceEventDTO> newDeviceEventDTOS = new ArrayList<>();
+        List<String> codes = Arrays.asList(Constants.FTP_RESOURCE_PATH,Constants.DEVICE_EVENT_IMG);
+        List<SystemDictData> list = systemDictDataMapper.list(codes);
+        Map<String,SystemDictData> dataMap = list.stream().collect(Collectors.toMap(SystemDictData::getLabel, Function.identity()));
+        for (DeviceEventDTO dto:DeviceEventDTOList) {
+           if(StringUtils.isNotBlank(dto.getExtEventPictureURL())
+                   && !dto.getExtEventPictureURL().startsWith(HKConstants.IMG_INDEX)
+                   && !dto.getExtEventPictureURL().startsWith(HKConstants.IMG_INDEX_ERROR)) {
+                   if(null != list && list.size() > 0) {
+                           dto.setExtEventPictureURL(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
+                                   +dataMap.get(Constants.DEVICE_EVENT_IMG).getCode()
+                                   +dto.getExtEventPictureURL());
+                   }
+           }else{
+               dto.setExtEventPictureURL(null);
+           }
+            dto.setEventTypeName(HKConstants.EventTypes.getName(dto.getEventType())) ;
+            try {
+                dto.setHappenTime(DateUtil.timeEscape(dto.getHappenTime()));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            newDeviceEventDTOS.add(dto);
+        }
+        return newDeviceEventDTOS;
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java
new file mode 100644
index 0000000..1ff3b10
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java
@@ -0,0 +1,484 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.erp.model.openapi.request.RoleListRequest;
+import com.doumee.core.erp.model.openapi.response.DeviceListResponse;
+import com.doumee.core.erp.model.openapi.response.RoleListResponse;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.admin.response.MemberInfoDTO;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.join.MemberRoleJoinMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.web.response.DeviceRoleVO;
+import com.doumee.service.business.DeviceRoleService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.business.MemberService;
+import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import io.swagger.models.auth.In;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Service;
+
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 闂ㄧ瑙掕壊淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+@Slf4j
+public class DeviceRoleServiceImpl implements DeviceRoleService {
+
+    @Autowired
+    private DeviceRoleMapper deviceRoleMapper;
+    @Autowired
+    private MemberCardMapper memberCardMapper;
+    @Autowired
+    private EmpowerMapper empowerMapper;
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+    @Autowired
+    private MemberRoleJoinMapper memberRoleMapper;
+    @Autowired
+    private MemberMapper memberMapper;
+
+
+    @Override
+    public Integer create(DeviceRole deviceRole) {
+        if(Objects.isNull(deviceRole)
+            || StringUtils.isBlank(deviceRole.getName())
+            || Objects.isNull(deviceRole.getType())
+            || Objects.isNull(deviceRole.getIsDefault())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        // 鑾峰彇涔嬪墠鏄惁瀛樺湪榛樿闂ㄧ缁�
+        DeviceRole newDeviceRole = null;
+        if(null != deviceRole.getType()) {
+            newDeviceRole = getDeviceRole(deviceRole.getType());
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
+        if(null != newDeviceRole && deviceRole.getIsDefault().equals(Constants.ZERO)) {
+            DeviceRole updateDeviceRole = new DeviceRole();
+            // 鑻ョ幇鍦ㄦ柊澧炴暟鎹缃粯璁ら棬绂佺粍锛涢偅涔堝厛鎶婁箣鍓嶇殑榛樿闂ㄧ缁勭姸鎬佹敼涓轰笉鏄粯璁ょ殑
+            updateDeviceRole.setId(newDeviceRole.getId());
+            updateDeviceRole.setEdirot(loginUserInfo.getId().toString());
+            updateDeviceRole.setEditDate(new Date());
+            updateDeviceRole.setIsDefault(Constants.ONE);
+            deviceRoleMapper.updateById(updateDeviceRole);
+        }
+        DeviceRole insert = new DeviceRole();
+        insert.setCreator(loginUserInfo.getId().toString());
+        insert.setCreateDate(new Date());
+        insert.setEdirot(loginUserInfo.getId().toString());
+        insert.setEditDate(new Date());
+        insert.setIsdeleted(Constants.ZERO);
+        insert.setRemark(deviceRole.getRemark());
+        insert.setName(deviceRole.getName());
+        insert.setIsDefault(deviceRole.getIsDefault());
+        insert.setType(deviceRole.getType());
+        insert.setDoorIds(deviceRole.getDoorIds());
+        insert.setDoorNames(deviceRole.getDoorNames());
+        insert.setParkIds(deviceRole.getParkIds());
+        insert.setParkNames(deviceRole.getParkNames());
+        insert.setStatus(deviceRole.getStatus());
+        insert.setHkId(deviceRole.getHkId());
+        insert.setHkStatus(deviceRole.getHkStatus());
+        insert.setHkDate(deviceRole.getHkDate());
+
+        deviceRoleMapper.insert(insert);
+        return insert.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        deviceRoleMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(DeviceRole deviceRole) {
+        UpdateWrapper<DeviceRole> deleteWrapper = new UpdateWrapper<>(deviceRole);
+        deviceRoleMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        deviceRoleMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(DeviceRole deviceRole) {
+        DeviceRole model = deviceRoleMapper.selectById(deviceRole.getId());
+        if(model == null){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        DeviceRole newDeviceRole = null;
+        if(null != deviceRole.getType()) {
+            newDeviceRole = getDeviceRole(deviceRole.getType());
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
+        if(null != newDeviceRole  && deviceRole.getIsDefault().equals(Constants.ZERO)) {
+            DeviceRole update = new DeviceRole();
+            update.setEdirot(loginUserInfo.getId().toString());
+            update.setEditDate(new Date());
+            update.setId(newDeviceRole.getId());
+            update.setIsDefault(Constants.ONE);
+            deviceRoleMapper.updateById(update);
+        }
+       int t = deviceRoleMapper.updateById(deviceRole);
+       if(t>0){
+            Thread tt = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        startUpdateMemberEmpower(model,deviceRole);
+                    }catch (Exception e){
+                        log.error("======闂ㄧ鍒嗙粍淇敼锛屾洿鏂颁汉鍛樻潈闄愬け璐�==="+e.getMessage());
+                    }
+                }
+            });
+            tt.start();
+       }
+    }
+    @Override
+    public  void updateMemberRole(DeviceRole deviceRole) {
+        deviceRole.setType("2");
+        deviceRole.setIsdeleted(Constants.ZERO);
+        List<DeviceRole> list =findList(deviceRole);
+        if(list == null || list.size()==0){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        for(DeviceRole model :list){
+            updateMemberRoleDO(model);
+        }
+    }
+    public  void updateMemberRoleDO(DeviceRole model) {
+        if(model.getDoorIds()  == null){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        String[] newIds =StringUtils.defaultString(model.getDoorIds()).split(",");
+        List<Integer>  allids = getChangeIdsByArray(new String[]{},newIds);//鏈�鏂拌澶�
+        List<MemberRole> memberRoleList = memberRoleMapper.selectList(new QueryWrapper<MemberRole>().lambda()
+                .eq(MemberRole::getRoleId,model.getId())
+                .eq(MemberRole::getIsdeleted,Constants.ZERO)
+        );
+        if(memberRoleList!=null && memberRoleList.size()>0) {
+            int num =1;
+            for (MemberRole memberRole : memberRoleList) {
+                Member member = memberMapper.selectById(memberRole.getMemberId());
+                if(member==null || member.getIsdeleted().equals(Constants.ONE)){
+                    continue;
+                }
+                List<Integer>  addIds = new ArrayList<>();
+                for(Integer did : allids){
+                    Empower empower = empowerMapper.selectOne(new QueryWrapper<Empower>().lambda()
+                            .eq(Empower::getMemberId,member.getId())
+                            .eq(Empower::getDeviceId,did )
+                            .orderByDesc(Empower::getId)
+                            .last("limit 1"));
+                    if(empower ==null || Constants.equalsInteger(empower.getIsdeleted(),Constants.ONE)){
+                        addIds.add(did);
+                    }
+                }
+                try {
+                    HkSyncOrgUserToHKServiceImpl.dealChangeDeviceRoleEmpower(member,addIds,null,deviceRoleMapper,empowerMapper,deviceMapper);
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+                System.out.println("姝e湪澶勭悊銆�"+model.getName()+"銆�======闂ㄧ鏁版嵁銆�"+addIds.size()+"銆�====杩涘害锛氥��"+num+"|"+memberRoleList.size()+"銆�");
+                num ++;
+            }
+        }
+    }
+
+    /**
+     * 鏇存柊璇ユ潈闄愪笅鐩稿叧鐨勪汉鍛樻渶鏂板叏鏂颁笅鍙�
+     * @param model
+     * @param deviceRole
+     */
+    private void startUpdateMemberEmpower(DeviceRole model, DeviceRole deviceRole) {
+        String[] ids = StringUtils.defaultString(model.getDoorIds()).split(",");
+        String[] newIds =StringUtils.defaultString(deviceRole.getDoorIds()).split(",");
+        List<Integer>  delIds = getChangeIdsByArray(newIds,ids);//鍒犻櫎鐨勮澶�
+        List<Integer>  addIds = getChangeIdsByArray(ids,newIds);//鏈�鏂拌澶�
+        if((addIds==null ||addIds.size()==0)&&( delIds ==null || delIds.size() == 0 )){
+            //濡傛灉娌℃湁鍙樺寲锛屼笉鍋氬鐞�
+            return;
+        }
+        List<Integer>  allids = getChangeIdsByArray(new String[]{},newIds);//鏈�鏂拌澶�
+        List<MemberRole> memberRoleList = memberRoleMapper.selectList(new QueryWrapper<MemberRole>().lambda()
+                .eq(MemberRole::getRoleId,model.getId())
+                .eq(MemberRole::getIsdeleted,Constants.ZERO)
+        );
+        if(memberRoleList!=null && memberRoleList.size()>0){
+            for(MemberRole memberRole : memberRoleList){
+                //濡傛灉鏈変汉鍛樻巿鏉冧簡璇ユ潈闄�
+                Member member = memberMapper.selectById(memberRole.getMemberId());
+                if(member==null || member.getIsdeleted().equals(Constants.ONE)){
+                    continue;
+                }
+                MPJLambdaWrapper<MemberRole> queryWrapper = new MPJLambdaWrapper<>();
+                queryWrapper.leftJoin(DeviceRole.class,DeviceRole::getId,MemberRole::getRoleId );
+                queryWrapper.selectAll(MemberRole.class)
+                        .selectAs(DeviceRole::getDoorIds, MemberRole::getDoorIds)
+                        .eq(MemberRole::getMemberId,memberRole.getMemberId())
+                        .eq(MemberRole::getIsdeleted,Constants.ZERO)
+                        .ne(MemberRole::getRoleId,deviceRole.getId());
+                List<MemberRole> tLis = memberRoleMapper.selectJoinList(MemberRole.class,queryWrapper);
+                List<Integer>  actDelIds = getActChangeDoorIds(tLis,delIds);
+                List<Integer>  actAddIds = getActChangeDoorIds(tLis,allids);
+                HkSyncOrgUserToHKServiceImpl.dealChangeDeviceRoleEmpower(member,actAddIds,actDelIds,deviceRoleMapper,empowerMapper,deviceMapper);
+            }
+        }
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛褰撳墠鏈�鏂扮殑闂ㄧ瑙掕壊锛屾煡璇㈠疄闄呭簲璇ュ垹闄ゆ垨鑰呭鍔犵殑闂ㄧ鐐规潈闄�
+     * @param tLis
+     * @param changeIds
+     * @return
+     */
+    private List<Integer> getActChangeDoorIds(List<MemberRole> tLis, List<Integer> changeIds) {
+        List<Integer> list = new ArrayList<>();
+        for(MemberRole memberRole : tLis){
+            String[] ids = StringUtils.defaultString(memberRole.getDoorIds()).split(",");
+            if(ids!=null && ids.length>0){
+                for (String s:ids){
+                    list.add(Integer.parseInt(s));
+                }
+            }
+        }
+        List<Integer> actList = new ArrayList<>();
+        if(list.size()>0){
+            Flag:
+            for (Integer t : changeIds){
+                for (Integer tt : list){
+                    if(Constants.equalsInteger(t,tt)){
+                        continue Flag;
+                    }
+                }
+                actList.add(t);
+            }
+        }
+        return  actList;
+    }
+
+    private List<Integer> getChangeIdsByArray(String[] ids, String[] newIds) {
+        List<Integer> list = new ArrayList<>();
+        if(newIds!=null){
+            FLAG :
+            for(String s :newIds){
+                for(String s1 :ids){
+                    if(StringUtils.equals(s,s1)){
+                        continue FLAG;
+                    }
+                }
+                list.add(Integer.parseInt(s));
+            }
+        }
+        return list;
+    }
+    @Override
+    public void updateStatusById(DeviceRole deviceRole) {
+        // 鑾峰彇涔嬪墠鏄惁瀛樺湪榛樿闂ㄧ缁�
+        DeviceRole newDeviceRole = null;
+        if(null != deviceRole.getType()) {
+            newDeviceRole = getDeviceRole(deviceRole.getType());
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
+        List<DeviceRole> deviceRoleList = new ArrayList<>();
+        if(null != newDeviceRole) {
+            DeviceRole update = new DeviceRole();
+            update.setEdirot(loginUserInfo.getId().toString());
+            update.setEditDate(new Date());
+            update.setId(newDeviceRole.getId());
+            update.setStatus(newDeviceRole.getStatus());
+            update.setIsDefault(Constants.ONE);
+            deviceRoleList.add(update);
+        }
+        DeviceRole updateTwo = new DeviceRole();
+        updateTwo.setEdirot(loginUserInfo.getId().toString());
+        updateTwo.setEditDate(new Date());
+        updateTwo.setId(deviceRole.getId());
+        updateTwo.setStatus(deviceRole.getStatus());
+        updateTwo.setIsDefault(deviceRole.getIsDefault());
+        deviceRoleList.add(updateTwo);
+        // 鏈�澶�2鏉★紝鎵�鏈夊氨娌℃湁鍐欐壒閲忎慨鏀逛簡
+        for (DeviceRole data:deviceRoleList) {
+            deviceRoleMapper.updateById(data);
+        }
+    }
+
+    private DeviceRole getDeviceRole(String type) {
+        LambdaQueryWrapper<DeviceRole> query = new LambdaQueryWrapper<>();
+        query.eq(DeviceRole::getIsdeleted,Constants.ZERO)
+                .eq(DeviceRole::getIsDefault,Constants.ZERO)
+                .eq(DeviceRole::getType,type)
+                .last(" limit 1");
+        // 鏌ヨ鏄惁鏈夐粯璁ら棬绂佺粍锛屽彧鑳芥湁涓�缁勯粯璁ら棬绂佺粍
+        DeviceRole getDeviceRole = deviceRoleMapper.selectOne(query);
+        return getDeviceRole;
+    }
+
+    @Override
+    public void updateByIdInBatch(List<DeviceRole> deviceRoles) {
+        if (CollectionUtils.isEmpty(deviceRoles)) {
+            return;
+        }
+        for (DeviceRole deviceRole: deviceRoles) {
+            this.updateById(deviceRole);
+        }
+    }
+
+    @Override
+    public DeviceRole findById(Integer id) {
+        return deviceRoleMapper.selectById(id);
+    }
+
+    @Override
+    public DeviceRole findOne(DeviceRole deviceRole) {
+        QueryWrapper<DeviceRole> wrapper = new QueryWrapper<>(deviceRole);
+        return deviceRoleMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<DeviceRole> findList(DeviceRole deviceRole) {
+        QueryWrapper<DeviceRole> wrapper = new QueryWrapper<>(deviceRole);
+        return deviceRoleMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<DeviceRole> findPage(PageWrap<DeviceRole> pageWrap) {
+        IPage<DeviceRole> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<DeviceRole> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        queryWrapper.select("*,(select count(1) from member_role b where b.isdeleted=0 and b.role_id=device_role.id) as memberNum");
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(DeviceRole::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(DeviceRole::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEdirot() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getEdirot, pageWrap.getModel().getEdirot());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(DeviceRole::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(DeviceRole::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().like(DeviceRole::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getIsDefault() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getIsDefault, pageWrap.getModel().getIsDefault());
+        }
+        if (StringUtils.isNotBlank(pageWrap.getModel().getType())) {
+            if(pageWrap.getModel().getType().length() > 1) {
+                String[] types = pageWrap.getModel().getType().split(",");
+                queryWrapper.lambda().and(p-> p.eq(DeviceRole::getType, types[0])
+                        .or()
+                        .eq(DeviceRole::getType, types[1]));
+            }else {
+                queryWrapper.lambda().eq(DeviceRole::getType, pageWrap.getModel().getType());
+            }
+        }
+        if (pageWrap.getModel().getDoorIds() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getDoorIds, pageWrap.getModel().getDoorIds());
+        }
+        if (pageWrap.getModel().getDoorNames() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getDoorNames, pageWrap.getModel().getDoorNames());
+        }
+        if (pageWrap.getModel().getParkIds() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getParkIds, pageWrap.getModel().getParkIds());
+        }
+        if (pageWrap.getModel().getParkNames() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getParkNames, pageWrap.getModel().getParkNames());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(DeviceRole::getStatus, pageWrap.getModel().getStatus());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        queryWrapper.lambda().orderByAsc( DeviceRole::getName);
+        IPage<DeviceRole> newPage = deviceRoleMapper.selectPage(page, queryWrapper);
+        if(null != newPage && newPage.getRecords().size() > 0) {
+          List<DeviceRole> deviceRoleList = newPage.getRecords();
+          /*    for (DeviceRole dto:deviceRoleList) {
+                Member member = new Member();
+                member.setIsdeleted(Constants.ZERO);
+                member.setRoleIdParam("["+dto.getId()+"]");
+                dto.setMemberNum( memberMapper.selectCount(new QueryWrapper<>(member)));
+            }*/
+            newPage.setRecords(deviceRoleList);
+        }
+        return PageData.from(newPage);
+    }
+
+    @Override
+    public long count(DeviceRole deviceRole) {
+        QueryWrapper<DeviceRole> wrapper = new QueryWrapper<>(deviceRole);
+        return deviceRoleMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public List<DeviceRoleVO> findListByType(Integer type) {
+        List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
+                .eq(DeviceRole::getType,type)
+                .eq(DeviceRole::getIsdeleted, Constants.ZERO)
+                .eq(DeviceRole::getStatus, Constants.ONE)
+        );
+        List<DeviceRoleVO> deviceRoleVOList = new ArrayList<>();
+        for (DeviceRole deviceRole:deviceRoleList) {
+            DeviceRoleVO deviceRoleVO = new DeviceRoleVO();
+            BeanUtils.copyProperties(deviceRole,deviceRoleVO);
+            deviceRoleVOList.add(deviceRoleVO);
+        }
+        return deviceRoleVOList;
+    }
+
+
+
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java
new file mode 100644
index 0000000..63d795a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/EmpowerServiceImpl.java
@@ -0,0 +1,159 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.Date;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.admin.response.MemberInfoDTO;
+import com.doumee.dao.business.EmpowerMapper;
+import com.doumee.dao.business.join.EmpowerJoinMapper;
+import com.doumee.dao.business.model.Company;
+import com.doumee.dao.business.model.Device;
+import com.doumee.dao.business.model.Empower;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.EmpowerService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 浜哄憳鎺堟潈瀵煎叆璁板綍Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class EmpowerServiceImpl implements EmpowerService {
+
+    @Autowired
+    private EmpowerMapper empowerMapper;
+
+    @Autowired
+    private EmpowerJoinMapper empowerJoinMapper;
+
+
+    @Override
+    public Integer create(Empower empower) {
+        empowerMapper.insert(empower);
+        return empower.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        empowerMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Empower empower) {
+        UpdateWrapper<Empower> deleteWrapper = new UpdateWrapper<>(empower);
+        empowerMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        empowerMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Empower empower) {
+        empowerMapper.updateById(empower);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Empower> empowers) {
+        if (CollectionUtils.isEmpty(empowers)) {
+            return;
+        }
+        for (Empower empower: empowers) {
+            this.updateById(empower);
+        }
+    }
+
+    @Override
+    public Empower findById(Integer id) {
+        return empowerMapper.selectById(id);
+    }
+
+    @Override
+    public Empower findOne(Empower empower) {
+        QueryWrapper<Empower> wrapper = new QueryWrapper<>(empower);
+        return empowerMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Empower> findList(Empower empower) {
+        QueryWrapper<Empower> wrapper = new QueryWrapper<>(empower);
+        return empowerMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Empower> findPage(PageWrap<Empower> pageWrap) {
+        IPage<Empower> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Empower> queryWrapper = new MPJLambdaWrapper<>();
+
+        queryWrapper.selectAll(Empower.class);
+        queryWrapper.selectAs(Member::getName,Empower::getMemberName);
+        queryWrapper.selectAs(Member::getPhone,Empower::getMemberPhone);
+        queryWrapper.selectAs(Member::getIdcardDecode,Empower::getMemberidCard);
+        queryWrapper.selectAs(Device::getName,Empower::getDeviceName);
+        queryWrapper.selectAs(Company::getName,Empower::getCompanyName);
+        queryWrapper.selectAs(SystemUser::getUsername,Empower::getCreaterName);
+        queryWrapper.leftJoin(Member.class,Member::getId,Empower::getMemberId);
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Empower::getCreator);
+        queryWrapper.leftJoin(Device.class,Device::getId,Empower::getDeviceId);
+
+        queryWrapper
+               /* .eq(Empower::getIsdeleted, Constants.ZERO)*/
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
+                .or().like(Member::getPhone,pageWrap.getModel().getMemberName()));
+        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getSendStatus()),Empower::getSendStatus,pageWrap.getModel().getSendStatus());
+        queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Company::getId,pageWrap.getModel().getCompanyId());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDeviceName()),Device::getName,pageWrap.getModel().getDeviceName());
+        queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getSendStartDate()),Empower::getCreateDate,pageWrap.getModel().getSendStartDate());
+        queryWrapper.le(Objects.nonNull(pageWrap.getModel().getSendEndDate()),Empower::getCreateDate,pageWrap.getModel().getSendEndDate());
+
+        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
+        Calendar cal=Calendar.getInstance();
+        if(Objects.nonNull(pageWrap.getModel().getTimeDn())){
+            if(Constants.equalsInteger(pageWrap.getModel().getTimeDn(),0)){
+                String now=format.format(cal.getTime())+" :00:00:00";
+                queryWrapper.ge(Empower::getSendDate,now);
+            }
+            if(Constants.equalsInteger(pageWrap.getModel().getTimeDn(),7)){
+
+                cal.add(Calendar.DAY_OF_MONTH,-7);
+                queryWrapper.ge(Empower::getSendDate,cal.getTime());
+            }
+            if(Constants.equalsInteger(pageWrap.getModel().getTimeDn(),30)){
+                cal.add(Calendar.DAY_OF_MONTH,-30);
+                queryWrapper.ge(Empower::getSendDate,cal.getTime());
+            }
+        }
+        queryWrapper.orderByDesc(Empower::getId);
+        IPage<Empower> result = empowerJoinMapper.selectJoinPage(page, Empower.class,queryWrapper);
+        return PageData.from(result);
+    }
+
+    @Override
+    public long count(Empower empower) {
+        QueryWrapper<Empower> wrapper = new QueryWrapper<>(empower);
+        return empowerMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
new file mode 100644
index 0000000..9f11835
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
@@ -0,0 +1,164 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.InterfaceLogMapper;
+import com.doumee.dao.business.model.InterfaceLog;
+import com.doumee.service.business.InterfaceLogService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class InterfaceLogServiceImpl implements InterfaceLogService {
+
+    @Autowired
+    private InterfaceLogMapper interfaceLogMapper;
+
+    @Override
+    public Integer create(InterfaceLog interfaceLog) {
+        interfaceLogMapper.insert(interfaceLog);
+        return interfaceLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        interfaceLogMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(InterfaceLog interfaceLog) {
+        UpdateWrapper<InterfaceLog> deleteWrapper = new UpdateWrapper<>(interfaceLog);
+        interfaceLogMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        interfaceLogMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(InterfaceLog interfaceLog) {
+        interfaceLogMapper.updateById(interfaceLog);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<InterfaceLog> interfaceLogs) {
+        if (CollectionUtils.isEmpty(interfaceLogs)) {
+            return;
+        }
+        for (InterfaceLog interfaceLog: interfaceLogs) {
+            this.updateById(interfaceLog);
+        }
+    }
+
+    @Override
+    public InterfaceLog findById(Integer id) {
+        return interfaceLogMapper.selectById(id);
+    }
+
+    @Override
+    public InterfaceLog findOne(InterfaceLog interfaceLog) {
+        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
+        return interfaceLogMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<InterfaceLog> findList(InterfaceLog interfaceLog) {
+        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
+        return interfaceLogMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap) {
+        IPage<InterfaceLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<InterfaceLog> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(InterfaceLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(InterfaceLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(InterfaceLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()));
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().le(InterfaceLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getUrl() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getUrl, pageWrap.getModel().getUrl());
+        }
+        if (pageWrap.getModel().getRequest() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getRequest, pageWrap.getModel().getRequest());
+        }
+        if (pageWrap.getModel().getRepose() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getRepose, pageWrap.getModel().getRepose());
+        }
+        if (pageWrap.getModel().getSuccess() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getSuccess, pageWrap.getModel().getSuccess());
+        }
+        if (pageWrap.getModel().getPlat() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getPlat, pageWrap.getModel().getPlat());
+        }
+        if (pageWrap.getModel().getObjType() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getObjType, pageWrap.getModel().getObjType());
+        }
+        if (pageWrap.getModel().getObjId() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getObjId, pageWrap.getModel().getObjId());
+        }
+        queryWrapper.lambda().orderByDesc(InterfaceLog::getCreateDate);
+        return PageData.from(interfaceLogMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(InterfaceLog interfaceLog) {
+        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
+        return interfaceLogMapper.selectCount(wrapper);
+    }
+    @Override
+    public void clearThreeMonthLog() {
+          interfaceLogMapper.delete(new UpdateWrapper<InterfaceLog>().lambda()
+                  .apply("to_days(create_date)+15 < to_days(now())")
+                  .like(InterfaceLog::getUrl,"/artemis/api/"));
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberRoleServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberRoleServiceImpl.java
new file mode 100644
index 0000000..6e6fd07
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberRoleServiceImpl.java
@@ -0,0 +1,136 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.MemberRoleMapper;
+import com.doumee.dao.business.model.MemberRole;
+import com.doumee.service.business.MemberRoleService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 浜哄憳瑙掕壊鍏宠仈淇℃伅Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class MemberRoleServiceImpl implements MemberRoleService {
+
+    @Autowired
+    private MemberRoleMapper memberRoleMapper;
+
+    @Override
+    public Integer create(MemberRole memberRole) {
+        memberRoleMapper.insert(memberRole);
+        return memberRole.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        memberRoleMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(MemberRole memberRole) {
+        UpdateWrapper<MemberRole> deleteWrapper = new UpdateWrapper<>(memberRole);
+        memberRoleMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        memberRoleMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(MemberRole memberRole) {
+        memberRoleMapper.updateById(memberRole);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<MemberRole> memberRoles) {
+        if (CollectionUtils.isEmpty(memberRoles)) {
+            return;
+        }
+        for (MemberRole memberRole: memberRoles) {
+            this.updateById(memberRole);
+        }
+    }
+
+    @Override
+    public MemberRole findById(Integer id) {
+        return memberRoleMapper.selectById(id);
+    }
+
+    @Override
+    public MemberRole findOne(MemberRole memberRole) {
+        QueryWrapper<MemberRole> wrapper = new QueryWrapper<>(memberRole);
+        return memberRoleMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<MemberRole> findList(MemberRole memberRole) {
+        QueryWrapper<MemberRole> wrapper = new QueryWrapper<>(memberRole);
+        return memberRoleMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<MemberRole> findPage(PageWrap<MemberRole> pageWrap) {
+        IPage<MemberRole> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<MemberRole> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(MemberRole::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(MemberRole::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(MemberRole::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(MemberRole::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEdirot() != null) {
+            queryWrapper.lambda().eq(MemberRole::getEdirot, pageWrap.getModel().getEdirot());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(MemberRole::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(MemberRole::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(MemberRole::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(MemberRole::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getMemberId() != null) {
+            queryWrapper.lambda().eq(MemberRole::getMemberId, pageWrap.getModel().getMemberId());
+        }
+        if (pageWrap.getModel().getRoleId() != null) {
+            queryWrapper.lambda().eq(MemberRole::getRoleId, pageWrap.getModel().getRoleId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(memberRoleMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(MemberRole memberRole) {
+        QueryWrapper<MemberRole> wrapper = new QueryWrapper<>(memberRole);
+        return memberRoleMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
new file mode 100644
index 0000000..72e455e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -0,0 +1,1169 @@
+package com.doumee.service.business.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdcardUtil;
+import cn.hutool.core.util.PhoneUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.DataSyncConfig;
+import com.doumee.config.Jwt.JwtPayLoad;
+import com.doumee.config.Jwt.JwtTokenUtil;
+import com.doumee.core.annotation.excel.ExcelImporter;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.UserDelRequest;
+import com.doumee.core.haikang.model.param.respose.UserDelResponse;
+import com.doumee.core.haikang.service.HKService;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DESUtil;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.core.utils.redis.RedisUtil;
+import com.doumee.core.wx.WXConstant;
+import com.doumee.dao.admin.request.LaborEmpowerDTO;
+import com.doumee.dao.admin.request.LaborMemberDTO;
+import com.doumee.dao.admin.request.MemberQuery;
+import com.doumee.dao.admin.response.MemberInfoDTO;
+import com.doumee.dao.admin.response.StagingDataVO;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.join.MemberJoinMapper;
+import com.doumee.dao.business.join.RetentionJoinMapper;
+import com.doumee.dao.business.join.UserActionJoinMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.dao.web.reqeust.AccountLoginDTO;
+import com.doumee.dao.web.reqeust.CheckVisitedDTO;
+import com.doumee.dao.web.reqeust.VisitMemberDTO;
+import com.doumee.dao.web.response.MemberVO;
+import com.doumee.dao.web.response.WxAuthorizeVO;
+import com.doumee.service.business.MemberService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
+import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class MemberServiceImpl implements MemberService {
+
+    @Autowired
+    private MemberMapper memberMapper;
+
+    @Autowired
+    private MemberJoinMapper memberJoinMapper;
+
+    @Autowired
+    private TrainTimeMapper trainTimeMapper;
+
+    @Autowired
+    private MemberRoleMapper memberRoleMapper;
+
+    @Autowired
+    private DeviceRoleMapper deviceRoleMapper;
+
+    @Autowired
+    private EmpowerMapper empowerMapper;
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private UserActionJoinMapper userActionJoinMapper;
+
+    @Autowired
+    private MemberCardMapper memberCardMapper;
+    @Autowired
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
+    private DataSyncConfig dataSyncConfig;
+
+    @Autowired
+    private RetentionJoinMapper retentionJoinMapper;
+
+    @Autowired
+    private VisitsMapper visitsMapper;
+
+
+    @Override
+    public Integer create(Member member) {
+        memberMapper.insert(member);
+        return member.getId();
+    }
+
+    @Transactional
+    @Override
+    public Integer laborMemberCreate(LaborMemberDTO member) {
+
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        if (PhoneUtil.isPhone(member.getPhone())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢佃瘽鍙风爜鏍煎紡鏈夎");
+        }
+        if (IdcardUtil.isValidCard(member.getIdcardNo())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"韬唤璇佸彿鏍煎紡鏈夎");
+        }
+        if (IdcardUtil.getGenderByIdCard(member.getIdcardNo()) == member.getSex()){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鎬у埆鏈夎");
+        }
+        //鑾峰彇鍑虹敓鏃ユ湡
+        String birthByIdCard = IdcardUtil.getBirthByIdCard(member.getIdcardNo());
+        //鑴辨晱鎿嶄綔
+        String hide = IdcardUtil.hide(member.getIdcardNo(), 5, 14);
+        //杞崲鏃ユ湡
+        DateTime yyyyMMdd = DateUtil.parse(birthByIdCard, "yyyyMMdd");
+
+        Member insert = new Member();
+        insert.setCreator(loginUserInfo.getId());
+        insert.setCreateDate(new Date());
+        insert.setEditor(loginUserInfo.getId());
+        insert.setEditDate(new Date());
+        insert.setIsdeleted(Constants.ZERO);
+        insert.setCompanyId(member.getCompanyId());
+        insert.setFaceImg(member.getFaceImg());
+        insert.setImgurl(member.getImgurl());
+        insert.setType(Constants.ZERO);
+        insert.setName(member.getName());
+        insert.setBirthday(yyyyMMdd);
+        insert.setPhone(member.getPhone());
+        insert.setIdcardNo(Utils.Secure.encryptString(member.getIdcardNo()));
+        IdcardUtil.isValidCard(member.getIdcardNo());
+        insert.setIdcardDecode(hide);
+        insert.setStatus(Constants.ZERO);
+        insert.setParentId(member.getParentId());
+        memberMapper.insert(insert);
+
+    /*    TrainTime trainTime = new TrainTime();
+        trainTime.setCreator(loginUserInfo.getId().toString());
+        trainTime.setCreateDate(new Date());
+        trainTime.setEdirot(loginUserInfo.getId().toString());
+        trainTime.setEditDate(new Date());
+        trainTime.setIsdeleted(Constants.ZERO);
+        trainTime.setMemberId(insert.getId());
+        trainTime.setStartTime(Utils.Date.getStart(member.getStartTime()));
+        trainTime.setEndTime(Utils.Date.getDayEnd(member.getEndTime()));
+//        trainTime.setImportStatus();
+//        trainTime.setImportInfo();
+        trainTimeMapper.insert(trainTime);*/
+        return insert.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        Member member=new Member();
+        member.setId(id);
+        member.setIsdeleted(Constants.ZERO);
+        member.setEditor(loginUserInfo.getId());
+        member.setEditDate(new Date());
+        memberMapper.updateById(member);
+    }
+
+
+    @Override
+    public void roleAuthById(Integer id) {
+        Member member = memberMapper.selectById(id);
+        if(member==null || member.getIsdeleted().equals(Constants.ONE)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鍛樺伐淇℃伅宸插垹闄�");
+        }
+//        List<MemberCard> cards = HkSyncOrgUserToHKServiceImpl.getNormalCardList(member,memberCardMapper);
+        HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,member,deviceRoleMapper,empowerMapper,deviceMapper);
+    }
+    @Override
+    public     void empowerByList(Member member) {
+        if(member.getIdList()!=null && member.getIdList().size() >0){
+             List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                     .in(Member::getId,member.getIdList())
+                     .eq(Member::getIsdeleted,Constants.ZERO));
+             if(members!=null){
+                 for(Member m : members){
+                     HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,m,deviceRoleMapper,empowerMapper,deviceMapper);
+                 }
+             }
+        }
+    }
+
+
+    @Override
+    public void delete(Member member) {
+        UpdateWrapper<Member> deleteWrapper = new UpdateWrapper<>(member);
+        memberMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Member member=new Member();
+        ids.stream().forEach(s ->{
+            member.setId(s);
+            member.setIsdeleted(Constants.ONE);
+            member.setEditor(loginUserInfo.getId());
+            member.setEditDate(new Date());
+            memberMapper.updateById(member);
+
+            UserAction userAction=new UserAction();
+            userAction.setIsdeleted(Constants.ZERO);
+            userAction.setCreateDate(new Date());
+            userAction.setCreator(loginUserInfo.getId());
+            userAction.setType(9);
+            userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"銆戯紝杩涜銆愬垹闄ゃ��");
+            userAction.setMemberId(s+"");
+            userActionJoinMapper.insert(userAction);
+
+        });
+
+
+
+
+
+      /*  memberMapper.deleteBatchIds(ids);*/
+    }
+
+    @Override
+    public void batchBlock(List<Integer> ids,Integer type) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Member member=new Member();
+        for (Integer id:ids) {
+            member = memberMapper.selectById(id);
+            if(!Objects.isNull(member)&&member.getStatus()==Constants.ZERO){
+                UserAction userAction=new UserAction();
+//                userAction.setBeforeStatus(member.getStatus());
+                member.setStatus(Constants.TWO);
+                member.setEditor(loginUserInfo.getId());
+                member.setEditDate(new Date());
+                memberMapper.updateById(member);
+
+                userAction.setIsdeleted(Constants.ZERO);
+                userAction.setCreateDate(new Date());
+                userAction.setCreator(loginUserInfo.getId());
+                if(Constants.equalsInteger(type,Constants.ONE)){
+                    userAction.setType(Constants.ONE);
+                    userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"銆戯紝杩涜銆愬喕缁撱��");
+                }
+                if(Constants.equalsInteger(type,Constants.TWO)){
+                    userAction.setType(Constants.TWO);
+                    userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"銆戯紝杩涜銆愭媺榛戙��");
+
+                }
+                userAction.setMemberId(id+"");
+
+                userActionJoinMapper.insert(userAction);
+            }
+        }
+        /*  memberMapper.deleteBatchIds(ids);*/
+    }
+
+
+
+
+    @Override
+    public void updateById(Member member) {
+        memberMapper.updateById(member);
+    }
+    @Override
+    public void updateFace(Member member) {
+        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
+        wrapper.lambda().ne(Member::getRemark,"浜鸿劯宸插悓姝ユ渶鏂�");
+        List<Member> list =memberMapper.selectList(wrapper);
+       if(list!=null){
+           String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
+                   +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+           for(Member m : list){
+             String faceId=  HkSyncOrgUserToHKServiceImpl.dealMemberFace(m,path);
+             if(StringUtils.isNotBlank(faceId)){
+                 Member update = new Member();
+                 update.setId(m.getId());
+                 update.setFaceId(faceId);
+                 update.setRemark("浜鸿劯宸插悓姝ユ渶鏂�");
+                 update.setFaceStatus(Constants.ONE);
+                 memberMapper.updateById(update);
+             }
+           }
+       }
+    }
+    @Override
+    public void delHkForce(Member member) {
+      Member model  =memberMapper.selectById(member.getId());
+       if(model ==null) {
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝浜哄憳淇℃伅涓嶅瓨鍦紒");
+       }
+        if(!Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍙湁閽堝绂昏亴浜哄憳鍙繘琛岃鎿嶄綔锛�");
+       }
+        if(Constants.equalsObject(model.getHkStatus(),Constants.ONE)){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ヤ汉鍛樺凡琚垹闄わ紒");
+       }
+        if(StringUtils.isBlank(model.getHkId())){
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝璇ヤ汉鍛橀潪瀹夐槻骞冲彴鍒涘缓浜哄憳锛屼笉鑳借繘琛岃鎿嶄綔锛�");
+       }
+        HkSyncEmpowerServiceImpl.doHkDeleteUser(model.getId(),model.getHkId(),new Date(),memberMapper,memberCardMapper);
+    }
+
+    @Override
+    public void updateStatusById(Member member) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Member update = new Member();
+        update.setEditDate(new Date());
+        update.setEditor(loginUserInfo.getId());
+        update.setStatus(member.getStatus());
+        memberMapper.updateById(update);
+    }
+
+
+    @Override
+    public void updateVisitsStatusById(Member member) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Member result=memberMapper.selectById(member.getId());
+        Integer status=result.getStatus();
+        Member update = new Member();
+        update.setEditDate(new Date());
+        update.setEditor(loginUserInfo.getId());
+        update.setStatus(Constants.Status.FREEZE.getValue());
+        update.setId(member.getId());
+        memberMapper.updateById(update);
+
+        UserAction userAction=new UserAction();
+        userAction.setIsdeleted(Constants.ZERO);
+        userAction.setCreateDate(new Date());
+        userAction.setCreator(loginUserInfo.getId());
+        if(Constants.equalsInteger(result.getType(),Constants.TWO)){
+            userAction.setType(Constants.ONE);
+            userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"銆戯紝杩涜銆愬喕缁撱��");
+        }
+        if(Constants.equalsInteger(result.getType(),Constants.ZERO)){
+            userAction.setType(Constants.TWO);
+            userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"銆戯紝杩涜銆愭媺榛戙��");
+
+        }
+        userAction.setMemberId(result.getId()+"");
+        userAction.setBeforeStatus(status);
+        userActionJoinMapper.insert(userAction);
+    }
+
+
+    @Override
+    public void updateRemoveStatusById(List<Member> members) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+
+        Date date=new Date();
+        members.stream().forEach(s ->{
+            Member result=memberMapper.selectById(s.getId());
+            Integer status=result.getStatus();
+            Member update = new Member();
+            update.setEditDate(date);
+            update.setEditor(loginUserInfo.getId());
+            update.setStatus(Constants.Status.ENABLE.getValue());
+            update.setId(s.getId());
+            memberMapper.updateById(update);
+
+            //瑙e喕涓氬姟 澶勭悊鐢ㄦ埛鎺堟潈瀵煎叆璁板綍
+            this.thawMember(result);
+
+            UserAction userAction=new UserAction();
+            userAction.setIsdeleted(Constants.ZERO);
+            userAction.setCreateDate(new Date());
+            userAction.setCreator(loginUserInfo.getId());
+            if(Constants.equalsInteger(result.getType(),Constants.TWO)){
+                userAction.setType(Constants.ZERO);
+                userAction.setBeforeStatus(Constants.ONE);
+            }
+            if(Constants.equalsInteger(result.getType(),Constants.ONE)){
+                userAction.setBeforeStatus(status);
+                userAction.setType(Constants.TWO);
+            }
+            userAction.setMemberId(result.getId()+"");
+            userActionJoinMapper.insert(userAction);
+        });
+    }
+
+
+
+
+    @Override
+    public void updateCanVisitById(Member member) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Member update = new Member();
+        update.setEditDate(new Date());
+        update.setEditor(loginUserInfo.getId());
+        update.setCanVisit(member.getCanVisit());
+        memberMapper.updateById(update);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Member> members) {
+        if (CollectionUtils.isEmpty(members)) {
+            return;
+        }
+        for (Member member: members) {
+            this.updateById(member);
+        }
+    }
+
+    @Override
+    public Member findById(Integer id) {
+        return memberMapper.selectById(id);
+    }
+
+    @Override
+    public Member findOne(Member member) {
+        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
+        return memberMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Member> findList(Member member) {
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+        queryWrapper.selectAll(Member.class)
+                .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
+                .selectAs(Company::getLinkName,MemberInfoDTO::getLinkName);
+
+        if(null != member.getType()) {
+            queryWrapper.eq(Member::getType,member.getType());
+        }
+        if(null != member.getCompanyId()) {
+            queryWrapper.eq(Member::getCompanyId,member.getCompanyId());
+        }
+        queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
+
+        List<Member> list =  memberJoinMapper.selectJoinList(Member.class,queryWrapper);
+        if(list!=null){
+            for(Member m : list){
+                m.setName(StringUtils.defaultString(m.getName(),"")+"-"+StringUtils.defaultString(m.getCompanyName(),""));
+            }
+        }
+        return  list;
+    }
+
+    @Override
+    public PageData<Member> findPage(PageWrap<Member> pageWrap) {
+
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getKeyword() != null) {
+            queryWrapper.lambda().and( ms->ms.like(Member::getName,pageWrap.getModel().getKeyword())
+                            .or().like(Member::getPhone,pageWrap.getModel().getKeyword())
+                    .or().like(Member::getCode,pageWrap.getModel().getKeyword()));
+        }
+        if(pageWrap.getModel().getType() != null){
+            if(pageWrap.getModel().getType().equals(Constants.memberType.visitor)){
+                queryWrapper.select(" * , (select v.COMPANY_NAME  from visits v where v.MEMBER_ID =  member.id and v.STATUS = 2   order by v.CREATE_DATE desc limit 1 ) as companyName  , " +
+                        " (select v.STARTTIME  from visits v where v.MEMBER_ID =  member.id and v.STATUS = 2   order by v.CREATE_DATE desc limit 1 )  as lastVisitDate , " +
+                        " (select count(1) from visits v where v.MEMBER_ID =  member.id and v.STATUS = 2 ) as visitTimes  ");
+            }
+        }
+
+        if (pageWrap.getModel().getIsFace() != null) {
+            queryWrapper.lambda().isNull(pageWrap.getModel().getIsFace()==Constants.ZERO,Member::getFaceImg);
+            queryWrapper.lambda().isNotNull(pageWrap.getModel().getIsFace()==Constants.ONE,Member::getFaceImg);
+        }
+
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Member::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(Member::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(Member::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(Member::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(Member::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(Member::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(Member::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(Member::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(Member::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getCompanyId() != null) {
+            queryWrapper.lambda().eq(Member::getCompanyId, pageWrap.getModel().getCompanyId());
+        }
+        if (pageWrap.getModel().getFaceImg() != null) {
+            queryWrapper.lambda().eq(Member::getFaceImg, pageWrap.getModel().getFaceImg());
+        }
+        if (pageWrap.getModel().getImgurl() != null) {
+            queryWrapper.lambda().eq(Member::getImgurl, pageWrap.getModel().getImgurl());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(Member::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().eq(Member::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getBirthday() != null) {
+            queryWrapper.lambda().ge(Member::getBirthday, Utils.Date.getStart(pageWrap.getModel().getBirthday()));
+            queryWrapper.lambda().le(Member::getBirthday, Utils.Date.getEnd(pageWrap.getModel().getBirthday()));
+        }
+        if (pageWrap.getModel().getPhone() != null) {
+            queryWrapper.lambda().eq(Member::getPhone, pageWrap.getModel().getPhone());
+        }
+        if (pageWrap.getModel().getIdcardNo() != null) {
+            queryWrapper.lambda().eq(Member::getIdcardNo, pageWrap.getModel().getIdcardNo());
+        }
+        if (pageWrap.getModel().getIdcardDecode() != null) {
+            queryWrapper.lambda().eq(Member::getIdcardDecode, pageWrap.getModel().getIdcardDecode());
+        }
+        if (pageWrap.getModel().getCode() != null) {
+            queryWrapper.lambda().eq(Member::getCode, pageWrap.getModel().getCode());
+        }
+        if (pageWrap.getModel().getClasses() != null) {
+            queryWrapper.lambda().eq(Member::getClasses, pageWrap.getModel().getClasses());
+        }
+        if (pageWrap.getModel().getStatus() != null) {
+            queryWrapper.lambda().eq(Member::getStatus, pageWrap.getModel().getStatus());
+        }
+        if (pageWrap.getModel().getParentId() != null) {
+            queryWrapper.lambda().eq(Member::getParentId, pageWrap.getModel().getParentId());
+        }
+        if (pageWrap.getModel().getOpenid() != null) {
+            queryWrapper.lambda().eq(Member::getOpenid, pageWrap.getModel().getOpenid());
+        }
+        if (pageWrap.getModel().getFsId() != null) {
+            queryWrapper.lambda().eq(Member::getFsId, pageWrap.getModel().getFsId());
+        }
+        if (pageWrap.getModel().getFsStatus() != null) {
+            queryWrapper.lambda().eq(Member::getFsStatus, pageWrap.getModel().getFsStatus());
+        }
+        if (pageWrap.getModel().getFsDate() != null) {
+            queryWrapper.lambda().ge(Member::getFsDate, Utils.Date.getStart(pageWrap.getModel().getFsDate()));
+            queryWrapper.lambda().le(Member::getFsDate, Utils.Date.getEnd(pageWrap.getModel().getFsDate()));
+        }
+        if (pageWrap.getModel().getHkId() != null) {
+            queryWrapper.lambda().eq(Member::getHkId, pageWrap.getModel().getHkId());
+        }
+        if (pageWrap.getModel().getHkStatus() != null) {
+            queryWrapper.lambda().eq(Member::getHkStatus, pageWrap.getModel().getHkStatus());
+        }
+        if (pageWrap.getModel().getHkDate() != null) {
+            queryWrapper.lambda().ge(Member::getHkDate, Utils.Date.getStart(pageWrap.getModel().getHkDate()));
+            queryWrapper.lambda().le(Member::getHkDate, Utils.Date.getEnd(pageWrap.getModel().getHkDate()));
+        }
+        if (pageWrap.getModel().getErpId() != null) {
+            queryWrapper.lambda().eq(Member::getErpId, pageWrap.getModel().getErpId());
+        }
+        if (pageWrap.getModel().getErpDate() != null) {
+            queryWrapper.lambda().ge(Member::getErpDate, Utils.Date.getStart(pageWrap.getModel().getErpDate()));
+            queryWrapper.lambda().le(Member::getErpDate, Utils.Date.getEnd(pageWrap.getModel().getErpDate()));
+        }
+        if (pageWrap.getModel().getErpStatus() != null) {
+            queryWrapper.lambda().eq(Member::getErpStatus, pageWrap.getModel().getErpStatus());
+        }
+        if (pageWrap.getModel().getDdId() != null) {
+            queryWrapper.lambda().eq(Member::getDdId, pageWrap.getModel().getDdId());
+        }
+        if (pageWrap.getModel().getDdDate() != null) {
+            queryWrapper.lambda().ge(Member::getDdDate, Utils.Date.getStart(pageWrap.getModel().getDdDate()));
+            queryWrapper.lambda().le(Member::getDdDate, Utils.Date.getEnd(pageWrap.getModel().getDdDate()));
+        }
+        if (pageWrap.getModel().getDdStatus() != null) {
+            queryWrapper.lambda().eq(Member::getDdStatus, pageWrap.getModel().getDdStatus());
+        }
+        if (pageWrap.getModel().getPassward() != null) {
+            queryWrapper.lambda().eq(Member::getPassward, pageWrap.getModel().getPassward());
+        }
+        if (pageWrap.getModel().getCanVisit() != null) {
+            queryWrapper.lambda().eq(Member::getCanVisit, pageWrap.getModel().getCanVisit());
+        }
+        if (pageWrap.getModel().getHighCheckor() != null) {
+            queryWrapper.lambda().eq(Member::getHighCheckor, pageWrap.getModel().getHighCheckor());
+        }
+        if (pageWrap.getModel().getRoleId() != null) {
+            queryWrapper.lambda().eq(Member::getRoleId, pageWrap.getModel().getRoleId());
+        }
+        if (pageWrap.getModel().getRoleDate() != null) {
+            queryWrapper.lambda().ge(Member::getRoleDate, Utils.Date.getStart(pageWrap.getModel().getRoleDate()));
+            queryWrapper.lambda().le(Member::getRoleDate, Utils.Date.getEnd(pageWrap.getModel().getRoleDate()));
+        }
+        if (pageWrap.getModel().getErpOrgId() != null) {
+            queryWrapper.lambda().eq(Member::getErpOrgId, pageWrap.getModel().getErpOrgId());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(memberMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public PageData<MemberInfoDTO> findLaborMemberInfoPage(PageWrap<MemberInfoDTO> pageWrap) {
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+        MemberInfoDTO model = pageWrap.getModel();
+        Utils.MP.blankToNull(model);
+        Date end =pageWrap.getModel().getTrainTimeEndTime() !=null? Utils.Date.getEnd(pageWrap.getModel().getTrainTimeEndTime()):new Date();
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+              /*  .leftJoin(TrainTime.class,TrainTime::getMemberId,Member::getId)
+                .leftJoin(Empower.class,Empower::getMemberId,Member::getId);*/
+
+        queryWrapper.selectAll(Member.class)
+                    .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
+                    .selectAs(Company::getLinkName,MemberInfoDTO::getLinkName)
+                /*.select(" (select Max(tt.END_TIME) from train_time tt where tt.ISDELETED=0 and tt.MEMBER_ID=t.id) as trainTimeEndTime")*/
+                .select(" (select Max(e.END_TIME) from empower e where e.ISDELETED=0 and e.MEMBER_ID=t.id) as empowerEndTime");
+
+        queryWrapper.eq(Member::getType,Constants.ZERO);
+        queryWrapper.eq(Objects.nonNull(model.getCompanyId()),Member::getCompanyId,model.getCompanyId())
+                    .like(StringUtils.isNotBlank(model.getName()),Member::getName,model.getName())
+                    .like(StringUtils.isNotBlank(model.getPhone()),Member::getPhone,model.getPhone())
+                    .like(StringUtils.isNotBlank(model.getIdcardDecode()),Member::getIdcardDecode,model.getIdcardDecode())
+                    .having(pageWrap.getModel().getTrainTimeEndTime()!=null,"trainTimeEndTime < "+ DateUtil.format(end,"yyyy-MM-dd HH:mm:ss"));
+        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
+        if (!CollectionUtils.isEmpty(memberIPage.getRecords())){
+            memberIPage.getRecords().forEach(s->s.setSex(IdcardUtil.getGenderByIdCard(s.getIdcardDecode())));
+        }
+        return PageData.from(memberIPage);
+    }
+
+    @Override
+    public long count(Member member) {
+        QueryWrapper<Member> wrapper = new QueryWrapper<Member>(member);
+        wrapper.lambda().like(StringUtils.isNotBlank(member.getRoleIdParam()), Member::getRoleId, member.getRoleIdParam());
+        return memberMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public void importMemberBatch(LaborEmpowerDTO laborEmpowerDTO) {
+        try {
+            ExcelImporter ie = new ExcelImporter(laborEmpowerDTO.getFile(),0,0);
+
+            List<LaborEmpowerDTO.LaborMemberEmpower> dataList = ie.getDataList(LaborEmpowerDTO.LaborMemberEmpower.class,null);
+
+            if (CollectionUtils.isEmpty(dataList)){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂囦欢鏃犳暟鎹褰�");
+            }
+
+        } catch (Exception e) {
+
+        }
+
+    }
+
+    @Override
+    public PageData<MemberInfoDTO> findMemberInfoPage(PageWrap<MemberQuery> pageWrap) {
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+
+        queryWrapper.selectAll(Member.class);
+        queryWrapper.selectAs(Company::getName,Member::getCompanyName);
+        queryWrapper.select(" ( select count(1) from member_card mc where mc.isdeleted = 0 and  mc.member_id = t.id ) as  memberCardCount ");
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+        queryWrapper.in(Objects.nonNull(pageWrap.getModel().getCompanyIds())&&pageWrap.getModel().getCompanyIds().size()>0,
+                        Member::getCompanyId,pageWrap.getModel().getCompanyIds())
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyword()),ms->ms
+                        .like(Member::getPhone,pageWrap.getModel().getKeyword())
+                        .or().like(Member::getName,pageWrap.getModel().getKeyword())
+                        .or().like(Member::getCode,pageWrap.getModel().getKeyword()))
+                .isNull(pageWrap.getModel().getHasFace()!=null&& Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ZERO),Member::getFaceId)
+                .isNotNull(pageWrap.getModel().getHasFace()!=null&& Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ONE),Member::getFaceId)
+                .eq(Objects.nonNull(pageWrap.getModel().getCanVisit()),Member::getCanVisit,pageWrap.getModel().getCanVisit())
+                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Member::getStatus,pageWrap.getModel().getStatus())
+                .eq(Objects.nonNull(pageWrap.getModel().getHkStatus()),Member::getHkStatus,pageWrap.getModel().getHkStatus())
+                .eq(Objects.isNull(pageWrap.getModel().getIsdeleted()),Member::getIsdeleted,Constants.ZERO)
+                .eq(Objects.nonNull(pageWrap.getModel().getIsdeleted()),Member::getIsdeleted,pageWrap.getModel().getIsdeleted())
+                .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName())
+//                .eq(Member::getStatus,Constants.Status.ENABLE.getValue())
+                .eq(Member::getType,Constants.memberType.internal)
+                .eq(pageWrap.getModel().getHkStatus()!=null,Member::getHkStatus,pageWrap.getModel().getHkStatus())
+                .orderByDesc(!Constants.equalsObject(pageWrap.getModel().getIsdeleted(),Constants.ONE),Member::getCreateDate)
+                .orderByDesc(Constants.equalsInteger(pageWrap.getModel().getIsdeleted(),Constants.ONE),Member::getEditDate);
+        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())==DataSyncConfig.origin.erp){
+            queryWrapper.eq( StringUtils.isNotBlank(pageWrap.getModel().getErpOrgId()),Member::getErpOrgId,pageWrap.getModel().getErpOrgId());
+        }else{
+            queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Member::getCompanyId,pageWrap.getModel().getCompanyId());
+        }
+        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
+
+        if(CollectionUtils.isNotEmpty(memberIPage.getRecords())){
+            //FTP鏂囦欢璁块棶鍓嶇紑
+            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
+                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+            //闂ㄧ缁勪俊鎭�
+            List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
+                            .select(DeviceRole::getId,DeviceRole::getName)
+                    .eq(DeviceRole::getIsdeleted,Constants.ZERO));
+            for (MemberInfoDTO memberInfoDTO:memberIPage.getRecords()) {
+                //鑾峰緱闂ㄧ缁勫悕绉版暟缁�
+                memberInfoDTO.setRoleNames(this.dealRoleDatas(memberInfoDTO.getRoleId(),deviceRoleList));
+                //鎷兼帴鍓嶇紑
+                if(StringUtils.isNotBlank(memberInfoDTO.getFaceImg())){
+                    memberInfoDTO.setFaceImg(prefixUrl + memberInfoDTO.getFaceImg());
+                }
+                if(StringUtils.isNotBlank(memberInfoDTO.getImgurl())){
+                    memberInfoDTO.setImgurl(prefixUrl + memberInfoDTO.getImgurl());
+                }
+            }
+        }
+        return PageData.from(memberIPage);
+    }
+
+
+    public List<String>  dealRoleDatas(String roleIds,List<DeviceRole> deviceRoleList){
+        List<String> stringList = new ArrayList<>();
+        if(StringUtils.isNotBlank(roleIds)){
+            roleIds = roleIds.replace("[","").replace("]","");
+            List<String> ids = Arrays.asList(roleIds.split(","));
+            ids.forEach(i->{
+//                DeviceRole deviceRole = deviceRoleList.stream().filter(m->m.getId().toString().equals(i)).findFirst().get();
+                DeviceRole deviceRole = findRoleById(deviceRoleList,i);
+                if(!Objects.isNull(deviceRole)){
+                    stringList.add(deviceRole.getName());
+                }
+            });
+        }
+        return stringList;
+    }
+
+    private DeviceRole findRoleById(List<DeviceRole> deviceRoleList, String id) {
+        for(DeviceRole role  : deviceRoleList){
+            if(StringUtils.equals(role.getId().toString(),id)){
+                return role;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public PageData<MemberInfoDTO> findVisitPage(PageWrap<MemberQuery> pageWrap) {
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+        queryWrapper.selectAll(Member.class)
+                .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
+                .selectAs(Member::getLastVisitDate,MemberInfoDTO::getVisitsLastDate)
+                .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 and v.status  in (7,8) ) as visitsCount");
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
+                .like(StringUtils.isNotBlank(pageWrap.getModel().getPhone()),Member::getPhone,pageWrap.getModel().getPhone())
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()), ms->ms.like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName())
+                        .or().like(Company::getName,pageWrap.getModel().getCompanyName()))
+                .eq(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,
+                        DESUtil.encrypt(Constants.EDS_PWD, pageWrap.getModel().getIdcardNo())
+                )
+                .eq(Objects.nonNull(pageWrap.getModel().getHkStatus()),Member::getHkStatus,pageWrap.getModel().getHkStatus())
+                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Member::getStatus,pageWrap.getModel().getStatus())
+                .eq(Member::getType,Constants.memberType.visitor)
+                .eq(Member::getIsdeleted,Constants.ZERO)
+                .orderByDesc(Member::getCreateDate);
+        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())==DataSyncConfig.origin.erp){
+            queryWrapper.eq( StringUtils.isNotBlank(pageWrap.getModel().getErpOrgId()),Member::getErpOrgId,pageWrap.getModel().getErpOrgId());
+        }else{
+            queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Member::getCompanyId,pageWrap.getModel().getCompanyId());
+        }
+        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
+        return PageData.from(memberIPage);
+
+    }
+
+
+    @Override
+    public PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap) {
+        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+        queryWrapper.selectAll(Member.class)
+                .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
+                .select(" (select ua.CREATE_DATE from user_action ua where ua.MEMBER_ID=t.id and ua.ISDELETED=0  order by ua.CREATE_DATE desc  limit 1) as optTime")
+                .select(" (select s.REALNAME from user_action uac left join system_user s on uac.CREATOR = s.ID    where uac.MEMBER_ID=t.id and uac.ISDELETED=0 order by uac.CREATE_DATE desc  limit 1) as creatorName")
+                .select(" (select STARTTIME from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 order by CREATE_DATE desc  limit 1) as visitsLastDate")
+                .eq(Member::getIsdeleted,Constants.ZERO);
+                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
+                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
+                queryWrapper
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Member::getPhone,pageWrap.getModel().getName())
+                        .or().like(Member::getName,pageWrap.getModel().getName()))
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),
+                        ms->ms.like(Company::getName,pageWrap.getModel().getCompanyName())
+                        .or().like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName()))
+                .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
+                .eq(Member::getStatus,Constants.Status.FREEZE.getValue())
+                .eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Company::getId,pageWrap.getModel().getCompanyId())
+                .eq(Objects.nonNull(pageWrap.getModel().getCode()),Member::getCode,pageWrap.getModel().getCode())
+                .orderByDesc(Member::getCreateDate);
+
+
+        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
+        return PageData.from(memberIPage);
+
+    }
+
+
+    /**
+     * 鐢ㄦ埛瑙e喕 娣诲姞鎺堟潈瀵煎叆璁板綍
+     * @param member
+     */
+    public void thawMember(Member member){
+        //鐢ㄦ埛瑙掕壊缁�
+        List<MemberRole> memberRoleList =  memberRoleMapper.selectList(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
+        if(CollectionUtils.isNotEmpty(memberRoleList)){
+            List<Integer> roleIds = memberRoleList.stream().map(m->m.getId()).collect(Collectors.toList());
+            //瑙掕壊缁勮澶囨潈闄�
+            List<DeviceRole> deviceRoleList= deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
+                    .eq(DeviceRole::getType,Constants.TWO)
+                    .in(DeviceRole::getId,roleIds));
+
+            if(CollectionUtils.isNotEmpty(deviceRoleList)){
+                String ids = "";
+                List<Integer> r = new ArrayList<>();
+                for (int i = 0; i < deviceRoleList.size(); i++) {
+                    DeviceRole deviceRole =deviceRoleList.get(i);
+                    if(i>0){
+                        ids += ",";
+                    }
+                    Integer id =deviceRole.getId();
+                    ids += "["+id+"]";
+                    String doorids =deviceRole.getDoorIds();
+                    if(StringUtils.isNotBlank(doorids)){
+                        String[] ss = doorids.split(",");
+                        try {
+                            for(String s :ss){
+                                r.add(Integer.parseInt(s));
+                            }
+                        }catch (Exception e){
+                            //鑴忔暟鎹笉澶勭悊
+                        }
+                    }
+                }
+
+                if(CollectionUtils.isNotEmpty(r)){
+                    List<Empower> list = new ArrayList<>();
+                    List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().lambda().in(Device::getId,r));
+                    if(deviceList == null || deviceList.size() == 0){
+                        return;
+                    }
+                    for (Device deviceRole:deviceList) {
+                        Empower model = new Empower();
+                        model.setCreateDate(new Date());
+                        model.setMemberId(member.getId());
+                        model.setIsdeleted(Constants.ZERO);
+                        model.setDeviceId(deviceRole.getId());
+                        model.setSendStatus(Constants.ZERO);
+                        model.setSendType(Constants.ZERO);
+                        model.setFailFlag(Constants.ZERO);
+                        list.add(model);
+                    }
+                    //瀵煎叆鏂板鐨勬巿鏉冧俊鎭�
+                    empowerMapper.insertBatchSomeColumn(list);
+                }
+            }
+        }
+    }
+
+
+
+    /**
+     * 瀹氭椂鍐荤粨鍐呴儴浜哄憳
+     */
+    @Override
+    public void memberFreeze(){
+        SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_FREEZE);
+        if(Objects.isNull(systemDictData)||
+                StringUtils.isBlank(systemDictData.getCode())
+        ){
+            return;
+        }
+        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>()
+                .lambda().eq(Member::getIsdeleted,Constants.ZERO)
+                .eq(Member::getType,Constants.memberType.internal)
+                .eq(Member::getStatus,Constants.ZERO)
+                .isNotNull(Member::getHkId)
+                .exists(" SELECT 1 FROM device_event b WHERE b.ext_event_person_no =  HK_ID AND TO_DAYS( NOW()) - TO_DAYS( b.CREATE_DATE ) > "+systemDictData.getCode()+"  ")
+        );
+        if(CollectionUtils.isEmpty(memberList)){
+           return;
+        }
+        List<Integer> memberIds = memberList.stream().map(m->m.getId()).collect(Collectors.toList());
+
+        for (Integer id:memberIds) {
+            UserAction userAction=new UserAction();
+            userAction.setIsdeleted(Constants.ZERO);
+            userAction.setCreateDate(new Date());
+            userAction.setType(1);
+            userAction.setRemark("鐢卞畾鏃朵换鍔′簬銆愭搷浣滄椂闂�"+DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"銆戯紝杩涜銆愬喕缁撱��");
+            userAction.setMemberId(id+"");
+            userActionJoinMapper.insert(userAction);
+        }
+
+
+        //鍐荤粨鐘舵��
+        memberMapper.update(null,new UpdateWrapper<Member>()
+                .lambda().set(Member::getStatus,Constants.TWO)
+                .set(Member::getEditDate,new Date())
+                .in(Member::getId,memberIds)
+        );
+        //澶勭悊涓嬪彂鏁版嵁
+        empowerMapper.update(null,new UpdateWrapper<Empower>()
+                .lambda()
+                .set(Empower::getIsdeleted,Constants.ONE)
+                .set(Empower::getSendStatus,Constants.ZERO)
+                .set(Empower::getEditDate,new Date())
+                .in(Empower::getMemberId,memberIds)
+        );
+    }
+
+
+
+
+
+
+
+
+    /********************************************鍏紬鍙锋帴鍙�***********************************************************************/
+
+
+    /**
+     * 寰俊鎺堟潈鎺ュ彛
+     * @param code
+     * @return
+     */
+    @Override
+    public WxAuthorizeVO wxAuthorize(String code){
+        String appId = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_APPID).getCode();
+        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_SECRET).getCode();
+        String getTokenUrl = WXConstant.GET_USER_INFO_URL.replace("CODE", code)
+                .replace("APPID", appId).replace("SECRET", appSecret);
+        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
+        String openId = null;
+        if(!Objects.isNull(tokenJson.get("access_token"))){
+            openId = tokenJson.getString("openid");
+        }
+        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
+        wxAuthorizeVO.setOpenid(openId);
+        //鏍规嵁openId 鏌ヨ鐢ㄦ埛淇℃伅
+        Member member = memberJoinMapper.selectJoinOne(Member.class,new MPJLambdaWrapper<Member>()
+                .selectAll(Member.class)
+                .selectAs(Company::getName,Member::getCompanyName)
+                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
+                .eq(Member::getOpenid,openId)
+                .eq(Member::getIsdeleted,Constants.ZERO)
+                .orderByDesc(Member::getCreateDate)
+                .last(" limit 1 ")
+        );
+        //闈炶瀹㈢敤鎴� 杩涜鍒ゆ柇鏄惁瀛樺湪鐢ㄦ埛
+        if(!Objects.isNull(member)){
+            if(member.getIsdeleted() == Constants.ONE){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸插垹闄�,璇疯仈绯荤鐞嗗憳");
+            }
+            if(member.getStatus() != Constants.ZERO){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸茬鐢�,璇疯仈绯荤鐞嗗憳");
+            }
+            if(StringUtils.isNotBlank(member.getIdcardNo())){
+               member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
+            }
+            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
+                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+            member.setPrefixUrl(prefixUrl);
+            JwtPayLoad payLoad = new JwtPayLoad(Integer.toString(member.getId()));
+            String token = JwtTokenUtil.generateToken(payLoad);
+            //瀛樺偍token鑷硆edis
+            RedisUtil.addObject(redisTemplate,Constants.RedisKeys.INTERNAL_TOKEN+"_"+member.getId(),token,Constants.RedisKeys.EXPIRE_TIME);
+            wxAuthorizeVO.setToken(token);
+            wxAuthorizeVO.setMember(member);
+        }
+        return wxAuthorizeVO;
+    }
+
+
+
+
+    @Override
+    public MemberVO getVisitedMember(CheckVisitedDTO checkVisitedDTO){
+        Integer validType = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.BEVISITED_USER_VALID).getCode());
+        if(Objects.isNull(checkVisitedDTO)||StringUtils.isBlank(checkVisitedDTO.getMobile())||(validType.equals(Constants.ONE)&&StringUtils.isBlank(checkVisitedDTO.getName()))){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                .eq(Member::getPhone,checkVisitedDTO.getMobile())
+                .eq(validType.equals(Constants.ONE),Member::getName,checkVisitedDTO.getName())
+                .eq(Member::getIsdeleted,Constants.ZERO)
+//                .eq(Member::getStatus,Constants.ZERO)
+                .eq(Member::getCanVisit,Constants.ONE)
+                .eq(Member::getType,Constants.memberType.internal)
+                .last(" limit 1 ")
+        );
+        MemberVO memberVO = new MemberVO();
+        if(!Objects.isNull(member)){
+            if(!member.getStatus().equals(Constants.ZERO)){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"琚浜鸿处鍙峰紓甯革紝璇风‘璁ゅ悗鍐嶈瘯");
+            }
+            BeanUtils.copyProperties(member,memberVO);
+        }else{
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"璇锋牳瀹炶璁夸汉淇℃伅!");
+        }
+        return memberVO;
+    }
+
+
+
+
+    @Override
+    public PageData<MemberVO> getVisitedMemberList(PageWrap<VisitMemberDTO> param) {
+        VisitMemberDTO visitMemberDTO = param.getModel();
+        IPage<Member> page = new Page<>(param.getPage(), param.getCapacity());
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
+        Utils.MP.blankToNull(visitMemberDTO);
+
+        queryWrapper.selectAs(Member::getId,MemberVO::getId);
+        queryWrapper.selectAs(Member::getName,MemberVO::getName);
+        queryWrapper.selectAs(Member::getPhone,MemberVO::getPhone);
+        queryWrapper.selectAs(Member::getCompanyId,MemberVO::getCompanyId);
+        queryWrapper.selectAs(Member::getFaceImg,MemberVO::getFaceImg);
+
+        queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
+        queryWrapper.eq(Member::getStatus,Constants.ZERO);
+        queryWrapper.eq(Member::getCanVisit,Constants.ONE);
+        queryWrapper.eq(Member::getType,Constants.memberType.internal);
+        if(!Objects.isNull(visitMemberDTO)){
+            queryWrapper.and(StringUtils.isNotBlank(visitMemberDTO.getName()), ms->ms.like(Member::getPhone,visitMemberDTO.getName())
+                    .or().like(Member::getPhone,visitMemberDTO.getName()));
+        }
+        queryWrapper.orderByDesc(Visits::getCreateDate);
+        IPage<MemberVO> result = memberJoinMapper.selectJoinPage(page, MemberVO.class,queryWrapper);
+
+        String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
+                systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
+        result.getRecords().forEach(i->{
+            i.setPrefixUrl(prefixUrl);
+        });
+
+        return PageData.from(result);
+    }
+
+
+
+
+    @Override
+    public WxAuthorizeVO accountLogin(AccountLoginDTO accountLoginDTO){
+        if(accountLoginDTO.getAccount().length()!=18
+            //&&!IdcardUtil.isValidCard(accountLoginDTO.getAccount())
+        ){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝韬唤璇佸彿鐮佹湁璇紝璇锋牳瀹炲悗閲嶈瘯锛�");
+        }
+        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+                .eq(Member::getIdcardNo, DESUtil.encrypt(Constants.EDS_PWD, accountLoginDTO.getAccount()))
+                .ne(Member::getType,Constants.memberType.visitor)
+        );
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈煡璇㈠埌鐢ㄦ埛,璇疯仈绯荤鐞嗗憳");
+        }
+        if(member.getIsdeleted() == Constants.ONE){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸插垹闄�,璇疯仈绯荤鐞嗗憳");
+        }
+        if(member.getStatus() != Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸茬鐢�,璇疯仈绯荤鐞嗗憳");
+        }
+        String md5Password = DESUtil.encrypt(Constants.EDS_PWD, accountLoginDTO.getPassword());
+        if(!md5Password.equals(member.getPassward())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璐︽埛瀵嗙爜閿欒!");
+        }
+        if(StringUtils.isNotBlank(accountLoginDTO.getOpenId())){
+            //鍏堟竻绌哄師鏈夎瀹㈢殑openid缁戝畾鍏崇郴
+            memberMapper.update(null, new UpdateWrapper<Member>().lambda()
+                    .ne(Member::getType,Constants.memberType.visitor)
+                    .eq(Member::getOpenid,accountLoginDTO.getOpenId())
+                    .set(Member::getOpenid,null)
+            );
+            //鏇存柊褰撳墠鐧诲綍鐢ㄦ埛 openId
+            member.setOpenid(accountLoginDTO.getOpenId());
+            memberMapper.updateById(member);
+        }
+        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
+        JwtPayLoad payLoad = new JwtPayLoad(Integer.toString(member.getId()));
+        String token = JwtTokenUtil.generateToken(payLoad);
+        //瀛樺偍token鑷硆edis
+        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.INTERNAL_TOKEN+"_"+member.getId(),token,Constants.RedisKeys.EXPIRE_TIME);
+        wxAuthorizeVO.setToken(token);
+        return wxAuthorizeVO;
+    }
+
+
+
+    @Override
+    public StagingDataVO stagingHead(StagingDataVO stagingHeadVO){
+        //浜哄憳淇℃伅
+        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO));
+        if(CollectionUtils.isNotEmpty(memberList)){
+            stagingHeadVO.setWorkerCount(memberList.stream().filter(m->m.getType().equals(Constants.memberType.internal)).count());
+            stagingHeadVO.setLwCount(memberList.stream().filter(m->m.getType().equals(Constants.memberType.lw_visitor)).count());
+            stagingHeadVO.setVisitorCount(memberList.stream().filter(m->m.getType().equals(Constants.memberType.visitor)).count());
+        }
+        //鍦ㄥ満杞﹁締
+        stagingHeadVO.setPresenceCarCount(retentionJoinMapper.selectCount(new QueryWrapper<Retention>().lambda().eq(Retention::getType,3)));
+        //闀挎湡杞﹁締
+        stagingHeadVO.setLongCarCount(retentionJoinMapper.selectCount(new QueryWrapper<Retention>().lambda().eq(Retention::getType,3)
+                .exists(" select 1 from park_book p where p.origin = 0 and p.car_code = retention.car_no and p.ISDELETED = 0  ")
+        ));
+        stagingHeadVO.setVisitorCarCount(stagingHeadVO.getPresenceCarCount() - stagingHeadVO.getLongCarCount());
+        stagingHeadVO.setSupplierCount(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
+                .eq(Company::getIsdeleted,Constants.ZERO)
+                .eq(Company::getType,Constants.ZERO)
+        ));
+        return stagingHeadVO;
+    }
+
+
+    @Override
+    public StagingDataVO stagingBody(StagingDataVO stagingHeadVO){
+        List<Map<String,Object>> companyMaps = memberJoinMapper.selectJoinMaps(
+                new MPJLambdaWrapper<Member>()
+                        .select("count(1) as memberCount, t1.name as companyName")
+                        .leftJoin(Company.class,Company::getId,Member::getCompanyId)
+                        .eq(Member::getType,Constants.memberType.lw_visitor)
+                        .groupBy(Company::getId,Company::getName)
+        );
+        List<Map<String,Object>> retentionMaps = retentionJoinMapper.selectMaps(new MPJLambdaWrapper<Retention>()
+                        .select(" count(1) as memberCount, type as memberType ")
+                        .ne(Retention::getType,3)
+                .groupBy(Retention::getType)
+        );
+        stagingHeadVO.setCompanyUsers(companyMaps);
+        stagingHeadVO.setRetentionUsers(retentionMaps);
+        return stagingHeadVO;
+    }
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ProblemsServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ProblemsServiceImpl.java
new file mode 100644
index 0000000..9dcf9b4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ProblemsServiceImpl.java
@@ -0,0 +1,251 @@
+package com.doumee.service.business.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.doumee.core.model.LoginUserInfo;
+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.admin.request.OptionsObject;
+import com.doumee.dao.admin.response.ProblemDTO;
+import com.doumee.dao.business.ProblemsMapper;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Problems;
+import com.doumee.dao.web.response.ProblemsVO;
+import com.doumee.service.business.ProblemsService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 璇曢淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class ProblemsServiceImpl implements ProblemsService {
+
+    @Autowired
+    private ProblemsMapper problemsMapper;
+
+    @Override
+    public Integer create(Problems problems) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Problems newProblems = new Problems();
+
+        newProblems.setCreator(loginUserInfo.getId());
+        newProblems.setCreateDate(new Date());
+        newProblems.setEditor(loginUserInfo.getId());
+        newProblems.setEditDate(new Date());
+        newProblems.setIsdeleted(Constants.ZERO);
+        newProblems.setRemark(problems.getRemark());
+        newProblems.setTitle(problems.getTitle());
+        if(null != problems.getObjectList() && problems.getObjectList().size() > 0) {
+            newProblems.setOptions(JSON.toJSONString(problems.getObjectList()));
+        }
+        newProblems.setAnswer(problems.getAnswer());
+        newProblems.setSortnu(problems.getSortnu());
+        newProblems.setType(problems.getType());
+        newProblems.setScore(problems.getScore());
+        newProblems.setUseType(problems.getUseType());
+        problemsMapper.insert(newProblems);
+        return newProblems.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        problemsMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(Problems problems) {
+        UpdateWrapper<Problems> deleteWrapper = new UpdateWrapper<>(problems);
+        problemsMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        problemsMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(Problems problems) {
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Problems update = new Problems();
+        update.setId(problems.getId());
+        update.setEditor(loginUserInfo.getId());
+        update.setEditDate(new Date());
+        update.setTitle(problems.getTitle());
+        if(null != problems.getObjectList() && problems.getObjectList().size() > 0) {
+            update.setOptions(JSON.toJSONString(problems.getObjectList()));
+        }
+        update.setAnswer(problems.getAnswer());
+        update.setSortnu(problems.getSortnu());
+        update.setType(problems.getType());
+        update.setScore(problems.getScore());
+        update.setUseType(problems.getUseType());
+        problemsMapper.updateById(update);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Problems> problemss) {
+        if (CollectionUtils.isEmpty(problemss)) {
+            return;
+        }
+        for (Problems problems: problemss) {
+            this.updateById(problems);
+        }
+    }
+
+    @Override
+    public Problems findById(Integer id) {
+        Problems problems = problemsMapper.selectById(id);
+        if(null != problems && StringUtils.isNotBlank(problems.getOptions())) {
+            problems.setObjectList(JSON.parseArray(problems.getOptions(), OptionsObject.class));
+        }
+        return problems;
+    }
+
+    @Override
+    public Problems findOne(Problems problems) {
+        QueryWrapper<Problems> wrapper = new QueryWrapper<>(problems);
+        return problemsMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Problems> findList(Problems problems) {
+        QueryWrapper<Problems> wrapper = new QueryWrapper<>(problems);
+        return problemsMapper.selectList(wrapper);
+    }
+
+    @Override
+    public PageData<Problems> findPage(PageWrap<Problems> pageWrap) {
+        IPage<Problems> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Problems> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(Problems::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(Problems::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(Problems::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(Problems::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(Problems::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(Problems::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(Problems::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(Problems::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(Problems::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getTitle() != null) {
+            queryWrapper.lambda().like(Problems::getTitle, pageWrap.getModel().getTitle());
+        }
+        if (pageWrap.getModel().getOptions() != null) {
+            queryWrapper.lambda().eq(Problems::getOptions, pageWrap.getModel().getOptions());
+        }
+        if (pageWrap.getModel().getAnswer() != null) {
+            queryWrapper.lambda().eq(Problems::getAnswer, pageWrap.getModel().getAnswer());
+        }
+        if (pageWrap.getModel().getSortnu() != null) {
+            queryWrapper.lambda().eq(Problems::getSortnu, pageWrap.getModel().getSortnu());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().in(Problems::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getScore() != null) {
+            queryWrapper.lambda().eq(Problems::getScore, pageWrap.getModel().getScore());
+        }
+        if (pageWrap.getModel().getUseType() != null) {
+            queryWrapper.lambda().eq(Problems::getUseType, pageWrap.getModel().getUseType());
+        }
+        queryWrapper.lambda().orderByAsc(Problems::getSortnu);
+        queryWrapper.select("problems.*, (select REALNAME from system_user where system_user.id = problems.CREATOR) as creatorName");
+        IPage<Problems> problemsIPage = problemsMapper.selectPage(page, queryWrapper);
+        if(null != problemsIPage && problemsIPage.getRecords().size() > 0) {
+            List<Problems> newProblems = new ArrayList<>();
+            List<Problems> newDatas = problemsIPage.getRecords();
+            for (Problems dto:newDatas) {
+                dto.setObjectList(JSON.parseArray(dto.getOptions(), OptionsObject.class));
+                newProblems.add(dto);
+            }
+            problemsIPage.setRecords(newProblems);
+        }
+        return PageData.from(problemsIPage);
+    }
+
+    @Override
+    public long count(Problems problems) {
+        QueryWrapper<Problems> wrapper = new QueryWrapper<>(problems);
+        return problemsMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public List<ProblemDTO> findListByUseType(Integer useType) {
+        LambdaQueryWrapper<Problems> wrapper = new LambdaQueryWrapper<>();
+
+        wrapper.eq(Problems::getIsdeleted, Constants.ZERO)
+                .eq(Problems::getUseType, useType)
+                .orderByAsc(Problems::getSortnu);
+        List<Problems> problems = problemsMapper.selectList(wrapper);
+
+        List<ProblemDTO> collect = problems.stream().map(s -> {
+            ProblemDTO dto = new ProblemDTO();
+            BeanUtils.copyProperties(dto, s);
+            return dto;
+        }).collect(Collectors.toList());
+
+        return collect;
+
+    }
+
+
+    /**
+     * 鑾峰彇棰樼洰淇℃伅
+     * @param useType
+     * @return
+     */
+    @Override
+    public List<ProblemsVO> getProblemsVO(Integer useType){
+        List<Problems> problemsList = problemsMapper.selectList(new QueryWrapper<Problems>().lambda()
+                .and(ms->ms.eq(Problems::getUseType,useType).or().eq(Problems::getUseType,Constants.ZERO))
+                .eq(Problems::getIsdeleted, Constants.ZERO).orderByAsc(Problems::getSortnu));
+        List<ProblemsVO> problemsVOList = new ArrayList<>();
+        for (Problems problems:problemsList) {
+            ProblemsVO problemsVO = new ProblemsVO();
+            BeanUtils.copyProperties(problems,problemsVO);
+            problemsVOList.add(problemsVO);
+        }
+        return problemsVOList;
+    }
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java
new file mode 100644
index 0000000..0268516
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java
@@ -0,0 +1,419 @@
+package com.doumee.service.business.impl.hksync;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseListPageResponse;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
+import com.doumee.core.haikang.model.param.request.AcsDeviceStatusListRequest;
+import com.doumee.core.haikang.model.param.request.DoorsListRequest;
+import com.doumee.core.haikang.model.param.request.ParkListRequest;
+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.DateUtil;
+import com.doumee.dao.business.DeviceMapper;
+import com.doumee.dao.business.ParksMapper;
+import com.doumee.dao.business.model.Device;
+import com.doumee.dao.business.model.Parks;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 璁惧淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class HkSyncDeviceServiceImpl extends HkSyncBaseServiceImpl {
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    /**
+     * 鍚屾娴峰悍闂ㄧ璁惧鏁版嵁
+     * @param param
+     * @return
+     */
+    @Override
+//    @Async
+    public String syncHkDevices(AcsDeviceListRequest param){
+        if(Constants.DEALING_HK_SYNCDEVICE){
+            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鍚屾浠诲姟姝e湪鎵ц鍝︼紝璇风◢鍚庢煡鐪嬬粨鏋滐紒") ;
+        }
+        Constants.DEALING_HK_SYNCDEVICE =true;
+        try {
+            List<Device> deleteList = new ArrayList<>();
+            List<Device> addList = new ArrayList<>();
+            List<Device> editList = new ArrayList<>();
+            Date date = new Date();
+            //鏌ヨ鍏ㄩ儴闂ㄧ璁惧鏁版嵁
+            List<Device> allList = deviceMapper.selectList(null);
+            List<DoorsInfoResponse> allDoors = getAllDoorList();
+            List<AcsDeviceInfoResponse> allHkList = getAllDeViceList();
+            /**
+             * 鑾峰彇澧炲垹鏀规暟鎹泦鍚�
+             */
+            getDataChangeList(allList,allDoors,allHkList,addList,editList,deleteList,date);
+            if(deleteList.size()>0){
+                //閫昏緫鍒犻櫎
+                for(Device d : deleteList){
+                    deviceMapper.updateById(d);
+                }
+            }
+            if(addList.size()>0){
+                deviceMapper.insertBatchSomeColumn(addList);
+            }
+            if(editList.size()>0){
+                for(Device d : editList){
+                    deviceMapper.updateById(d);
+                }
+            }
+            return "鍚屾鏁版嵁锛氭柊澧炪��"+addList.size()+"銆戞潯锛屾洿鏂般��"+editList.size()+"銆戞潯锛屽垹闄ゃ��"+deleteList.size()+"銆戞潯";
+        }catch (Exception e){
+            e.printStackTrace();
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "鍚屾澶辫触锛�");
+        }finally {
+            Constants.DEALING_HK_SYNCDEVICE =false;
+        }
+    }
+    @Override
+//    @Async
+    public void getAscDeviceStatus(){
+        if(Constants.DEALING_HK_SYNCDEVICE_STATUS){
+            return;
+        }
+        Constants.DEALING_HK_SYNCDEVICE_STATUS =true;
+        try {
+            List<Device> editList = new ArrayList<>();
+            Date date = new Date();
+            //鏌ヨ鍏ㄩ儴闂ㄧ璁惧鏁版嵁
+            List<AscDeviceStatusInfoResponse> allHkList = getAllDeviceStatusList();
+
+            if(allHkList.size()>0){
+                //閫昏緫鍒犻櫎
+                for(AscDeviceStatusInfoResponse d : allHkList){
+                    deviceMapper.update(null,new UpdateWrapper<Device>().lambda()
+                            .set(Device::getOnline,d.getOnline())
+                            .set(Device::getIp,d.getIp())
+                            .set(Device::getPort,d.getPort())
+                            .set(Device::getManufature,d.getManufacturer())
+                            .set(Device::getEditDate,date)
+                            .eq(Device::getHkId,d.getIndexCode()));
+                }
+            }
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "鍚屾璁惧鐘舵�佸け璐ワ紒");
+        }finally {
+            Constants.DEALING_HK_SYNCDEVICE_STATUS =false;
+        }
+    }
+
+    private List<AcsDeviceInfoResponse> getAllDeViceList() {
+        AcsDeviceListRequest param = new AcsDeviceListRequest();
+        List<AcsDeviceInfoResponse> allHkList = new ArrayList<>();
+        boolean hasNext = true;
+        int curTotal = 0;
+        int curPage = 1;
+        while (hasNext){
+            //鍒嗛〉閬嶅巻寰幆鏌ヨ鎵�鏈夐棬绂佽澶囨暟鎹�
+            param = new AcsDeviceListRequest();
+            param.setPageNo(curPage);
+            param.setPageSize(100);
+            BaseResponse<AcsDeviceListResponse> response = HKService.acsDeviceList(param);
+            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+            }
+            AcsDeviceListResponse r = response.getData();
+            curTotal += 100;
+            if(curTotal >= r.getTotal()){
+                hasNext = false;
+            }
+            if(r.getList() == null || r.getList().size()==0){
+                hasNext =false;
+            }else{
+                allHkList.addAll(r.getList());
+            }
+            curPage++;
+        }
+        return allHkList;
+    }
+
+    public  List<DoorsInfoResponse>  getAllDoorList(){
+        List<DoorsInfoResponse> allDoorList = new ArrayList<>();
+        Date date = new Date();
+        boolean hasNext = true;
+        int curTotal = 0;
+        int curPage = 1;
+        while (hasNext){
+            //鍒嗛〉閬嶅巻寰幆鏌ヨ鎵�鏈夐棬绂佽澶囨暟鎹�
+            DoorsListRequest param = new DoorsListRequest();
+            param.setPageNo(curPage);
+            param.setPageSize(100);
+            BaseResponse<DoorsListResponse> response = HKService.doorSearch(param);
+            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+            }
+            DoorsListResponse r = response.getData();
+            curTotal += 100;
+            if(curTotal >= r.getTotal()){
+                hasNext = false;
+            }
+            if(r.getList() == null || r.getList().size()==0){
+                hasNext =false;
+            }else{
+                allDoorList.addAll(r.getList());
+            }
+            curPage++;
+        }
+        return  allDoorList;
+    }
+    public  List<AscDeviceStatusInfoResponse>  getAllDeviceStatusList(){
+        List<AscDeviceStatusInfoResponse> allDoorList = new ArrayList<>();
+        Date date = new Date();
+        boolean hasNext = true;
+        int curTotal = 0;
+        int curPage = 1;
+        while (hasNext){
+            //鍒嗛〉閬嶅巻寰幆鏌ヨ鎵�鏈夐棬绂佽澶囨暟鎹�
+            AcsDeviceStatusListRequest param = new AcsDeviceStatusListRequest();
+            param.setPageNo(curPage);
+            param.setPageSize(100);
+            BaseResponse<BaseListPageResponse<AscDeviceStatusInfoResponse>> response = HKService.acsDeviceStatus(param);
+            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+            }
+            BaseListPageResponse r = response.getData();
+            curTotal += 100;
+            if(curTotal >= r.getTotal()){
+                hasNext = false;
+            }
+            if(r.getList() == null || r.getList().size()==0){
+                hasNext =false;
+            }else{
+                allDoorList.addAll(r.getList());
+            }
+            curPage++;
+        }
+        return  allDoorList;
+    }
+
+    private void getDataChangeList(List<Device> allList, List<DoorsInfoResponse> hkDoorList , List<AcsDeviceInfoResponse> allHkList, List<Device> addList, List<Device> editList,List<Device> deleteList, Date date) {
+        if(hkDoorList!=null && hkDoorList.size()>0){
+            //鑾峰彇娴峰悍鍏ㄩ儴闂ㄧ缁勬暟鎹�
+            for(DoorsInfoResponse device : hkDoorList){
+                Device model = getExistedDoor(device,allList);
+                if(model !=null){
+                    //濡傛灉宸插瓨鍦紝鍒欐洿鏂版暟鎹�
+                    model =  initDoorDataByHkData(model,device,date,allHkList);
+                    editList.add(model);
+                }else{
+                    //濡傛灉涓嶅瓨鍦紝鍒欐柊澧炴暟鎹�
+                    model = new Device();
+                    model =  initDoorDataByHkData(model,device,date,allHkList);
+                    model.setIsEntrance(Constants.ZERO);
+                    addList.add(model);
+                }
+            }
+        }
+        //鍒ゆ柇鑾峰彇鍒犻櫎鐨勯棬绂佽澶囷紝閫昏緫鍒犻櫎
+        getDeleteDoorList(allList,hkDoorList,deleteList,date);
+    }
+
+    private Device initDoorDataByHkData(Device model, DoorsInfoResponse door, Date date, List<AcsDeviceInfoResponse> allHkList) {
+        AcsDeviceInfoResponse device = getDeviceByDoorid(door.getParentIndexCode(),allHkList);
+        model.setIsdeleted(Constants.ZERO);
+        model.setIp(device.getIp());
+        model.setHkDate(date);
+        model.setCreateDate(DateUtil.getISO8601DateByStr(device.getCreateTime()));
+        model.setEditDate(DateUtil.getISO8601DateByStr(device.getUpdateTime()));
+        model.setNo(device.getDevSerialNum());
+        model.setHkId(device.getIndexCode());
+        model.setName(device.getName());
+        model.setHkStatus(Constants.ONE);
+        model.setManufature(device.getManufacturer());
+        model.setType(Constants.ZERO);
+//        model.setNo(device.getDevSerialNum());
+//        model.setChannelNo(getChannelNo(device.getIndexCode(),hkDoorList,model));
+        model.setChannelNo(door.getChannelNo());
+        model.setChannelInfo(door.getName());
+        model.setResourceType(device.getResourceType());
+        model.setDevTypeCode(device.getDevTypeCode());
+        model.setDevTypeDesc(device.getDevTypeDesc());
+        model.setManufature(device.getManufacturer());
+        model.setPort(device.getPort());
+        model.setRemark(JSONObject.toJSONString(device));
+        model.setDoorId(door.getIndexCode());
+        model.setDoorName(door.getName());
+        model.setRegionName(door.getRegionName());
+        model.setRegionPathName(door.getRegionPathName());
+        model.setDoorNo(door.getDoorNo());
+        return  model;
+    }
+    private AcsDeviceInfoResponse getDeviceByDoorid(String indexCode, List<AcsDeviceInfoResponse> allHkList ) {
+        if(allHkList!=null && allHkList.size()>0){
+            for(AcsDeviceInfoResponse info : allHkList){
+                if(StringUtils.equals(indexCode,info.getIndexCode())){
+                 return info;
+                }
+            }
+        }
+
+        return new AcsDeviceInfoResponse();
+    }
+    private void getDataChangeList(List<Device> allList, List<AcsDeviceInfoResponse> allHkList, List<Device> addList, List<Device> editList,List<Device> deleteList, Date date) {
+        if(allHkList!=null && allHkList.size()>0){
+            //鑾峰彇娴峰悍鍏ㄩ儴闂ㄧ缁勬暟鎹�
+            List<DoorsInfoResponse> hkDoorList = getAllDoorList();
+            for(AcsDeviceInfoResponse device : allHkList){
+                Device model = getExistedDevice(device,allList);
+                if(model !=null){
+                    //濡傛灉宸插瓨鍦紝鍒欐洿鏂版暟鎹�
+                    model =  initDataByHkData(model,device,date,hkDoorList);
+                    editList.add(model);
+                }else{
+                    //濡傛灉涓嶅瓨鍦紝鍒欐柊澧炴暟鎹�
+                    model = new Device();
+                    model =  initDataByHkData(model,device,date,hkDoorList);
+                    addList.add(model);
+                }
+            }
+        }
+        //鍒ゆ柇鑾峰彇鍒犻櫎鐨勯棬绂佽澶囷紝閫昏緫鍒犻櫎
+        getDeleteList(allList,allHkList,deleteList,date);
+    }
+
+    /**
+     * 鍒濆鍖栨捣搴峰叆搴撴暟鎹�
+     * @param model
+     * @param device
+     * @param date
+     * @return
+     */
+    private Device initDataByHkData(Device model, AcsDeviceInfoResponse device,Date date, List<DoorsInfoResponse> hkDoorList) {
+        model.setIsdeleted(Constants.ZERO);
+        model.setIp(device.getIp());
+        model.setHkDate(date);
+        model.setCreateDate(DateUtil.getISO8601DateByStr(device.getCreateTime()));
+        model.setEditDate(DateUtil.getISO8601DateByStr(device.getUpdateTime()));
+        model.setNo(device.getDevSerialNum());
+        model.setHkId(device.getIndexCode());
+        model.setName(device.getName());
+        model.setHkStatus(Constants.ONE);
+        model.setManufature(device.getManufacturer());
+        model.setType(Constants.ZERO);
+//        model.setNo(device.getDevSerialNum());
+        model.setChannelNo(getChannelNo(device.getIndexCode(),hkDoorList,model));
+        model.setResourceType(device.getResourceType());
+        model.setDevTypeCode(device.getDevTypeCode());
+        model.setDevTypeDesc(device.getDevTypeDesc());
+        model.setManufature(device.getManufacturer());
+        model.setPort(device.getPort());
+        model.setRemark(JSONObject.toJSONString(device));
+        return  model;
+    }
+
+    private String getChannelNo(String indexCode, List<DoorsInfoResponse> hkDoorList,Device model ) {
+        String str = "";
+        String names = "";
+        if(hkDoorList!=null && hkDoorList.size()>0){
+            for(DoorsInfoResponse info : hkDoorList){
+                if(StringUtils.equals(indexCode,info.getParentIndexCode())){
+                    if(StringUtils.isBlank(info.getChannelNo())){
+                        continue;
+                    }
+                    if(StringUtils.isNotBlank(str)){
+                        str += ",";
+                        names += ",";
+                    }
+                    str+=info.getChannelNo();
+                    names+=info.getName();
+                }
+            }
+        }
+        model.setChannelNo(str);
+        model.setChannelInfo(names);
+        return str;
+    }
+
+    private Device getExistedDoor(DoorsInfoResponse device, List<Device> allList) {
+        if(allList.size()>0){
+            for(Device r : allList){
+                if(StringUtils.equals(r.getDoorId(), device.getIndexCode())){
+                    //琛ㄧず鏈垹闄�
+                    return  r;
+                }
+            }
+        }
+        return  null;
+    }
+    private Device getExistedDevice(AcsDeviceInfoResponse device, List<Device> allList) {
+        if(allList.size()>0){
+            for(Device r : allList){
+                if(StringUtils.equals(r.getHkId(), device.getIndexCode())){
+                    //琛ㄧず鏈垹闄�
+                    return  r;
+                }
+            }
+        }
+        return  null;
+    }
+
+    private void getDeleteList(List<Device> allList, List<AcsDeviceInfoResponse> allHkList,List<Device> deleteList ,Date date) {
+        if(allList!=null && allList.size()>0){
+            for(Device device : allList){
+                if(isDeletedDevice(device,allHkList)){
+                    device.setIsdeleted(Constants.ONE);
+                    device.setEditDate(date);
+                    deleteList.add(device);
+                }
+            }
+        }
+    }
+    private void getDeleteDoorList(List<Device> allList,  List<DoorsInfoResponse> allHkList,List<Device> deleteList ,Date date) {
+        if(allList!=null && allList.size()>0){
+            for(Device device : allList){
+                if(isDeletedDoorDevice(device,allHkList)){
+                    device.setIsdeleted(Constants.ONE);
+                    device.setEditDate(date);
+                    deleteList.add(device);
+                }
+            }
+        }
+    }
+
+    private boolean isDeletedDoorDevice(Device device, List<DoorsInfoResponse> allHkList) {
+        if(allHkList.size()>0){
+            for(DoorsInfoResponse r : allHkList){
+                if(StringUtils.equals(device.getDoorId(), r.getIndexCode())){
+                    //琛ㄧず鏈垹闄�
+                    return  false;
+                }
+            }
+        }
+        return  true;
+
+    }
+    private boolean isDeletedDevice(Device device, List<AcsDeviceInfoResponse> allHkList) {
+        if(allHkList.size()>0){
+            for(AcsDeviceInfoResponse r : allHkList){
+                if(StringUtils.equals(device.getHkId(), r.getIndexCode())){
+                    //琛ㄧず鏈垹闄�
+                    return  false;
+                }
+            }
+        }
+        return  true;
+
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java
new file mode 100644
index 0000000..00fbb5a
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java
@@ -0,0 +1,292 @@
+package com.doumee.service.business.impl.hksync;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.DataSyncConfig;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.*;
+import com.doumee.core.haikang.model.param.respose.AcsDeviceInfoResponse;
+import com.doumee.core.haikang.model.param.respose.AcsDeviceListResponse;
+import com.doumee.core.haikang.service.HKService;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.FtpUtil;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.model.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 璁惧淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+@Slf4j
+public class HkSyncImgServiceImpl extends HkSyncBaseServiceImpl {
+
+    @Autowired
+    private CarEventMapper carEventMapper;
+    @Autowired
+    private MemberMapper memberMapper;
+    @Autowired
+    private DeviceEventMapper deviceEventMapper;
+    @Autowired
+    private VisitEventMapper visitEventMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Override
+    public  String downHKImgs(int type){
+        if(Constants.DEALING_HK_IMG){
+            return null ;
+        }
+        Constants.DEALING_HK_IMG =true;
+        try {
+            //鏌ヨ鎵�鏈夎瀹簨浠惰褰曚腑鎵�鏈変笅杞界殑娴峰悍绔� 鎶撴媿鐓х墖 鍜� 鐓х墖
+            startDealVisitImg();
+            //鏌ヨ鎵�鏈夊仠杞﹀満浜嬩欢璁板綍涓墍鏈変笅杞界殑娴峰悍绔� 杞︾墝鍥剧墖 鍜�   杞﹁締鍥剧墖
+            startDealCarImg();
+            //鏌ヨ鎵�鏈夐棬绂佷簨浠惰褰曚腑鎵�鏈変笅杞界殑娴峰悍绔� 鎶撴媿鐓х墖 鍜�   韬唤璇佸浘鐗嘦RL
+            startDealDeviceImg();
+            //鏌ヨ鎵�鏈変汉鍛樹汉鑴哥収鐗�
+            startDealMemberImg();
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            Constants.DEALING_HK_IMG =false;
+        }
+        return  null;
+    }
+
+    private void startDealMemberImg() {
+        List<Member> list = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                .eq(Member::getIsdeleted,Constants.ZERO)
+                .likeRight(Member::getFaceImg,HKConstants.IMG_INDEX));
+        Date date= new Date();
+        if(list !=null && list.size()>0){
+            for(Member model:list){
+                String serverIndex = model.getFaceServerIndexCode();//鏈嶅姟鍣ㄧ紪鐮�
+                if(StringUtils.isBlank(serverIndex)){
+                    continue;
+                }
+                String rs1 = null;
+                Member event = new Member();
+                event.setId(model.getId());
+                event.setEditDate(date);
+                if(StringUtils.isNotBlank(model.getFaceImg())){
+                    String img1 = model.getFaceImg().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs1 = downHkImgToFtp(img1,serverIndex,Constants.MEMBER_IMG);
+                    if(StringUtils.isNotBlank(rs1)){
+                        event.setFaceImg(rs1);
+                    }else{
+                        event.setFaceImg(model.getFaceImg().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+                memberMapper.updateById(event);
+            }
+        }
+
+    }
+    private void startDealDeviceImg() {
+        List<DeviceEvent> deviceEventList = deviceEventMapper.selectList(new QueryWrapper<DeviceEvent>().lambda()
+                .eq(DeviceEvent::getIsdeleted,Constants.ZERO)
+                .and(wrapper ->{wrapper.likeRight(DeviceEvent::getExtEventPictureURL,HKConstants.IMG_INDEX)
+                        .or()
+                        .likeRight(DeviceEvent::getExtEventIDCardPictureURL,HKConstants.IMG_INDEX) ;}));
+        Date date= new Date();
+        if(deviceEventList !=null && deviceEventList.size()>0){
+            for(DeviceEvent model:deviceEventList){
+                String serverIndex = model.getSvrIndexCode();//鏈嶅姟鍣ㄧ紪鐮�
+                if(StringUtils.isBlank(serverIndex)){
+                    continue;
+                }
+                String rs1 = null;
+                String rs2 = null;
+                DeviceEvent event = new DeviceEvent();
+                event.setId(model.getId());
+                event.setEditDate(date);
+
+                if(StringUtils.isNotBlank(model.getExtEventPictureURL())){
+                    String img1 = model.getExtEventPictureURL().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs1 = downHkImgToFtp(img1,serverIndex,Constants.DEVICE_EVENT_IMG);
+                    if(StringUtils.isNotBlank(rs1)){
+                        event.setExtEventPictureURL(rs1);
+                    }else{
+                        event.setExtEventPictureURL(model.getExtEventPictureURL().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+                if(StringUtils.isNotBlank(model.getExtEventIDCardPictureURL())){
+                    String img2 = model.getExtEventIDCardPictureURL().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs2 = downHkImgToFtp(img2,serverIndex,Constants.DEVICE_EVENT_IMG);
+
+                    if(StringUtils.isNotBlank(rs2)){
+                        event.setExtEventIDCardPictureURL(rs2);
+                    }else{
+                        event.setExtEventIDCardPictureURL(model.getExtEventIDCardPictureURL().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+                deviceEventMapper.updateById(event);
+            }
+        }
+
+    }
+
+    private void startDealCarImg() {
+        List<CarEvent> carEventList = carEventMapper.selectList(new QueryWrapper<CarEvent>().lambda()
+                .eq(CarEvent::getIsdeleted,Constants.ZERO)
+                .and(wrapper ->{wrapper.likeRight(CarEvent::getPlatePicUrl,HKConstants.IMG_INDEX)
+                        .or()
+                        .likeRight(CarEvent::getVehiclePicUrl,HKConstants.IMG_INDEX) ;}));
+        Date date= new Date();
+        if(carEventList !=null && carEventList.size()>0){
+            for(CarEvent model:carEventList){
+                String serverIndex = model.getSvrIndex();//鏈嶅姟鍣ㄧ紪鐮�
+                if(StringUtils.isBlank(serverIndex)){
+                    continue;
+                }
+                CarEvent event = new CarEvent();
+                event.setId(model.getId());
+                event.setEditDate(date);
+                String rs1 = null;
+                String rs2 = null;
+
+                if(StringUtils.isNotBlank(model.getPlatePicUrl())){
+                    String img1 = model.getPlatePicUrl().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs1 = downHkImgToFtp(img1,serverIndex,Constants.CAR_EVENT_IMG);
+                    if(StringUtils.isNotBlank(rs1)){
+                        event.setPlatePicUrl(rs1);
+                    }else{
+                        event.setPlatePicUrl(model.getPlatePicUrl().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+                if(StringUtils.isNotBlank(model.getVehiclePicUrl())){
+                    String img2 = model.getVehiclePicUrl().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs2 = downHkImgToFtp(img2,serverIndex,Constants.CAR_EVENT_IMG);
+                    if(StringUtils.isNotBlank(rs2)){
+                        event.setVehiclePicUrl(rs2);
+                    }else{
+                        event.setVehiclePicUrl(model.getVehiclePicUrl().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+
+                carEventMapper.updateById(event);
+            }
+        }
+
+    }
+
+    private void startDealVisitImg() {
+        List<VisitEvent> visitEventList = visitEventMapper.selectList(new QueryWrapper<VisitEvent>().lambda()
+                .eq(VisitEvent::getIsdeleted,Constants.ZERO)
+                .and(wrapper ->{wrapper.likeRight(VisitEvent::getCaptureUrl,HKConstants.IMG_INDEX)
+                        .or()
+                        .likeRight(VisitEvent::getPhotoUrl,HKConstants.IMG_INDEX) ;}));
+
+        Date date= new Date();
+        if(visitEventList !=null && visitEventList.size()>0){
+            for(VisitEvent model:visitEventList){
+                String serverIndex = model.getSvrIndexCode();//鏈嶅姟鍣ㄧ紪鐮�
+                if(StringUtils.isBlank(serverIndex)){
+                    continue;
+                }
+                VisitEvent event = new VisitEvent();
+                event.setId(model.getId());
+                event.setEditDate(date);
+                String rs1 = null;
+                String rs2 = null;
+                if(StringUtils.isNotBlank(model.getCaptureUrl())){
+                    String img1 = model.getCaptureUrl().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs1 = downHkImgToFtp(img1,serverIndex,Constants.VISIT_EVENT_IMG);
+                    if(StringUtils.isNotBlank(rs1)){
+                        event.setCaptureUrl(rs1);
+                    }else{
+                        event.setCaptureUrl(model.getCaptureUrl().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+                if(StringUtils.isNotBlank(model.getPhotoUrl())){
+                    String img2 = model.getPhotoUrl().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
+                    rs2 = downHkImgToFtp(img2,serverIndex,Constants.VISIT_EVENT_IMG);
+                    if(StringUtils.isNotBlank(rs2)){
+                        event.setPhotoUrl(rs2);
+                    }else{
+                        event.setPhotoUrl(model.getPhotoUrl().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
+                    }
+                }
+
+                visitEventMapper.updateById(event);
+            }
+        }
+
+    }
+
+    public static  FtpUtil ftp  = null;
+    private String downHkImgToFtp(String img1, String serverIndex, String folder_code) {
+        String folder = systemDictDataBiz.queryByCode(Constants.FTP,folder_code).getCode();
+        InputStream is = null;
+        if(StringUtils.equals(folder_code,Constants.CAR_EVENT_IMG)){
+            //鍋滆溅鍦烘姄鎷嶅浘
+            CarPictureRequest param = new CarPictureRequest();
+            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
+            param.setAswSyscode(serverIndex);
+            is = HKService.getCarPicture(param);
+        }else if(StringUtils.equals(folder_code,Constants.DEVICE_EVENT_IMG)){
+            //闂ㄧ浜嬩欢鍥剧墖
+            DevicePictureRequest param = new DevicePictureRequest();
+            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
+            param.setSvrIndexCode(serverIndex);
+            is = HKService.getDevicePicture(param);
+        }else if(StringUtils.equals(folder_code,Constants.VISIT_EVENT_IMG)){
+            //璁垮浜嬩欢鍥剧墖
+            VisitPictureRequest param = new VisitPictureRequest();
+            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
+            param.setSvrIndexCode(serverIndex);
+            is = HKService.getVisitPicture(param);
+        }else if(StringUtils.equals(folder_code,Constants.MEMBER_IMG)){
+            //璁垮浜嬩欢鍥剧墖
+            FacePictureRequest param = new FacePictureRequest();
+            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
+            param.setServerIndexCode(serverIndex);
+            is = HKService.getFaceInputStream(param);
+        }
+        if(is ==null){
+            return  null;
+        }
+
+        try {
+            if(ftp == null){
+                 ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
+                        Integer.parseInt(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PORT).getCode()),
+                        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_USERNAME).getCode(),
+                        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PWD).getCode());
+            }else{
+                ftp.connect();
+            }
+            String date = DateUtil.getNowShortDate();
+            String fName =  date+"/"+ UUID.randomUUID().toString()+".png";
+            String fileName = folder+fName;
+            boolean r = ftp.uploadInputstream(is,fileName);//涓婁紶
+            if(r){
+                log.info("銆愭捣搴峰浘鐗囦笅杞戒笂浼燜TP鎴愬姛銆�======================" );
+                return  fName;
+            }else{
+                log.error("銆愭捣搴峰浘鐗囦笅杞戒笂浼燜TP澶辫触銆�======================" );
+            }
+        } catch (Exception e) {
+            log.error("銆愭捣搴峰浘鐗囦笅杞戒笂浼燜TP澶辫触銆�======================"+e.getMessage());
+        }
+        return  null;
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java
new file mode 100644
index 0000000..4fe3c6e
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java
@@ -0,0 +1,37 @@
+package com.doumee.service.business.impl.hksync;
+
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.HKTools;
+import com.doumee.core.utils.Constants;
+import com.doumee.service.business.InterfaceLogService;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * 娴峰悍浜嬩欢璁㈤槄琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class HkSyncInitConfigServiceImpl extends HkSyncBaseServiceImpl {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private InterfaceLogService interfaceLogService;
+
+    @PostConstruct
+    public  int  initHkConfig(){
+        ArtemisConfig.host = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_HOST).getCode();
+        ArtemisConfig.appKey = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPKEY).getCode();
+        ArtemisConfig.appSecret = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPSECRET).getCode();
+        HKConstants.https = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_HTTPS).getCode();
+        HKTools.interfaceLogService=interfaceLogService;
+        return  0;
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java
new file mode 100644
index 0000000..e598615
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java
@@ -0,0 +1,279 @@
+package com.doumee.service.business.impl.hksync.fhk;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.DataSyncConfig;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.param.BaseListPageResponse;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.*;
+import com.doumee.core.haikang.model.param.respose.*;
+import com.doumee.core.haikang.service.HKService;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DESUtil;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.model.*;
+import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * 娴峰悍缁勭粐浜哄憳閫氳繃姝ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+@Slf4j
+public class HkSyncOrgUserFromHKServiceImpl extends HkSyncBaseServiceImpl {
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private MemberMapper memberMapper;
+
+    @Autowired
+    private DataSyncConfig dataSyncConfig;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    /**
+     * 鍚屾娴峰悍缁勭粐淇℃伅鍒颁笟鍔$郴缁�
+     */
+    @Override
+    @Transactional
+    public   void syncOrgData(){
+        if(Constants.DEALING_HK_ORG){
+            return ;
+        }
+        Constants.DEALING_HK_ORG =true;
+        try {
+            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝褰撳墠涓嶆敮鎸佺粍缁囧悓姝ユ搷浣渵");
+            }
+            LoginUserInfo user =  (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            TimeRangeListRequest param = new TimeRangeListRequest();
+            //鑾峰彇ERP缁勭粐淇℃伅锛堝叏閲忓悓姝ワ級
+            boolean hasNext = true;
+            int curTotal = 0;
+            int curPage = 1;
+
+            List<Company>  allHkList = new ArrayList<>();
+            while (hasNext){
+                //鍒嗛〉閬嶅巻寰幆鏌ヨ鎵�鏈夐棬绂佽澶囨暟鎹�
+                param = new TimeRangeListRequest();
+                param.setPageNo(curPage);
+                param.setPageSize(100);
+                BaseResponse<BaseListPageResponse<OrgInfoResponse>> response = HKService.orgAllList(param);
+                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+                }
+                if(response.getData() == null || response.getData().getTotal() ==0){
+                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈悓姝ュ埌浠讳綍淇℃伅锛�");
+                }
+                BaseListPageResponse<OrgInfoResponse> r = response.getData();
+                curTotal += 100;
+                if(curTotal >= r.getTotal()){
+                    hasNext = false;
+                }
+                if(r.getList() == null || r.getList().size()==0){
+                    hasNext =false;
+                }else{
+                    allHkList.addAll(getNewOrgModelBYList(r.getList(),user.getId()));
+                }
+                curPage++;
+            }
+            if(allHkList .size() == 0){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈悓姝ュ埌浠讳綍缁勭粐淇℃伅锛�");
+            }
+            companyMapper.delete(new UpdateWrapper<>());//娓呯┖鍘熸湁鏁版嵁
+            companyMapper.insertBatchSomeColumn(allHkList);//鎻掑叆鏂版暟鎹�
+        }catch (BusinessException e){
+            throw  e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+        }finally {
+            Constants.DEALING_HK_ORG =false;
+        }
+    }
+
+    private List<Company> getNewOrgModelBYList(List<OrgInfoResponse> list, Integer userid) {
+        List<Company> newList = new ArrayList<>();
+        if(list == null || list.size()==0){
+            return  newList;
+        }
+        for(OrgInfoResponse model :list){
+            Company c = new Company();
+            c.setHkId(model.getOrgIndexCode());
+            c.setCode(model.getOrgNo());
+            c.setName(model.getOrgName());
+            c.setHkStatus(Constants.ONE);
+            c.setHkDate(new Date());
+            c.setIsdeleted(Constants.ZERO);
+            c.setCreateDate(c.getHkDate());
+            c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
+            c.setCreator(userid);
+            c.setStatus(Constants.ZERO);
+            c.setType(Constants.ONE);
+            if(!StringUtils.equals(model.getOrgIndexCode(),systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode())){
+                c.setHkParentId(model.getParentOrgIndexCode());
+            }
+            newList.add(c);
+        }
+        return newList;
+    }
+
+    /**
+     * 鍚屾娴峰悍浜哄憳淇℃伅
+     * @return
+     */
+    @Override
+    public   void syncUserData(){
+        if(Constants.DEALING_HK_USER){
+            return   ;
+        }
+        Constants.DEALING_HK_USER =true;
+        try {
+            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝褰撳墠涓嶆敮鎸佺粍缁囧悓姝ユ搷浣渵");
+            }
+            LoginUserInfo user =  (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            List<Company> companies = companyMapper.selectList(new QueryWrapper<>());
+            if(companies == null || companies.size() == 0){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝璇峰厛鍚屾浼佷笟缁勭粐淇℃伅~");
+            }
+            TimeRangeListRequest param = new TimeRangeListRequest();
+            //鑾峰彇ERP缁勭粐淇℃伅锛堝叏閲忓悓姝ワ級
+            boolean hasNext = true;
+            int curTotal = 0;
+            int curPage = 1;
+            List<Member>  allHkList = new ArrayList<>();
+            while (hasNext){
+                //鍒嗛〉閬嶅巻寰幆鏌ヨ鎵�鏈夐棬绂佽澶囨暟鎹�
+                param = new TimeRangeListRequest();
+                param.setPageNo(curPage);
+                param.setPageSize(100);
+                BaseResponse<BaseListPageResponse<UserInfoResponse>> response = HKService.userAllList(param);
+                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+                }
+                if(response.getData() == null || response.getData().getTotal() ==0){
+                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈悓姝ュ埌浠讳綍淇℃伅锛�");
+                }
+                BaseListPageResponse<UserInfoResponse> r = response.getData();
+                curTotal += 100;
+                if(curTotal >= r.getTotal()){
+                    hasNext = false;
+                }
+                if(r.getList() == null || r.getList().size()==0){
+                    hasNext =false;
+                }else{
+                    allHkList.addAll(getNewUserModelBYList(r.getList(),companies,user.getId()));
+                }
+                curPage++;
+            }
+            if(allHkList .size() == 0){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈悓姝ュ埌浠讳綍缁勭粐淇℃伅锛�");
+            }
+            memberMapper.delete(new UpdateWrapper<>());//娓呯┖鍘熸湁鏁版嵁
+            memberMapper.insertBatchSomeColumn(allHkList);//鎻掑叆鏂版暟鎹�
+        }catch (BusinessException e){
+            throw  e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
+        }finally {
+            Constants.DEALING_HK_USER =false;
+        }
+    }
+
+
+    private List<Member> getNewUserModelBYList(List<UserInfoResponse> list, List<Company> companies,Integer userid) {
+        List<Member> newList = new ArrayList<>();
+        if(list == null || list.size()==0){
+            return  newList;
+        }
+        for(UserInfoResponse model :list){
+            Member c = new Member();
+            String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,model.getCertificateNo());
+            c.setIdcardNo(encryptIdNo);
+            c.setIdcardDecode(Constants.getTuominStr(model.getCertificateNo()));
+            c.setIdcardType(getIdcardTypeByHk(model.getCertificateType()));
+            c.setCode(model.getJobNo());
+            c.setPhone(model.getPhoneNo());
+            c.setHkId(model.getPersonId());
+            c.setName(model.getPersonName());
+            c.setHkStatus(Constants.ONE);
+            c.setHkDate(new Date());
+            c.setCanVisit(Constants.ZERO);
+            c.setHighCheckor(Constants.ZERO);
+            c.setSex(model.getGender());
+            c.setIsdeleted(Constants.ZERO);
+            c.setCreateDate(c.getHkDate());
+            c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
+            c.setCreator(userid);
+            c.setStatus(Constants.ZERO);
+            c.setType(Constants.TWO);
+            c.setCompanyId(getCompanyId(companies,model.getOrgIndexCode()));
+            if(model.getPersonPhoto()!=null && model.getPersonPhoto().size()>0){
+                c.setFaceId(model.getPersonPhoto().get(0).getPersonPhotoIndexCode());
+                c.setFaceImg(HKConstants.IMG_INDEX+model.getPersonPhoto().get(0).getPicUri());
+                c.setFaceServerIndexCode(model.getPersonPhoto().get(0).getServerIndexCode());
+            }
+            newList.add(c);
+        }
+        return newList;
+    }
+
+    private Integer getCompanyId(List<Company> companies, String orgIndexCode) {
+        if(companies == null){
+            return  null;
+        }
+        for(Company c : companies){
+            if(StringUtils.equals(c.getHkId(),orgIndexCode)){
+                return c.getId();
+            }
+        }
+        return null;
+    }
+
+    /**
+     *   //璇佷欢绫诲瀷111:韬唤璇�414:鎶ょ収113:鎴峰彛绨�335:椹鹃┒璇�131:宸ヤ綔璇�133:瀛︾敓璇�990:鍏朵粬 ;
+     *  // 璇佷欢绫诲瀷 0韬唤璇� 1娓境璇佷欢 2鎶ょ収
+     * @param certificateType
+     * @return
+     */
+    private Integer getIdcardTypeByHk(Integer certificateType) {
+        if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.SHENFENZHENG.getKey())){
+            return 0;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.HUZHAO.getKey())){
+            return 2;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.JIASHIZHENG.getKey())){
+            return 3;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.XUESHENGZHENG.getKey())){
+            return 4;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.GONGXUOZHENG.getKey())){
+            return 5;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.GONGXUOZHENG.getKey())){
+            return 6;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.HUKOUBEN.getKey())){
+            return 7;
+        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.QITA.getKey())){
+            return 8;
+        }
+        return  null;
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/systembiz/SystemDictDataBizService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/systembiz/SystemDictDataBizService.java
new file mode 100644
index 0000000..c032257
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/systembiz/SystemDictDataBizService.java
@@ -0,0 +1,44 @@
+package com.doumee.service.systembiz;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.admin.request.VisitConfigDTO;
+import com.doumee.dao.system.dto.QuerySystemDictDataDTO;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.dao.system.vo.SystemDictDataListVO;
+
+import java.util.List;
+
+/**
+ * 瀛楀吀鏁版嵁Service瀹氫箟
+ * @author Eva.Caesar Liu
+ * @date 2023/03/21 14:49
+ */
+public interface SystemDictDataBizService {
+
+
+
+    /**
+     * 璁垮鏉ヨ閰嶇疆
+     * @return
+     */
+    VisitConfigDTO getVisitConfigDTO();
+
+    /**
+     * 淇敼璁垮鏉ヨ閰嶇疆
+     * @param miniProgrammeDTO
+     */
+    void updateVisitConfig(VisitConfigDTO miniProgrammeDTO);
+
+
+    /**
+     * 鍔冲姟鏉ヨ閰嶇疆
+     * @return
+     */
+    VisitConfigDTO getLaborConfigDTO();
+
+    /**
+     * 淇敼鍔冲姟鏉ヨ閰嶇疆
+     */
+    void updateLaborConfigDTO(VisitConfigDTO visitConfigDTO);
+}
diff --git a/server/visits/dmvisit_service/src/main/resources/application-dev.yml b/server/visits/dmvisit_service/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..5532735
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/resources/application-dev.yml
@@ -0,0 +1,83 @@
+spring:
+  # 鏁版嵁婧愰厤缃�
+  datasource:
+    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/antaiwuliu?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: doumee
+    password: rtjgfEr@&0c0m
+    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: true
+
+########################鍚屾鏁版嵁妯″紡  ########################
+data-sync:
+  org-user-data-origin: 1 #缁勭粐鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
+  visitor-data-origin: 1 #璁垮鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
+  need-deal-img: true #鏄惁闇�瑕佸鐞嗗浘鐗囨暟鎹�
+
+
+# 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  閭d綘灏变竴鐩村彨ABC  鍏朵粬鍦版柟灏变笉瑕佷娇鐢ˋBC浜�
+  timeout: 10
+  keepalive: 20
+  topic1: A/pick/warn/#  #绗﹀彿鏄唬琛ㄦ暣涓獁arn涓嬮潰鐨勫叏閮ㄥ瓙涓婚 娌℃湁鐞嗚В鐨勮瘽 鍙互鐧惧害浠旂粏鐞嗚В涓�涓�
+  topic2: A/cmd/resp
+  topic3: ABCF
+  topic4: ABCH
diff --git a/server/visits/dmvisit_service/src/main/resources/application-proHS.yml.bck b/server/visits/dmvisit_service/src/main/resources/application-proHS.yml.bck
new file mode 100644
index 0000000..05e27a4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/resources/application-proHS.yml.bck
@@ -0,0 +1,81 @@
+spring:
+  # 鏁版嵁婧愰厤缃�
+  datasource:
+    url: jdbc:mysql://10.10.99.68:3306/visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    username: root
+    password: Hs@20240307
+    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
+
+# Swagger閰嶇疆
+swagger:
+  host: dmtest.ahapp.net
+  title: ${project.name}鎺ュ彛鏂囨。
+  description: ${project.name}鎺ュ彛鏂囨。
+  enabled: true
+  context-path: /erp_interface
+  # 绂佺敤swagger鏃剁殑閲嶅畾鍚戝湴鍧�
+  redirect-uri: /
+
+########################鍚屾鏁版嵁妯″紡  ########################
+data-sync:
+  org-user-data-origin: 1 #缁勭粐鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
+  visitor-data-origin: 1 #璁垮鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
+  need-deal-img: true #鏄惁闇�瑕佸鐞嗗浘鐗囨暟鎹�
+
+########################寰俊鏀粯鐩稿叧閰嶇疆########################
+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  閭d綘灏变竴鐩村彨ABC  鍏朵粬鍦版柟灏变笉瑕佷娇鐢ˋBC浜�
+  timeout: 10
+  keepalive: 20
+  topic1: A/pick/warn/#  #绗﹀彿鏄唬琛ㄦ暣涓獁arn涓嬮潰鐨勫叏閮ㄥ瓙涓婚 娌℃湁鐞嗚В鐨勮瘽 鍙互鐧惧害浠旂粏鐞嗚В涓�涓�
+  topic2: A/cmd/resp
+  topic3: ABCF
+  topic4: ABCH
diff --git a/server/visits/dmvisit_service/src/main/resources/application-testYL.yml b/server/visits/dmvisit_service/src/main/resources/application-testYL.yml
new file mode 100644
index 0000000..4324462
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/resources/application-testYL.yml
@@ -0,0 +1,80 @@
+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
+    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: true
+########################鍚屾鏁版嵁妯″紡  ########################
+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  閭d綘灏变竴鐩村彨ABC  鍏朵粬鍦版柟灏变笉瑕佷娇鐢ˋBC浜�
+  timeout: 10
+  keepalive: 20
+  topic1: A/pick/warn/#  #绗﹀彿鏄唬琛ㄦ暣涓獁arn涓嬮潰鐨勫叏閮ㄥ瓙涓婚 娌℃湁鐞嗚В鐨勮瘽 鍙互鐧惧害浠旂粏鐞嗚В涓�涓�
+  topic2: A/cmd/resp
+  topic3: ABCF
+  topic4: ABCH

--
Gitblit v1.9.3