package com.doumee.service.business.impl.hksync; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.doumee.biz.system.SystemDictDataBiz; 
 | 
import com.doumee.core.constants.ResponseStatus; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
import com.doumee.core.haikang.model.HKConstants; 
 | 
import com.doumee.core.haikang.model.param.BaseListPageResponse; 
 | 
import com.doumee.core.haikang.model.param.BaseResponse; 
 | 
import com.doumee.core.haikang.model.param.request.*; 
 | 
import com.doumee.core.haikang.model.param.respose.*; 
 | 
import com.doumee.core.haikang.service.HKService; 
 | 
import com.doumee.core.utils.Constants; 
 | 
import com.doumee.core.utils.DateUtil; 
 | 
import com.doumee.dao.business.PlatformDeviceMapper; 
 | 
import com.doumee.dao.business.PlatformJobMapper; 
 | 
import com.doumee.dao.business.PlatformMapper; 
 | 
import com.doumee.dao.business.model.Device; 
 | 
import com.doumee.dao.business.model.Platform; 
 | 
import com.doumee.dao.business.model.PlatformDevice; 
 | 
import com.doumee.dao.business.model.PlatformJob; 
 | 
import com.github.xiaoymin.knife4j.core.util.CollectionUtils; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.context.annotation.Lazy; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.*; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 设备信息表Service实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2023/11/30 15:33 
 | 
 */ 
 | 
@Service 
 | 
public class HkSyncPlatformsServiceImpl extends HkSyncBaseServiceImpl { 
 | 
    @Autowired 
 | 
    private PlatformMapper platformMapper; 
 | 
    @Autowired 
 | 
    private PlatformJobMapper platformJobMapper; 
 | 
    @Autowired 
 | 
    private PlatformDeviceMapper platformDeviceMapper; 
 | 
    @Autowired 
 | 
    @Lazy 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 同步海康月台数据 
 | 
     * @param param 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional 
 | 
    public String syncPlatforms(PlatformsListRequest param){ 
 | 
        if(Constants.DEALING_HK_SYNCPLATFORM){ 
 | 
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ; 
 | 
        } 
 | 
        Constants.DEALING_HK_SYNCPLATFORM =true; 
 | 
        try { 
 | 
            List<Platform> deleteList = new ArrayList<>(); 
 | 
            List<Platform> addList = new ArrayList<>(); 
 | 
            List<Platform> editList = new ArrayList<>(); 
 | 
            List<PlatformDevice> deviceList = new ArrayList<>(); 
 | 
            Date date = new Date(); 
 | 
            //查询全部门禁设备数据 
 | 
            List<Platform> allList = platformMapper.selectList(new QueryWrapper<Platform>().lambda().eq(Platform::getIsdeleted,Constants.ZERO)); 
 | 
            List<PlatformListInfoResponse> allHkList = getAllHkList(param); 
 | 
            /** 
 | 
             * 获取增删改数据集合 
 | 
             */ 
 | 
            getDataChangeList(allList,allHkList,addList,deviceList,editList,deleteList,date); 
 | 
            if(deleteList.size()>0){ 
 | 
                //逻辑删除 
 | 
                List<Integer> platIds = new ArrayList<>(); 
 | 
                for(Platform d : deleteList){ 
 | 
                    platformMapper.updateById(d); 
 | 
                    platIds.add(d.getId()); 
 | 
                } 
 | 
                //更新删除的月台信息删正在执行的作业状态为【待签到】状态 
 | 
                platformJobMapper.update(null,  new UpdateWrapper<PlatformJob>().lambda() 
 | 
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO) 
 | 
                        .notIn(PlatformJob::getStatus,Constants.PlatformJobStatus.WART_SIGN_IN.getKey() 
 | 
                                ,Constants.PlatformJobStatus.WAIT_CONFIRM.getKey() 
 | 
                                ,Constants.PlatformJobStatus.DONE.getKey() 
 | 
                                ,Constants.PlatformJobStatus.LEAVED.getKey() 
 | 
                                ,Constants.PlatformJobStatus.CANCEL.getKey() ) 
 | 
                        .in(PlatformJob::getPlatformId,platIds) 
 | 
                        .set(PlatformJob::getPlatformId,null) 
 | 
                        .set(PlatformJob::getPlatforms,null) 
 | 
                        .set(PlatformJob::getStatus,Constants.PlatformJobStatus.WART_SIGN_IN.getKey()) 
 | 
                ); 
 | 
            } 
 | 
            if(deviceList.size()>0){ 
 | 
                platformDeviceMapper.insert(deviceList); 
 | 
            } 
 | 
            if(editList.size()>0){ 
 | 
                for(Platform d : editList){ 
 | 
                    platformMapper.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_SYNCPLATFORM =false; 
 | 
        } 
 | 
    } 
 | 
    @Override 
 | 
//    @Async 
 | 
    public String getPlatformStatus(PlatformStatusRequest param){ 
 | 
        if(Constants.DEALING_HK_SYNCPLATFORM_STATUS){ 
 | 
            return null; 
 | 
        } 
 | 
        Constants.DEALING_HK_SYNCPLATFORM_STATUS =true; 
 | 
        try { 
 | 
            List<Device> editList = new ArrayList<>(); 
 | 
            Date date = new Date(); 
 | 
            //查询全部门禁设备数据 
 | 
            List<PlatformStatusInfoResponse> allHkList = getAllHKStatusList(param); 
 | 
  
 | 
            if(allHkList.size()>0){ 
 | 
                //更新状态 (月台状态 0-无车 1-有车 2-超时停靠 3-错误停靠) 
 | 
                for(PlatformStatusInfoResponse d : allHkList){ 
 | 
                    platformMapper.update(null,new UpdateWrapper<Platform>().lambda() 
 | 
                            .set(Platform::getPlatformStatus,d.getStatus()) 
 | 
                            .set(Platform::getEditDate,date) 
 | 
                            .eq(Platform::getHkId,d.getPlatformId())); 
 | 
                } 
 | 
            } 
 | 
        }catch (Exception e){ 
 | 
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "同步设备状态失败!"); 
 | 
        }finally { 
 | 
            Constants.DEALING_HK_SYNCPLATFORM_STATUS =false; 
 | 
        } 
 | 
        return "同步成功"; 
 | 
    } 
 | 
  
 | 
    private List<PlatformListInfoResponse> getAllHkList(PlatformsListRequest param) { 
 | 
        BaseResponse<BaseListPageResponse<PlatformListInfoResponse>> response = HKService.platformsList(param); 
 | 
        if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE) || response.getData() ==null){ 
 | 
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~"); 
 | 
        } 
 | 
  
 | 
        return response.getData().getList(); 
 | 
    } 
 | 
  
 | 
    public  List<PlatformStatusInfoResponse>  getAllHKStatusList(PlatformStatusRequest param){ 
 | 
            //分页遍历循环查询所有门禁设备数据 
 | 
            BaseResponse<BaseListPageResponse<PlatformStatusInfoResponse>> response = HKService.platformStatus(param); 
 | 
            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE) || response.getData() ==null){ 
 | 
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~"); 
 | 
            } 
 | 
          return  response.getData().getList(); 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
    private AcsDeviceInfoResponse getDeviceByDoorid(String indexCode, List<AcsDeviceInfoResponse> allHkList ) { 
 | 
        if(allHkList!=null && allHkList.size()>0){ 
 | 
            for(AcsDeviceInfoResponse info : allHkList){ 
 | 
                if(StringUtils.equals(indexCode,info.getIndexCode())){ 
 | 
                 return info; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return new AcsDeviceInfoResponse(); 
 | 
    } 
 | 
    private void getDataChangeList(List<Platform> allList, 
 | 
                                   List<PlatformListInfoResponse> allHkList, 
 | 
                                   List<Platform> addList , 
 | 
                                   List<PlatformDevice> deviceList, 
 | 
                                   List<Platform> editList, 
 | 
                                   List<Platform> deleteList, Date date) { 
 | 
        if(allHkList!=null && allHkList.size()>0){ 
 | 
            //获取海康全部门禁组数据 
 | 
            for(PlatformListInfoResponse device : allHkList){ 
 | 
                Platform model = getExistedDevice(device,allList); 
 | 
                if(model !=null){ 
 | 
                    //如果已存在,则更新数据 
 | 
                    model =  initDataByHkData(model,device,date); 
 | 
                    editList.add(model); 
 | 
                    //清空监控点数据 
 | 
                    platformDeviceMapper.delete(new UpdateWrapper<PlatformDevice>().lambda() 
 | 
                            .eq(PlatformDevice::getPlatformId,model.getId()) 
 | 
                            .eq(PlatformDevice::getType,Constants.ONE) 
 | 
                    ); 
 | 
                    deviceList.addAll(getCameraList(device.getCameras(),model)); 
 | 
                }else{ 
 | 
                    //如果不存在,则新增数据 
 | 
                    model = new Platform(); 
 | 
                    model =  initDataByHkData(model,device,date); 
 | 
                    platformMapper.insert(model); 
 | 
                    addList.add(model); 
 | 
                    deviceList.addAll(getCameraList(device.getCameras(),model)); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        //判断获取删除的门禁设备,逻辑删除 
 | 
        getDeleteList(allList,allHkList,deleteList,date); 
 | 
    } 
 | 
  
 | 
    private List<PlatformDevice> getCameraList(List<PlatformCameraInfoResponse> cameras, Platform model) { 
 | 
        List<PlatformDevice> list = new ArrayList<>(); 
 | 
        if(cameras!=null && cameras.size()>0){ 
 | 
            for(PlatformCameraInfoResponse param :cameras){ 
 | 
                PlatformDevice d = new PlatformDevice(); 
 | 
                d.setCreateDate(model.getCreateDate()); 
 | 
                d.setPlatformId(model.getId()); 
 | 
                d.setIsdeleted(Constants.ZERO); 
 | 
                d.setDeviceId(param.getCameraId()); 
 | 
                d.setName(param.getCameraName()); 
 | 
                d.setType(Constants.ONE); 
 | 
                list.add(d); 
 | 
            } 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 初始化海康入库数据 
 | 
     * @param model 
 | 
     * @param device 
 | 
     * @param date 
 | 
     * @return 
 | 
     */ 
 | 
    private Platform initDataByHkData(Platform model, PlatformListInfoResponse device,Date date ) { 
 | 
        model.setIsdeleted(Constants.ZERO); 
 | 
        model.setCreateDate(date); 
 | 
        model.setHkDate(date); 
 | 
        model.setHkId(device.getPlatformId()); 
 | 
        model.setCreateDate(DateUtil.getISO8601DateByStr(device.getCreateTime())); 
 | 
        model.setName(device.getPlatformName()); 
 | 
        model.setCompanys(device.getCompanyNames()); 
 | 
        model.setAngle(device.getAngle()); 
 | 
        model.setXpos(device.getX()); 
 | 
        model.setYpos(device.getY()); 
 | 
        model.setWidth(device.getWidth()); 
 | 
        model.setHeight(device.getHeight()); 
 | 
        model.setRemark(JSONObject.toJSONString(device)); 
 | 
        return  model; 
 | 
    } 
 | 
  
 | 
    private Platform getExistedDevice(PlatformListInfoResponse device, List<Platform> allList) { 
 | 
        if(allList.size()>0){ 
 | 
            for(Platform r : allList){ 
 | 
                if(StringUtils.equals(r.getHkId(), device.getPlatformId())){ 
 | 
                    //表示未删除 
 | 
                    return  r; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
  
 | 
    private void getDeleteList(List<Platform> allList, List<PlatformListInfoResponse> allHkList,List<Platform> deleteList ,Date date) { 
 | 
        if(allList!=null && allList.size()>0){ 
 | 
            for(Platform device : allList){ 
 | 
                if(isDeletedData(device,allHkList)){ 
 | 
                    device.setIsdeleted(Constants.ONE); 
 | 
                    device.setEditDate(date); 
 | 
                    deleteList.add(device); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    private boolean isDeletedData(Platform device, List<PlatformListInfoResponse> allHkList) { 
 | 
        if(allHkList.size()>0){ 
 | 
            for(PlatformListInfoResponse r : allHkList){ 
 | 
                if(StringUtils.equals(device.getHkId(), r.getPlatformId())){ 
 | 
                    //表示未删除 
 | 
                    return  false; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return  true; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public  List<Integer> getMenuConfig(String userId){ 
 | 
        try { 
 | 
            List<Integer> resultList= new ArrayList<>(); 
 | 
            Map<String,String> param = new HashMap<>(); 
 | 
            param.put("userId",userId); 
 | 
            BaseResponse<MenuDataResponse> result = HKService.getMenuConfig(param); 
 | 
            if(result !=null){ 
 | 
                if(!StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){ 
 | 
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),result.getMsg()); 
 | 
                } 
 | 
                MenuDataResponse menuDataResponse = result.getData(); 
 | 
                List<String> list = menuDataResponse.getList(); 
 | 
                if(CollectionUtils.isNotEmpty(list)){ 
 | 
                    //分别判断4个菜单 
 | 
                    if(list.stream().filter(i->i.equals("Infovision iPark Platform_"+HKConstants.MenuPageId.afzx)).collect(Collectors.toList()).size()>Constants.ZERO){ 
 | 
                        resultList.add(0); 
 | 
                    } 
 | 
                    if(list.stream().filter(i->i.equals("Infovision iPark Platform_"+HKConstants.MenuPageId.xkzx)).collect(Collectors.toList()).size()>Constants.ZERO){ 
 | 
                        resultList.add(1); 
 | 
                    } 
 | 
                    if(list.stream().filter(i->i.equals("Infovision iPark Platform_"+HKConstants.MenuPageId.ngzx)).collect(Collectors.toList()).size()>Constants.ZERO){ 
 | 
                        resultList.add(2); 
 | 
                    } 
 | 
                    if(list.stream().filter(i->i.equals("Infovision iPark Platform_"+HKConstants.MenuPageId.jsc)).collect(Collectors.toList()).size()>Constants.ZERO){ 
 | 
                        resultList.add(3); 
 | 
                    } 
 | 
                    if(list.stream().filter(i->i.equals("Infovision iPark Platform_"+HKConstants.MenuPageId.kqgzt)).collect(Collectors.toList()).size()>Constants.ZERO){ 
 | 
                        resultList.add(4); 
 | 
                    } 
 | 
                } 
 | 
                return resultList; 
 | 
            }else{ 
 | 
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,获取菜单失败!"); 
 | 
            } 
 | 
        }catch (Exception e){ 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,获取菜单失败,请稍后重试!"); 
 | 
    } 
 | 
  
 | 
} 
 |