| 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(),"对不起,获取菜单失败,请稍后重试!"); | 
|     } | 
|   | 
| } |