This commit is contained in:
parent
a97844dec1
commit
6ae48aee54
|
|
@ -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 "=========================================="
|
||||
|
|
@ -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';
|
||||
2
a_th_web
2
a_th_web
|
|
@ -1 +1 @@
|
|||
Subproject commit 00f27970aa34f76cdc7cf8673d9809b14fd00a93
|
||||
Subproject commit 0a0b9741cca600b27b6ab15905f02ae3d71e29e2
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 4a53df8fb148690175918557131e01729bca871d
|
||||
Subproject commit 6f0ac0c588c9a1711ddbe833c638206eed4bb3c4
|
||||
|
|
@ -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,22 @@ 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 设备状态信息
|
||||
*/
|
||||
@GetMapping("/drone/machine-state/{sn}")
|
||||
R<MachineStateVO> getMachineState(@PathVariable("sn") String sn);
|
||||
}
|
||||
|
|
@ -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 + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -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,18 @@ 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<MachineStateVO> getMachineState(String sn)
|
||||
{
|
||||
return R.fail("查询设备状态失败:" + throwable.getMessage());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 82b63271b71dea00924875ca3f2bd861ac0c8b88
|
||||
Subproject commit 2de46a69c31841efcff8f930457dd21e2878d9b0
|
||||
Loading…
Reference in New Issue