From 3c9c3db69742fe4d3e69b5619eb52f4ed5f2cfb5 Mon Sep 17 00:00:00 2001
From: rain <1679827795@qq.com>
Date: Wed, 28 Jan 2026 17:19:58 +0800
Subject: [PATCH] 同步获取吉安机巢无人机设备
---
drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 212 insertions(+), 2 deletions(-)
diff --git a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java
index f0b0051..6d3fac9 100644
--- a/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java
+++ b/drone-service/drone-gd/src/main/java/org/sxkj/gd/workorder/service/impl/GdManageDeviceServiceImpl.java
@@ -16,21 +16,33 @@
*/
package org.sxkj.gd.workorder.service.impl;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
import org.sxkj.gd.utils.GdGeoAddressUtil;
import org.sxkj.gd.utils.GeomUtils;
+import org.sxkj.gd.workorder.dto.GdXingtuAirportListDTO;
+import org.sxkj.gd.workorder.dto.GdXingtuPilotListDTO;
import org.sxkj.gd.workorder.entity.GdManageDeviceEntity;
import org.sxkj.gd.workorder.param.GdManageDevicePageParam;
import org.sxkj.gd.workorder.vo.GdManageDeviceVO;
import org.sxkj.gd.workorder.excel.GdManageDeviceExcel;
import org.sxkj.gd.workorder.mapper.GdManageDeviceMapper;
import org.sxkj.gd.workorder.service.IGdManageDeviceService;
+import org.sxkj.gd.xingtu.JianXingtuApiService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
import org.springblade.core.mp.base.BaseServiceImpl;
-import org.sxkj.system.cache.DictCache;
-import org.sxkj.system.enums.DictEnum;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.StringUtil;
+import java.text.SimpleDateFormat;
+import java.util.Collections;
+import java.util.Date;
import java.util.List;
/**
@@ -40,7 +52,10 @@
* @since 2026-01-14
*/
@Service
+@AllArgsConstructor
public class GdManageDeviceServiceImpl extends BaseServiceImpl<GdManageDeviceMapper, GdManageDeviceEntity> implements IGdManageDeviceService {
+
+ private final JianXingtuApiService jianXingtuApiService;
@Override
public IPage<GdManageDeviceVO> selectGdManageDevicePage(IPage<GdManageDeviceVO> page, GdManageDevicePageParam gdManageDevice) {
@@ -80,4 +95,199 @@
}
return saveOrUpdate(gdManageDeviceEntity);
}
+
+ /**
+ * 同步星图设备(无人机、机巢)
+ *
+ * @return 同步数量
+ */
+ @Override
+ @Async
+ @Scheduled(cron = "0 0 0 * * ?")
+ public int syncXingtuDevice() throws Exception {
+ int total = 0;
+ total += syncPilotDevices();
+ total += syncAirportDevices();
+ return total;
+ }
+
+ private int syncPilotDevices() throws Exception {
+ R response = jianXingtuApiService.getDevicePilotList(null);
+ List<GdXingtuPilotListDTO> items = parseList(response, GdXingtuPilotListDTO.class);
+ if (items.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ for (GdXingtuPilotListDTO item : items) {
+ GdManageDeviceEntity entity = buildFromPilot(item);
+ if (entity == null) {
+ continue;
+ }
+ if (saveOrUpdateByAirportId(entity)) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private int syncAirportDevices() throws Exception {
+ R response = jianXingtuApiService.getDeviceAirportList(null);
+ List<GdXingtuAirportListDTO> items = parseList(response, GdXingtuAirportListDTO.class);
+ if (items.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ for (GdXingtuAirportListDTO item : items) {
+ GdManageDeviceEntity entity = buildFromAirport(item);
+ if (entity == null) {
+ continue;
+ }
+ if (saveOrUpdateByAirportId(entity)) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private boolean saveOrUpdateByAirportId(GdManageDeviceEntity entity) throws Exception {
+ if (StringUtil.isBlank(entity.getAirportId())) {
+ return false;
+ }
+ GdManageDeviceEntity exist = lambdaQuery()
+ .eq(GdManageDeviceEntity::getAirportId, entity.getAirportId())
+ .one();
+ if (exist != null) {
+ entity.setId(exist.getId());
+ if (entity.getLongitude() == null) {
+ entity.setLongitude(exist.getLongitude());
+ }
+ if (entity.getLatitude() == null) {
+ entity.setLatitude(exist.getLatitude());
+ }
+ if (entity.getInsureExpiredTime() == null) {
+ entity.setInsureExpiredTime(exist.getInsureExpiredTime());
+ }
+ }
+ return saveOrUpdateDevice(entity);
+ }
+
+ private GdManageDeviceEntity buildFromPilot(GdXingtuPilotListDTO item) {
+ if (item == null) {
+ return null;
+ }
+ GdManageDeviceEntity entity = new GdManageDeviceEntity();
+ entity.setAirportId(item.getId());
+ entity.setDeviceSn(item.getSnCode());
+ entity.setDeviceName(item.getName());
+ entity.setNickname(item.getName());
+ entity.setDeviceType(1);
+ entity.setLongitude(parseDouble(item.getLongitude()));
+ entity.setLatitude(parseDouble(item.getLatitude()));
+ entity.setFirmwareVersion(item.getFirmwareVersion());
+ entity.setModeCode(parseModeCode(item.getStatus()));
+ entity.setInsureExpiredTime(parseInsuranceDate(item.getInsuranceInfo()));
+ entity.setAreaCode(extractAreaCode(item.getRegionCode()));
+ return entity;
+ }
+
+ private GdManageDeviceEntity buildFromAirport(GdXingtuAirportListDTO item) {
+ if (item == null) {
+ return null;
+ }
+ GdManageDeviceEntity entity = new GdManageDeviceEntity();
+ entity.setAirportId(item.getId());
+ entity.setDeviceSn(item.getSnCode());
+ entity.setDeviceName(item.getName());
+ entity.setNickname(item.getName());
+ entity.setDeviceType(0);
+ entity.setLongitude(parseDouble(item.getLongitude()));
+ entity.setLatitude(parseDouble(item.getLatitude()));
+ entity.setFirmwareVersion(item.getFirmwareVersion());
+ entity.setChildSn(item.getPilotSnCode());
+ entity.setModeCode(parseModeCode(item.getStatus()));
+ entity.setInsureExpiredTime(parseInsuranceDate(item.getInsuranceInfo()));
+ entity.setAreaCode(extractAreaCode(item.getRegionCode()));
+ return entity;
+ }
+
+ private Long parseModeCode(String status) {
+ if ("在线".equals(status)) {
+ return 0L;
+ }
+ if ("离线".equals(status)) {
+ return 1L;
+ }
+ return null;
+ }
+
+ private Double parseDouble(String value) {
+ if (StringUtil.isBlank(value)) {
+ return null;
+ }
+ try {
+ return Double.valueOf(value);
+ } catch (Exception ignored) {
+ return null;
+ }
+ }
+
+ private String extractAreaCode(String regionCode) {
+ if (StringUtil.isBlank(regionCode)) {
+ return null;
+ }
+ String[] parts = regionCode.split(",");
+ if (parts.length == 1) {
+ parts = regionCode.split("-");
+ }
+ for (int i = parts.length - 1; i >= 0; i--) {
+ if (StringUtil.isNotBlank(parts[i])) {
+ return parts[i];
+ }
+ }
+ return regionCode;
+ }
+
+ private Date parseInsuranceDate(String insuranceInfo) {
+ if (StringUtil.isBlank(insuranceInfo)) {
+ return null;
+ }
+ try {
+ JSONArray array = JSON.parseArray(insuranceInfo);
+ if (array == null || array.isEmpty()) {
+ return null;
+ }
+ JSONObject last = array.getJSONObject(array.size() - 1);
+ if (last == null) {
+ return null;
+ }
+ Object dateValue = last.get("isInsuranceDate");
+ String dateStr = null;
+ if (dateValue instanceof JSONArray) {
+ JSONArray dateArray = (JSONArray) dateValue;
+ if (!dateArray.isEmpty()) {
+ dateStr = dateArray.getString(dateArray.size() - 1);
+ }
+ } else if (dateValue != null) {
+ dateStr = String.valueOf(dateValue);
+ }
+ if (StringUtil.isBlank(dateStr)) {
+ return null;
+ }
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ return format.parse(dateStr);
+ } catch (Exception ignored) {
+ return null;
+ }
+ }
+
+ private <T> List<T> parseList(R response, Class<T> clazz) {
+ if (response == null || !response.isSuccess() || response.getData() == null) {
+ return Collections.emptyList();
+ }
+ Object data = response.getData();
+ if (data instanceof String && StringUtil.isBlank((String) data)) {
+ return Collections.emptyList();
+ }
+ return JSON.parseArray(JSON.toJSONString(data), clazz);
+ }
}
--
Gitblit v1.9.3