From 3ce9757effca99095cb2c964afa9932460ff931f Mon Sep 17 00:00:00 2001
From: xuqiuyun <1113560936@qq.com>
Date: Thu, 11 Dec 2025 17:32:36 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E8=BD=A8?=
=?UTF-8?q?=E8=BF=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.vscode/settings.json | 3 +-
pc-cattle-transportation/src/api/abroad.js | 6 +-
.../earlywarning/warningDetailDialog.vue | 54 +-
.../src/views/shipping/loadingOrder.vue | 87 +-
tradeCattle/aiotagro-cattle-trade/pom.xml | 7 +
.../controller/DeliveryController.java | 41 +-
.../dto/openapi/OpenApiTrackPoint.java | 45 +
.../dto/openapi/OpenApiTrackResponse.java | 37 +
.../dto/yingyan/YingyanStayPoint.java | 30 -
.../dto/yingyan/YingyanTrackPoint.java | 30 -
.../cattletrade/business/entity/Delivery.java | 15 +-
.../business/mapper/JbqClientLogMapper.java | 2 +-
.../business/mapper/JbqServerLogMapper.java | 2 +-
.../business/mapper/XqClientLogMapper.java | 2 +-
.../business/service/BaiduYingyanService.java | 829 ------------------
.../service/DeliveryYingyanSyncService.java | 418 ---------
.../business/service/IDeliveryService.java | 7 +-
.../service/IotDeviceLogSyncService.java | 5 +-
.../business/service/OpenApiTrackService.java | 333 +++++++
.../service/impl/DeliveryServiceImpl.java | 300 ++-----
.../cattletrade/job/BaiduYingyanSyncJob.java | 34 -
.../properties/OpenApiProperties.java | 54 ++
.../core/constant/BaiduYingyanConstants.java | 28 -
.../src/main/resources/api/.classpath | 6 +
.../src/main/resources/api/.project | 23 +
.../main/resources/api/META-INF/MANIFEST.MF | 2 +
.../src/main/resources/api/build.xml | 32 +
.../src/main/resources/api/openapi-sdk.iml | 51 ++
.../src/main/resources/api/version.txt | 11 +
.../src/main/resources/application.yml | 8 +-
30 files changed, 799 insertions(+), 1703 deletions(-)
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackPoint.java
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackResponse.java
delete mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanStayPoint.java
delete mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanTrackPoint.java
delete mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/BaiduYingyanService.java
delete mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/DeliveryYingyanSyncService.java
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/OpenApiTrackService.java
delete mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/job/BaiduYingyanSyncJob.java
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/properties/OpenApiProperties.java
delete mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/common/core/constant/BaiduYingyanConstants.java
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/resources/api/.classpath
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/resources/api/.project
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/resources/api/META-INF/MANIFEST.MF
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/resources/api/build.xml
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/resources/api/openapi-sdk.iml
create mode 100644 tradeCattle/aiotagro-cattle-trade/src/main/resources/api/version.txt
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 7b016a8..e012065 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,4 @@
{
- "java.compile.nullAnalysis.mode": "automatic"
+ "java.compile.nullAnalysis.mode": "automatic",
+ "java.configuration.updateBuildConfiguration": "interactive"
}
\ No newline at end of file
diff --git a/pc-cattle-transportation/src/api/abroad.js b/pc-cattle-transportation/src/api/abroad.js
index fd66f32..c5863c4 100644
--- a/pc-cattle-transportation/src/api/abroad.js
+++ b/pc-cattle-transportation/src/api/abroad.js
@@ -49,10 +49,10 @@ export function inspectionList(data) {
});
}
-// 查询百度鹰眼轨迹与停留点
-export function getYingyanTrack(data) {
+// 查询运单轨迹(基于车牌号,使用 OpenAPI)
+export function getDeliveryTrack(data) {
return request({
- url: '/delivery/yingyan/track',
+ url: '/delivery/track',
method: 'POST',
data,
});
diff --git a/pc-cattle-transportation/src/views/earlywarning/warningDetailDialog.vue b/pc-cattle-transportation/src/views/earlywarning/warningDetailDialog.vue
index fffea32..1301516 100644
--- a/pc-cattle-transportation/src/views/earlywarning/warningDetailDialog.vue
+++ b/pc-cattle-transportation/src/views/earlywarning/warningDetailDialog.vue
@@ -369,14 +369,6 @@
-
-
- {{ yingyanMeta.entityName }}
- {{ formatTimestamp(yingyanMeta.startTime) }}
- {{ formatTimestamp(yingyanMeta.endTime) }}
-
-
-
最新定位
@@ -461,7 +453,7 @@ import { ref, reactive, computed, nextTick, onUnmounted } from 'vue';
import { ElMessage } from 'element-plus';
import { Location, VideoPlay, Refresh, InfoFilled, Connection, DataLine, Loading } from '@element-plus/icons-vue';
import { BMPGL } from '@/utils/loadBmap.js';
-import { pageDeviceList, getCollarLogs, getEarTagLogs, getHostLogs, getYingyanTrack, waybillDetail } from '@/api/abroad.js';
+import { pageDeviceList, getCollarLogs, getEarTagLogs, getHostLogs, getDeliveryTrack, waybillDetail } from '@/api/abroad.js';
const dialogVisible = ref(false);
const warningData = reactive({
@@ -510,11 +502,6 @@ const trackBMapGL = ref(null); // 保存 BMapGL 实例,避免重复加载
const stayPoints = ref([]); // 停留点列表
const latestPoint = ref(null); // 最新轨迹点
const segmentStats = ref([]);
-const yingyanMeta = reactive({
- entityName: '',
- startTime: null,
- endTime: null
-});
// 计算属性:判断预警类型
const isTemperatureWarning = computed(() => {
@@ -939,16 +926,8 @@ const handleTrackClick = async () => {
return;
}
- await loadYingyanTrack();
-
- if (trackPath.value.length === 0) {
+ // TODO: 接入新的轨迹服务
trackLoading.value = false;
- return;
- }
-
- // 初始化地图
- await nextTick();
- await initTrackMap();
};
// 获取运送清单运输状态
@@ -981,16 +960,13 @@ const getDeliveryStatus = async () => {
}
};
-// 加载百度鹰眼轨迹与停留点
+// 加载运单轨迹(基于车牌号,使用 OpenAPI)
const loadYingyanTrack = async () => {
stayPoints.value = [];
trackPath.value = [];
latestPoint.value = null;
segmentStats.value = [];
trackMapShow.value = false;
- yingyanMeta.entityName = '';
- yingyanMeta.startTime = null;
- yingyanMeta.endTime = null;
if (!warningData.deliveryId) {
ElMessage.warning('运单ID缺失,无法查询轨迹');
@@ -998,11 +974,10 @@ const loadYingyanTrack = async () => {
}
try {
- const res = await getYingyanTrack({ deliveryId: warningData.deliveryId });
+ const res = await getDeliveryTrack({ deliveryId: warningData.deliveryId });
console.info('[TRACK] 后端轨迹接口响应', res);
+
if (res.code === 200 && res.data) {
- segmentStats.value = Array.isArray(res.data.segmentStats) ? res.data.segmentStats : [];
- console.info('[TRACK] 分段统计', segmentStats.value);
const rawPoints = Array.isArray(res.data.trackPoints) ? res.data.trackPoints : [];
trackPath.value = rawPoints
.map(item => {
@@ -1019,30 +994,18 @@ const loadYingyanTrack = async () => {
})
.filter(Boolean);
- stayPoints.value = Array.isArray(res.data.stayPoints) ? res.data.stayPoints : [];
- yingyanMeta.entityName = res.data.entityName || '';
- yingyanMeta.startTime = res.data.startTime || null;
- yingyanMeta.endTime = res.data.endTime || null;
- latestPoint.value = parseLatestPoint(res.data.latestPoint);
console.info('[TRACK] 轨迹点数量', trackPath.value.length);
if (trackPath.value.length > 0) {
trackMapShow.value = true;
- } else if (latestPoint.value) {
- trackPath.value.push({
- lng: latestPoint.value.lng,
- lat: latestPoint.value.lat,
- locTime: latestPoint.value.locTime || null,
- });
- trackMapShow.value = true;
} else {
- ElMessage.warning('暂无有效轨迹点');
+ ElMessage.warning(res.data.message || '暂无有效轨迹点');
}
} else {
ElMessage.warning(res.msg || '暂无轨迹数据');
}
} catch (error) {
- console.error('[TRACK] 加载百度鹰眼轨迹失败:', error);
+ console.error('[TRACK] 加载轨迹失败:', error);
ElMessage.error('加载轨迹数据失败');
}
};
@@ -1345,9 +1308,6 @@ const handleTrackDialogClose = () => {
trackPath.value = [];
trackMapShow.value = false;
stayPoints.value = [];
- yingyanMeta.entityName = '';
- yingyanMeta.startTime = null;
- yingyanMeta.endTime = null;
};
// 组件卸载时清理
diff --git a/pc-cattle-transportation/src/views/shipping/loadingOrder.vue b/pc-cattle-transportation/src/views/shipping/loadingOrder.vue
index ab4e272..9a0b879 100644
--- a/pc-cattle-transportation/src/views/shipping/loadingOrder.vue
+++ b/pc-cattle-transportation/src/views/shipping/loadingOrder.vue
@@ -142,9 +142,17 @@
-
- 轨迹点数:{{ trackPath.length }}
-
+
+ 轨迹点数:{{ trackPath.length }}
+ 总里程:{{ trackMileage }} km
+ 停车次数:{{ trackParkSize }}
+
+
+ 停车列表:
+
+ {{ p.name }} ({{ p.lng }}, {{ p.lat }})
+
+
@@ -162,7 +170,7 @@ import baseSearch from '@/components/common/searchCustom/index.vue';
import Pagination from '@/components/Pagination/index.vue';
import { orderPageQuery, orderDelete, orderBatchImport } from '@/api/shipping.js';
import { memberListByType, userAdd } from '@/api/userManage.js';
-import { getYingyanTrack, waybillDetail } from '@/api/abroad.js';
+import { getDeliveryTrack, waybillDetail } from '@/api/abroad.js';
import { BMPGL } from '@/utils/loadBmap.js';
import { nextTick } from 'vue';
import OrderDialog from './orderDialog.vue';
@@ -178,6 +186,9 @@ const fileInputRef = ref();
const trackDialogVisible = ref(false);
const trackLoading = ref(false);
const trackPath = ref([]);
+const trackMileage = ref(''); // 总里程 km
+const trackParkSize = ref(0); // 停车次数
+const trackParks = ref([]); // 停车列表
const deliveryStatus = ref(null);
const trackMapInstance = ref(null);
const formItemList = reactive([
@@ -398,34 +409,86 @@ const viewTrack = async (deliveryId, status) => {
trackDialogVisible.value = true;
trackLoading.value = true;
trackPath.value = [];
+ trackMileage.value = '';
+ trackParkSize.value = 0;
+ trackParks.value = [];
deliveryStatus.value = status;
try {
- const res = await getYingyanTrack({ deliveryId: deliveryId });
+ const res = await getDeliveryTrack({ deliveryId: deliveryId });
+ console.info('[track] response data:', res?.data);
if (res.code === 200 && res.data) {
- const rawPoints = Array.isArray(res.data.trackPoints) ? res.data.trackPoints : [];
- trackPath.value = rawPoints
+ const data = res.data;
+
+ // 尝试解析原始响应(兜底 trackArray/parkArray)
+ let rawTrackFromResp = [];
+ let rawParkFromResp = [];
+ if (!Array.isArray(data.trackArray) && data.rawResponse) {
+ try {
+ const rawObj = JSON.parse(data.rawResponse);
+ rawTrackFromResp = Array.isArray(rawObj?.result?.trackArray) ? rawObj.result.trackArray : [];
+ rawParkFromResp = Array.isArray(rawObj?.result?.parkArray) ? rawObj.result.parkArray : [];
+ console.info('[track] parsed rawResponse trackArray len:', rawTrackFromResp.length, 'parkArray len:', rawParkFromResp.length);
+ } catch (e) {
+ console.warn('解析 rawResponse 失败', e);
+ }
+ }
+
+ // 里程/停车
+ trackMileage.value = data.mileage || '';
+ trackParkSize.value = Number(data.parkSize || 0);
+ const parkArray = Array.isArray(data.parkArray) ? data.parkArray : rawParkFromResp;
+ trackParks.value = parkArray
+ .map((p, idx) => {
+ const lng = parseFloat(p.lon ?? p.lng ?? p.longitude ?? 0);
+ const lat = parseFloat(p.lat ?? p.latitude ?? 0);
+ return {
+ name: `停车点${idx + 1}`,
+ lng,
+ lat
+ };
+ })
+ .filter(p => !Number.isNaN(p.lng) && !Number.isNaN(p.lat) && p.lng !== 0 && p.lat !== 0);
+
+ // 轨迹
+ const rawTrack = Array.isArray(data.trackArray)
+ ? data.trackArray
+ : (Array.isArray(data.trackPoints) ? data.trackPoints : rawTrackFromResp);
+ console.info('[track] source arrays len -> trackArray:', Array.isArray(data.trackArray) ? data.trackArray.length : 0,
+ 'trackPoints:', Array.isArray(data.trackPoints) ? data.trackPoints.length : 0,
+ 'rawTrackFromResp:', rawTrackFromResp.length);
+ trackPath.value = rawTrack
.map(item => {
- const lng = parseFloat(item.longitude ?? item.lng ?? 0);
- const lat = parseFloat(item.latitude ?? item.lat ?? 0);
+ let lng = parseFloat(item.lon ?? item.lng ?? item.longitude ?? 0);
+ let lat = parseFloat(item.lat ?? item.latitude ?? 0);
+ // 如果疑似放大(>180/90),尝试除以600000
+ if (Math.abs(lng) > 180 || Math.abs(lat) > 90) {
+ lng = lng / 600000;
+ lat = lat / 600000;
+ }
if (Number.isNaN(lng) || Number.isNaN(lat) || lng === 0 || lat === 0) {
return null;
}
return {
lng,
lat,
- locTime: item.locTime
+ locTime: item.locTime || item.timestamp || item.utc || item.gtm || '',
+ speed: item.spd || item.speed || '',
+ direction: item.agl || item.direction || '',
+ altitude: item.hgt || item.altitude || '',
+ mileage: item.mlg || ''
};
})
.filter(Boolean);
+ console.info('[track] normalized trackPath len:', trackPath.value.length,
+ 'sample:', trackPath.value.slice(0, 3));
if (trackPath.value.length === 0) {
- ElMessage.warning('暂无有效轨迹点');
+ ElMessage.warning(data.message || '暂无有效轨迹点');
trackLoading.value = false;
return;
}
- // 初始化地图
await nextTick();
await initTrackMap();
} else {
diff --git a/tradeCattle/aiotagro-cattle-trade/pom.xml b/tradeCattle/aiotagro-cattle-trade/pom.xml
index 8b31452..ac97e05 100644
--- a/tradeCattle/aiotagro-cattle-trade/pom.xml
+++ b/tradeCattle/aiotagro-cattle-trade/pom.xml
@@ -192,6 +192,13 @@
xxl-job-core
2.4.1
+
+
+
+ com.openapi
+ openapi-sdk
+ 6.0
+
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/controller/DeliveryController.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/controller/DeliveryController.java
index f7c7fd8..96506ca 100644
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/controller/DeliveryController.java
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/controller/DeliveryController.java
@@ -13,7 +13,6 @@ import com.aiotagro.cattletrade.business.entity.Delivery;
import com.aiotagro.cattletrade.business.entity.DeliveryDevice;
import com.aiotagro.cattletrade.business.entity.JbqClient;
import com.aiotagro.cattletrade.business.entity.XqClient;
-import com.aiotagro.cattletrade.business.service.BaiduYingyanService;
import com.aiotagro.cattletrade.business.service.IDeliveryService;
import com.aiotagro.cattletrade.business.service.IDeliveryDeviceService;
import com.aiotagro.cattletrade.business.service.IJbqClientService;
@@ -87,11 +86,6 @@ public class DeliveryController {
@Autowired
private OrderMapper orderMapper;
- @Autowired
- private BaiduYingyanService baiduYingyanService;
-
-
-
/**
* 小程序运送清单-分页查询
*
@@ -604,33 +598,6 @@ public class DeliveryController {
if (StringUtils.isBlank(existDelivery.getLicensePlate())) {
return AjaxResult.error("车牌号为空,无法开启运输状态");
}
- // 去除车牌号中的空格,确保格式一致
- String licensePlate = existDelivery.getLicensePlate().trim();
- String entityName = StringUtils.defaultIfBlank(existDelivery.getYingyanEntityName(), licensePlate);
- // 如果终端名称与车牌号不一致,使用车牌号(去除空格)
- if (!licensePlate.equals(entityName)) {
- entityName = licensePlate;
- }
- boolean ensureResult = baiduYingyanService.ensureEntity(entityName);
-
- Delivery syncInfo = new Delivery();
- syncInfo.setId(id);
- syncInfo.setYingyanEntityName(entityName);
- if (existDelivery.getYingyanLastSyncTime() == null) {
- Date syncStart = existDelivery.getEstimatedDeliveryTime();
- if (syncStart == null) {
- syncStart = existDelivery.getEstimatedDepartureTime();
- }
- if (syncStart == null) {
- syncStart = existDelivery.getCreateTime();
- }
- syncInfo.setYingyanLastSyncTime(syncStart);
- }
- deliveryService.updateById(syncInfo);
-
- if (!ensureResult) {
- logger.warn("运单 {} 创建百度鹰眼终端失败,将在后台重试", existDelivery.getDeliveryNumber());
- }
} else if (status == 3) {
Delivery arrivalUpdate = new Delivery();
arrivalUpdate.setId(id);
@@ -657,12 +624,12 @@ public class DeliveryController {
}
/**
- * 查询运送清单百度鹰眼轨迹/停留点
+ * 查询运单轨迹(基于车牌号,使用 OpenAPI)
*/
@SaCheckPermission("delivery:view")
- @PostMapping("/yingyan/track")
- public AjaxResult getYingyanTrack(@Validated @RequestBody DeliveryTrackQueryDto dto) {
- return deliveryService.queryYingyanTrack(dto.getDeliveryId());
+ @PostMapping("/track")
+ public AjaxResult getTrack(@Validated @RequestBody DeliveryTrackQueryDto dto) {
+ return deliveryService.queryTrack(dto.getDeliveryId());
}
/**
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackPoint.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackPoint.java
new file mode 100644
index 0000000..a117b78
--- /dev/null
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackPoint.java
@@ -0,0 +1,45 @@
+package com.aiotagro.cattletrade.business.dto.openapi;
+
+import lombok.Data;
+
+/**
+ * OpenAPI 轨迹点 DTO
+ * 表示从 OpenAPI 返回的单个轨迹点数据
+ *
+ * @author System
+ * @date 2025-01-20
+ */
+@Data
+public class OpenApiTrackPoint {
+
+ /**
+ * 纬度
+ */
+ private Double latitude;
+
+ /**
+ * 经度
+ */
+ private Double longitude;
+
+ /**
+ * 定位时间(Unix 时间戳,秒)
+ */
+ private Long locTime;
+
+ /**
+ * 速度(米/秒)
+ */
+ private Double speed;
+
+ /**
+ * 方向角(度)
+ */
+ private Double direction;
+
+ /**
+ * 海拔(米)
+ */
+ private Double altitude;
+}
+
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackResponse.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackResponse.java
new file mode 100644
index 0000000..444a9bb
--- /dev/null
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/openapi/OpenApiTrackResponse.java
@@ -0,0 +1,37 @@
+package com.aiotagro.cattletrade.business.dto.openapi;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * OpenAPI 轨迹查询响应 DTO
+ * 根据实际 API 返回格式定义字段
+ *
+ * @author System
+ * @date 2025-01-20
+ */
+@Data
+public class OpenApiTrackResponse {
+
+ /**
+ * 响应状态码(0 表示成功)
+ */
+ private Integer status;
+
+ /**
+ * 响应消息
+ */
+ private String message;
+
+ /**
+ * 轨迹点列表
+ */
+ private List data;
+
+ /**
+ * 其他可能的字段(根据实际 API 返回格式添加)
+ */
+ private Object other;
+}
+
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanStayPoint.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanStayPoint.java
deleted file mode 100644
index 0fd6716..0000000
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanStayPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.aiotagro.cattletrade.business.dto.yingyan;
-
-import lombok.Data;
-
-/**
- * 百度鹰眼停留点
- */
-@Data
-public class YingyanStayPoint {
-
- private double latitude;
-
- private double longitude;
-
- /**
- * 停留开始时间(Unix 秒)
- */
- private long startTime;
-
- /**
- * 停留结束时间(Unix 秒)
- */
- private long endTime;
-
- /**
- * 停留时长(秒)
- */
- private long duration;
-}
-
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanTrackPoint.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanTrackPoint.java
deleted file mode 100644
index 313426b..0000000
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/yingyan/YingyanTrackPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.aiotagro.cattletrade.business.dto.yingyan;
-
-import lombok.Data;
-
-/**
- * 百度鹰眼轨迹点
- */
-@Data
-public class YingyanTrackPoint {
-
- private double latitude;
-
- private double longitude;
-
- /**
- * 轨迹点定位时间(Unix 秒)
- */
- private long locTime;
-
- /**
- * 米/秒
- */
- private Double speed;
-
- /**
- * 航向角
- */
- private Double direction;
-}
-
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/entity/Delivery.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/entity/Delivery.java
index 5a3db21..1713e5f 100644
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/entity/Delivery.java
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/entity/Delivery.java
@@ -180,20 +180,7 @@ public class Delivery implements Serializable {
private Date estimatedDeliveryTime;
/**
- * 百度鹰眼终端名称(默认为车牌)
- */
- @TableField("yingyan_entity_name")
- private String yingyanEntityName;
-
- /**
- * 百度鹰眼最后同步时间
- */
- @TableField("yingyan_last_sync_time")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date yingyanLastSyncTime;
-
- /**
- * 实际到达时间(鹰眼自动回写)
+ * 实际到达时间
*/
@TableField("arrival_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqClientLogMapper.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqClientLogMapper.java
index 63d53b2..551e1e2 100644
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqClientLogMapper.java
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqClientLogMapper.java
@@ -27,7 +27,7 @@ public interface JbqClientLogMapper extends BaseMapper {
int batchInsert(@Param("list") List logList);
/**
- * 供百度鹰眼同步使用的增量查询
+ * 查询耳标轨迹日志
*/
List listLogsForYingyan(@Param("deviceIds") List deviceIds,
@Param("startTime") Date startTime,
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqServerLogMapper.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqServerLogMapper.java
index bbef37e..cd6aeb1 100644
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqServerLogMapper.java
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/JbqServerLogMapper.java
@@ -28,7 +28,7 @@ public interface JbqServerLogMapper extends BaseMapper {
int batchInsert(@Param("list") List logList);
/**
- * 查询用于百度鹰眼推送的主机轨迹
+ * 查询主机轨迹日志
*/
List listLogsForYingyan(@Param("deviceIds") List deviceIds,
@Param("startTime") Date startTime,
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/XqClientLogMapper.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/XqClientLogMapper.java
index fb3ebce..d27ecd9 100644
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/XqClientLogMapper.java
+++ b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/mapper/XqClientLogMapper.java
@@ -27,7 +27,7 @@ public interface XqClientLogMapper extends BaseMapper {
int batchInsert(@Param("list") List logList);
/**
- * 查询用于百度鹰眼推送的项圈轨迹
+ * 查询项圈轨迹日志
*/
List listLogsForYingyan(@Param("deviceIds") List deviceIds,
@Param("startTime") Date startTime,
diff --git a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/BaiduYingyanService.java b/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/BaiduYingyanService.java
deleted file mode 100644
index ceb62e7..0000000
--- a/tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/BaiduYingyanService.java
+++ /dev/null
@@ -1,829 +0,0 @@
-package com.aiotagro.cattletrade.business.service;
-
-import com.aiotagro.cattletrade.business.dto.yingyan.YingyanStayPoint;
-import com.aiotagro.cattletrade.business.dto.yingyan.YingyanTrackPoint;
-import com.aiotagro.common.core.constant.BaiduYingyanConstants;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestTemplate;
-
-import java.time.Duration;
-import java.util.Date;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 百度鹰眼 API 封装
- */
-@Service
-public class BaiduYingyanService {
-
- private static final Logger logger = LoggerFactory.getLogger(BaiduYingyanService.class);
-
- private final RestTemplate restTemplate;
- private final ObjectMapper objectMapper;
-
- public BaiduYingyanService(ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
- this.restTemplate = buildRestTemplate();
- }
-
- /**
- * 确保终端存在(幂等)
- * 返回值:true-终端存在或创建成功,false-创建失败(终端不存在且创建失败)
- */
- public boolean ensureEntity(String entityName) {
- if (StringUtils.isBlank(entityName)) {
- logger.warn("ensureEntity 失败:终端名称为空");
- return false;
- }
-
- // ✅ 去除空格,确保格式一致
- String cleanEntityName = entityName.trim();
-
- // ✅ 验证 entityName 不是 "entity" 字符串
- if ("entity".equals(cleanEntityName) || "entity_name".equals(cleanEntityName)) {
- logger.error("ensureEntity 失败:entityName 参数错误,值为 '{}',这可能是参数传递错误", cleanEntityName);
- return false;
- }
-
- try {
- MultiValueMap form = baseForm();
- form.add("entity_name", cleanEntityName);
- // entity_desc 为非必填项,且命名规则限制:只支持中文、英文字母、下划线、连字符、数字
- // 为避免参数错误,不传递 entity_desc 参数
-
- logger.debug("确保终端存在 - entity={}, service_id={}", cleanEntityName, BaiduYingyanConstants.SERVICE_ID);
- JsonNode result = postForm("/entity/add", form);
- int status = result.path("status").asInt(-1);
- String message = result.path("message").asText();
-
- // ✅ 修复:status=0(创建成功)、3005(终端已存在)、3006(其他成功状态)都视为成功
- if (status == 0) {
- logger.info("✅ 鹰眼终端创建成功, entityName={}, service_id={}", cleanEntityName, BaiduYingyanConstants.SERVICE_ID);
- return true;
- } else if (status == 3005) {
- // ✅ 终端已存在,这是正常情况,视为成功
- logger.info("✅ 鹰眼终端已存在, entityName={}, service_id={}, message={}",
- cleanEntityName, BaiduYingyanConstants.SERVICE_ID, message);
- return true;
- } else if (status == 3006) {
- logger.info("✅ 鹰眼终端操作成功, entityName={}, service_id={}, status={}",
- cleanEntityName, BaiduYingyanConstants.SERVICE_ID, status);
- return true;
- }
-
- // 其他状态码视为失败
- logger.warn("❌ 鹰眼创建终端失败, entityName={}, service_id={}, status={}, message={}",
- cleanEntityName, BaiduYingyanConstants.SERVICE_ID, status, message);
- } catch (Exception e) {
- logger.error("❌ 鹰眼创建终端异常, entityName={}", cleanEntityName, e);
- }
- return false;
- }
-
- /**
- * 推送单条轨迹点
- */
- public boolean pushTrackPoint(String entityName, double latitude, double longitude, long locTime) {
- if (StringUtils.isBlank(entityName)) {
- logger.warn("鹰眼上传轨迹失败:终端名称为空");
- return false;
- }
-
- // ✅ 验证经纬度有效性
- if (latitude == 0 && longitude == 0) {
- logger.warn("鹰眼上传轨迹失败:经纬度无效 (0,0), entity={}", entityName);
- return false;
- }
- if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {
- logger.warn("鹰眼上传轨迹失败:经纬度超出有效范围, entity={}, lat={}, lon={}",
- entityName, latitude, longitude);
- return false;
- }
-
- try {
- MultiValueMap form = baseForm();
- form.add("entity_name", entityName);
- form.add("latitude", String.valueOf(latitude));
- form.add("longitude", String.valueOf(longitude));
- form.add("loc_time", String.valueOf(locTime));
- form.add("coord_type_input", "wgs84");
-
- logger.debug("鹰眼上传轨迹点 - entity={}, lat={}, lon={}, locTime={}",
- entityName, latitude, longitude, locTime);
-
- JsonNode result = postForm("/track/addpoint", form);
- int status = result.path("status").asInt(-1);
- String message = result.path("message").asText();
-
- if (status == 0) {
- logger.debug("鹰眼上传轨迹成功 - entity={}, lat={}, lon={}",
- entityName, latitude, longitude);
- return true;
- }
-
- // ✅ 详细记录失败原因
- logger.warn("鹰眼上传轨迹失败 - entity={}, status={}, message={}, lat={}, lon={}, locTime={}",
- entityName, status, message, latitude, longitude, locTime);
-
- // 如果是常见错误,记录更详细的信息
- if (status == 3001) {
- logger.error("鹰眼上传轨迹失败:参数错误,请检查经纬度和时间格式");
- } else if (status == 3002) {
- logger.error("鹰眼上传轨迹失败:服务不存在或未启用");
- } else if (status == 3003) {
- logger.error("鹰眼上传轨迹失败:终端不存在");
- } else if (status == 3004) {
- logger.error("鹰眼上传轨迹失败:轨迹点时间格式错误");
- }
-
- } catch (Exception e) {
- logger.error("鹰眼上传轨迹异常 - entity={}, lat={}, lon={}, locTime={}",
- entityName, latitude, longitude, locTime, e);
- }
- return false;
- }
-
- /**
- * 批量推送轨迹点(使用 /track/addpoints 接口)
- * @param entityName 终端名称
- * @param points 轨迹点列表
- * @return 成功上传的轨迹点数量
- */
- public int pushTrackPoints(String entityName, List points) {
- if (StringUtils.isBlank(entityName)) {
- logger.warn("鹰眼批量上传轨迹失败:终端名称为空");
- return 0;
- }
- if (points == null || points.isEmpty()) {
- logger.warn("鹰眼批量上传轨迹失败:轨迹点列表为空, entity={}", entityName);
- return 0;
- }
-
- try {
- // ✅ 确保终端存在
- if (!ensureEntity(entityName)) {
- logger.warn("鹰眼批量上传轨迹失败:终端不存在或创建失败, entity={}", entityName);
- return 0;
- }
-
- // ✅ 构建 point_list JSON 数组字符串
- List