428 lines
18 KiB
Vue
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.

<template>
<!-- Report Detail View -->
<div v-if="viewingReport" class="flex flex-col h-full bg-white">
<div class="p-6 border-b border-slate-200 flex items-center justify-between flex-none">
<div class="flex items-center">
<button
@click="closeReport"
class="mr-4 text-slate-400 hover:text-slate-600"
>
<ArrowLeft :size="20"/>
</button>
<h2 class="text-xl font-bold text-slate-900">
{{ reportTitle }}
</h2>
</div>
<button
@click="handleDownload"
class="flex items-center px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
>
<Download :size="16" class="mr-2" />
导出 PDF
</button>
</div>
<div class="flex-1 overflow-y-auto p-8 bg-slate-50">
<div class="max-w-4xl mx-auto bg-white rounded-lg shadow-sm border border-slate-200 p-8">
<!-- Summary Report -->
<template v-if="viewingReport === 'summary'">
<div class="space-y-6">
<div>
<h3 class="text-2xl font-bold text-slate-900 mb-4">项目概述</h3>
<p class="text-slate-700 leading-relaxed">
本次数据资产盘点项目已完成对企业数据资产的全面梳理和评估通过 AI 智能识别技术
系统自动识别了核心数据表结构PII 敏感信息标识重要数据特征等关键信息
</p>
</div>
<div>
<h3 class="text-xl font-bold text-slate-900 mb-3">盘点成果</h3>
<ul class="space-y-2 text-slate-700">
<li class="flex items-start">
<span class="text-blue-600 mr-2"></span>
<span>识别核心数据表 <strong>4 </strong>包含 <strong>2,400 +</strong> 条记录</span>
</li>
<li class="flex items-start">
<span class="text-blue-600 mr-2"></span>
<span>识别 PII 敏感信息 <strong>3 </strong>手机号身份证收货地址</span>
</li>
<li class="flex items-start">
<span class="text-blue-600 mr-2"></span>
<span>识别重要数据 <strong>1 </strong>门店测绘地理信息</span>
</li>
<li class="flex items-start">
<span class="text-blue-600 mr-2"></span>
<span>生成潜在数据应用场景 <strong>{{ selectedScenarios.length }} </strong></span>
</li>
</ul>
</div>
<div>
<h3 class="text-xl font-bold text-slate-900 mb-3">下一步建议</h3>
<p class="text-slate-700 leading-relaxed">
建议企业基于本次盘点结果优先推进高价值潜力的数据应用场景同时加强数据合规管理
建立完善的数据资产管理制度
</p>
</div>
</div>
</template>
<!-- Inventory Report -->
<template v-else-if="viewingReport === 'inventory' && viewingInventoryId">
<div class="space-y-6">
<div>
<h3 class="text-2xl font-bold text-slate-900 mb-4">数据资产目录</h3>
<p class="text-slate-600 mb-6">以下为该场景相关的数据资产清单</p>
</div>
<div class="border border-slate-200 rounded-lg p-6">
<div class="flex items-center justify-between mb-4">
<h4 class="text-lg font-bold text-slate-900">{{ currentScenario?.name }}</h4>
<span class="px-3 py-1 bg-blue-100 text-blue-700 text-xs font-bold rounded-full">
{{ currentScenario?.type }}
</span>
</div>
<p class="text-slate-600 mb-4">{{ currentScenario?.desc }}</p>
<div>
<p class="text-sm font-bold text-slate-700 mb-2">核心数据支撑</p>
<div class="flex flex-wrap gap-2">
<span
v-for="(dep, i) in currentScenario?.dependencies"
:key="i"
class="px-2 py-1 bg-slate-100 text-slate-700 text-xs rounded border border-slate-200"
>
{{ dep }}
</span>
</div>
</div>
</div>
</div>
</template>
<!-- Legacy Optimization Report -->
<template v-else-if="viewingReport === 'legacy-optimization'">
<div class="space-y-6">
<div>
<h3 class="text-2xl font-bold text-slate-900 mb-4">存量数据应用场景优化建议</h3>
<p class="text-slate-600 mb-6">
基于 Step 3 填写的存量场景及截图AI 识别出以下改进点
</p>
</div>
<div class="space-y-6">
<div
v-for="item in legacyOptimizationData"
:key="item.id"
class="border border-slate-200 rounded-lg p-6"
>
<div class="flex items-center justify-between mb-4">
<h4 class="text-xl font-bold text-slate-900">{{ item.title }}</h4>
<span :class="[
'px-3 py-1 rounded text-xs font-bold',
item.impact === '高' ? 'bg-amber-100 text-amber-700' : 'bg-blue-100 text-blue-700'
]">
{{ item.impact }} 价值潜力
</span>
</div>
<div class="grid grid-cols-2 gap-4">
<div class="bg-red-50 p-4 rounded-lg border border-red-100">
<p class="text-xs font-bold text-red-700 mb-2">现有问题诊断</p>
<p class="text-sm text-slate-700">{{ item.issue }}</p>
</div>
<div class="bg-green-50 p-4 rounded-lg border border-green-100">
<p class="text-xs font-bold text-green-700 mb-2">AI 优化建议</p>
<p class="text-sm text-slate-700">{{ item.suggestion }}</p>
</div>
</div>
</div>
</div>
</div>
</template>
<!-- Potential Scenarios Report -->
<template v-else-if="viewingReport === 'potential-scenarios'">
<div class="space-y-6">
<div>
<h3 class="text-2xl font-bold text-slate-900 mb-4">潜在数据应用场景评估</h3>
<p class="text-slate-600 mb-6">
基于数据资产盘点结果AI 推荐以下潜在数据应用场景
</p>
</div>
<div class="space-y-4">
<div
v-for="scenario in selectedScenarios"
:key="scenario.id"
class="border border-slate-200 rounded-lg p-6"
>
<div class="flex items-center justify-between mb-3">
<h4 class="text-lg font-bold text-slate-900">{{ scenario.name }}</h4>
<div class="flex items-center gap-2">
<span class="text-xs font-bold text-slate-500 border border-slate-200 px-2 py-1 rounded">
{{ scenario.type }}
</span>
<span :class="[
'text-xs font-bold px-2 py-1 rounded',
scenario.impact === 'High' ? 'bg-green-100 text-green-700' : 'bg-amber-100 text-amber-700'
]">
{{ scenario.impact }} Impact
</span>
</div>
</div>
<p class="text-slate-600 mb-4">{{ scenario.desc }}</p>
<div>
<p class="text-sm font-bold text-slate-700 mb-2">核心数据支撑</p>
<div class="flex flex-wrap gap-2">
<span
v-for="(dep, i) in scenario.dependencies"
:key="i"
class="px-2 py-1 bg-slate-100 text-slate-700 text-xs rounded border border-slate-200"
>
{{ dep }}
</span>
</div>
</div>
</div>
</div>
</div>
</template>
</div>
</div>
</div>
<!-- Main Delivery View -->
<div v-else class="flex flex-col h-full bg-slate-50 overflow-y-auto animate-fade-in p-8 min-h-0">
<div class="text-center mb-10">
<div class="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center text-green-600 mx-auto mb-4 shadow-sm">
<PackageCheck :size="36" />
</div>
<h2 class="text-3xl font-bold text-slate-900">项目交付与结算</h2>
<p class="text-slate-500 mt-2">数据资产盘点项目已完成请查看并下载最终交付物</p>
</div>
<div class="max-w-5xl mx-auto w-full space-y-6 mb-12">
<!-- 整体数据资产盘点工作总结 -->
<div class="bg-white p-6 rounded-lg border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<div class="flex items-start justify-between">
<div class="flex items-center flex-1">
<div class="p-3 bg-blue-100 rounded-lg text-blue-600 mr-4">
<FileText :size="24"/>
</div>
<div class="flex-1">
<h3 class="font-bold text-slate-900 text-lg mb-1">整体数据资产盘点工作总结</h3>
<p class="text-sm text-slate-500">项目整体概述盘点成果汇总及下一步建议</p>
</div>
</div>
<div class="flex items-center gap-2">
<button
@click="viewingReport = 'summary'"
class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 flex items-center"
>
<Eye :size="16" class="mr-2" />
在线查看
</button>
<button
@click="handleDownloadReport('summary')"
class="p-2 text-slate-400 hover:text-blue-600 transition-colors"
title="下载 PDF"
>
<Download :size="18" />
</button>
</div>
</div>
</div>
<!-- 数据资产目录 - 多个 -->
<div>
<h3 class="text-sm font-bold text-slate-500 uppercase tracking-wider mb-4 flex items-center">
<Database :size="16" class="mr-2"/> 数据资产目录
</h3>
<div v-if="selectedScenarios.length === 0" class="bg-slate-50 border border-slate-200 rounded-lg p-6 text-center">
<p class="text-sm text-slate-500">暂无可用的数据资产目录请返回价值挖掘步骤选择场景</p>
</div>
<div v-else class="space-y-4">
<div
v-for="scenario in selectedScenarios"
:key="scenario.id"
class="bg-white p-6 rounded-lg border border-slate-200 shadow-sm hover:shadow-md transition-shadow"
>
<div class="flex items-start justify-between">
<div class="flex items-center flex-1">
<div class="p-3 bg-green-50 rounded-lg text-green-600 mr-4">
<FileSpreadsheet :size="24"/>
</div>
<div class="flex-1">
<h4 class="font-bold text-slate-900 mb-1">数据资产目录 - {{ scenario.name }}</h4>
<p class="text-xs text-slate-500">包含该场景相关的数据表结构字段定义及元数据信息</p>
</div>
</div>
<div class="flex items-center gap-2">
<button
@click="openInventoryReport(scenario.id)"
class="px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 flex items-center"
>
<Eye :size="16" class="mr-2" />
在线查看
</button>
<button
@click="handleDownloadReport('inventory', scenario.id)"
class="p-2 text-slate-400 hover:text-green-600 transition-colors"
title="下载 Excel"
>
<Download :size="18" />
</button>
</div>
</div>
</div>
</div>
</div>
<!-- 存量数据应用场景优化建议 -->
<div class="bg-white p-6 rounded-lg border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<div class="flex items-start justify-between">
<div class="flex items-center flex-1">
<div class="p-3 bg-amber-50 rounded-lg text-amber-600 mr-4">
<TrendingUp :size="24"/>
</div>
<div class="flex-1">
<h3 class="font-bold text-slate-900 text-lg mb-1">存量数据应用场景优化建议</h3>
<p class="text-sm text-slate-500">基于现有应用场景的 AI 诊断与优化建议</p>
</div>
</div>
<div class="flex items-center gap-2">
<button
@click="viewingReport = 'legacy-optimization'"
class="px-4 py-2 bg-amber-600 text-white rounded-lg hover:bg-amber-700 flex items-center"
>
<Eye :size="16" class="mr-2" />
在线查看
</button>
<button
@click="handleDownloadReport('legacy-optimization')"
class="p-2 text-slate-400 hover:text-amber-600 transition-colors"
title="下载 PDF"
>
<Download :size="18" />
</button>
</div>
</div>
</div>
<!-- 潜在数据应用场景评估 -->
<div v-if="selectedScenarios.length > 0" class="bg-white p-6 rounded-lg border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<div class="flex items-start justify-between">
<div class="flex items-center flex-1">
<div class="p-3 bg-purple-50 rounded-lg text-purple-600 mr-4">
<TrendingUp :size="24"/>
</div>
<div class="flex-1">
<h3 class="font-bold text-slate-900 text-lg mb-1">潜在数据应用场景评估</h3>
<p class="text-sm text-slate-500">AI 推荐的潜在数据应用场景详细评估报告</p>
</div>
</div>
<div class="flex items-center gap-2">
<button
@click="viewingReport = 'potential-scenarios'"
class="px-4 py-2 bg-purple-600 text-white rounded-lg hover:bg-purple-700 flex items-center"
>
<Eye :size="16" class="mr-2" />
在线查看
</button>
<button
@click="handleDownloadReport('potential-scenarios')"
class="p-2 text-slate-400 hover:text-purple-600 transition-colors"
title="下载 PDF"
>
<Download :size="18" />
</button>
</div>
</div>
</div>
</div>
<div class="max-w-4xl mx-auto w-full text-center">
<button
@click="handleBatchDownload"
class="px-8 py-3 bg-slate-900 text-white rounded-lg font-bold shadow-lg hover:bg-slate-800 transition-transform hover:scale-105 flex items-center mx-auto"
>
<PackageCheck :size="20" class="mr-2"/>
一键打包下载所有交付物 (Zip)
</button>
<p class="text-xs text-slate-400 mt-4">
操作提示: 确认下载后系统将自动锁定本项目的所有编辑权限 (Audit Lock)如需修改请联系总监申请解锁
</p>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import {
PackageCheck,
FileText,
Database,
FileSpreadsheet,
TrendingUp,
Download,
Eye,
ArrowLeft
} from 'lucide-vue-next';
import { Scenario } from '@/types';
import { legacyOptimizationData } from '@/data/mockData';
type ReportType = 'summary' | 'inventory' | 'legacy-optimization' | 'potential-scenarios' | null;
interface Props {
selectedScenarios: Scenario[];
}
const props = defineProps<Props>();
const viewingReport = ref<ReportType>(null);
const viewingInventoryId = ref<number | null>(null);
const reportTitle = computed(() => {
if (viewingReport.value === 'summary') return '整体数据资产盘点工作总结';
if (viewingReport.value === 'inventory' && viewingInventoryId.value) {
const scenario = props.selectedScenarios.find(s => s.id === viewingInventoryId.value);
return `数据资产目录 - ${scenario?.name}`;
}
if (viewingReport.value === 'legacy-optimization') return '存量数据应用场景优化建议';
if (viewingReport.value === 'potential-scenarios') return '潜在数据应用场景评估';
return '';
});
const currentScenario = computed(() => {
if (!viewingInventoryId.value) return null;
return props.selectedScenarios.find(s => s.id === viewingInventoryId.value);
});
const closeReport = () => {
viewingReport.value = null;
viewingInventoryId.value = null;
};
const openInventoryReport = (id: number) => {
viewingInventoryId.value = id;
viewingReport.value = 'inventory';
};
const handleDownload = () => {
const reportName = reportTitle.value;
console.log(`Download PDF: ${reportName}`);
};
const handleDownloadReport = (type: ReportType, scenarioId?: number) => {
let reportName = '';
if (type === 'summary') reportName = '整体数据资产盘点工作总结';
else if (type === 'inventory' && scenarioId) {
const scenario = props.selectedScenarios.find(s => s.id === scenarioId);
reportName = `数据资产目录-${scenario?.name}`;
}
else if (type === 'legacy-optimization') reportName = '存量数据应用场景优化建议';
else if (type === 'potential-scenarios') reportName = '潜在数据应用场景评估';
console.log(`Download: ${reportName}`);
};
const handleBatchDownload = () => {
if (confirm('确认下载所有交付物?下载后系统将自动锁定本项目的所有编辑权限 (Audit Lock)。')) {
console.log('Download all deliverables as ZIP');
}
};
</script>