电子围栏,车辆实时位置接收
This commit is contained in:
30
ruoyi-admin/src/main/java/com/ruoyi/api/FuleStatusApi.java
Normal file
30
ruoyi-admin/src/main/java/com/ruoyi/api/FuleStatusApi.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package com.ruoyi.api;
|
||||||
|
|
||||||
|
import com.ruoyi.operation.domain.DeviceLocation;
|
||||||
|
import com.ruoyi.operation.service.IZcElectronicFenceService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/fuleStatusApi")
|
||||||
|
public class FuleStatusApi {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IZcElectronicFenceService zcElectronicFenceService;
|
||||||
|
|
||||||
|
@PostMapping("/device-data")
|
||||||
|
public ResponseEntity<String> receiveDeviceData(@RequestBody DeviceLocation request) {
|
||||||
|
try {
|
||||||
|
zcElectronicFenceService.checkCarPositionInFence(request);
|
||||||
|
return ResponseEntity.ok("成功");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
.body("Failed to process data: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,395 @@
|
|||||||
|
package com.ruoyi.operation.domain;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备位置信息实体类
|
||||||
|
*/
|
||||||
|
public class DeviceLocation {
|
||||||
|
|
||||||
|
// 经度方向
|
||||||
|
@JsonProperty("longitudeDirection")
|
||||||
|
private String longitudeDirection;
|
||||||
|
|
||||||
|
// 布防状态
|
||||||
|
@JsonProperty("armStatus")
|
||||||
|
private String armStatus;
|
||||||
|
|
||||||
|
// 海拔高度
|
||||||
|
@JsonProperty("altitude")
|
||||||
|
private Integer altitude;
|
||||||
|
|
||||||
|
// 北斗使用状态
|
||||||
|
@JsonProperty("beidouUsed")
|
||||||
|
private String beidouUsed;
|
||||||
|
|
||||||
|
// 速度
|
||||||
|
@JsonProperty("speed")
|
||||||
|
private Integer speed;
|
||||||
|
|
||||||
|
// 定位状态
|
||||||
|
@JsonProperty("locationStatus")
|
||||||
|
private String locationStatus;
|
||||||
|
|
||||||
|
// 供应商ID
|
||||||
|
@JsonProperty("providerId")
|
||||||
|
private Integer providerId;
|
||||||
|
|
||||||
|
// 充电状态
|
||||||
|
@JsonProperty("chargingStatus")
|
||||||
|
private String chargingStatus;
|
||||||
|
|
||||||
|
// 门磁状态
|
||||||
|
@JsonProperty("hallStatus")
|
||||||
|
private String hallStatus;
|
||||||
|
|
||||||
|
// 纬度
|
||||||
|
@JsonProperty("lat")
|
||||||
|
private Double latitude;
|
||||||
|
|
||||||
|
// 设备工作状态
|
||||||
|
@JsonProperty("deviceWorkStatus")
|
||||||
|
private String deviceWorkStatus;
|
||||||
|
|
||||||
|
// 方向
|
||||||
|
@JsonProperty("direction")
|
||||||
|
private Integer direction;
|
||||||
|
|
||||||
|
// 状态位
|
||||||
|
@JsonProperty("statusBit")
|
||||||
|
private Integer statusBit;
|
||||||
|
|
||||||
|
// 报警位
|
||||||
|
@JsonProperty("warnBit")
|
||||||
|
private Integer warnBit;
|
||||||
|
|
||||||
|
// 客户端ID/设备ID
|
||||||
|
@JsonProperty("clientId")
|
||||||
|
private String clientId;
|
||||||
|
|
||||||
|
// 经度
|
||||||
|
@JsonProperty("lng")
|
||||||
|
private Double longitude;
|
||||||
|
|
||||||
|
// 报警信息
|
||||||
|
@JsonProperty("alarms")
|
||||||
|
private String alarms;
|
||||||
|
|
||||||
|
// ACC状态
|
||||||
|
@JsonProperty("accStatus")
|
||||||
|
private String accStatus;
|
||||||
|
|
||||||
|
// 伽利略使用状态
|
||||||
|
@JsonProperty("galileoUsed")
|
||||||
|
private String galileoUsed;
|
||||||
|
|
||||||
|
// 运动状态
|
||||||
|
@JsonProperty("movingStatus")
|
||||||
|
private String movingStatus;
|
||||||
|
|
||||||
|
// 纬度方向
|
||||||
|
@JsonProperty("latitudeDirection")
|
||||||
|
private String latitudeDirection;
|
||||||
|
|
||||||
|
// 软ACC状态
|
||||||
|
@JsonProperty("softAccStatus")
|
||||||
|
private String softAccStatus;
|
||||||
|
|
||||||
|
// GLONASS使用状态
|
||||||
|
@JsonProperty("glonassUsed")
|
||||||
|
private String glonassUsed;
|
||||||
|
|
||||||
|
// GPS使用状态
|
||||||
|
@JsonProperty("gpsUsed")
|
||||||
|
private String gpsUsed;
|
||||||
|
|
||||||
|
// 油路状态
|
||||||
|
@JsonProperty("fuelStatus")
|
||||||
|
private String fuelStatus;
|
||||||
|
|
||||||
|
// 设备电源状态
|
||||||
|
@JsonProperty("fakePowerStatus")
|
||||||
|
private String fakePowerStatus;
|
||||||
|
|
||||||
|
// 时间戳
|
||||||
|
@JsonProperty("ts")
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||||
|
private Date timestamp;
|
||||||
|
|
||||||
|
// 无参构造函数
|
||||||
|
public DeviceLocation() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// 全参构造函数
|
||||||
|
public DeviceLocation(String longitudeDirection, String armStatus, Integer altitude,
|
||||||
|
String beidouUsed, Integer speed, String locationStatus,
|
||||||
|
Integer providerId, String chargingStatus, String hallStatus,
|
||||||
|
Double latitude, String deviceWorkStatus, Integer direction,
|
||||||
|
Integer statusBit, Integer warnBit, String clientId,
|
||||||
|
Double longitude, String alarms, String accStatus,
|
||||||
|
String galileoUsed, String movingStatus, String latitudeDirection,
|
||||||
|
String softAccStatus, String glonassUsed, String gpsUsed,
|
||||||
|
String fuelStatus, String fakePowerStatus, Date timestamp) {
|
||||||
|
this.longitudeDirection = longitudeDirection;
|
||||||
|
this.armStatus = armStatus;
|
||||||
|
this.altitude = altitude;
|
||||||
|
this.beidouUsed = beidouUsed;
|
||||||
|
this.speed = speed;
|
||||||
|
this.locationStatus = locationStatus;
|
||||||
|
this.providerId = providerId;
|
||||||
|
this.chargingStatus = chargingStatus;
|
||||||
|
this.hallStatus = hallStatus;
|
||||||
|
this.latitude = latitude;
|
||||||
|
this.deviceWorkStatus = deviceWorkStatus;
|
||||||
|
this.direction = direction;
|
||||||
|
this.statusBit = statusBit;
|
||||||
|
this.warnBit = warnBit;
|
||||||
|
this.clientId = clientId;
|
||||||
|
this.longitude = longitude;
|
||||||
|
this.alarms = alarms;
|
||||||
|
this.accStatus = accStatus;
|
||||||
|
this.galileoUsed = galileoUsed;
|
||||||
|
this.movingStatus = movingStatus;
|
||||||
|
this.latitudeDirection = latitudeDirection;
|
||||||
|
this.softAccStatus = softAccStatus;
|
||||||
|
this.glonassUsed = glonassUsed;
|
||||||
|
this.gpsUsed = gpsUsed;
|
||||||
|
this.fuelStatus = fuelStatus;
|
||||||
|
this.fakePowerStatus = fakePowerStatus;
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter和Setter方法
|
||||||
|
public String getLongitudeDirection() {
|
||||||
|
return longitudeDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLongitudeDirection(String longitudeDirection) {
|
||||||
|
this.longitudeDirection = longitudeDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getArmStatus() {
|
||||||
|
return armStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setArmStatus(String armStatus) {
|
||||||
|
this.armStatus = armStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getAltitude() {
|
||||||
|
return altitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAltitude(Integer altitude) {
|
||||||
|
this.altitude = altitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBeidouUsed() {
|
||||||
|
return beidouUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBeidouUsed(String beidouUsed) {
|
||||||
|
this.beidouUsed = beidouUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSpeed() {
|
||||||
|
return speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpeed(Integer speed) {
|
||||||
|
this.speed = speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLocationStatus() {
|
||||||
|
return locationStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocationStatus(String locationStatus) {
|
||||||
|
this.locationStatus = locationStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getProviderId() {
|
||||||
|
return providerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProviderId(Integer providerId) {
|
||||||
|
this.providerId = providerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getChargingStatus() {
|
||||||
|
return chargingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChargingStatus(String chargingStatus) {
|
||||||
|
this.chargingStatus = chargingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHallStatus() {
|
||||||
|
return hallStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHallStatus(String hallStatus) {
|
||||||
|
this.hallStatus = hallStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getLatitude() {
|
||||||
|
return latitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLatitude(Double latitude) {
|
||||||
|
this.latitude = latitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDeviceWorkStatus() {
|
||||||
|
return deviceWorkStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeviceWorkStatus(String deviceWorkStatus) {
|
||||||
|
this.deviceWorkStatus = deviceWorkStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getDirection() {
|
||||||
|
return direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDirection(Integer direction) {
|
||||||
|
this.direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStatusBit() {
|
||||||
|
return statusBit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatusBit(Integer statusBit) {
|
||||||
|
this.statusBit = statusBit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getWarnBit() {
|
||||||
|
return warnBit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWarnBit(Integer warnBit) {
|
||||||
|
this.warnBit = warnBit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClientId() {
|
||||||
|
return clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClientId(String clientId) {
|
||||||
|
this.clientId = clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getLongitude() {
|
||||||
|
return longitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLongitude(Double longitude) {
|
||||||
|
this.longitude = longitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAlarms() {
|
||||||
|
return alarms;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAlarms(String alarms) {
|
||||||
|
this.alarms = alarms;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccStatus() {
|
||||||
|
return accStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccStatus(String accStatus) {
|
||||||
|
this.accStatus = accStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGalileoUsed() {
|
||||||
|
return galileoUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGalileoUsed(String galileoUsed) {
|
||||||
|
this.galileoUsed = galileoUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMovingStatus() {
|
||||||
|
return movingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMovingStatus(String movingStatus) {
|
||||||
|
this.movingStatus = movingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLatitudeDirection() {
|
||||||
|
return latitudeDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLatitudeDirection(String latitudeDirection) {
|
||||||
|
this.latitudeDirection = latitudeDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSoftAccStatus() {
|
||||||
|
return softAccStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSoftAccStatus(String softAccStatus) {
|
||||||
|
this.softAccStatus = softAccStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGlonassUsed() {
|
||||||
|
return glonassUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGlonassUsed(String glonassUsed) {
|
||||||
|
this.glonassUsed = glonassUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGpsUsed() {
|
||||||
|
return gpsUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGpsUsed(String gpsUsed) {
|
||||||
|
this.gpsUsed = gpsUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFuelStatus() {
|
||||||
|
return fuelStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFuelStatus(String fuelStatus) {
|
||||||
|
this.fuelStatus = fuelStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFakePowerStatus() {
|
||||||
|
return fakePowerStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFakePowerStatus(String fakePowerStatus) {
|
||||||
|
this.fakePowerStatus = fakePowerStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getTimestamp() {
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimestamp(Date timestamp) {
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "DeviceLocation{" +
|
||||||
|
"clientId='" + clientId + '\'' +
|
||||||
|
", longitude=" + longitude +
|
||||||
|
", latitude=" + latitude +
|
||||||
|
", timestamp=" + timestamp +
|
||||||
|
", speed=" + speed +
|
||||||
|
", direction=" + direction +
|
||||||
|
", locationStatus='" + locationStatus + '\'' +
|
||||||
|
", movingStatus='" + movingStatus + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,10 @@
|
|||||||
package com.ruoyi.operation.domain;
|
package com.ruoyi.operation.domain;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ruoyi.operation.util.CoordinateTransformUtil;
|
||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
import com.ruoyi.common.annotation.Excel;
|
import com.ruoyi.common.annotation.Excel;
|
||||||
@ -172,4 +176,36 @@ public class ZcElectronicFence extends BaseEntity
|
|||||||
.append("zcElectronicFenceRuleList", getZcElectronicFenceRuleList())
|
.append("zcElectronicFenceRuleList", getZcElectronicFenceRuleList())
|
||||||
.toString();
|
.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换坐标为WGS84格式
|
||||||
|
*/
|
||||||
|
public void transformCoordinatesToWGS84() {
|
||||||
|
if (this.address != null && !this.address.isEmpty()) {
|
||||||
|
try {
|
||||||
|
// 解析原始坐标数据
|
||||||
|
JSONArray coordinates = JSONArray.parseArray(this.address);
|
||||||
|
for (int i = 0; i < coordinates.size(); i++) {
|
||||||
|
JSONObject point = coordinates.getJSONObject(i);
|
||||||
|
double lng = point.getDouble("lng");
|
||||||
|
double lat = point.getDouble("lat");
|
||||||
|
|
||||||
|
// 执行坐标转换
|
||||||
|
double[] wgs84 = CoordinateTransformUtil.gcj02towgs84(lng, lat);
|
||||||
|
|
||||||
|
// 更新坐标值
|
||||||
|
point.put("lng", wgs84[0]);
|
||||||
|
point.put("lat", wgs84[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新extend1字段
|
||||||
|
this.extend1 = coordinates.toJSONString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 处理解析异常
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package com.ruoyi.operation.service;
|
package com.ruoyi.operation.service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.ruoyi.operation.domain.DeviceLocation;
|
||||||
import com.ruoyi.operation.domain.ZcElectronicFence;
|
import com.ruoyi.operation.domain.ZcElectronicFence;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,4 +62,12 @@ public interface IZcElectronicFenceService
|
|||||||
public int deleteZcElectronicFenceById(Long id);
|
public int deleteZcElectronicFenceById(Long id);
|
||||||
|
|
||||||
public int changeStatus(ZcElectronicFence zcElectronicFence);
|
public int changeStatus(ZcElectronicFence zcElectronicFence);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查车辆位置是否在电子围栏内
|
||||||
|
*
|
||||||
|
* @param deviceLocation
|
||||||
|
*/
|
||||||
|
public void checkCarPositionInFence(DeviceLocation deviceLocation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,10 +2,17 @@ package com.ruoyi.operation.service.impl;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ruoyi.common.constant.RedisKeyConstants;
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
|
import com.ruoyi.common.utils.RedisUtils;
|
||||||
|
import com.ruoyi.operation.domain.DeviceLocation;
|
||||||
import com.ruoyi.operation.domain.ZcCarModelPackage;
|
import com.ruoyi.operation.domain.ZcCarModelPackage;
|
||||||
import com.ruoyi.operation.mapper.ZcElectronicFenceRuleMapper;
|
import com.ruoyi.operation.mapper.ZcElectronicFenceRuleMapper;
|
||||||
import com.ruoyi.operation.service.IZcRentCarRuleService;
|
import com.ruoyi.operation.service.IZcRentCarRuleService;
|
||||||
|
import com.ruoyi.operation.util.Point;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -24,7 +31,7 @@ import com.ruoyi.common.core.text.Convert;
|
|||||||
* @date 2025-10-13
|
* @date 2025-10-13
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
||||||
{
|
{
|
||||||
@Autowired
|
@Autowired
|
||||||
private ZcElectronicFenceMapper zcElectronicFenceMapper;
|
private ZcElectronicFenceMapper zcElectronicFenceMapper;
|
||||||
@ -32,6 +39,9 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
|||||||
private ZcElectronicFenceRuleMapper zcElectronicFenceRuleMapper;
|
private ZcElectronicFenceRuleMapper zcElectronicFenceRuleMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IZcRentCarRuleService zcRentCarRuleService;
|
private IZcRentCarRuleService zcRentCarRuleService;
|
||||||
|
@Autowired
|
||||||
|
private RedisUtils redisUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询电子围栏
|
* 查询电子围栏
|
||||||
*
|
*
|
||||||
@ -66,6 +76,9 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
|||||||
@Override
|
@Override
|
||||||
public int insertZcElectronicFence(ZcElectronicFence zcElectronicFence)
|
public int insertZcElectronicFence(ZcElectronicFence zcElectronicFence)
|
||||||
{
|
{
|
||||||
|
// 坐标转换
|
||||||
|
zcElectronicFence.transformCoordinatesToWGS84();
|
||||||
|
|
||||||
zcElectronicFence.setCreateTime(DateUtils.getNowDate());
|
zcElectronicFence.setCreateTime(DateUtils.getNowDate());
|
||||||
int rows = zcElectronicFenceMapper.insertZcElectronicFence(zcElectronicFence);
|
int rows = zcElectronicFenceMapper.insertZcElectronicFence(zcElectronicFence);
|
||||||
|
|
||||||
@ -96,6 +109,9 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
|||||||
@Override
|
@Override
|
||||||
public int updateZcElectronicFence(ZcElectronicFence zcElectronicFence)
|
public int updateZcElectronicFence(ZcElectronicFence zcElectronicFence)
|
||||||
{
|
{
|
||||||
|
// 坐标转换wgs84
|
||||||
|
zcElectronicFence.transformCoordinatesToWGS84();
|
||||||
|
|
||||||
zcElectronicFence.setUpdateTime(DateUtils.getNowDate());
|
zcElectronicFence.setUpdateTime(DateUtils.getNowDate());
|
||||||
zcElectronicFenceMapper.deleteZcElectronicFenceRuleByElectronicFenceId(zcElectronicFence.getId());
|
zcElectronicFenceMapper.deleteZcElectronicFenceRuleByElectronicFenceId(zcElectronicFence.getId());
|
||||||
zcRentCarRuleService.updateZcRentCarRuleUnbindFence(zcElectronicFence.getId());
|
zcRentCarRuleService.updateZcRentCarRuleUnbindFence(zcElectronicFence.getId());
|
||||||
@ -145,15 +161,9 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
|||||||
return zcElectronicFenceMapper.deleteZcElectronicFenceById(id);
|
return zcElectronicFenceMapper.deleteZcElectronicFenceById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int changeStatus(ZcElectronicFence zcElectronicFence) {
|
|
||||||
zcElectronicFence.setUpdateTime(DateUtils.getNowDate());
|
|
||||||
return zcElectronicFenceMapper.updateZcElectronicFence(zcElectronicFence);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增套餐规则与电子围栏关联信息
|
* 新增套餐规则与电子围栏关联信息
|
||||||
*
|
*
|
||||||
* @param zcElectronicFence 电子围栏对象
|
* @param zcElectronicFence 电子围栏对象
|
||||||
*/
|
*/
|
||||||
public void insertZcElectronicFenceRule(ZcElectronicFence zcElectronicFence)
|
public void insertZcElectronicFenceRule(ZcElectronicFence zcElectronicFence)
|
||||||
@ -174,4 +184,150 @@ public class ZcElectronicFenceServiceImpl implements IZcElectronicFenceService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int changeStatus(ZcElectronicFence zcElectronicFence) {
|
||||||
|
zcElectronicFence.setUpdateTime(DateUtils.getNowDate());
|
||||||
|
return zcElectronicFenceMapper.updateZcElectronicFence(zcElectronicFence);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkCarPositionInFence(DeviceLocation deviceLocation) {
|
||||||
|
|
||||||
|
String clientId = deviceLocation.getClientId();
|
||||||
|
// 获取电子围栏id
|
||||||
|
String redisEfenceKey = RedisKeyConstants.E_Fence_KEY + clientId;
|
||||||
|
if (redisUtils.get(redisEfenceKey) == null) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
String fenceId = redisUtils.get(redisEfenceKey);
|
||||||
|
// 查询电子围栏
|
||||||
|
ZcElectronicFence electronicFence = zcElectronicFenceMapper.selectZcElectronicFenceById(Long.parseLong(fenceId));
|
||||||
|
|
||||||
|
if (electronicFence == null || StringUtils.isEmpty(electronicFence.getAddress())) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 解析电子围栏坐标点(转换后的wgs84坐标)
|
||||||
|
JSONArray fencePoints = JSONArray.parseArray(electronicFence.getExtend1());
|
||||||
|
List<Point> polygon = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < fencePoints.size(); i++) {
|
||||||
|
JSONObject pointObj = fencePoints.getJSONObject(i);
|
||||||
|
Point point = new Point(pointObj.getDouble("lng"), pointObj.getDouble("lat"));
|
||||||
|
polygon.add(point);
|
||||||
|
}
|
||||||
|
// 判断点是否在多边形内
|
||||||
|
Point testPoint = new Point(deviceLocation.getLongitude(), deviceLocation.getLatitude());
|
||||||
|
boolean currentlyInFence = isPointInPolygon(testPoint, polygon);
|
||||||
|
// 出圈时 fuelStatus=油路正常, 就下断电指令; 回到圈内时 fuelStatus=油路断开,就上电
|
||||||
|
String fuleStatus = deviceLocation.getFuelStatus();
|
||||||
|
// 状态发生变化时执行相应操作
|
||||||
|
if (currentlyInFence && "油路断开".equals(fuleStatus)) {
|
||||||
|
// 进入围栏 - 发出放电指令
|
||||||
|
sendPowerOnCommand(clientId);
|
||||||
|
} else if (!currentlyInFence && "油路正常".equals(fuleStatus)) {
|
||||||
|
// 超出围栏 - 发出断电指令
|
||||||
|
sendPowerOffCommand(clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断点是否在多边形内(射线法)
|
||||||
|
*
|
||||||
|
* @param point 测试点
|
||||||
|
* @param polygon 多边形顶点列表
|
||||||
|
* @return true-在多边形内,false-在多边形外
|
||||||
|
*/
|
||||||
|
private boolean isPointInPolygon(Point point, List<Point> polygon) {
|
||||||
|
int intersectCount = 0;
|
||||||
|
for (int i = 0; i < polygon.size(); i++) {
|
||||||
|
Point p1 = polygon.get(i);
|
||||||
|
Point p2 = polygon.get((i + 1) % polygon.size());
|
||||||
|
|
||||||
|
// 检查水平射线是否与边相交
|
||||||
|
if (rayIntersectsSegment(point, p1, p2)) {
|
||||||
|
intersectCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 奇数个交点表示在多边形内部
|
||||||
|
return (intersectCount % 2) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断射线是否与线段相交
|
||||||
|
*
|
||||||
|
* @param point 射线起点
|
||||||
|
* @param p1 线段端点1
|
||||||
|
* @param p2 线段端点2
|
||||||
|
* @return true-相交,false-不相交
|
||||||
|
*/
|
||||||
|
private boolean rayIntersectsSegment(Point point, Point p1, Point p2) {
|
||||||
|
// 确保p1的y坐标小于等于p2的y坐标
|
||||||
|
if (p1.y > p2.y) {
|
||||||
|
Point temp = p1;
|
||||||
|
p1 = p2;
|
||||||
|
p2 = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果点在线段两端点y坐标范围之外,则不相交
|
||||||
|
if (point.y < p1.y || point.y > p2.y) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 水平线段特殊处理
|
||||||
|
if (p1.y == p2.y) {
|
||||||
|
return (point.x >= Math.min(p1.x, p2.x) && point.x <= Math.max(p1.x, p2.x));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算交点x坐标
|
||||||
|
double xIntersection = (point.y - p1.y) * (p2.x - p1.x) / (p2.y - p1.y) + p1.x;
|
||||||
|
|
||||||
|
// 判断交点是否在射线上
|
||||||
|
return point.x <= xIntersection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取车辆上一次的指令状态
|
||||||
|
*
|
||||||
|
* @param clientId 车辆识别号
|
||||||
|
* @return 上次状态
|
||||||
|
*/
|
||||||
|
private Boolean getLastCarFuleStatus(String clientId) {
|
||||||
|
String status = redisUtils.get(RedisKeyConstants.CAR_FULE_STATUS_KEY + clientId);
|
||||||
|
if (StringUtils.isEmpty(status)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Boolean.valueOf(status);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 发送通电指令
|
||||||
|
*
|
||||||
|
* @param clientId 车辆识别号
|
||||||
|
*/
|
||||||
|
private void sendPowerOnCommand(String clientId) {
|
||||||
|
// 实际实现发送通电指令到设备
|
||||||
|
System.out.println("发送放电指令给车辆: " + clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送断电指令
|
||||||
|
*
|
||||||
|
* @param clientId 车辆识别号
|
||||||
|
*/
|
||||||
|
private void sendPowerOffCommand(String clientId) {
|
||||||
|
// 实际实现发送断电指令到设备
|
||||||
|
System.out.println("发送断电指令给车辆: " + clientId);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,38 @@
|
|||||||
|
package com.ruoyi.operation.util;
|
||||||
|
|
||||||
|
public class CoordinateTransformUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GCJ-02 to WGS-84
|
||||||
|
*/
|
||||||
|
public static double[] gcj02towgs84(double lng, double lat) {
|
||||||
|
double dlat = transformlat(lng - 105.0, lat - 35.0);
|
||||||
|
double dlng = transformlng(lng - 105.0, lat - 35.0);
|
||||||
|
double radlat = lat / 180.0 * Math.PI;
|
||||||
|
double magic = Math.sin(radlat);
|
||||||
|
magic = 1 - 0.006693421622965943 * magic * magic;
|
||||||
|
double sqrtmagic = Math.sqrt(magic);
|
||||||
|
dlat = (dlat * 180.0) / ((6378137.0 * (1 - 0.006693421622965943)) / (magic * sqrtmagic) * Math.PI);
|
||||||
|
dlng = (dlng * 180.0) / (6378137.0 / sqrtmagic * Math.cos(radlat) * Math.PI);
|
||||||
|
double mglat = lat + dlat;
|
||||||
|
double mglng = lng + dlng;
|
||||||
|
return new double[]{lng * 2 - mglng, lat * 2 - mglat};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double transformlat(double x, double y) {
|
||||||
|
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
|
||||||
|
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
|
||||||
|
ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
|
||||||
|
ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double transformlng(double x, double y) {
|
||||||
|
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
|
||||||
|
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
|
||||||
|
ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
|
||||||
|
ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package com.ruoyi.operation.util;
|
||||||
|
|
||||||
|
public class Point {
|
||||||
|
|
||||||
|
public double x, y;
|
||||||
|
|
||||||
|
public Point(double x, double y) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -4,7 +4,9 @@ import java.math.BigDecimal;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import com.ruoyi.api.DataPushApi;
|
import com.ruoyi.api.DataPushApi;
|
||||||
|
import com.ruoyi.common.constant.RedisKeyConstants;
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
|
import com.ruoyi.common.utils.RedisUtils;
|
||||||
import com.ruoyi.common.utils.ShiroUtils;
|
import com.ruoyi.common.utils.ShiroUtils;
|
||||||
import com.ruoyi.operation.domain.ZcCar;
|
import com.ruoyi.operation.domain.ZcCar;
|
||||||
import com.ruoyi.operation.service.IZcCarService;
|
import com.ruoyi.operation.service.IZcCarService;
|
||||||
@ -57,6 +59,8 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
|
|||||||
private IZcCarService zcCarService;
|
private IZcCarService zcCarService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private DataPushApi dataPushApi;
|
private DataPushApi dataPushApi;
|
||||||
|
@Autowired
|
||||||
|
private RedisUtils redisUtils;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -181,6 +185,16 @@ public class ZcOrderMainServiceImpl implements IZcOrderMainService
|
|||||||
zcCarService.updateZcCar(zcCar);
|
zcCarService.updateZcCar(zcCar);
|
||||||
|
|
||||||
logger.info("手动结束订单处理完成,订单ID: {}", orderId);
|
logger.info("手动结束订单处理完成,订单ID: {}", orderId);
|
||||||
|
|
||||||
|
//删除车辆电子围栏缓存
|
||||||
|
ZcCar queryCar = zcCarService.selectZcCarById(queryOrder.getVehicleId());
|
||||||
|
if(queryCar != null) {
|
||||||
|
String redisEfenceKey = RedisKeyConstants.E_Fence_KEY + queryCar.getLotNumber();
|
||||||
|
if (redisUtils.get(redisEfenceKey) != null) {
|
||||||
|
redisUtils.delete(redisEfenceKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return flag;
|
return flag;
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@ -21,4 +21,14 @@ public class RedisKeyConstants {
|
|||||||
*/
|
*/
|
||||||
public final static String SCENE_KAPTCHA_LOGIN = "KAPTCHA_LOGIN:";
|
public final static String SCENE_KAPTCHA_LOGIN = "KAPTCHA_LOGIN:";
|
||||||
|
|
||||||
|
|
||||||
|
public final static String SERVICE_PREFIX = "sczxOrder:";
|
||||||
|
|
||||||
|
public final static String ORDER_SUB_KEY = SERVICE_PREFIX + "orderSub:";
|
||||||
|
|
||||||
|
public final static String BIND_CAR_KEY = SERVICE_PREFIX + "bindCar:";
|
||||||
|
|
||||||
|
public final static String E_Fence_KEY = SERVICE_PREFIX + "eFence:";
|
||||||
|
|
||||||
|
public final static String CAR_FULE_STATUS_KEY = SERVICE_PREFIX + "carFuleStatus:";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user