新增数据清洗功能

This commit is contained in:
JIANG
2025-11-05 15:33:04 +08:00
parent c8caba1453
commit bf067aa8eb
2 changed files with 205 additions and 22 deletions

View File

@@ -48,6 +48,9 @@ import {
} from "@mui/icons-material";
import { FixedSizeList } from "react-window";
import { useNotification } from "@refinedev/core";
import axios from "axios";
import { useGetIdentity } from "@refinedev/core";
import config, { NETWORK_NAME } from "@/config/config";
import { useMap } from "@app/OlMap/MapComponent";
import { GeoJSON } from "ol/format";
@@ -59,7 +62,6 @@ import Feature from "ol/Feature";
import { Point } from "ol/geom";
import { getVectorContext } from "ol/render";
import { unByKey } from "ol/Observable";
import config from "@/config/config";
import dayjs, { Dayjs } from "dayjs";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import { DateTimePicker, LocalizationProvider } from "@mui/x-date-pickers";
@@ -98,6 +100,11 @@ interface SCADADeviceListProps {
onCleanAllData?: (from: Date, to: Date) => void;
}
type IUser = {
id: number;
name: string;
};
const SCADADeviceList: React.FC<SCADADeviceListProps> = ({
devices = [],
onDeviceClick,
@@ -154,6 +161,7 @@ const SCADADeviceList: React.FC<SCADADeviceListProps> = ({
const map = useMap(); // 移到此处,确保在条件检查前调用
const { open } = useNotification();
const { data: user } = useGetIdentity<IUser>();
useEffect(() => {
if (selectedDeviceIds) {
@@ -566,18 +574,82 @@ const SCADADeviceList: React.FC<SCADADeviceListProps> = ({
);
// 确认清洗
const handleConfirmClean = useCallback(() => {
const handleConfirmClean = useCallback(async () => {
const error = validateTimeRange(cleanStartTime, cleanEndTime);
if (error) {
setTimeRangeError(error);
return;
}
onCleanAllData?.(cleanStartTime.toDate(), cleanEndTime.toDate());
// 获取所有设备ID
const allDeviceIds = internalDevices.map((d) => d.id);
if (allDeviceIds.length === 0) {
open?.({
type: "error",
message: "无设备可清洗",
});
return;
}
if (!user || !user.name) {
open?.({
type: "error",
message: "用户信息无效,请重新登录",
});
return;
}
try {
const startTime = dayjs(cleanStartTime).format("YYYY-MM-DD HH:mm:ss");
const endTime = dayjs(cleanEndTime).format("YYYY-MM-DD HH:mm:ss");
// 调用后端清洗接口
const response = await axios.post(
`${config.backendUrl}/scadadevicedatacleaning/`,
null,
{
params: {
network: NETWORK_NAME,
ids_list: allDeviceIds.join(","), // 将数组转为逗号分隔字符串
start_time: startTime,
end_time: endTime,
user_name: user.name,
},
}
);
console.log("[SCADADeviceList] 全部清洗响应:", response.data);
// 处理成功响应
if (response.data === "success" || response.data?.success === true) {
open?.({
type: "success",
message: "全部数据清洗成功",
description: `已完成 ${allDeviceIds.length} 个设备的数据清洗`,
});
// 如果父组件提供了回调,也调用它
onCleanAllData?.(cleanStartTime.toDate(), cleanEndTime.toDate());
} else {
throw new Error(response.data?.message || "清洗失败");
}
} catch (err: any) {
console.error("[SCADADeviceList] 数据清洗失败:", err);
open?.({
type: "error",
message: "数据清洗失败",
description: err.response?.data?.message || err.message || "未知错误",
});
}
handleCleanDialogClose();
}, [
cleanStartTime,
cleanEndTime,
validateTimeRange,
internalDevices,
user,
open,
onCleanAllData,
handleCleanDialogClose,
]);