Commit 7c85da5e authored by hanbing's avatar hanbing

[add] 快速特勤,自动解锁

parent ca7a3a38
package net.wanji.web.kafka;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.gts.GeometryUtil;
import net.wanji.common.gts.GeomsConvertUtil;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.mapper.BaseCrossInfoMapper;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.vo.LockControlVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.mapper.SpecialServiceCrossMapper;
import net.wanji.web.mapper.SpecialServiceMapper;
import net.wanji.web.po.SpecialServiceCrossPO;
import net.wanji.web.po.SpecialServicePO;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.listener.KafkaListenerErrorHandler;
import org.springframework.kafka.listener.ListenerExecutionFailedException;
......@@ -12,6 +26,9 @@ import org.springframework.kafka.support.Acknowledgment;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
......@@ -22,6 +39,40 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Component
public class ConsumerHandler implements KafkaListenerErrorHandler {
private final SpecialServiceMapper specialServiceMapper;
private final SpecialServiceCrossMapper specialServiceCrossMapper;
private final BaseCrossInfoMapper baseCrossInfoMapper;
private final UtcFeignClients utcFeignClients;
private List<String> carPlates = new ArrayList<>();
private List<BaseCrossInfoPO> crossList = new ArrayList<>();
public ConsumerHandler(SpecialServiceMapper specialServiceMapper, SpecialServiceCrossMapper specialServiceCrossMapper, BaseCrossInfoMapper baseCrossInfoMapper, @Qualifier("net.wanji.feign.service.UtcFeignClients") UtcFeignClients utcFeignClients) {
this.specialServiceMapper = specialServiceMapper;
this.specialServiceCrossMapper = specialServiceCrossMapper;
this.baseCrossInfoMapper = baseCrossInfoMapper;
this.utcFeignClients = utcFeignClients;
}
@PostConstruct
private void initCarplates() {
List<SpecialServicePO> specialServicePOList = specialServiceMapper.selectAll();
for (SpecialServicePO specialServicePO : specialServicePOList) {
String plateNum = specialServicePO.getPlateNum();
if (StrUtil.isNotEmpty(plateNum)) {
carPlates.add(plateNum);
}
}
}
@PostConstruct
private void initCrossList() {
List<SpecialServiceCrossPO> unLockCrosses = specialServiceCrossMapper.selectByAutoUnlock();
for (SpecialServiceCrossPO unLockCross : unLockCrosses) {
String crossId = unLockCross.getCrossId();
BaseCrossInfoPO baseCrossInfoPO = baseCrossInfoMapper.selectById(crossId);
crossList.add(baseCrossInfoPO);
}
}
/**
* kafka数据缓存
......@@ -50,6 +101,39 @@ public class ConsumerHandler implements KafkaListenerErrorHandler {
JNMatchResultMiniData jnMatchResultMiniData = JSONObject.parseObject((String)record.value(), JNMatchResultMiniData.class);
carInfoMap.put(record.topic(), jnMatchResultMiniData);
acknowledgment.acknowledge();
// 特勤车辆经过自动解锁路口
List<JNMatchResultMiniData.E1FrameParticipant> carList = jnMatchResultMiniData.getE1FrameParticipant();
for (JNMatchResultMiniData.E1FrameParticipant car : carList) {
String picLicense = car.getPicLicense();
// 是否是特勤车辆
for (String carPlate : carPlates) {
if (StrUtil.equals(picLicense, carPlate)) {
// 判断是否经过自动解锁路口
for (BaseCrossInfoPO cross : crossList) {
// 车辆位置
double carLong = car.getLongitude();
double carLat = car.getLatitude();
String carLonLatStr = carLong + "," + carLat;
Geometry carGeo = GeometryUtil.str2Geometry(carLonLatStr);
// 路口缓冲区
String crossLocation = cross.getLocation();
double[] crossLonLat = CrossUtil.getLonLat(crossLocation);
String crossLonLatStr = crossLonLat[0] + "," + crossLonLat[1];
Geometry crossGeo = GeometryUtil.str2Geometry(crossLonLatStr);
Geometry crossBuff = GeomsConvertUtil.getGeometryBuf(crossGeo, "80.0");
if (carGeo.intersects(crossBuff)) {
// 解锁
LockControlVO vo = new LockControlVO();
vo.setCrossCode(cross.getId());
vo.setCommand(0);
vo.setDuration(999);
vo.setPhaseList(new ArrayList<>());
utcFeignClients.lockControl(vo);
}
}
}
}
}
} catch (Exception e) {
log.error("监听主题消息异常, 异常信息", e);
}
......
......@@ -52,4 +52,6 @@ public interface SpecialServiceCrossMapper {
void deleteGroup(Integer specialServiceId, String groupName);
void updateAutoUnlock(String crossId, Integer autoUnlock);
List<SpecialServiceCrossPO> selectByAutoUnlock();
}
......@@ -115,4 +115,10 @@
where cross_id = #{crossId}
</select>
<select id="selectByAutoUnlock" resultType="net.wanji.web.po.SpecialServiceCrossPO">
select <include refid="Base_Column_List"></include>
from t_special_service_cross
where auto_unlock = 1
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment