2025-08-20 11:54:40 +01:00

153 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {modals} from "@mantine/modals";
import {Button, Group, Stack, Text} from "@mantine/core";
import {showInfoMessage} from "~/utils/utils.ts";
import type {PerformanceGetListData} from "~/utils/models.ts";
export function confirmExportData(exportObject: PerformanceGetListData[], fileName: string) {
const onClickExportJson = (download: boolean) => {
const dataStr = JSON.stringify(exportObject, null, 4)
const blob = new Blob([dataStr], { type: 'application/json' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
if (download) {
a.download = `${fileName}_${Date.now()}.json`
}
else {
a.target = '_blank'
}
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
URL.revokeObjectURL(url)
showInfoMessage("Data exported successfully", "Export Data")
modals.closeAll()
}
const onClickExportCsv = () => {
const csvData = exportObject.map(item => {
// 处理 grpc 数据,去掉 response_data展开 networking_size
const grpcData = { ...item.grpc };
delete grpcData.response_data;
const grpcFlattened = {
...grpcData,
networking_size_request_size: grpcData.networking_size?.request_size || 0,
networking_size_response_size: grpcData.networking_size?.response_size || 0
};
// @ts-ignore
delete grpcFlattened.networking_size;
const restData = { ...item.rest };
delete restData.response_data;
const restFlattened = {
...restData,
networking_size_request_size: restData.networking_size?.request_size || 0,
networking_size_response_size: restData.networking_size?.response_size || 0
};
// @ts-ignore
delete restFlattened.networking_size;
// 组合最终的行数据
return {
idx: item.idx,
request_count: item.request_count,
grpc_client_networking_ping: grpcFlattened.client_networking_ping,
grpc_client_request_cpu: grpcFlattened.client_request_cpu,
grpc_client_request_time: grpcFlattened.client_request_time,
grpc_server_deserialize_cpu: grpcFlattened.server_deserialize_cpu,
grpc_server_deserialize_time: grpcFlattened.server_deserialize_time,
grpc_server_serialize_cpu: grpcFlattened.server_serialize_cpu,
grpc_server_serialize_time: grpcFlattened.server_serialize_time,
grpc_server_protocol_total_time: grpcFlattened.server_protocol_total_time,
grpc_networking_size_request_size: grpcFlattened.networking_size_request_size,
grpc_networking_size_response_size: grpcFlattened.networking_size_response_size,
rest_client_networking_ping: restFlattened.client_networking_ping,
rest_client_request_cpu: restFlattened.client_request_cpu,
rest_client_request_time: restFlattened.client_request_time,
rest_server_deserialize_cpu: restFlattened.server_deserialize_cpu,
rest_server_deserialize_time: restFlattened.server_deserialize_time,
rest_server_serialize_cpu: restFlattened.server_serialize_cpu,
rest_server_serialize_time: restFlattened.server_serialize_time,
rest_server_protocol_total_time: restFlattened.server_protocol_total_time,
rest_networking_size_request_size: restFlattened.networking_size_request_size,
rest_networking_size_response_size: restFlattened.networking_size_response_size,
};
});
const headers = [
'idx',
'request_count',
'grpc_client_networking_ping',
'grpc_client_request_cpu',
'grpc_client_request_time',
'grpc_server_deserialize_cpu',
'grpc_server_deserialize_time',
'grpc_server_serialize_cpu',
'grpc_server_serialize_time',
'grpc_server_protocol_total_time',
'grpc_networking_size_request_size',
'grpc_networking_size_response_size',
'rest_client_networking_ping',
'rest_client_request_cpu',
'rest_client_request_time',
'rest_server_deserialize_cpu',
'rest_server_deserialize_time',
'rest_server_serialize_cpu',
'rest_server_serialize_time',
'rest_server_protocol_total_time',
'rest_networking_size_request_size',
'rest_networking_size_response_size'
];
// 生成 CSV 内容
const csvContent = [
headers.join(','),
...csvData.map(row =>
headers.map(header => {
return row[header as keyof typeof row];
}).join(',')
)
].join('\n');
const BOM = '\uFEFF';
const csvWithBOM = BOM + csvContent;
const blob = new Blob([csvWithBOM], { type: 'text/csv;charset=utf-8' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${fileName}_${Date.now()}.csv`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
showInfoMessage("Data exported successfully", "Export Data");
modals.closeAll();
};
modals.open({
title: "Export Performance Test Data",
centered: true,
children: (
<Stack>
<Text>Export Performance Test Data</Text>
<Group>
<Button onClick={() => onClickExportJson(true)}>Download Json</Button>
<Button onClick={() => onClickExportJson(false)}>Preview Json</Button>
<Button onClick={() => onClickExportCsv()}>CSV</Button>
</Group>
<Group mt="md" justify="flex-end">
<Button onClick={() => modals.closeAll()}>Cancel</Button>
</Group>
</Stack>
)
})
}