Merge remote-tracking branch 'origin/main'

This commit is contained in:
gyb 2026-02-11 13:35:24 +08:00
commit 16d52f13af
10 changed files with 433 additions and 3 deletions

View File

@ -0,0 +1,153 @@
#!/bin/bash
# ============================================================
# 清理没有关联机场的大疆无人机
# ============================================================
set -e
echo "=========================================="
echo "清理没有关联机场的大疆无人机"
echo "=========================================="
# 数据库配置
DB_CONTAINER="ruoyi-mysql"
DB_USER="root"
DB_PASSWORD="password"
DB_NAME="ry-cloud"
echo ""
echo "第一步:查询所有大疆无人机(用于确认)"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn
FROM device_aircraft a
LEFT JOIN device_device d ON a.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang'
ORDER BY a.aircraft_id;
"
echo ""
echo "第二步:查询没有关联机场的大疆无人机"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn,
d.iot_device_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
ORDER BY a.aircraft_id;
"
echo ""
echo "=========================================="
echo "即将删除以上无人机记录"
echo "请确认是否继续?(y/n)"
read -r confirm
if [[ ! $confirm =~ ^[Yy]$ ]]; then
echo "操作已取消"
exit 0
fi
echo ""
echo "第三步:删除无人机挂载关联表中的记录"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
DELETE FROM device_aircraft_payload
WHERE aircraft_id IN (
SELECT a.aircraft_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
);
"
echo "无人机挂载关联记录删除完成"
echo ""
echo "第四步:删除机场无人机关联表中的记录"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
DELETE FROM device_dock_aircraft
WHERE aircraft_id IN (
SELECT a.aircraft_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
);
"
echo "机场无人机关联记录删除完成"
echo ""
echo "第五步:删除无人机表中的记录"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
DELETE FROM device_aircraft
WHERE aircraft_id IN (
SELECT temp.aircraft_id
FROM (
SELECT a.aircraft_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
) AS temp
);
"
echo "无人机记录删除完成"
echo ""
echo "第六步:验证删除结果"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang'
ORDER BY a.aircraft_id;
"
echo ""
echo "统计验证:"
echo "=========================================="
docker exec ${DB_CONTAINER} mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e "
SELECT
'大疆无人机总数' AS statistic_name,
COUNT(*) AS count
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang'
UNION ALL
SELECT
'大疆机场总数' AS statistic_name,
COUNT(*) AS count
FROM device_dock dock
INNER JOIN device_device d ON dock.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang';
"
echo ""
echo "=========================================="
echo "清理完成"
echo "=========================================="

View File

@ -0,0 +1,114 @@
-- ============================================================
-- 清理没有关联机场的大疆无人机
-- ============================================================
-- 问题大疆的机场是7个无人机是10个有3个无人机没有关联机场
-- 解决方案:删除没有关联机场的大疆无人机记录
-- ============================================================
-- 第一步:查询所有大疆厂商的无人机(用于确认)
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn
FROM device_aircraft a
LEFT JOIN device_device d ON a.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang'
ORDER BY a.aircraft_id;
-- 第二步:查询没有关联机场的大疆无人机
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn,
d.iot_device_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
ORDER BY a.aircraft_id;
-- 第三步:确认删除前,再次检查(谨慎操作)
-- 执行此查询后,请确认这些无人机确实需要删除
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn,
d.iot_device_id,
'将被删除' AS action
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL;
-- 第四步:删除没有关联机场的大疆无人机(谨慎操作!)
-- 删除顺序:
-- 1. 先删除无人机挂载关联表中的记录
-- 2. 再删除机场无人机关联表中的记录
-- 3. 最后删除无人机表中的记录
-- 4.1 删除无人机挂载关联表中的记录
DELETE FROM device_aircraft_payload
WHERE aircraft_id IN (
SELECT a.aircraft_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
);
-- 4.2 删除机场无人机关联表中的记录(如果有)
DELETE FROM device_dock_aircraft
WHERE aircraft_id IN (
SELECT a.aircraft_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
);
-- 4.3 删除无人机表中的记录
DELETE FROM device_aircraft
WHERE aircraft_id IN (
SELECT temp.aircraft_id
FROM (
SELECT a.aircraft_id
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
LEFT JOIN device_dock_aircraft da ON a.aircraft_id = da.aircraft_id
WHERE d.device_manufacturer = 'dajiang'
AND da.id IS NULL
) AS temp
);
-- 第五步:验证删除结果
SELECT
a.aircraft_id,
a.aircraft_name,
d.device_manufacturer,
d.device_sn
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang'
ORDER BY a.aircraft_id;
-- 统计验证
SELECT
'大疆无人机总数' AS statistic_name,
COUNT(*) AS count
FROM device_aircraft a
INNER JOIN device_device d ON a.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang'
UNION ALL
SELECT
'大疆机场总数' AS statistic_name,
COUNT(*) AS count
FROM device_dock dock
INNER JOIN device_device d ON dock.device_id = d.device_id
WHERE d.device_manufacturer = 'dajiang';

@ -1 +1 @@
Subproject commit 00f27970aa34f76cdc7cf8673d9809b14fd00a93
Subproject commit 0a0b9741cca600b27b6ab15905f02ae3d71e29e2

View File

@ -46,6 +46,11 @@ http {
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://ruoyi-gateway:8080/;
# 支持长时间命令执行
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
location /minio/ {

View File

@ -27,6 +27,11 @@ http {
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://ruoyi-gateway:8080/;
# 支持长时间命令执行
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# 避免actuator暴露

@ -1 +1 @@
Subproject commit 4a53df8fb148690175918557131e01729bca871d
Subproject commit 6f0ac0c588c9a1711ddbe833c638206eed4bb3c4

View File

@ -7,6 +7,7 @@ import com.ruoyi.device.api.domain.DroneCurrentStatusVO;
import com.ruoyi.device.api.domain.DroneFlightControlRequest;
import com.ruoyi.device.api.domain.DroneRealtimeInfoVO;
import com.ruoyi.device.api.domain.DroneTakeoffResponseVO;
import com.ruoyi.device.api.domain.MachineStateVO;
import com.ruoyi.device.api.factory.RemoteAircraftFlyFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@ -59,4 +60,31 @@ public interface RemoteAircraftFlyService
*/
@PostMapping("/drone/takeoff/{dockId}")
R<DroneTakeoffResponseVO> takeoff(@PathVariable("dockId") Long dockId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 无人机开机接口
*
* @param sn 机场SN号
* @return 开机响应
*/
@PostMapping("/drone/power-on/{sn}")
R<String> powerOn(@PathVariable("sn") String sn);
/**
* 无人机关机接口
*
* @param sn 机场SN号
* @return 关机响应
*/
@PostMapping("/drone/power-off/{sn}")
R<String> powerOff(@PathVariable("sn") String sn);
/**
* 查询设备状态
*
* @param sn 设备SN号
* @return 设备状态信息
*/
@GetMapping("/drone/machine-state/{sn}")
R<MachineStateVO> getMachineState(@PathVariable("sn") String sn);
}

View File

@ -0,0 +1,106 @@
package com.ruoyi.device.api.domain;
import java.io.Serializable;
/**
* 设备状态视图对象
* API VO用于前后端数据交互
*
* @author ruoyi
* @date 2026-02-10
*/
public class MachineStateVO implements Serializable
{
private static final long serialVersionUID = 1L;
/** 设备SN号 */
private String sn;
/** 无人机状态 */
private String droneState;
/** 机场状态 */
private String airportState;
/** 舱门状态 */
private String coverState;
/** DRC状态 */
private String drcState;
/** 调试模式状态 */
private String debugModeState;
public String getSn()
{
return sn;
}
public void setSn(String sn)
{
this.sn = sn;
}
public String getDroneState()
{
return droneState;
}
public void setDroneState(String droneState)
{
this.droneState = droneState;
}
public String getAirportState()
{
return airportState;
}
public void setAirportState(String airportState)
{
this.airportState = airportState;
}
public String getCoverState()
{
return coverState;
}
public void setCoverState(String coverState)
{
this.coverState = coverState;
}
public String getDrcState()
{
return drcState;
}
public void setDrcState(String drcState)
{
this.drcState = drcState;
}
public String getDebugModeState()
{
return debugModeState;
}
public void setDebugModeState(String debugModeState)
{
this.debugModeState = debugModeState;
}
@Override
public String toString()
{
return "MachineStateVO{" +
"sn='" + sn + '\'' +
", droneState='" + droneState + '\'' +
", airportState='" + airportState + '\'' +
", coverState='" + coverState + '\'' +
", drcState='" + drcState + '\'' +
", debugModeState='" + debugModeState + '\'' +
'}';
}
}

View File

@ -6,6 +6,7 @@ import com.ruoyi.device.api.domain.DroneCurrentStatusVO;
import com.ruoyi.device.api.domain.DroneFlightControlRequest;
import com.ruoyi.device.api.domain.DroneRealtimeInfoVO;
import com.ruoyi.device.api.domain.DroneTakeoffResponseVO;
import com.ruoyi.device.api.domain.MachineStateVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@ -51,6 +52,24 @@ public class RemoteAircraftFlyFallbackFactory implements FallbackFactory<RemoteA
{
return R.fail("无人机起飞失败:" + throwable.getMessage());
}
@Override
public R<String> powerOn(String sn)
{
return R.fail("无人机开机失败:" + throwable.getMessage());
}
@Override
public R<String> powerOff(String sn)
{
return R.fail("无人机关机失败:" + throwable.getMessage());
}
@Override
public R<MachineStateVO> getMachineState(String sn)
{
return R.fail("查询设备状态失败:" + throwable.getMessage());
}
};
}
}

@ -1 +1 @@
Subproject commit 82b63271b71dea00924875ca3f2bd861ac0c8b88
Subproject commit 42e6643b52f62acfdd7c002bbe3b7e809179c861