jiangping
2023-12-14 8d590f68b15baac8eecd2625b548a3fefece4f71
海康接口对接开发
已添加1个文件
已修改17个文件
559 ■■■■ 文件已修改
server/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/config/mybatis/EasySqlInjector.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/EventDeviceDataRequest.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/ExtEventCustomerNumInfo.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/ExtEventIdentityCardInfo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/RetentionQuery.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceEventMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/RetentionMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/VisitEventMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/join/VisitsJoinMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceEvent.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Retention.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java
@@ -19,7 +19,11 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * @author æ±Ÿè¹„蹄
@@ -66,7 +70,20 @@
    @PreventRepeat
    @ApiOperation("【海康】门禁事件订阅推送对接处理接口")
    @PostMapping("/push/acs")
    public ApiResponse pushAcs(@RequestBody EventAcsRequest param, HttpServletResponse response) {
    public ApiResponse pushAcs(  HttpServletRequest request,@RequestBody EventAcsRequest param, HttpServletResponse response) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while (true) {
                if (!((line = br.readLine()) != null)) break;
                sb.append(line);
            }
            System.out.println(sb.toString());
        } catch (IOException e) {
                throw new RuntimeException(e);
        }
        String result = hkSyncPushService.dealAcsEvent(param,response);
        return ApiResponse.success(result);
    }
server/dmvisit_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -63,6 +63,7 @@
                    } else {
                        throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
                    }
//                    request.setAttribute("token", token);
                }
                return true;
            }
server/dmvisit_service/src/main/java/com/doumee/config/mybatis/EasySqlInjector.java
@@ -10,8 +10,6 @@
import java.util.List;
public class EasySqlInjector extends MPJSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass ) {
        // æ³¨æ„ï¼šæ­¤SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -7,6 +7,7 @@
@Data
public class HKConstants {
    public static final String IMG_INDEX ="HKIMG=" ;
    private Logger logger = LoggerFactory.getLogger(HKConstants.class);
    //海康平台根据现场环境配置http还是https
    public static final String RESPONSE_SUCCEE = "0";
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/EventDeviceDataRequest.java
@@ -1,37 +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 {
    private  ExtEventIdentityCardInfo ExtEventIdentityCardInfo;//    äººå‘˜èº«ä»½è¯ä¿¡æ¯    å¦    ä¸é™
    private ExtEventIdentityCardInfo  ExtEventCustomerNumInfo;//        é€šé“事件信息    å¦    ä¸é™
    private Integer  ExtAccessChannel    ;//Number    äººå‘˜é€šé“号    å¦    32
    private Integer  ExtEventAlarmInID;//    Number    æŠ¥è­¦è¾“å…¥/防区通道    å¦    32
    private Integer   ExtEventAlarmOutID    ;//Number    æŠ¥è­¦è¾“出通道    å¦    32
    private String   ExtEventCardNo;//String    å¡å·    å¦    32
    private Integer   ExtEventCaseID    ;//Number    äº‹ä»¶è¾“入通道    å¦    32
    private Integer ExtEventCode;//    Number    äº‹ä»¶ç±»åž‹ä»£ç     å¦    32    å‚见附录D.2.1.1 é—¨ç¦äº‹ä»¶ç±»åž‹
    private Integer   ExtEventDoorID;//    Number    é—¨ç¼–号    å¦    32
    private String   ExtEventIDCardPictureURL;//    String    èº«ä»½è¯å›¾ç‰‡URL    å¦    200
    private Integer   ExtEventInOut;//    Number    è¿›å‡ºæ–¹å‘    å¦    32    è¿›å‡ºç±»åž‹1:进0:出-1:未知    è¦æ±‚:进门读卡器拨码设置为1,出门读卡器拨码设置为2
    private Integer  ExtEventLocalControllerID;//    Number    å°±åœ°æŽ§åˆ¶å™¨id    å¦    32    å°±åœ°æŽ§åˆ¶å™¨ç¼–号,0-门禁主机,1-255代表就地控制器
    private Integer   ExtEventMainDevID;//    Number    ä¸»è®¾å¤‡æ‹¨ç     å¦    32
    private String    ExtEventPersonNo;//    String    äººå‘˜ç¼–号    å¦    32    ä»¥äººä¸ºä¸­å¿ƒè®¾å¤‡ä¼šä¸ŠæŠ¥
    private String    ExtEventPictureURL;//    String    å›¾ç‰‡çš„url    å¦    32
    private Integer   ExtEventReaderID;//    Number    è¯»å¡å™¨id    å¦    32
    private Integer     ExtEventReaderKind;//    Number    è¯»å¡å™¨ç±»åˆ«    å¦    32    0-无效1-IC读卡器2-身份证读卡器3-二维码读卡器4-指纹头
    private Integer ExtEventReportChannel;//    Number    æŠ¥å‘Šä¸Šä¼ é€šé“    å¦    32    1-布防上传2-中心组1上传3-中心组2上传0-无效
    private Integer ExtEventRoleID;//    Number    ç¾¤ç»„编号    å¦    32
    private Integer  ExtEventSubDevID;//    Number    åˆ†æŽ§åˆ¶å™¨ç¡¬ä»¶ID    å¦    32
    private Integer    ExtEventSwipNum;//    Number    åˆ·å¡æ¬¡æ•°    å¦    32
    private Integer ExtEventType;//    Number    äº‹ä»¶ç±»åž‹    å¦    32    äº‹ä»¶ç±»åž‹ï¼Œå¦‚普通门禁事件为0,身份证信息事件为1,客流量统计为2
    private Integer   ExtEventVerifyID;//    Number    å¤šé‡è®¤è¯åºå·    å¦    32
    private Integer   ExtEventWhiteListNo;//    Number    ç™½åå•单号    å¦    32    1-8,为0无效
    private String   ExtReceiveTime;//    String    äº‹ä»¶ä¸ŠæŠ¥é©±åŠ¨çš„æ—¶é—´    æ˜¯    32    ç”¨äºŽç»Ÿè®¡äº‹ä»¶ä¸ŠæŠ¥å»¶æ—¶ï¼ŒUnix时间戳,精确到微秒,例: "1558576265810000"代表 2019/5/23 9:51:5.000
    private Integer    Seq;//    Number    äº‹ä»¶æµæ°´å·    æ˜¯    32    äº‹ä»¶æµæ°´å·ï¼Œä¸º0无效
    private String     UserType;//    Number ç”¨æˆ·ç±»åž‹    å¦    32    äººå‘˜ç±»åž‹ï¼š0 æœªçŸ¥ï¼Œ1 æ™®é€šï¼Œ2 æ¥å®¾ï¼Œ3 é»‘名单,4 ç®¡ç†å‘˜
    @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    äº‹ä»¶ç±»åž‹ä»£ç     å¦    32    å‚见附录D.2.1.1 é—¨ç¦äº‹ä»¶ç±»åž‹
    @JsonProperty(value = "ExtEventDoorID")
    private Integer   extEventDoorID;//    Number    é—¨ç¼–号    å¦    32
    @JsonProperty(value = "ExtEventIDCardPictureURL")
    private String   extEventIDCardPictureURL;//    String    èº«ä»½è¯å›¾ç‰‡URL    å¦    200
    @JsonProperty(value = "ExtEventInOut")
    private Integer   extEventInOut;//    Number    è¿›å‡ºæ–¹å‘    å¦    32    è¿›å‡ºç±»åž‹1:进0:出-1:未知    è¦æ±‚:进门读卡器拨码设置为1,出门读卡器拨码设置为2
    @JsonProperty(value = "ExtEventLocalControllerID")
    private Integer  extEventLocalControllerID;//    Number    å°±åœ°æŽ§åˆ¶å™¨id    å¦    32    å°±åœ°æŽ§åˆ¶å™¨ç¼–号,0-门禁主机,1-255代表就地控制器
    @JsonProperty(value = "ExtEventMainDevID")
    private Integer   extEventMainDevID;//    Number    ä¸»è®¾å¤‡æ‹¨ç     å¦    32
    @JsonProperty(value = "ExtEventPersonNo")
    private String   extEventPersonNo;//    String    äººå‘˜ç¼–号    å¦    32    ä»¥äººä¸ºä¸­å¿ƒè®¾å¤‡ä¼šä¸ŠæŠ¥
    @JsonProperty(value = "ExtEventPictureURL")
    private String  extEventPictureURL;//    String    å›¾ç‰‡çš„url    å¦    32
    @JsonProperty(value = "ExtEventReaderID")
    private Integer extEventReaderID;//    Number    è¯»å¡å™¨id    å¦    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    ç”¨äºŽç»Ÿè®¡äº‹ä»¶ä¸ŠæŠ¥å»¶æ—¶ï¼ŒUnix时间戳,精确到微秒,例: "1558576265810000"代表 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
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/ExtEventCustomerNumInfo.java
@@ -1,13 +1,18 @@
package com.doumee.core.haikang.model.param.request.event.acs;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class ExtEventCustomerNumInfo<T> {
    private Integer  AccessChannel;//    Number    é€šé“号    å¦    32
    private Integer  EntryTimes    ;//Number    è¿›äººæ•°    å¦    32
    private Integer  ExitTimes    ;//Number    å‡ºäººæ•°    å¦    32
    private Integer  TotalTimes    ;//Number    æ€»é€šè¡Œäººæ•°    å¦    32
    @JsonProperty(value = "AccessChannel")
    private Integer  accessChannel;//    Number    é€šé“号    å¦    32
    @JsonProperty(value = "EntryTimes")
    private Integer  entryTimes    ;//Number    è¿›äººæ•°    å¦    32
    @JsonProperty(value = "ExitTimes")
    private Integer  exitTimes    ;//Number    å‡ºäººæ•°    å¦    32
    @JsonProperty(value = "TotalTimes")
    private Integer  totalTimes    ;//Number    æ€»é€šè¡Œäººæ•°    å¦    32
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/acs/ExtEventIdentityCardInfo.java
@@ -1,18 +1,29 @@
package com.doumee.core.haikang.model.param.request.event.acs;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class ExtEventIdentityCardInfo {
    private  String Address;//    String    ä½å€    å¦    512
    private  String  Birth;//    String    å‡ºç”Ÿæ—¥æœŸ    å¦    32    ä¾‹ï¼š â€œ1999-6-30”
    private  String  EndDate;//    String    æœ‰æ•ˆæ—¥æœŸç»“束时间    å¦    32    ä¾‹ï¼š â€œ2028-10-12”
    private  String   IdNum    ;//String    èº«ä»½è¯id    å¦    32
    private  String   IssuingAuthority;//    String    ç­¾å‘机关    å¦    32
    private  String   Name;//    String    å§“名    å¦    32
    private Integer Nation    ;//Number        å¦    32    0-未知
    private Integer   Sex;//    Number    æ€§åˆ«    å¦    32    æ€§åˆ«0-未知1-男2-女
    private  String  StartDate;//    String    æœ‰æ•ˆæ—¥æœŸå¼€å§‹æ—¶é—´    å¦    32    ä¾‹ï¼š â€œ2018-10-12”
    private Integer TermOfValidity;//    Number    æ˜¯å¦é•¿æœŸæœ‰æ•ˆ    å¦    32    0-否(有效截止日期有效)            1-是(有效截止日期无效)
    @JsonProperty(value = "Address")
    private  String address;//    String    ä½å€    å¦    512
    @JsonProperty(value = "Birth")
    private  String  birth;//    String    å‡ºç”Ÿæ—¥æœŸ    å¦    32    ä¾‹ï¼š â€œ1999-6-30”
    @JsonProperty(value = "EndDate")
    private  String  endDate;//    String    æœ‰æ•ˆæ—¥æœŸç»“束时间    å¦    32    ä¾‹ï¼š â€œ2028-10-12”
    @JsonProperty(value = "IdNum")
    private  String   idNum    ;//String    èº«ä»½è¯id    å¦    32
    @JsonProperty(value = "IssuingAuthority")
    private  String   issuingAuthority;//    String    ç­¾å‘机关    å¦    32
    @JsonProperty(value = "Name")
    private  String   name;//    String    å§“名    å¦    32
    @JsonProperty(value = "Nation")
    private Integer nation    ;//Number        å¦    32    0-未知
    @JsonProperty(value = "Sex")
    private Integer   sex;//    Number    æ€§åˆ«    å¦    32    æ€§åˆ«0-未知1-男2-女
    @JsonProperty(value = "StartDate")
    private  String  startDate;//    String    æœ‰æ•ˆæ—¥æœŸå¼€å§‹æ—¶é—´    å¦    32    ä¾‹ï¼š â€œ2018-10-12”
    @JsonProperty(value = "TermOfValidity")
    private Integer termOfValidity;//    Number    æ˜¯å¦é•¿æœŸæœ‰æ•ˆ    å¦    32    0-否(有效截止日期有效)            1-是(有效截止日期无效)
}
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/RetentionQuery.java
@@ -1,5 +1,6 @@
package com.doumee.dao.admin.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -23,8 +24,8 @@
    private String type;
    @ApiModelProperty(value = "开始时间")
    private String startTime;
    private Date startTime;
    @ApiModelProperty(value = "结束时间")
    private String endTime;
    private Date endTime;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceEventMapper.java
@@ -2,11 +2,14 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.DeviceEvent;
import com.doumee.dao.business.model.Parks;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface DeviceEventMapper extends BaseMapper<DeviceEvent> {
    void insertBatchSomeColumn(List<DeviceEvent> addList);
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/RetentionMapper.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Retention;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface RetentionMapper extends BaseMapper<Retention> {
    void insertBatchSomeColumn(List<Retention> retentionList);
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/VisitEventMapper.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.VisitEvent;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface VisitEventMapper extends BaseMapper<VisitEvent> {
    void insertBatchSomeColumn(List<VisitEvent> list);
}
server/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> {
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceEvent.java
@@ -188,7 +188,7 @@
    @ApiModelProperty(value = "白名单单号")
    @ExcelColumn(name="白名单单号")
    @TableField("ext_event_white_list_no")
    private String extEventWhiteListNo;
    private Integer  extEventWhiteListNo;
    @ApiModelProperty(value = "事件上报驱动的时间")
    @ExcelColumn(name="事件上报驱动的时间")
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Retention.java
@@ -96,7 +96,12 @@
    @ApiModelProperty(value = "班次")
    @ExcelColumn(name="班次")
    private String classes;
    @ApiModelProperty(value = "海康门禁名称")
    @ExcelColumn(name="海康门禁名称")
    private String deviceName;
    @ApiModelProperty(value = "海康门禁编码")
    @ExcelColumn(name="海康门禁编码")
    private String deviceIndex;
    @ApiModelProperty(value = "入厂时间")
    @ExcelColumn(name="入厂时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
@@ -115,13 +120,4 @@
    @TableField(exist = false)
    public String companyName;
    @ApiModelProperty(value = "访客用户类型")
    @ExcelColumn(name="访客用户类型")
    @TableField(exist = false)
    private Integer memberType;
    @ApiModelProperty(value = "门禁名称")
    @ExcelColumn(name="门禁名称")
    @TableField(exist = false)
    private String srcName;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java
@@ -69,7 +69,7 @@
    @ApiModelProperty(value = "事件类型")
    @ExcelColumn(name="事件类型")
    private String eventType;
    private Integer eventType;
    @ApiModelProperty(value = "事件状态,0-瞬时1-开始2-停止4-事件联动结果更新5-事件图片异步上传", example = "1")
    @ExcelColumn(name="事件状态,0-瞬时1-开始2-停止4-事件联动结果更新5-事件图片异步上传")
@@ -77,7 +77,7 @@
    @ApiModelProperty(value = "脉冲超时时间")
    @ExcelColumn(name="脉冲超时时间")
    private String timeout;
    private Integer timeout;
    @ApiModelProperty(value = "事件发生时间(设备时间")
    @ExcelColumn(name="事件发生时间(设备时间")
@@ -101,7 +101,7 @@
    @ApiModelProperty(value = "证件类型 111身份证")
    @ExcelColumn(name="证件类型 111身份证")
    private String idType;
    private Integer idType;
    @ApiModelProperty(value = "证件号 ")
    @ExcelColumn(name="证件号 ")
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -113,6 +113,22 @@
    @ApiModelProperty(value = "门禁有效期截止")
    @ExcelColumn(name="门禁有效期截止")
    private Date endtime;
    @ApiModelProperty(value = "进厂时间")
    @ExcelColumn(name="进厂时间")
    private Date inDate;
    @ApiModelProperty(value = "离场时间")
    @ExcelColumn(name="离场时间")
    private Date outDate;
    @ApiModelProperty(value = "离场方式 0正常签离 1管理员手动签离")
    @ExcelColumn(name="离场方式 0正常签离 1管理员手动签离")
    private Integer outType;
    @ApiModelProperty(value = "强制签离管理员编码")
    @ExcelColumn(name="强制签离管理员编码")
    private Integer outUserId;
    @ApiModelProperty(value = "签离备注")
    @ExcelColumn(name="签离备注")
    private String outInfo;
    @ApiModelProperty(value = "来访事由")
    @ExcelColumn(name="来访事由")
@@ -202,6 +218,12 @@
    @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;
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/RetentionServiceImpl.java
@@ -209,11 +209,9 @@
                            Company::getName,
                            pageWrap.getModel().getCompanyName())
                    .ge(Objects.nonNull(pageWrap.getModel().getStartTime()),
                            Retention::getEventDate,
                            pageWrap.getModel().getStartTime() == null?null:pageWrap.getModel().getStartTime()+" 00:00:00")
                            Retention::getEventDate, pageWrap.getModel().getStartTime())
                    .le(Objects.nonNull(pageWrap.getModel().getEndTime()),
                            Retention::getEventDate,
                            pageWrap.getModel().getStartTime() == null?null:pageWrap.getModel().getEndTime()+" 23:59:59");
                            Retention::getEventDate, pageWrap.getModel().getEndTime());
        queryWrapper.orderByDesc(Retention::getCreateDate);
        IPage<Retention> retentionIPage = retentionJoinMapper.selectJoinPage(page, Retention.class, queryWrapper);
        return PageData.from(retentionIPage);
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -1,20 +1,40 @@
package com.doumee.service.business.impl.hksync;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.config.SpringContextUtil;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsInfoRequest;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
import com.doumee.core.haikang.model.param.request.event.acs.EventDeviceDataRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitDataRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.dao.business.model.InterfaceLog;
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.join.VisitsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.DeviceEventService;
import com.doumee.service.business.InterfaceLogService;
import com.doumee.service.business.MemberService;
import com.github.yulichang.interfaces.MPJBaseJoin;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * è®¿å®¢æƒé™ç»„信息表Service实现
@@ -26,7 +46,19 @@
public class HkSyncPushServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private InterfaceLogService interfaceLogService;
    private InterfaceLogMapper interfaceLogMapper;
    @Autowired
    private DeviceEventMapper deviceEventMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private CarEventMapper carEventMapper;
    @Autowired
    private VisitEventMapper visitEventMapper;
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private RetentionMapper retentionMapper;
    /**
     * æµ·åº·é—¨ç¦äº‹ä»¶æŽ¨é€
     * @param param
@@ -38,10 +70,40 @@
        log.info("【海康门禁事件推送】========开始=========:\n"+JSONObject.toJSONString(param));
        String result = null;
        try {
            if(param == null || param.getParams() == null || param.getParams().getEvents()==null){
                return null;
            }
            //门禁事件集合
            List<EventAcsInfoRequest> events  = param.getParams().getEvents();
            List<DeviceEvent> list = new ArrayList<>();
            List<Integer> delRetentionLis = new ArrayList<>();
            List<Retention> retentionList = new ArrayList<>();
            for(EventAcsInfoRequest request : events){
                EventDeviceDataRequest model = request.getData();
                if(model ==null){
                    continue;
                }
                //根据推送人员编码,处理在场、离场人员数据记录
                dealMemberDataByRequest(request,delRetentionLis,retentionList);
                //封装门禁事件信息表对象
                list.add(getDeviceEventModelByRequest(request));
            }
            if(list.size()>0){
                //插入门禁记录
                deviceEventMapper.insertBatchSomeColumn(list);
            }
            if(delRetentionLis.size()>0){
                //先删除原有的在场人员(内部人员)
                retentionMapper.delete(new UpdateWrapper<Retention>().lambda()
                        .eq(Retention::getType,Constants.memberType.internal)
                        .in(Retention::getMemberId,delRetentionLis));
            }
            if(retentionList.size()>0){
                //再插入最新的在厂人员
                retentionMapper.insertBatchSomeColumn(retentionList);
            }
            log.error("【海康门禁事件推送】========成功=======");
        }catch (Exception e) {
            log.error("【海康门禁事件推送】========失败=======:\n" + e.getMessage());
        }finally {
            saveInterfaceLog(param,"/business/hksync/push/acs",result);
@@ -49,6 +111,136 @@
        return  null;
    }
    /**
     * æ ¹æ®æŽ¨é€äººå‘˜ç¼–码,处理在场、离场人员数据记录
     * @param request
     * @param delRetentionLis
     * @param retentionList
     */
    private void dealMemberDataByRequest(EventAcsInfoRequest request, List<Integer> delRetentionLis, List<Retention> retentionList) {
        //海康人员编码
        String userNo = request.getData().getExtEventPersonNo();
        if(StringUtils.isNotBlank(userNo)){
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,userNo).last("limit 1"));
            if(member !=null){
                //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
                delRetentionLis.add(member.getId());
                if(Constants.formatIntegerNum(request.getData().getExtEventInOut()) == Constants.ONE){
                    //如果是进门,录入人员的在场数据记录
                    retentionList.add(getRetentionModelByRequest(member,request));
                }
            }
        }
    }
    public static String getHkImgUrl(String url){
        if(StringUtils.isBlank(url)){
            return null;
        }
        return HKConstants.IMG_INDEX+url;
    }
    /**
     *封装门禁事件信息表对象
     */
    private DeviceEvent getDeviceEventModelByRequest(EventAcsInfoRequest request) {
        DeviceEvent event = new DeviceEvent();
        event.setIsdeleted(Constants.ZERO);
        event.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        event.setEventId(request.getEventId());
        event.setEventType( request.getData().getExtEventType()!=null?request.getData().getExtEventType()+"":null);
        event.setAccessChannel(request.getData().getExtAccessChannel());
        event.setUserType(request.getData().getUserType());
        event.setSvrIndexCode(request.getData().getSvrIndexCode());
        event.setStatus(request.getStatus());
        event.setSrcType(request.getSrcType());
        event.setSrcName(request.getSrcName());
        event.setSrcIndex(request.getSrcIndex());
        event.setSeq(request.getData().getSeq());
        event.setTimeout(request.getTimeout());
        event.setExtEventType(request.getData().getExtEventType());
        event.setHappenTime(request.getHappenTime());
        event.setExtReceiveTime(request.getData().getExtReceiveTime());
        event.setExtEventWhiteListNo(request.getData().getExtEventWhiteListNo());
        event.setExtEventWhiteListNo(request.getData().getExtEventWhiteListNo());
        event.setExtEventVerifyID(request.getData().getExtEventVerifyID());
        event.setExtEventRoleID(request.getData().getExtEventRoleID());
        event.setExtEventReportChannel(request.getData().getExtEventReportChannel());
        event.setExtEventReaderKind(request.getData().getExtEventReaderKind());
        event.setExtEventReaderID(request.getData().getExtEventReaderID());
        event.setExtEventPictureURL(getHkImgUrl(request.getData().getExtEventPictureURL()));
        event.setExtEventPersonNo(request.getData().getExtEventPersonNo());
        event.setExtEventMainDevID(request.getData().getExtEventMainDevID());
        event.setExtEventLocalControllerID(request.getData().getExtEventLocalControllerID());
        event.setExtEventInOut(request.getData().getExtEventInOut());
        event.setExtEventIDCardPictureURL(getHkImgUrl(request.getData().getExtEventIDCardPictureURL()));
        event.setExtEventEwipNum(request.getData().getExtEventSwipNum());
        event.setExtEventEubDevID(request.getData().getExtEventMainDevID());
        event.setExtEventDoorID(request.getData().getExtEventDoorID());
        event.setExtEventCode(request.getData().getExtEventCode());
        event.setExtEventCaseID(request.getData().getExtEventCaseID());
        event.setExtEventCardNo(request.getData().getExtEventCardNo());
        event.setExtEventAlarmOutID(request.getData().getExtEventAlarmOutID());
        event.setExtEventAlarmInID(request.getData().getExtEventAlarmInID());
        event.setExtAccessChannel(request.getData().getExtAccessChannel());
        //通道事件信息
        if(request.getData().getExtEventCustomerNumInfo() !=null){
            event.setTotalTimes(request.getData().getExtEventCustomerNumInfo().getTotalTimes());
            event.setEntryTimes(request.getData().getExtEventCustomerNumInfo().getEntryTimes());
            event.setExitTimes(request.getData().getExtEventCustomerNumInfo().getExitTimes());
            event.setAccessChannel(request.getData().getExtEventCustomerNumInfo().getAccessChannel());
        }
        if(request.getData().getExtEventIdentityCardInfo() !=null){
            //人员身份证件信息
            event.setBirth(request.getData().getExtEventIdentityCardInfo().getBirth());
            String idnum = request.getData().getExtEventIdentityCardInfo().getIdNum();
            if(StringUtils.isNotBlank(idnum)){
                //身份证号存储密文
                event.setIdNum(DESUtil.encrypt(Constants.EDS_PWD,idnum));//身份证号加密
                //脱敏手机号显示n
                event.setIdcardDecode(Constants.getTuominStr(idnum));
            }
            event.setAddress(request.getData().getExtEventIdentityCardInfo().getAddress());
            event.setSex(request.getData().getExtEventIdentityCardInfo().getSex());
            event.setName(request.getData().getExtEventIdentityCardInfo().getName());
            event.setEndDate(request.getData().getExtEventIdentityCardInfo().getEndDate());
            event.setStartDate(request.getData().getExtEventIdentityCardInfo().getStartDate());
            event.setTermOfValidity(request.getData().getExtEventIdentityCardInfo().getTermOfValidity());
        }
        return event;
    }
    /**
     * è¿›åŽ‚å¯¹è±¡å°è£…æˆåœ¨åœºäººå‘˜
     * @param member
     * @param request
     * @return
     */
    private Retention getRetentionModelByRequest(Member member, EventAcsInfoRequest request) {
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getData().getExtReceiveTime()));
        retention.setClasses(member.getClasses());
        retention.setCode(member.getCode());
        retention.setIdcardNo(member.getIdcardNo());
        retention.setIdcardDecode(member.getIdcardDecode());
        retention.setName(member.getName());
        retention.setBirthday(member.getBirthday());
        retention.setType(member.getType());
        retention.setCompanyId(member.getCompanyId());
        retention.setCompanyName(member.getCompanyName());
        retention.setEventCode(request.getData().getExtEventCode()+"");
        retention.setEventDate(DateUtil.getISO8601DateByStr(request.getData().getExtReceiveTime()));
        retention.setFaceImg(member.getFaceImg());
        retention.setImgurl(member.getImgurl());
        retention.setPhone(member.getPhone());
        retention.setMemberId(member.getId());
        retention.setDeviceName(request.getSrcName());
        retention.setDeviceIndex(request.getSrcIndex());
        return retention;
    }
    /**
     * æµ·åº·è®¿å®¢äº‹ä»¶æŽ¨é€
     * @param param
@@ -60,7 +252,40 @@
        log.info("【海康访客事件推送】==========开始=======:\n"+JSONObject.toJSONString(param));
        String result = null;
        try {
            if(param == null || param.getParams() == null || param.getParams().getEvents()==null){
                return null;
            }
            //门禁事件集合
            List<EventVisitInfoRequest> events  = param.getParams().getEvents();
            List<VisitEvent> list = new ArrayList<>();
            List<Integer> delRetentionLis = new ArrayList<>();
            List<Retention> retentionList = new ArrayList<>();
            for(EventVisitInfoRequest request : events){
                if(request.getData() ==null ||StringUtils.isBlank(request.getData().getVisitorId())){
                    continue;
                }
                //海康访客记录编码
                if(StringUtils.isNotBlank(request.getData().getVisitorId())){
                    //根据访客推送访客记录编码,处理访客记录、在场人员等信息
                    dealVisitDataByRequst(request,delRetentionLis,retentionList);
                }
                //封装门禁事件信息表对象
                list.add(getVisitEventModelByRequest(request));
            }
            if(list.size()>0){
                //插入门禁记录
                visitEventMapper.insertBatchSomeColumn(list);
            }
            if(delRetentionLis.size()>0){
                //先删除原有的在场人员(普通访客)
                retentionMapper.delete(new UpdateWrapper<Retention>().lambda()
                        .eq(Retention::getType,Constants.memberType.visitor)
                        .in(Retention::getMemberId,delRetentionLis));
            }
            if(retentionList.size()>0){
                //再插入最新的在厂人员
                retentionMapper.insertBatchSomeColumn(retentionList);
            }
            log.error("【海康访客事件推送】========成功=======");
        }catch (Exception e){
@@ -69,6 +294,98 @@
        saveInterfaceLog(param,"/business/hksync/push/visit",result);
        return  null;
    }
    /**
     *  æ ¹æ®è®¿å®¢æŽ¨é€è®¿å®¢è®°å½•编码,处理访客记录、在场人员等信息
     */
    private void dealVisitDataByRequst(EventVisitInfoRequest request, List<Integer> delRetentionLis, List<Retention> retentionList) {
        EventVisitDataRequest model = request.getData();
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Visits.class);
        queryWrapper.eq(Visits::getHkId,model.getVisitorId() );
        queryWrapper.last("limit 1");
        Visits visits = visitsMapper.selectJoinOne(Visits.class,queryWrapper);
        if(visits !=null){
            //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
            delRetentionLis.add(visits.getMemberId());
            Visits updateVistis = new Visits();
            updateVistis.setId(visits.getId());
            if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_IN.getKey()){
                //如果是访客登记,录入人员的在场数据记录
                retentionList.add(getRetentionModelByVisitRequest(visits,request));
                //来访时间
                updateVistis.setOutDate(DateUtil.getISO8601DateByStr(model.getStartTime()));
            }else {
                //如果是访客签离事件
                updateVistis.setOutDate(DateUtil.getISO8601DateByStr(model.getEndTime()));
                updateVistis.setOutType(Constants.ZERO);
                updateVistis.setOutInfo("访客正常签离");
            }
            updateVistis.setEditDate(new Date());
            //更新访客来访或者签离时间信息
            visitsMapper.updateById(updateVistis) ;
        }
    }
    private VisitEvent getVisitEventModelByRequest(EventVisitInfoRequest request) {
        VisitEvent event = new VisitEvent();
        event.setIsdeleted(Constants.ZERO);
        event.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        event.setVisitorWorkUint(request.getData().getVisitorWorkUint());
        event.setVisitorId(request.getData().getVisitorId());
        event.setVisitorCode(request.getData().getVisitorCode());
        event.setTimeout(request.getTimeout());
        event.setSvrIndexCode(request.getData().getSvrIndexCode());
        event.setStatus(request.getStatus());
        event.setStartTime(request.getData().getStartTime());
        event.setSrcType(request.getSrcType());
        event.setSrcParentIndex(request.getSrcParentIndex());
        event.setSrcName(request.getSrcName());
        event.setSrcIndex(request.getSrcIndex());
        event.setSignOrg(request.getData().getSignOrg());
        event.setSex(request.getData().getSex());
        event.setPurpose(request.getData().getPurpose());
        event.setPhotoUrl(getHkImgUrl(request.getData().getPhotoUrl()));
        event.setPersonName(request.getData().getPersonName());
        event.setIdType(request.getData().getIdType());
        String idnum =request.getData().getIdNo();
        if(StringUtils.isNotBlank(idnum)){
            //身份证号存储密文
            event.setIdNo(DESUtil.encrypt(Constants.EDS_PWD,idnum));//身份证号加密
            //脱敏手机号显示n
            event.setIdcardDecode(Constants.getTuominStr(idnum));
        }
        event.setEventType(request.getEventType());
        event.setEventId(request.getEventId());
        event.setHappenTime(event.getHappenTime());
        return event;
    }
    private Retention getRetentionModelByVisitRequest(Visits visits, EventVisitInfoRequest request) {
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setClasses(visits.getMemberClasses());
        retention.setCode(visits.getCode());
        retention.setIdcardNo(visits.getIdcardNo());
        retention.setIdcardDecode(visits.getIdcardDecode());
        retention.setName(visits.getName());
        retention.setBirthday(visits.getBirthday());
        retention.setType(visits.getMemberType());
        retention.setCompanyId(visits.getCompanyId());
        retention.setCompanyName(visits.getCompanyName());
        retention.setEventCode(request.getEventType()+"");
        retention.setEventDate(retention.getCreateDate());
        retention.setFaceImg(visits.getFaceImg());
        retention.setImgurl(visits.getImgurl());
        retention.setPhone(visits.getPhone());
        retention.setMemberId(visits.getMemberId());
        retention.setDeviceName(request.getSrcName());
        retention.setDeviceIndex(request.getSrcIndex());
        return retention;
    }
    /**
@@ -92,7 +409,6 @@
        return  null;
    }
    private void saveInterfaceLog(Object param, String path,String result) {
        InterfaceLog hkMonitoryLogDO=new InterfaceLog();
        hkMonitoryLogDO.setType(1);
@@ -104,7 +420,7 @@
        hkMonitoryLogDO.setRepose(result);
        hkMonitoryLogDO.setName(path);
        hkMonitoryLogDO.setUrl(path);
        interfaceLogService.create(hkMonitoryLogDO);
        interfaceLogMapper.insert(hkMonitoryLogDO);
    }