You've already forked DataMate
init datamate
This commit is contained in:
501
frontend/src/mock/mock-seed/data-evaluation.cjs
Normal file
501
frontend/src/mock/mock-seed/data-evaluation.cjs
Normal file
@@ -0,0 +1,501 @@
|
||||
const Mock = require("mockjs");
|
||||
const API = require("../mock-apis.cjs");
|
||||
|
||||
// 质量指标枚举
|
||||
const QualityMetrics = [
|
||||
"COMPLETENESS",
|
||||
"ACCURACY",
|
||||
"CONSISTENCY",
|
||||
"VALIDITY",
|
||||
"UNIQUENESS",
|
||||
"TIMELINESS"
|
||||
];
|
||||
|
||||
// 适配性标准枚举
|
||||
const CompatibilityCriteria = [
|
||||
"FORMAT_COMPATIBILITY",
|
||||
"SCHEMA_COMPATIBILITY",
|
||||
"SIZE_ADEQUACY",
|
||||
"DISTRIBUTION_MATCH",
|
||||
"FEATURE_COVERAGE"
|
||||
];
|
||||
|
||||
// 价值标准枚举
|
||||
const ValueCriteria = [
|
||||
"RARITY",
|
||||
"DEMAND",
|
||||
"QUALITY",
|
||||
"COMPLETENESS",
|
||||
"TIMELINESS",
|
||||
"STRATEGIC_IMPORTANCE"
|
||||
];
|
||||
|
||||
// 评估类型枚举
|
||||
const EvaluationTypes = ["QUALITY", "COMPATIBILITY", "VALUE", "COMPREHENSIVE"];
|
||||
|
||||
// 评估状态枚举
|
||||
const EvaluationStatuses = ["PENDING", "RUNNING", "COMPLETED", "FAILED"];
|
||||
|
||||
// 生成质量评估结果
|
||||
function qualityEvaluationItem() {
|
||||
return {
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
datasetId: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
status: Mock.Random.pick(EvaluationStatuses),
|
||||
overallScore: Mock.Random.float(0.6, 1.0, 2, 2),
|
||||
metrics: Mock.Random.shuffle(QualityMetrics).slice(0, Mock.Random.integer(3, 5)).map(metric => ({
|
||||
metric,
|
||||
score: Mock.Random.float(0.5, 1.0, 2, 2),
|
||||
details: {
|
||||
totalRecords: Mock.Random.integer(1000, 100000),
|
||||
validRecords: Mock.Random.integer(800, 95000),
|
||||
issues: Mock.Random.integer(0, 50)
|
||||
},
|
||||
issues: new Array(Mock.Random.integer(0, 3)).fill(null).map(() => ({
|
||||
type: Mock.Random.pick(["MISSING_VALUE", "INVALID_FORMAT", "DUPLICATE", "OUTLIER"]),
|
||||
severity: Mock.Random.pick(["LOW", "MEDIUM", "HIGH", "CRITICAL"]),
|
||||
description: Mock.Random.csentence(5, 15),
|
||||
affectedRecords: Mock.Random.integer(1, 1000),
|
||||
suggestions: [Mock.Random.csentence(5, 20)]
|
||||
}))
|
||||
})),
|
||||
recommendations: new Array(Mock.Random.integer(2, 5)).fill(null).map(() =>
|
||||
Mock.Random.csentence(10, 30)
|
||||
),
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
detailedResults: {
|
||||
fieldAnalysis: new Array(Mock.Random.integer(3, 8)).fill(null).map(() => ({
|
||||
fieldName: Mock.Random.word(5, 10),
|
||||
dataType: Mock.Random.pick(["STRING", "INTEGER", "FLOAT", "BOOLEAN", "DATE"]),
|
||||
nullCount: Mock.Random.integer(0, 100),
|
||||
uniqueCount: Mock.Random.integer(100, 1000),
|
||||
statistics: {
|
||||
mean: Mock.Random.float(0, 100, 2, 2),
|
||||
median: Mock.Random.float(0, 100, 2, 2),
|
||||
stdDev: Mock.Random.float(0, 50, 2, 2)
|
||||
}
|
||||
})),
|
||||
distributionAnalysis: {
|
||||
distributions: new Array(3).fill(null).map(() => ({
|
||||
field: Mock.Random.word(5, 10),
|
||||
type: Mock.Random.pick(["NORMAL", "UNIFORM", "SKEWED"]),
|
||||
parameters: {}
|
||||
})),
|
||||
outliers: new Array(Mock.Random.integer(0, 5)).fill(null).map(() => ({
|
||||
field: Mock.Random.word(5, 10),
|
||||
value: Mock.Random.float(-100, 100, 2, 2),
|
||||
zScore: Mock.Random.float(-3, 3, 2, 2)
|
||||
})),
|
||||
patterns: [
|
||||
"数据分布较为均匀",
|
||||
"存在少量异常值",
|
||||
"部分字段相关性较强"
|
||||
]
|
||||
},
|
||||
correlationAnalysis: {
|
||||
correlationMatrix: new Array(5).fill(null).map(() =>
|
||||
new Array(5).fill(null).map(() => Mock.Random.float(-1, 1, 2, 2))
|
||||
),
|
||||
significantCorrelations: new Array(Mock.Random.integer(1, 3)).fill(null).map(() => ({
|
||||
field1: Mock.Random.word(5, 10),
|
||||
field2: Mock.Random.word(5, 10),
|
||||
correlation: Mock.Random.float(0.5, 1, 2, 2),
|
||||
pValue: Mock.Random.float(0, 0.05, 3, 3)
|
||||
}))
|
||||
}
|
||||
},
|
||||
visualizations: new Array(Mock.Random.integer(2, 4)).fill(null).map(() => ({
|
||||
type: Mock.Random.pick(["CHART", "GRAPH", "HISTOGRAM", "HEATMAP"]),
|
||||
title: Mock.Random.ctitle(5, 15),
|
||||
data: {
|
||||
labels: new Array(5).fill(null).map(() => Mock.Random.word(3, 8)),
|
||||
values: new Array(5).fill(null).map(() => Mock.Random.integer(0, 100))
|
||||
},
|
||||
config: {
|
||||
width: 400,
|
||||
height: 300,
|
||||
color: Mock.Random.color()
|
||||
}
|
||||
}))
|
||||
};
|
||||
}
|
||||
|
||||
// 生成适配性评估结果
|
||||
function compatibilityEvaluationItem() {
|
||||
return {
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
datasetId: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
targetType: Mock.Random.pick(["LANGUAGE_MODEL", "CLASSIFICATION_MODEL", "RECOMMENDATION_SYSTEM", "CUSTOM_TASK"]),
|
||||
compatibilityScore: Mock.Random.float(0.6, 1.0, 2, 2),
|
||||
results: Mock.Random.shuffle(CompatibilityCriteria).slice(0, Mock.Random.integer(3, 5)).map(criterion => ({
|
||||
criterion,
|
||||
score: Mock.Random.float(0.5, 1.0, 2, 2),
|
||||
status: Mock.Random.pick(["PASS", "WARN", "FAIL"]),
|
||||
details: Mock.Random.csentence(10, 30)
|
||||
})),
|
||||
suggestions: new Array(Mock.Random.integer(2, 4)).fill(null).map(() =>
|
||||
Mock.Random.csentence(10, 25)
|
||||
),
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss")
|
||||
};
|
||||
}
|
||||
|
||||
// 生成价值评估结果
|
||||
function valueEvaluationItem() {
|
||||
return {
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
datasetId: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
valueScore: Mock.Random.float(0.6, 1.0, 2, 2),
|
||||
monetaryValue: Mock.Random.float(10000, 1000000, 2, 2),
|
||||
strategicValue: Mock.Random.float(0.6, 1.0, 2, 2),
|
||||
results: Mock.Random.shuffle(ValueCriteria).slice(0, Mock.Random.integer(3, 5)).map(criterion => ({
|
||||
criterion,
|
||||
score: Mock.Random.float(0.5, 1.0, 2, 2),
|
||||
impact: Mock.Random.pick(["LOW", "MEDIUM", "HIGH"]),
|
||||
explanation: Mock.Random.csentence(10, 30)
|
||||
})),
|
||||
insights: new Array(Mock.Random.integer(3, 6)).fill(null).map(() =>
|
||||
Mock.Random.csentence(15, 40)
|
||||
),
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss")
|
||||
};
|
||||
}
|
||||
|
||||
// 生成评估报告
|
||||
function evaluationReportItem() {
|
||||
const type = Mock.Random.pick(EvaluationTypes);
|
||||
return {
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
datasetId: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
datasetName: Mock.Random.ctitle(5, 15),
|
||||
type,
|
||||
status: Mock.Random.pick(EvaluationStatuses),
|
||||
overallScore: Mock.Random.float(0.6, 1.0, 2, 2),
|
||||
summary: Mock.Random.csentence(20, 50),
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
completedAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
qualityResults: type === "QUALITY" || type === "COMPREHENSIVE" ? qualityEvaluationItem() : null,
|
||||
compatibilityResults: type === "COMPATIBILITY" || type === "COMPREHENSIVE" ? compatibilityEvaluationItem() : null,
|
||||
valueResults: type === "VALUE" || type === "COMPREHENSIVE" ? valueEvaluationItem() : null,
|
||||
attachments: new Array(Mock.Random.integer(1, 3)).fill(null).map(() => ({
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
name: Mock.Random.word(5, 10) + "." + Mock.Random.pick(["pdf", "xlsx", "json"]),
|
||||
type: Mock.Random.pick(["PDF", "EXCEL", "JSON"]),
|
||||
size: Mock.Random.integer(1024, 1024 * 1024),
|
||||
downloadUrl: "/api/v1/evaluation/attachments/" + Mock.Random.guid()
|
||||
}))
|
||||
};
|
||||
}
|
||||
|
||||
const qualityEvaluationList = new Array(30).fill(null).map(qualityEvaluationItem);
|
||||
const compatibilityEvaluationList = new Array(20).fill(null).map(compatibilityEvaluationItem);
|
||||
const valueEvaluationList = new Array(25).fill(null).map(valueEvaluationItem);
|
||||
const evaluationReportList = new Array(50).fill(null).map(evaluationReportItem);
|
||||
|
||||
module.exports = function (router) {
|
||||
// 数据质量评估
|
||||
router.post(API.evaluateDataQualityUsingPost, (req, res) => {
|
||||
const { datasetId, metrics, sampleSize, parameters } = req.body;
|
||||
|
||||
const newEvaluation = {
|
||||
...qualityEvaluationItem(),
|
||||
datasetId,
|
||||
status: "RUNNING",
|
||||
metrics: metrics.map(metric => ({
|
||||
metric,
|
||||
score: Mock.Random.float(0.5, 1.0, 2, 2),
|
||||
details: {
|
||||
totalRecords: sampleSize || Mock.Random.integer(1000, 100000),
|
||||
validRecords: Mock.Random.integer(800, 95000),
|
||||
issues: Mock.Random.integer(0, 50)
|
||||
},
|
||||
issues: []
|
||||
})),
|
||||
createdAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
qualityEvaluationList.push(newEvaluation);
|
||||
|
||||
// 模拟异步处理,2秒后完成
|
||||
setTimeout(() => {
|
||||
newEvaluation.status = "COMPLETED";
|
||||
}, 2000);
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Quality evaluation started successfully",
|
||||
data: newEvaluation
|
||||
});
|
||||
});
|
||||
|
||||
// 获取质量评估结果
|
||||
router.get(API.getQualityEvaluationByIdUsingGet, (req, res) => {
|
||||
const { evaluationId } = req.params;
|
||||
const evaluation = qualityEvaluationList.find(e => e.id === evaluationId);
|
||||
|
||||
if (evaluation) {
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: evaluation
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Quality evaluation not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 适配性评估
|
||||
router.post(API.evaluateCompatibilityUsingPost, (req, res) => {
|
||||
const { datasetId, targetType, targetConfig, evaluationCriteria } = req.body;
|
||||
|
||||
const newEvaluation = {
|
||||
...compatibilityEvaluationItem(),
|
||||
datasetId,
|
||||
targetType,
|
||||
results: evaluationCriteria.map(criterion => ({
|
||||
criterion,
|
||||
score: Mock.Random.float(0.5, 1.0, 2, 2),
|
||||
status: Mock.Random.pick(["PASS", "WARN", "FAIL"]),
|
||||
details: Mock.Random.csentence(10, 30)
|
||||
})),
|
||||
createdAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
compatibilityEvaluationList.push(newEvaluation);
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Compatibility evaluation completed successfully",
|
||||
data: newEvaluation
|
||||
});
|
||||
});
|
||||
|
||||
// 价值评估
|
||||
router.post(API.evaluateValueUsingPost, (req, res) => {
|
||||
const { datasetId, valueCriteria, marketContext, businessContext } = req.body;
|
||||
|
||||
const newEvaluation = {
|
||||
...valueEvaluationItem(),
|
||||
datasetId,
|
||||
results: valueCriteria.map(criterion => ({
|
||||
criterion,
|
||||
score: Mock.Random.float(0.5, 1.0, 2, 2),
|
||||
impact: Mock.Random.pick(["LOW", "MEDIUM", "HIGH"]),
|
||||
explanation: Mock.Random.csentence(10, 30)
|
||||
})),
|
||||
createdAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
valueEvaluationList.push(newEvaluation);
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Value evaluation completed successfully",
|
||||
data: newEvaluation
|
||||
});
|
||||
});
|
||||
|
||||
// 获取评估报告列表
|
||||
router.get(API.queryEvaluationReportsUsingGet, (req, res) => {
|
||||
const { page = 0, size = 20, type, datasetId } = req.query;
|
||||
let filteredReports = evaluationReportList;
|
||||
|
||||
if (type) {
|
||||
filteredReports = filteredReports.filter(report => report.type === type);
|
||||
}
|
||||
|
||||
if (datasetId) {
|
||||
filteredReports = filteredReports.filter(report => report.datasetId === datasetId);
|
||||
}
|
||||
|
||||
const startIndex = page * size;
|
||||
const endIndex = startIndex + parseInt(size);
|
||||
const pageData = filteredReports.slice(startIndex, endIndex);
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: {
|
||||
content: pageData,
|
||||
totalElements: filteredReports.length,
|
||||
totalPages: Math.ceil(filteredReports.length / size),
|
||||
size: parseInt(size),
|
||||
number: parseInt(page)
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 获取评估报告详情
|
||||
router.get(API.getEvaluationReportByIdUsingGet, (req, res) => {
|
||||
const { reportId } = req.params;
|
||||
const report = evaluationReportList.find(r => r.id === reportId);
|
||||
|
||||
if (report) {
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: report
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Evaluation report not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 导出评估报告
|
||||
router.get(API.exportEvaluationReportUsingGet, (req, res) => {
|
||||
const { reportId } = req.params;
|
||||
const { format = "PDF" } = req.query;
|
||||
const report = evaluationReportList.find(r => r.id === reportId);
|
||||
|
||||
if (report) {
|
||||
const fileName = `evaluation_report_${reportId}.${format.toLowerCase()}`;
|
||||
|
||||
res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
|
||||
res.setHeader('Content-Type', 'application/octet-stream');
|
||||
res.send(`Mock ${format} content for evaluation report ${reportId}`);
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Evaluation report not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 批量评估
|
||||
router.post(API.batchEvaluationUsingPost, (req, res) => {
|
||||
const { datasetIds, evaluationTypes, parameters } = req.body;
|
||||
|
||||
const batchId = Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, "");
|
||||
const totalTasks = datasetIds.length * evaluationTypes.length;
|
||||
|
||||
// 为每个数据集和评估类型组合创建任务
|
||||
datasetIds.forEach(datasetId => {
|
||||
evaluationTypes.forEach(type => {
|
||||
const report = {
|
||||
...evaluationReportItem(),
|
||||
datasetId,
|
||||
type,
|
||||
status: "PENDING",
|
||||
batchId
|
||||
};
|
||||
evaluationReportList.push(report);
|
||||
|
||||
// 模拟异步处理
|
||||
setTimeout(() => {
|
||||
report.status = "COMPLETED";
|
||||
}, Mock.Random.integer(3000, 10000));
|
||||
});
|
||||
});
|
||||
|
||||
res.status(202).send({
|
||||
code: "0",
|
||||
msg: "Batch evaluation submitted successfully",
|
||||
data: {
|
||||
batchId,
|
||||
status: "SUBMITTED",
|
||||
totalTasks,
|
||||
submittedAt: new Date().toISOString()
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 获取批量评估状态
|
||||
router.get("/api/v1/evaluation/batch/:batchId", (req, res) => {
|
||||
const { batchId } = req.params;
|
||||
const batchReports = evaluationReportList.filter(r => r.batchId === batchId);
|
||||
|
||||
const completedTasks = batchReports.filter(r => r.status === "COMPLETED").length;
|
||||
const runningTasks = batchReports.filter(r => r.status === "RUNNING").length;
|
||||
const pendingTasks = batchReports.filter(r => r.status === "PENDING").length;
|
||||
const failedTasks = batchReports.filter(r => r.status === "FAILED").length;
|
||||
|
||||
let overallStatus = "COMPLETED";
|
||||
if (runningTasks > 0 || pendingTasks > 0) {
|
||||
overallStatus = "RUNNING";
|
||||
} else if (failedTasks > 0) {
|
||||
overallStatus = "PARTIAL_FAILED";
|
||||
}
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: {
|
||||
batchId,
|
||||
status: overallStatus,
|
||||
totalTasks: batchReports.length,
|
||||
completedTasks,
|
||||
runningTasks,
|
||||
pendingTasks,
|
||||
failedTasks,
|
||||
progress: batchReports.length > 0 ? Math.round((completedTasks / batchReports.length) * 100) : 0,
|
||||
reports: batchReports
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 获取评估统计信息
|
||||
router.get("/api/v1/evaluation/statistics", (req, res) => {
|
||||
const { timeRange = "LAST_30_DAYS" } = req.query;
|
||||
|
||||
const statistics = {
|
||||
totalEvaluations: evaluationReportList.length,
|
||||
completedEvaluations: evaluationReportList.filter(r => r.status === "COMPLETED").length,
|
||||
runningEvaluations: evaluationReportList.filter(r => r.status === "RUNNING").length,
|
||||
failedEvaluations: evaluationReportList.filter(r => r.status === "FAILED").length,
|
||||
averageScore: Mock.Random.float(0.75, 0.95, 2, 2),
|
||||
evaluationTypeDistribution: {
|
||||
QUALITY: evaluationReportList.filter(r => r.type === "QUALITY").length,
|
||||
COMPATIBILITY: evaluationReportList.filter(r => r.type === "COMPATIBILITY").length,
|
||||
VALUE: evaluationReportList.filter(r => r.type === "VALUE").length,
|
||||
COMPREHENSIVE: evaluationReportList.filter(r => r.type === "COMPREHENSIVE").length
|
||||
},
|
||||
scoreDistribution: {
|
||||
excellent: evaluationReportList.filter(r => r.overallScore >= 0.9).length,
|
||||
good: evaluationReportList.filter(r => r.overallScore >= 0.8 && r.overallScore < 0.9).length,
|
||||
fair: evaluationReportList.filter(r => r.overallScore >= 0.6 && r.overallScore < 0.8).length,
|
||||
poor: evaluationReportList.filter(r => r.overallScore < 0.6).length
|
||||
},
|
||||
trends: new Array(30).fill(null).map((_, index) => ({
|
||||
date: Mock.Random.date("yyyy-MM-dd"),
|
||||
evaluations: Mock.Random.integer(5, 50),
|
||||
averageScore: Mock.Random.float(0.7, 0.95, 2, 2)
|
||||
}))
|
||||
};
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: statistics
|
||||
});
|
||||
});
|
||||
|
||||
// 删除评估报告
|
||||
router.delete("/api/v1/evaluation/reports/:reportId", (req, res) => {
|
||||
const { reportId } = req.params;
|
||||
const index = evaluationReportList.findIndex(r => r.id === reportId);
|
||||
|
||||
if (index !== -1) {
|
||||
evaluationReportList.splice(index, 1);
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Evaluation report deleted successfully",
|
||||
data: null
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Evaluation report not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user