nidapeng
2024-03-28 d16520069e7a89b5ac0d13d0c8ba4e30af023279
整理
已添加3个文件
已修改24个文件
478 ■■■■ 文件已修改
server/admin_timer/src/main/java/com/doumee/task/ScheduleDeviceStatusTool.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/StagingController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseListPageResponse.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AcsDeviceStatusListRequest.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AscDeviceStatusInfoResponse.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java 207 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin_timer/src/main/java/com/doumee/task/ScheduleDeviceStatusTool.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.task;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
 * å®šæ—¶ä»»åŠ¡
 * @author jiangping
 * @date 2021-10-10 14:40:35
 * https://www.bejson.com/othertools/cron/  cron è¡¨è¾¾å¼ç”Ÿæˆåœ°å€
 */
@Component
@EnableScheduling
public class ScheduleDeviceStatusTool {
    public static Integer endId = 0;
    @Autowired
    private HkSyncDeviceServiceImpl hkSyncDeviceService;
    /**
     * å®šæ—¶ç›‘听设备状态
     */
    @Scheduled(fixedRate= 60*1000*5)
    public void ascDeviceStatus()  {
        hkSyncDeviceService.getAscDeviceStatus();
    }
}
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -95,6 +95,12 @@
        memberService.updateFace(member);
        return ApiResponse.success(null);
    }
    @ApiOperation("重新下发人脸")
    @PostMapping("/empowerByList")
    public ApiResponse empowerByList(@RequestBody Member member) {
        memberService.empowerByList(member);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:member:update")
server/dmvisit_admin/src/main/java/com/doumee/api/business/StagingController.java
@@ -58,6 +58,7 @@
    @ApiOperation("超时预警人员离场")
    @GetMapping("/level")
//    @RequiresPermissions("business:visits:level")
    public ApiResponse level (@RequestParam Integer visitId) {
        visitsService.visitLevel(visitId);
        return ApiResponse.success("操作成功");
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -71,6 +71,13 @@
        visitsService.updateById(visits);
        return ApiResponse.success(null);
    }
    @ApiOperation("取消预约")
    @GetMapping("/visitCancel")
    @RequiresPermissions("business:visits:cancel")
    public ApiResponse visitCancel(@RequestParam Integer visitId) {
        visitsService.visitCancel(visitId);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据日期(starttime)同步访客数据")
    @PostMapping("/syncByDate")
server/dmvisit_admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java
@@ -101,6 +101,7 @@
        map.put("/common/captcha", "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");
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -7,11 +7,8 @@
import com.doumee.core.utils.Constants;
import com.doumee.service.business.InterfaceLogService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.doumee.service.business.impl.hksync.*;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVehicleFromHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVisitFromHKServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java
@@ -44,8 +44,8 @@
    @ApiModelProperty(value = "卡号集合" )
    private List<String> cardList;
    //2024å¹´1月9日 æ²Ÿé€šä¸ä»Žæ­¤ä¸šåŠ¡è§¦å‘
    @ApiModelProperty(value = "授权门禁组编码集合,【访客端】唯一标识" ,hidden = true )
    private Integer[] roleIds;
//    @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"  )
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -17,6 +17,9 @@
    //海康平台根据现场环境配置http还是https
    public static final String RESPONSE_SUCCEE = "0";
    public static final String RESPONSE_DOWNLOAD_ERROR= "0x15406001";
    public static final String RESPONSE_FACE_ERROR= "0x1540350c";//回调错误:人脸建模失败
    public static final String RESPONSE_FACE_ERROR2= "0x1540350d";//回调错误:人脸眼间距太小
    public static String https ;
    /**
     * èƒ½åŠ›å¼€æ”¾å¹³å°çš„ç½‘ç«™è·¯å¾„   è·¯å¾„不用修改,就是/artemis
@@ -81,6 +84,7 @@
        String vehicleList= "/api/resource/v2/vehicle/advance/vehicleList";//查询车辆列表v2
        String vehicleTimeRangeList= "/api/resource/v1/vehicle/timeRange";//增量获取车辆数据
        String facePictureCheck= "/api/frs/v1/face/picture/check";//人脸评分
        String acsDeviceStatus= "/api/nms/v1/online/acs_device/get";//获取门禁设备在线状态
    }
    /**
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -707,4 +707,16 @@
        return  result;
    }
    /**
     * èŽ·å–é—¨ç¦è®¾å¤‡åœ¨çº¿çŠ¶æ€
     * @param body
     * @return
     */
    public static String acsDeviceStatus(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.acsDeviceStatus);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseListPageResponse.java
@@ -10,5 +10,6 @@
  private int total;//    number    False    æŸ¥è¯¢æ•°æ®è®°å½•总数
  private int pageSize;//    number    False    æ¯é¡µè®°å½•总数
  private int pageNo    ;// number    False    å½“前页码
  private int totalPage;//    number    False    æ€»é¡µæ•°
  private List<T> list    ;// object[]    False    æƒé™ç»„对象列表
}
server/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,用户可以自己手动输入,也可以根据查询门禁设备列表v2接口可以获取
  private String[]   indexCodes;//i    string[]    False    é—¨ç¦è®¾å¤‡åˆ—表,最大500,查询门禁设备列表v2接口可以获取
  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    åˆ†é¡µå¤§å°
}
server/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    åŽ‚å•†ï¼Œhikvision-海康,dahua-大华
     private String ip;//string    False    ip地址
     private String port;//    number    False    ç«¯å£
     private Integer online;//    number    False    åœ¨çº¿çŠ¶æ€ï¼Œ0离线,1在线
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -963,6 +963,24 @@
        }
        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;
    }
    private static void logResult(BaseResponse res,String name) {
        if(StringUtils.equals(res.getCode(),HKConstants.RESPONSE_SUCCEE)){
            log.info("【"+name+"】================成功====\n"+res);
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -84,6 +84,7 @@
    public static final String RETRY_CONNECT_NUM ="RETRY_CONNECT_NUM" ;
    public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
    public static  boolean DEALING_HK_SYNCDEVICE = false;
    public static  boolean DEALING_HK_SYNCDEVICE_STATUS = false;
    public static  boolean DEALING_HK_SYNCPARK = false;
    public static  boolean DEALING_HK_IMG = false;
    public static  boolean DEALING_HK_ORG = false;
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java
@@ -157,9 +157,15 @@
    @ApiModelProperty(value = "海康设备ode")
    @TableField(exist = false)
    private String deviceIndexCode;
    @ApiModelProperty(value = "海康设备在线状态")
    @TableField(exist = false)
    private Integer deviceOnline;
    @ApiModelProperty(value = "人员海康编码")
    @TableField(exist = false)
    private String memberHkId;
    @ApiModelProperty(value = "人员海康人脸状态 0未同步 1同步成功 2同步失败 3设备建模失败")
    @TableField(exist = false)
    private Integer memberFaceStatus;
    @ApiModelProperty(value = "人员海康同步状态 ")
    @TableField(exist = false)
    private Integer memberHkStatus;
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -10,6 +10,7 @@
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
/**
 * äººå‘˜ä¿¡æ¯è¡¨
@@ -65,8 +66,8 @@
    @ApiModelProperty(value = "人脸编码(海康)")
    @ExcelColumn(name="人脸编码(海康)")
    private String faceId;
    @ApiModelProperty(value = "人脸同步状态(海康) 0未同步 1已同步 2同步失败")
    @ExcelColumn(name="人脸同步状态(海康) 0未同步 1已同步  2同步失败")
    @ApiModelProperty(value = "人脸同步状态(海康) 0未同步 1已同步 2同步失败 3不合格")
    @ExcelColumn(name="人脸同步状态(海康) 0未同步 1已同步  2同步失败 3不合格")
    private Integer faceStatus;
    @ApiModelProperty(value = "人脸同步信息(海康)")
    @ExcelColumn(name="人脸同步信息(海康)")
@@ -245,6 +246,9 @@
    @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")
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -203,4 +203,6 @@
    StagingDataVO stagingHead(StagingDataVO stagingHeadVO);
    StagingDataVO stagingBody(StagingDataVO stagingHeadVO);
    void empowerByList(Member member);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
@@ -129,4 +129,5 @@
    void auditApprove(AuditApproveDTO auditApproveDTO);
    void  visitLevel(Integer visitId);
    void  visitCancel(Integer visitId);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -78,4 +78,5 @@
    Integer syncEmpowerResultData(Integer endId);
    Integer   syncEmpowerDetailData(Integer endId);
    void syncParkRecords(Date date);
    void getAscDeviceStatus();
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -192,6 +192,19 @@
//        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
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -1269,5 +1269,25 @@
                .eq(Retention::getType,Constants.memberType.visitor)
                .eq(Retention::getMemberId,visits.getMemberId()));
    }
    @Override
    public void  visitCancel(Integer visitId){
        Visits visits = visitsMapper.selectById(visitId);
        if(Objects.isNull(visits)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!visits.getStatus().equals(Constants.VisitStatus.xfSuccess)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"访客记录状态错误,请刷新重试");
        }
        VisitAppointmentOutRequest request = new VisitAppointmentOutRequest();
        request.setOrderId(visits.getHkId());
        //调用海康强制签离
        BaseResponse response =  HKService.outVisitAppiontment(request);
        visitsMapper.update(null,new UpdateWrapper<Visits>().lambda().set(Visits::getStatus,Constants.VisitStatus.signout)
                .eq(Visits::getId,visitId));
        //产出在场人员信息
        retentionMapper.delete(new UpdateWrapper<Retention>().lambda()
                .eq(Retention::getType,Constants.memberType.visitor)
                .eq(Retention::getMemberId,visits.getMemberId()));
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -847,7 +847,7 @@
                    String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,param.getIdNo());
                    member.setIdcardNo(encryptIdNo);
                    member.setStartTime(param.getValidStartTime());
                    member.setRoleId(param.getRoleIds()!=null?JSONObject.toJSONString(param.getRoleIds()):null);
//                    member.setRoleId(param.getRoleIds()!=null?JSONObject.toJSONString(param.getRoleIds()):null);
                    member.setEndTime(param.getValidEndTime());
                    member.setIdcardDecode(Constants.getTuominStr(param.getIdNo()));
                    member.setErpOrgId(param.getOrgId());
@@ -977,6 +977,7 @@
    @Override
    @Transactional
    public void roleUserAuthor(UserAuthorRequest param){
            if(Objects.isNull(param)
                    ||StringUtils.isBlank(param.getUserId())){
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -192,4 +192,7 @@
        }
    }
    @Override
    public void getAscDeviceStatus() {
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncDeviceServiceImpl.java
@@ -2,11 +2,14 @@
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.*;
@@ -83,6 +86,37 @@
            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();
@@ -143,6 +177,35 @@
        }
        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){
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java
@@ -6,6 +6,7 @@
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.HKResponseCode;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
@@ -80,47 +81,74 @@
                        //查询下发状态
                        BaseResponse<TaskPersonDetailListResponse> response = HKService.taskPersoDetail(param);
                        if(response!=null
                                && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE) && response.getData()!=null
                        ){
                            if (response.getData().getList() != null
                                    && response.getData().getList().size() > 0) {
                                && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE)
                                && response.getData()!=null
                                && response.getData().getList() != null
                                && response.getData().getList().size() > 0
                                &&response.getData().getList().get(0) !=null){
                                TaskPersonDetailResponse model = response.getData().getList().get(0);
                                if (model != null && StringUtils.equals(model.getPersondownloadResult(), "0")) {
                            if (model.getPersonDownloadDetail()!=null ) {
                                boolean isface = false;//是否人脸下发成功
                                boolean iscard = false;//是否有卡片下发成功
                                    //更新已完成下载任务
                                    String remark = "";
                                    String cardInfo = "卡片下发失败";
                                    TaskPersonDetailCardFaceResponse d = model.getPersonDownloadDetail();
                                    if (d.getCards() != null && d.getCards().size() > 0) {
                                        cardInfo = "卡片:【";
                                        for (TaskPersonDetailCardInfoResponse card : d.getCards()) {
                                        if(StringUtils.equals(card.getErrorCode(),HKResponseCode.ReturnCode.RESPONSE_SUCCEE.getKey())){
                                            cardInfo += card.getId() + " ";
                                            iscard=true;
                                        }
                                        cardInfo += "】下发成功";
                                    }
                                    if(iscard){
                                        cardInfo = "卡片【"+cardInfo+"】下发成功";
                                    }
                                    }
                                    if (d.getFaces() == null || d.getFaces().size() == 0) {
                                        remark = cardInfo + ", ä¸æ”¯æŒäººè„¸è®¾å¤‡ï¼";
                                    remark = cardInfo + ", æ— äººè„¸ä¸‹å‘!";
                                    } else {
                                    if(d.getFaces().get(0).getErrorCode() !=null && d.getFaces().get(0).getErrorCode().equals(HKConstants.RESPONSE_SUCCEE)){
                                        isface=true;
                                        remark = "" + cardInfo + ",人脸下发成功!";
                                    }else{
                                        isface=false;
                                        if(d.getFaces().get(0).getErrorCode()!=null &&
                                                (d.getFaces().get(0).getErrorCode().equals(HKResponseCode.ReturnCode.RESPONSE_FACE_ERROR.getKey()) ||
                                                        d.getFaces().get(0).getErrorCode().equals(HKResponseCode.ReturnCode.RESPONSE_FACE_ERROR2.getKey()))){
                                            //如果人脸不合格
                                            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
                                                    .eq(Member::getId,c.getMemberId())
                                                    .set(Member::getFaceStatus,Constants.THREE)
                                                    .set(Member::getEditDate,new Date())
                                            );
                                            remark = "" + cardInfo + ",人脸建模失败!";
                                        }else  if(d.getFaces().get(0).getErrorCode()!=null && d.getFaces().get(0).getErrorCode().equals(HKResponseCode.ReturnCode.RESPONSE_DEVICE_NOFAVOR.getKey())){
                                            //如果设备不支持人脸下发
                                            isface=true;//此情况不要考虑人脸下发结果
                                            remark = "" + cardInfo + ",设备不支持人脸下发!";
                                        }else{
                                            remark = "" + cardInfo + ",人脸下发失败!";
                                    }
                                    }
                                }
                                //如果返回下发成功 æˆ–者 äººè„¸ä¸‹å‘成功并且卡片下发成功
                                boolean isSuccess =StringUtils.equals(model.getPersondownloadResult(), "0") || (iscard&&isface);
                                    empowerMapper.update(null, new UpdateWrapper<Empower>()
                                            .lambda()
                                            .eq(Empower::getId, c.getId())
                                            .set(Empower::getRemark, remark)
                                        .set(Empower::getEditDate,new Date())
                                            .set(Empower::getSendInfo, remark)
                                            .set(Empower::getSendStatus, Constants.EmpowerStatus.pass));
                                    if(Constants.equalsInteger(c.getMemberDeleted(), Constants.ONE)&& Constants.equalsInteger(c.getIsdeleted(), Constants.ONE) ){
                                        .set(Empower::getSendStatus, isSuccess?Constants.EmpowerStatus.pass:Constants.EmpowerStatus.fail));
                                if(isSuccess && Constants.equalsInteger(c.getMemberDeleted(), Constants.ONE)&& Constants.equalsInteger(c.getIsdeleted(), Constants.ONE) ){
                                        //如果是删除权限成功,检查是否删除人员
                                        checkDelMemberTask(c.getMemberId(),c.getMemberHkId());
                                    }
                                } else {
                                    empowerMapper.update(null, new UpdateWrapper<Empower>()
                                            .lambda()
                                            .eq(Empower::getId, c.getId())
                                            .set(Empower::getRemark, "下发失败")
                                            .set(Empower::getSendInfo, "下发失败")
                                            .set(Empower::getSendStatus, Constants.EmpowerStatus.fail));
                                continue;
                                }
                            } else {
                        }
                        //所有异常情况都标记为下发失败
                                //如果是已删除的数据,下发失败(防止设备离线),则尝试重新下发任务
                                if(Constants.equalsInteger(c.getIsdeleted(), Constants.ONE) ){
                                    empowerMapper.update(null, new UpdateWrapper<Empower>()
@@ -134,27 +162,15 @@
                                    empowerMapper.update(null, new UpdateWrapper<Empower>()
                                            .lambda()
                                            .eq(Empower::getId, c.getId())
                                    .set(Empower::getEditDate,new Date())
                                            .set(Empower::getRemark, "下发失败")
                                            .set(Empower::getTryNum,Constants.formatIntegerNum(c.getTryNum())+1)
                                            .set(Empower::getSendInfo, "下发失败")
                                            .set(Empower::getSendStatus, Constants.EmpowerStatus.fail));
                                }
                            }
                        }else if(response!=null && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_DOWNLOAD_ERROR)                        ){
                            empowerMapper.update(null, new UpdateWrapper<Empower>()
                                    .lambda()
                                    .eq(Empower::getId, c.getId())
                                    .set(Empower::getRemark, "下发失败")
//                                    .set(Empower::getFailFlag, Constants.ONE)//无需重发(下载任务不存在)
                                    .set(Empower::getTryNum,Constants.formatIntegerNum(c.getTryNum())+1)
                                    .set(Empower::getSendInfo, "下发失败")
                                    .set(Empower::getSendStatus, Constants.EmpowerStatus.fail));
                        }
                    }
                }catch (Exception e){
                }finally {
//                    Constants.DEALING_HK_EMPOWER_DETAIL=false;
                    e.printStackTrace();
                }
            }
        });
@@ -301,6 +317,7 @@
                                            .lambda()
                                            .eq(Empower::getHkId,c.getHkId() )
                                            .set(Empower::getSendInfo,"任务已下载完成" )
                                            .set(Empower::getRemark,"任务已下载完成" )
                                            .set(Empower::getSendStatus,Constants.EmpowerStatus.downloaded) );
                                }
@@ -332,9 +349,6 @@
            List<Integer> noIds = new ArrayList<>();
            for(Empower empower:allList){
                //如果是删除的权限下发,查询是否伺候有下发成功的数据,如果有,则不处理
                if(empower.getId().equals(392479)){
                    System.out.println("============================");
                }
//                int flag= empowerMapper.selectCount(new QueryWrapper<Empower>().lambda()
//                        .eq(Empower::getMemberId,empower.getMemberId())
//                        .eq(Empower::getDeviceId,empower.getDeviceId() )
@@ -382,25 +396,10 @@
            List<Empower> allList =getAllWaitDealList( endId);
            if(allList !=null && allList.size()>0){
                //查询所有需要同步的数据,重新下发最新人员权限即可
//            dealNewListTask(getDealList(Constants.ZERO,endId));
                List<Empower> dellist = new ArrayList<>();
                List<Empower> addlist = new ArrayList<>();
                for(Empower e : allList){
                    if(Constants.equalsInteger(e.getIsdeleted(),Constants.ONE)){
                        dellist.add(e);
                    }else {
                        addlist.add(e);
                    }
                }
                Thread t1=new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if(dellist!=null &&dellist.size()>0) {
                            dealDelListTask(dellist);
                        }
                        if(addlist!=null &&addlist.size()>0) {
                            dealNewListTask(addlist);
                        }
                        dealAllListTask(allList);
                    }
                });
                t1.start();
@@ -475,7 +474,7 @@
                    .set(Empower::getEditDate,date)
                    .in(Empower::getId,successList));
        }
        if(errorList.size()>0){
        empowerMapper.update(null,new UpdateWrapper<Empower>()
                .lambda()
                .set(Empower::getSendStatus,Constants.EmpowerStatus.fail)
@@ -486,6 +485,8 @@
                .set(Empower::getRemark, "添加下发任务数据刪除授权失败")
                .set(Empower::getEditDate,date)
                .in(Empower::getId,errorList));
        }
    }
    public class TaskRuner implements Runnable{
        private    List<Empower> list ;
@@ -501,6 +502,99 @@
        public void setList(List<Empower> list) {
            this.list = list;
        }
    }
    private void dealAllListTask(List<Empower> list) {
        //按照父级申请分批处理每次申请数据
        if(list ==null || list.size()==0){
            return;
        }
//        clearAllEmpowerFirst(list);
        Date date = new Date();
        //创建任务
        String taskId = hkTaskAddtion();
        List<Empower> successList = new ArrayList<>();
        List<Empower> errorList = new ArrayList<>();
        List<Empower> waitList = new ArrayList<>();
        List<Empower> faceErrorList = new ArrayList<>();
        for(Empower c : list) {
            //向任务添加人员、设备信息数据
            if(c.getDeviceOnline() !=null && Constants.equalsInteger(c.getDeviceOnline(),0)){
                waitList.add(c);
                continue;
            }
            if(  Constants.equalsInteger(c.getMemberFaceStatus(),Constants.THREE)){
                faceErrorList.add(c);
                continue;
            }
            HKConstants.OPERA_TYPE flag = HKConstants.OPERA_TYPE.ADD;
            if(Constants.equalsObject(c.getIsdeleted(),Constants.ONE)){
                flag = HKConstants.OPERA_TYPE.DEL;
            }
            if(addTaskData(c,taskId,flag.getKey())){
                successList.add(c);
            }else{
                errorList.add(c);
            }
        }
        if(successList.size()>0){
            //开始执行下发
            boolean status = startTask(taskId);
            for(Empower model : successList){
                Empower update = new Empower();
                update.setId(model.getId());
                update.setSendDate(date);
                update.setEditDate(date);
                update.setHkId(taskId);
                update.setRemark(status?"下发任务成功":"下发任务失败");
                update.setSendInfo(status?"下发任务成功":"下发任务失败");
                //下发中
                update.setSendStatus(status?Constants.EmpowerStatus.ing:Constants.EmpowerStatus.fail);
                empowerMapper.updateById(update);
            }
        }
        if(errorList.size()>0){
            for(Empower model : errorList){
                Empower update = new Empower();
                update.setId(model.getId());
                update.setSendDate(date);
                update.setEditDate(date);
                update.setHkId(taskId);
                update.setSendStatus(Constants.EmpowerStatus.fail);
                update.setRemark( "添加下发任务数据失败");
                update.setSendInfo( "添加下发任务数据失败");
                empowerMapper.updateById(update);
            }
        }
        if(waitList.size()>0){
            for(Empower model : waitList){
                Empower update = new Empower();
                update.setId(model.getId());
                update.setSendDate(date);
                update.setEditDate(date);
                update.setHkId(taskId);
                update.setSendStatus(Constants.EmpowerStatus.fail);
                update.setRemark( "设备状态异常,等待重新下发");
                update.setSendInfo( "设备状态异常,等待重新下发");
                empowerMapper.updateById(update);
            }
        }
        if(faceErrorList.size()>0){
            for(Empower model : faceErrorList){
                Empower update = new Empower();
                update.setId(model.getId());
                update.setSendDate(date);
                update.setEditDate(date);
                update.setHkId(taskId);
                update.setSendStatus(Constants.EmpowerStatus.fail);
                update.setRemark( "人脸建模失败,等待更换人脸后重新下发");
                update.setSendInfo( "人脸建模失败,等待更换人脸后重新下发");
                empowerMapper.updateById(update);
            }
        }
    }
    private void dealNewListTask(List<Empower> list) {
        //按照父级申请分批处理每次申请数据
@@ -538,6 +632,7 @@
            }
        }
        if(errorList.size()>0){
        for(Empower model : errorList){
            Empower update = new Empower();
            update.setId(model.getId());
@@ -549,6 +644,8 @@
            update.setSendInfo( "添加下发任务数据失败");
            empowerMapper.updateById(update);
        }
        }
    }
@@ -639,6 +736,8 @@
        queryWrapper.selectAll(Empower.class);
        queryWrapper.selectAs(Device::getChannelNo,Empower::getDeviceChannelNo);
        queryWrapper.selectAs(Member::getHkId,Empower::getMemberHkId);
        queryWrapper.selectAs(Member::getFaceStatus,Empower::getMemberFaceStatus);
        queryWrapper.selectAs(Device::getOnline,Empower::getDeviceOnline);
        queryWrapper.selectAs(Device::getHkId,Empower::getDeviceIndexCode);
        queryWrapper.selectAs(Device::getResourceType,Empower::getDeviceType);
        queryWrapper.leftJoin(Device.class,Device::getId,Empower::getDeviceId);
@@ -656,6 +755,10 @@
        MPJLambdaWrapper<Empower> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.select(Empower::getId,Empower::getMemberId,Empower::getDeviceId,Empower::getIsdeleted);
        queryWrapper.select(" (select count(1) from empower ee  where ee.member_id=t.MEMBER_ID and ee.device_id =t.DEVICE_ID   and ee.id>t.id) as tempCouunt");
        queryWrapper.leftJoin(Member.class,Member::getId,Empower::getMemberId);
        queryWrapper.leftJoin(Device.class,Device::getId,Empower::getDeviceId);
        queryWrapper.ne(Member::getFaceStatus,Constants.THREE);//人脸建模没有失败过的
        queryWrapper.ne(Device::getOnline,Constants.ZERO+"");//非离线
        queryWrapper.eq(Empower::getSendStatus,Constants.EmpowerStatus.fail);
        queryWrapper.gt(Empower::getId,endId);
        queryWrapper.orderByAsc(Empower::getId );
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -72,14 +72,15 @@
                //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段
                AppointmentInfoResponse model =  getVisitRecord(c.getHkId());
                if(model == null){
                    Visits update = new Visits();
                    continue;
                   /* Visits update = new Visits();
                    //已失效
                    update.setStatus(Constants.VisitStatus.invalid);
                    update.setEditDate(date);
                    update.setId(c.getId());
                    update.setRemark("预约已被清除");
                    visitsMapper.updateById(update);
                    continue;
                    continue;*/
                }
                /**
                 *      * 0:待审核(预约待审批)、
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -305,14 +305,15 @@
                    String doorids =deviceRole.getDoorIds();
                    if(StringUtils.isNotBlank(doorids)){
                        String[] ss = doorids.split(",");
                        try {
                            for(String s :ss){
                            try {
                                Integer ts =Integer.parseInt(s);
                                 r.add(ts);
                            }
                        }catch (Exception e){
                            //脏数据不处理
                        }
                        }
                    }
                }
                return  r;
@@ -382,10 +383,10 @@
            return;
        }
        if(Constants.equalsInteger(member.getIsdeleted(),Constants.ZERO)){
//                && Constants.equalsObject(member.getHkStatus(),Constants.ONE)){
        List<Integer> deviceIds =new ArrayList<>();//新设备编码集合
        List<Empower> list = new ArrayList<>();//新授权记录集合
        if(Constants.equalsInteger(member.getIsdeleted(),Constants.ZERO)
                && Constants.equalsObject(member.getHkStatus(),Constants.ONE)){
            //如果用户是同步海康成功,添加带下发权限(只管理新增或者编辑的)
            List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().lambda().in(Device::getId,doorIds));
            if(deviceList == null || deviceList.size() == 0){
@@ -409,7 +410,6 @@
                deviceIds.add(deviceRole.getId());
                list.add(model);
            }
        }
        //待移除权限的设备数据授权记录(针对删除和更新丢失的权限,需要同步下发删除权限)
        empowerMapper.update(null,new UpdateWrapper<Empower>().lambda()
                .eq(Empower::getMemberId,member.getId())
@@ -427,6 +427,7 @@
            empowerMapper.insertBatchSomeColumn(list);
        }
    }
    }
    public static void dealChangeDeviceRoleEmpower( Member member ,List<Integer> addDoorIds,List<Integer> delDoorIds, DeviceRoleMapper deviceRoleMapper, EmpowerMapper empowerMapper, DeviceMapper deviceMapper) {
        if(delDoorIds!=null && delDoorIds.size()>0){
            //待移除权限的设备数据授权记录(针对删除和更新丢失的权限,需要同步下发删除权限)