feat: 数据治理 — 入库约束+元数据卡片+编码清洗+审计看板

This commit is contained in:
Hermes CI Fix
2026-07-22 12:06:52 +08:00
parent ec6af751a5
commit 748c2da43f
8 changed files with 452 additions and 2 deletions
+39
View File
@@ -79,6 +79,37 @@
</el-row>
<el-form-item><el-button type="primary" @click="save">保存</el-button></el-form-item>
</el-form>
<!-- 元数据卡片 -->
<el-card shadow="never" style="margin-top:16px;">
<template #header>
<div style="display:flex;align-items:center;gap:8px;">
<span>📋 元数据卡片</span>
<el-tag v-if="!metadataComplete" type="warning" size="small" effect="dark"> 元数据不完整</el-tag>
<el-tag v-else type="success" size="small" effect="dark"> 完整</el-tag>
</div>
</template>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="计算公式" :span="2">
<span v-if="kpi.formula" style="font-family:monospace;">{{ kpi.formula }}</span>
<el-tag v-else type="warning" size="small">缺失</el-tag>
</el-descriptions-item>
<el-descriptions-item label="数据来源">
<span v-if="kpi.data_source && kpi.data_source !== '待补充'">{{ kpi.data_source }}</span>
<el-tag v-else type="warning" size="small">{{ kpi.data_source || '缺失' }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="数据责任人">
<span v-if="kpi.data_owner && kpi.data_owner !== '待指定'">{{ kpi.data_owner }}</span>
<el-tag v-else type="warning" size="small">{{ kpi.data_owner || '缺失' }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="单位">{{ kpi.unit || '-' }}</el-descriptions-item>
<el-descriptions-item label="目标值">{{ kpi.target_value ?? '-' }}</el-descriptions-item>
<el-descriptions-item label="数据源类型">{{ kpi.data_source_type || '-' }}</el-descriptions-item>
<el-descriptions-item label="维度">{{ dimLabel(kpi.dimension) }}</el-descriptions-item>
<el-descriptions-item label="频率">{{ kpi.frequency || '-' }}</el-descriptions-item>
<el-descriptions-item label="类别" :span="2">{{ catLabel(kpi.category) || '-' }}</el-descriptions-item>
</el-descriptions>
</el-card>
</el-tab-pane>
<el-tab-pane label="历史数据" name="history">
@@ -354,6 +385,14 @@ function dimLabel(d: string) { return ({ finance: '财务', customer: '客户',
function catLabel(c: string) { return CAT_MAP[c] || c }
function dimTagType(d: string) { return ({ finance: '', customer: 'success', process: 'warning', learning: 'info' } as any)[d] || '' }
const metadataComplete = computed(() => {
if (!kpi.value) return false
const k = kpi.value
return !!(k.formula && k.formula.trim() && k.data_source && k.data_source.trim() && k.data_source !== '待补充'
&& k.data_owner && k.data_owner.trim() && k.data_owner !== '待指定'
&& k.unit && k.unit.trim() && k.target_value !== null && k.target_value !== undefined)
})
const chartOption = computed(() => ({
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', data: values.value.map(v => v.period) },