jiangping
2023-12-18 c18b8f0f12f9c3965fee72ea2ae668c2fc89d908
海康接口对接开发
已添加4个文件
已修改15个文件
已重命名1个文件
742 ■■■■■ 文件已修改
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserDelRequest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddSuccessResponse.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitAppointmentMDJResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/ImageBase64Util.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Retention.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/HkSyncService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -3,6 +3,7 @@
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncOrgUserServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -23,6 +24,8 @@
    private HkSyncImgServiceImpl hkSyncImgService;
    @Autowired
    private HkSyncOrgUserServiceImpl hkSyncOrgUserService;
    @Autowired
    private HkSyncVisitServiceImpl hkSyncVisitService;
    /**
     * æ˜¯å¦å¼€å‘者
     */
@@ -47,6 +50,14 @@
        hkSyncOrgUserService.syncOrgData();
    }
    /**
     * å®šæ—¶åŒæ­¥ç»„织信息到海康系统
     * @throws Exception
     */
    @Scheduled(fixedDelay= 60*1000)
    public void syncVisitData() {
        hkSyncVisitService.syncVisitData();
    }
    /**
     * å®šæ—¶åŒæ­¥ç”¨æˆ·ä¿¡æ¯åˆ°æµ·åº·ç³»ç»Ÿ
     * @throws Exception
     */
server/dmvisit_service/src/main/java/com/doumee/core/erp/model/openapi/request/UserUpdateRequest.java
@@ -43,5 +43,8 @@
    private List<String> cardList;
    @ApiModelProperty(value = "授权门禁组编码集合,【访客端】唯一标识" )
    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;
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -9,7 +9,8 @@
public class HKConstants {
    public static final String IMG_INDEX ="HKIMG=" ;
    public static final String IMG_INDEX_ERROR ="HKIMG_ERROR=" ;
    public static final String RES_INDEX = "DM_";
    public static final String RES_ORG_INDEX = "DMO";
    public static final String RES_USER_INDEX = "DMU";
    private Logger logger = LoggerFactory.getLogger(HKConstants.class);
    //海康平台根据现场环境配置http还是https
    public static final String RESPONSE_SUCCEE = "0";
@@ -102,6 +103,39 @@
        }
    }
    public  enum ReturnCode {
        PARK_LINE_IN("0x00072001", "资源信息不存在"  )
        ;
        // æˆå‘˜å˜é‡
        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;
        }
    }
    /**
     * é¡”色枚举
     */
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/UserDelRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
import java.util.List;
/**
 * ç”¨æˆ·æ–°å¢žè¯·æ±‚参数
 */
@Data
public class UserDelRequest {
    private String[]   personIds;//    string[]    True    äººå‘˜Id,单次操作上限为1000条。    èŽ·å–äººå‘˜åˆ—è¡¨v2 æŽ¥å£èŽ·å–è¿”å›žå‚æ•°personId
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgOrUserAddSuccessResponse.java
@@ -7,4 +7,5 @@
  private String clientId;//    number    False    è°ƒç”¨æ–¹æŒ‡å®šId
  private String  orgIndexCode;//    string    False    æœåŠ¡ç«¯ç”Ÿæˆçš„å”¯ä¸€æ ‡è¯†
  private String personId;//    string    False    æœåŠ¡ç«¯ç”Ÿæˆçš„å”¯ä¸€æ ‡è¯†
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitAppointmentMDJResponse.java
ÎļþÃû´Ó server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitAppointmentVistorResponse.java ÐÞ¸Ä
@@ -3,7 +3,7 @@
import lombok.Data;
@Data
public class VisitAppointmentVistorResponse {
public class VisitAppointmentMDJResponse {
    private String   visitorName        ;//string    False    è®¿å®¢å§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
    private String appointRecordId    ;//    string    False é¢„约记录ID
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -151,13 +151,13 @@
     *批量删除人员信息
     * @return
     */
    public  static  BaseResponse<OrgOrUserAddFailureResponse>  delBatchUser(List<UserAddRequest> param){
    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<OrgOrUserAddFailureResponse>>(){};
            BaseResponse<OrgOrUserAddFailureResponse> result = JSONObject.parseObject(res, typeReference.getType());
            BaseResponse<List<UserDelResponse >> result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康批量新增人员");
            return  result;
        }catch (Exception e){
@@ -446,13 +446,13 @@
     *访客免登记预约
     * @return
     */
    public  static  BaseResponse<VisitAppointmentVistorResponse>   visitAppiontmentMDJ(VisitAppointmentMDJRequest param){
    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<VisitAppointmentVistorResponse> >(){};
            BaseResponse<VisitAppointmentVistorResponse>   result = JSONObject.parseObject(res, typeReference.getType());
                    new TypeReference< BaseResponse<VisitAppointmentMDJResponse> >(){};
            BaseResponse<VisitAppointmentMDJResponse>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客免登记预约");
            return  result;
        }catch (Exception e){
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -66,6 +66,8 @@
    public static  boolean DEALING_HK_IMG = false;
    public static  boolean DEALING_HK_ORG = false;
    public static  boolean DEALING_HK_USER = false;
    public static  boolean DEALING_HK_VISIT = false;
    public static  boolean DEALING_HK_EMPOWER = false;
    // ERP接口配置
    public static final String ERP_CONFIG = "ERP_CONFIG";
    // ERP ACCESS_KEY
server/dmvisit_service/src/main/java/com/doumee/core/utils/ImageBase64Util.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
package com.doumee.core.utils;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class ImageBase64Util {
    /**
     * å°†å›¾ç‰‡è½¬æ¢æˆBase64编码
     * @param imgFile å¾…处理图片
     * @return
     */
    public static String getImgStr(String imgFile) {
        // å°†å›¾ç‰‡æ–‡ä»¶è½¬åŒ–为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;
        // è¯»å–图片字节数组
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encodeBase64String(data);
    }
    /**
     * å¯¹å­—节数组字符串进行Base64解码并生成图片
     * @param imgStr å›¾ç‰‡æ•°æ®
     * @param imgFilePath ä¿å­˜å›¾ç‰‡å…¨è·¯å¾„地址
     * @return
     */
    public static boolean generateImage(String imgStr, String imgFilePath) {
        //
        if (imgStr == null) // å›¾åƒæ•°æ®ä¸ºç©º
            return false;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// è°ƒæ•´å¼‚常数据
                    b[i] += 256;
                }
            }
            // ç”Ÿæˆjpg图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(b);
            out.flush();
            out.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * è¿œç¨‹è¯»å–image转换为Base64字符串
     * @param imgUrl
     * @return
     */
    public static String Image2Base64(String imgUrl) {
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;
        try{
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while( (len=is.read(buffer)) != -1 ){
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            // å¯¹å­—节数组Base64编码
            return new BASE64Encoder().encode(outStream.toByteArray());
        }catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(is != null)
            {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outStream != null)
            {
                try {
                    outStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(httpUrl != null)
            {
                httpUrl.disconnect();
            }
        }
        return null;
    }
    public static void main(String[] args) {
        String url= "http://doumeetest.oss-cn-beijing.aliyuncs.com/member/20210515/de923f81-b417-47fc-a702-472d60d7870a.png";// å¾…处理的图片
        String imgbese = Image2Base64(url);
        System.out.println(imgbese);
//        String url= "D:\\1.jpg";// æ–°ç”Ÿæˆçš„图片
//        generateImage(imgbese, url);
    }
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -106,9 +106,9 @@
    @ExcelColumn(name="工号")
    private String code;
    @ApiModelProperty(value = "班次")
    @ExcelColumn(name="班次")
    private String classes;
    @ApiModelProperty(value = "班次 0白班 1夜班")
    @ExcelColumn(name="班次 0白班 1夜班")
    private Integer classes;
    @ApiModelProperty(value = "状态 0正常 1禁用 2拉黑/冻结", example = "1")
    @ExcelColumn(name="状态 0正常 1禁用 2拉黑/冻结")
@@ -203,5 +203,7 @@
    @ApiModelProperty(value = "组织名称")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "组织海康编码")
    @TableField(exist = false)
    private String companyHkId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java
@@ -59,4 +59,16 @@
    @ExcelColumn(name="角色编码(关联door_role)")
    private String roleId;
    @ApiModelProperty(value = "海康标识")
    @ExcelColumn(name="海康标识")
    private String hkId;
    @ApiModelProperty(value = "海康同步状态 0未同步 1已同步")
    @ExcelColumn(name="海康同步状态 0未同步 1已同步")
    private Integer hkStatus;
    @ApiModelProperty(value = "海康最近同步时间")
    @ExcelColumn(name="海康最近同步时间")
    private Date hkDate;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Retention.java
@@ -95,7 +95,7 @@
    @ApiModelProperty(value = "班次")
    @ExcelColumn(name="班次")
    private String classes;
    private Integer classes;
    @ApiModelProperty(value = "海康门禁名称")
    @ExcelColumn(name="海康门禁名称")
    private String deviceName;
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -218,8 +218,8 @@
    @ApiModelProperty(value = "普通访客申请随访人员")
    @TableField(exist = false)
    private List<Visits> withUserList;
    @ApiModelProperty(value = "班次")
    private String memberClasses;
//    @ApiModelProperty(value = "班次")
//    private String memberClasses;
    @ApiModelProperty(value = "类型 0劳务访客 1普通访客  2内部人员", example = "1")
    @TableField(exist = false)
@@ -232,6 +232,10 @@
    @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="被访人员部门")
server/dmvisit_service/src/main/java/com/doumee/service/business/HkSyncService.java
@@ -57,4 +57,7 @@
    void syncOrgData();
    void syncUserData();
    void syncVisitData();
    void syncEmpowerData();
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -682,21 +682,29 @@
            Company company = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,param.getId()).last("limit 1"));
            if(Objects.isNull(company)){
                company = new Company();
                BeanUtils.copyProperties(param,company);
//                BeanUtils.copyProperties(param,company);
                company.setId(null);
                company.setCreateDate(new Date());
                company.setHkStatus(Constants.ZERO);
                company.setErpStatus(Constants.ONE);
                company.setErpDate(new Date());
                company.setErpId(param.getId());
                company.setErpParentId(param.getParentId());
                company.setFsStatus(Constants.ZERO);
                company.setType(Constants.ONE);
                company.setLinkName(param.getLinkName());
                company.setLinkPhone(param.getLinkPhone());
                companyMapper.insert(company);
                //TODO æµ·åº·æ•°æ®åˆ›å»º
            }else{
                BeanUtils.copyProperties(param,company);
//                BeanUtils.copyProperties(param,company);
                company.setEditDate(new Date());
                company.setErpId(param.getId());
                company.setHkStatus(Constants.ZERO);
                company.setErpDate(new Date());
                company.setErpParentId(param.getParentId());
                company.setLinkName(param.getLinkName());
                company.setLinkPhone(param.getLinkPhone());
                companyMapper.updateById(company);
                //TODO æµ·åº·æ•°æ®æ›´æ–°
            }
@@ -742,7 +750,6 @@
                member.setIdcardDecode(Constants.getTuominStr(param.getIdNo()));
                member.setCompanyId(param.getOrgId());
                memberMapper.insert(member);
                //TODO æµ·åº·æ•°æ®åˆ›å»º
            }else{
                BeanUtils.copyProperties(param,member);
@@ -821,6 +828,7 @@
                visitsList.forEach(i->{
                    i.setStatus(param.getStatus().equals(Constants.ZERO)?Constants.VisitStatus.pass:Constants.VisitStatus.noPass);
                    i.setEndCheckDate(DateUtil.StringToDate(param.getApproveDate(),"yyyy-MM-dd HH:mm:ss"));
                    i.setHkStatus(Constants.ZERO);
                    visitsMapper.updateById(i);
                });
            }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -79,5 +79,11 @@
    @Override
    public  void syncOrgData( ){
    }
    @Override
    public  void  syncVisitData() {
    }
    @Override
    public  void syncEmpowerData() {
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncEmpowerServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.doumee.service.business.impl.hksync;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.VisitAppointmentRequest;
import com.doumee.core.haikang.model.param.respose.VisitAppointmentResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.join.EmpowerJoinMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.Empower;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
 * æµ·åº·é—¨ç¦æŽˆæƒä¸šåŠ¡Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncEmpowerServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private EmpowerJoinMapper empowerJoinMapper;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public  void syncEmpowerData(){
        if(Constants.DEALING_HK_EMPOWER){
            return   ;
        }
        Constants.DEALING_HK_EMPOWER =true;
        try {
            //查询所有需要同步的企业数据
            MPJLambdaWrapper<Empower> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Empower.class);
            queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName)
                        .select("t1.hk_id as receptMemberHkId")
                        .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
            queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过
                    .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康
                    .orderByAsc(Visits::getCreateDate);
            List<Empower> list = empowerJoinMapper.selectJoinList(Empower.class,queryWrapper);
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            for(Empower c : list) {
                //删除的数据,进行删除
                VisitAppointmentRequest request = new VisitAppointmentRequest();
                BaseResponse<VisitAppointmentResponse> response = HKService.visitAppiontment(request);
                if (response != null
                        && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)
                        &&response.getData()!=null
                        &&StringUtils.isNotBlank(response.getData().getAppointRecordId())) {
                    //海康下发成功
                    c.setHkId( response.getData().getAppointRecordId());//预约标识
                } else {
                    //海康下发成功
                }
                empowerJoinMapper.updateById(c);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_EMPOWER =false;
        }
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
@@ -4,26 +4,28 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
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.ParkListRequest;
import com.doumee.core.haikang.model.param.respose.OrgOrUserAddResponse;
import com.doumee.core.haikang.model.param.respose.OrgOrUserAddSuccessResponse;
import com.doumee.core.haikang.model.param.respose.OrgUpdateFailureResponse;
import com.doumee.core.haikang.model.param.respose.ParkListResponse;
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.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ParksMapper;
import com.doumee.dao.business.join.CompanyJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Parks;
import com.doumee.service.business.ERPSyncService;
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
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;
@@ -35,21 +37,24 @@
import java.util.UUID;
/**
 * æµ·åº·åœè½¦åº“同步Service实现
 * æµ·åº·ç»„织人员通过步Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncOrgUserServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ERPSyncService erpSyncService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息
     * @return
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public   void syncOrgData(){
@@ -64,7 +69,7 @@
                    .select("*,(select b.hk_id from company b where company.erp_parent_id = b.id limit 1) as hkParentId")
                    .lambda()
                    .eq(Company::getHkStatus,Constants.ZERO)
                    .orderByDesc(Company::getErpDate));
                    .orderByAsc(Company::getErpDate));
            if(list ==null || list.size()==0){
                return;
            }
@@ -124,6 +129,7 @@
     */
    private void doHkAddOrg(List<Company> updateList, List<OrgAddRequest> addList) {
        Date date = new Date();
        BaseResponse<OrgOrUserAddResponse> result =  HKService.addBatchOrg(addList);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            OrgOrUserAddResponse data = result.getData();
@@ -156,10 +162,10 @@
    private OrgAddRequest getOrgAddModel(Company c,String rootOrgId) {
        OrgAddRequest model = new OrgAddRequest();
        model.setOrgIndexCode(HKConstants.RES_INDEX+UUID.randomUUID().toString());
        model.setOrgIndexCode(HKConstants.RES_ORG_INDEX+UUID.randomUUID().toString().replace("-",""));
        model.setOrgName(c.getName());
        model.setOrgCode(c.getCode());
        model.setOrgIndexCode(c.getHkParentId());
//        model.setOrgCode(c.getCode());
        model.setParentIndexCode(c.getHkParentId());
        return  model;
    }
@@ -170,14 +176,20 @@
     * @param date
     */
    private void doHkDeleteOrg(List<Integer> delIds,List<String> delHkIds,  Date date) {
       if(delHkIds.size() == 0){
           return;
       }
        OrgDelRequest request = new OrgDelRequest();
        request.setIndexCodes((String[]) delHkIds.toArray());
        request.setIndexCodes( delHkIds.toArray(new String[]{}));
        BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            List<String> fIds = new ArrayList<>();
            if(result.getData()!=null){
                for(OrgUpdateFailureResponse r : result.getData()){
                    fIds.add(r.getOrgIndexCode());//删除失败的数据集合
                    if(!r.getCode().equals("0x00072001")){
                        //不存在的也算删除成功
                        fIds.add(r.getOrgIndexCode());//删除失败的数据集合
                    }
                }
            }
            //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕)
@@ -195,7 +207,133 @@
     */
    @Override
    public   void syncUserData(){
        if(Constants.DEALING_HK_USER){
            return   ;
        }
        Constants.DEALING_HK_USER =true;
        try {
            //查询所有需要同步的企业数据
            List<Member> list = memberMapper.selectList(new QueryWrapper<Member>()
                    .lambda()
                    .eq(Member::getHkStatus,Constants.ZERO)
                    .orderByAsc(Member::getErpDate));
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            for(Member c : list){
                if( c.getCompanyId() == null){
                    //如果没有组织不做处理
                    continue;
                }
                UserAddRequest  addHkModel = new UserAddRequest();
                if(StringUtils.isBlank(c.getHkId())){
                    //如果新增同步數據
                    if(Constants.equalsInteger(Constants.ONE,c.getIsdeleted())){
                        //删除的组织,不做处理,海康状态更新为不处理,下次不再处理这个记录
                        c.setHkStatus(Constants.TWO);
                        memberMapper.updateById(c);
                        continue ;
                    }
                    addHkModel = getUserAddModel(c,path);
                    c.setHkId(addHkModel.getPersonId());
                }else{
                    //删除海康原有的数据,再新增组织
                    addHkModel = getUserAddModel(c,path);
                    c.setHkId(addHkModel.getPersonId());
                }
                if(addHkModel == null){
                    //如果人脸数据不正确,下载失败等原因
                    noticeErpFail(c,Constants.ZERO,"人脸照片不存在,获取失败!");
                    continue;
                }
                //处理删除数据(删除之前下发的海康人员信息,然后新增)
                doHkDeleteUser(c.getId(),c.getHkId(),date);
                //处理新增数据
                BaseResponse<UserAddResponse> result =  HKService.addUser(addHkModel);
                if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE) && result.getData()!=null){
                    c.setFaceId(result.getData().getFaceId());
                    memberMapper.updateById(c);
                }else{
                    noticeErpFail(c,Constants.ZERO,"人员信息同步安防平台失败,请修正后重试!"+result.getCode()+result.getMsg());
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_USER =false;
        }
    }
    /**
     * é€šçŸ¥erp系统,人员下发同步信息状态失败
     * @param c
     * @param type
     * @param s
     */
    private void noticeErpFail(Member c, int type, String s) {
        UserFailRequest r = new UserFailRequest();
        r.setUserId(c.getErpId());
        r.setInfo(s);
        r.setType(type);
        //通知ERP人脸数据不正确
        erpSyncService.noticeUserFail(r);
    }
    /**
     * å¯¹æµ·åº·åˆ é™¤ç»„织信息
     * @param id
     * @param date
     */
    private void doHkDeleteUser(Integer  id,String delHkIds,  Date date) {
        if(StringUtils.isBlank(delHkIds)){
            return;
        }
        UserDelRequest request = new UserDelRequest();
        request.setPersonIds(new String[]{delHkIds});
        BaseResponse<List<UserDelResponse>> result =  HKService.delBatchUser(request);
        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
            List<String> fIds = new ArrayList<>();
            if(result.getData()!=null && result.getData().size()>0){
                log.info("海康删除用户失败:==============="+result.getData().get(0).getPersonId());
               /*   for(UserDelResponse r : result.getData()){
                  if(!r.getCode().equals("0x00072001")){
                        //不存在的也算删除成功
                         fIds.add(r.getPersonId());//删除失败的数据集合
                    }
                }}*/
            }else{
                //标记删除成功的数据(海康对接状态为已同步,,同步失败的仍为待同步,等下一次继续处理,知道全部删除完毕)
                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
                        .set(Company::getHkStatus,Constants.ONE)
                        .set(Company::getHkDate,date)
                        .in(Company::getId, id));
            }
        }
    }
    private UserAddRequest getUserAddModel(Member c,String path) {
        UserAddRequest model = new UserAddRequest();
        model.setOrgIndexCode(c.getCompanyHkId());
        model.setPersonId(HKConstants.RES_USER_INDEX+UUID.randomUUID().toString().replace("-", ""));
        model.setGender(Constants.formatIntegerNum(c.getSex())+"");
        model.setPersonName(c.getName());
        if(StringUtils.isNotBlank(c.getFaceImg())){
            model.setFaces(new ArrayList<>());
            UserAddFaceRequest face = new UserAddFaceRequest();
            String imageBase = ImageBase64Util.Image2Base64(path+c.getFaceImg());
            if(face.getFaceData() == null){
                //人脸数据不正确,
                return  null;
            }
            model.getFaces().add(face);
        }
        return  model;
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -368,7 +368,7 @@
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setClasses(visits.getMemberClasses());
        retention.setClasses(visits.getClasses());
        retention.setCode(visits.getCode());
        retention.setIdcardNo(visits.getIdcardNo());
        retention.setIdcardDecode(visits.getIdcardDecode());
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,220 @@
package com.doumee.service.business.impl.hksync;
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.core.erp.model.openapi.request.erp.UserFailRequest;
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.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.DeviceRole;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.ERPSyncService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
 * æµ·åº·è®¿å®¢ä¸šåŠ¡Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public  void syncVisitData(){
        if(Constants.DEALING_HK_VISIT){
            return   ;
        }
        Constants.DEALING_HK_VISIT =true;
        List<DeviceRole> roleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                .eq(DeviceRole::getType, Constants.ONE));
        //标记是否走免登记预约
        String applyType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_VISIT_REQUIRED).getCode();
        String applyLwType =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.MDJ_LW_REQUIRED).getCode();
        try {
            //查询所有需要同步的数据
            List<Visits> alllist = getVisitList();
            //按照父级申请分批处理每次申请数据
            List<Visits> list = getParentList(alllist);
            if(list ==null || list.size()==0){
                return;
            }
            Date date = new Date();
            for(Visits c : list) {
                //发起海康预约接口(需要登记),根据预约返回接口封装申请记录更新字段
                String type = Constants.equalsInteger(c.getType(),Constants.ONE)?applyType:applyLwType;
                getUpdateModelByResponse(c,date,type,roleList);
                visitsMapper.updateById(c);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            Constants.DEALING_HK_VISIT =false;
        }
    }
    private List<Visits> getParentList(List<Visits> alllist) {
        if(alllist ==null || alllist.size()==0){
            return null;
        }
        List<Visits> list = new ArrayList<>();
        for (Visits v : alllist){
            if(v.getParentId() == null){
                v.setVisitsList(getChildListByParentId(v.getId(),alllist));
                list.add(v);
            }
        }
        return  list;
    }
    private List<Visits> getChildListByParentId(Integer id, List<Visits> alllist) {
        List<Visits> list = new ArrayList<>();
        for (Visits v : alllist){
            if(Constants.equalsInteger(v.getParentId(),id)){
                list.add(v);
            }
        }
        return  list;
    }
    /**
     * æ ¹æ®é¢„约返回接口封装申请记录更新字段
     * @param c
     * @param date
     * @param type 0需要登记 1免登记
     */
    private void getUpdateModelByResponse(  Visits c,Date date,String type,List<DeviceRole> roleList ) {
        String code = null;
        String id = null;
        //发起海康预约接口
        if(StringUtils.equals(type,"0")){
            //(需要登记)
            BaseResponse<VisitAppointmentResponse> response =  HKService.visitAppiontment(getHkRequestPara(c,roleList));
        }else{
            //免登记
            BaseResponse<VisitAppointmentMDJResponse> response = HKService.visitAppiontmentMDJ(getHkMDJRequestPara(c) );
        }
        if (code!= null && id!=null) {
            //海康下发成功
            c.setHkId( id);//预约标识
            c.setStatus(Constants.VisitStatus.xfSuccess);//下发海康成功
        } else {
            //海康下发成功
            c.setStatus(Constants.VisitStatus.xfFail);//下发海康失败
        }
        c.setHkStatus(Constants.ONE);
        c.setHkDate(date);
    }
    private VisitAppointmentMDJRequest getHkMDJRequestPara(Visits c) {
        return  null;
    }
    private VisitAppointmentRequest getHkRequestPara(Visits c,List<DeviceRole> roleList ) {
        VisitAppointmentRequest request = new VisitAppointmentRequest();
        request.setVisitStartTime(DateUtil.getISO8601Timestamp(c.getStarttime()));
        request.setVisitEndTime(DateUtil.getISO8601Timestamp(c.getEndtime()));
        request.setReceptionistId(c.getReceptMemberHkId());//被访人海康编码
        request.setVisitPurpose(c.getReason());
        request.setVisitorPermissionSet(new VisitAppointmentPermissonRequest());
        //获取权限组集合
        String[] roles = getHkRoles(c.getDoors(),roleList);
        if(roles==null || roles.length ==0){
            //使用默认访客权限组
            request.getVisitorPermissionSet().setDefaultPrivilegeGroupFlag(Constants.ONE+"");
        }else{
            //指定有效海康访客权限组数据
            request.getVisitorPermissionSet().setDefaultPrivilegeGroupFlag(Constants.ZERO+"");
            request.getVisitorPermissionSet().setPrivilegeGroupIds(roles);
        }
        List<VisitAppointmentVistorRequest> infolist = new ArrayList<>();
        //申请人
        infolist.add(getRequestInfoByVisit(c));
        if(c.getVisitsList() != null){
            //随访人
            for(Visits v : c.getVisitsList()){
                infolist.add(getRequestInfoByVisit(v));
            }
        }
        request.setVisitorInfoList(infolist);
        return  request;
    }
    private VisitAppointmentVistorRequest getRequestInfoByVisit(Visits c) {
        VisitAppointmentVistorRequest info = new VisitAppointmentVistorRequest();
        info.setVisitorName(c.getName());
        info.setVisitorWorkUnit(c.getCompanyName());
        info.setPhoneNo(c.getPhone());
        return info;
    }
    private String[] getHkRoles(String doors, List<DeviceRole> roleList) {
        if(StringUtils.isBlank(doors) || roleList.size()==0|| roleList.size()==0){
            return null;
        }
        String[] ids = doors.split(",");
        List<String> roles = new ArrayList<>();
        for (String s : ids){
            for(DeviceRole r : roleList){
                if(StringUtils.isNotBlank(r.getHkId()) && StringUtils.equals(s,r.getId().toString())){
                    roles.add(r.getHkId());
                }
            }
        }
        return  roles.toArray(new String[]{});
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰éœ€è¦åŒæ­¥çš„æ•°æ®
     * @return
     */
    private List<Visits> getVisitList() {
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Visits.class);
        queryWrapper.selectAs(Member::getName,Visits::getReceptMemberName)
                .select("t1.hk_id as receptMemberHkId")
                .leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
        queryWrapper.eq(Visits::getStatus,Constants.VisitStatus.pass)//审批通过
                .eq(Visits::getHkStatus,Constants.ZERO)//未同步到海康
                .orderByAsc(Visits::getCreateDate);
        List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper);
        return list;
    }
}