package com.doumee.service.business.impl.hksync; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.haikang.model.HKConstants; 
 | 
import com.doumee.core.haikang.model.param.BaseResponse; 
 | 
import com.doumee.core.haikang.model.param.request.DoorsListRequest; 
 | 
import com.doumee.core.haikang.model.param.respose.*; 
 | 
import com.doumee.core.haikang.model.param.respose.DoorsInfoResponse; 
 | 
import com.doumee.core.haikang.service.HKService; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.core.utils.DateUtil; 
 | 
import com.doumee.dao.business.DeviceMapper; 
 | 
import com.doumee.dao.business.model.Device; 
 | 
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; 
 | 
  
 | 
/** 
 | 
 * 门禁点信息表Service实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2023/11/30 15:33 
 | 
 */ 
 | 
@Service 
 | 
public class HkSyncDoorsServiceImpl extends HkSyncBaseServiceImpl { 
 | 
  
 | 
    @Autowired 
 | 
    private DeviceMapper deviceMapper; 
 | 
  
 | 
    /** 
 | 
     * 同步海康门禁设备数据 
 | 
     * @param param 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
//    @Async 
 | 
    public String syncDoors(DoorsListRequest param){ 
 | 
        if(Constants.DEALING_HK_SYNCDEVICE){ 
 | 
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ; 
 | 
        } 
 | 
        Constants.DEALING_HK_SYNCDEVICE =true; 
 | 
        try { 
 | 
            List<Device> deleteList = new ArrayList<>(); 
 | 
            List<Device> addList = new ArrayList<>(); 
 | 
            List<Device> editList = new ArrayList<>(); 
 | 
            List<DoorsInfoResponse> allHkList = new ArrayList<>(); 
 | 
            Date date = new Date(); 
 | 
            //查询全部门禁设备数据 
 | 
            List<Device> allList = deviceMapper.selectList(null); 
 | 
            boolean hasNext = true; 
 | 
            int curTotal = 0; 
 | 
            int curPage = 1; 
 | 
            while (hasNext){ 
 | 
                //分页遍历循环查询所有门禁设备数据 
 | 
                param = new DoorsListRequest(); 
 | 
                param.setPageNo(curPage); 
 | 
                param.setPageSize(100); 
 | 
                BaseResponse<DoorsListResponse> response = HKService.doorSearch(param); 
 | 
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){ 
 | 
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~"); 
 | 
                } 
 | 
                DoorsListResponse r = response.getData(); 
 | 
                curTotal += 100; 
 | 
                if(curTotal >= r.getTotal()){ 
 | 
                    hasNext = false; 
 | 
                } 
 | 
                if(r.getList() == null || r.getList().size()==0){ 
 | 
                    hasNext =false; 
 | 
                }else{ 
 | 
                    allHkList.addAll(r.getList()); 
 | 
                } 
 | 
                curPage++; 
 | 
            } 
 | 
            /** 
 | 
             * 获取增删改数据集合 
 | 
             */ 
 | 
            getDataChangeList(allList,allHkList,addList,editList,deleteList,date); 
 | 
            if(deleteList.size()>0){ 
 | 
                //逻辑删除 
 | 
                for(Device d : deleteList){ 
 | 
                    deviceMapper.updateById(d); 
 | 
                } 
 | 
            } 
 | 
            if(addList.size()>0){ 
 | 
                deviceMapper.insert(addList); 
 | 
            } 
 | 
            if(editList.size()>0){ 
 | 
                for(Device d : editList){ 
 | 
                    deviceMapper.updateById(d); 
 | 
                } 
 | 
            } 
 | 
            return "同步数据:新增【"+addList.size()+"】条,更新【"+editList.size()+"】条,删除【"+deleteList.size()+"】条"; 
 | 
        }catch (Exception e){ 
 | 
            e.printStackTrace(); 
 | 
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "同步失败!"); 
 | 
        }finally { 
 | 
            Constants.DEALING_HK_SYNCDEVICE =false; 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    private void getDataChangeList(List<Device> allList, List<DoorsInfoResponse> allHkList, List<Device> addList, List<Device> editList,List<Device> deleteList, Date date) { 
 | 
        if(allHkList!=null && allHkList.size()>0){ 
 | 
            for(DoorsInfoResponse device : allHkList){ 
 | 
                Device model = getExistedDevice(device,allList); 
 | 
                if(model !=null){ 
 | 
                    //如果已存在,则更新数据 
 | 
                    model =  initDataByHkData(model,device,date); 
 | 
                    editList.add(model); 
 | 
                }else{ 
 | 
                    //如果不存在,则新增数据 
 | 
                    model = new Device(); 
 | 
                    model =  initDataByHkData(model,device,date); 
 | 
                    addList.add(model); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        //判断获取删除的门禁设备,逻辑删除 
 | 
        getDeleteList(allList,allHkList,deleteList,date); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 初始化海康入库数据 
 | 
     * @param model 
 | 
     * @param device 
 | 
     * @param date 
 | 
     * @return 
 | 
     */ 
 | 
    private Device initDataByHkData(Device model, DoorsInfoResponse device,Date date) { 
 | 
        model.setIsdeleted(Constants.ZERO); 
 | 
        model.setHkDate(date); 
 | 
        model.setCreateDate(DateUtil.getISO8601DateByStr(device.getCreateTime())); 
 | 
        model.setEditDate(DateUtil.getISO8601DateByStr(device.getUpdateTime())); 
 | 
        model.setNo(device.getDoorSerial()); 
 | 
        model.setHkId(device.getIndexCode()); 
 | 
        model.setName(device.getName()); 
 | 
        model.setHkStatus(Constants.ONE); 
 | 
        model.setType(Constants.ZERO); 
 | 
        model.setChannelNo(device.getChannelNo()); 
 | 
        model.setResourceType(device.getResourceType()); 
 | 
        model.setRemark(JSONObject.toJSONString(device)); 
 | 
        return  model; 
 | 
    } 
 | 
  
 | 
    private Device getExistedDevice(DoorsInfoResponse device, List<Device> allList) { 
 | 
        if(allList.size()>0){ 
 | 
            for(Device r : allList){ 
 | 
                if(StringUtils.equals(r.getHkId(), device.getIndexCode())){ 
 | 
                    //表示未删除 
 | 
                    return  r; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
  
 | 
    private void getDeleteList(List<Device> allList, List<DoorsInfoResponse> allHkList,List<Device> deleteList ,Date date) { 
 | 
        if(allList!=null && allList.size()>0){ 
 | 
            for(Device device : allList){ 
 | 
                if(isDeletedDevice(device,allHkList)){ 
 | 
                    device.setIsdeleted(Constants.ONE); 
 | 
                    device.setEditDate(date); 
 | 
                    deleteList.add(device); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private boolean isDeletedDevice(Device device, List<DoorsInfoResponse> allHkList) { 
 | 
        if(allHkList.size()>0){ 
 | 
            for(DoorsInfoResponse r : allHkList){ 
 | 
                if(StringUtils.equals(device.getHkId(), r.getIndexCode())){ 
 | 
                    //表示未删除 
 | 
                    return  false; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return  true; 
 | 
  
 | 
    } 
 | 
     
 | 
} 
 |