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.config.DataSyncConfig; 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.AppointmentInfoResponse; import com.doumee.core.haikang.model.param.respose.ParkCrossRecordInfoResponse; import com.doumee.core.haikang.model.param.respose.ParkListResponse; import com.doumee.core.haikang.service.HKService; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DESUtil; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.CarEventMapper; import com.doumee.dao.business.ParksMapper; import com.doumee.dao.business.join.ParkBookJoinMapper; import com.doumee.dao.business.model.*; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; /** * 海康停车库同步Service实现 * @author 江蹄蹄 * @date 2023/11/30 15:33 */ @Service public class HkSyncParkServiceImpl extends HkSyncBaseServiceImpl { @Autowired private DataSyncConfig dataSyncConfig; @Autowired private ParksMapper parksMapper; @Autowired private ParkBookJoinMapper parkBookMapper; @Autowired private CarEventMapper carEventMapper; @Override public void syncParkBookData() { if(Constants.DEALING_HK_PARKBOOK){ return ; } Constants.DEALING_HK_PARKBOOK =true; try { //查询所有需要同步的数据 List list =getDealList (); if(list ==null || list.size()==0){ return; } Date date = new Date(); //处理所有需要包期的车辆数据记录 for(ParkBook c : list) { dealParkBookBiz(c,date); } }catch (Exception e){ e.printStackTrace(); }finally { Constants.DEALING_HK_PARKBOOK =false; } } private void dealParkBookBiz(ParkBook c,Date date) { try { if(Constants.equalsInteger(c.getIsdeleted(),Constants.ONE)) { //如果取消预约,则进行取消包期 if(StringUtils.isNotBlank(c.getParkHkId()) && StringUtils.isNotBlank(c.getCarCode())){ boolean result = cancelParkBookHk(c); c.setHkStatus(result?Constants.ONE:Constants.TWO); c.setRemark(result?"取消包期成功":"取消包期失败"); }else{ c.setHkStatus(Constants.TWO);//下发失败 c.setRemark("取消包期失败"); } c.setHkDate(date); }else{ //如果是新增包期,数据不合法,直接提示下发失败 if(StringUtils.isNotBlank(c.getParkHkId()) && StringUtils.isNotBlank(c.getCarCode())){ boolean result = addParkBookHk(c); c.setHkStatus(result?Constants.ONE:Constants.TWO); c.setRemark(result?"包期成功":"包期失败"); }else{ c.setHkStatus(Constants.TWO); c.setRemark("包期失败~"); } } c.setHkDate(date); parkBookMapper.updateById(c); }catch (Exception e){ } } @Override public void syncParkBookBySingleModel(ParkBook c) { if(Constants.equalsInteger(c.getIsdeleted(),Constants.ONE)){ //如果取消预约,则进行取消包期 if(StringUtils.isNotBlank(c.getParkHkId()) && StringUtils.isNotBlank(c.getCarCode())){ boolean result = cancelParkBookHk(c); c.setHkStatus(result?Constants.ONE:Constants.TWO); c.setRemark(result?"取消包期成功":"取消包期失败"); }else{ c.setHkStatus(Constants.TWO);//下发失败 c.setRemark("取消包期失败"); } c.setHkDate(new Date()); parkBookMapper.updateById(c); }else { //处理所有需要包期的车辆数据记录 //数据不合法,直接提示下发失败 if (StringUtils.isNotBlank(c.getParkHkId()) && StringUtils.isNotBlank(c.getCarCode())) { boolean result = addParkBookHk(c); c.setHkStatus(result ? Constants.ONE : Constants.TWO); c.setRemark(result ? "包期成功" : "包期失败"); } else { c.setHkStatus(Constants.TWO); c.setRemark("包期失败~"); } c.setHkDate(new Date()); parkBookMapper.updateById(c); } } private boolean addParkBookHk(ParkBook c) { CarChargeAddRequest param = new CarChargeAddRequest(); param.setPlateNo(c.getCarCode()); param.setParkSyscode(c.getParkHkId()); param.setStartTime(Objects.isNull(c.getStartTime())?DateUtil.getDate(new Date(),"yyyy-MM-dd"):DateUtil.getShortTimeToNull(c.getStartTime())); param.setEndTime(Objects.isNull(c.getEndTime())?"2999-12-31":DateUtil.getShortTimeToNull(c.getEndTime())); BaseResponse response = HKService.carChargeAddtion(param); if(response!=null && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE)){ return true; }else{ return false; } } public static boolean cancelParkBookHk(ParkBook c) { CarChargeDelRequest param = new CarChargeDelRequest(); param.setPlateNo(c.getCarCode()); param.setParkSyscode(c.getParkHkId()); BaseResponse response = HKService.carChargeDeletion(param); if(response!=null && StringUtils.equals(response.getCode(),HKConstants.RESPONSE_SUCCEE)){ return true; }else{ return false; } } private List getDealList() { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(ParkBook.class); queryWrapper.selectAs(Parks::getHkId,ParkBook::getParkHkId); queryWrapper.leftJoin(Parks.class,Parks::getId,ParkBook::getParkId); queryWrapper.selectAs(Device::getHkId,Empower::getDeviceIndexCode); List list = parkBookMapper.selectJoinList(ParkBook.class,queryWrapper.eq(ParkBook::getHkStatus,Constants.ZERO).orderByAsc(ParkBook::getId)); return list; } private void getDataChangeList(List allList, List allHkList, List addList, List editList,List deleteList, Date date) { if(allHkList!=null && allHkList.size()>0){ for(ParkListResponse device : allHkList){ Parks model = getExistedData(device,allList); if(model !=null){ //如果已存在,则更新数据 model = initModelByHkData(model,device,date); editList.add(model); }else{ //如果不存在,则新增数据 model = new Parks(); model = initModelByHkData(model,device,date); addList.add(model); } } } //判断获取删除的门禁设备,逻辑删除 getDeleteList(allList,allHkList,deleteList,date); } /** * 同步海康停车库数据 * @param param * @return */ @Override // @Async public String syncHkParks(ParkListRequest param){ if(Constants.DEALING_HK_SYNCPRIVILEGE){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "同步任务正在执行哦,请稍后查看结果!") ; } Constants.DEALING_HK_SYNCPRIVILEGE =true; try { List deleteList = new ArrayList<>(); List addList = new ArrayList<>(); List editList = new ArrayList<>(); Date date = new Date(); //查询全部当前数据 List allList = parksMapper.selectList(null); //分页遍历循环查询所有门禁设备数据 param = new ParkListRequest(); BaseResponse> response = HKService.parkList(param); if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~"); } List allHkList = response.getData(); // 获取增删改数据集合 getDataChangeList(allList,allHkList,addList,editList,deleteList,date); if(deleteList.size()>0){ //逻辑删除 for(Parks d : deleteList){ parksMapper.updateById(d); } } if(addList.size()>0){ parksMapper.insert(addList); } if(editList.size()>0){ for(Parks d : editList){ parksMapper.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_SYNCPRIVILEGE =false; } } /** * 初始化海康入库数据 * @param model * @param device * @param date * @return */ private Parks initModelByHkData(Parks model, ParkListResponse device,Date date) { model.setIsdeleted(Constants.ZERO); model.setName(device.getParkName()); model.setHkDate(date); model.setCreateDate(DateUtil.getISO8601DateByStr(device.getCreateTime())); model.setEditDate(DateUtil.getISO8601DateByStr(device.getUpdateTime())); model.setHkId(device.getParkIndexCode()); model.setHkStatus(Constants.ONE); model.setStatus(Constants.ONE); return model; } private Parks getExistedData(ParkListResponse data, List allList) { if(allList.size()>0){ for(Parks r : allList){ if(StringUtils.equals(r.getHkId(), data.getParkIndexCode())){ //表示未删除 return r; } } } return null; } private void getDeleteList(List allList, List allHkList,List deleteList ,Date date) { if(allList!=null && allList.size()>0){ for(Parks data : allList){ if(isDeletedDevice(data,allHkList)){ data.setIsdeleted(Constants.ONE); data.setEditDate(date); deleteList.add(data); } } } } private boolean isDeletedDevice(Parks device, List allHkList) { if(allHkList.size()>0){ for(ParkListResponse r : allHkList){ if(StringUtils.equals(device.getHkId(), r.getParkIndexCode())){ //表示未删除 return false; } } } return true; } @Override @Transactional public void syncParkRecords(Date date){ try { if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~"); } ParkCrossRecordListRequest param = new ParkCrossRecordListRequest(); //(全量同步) boolean hasNext = true; int curTotal = 0; int curPage = 1; //查询今天的 Date start = Utils.Date.getStart(date); Date end = new Date(); if(DateUtil.daysBetweenDates(end,start) >1){ end = Utils.Date.getEnd(date); } param.setStartTime(DateUtil.getISO8601Timestamp2( start)); param.setEndTime(DateUtil.getISO8601Timestamp2( end)); List allHkList = new ArrayList<>(); while (hasNext){ //分页遍历循环查询所有门禁设备数据 param.setPageNo(curPage); param.setPageSize(100); BaseResponse> response = HKService.parkCrossRecords(param); if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE) ){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~"); } if(response.getData() == null || response.getData().getTotal() ==0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!"); } BaseListPageResponse r = response.getData(); curTotal += 100; if(curTotal >= r.getTotal()){ hasNext = false; } if(r.getList() == null || r.getList().size()==0){ hasNext =false; }else{ allHkList.addAll(getNewCarEventModelBYList(r.getList())); } curPage++; } if(allHkList .size() == 0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!"); } //清空原有当天的数据 carEventMapper.delete(new UpdateWrapper().lambda() .ge(CarEvent::getCreateDate,start) .le(CarEvent::getCreateDate,end)); if(allHkList.size()>0){ int sublistSize = 500; int startIndex = 0; int endIndex = sublistSize; while (startIndex < allHkList.size()) { if (endIndex > allHkList.size()) { endIndex = allHkList.size(); } List sublist = allHkList.subList(startIndex, endIndex); if(sublist.size()>0){ carEventMapper.insert(sublist);//插入新数据 } startIndex = endIndex; endIndex += sublistSize; } } }catch (BusinessException e){ throw e; } } private List getNewCarEventModelBYList(List list ) { List newList = new ArrayList<>(); if(list == null || list.size()==0){ return newList; } for(ParkCrossRecordInfoResponse model :list){ if( model.getReleaseResult() ==null || !( model.getReleaseResult() == 1|| model.getReleaseResult() == 2 )){ continue; } CarEvent c = new CarEvent(); c.setHappenTime(model.getCrossTime()); c.setCreateDate(DateUtil.getISO8601DateByStr2(model.getCrossTime())); c.setSvrIndex(model.getAswSyscode()); c.setVehiclePicUrl(model.getVehiclePicUri()); c.setPlatePicUrl(model.getPlateNoPicUri()); c.setVehicleType(model.getVehicleType()); c.setPlateColor(model.getPlateColor()); c.setPlateType(model.getPlateType()); c.setCardNo(model.getCardNo()); c.setReleaseReason(model.getReleaseReason()); c.setPlateNos(model.getPlateNo()); c.setReleaseResult(model.getReleaseResult()); c.setInoutType(model.getVehicleOut()); c.setParkIndex(model.getParkSyscode()); c.setParkName(model.getParkName()); c.setEventId(model.getCrossRecordSyscode()); c.setGateIndex(model.getEntranceSyscode()); c.setGateName(model.getEntranceName()); c.setIsdeleted(Constants.ZERO); if(model.getVehicleOut() !=null &&model.getVehicleOut() == 0 ){ c.setEventType(HKConstants.EventTypes.PARK_PASS_IN.getKey()); }else { c.setEventType(HKConstants.EventTypes.PARK_PASS_OUT.getKey()); } newList.add(c); } return newList; } }