| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <template>
- <div class="report-autolearn admin-page">
- <el-card>
- <div slot="header">
- <span>报告自学习</span>
- <div style="float: right;">
- <el-button size="small" @click="fetchClusters" icon="el-icon-refresh">刷新</el-button>
- </div>
- </div>
- <el-alert title='自学习机制:当同一类型的未知报告积累到3份后,系统自动标记为"可生成"状态,管理员可在此生成报告类型和指纹规则。' type='info' :closable='false' show-icon style='margin-bottom: 16px;' />
- <el-table :data="clusters" v-loading="loading" border stripe>
- <el-table-column prop="id" label="ID" width="60" />
- <el-table-column prop="clusterKey" label="聚类键" width="140" />
- <el-table-column prop="reportCount" label="报告数" width="80" />
- <el-table-column label="状态" width="100">
- <template slot-scope="{ row }">
- <el-tag :type="row.status === 'ready' ? 'warning' : 'success'" size="small">
- {{ row.status === 'ready' ? '可生成' : '已生成' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="generatedTypeId" label="类型ID" width="140" />
- <el-table-column prop="updatedAt" label="更新时间" width="180" />
- <el-table-column label="操作" width="180" fixed="right">
- <template slot-scope="{ row }">
- <el-button size="mini" type="primary" @click="handleDetail(row)">详情</el-button>
- <el-button v-if="row.status === 'ready'" size="mini" type="success" @click="handleGenerate(row)">生成类型</el-button>
- <el-button v-if="row.status === 'generated'" size="mini" type="primary" @click="handleViewType(row)" plain>查看类型</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- <el-dialog :visible.sync="detailVisible" title="聚类详情" width="750px">
- <template v-if="currentCluster">
- <el-descriptions :column="2" border size="small">
- <el-descriptions-item label="聚类键">{{ currentCluster.clusterKey }}</el-descriptions-item>
- <el-descriptions-item label="报告数">{{ currentCluster.reportCount }}</el-descriptions-item>
- <el-descriptions-item label="状态">{{ currentCluster.status === 'ready' ? '可生成' : '已生成' }}</el-descriptions-item>
- <el-descriptions-item label="类型ID">{{ currentCluster.generatedTypeId || '—' }}</el-descriptions-item>
- </el-descriptions>
- <h4>公共文本特征</h4>
- <pre class="detail-pre">{{ currentCluster.commonSignatures }}</pre>
- <h4>LLM 解析模板</h4>
- <pre class="detail-pre">{{ formatJson(currentCluster.llmTemplate) }}</pre>
- </template>
- </el-dialog>
- </div>
- </template>
- <script>
- import { getUnknownClusters, generateTypeFromCluster } from '@/api/reportParser'
- export default {
- name: 'ReportAutoLearn',
- data() {
- return {
- loading: false,
- clusters: [],
- detailVisible: false,
- currentCluster: null,
- }
- },
- mounted() { this.fetchClusters() },
- methods: {
- async fetchClusters() {
- this.loading = true
- try {
- const res = await getUnknownClusters({ page: 1, size: 50 })
- this.clusters = (res.data?.records || res.data || []).filter(
- c => c.status === 'ready' || c.status === 'generated')
- } catch (e) { this.$message.error('加载失败') }
- this.loading = false
- },
- formatJson(str) {
- if (!str) return ''
- try { return JSON.stringify(JSON.parse(str), null, 2) } catch (e) { return str }
- },
- handleDetail(row) {
- this.currentCluster = row
- this.detailVisible = true
- },
- handleGenerate(row) {
- this.$confirm('确认为此聚类生成报告类型和指纹规则?生成后需在"报告类型管理"中审核启用。', '提示', { type: 'warning' })
- .then(async () => {
- try {
- const res = await generateTypeFromCluster({ clusterId: row.id })
- this.$message.success('已生成类型: ' + (res.data?.typeId || ''))
- this.fetchClusters()
- } catch (e) { this.$message.error('生成失败') }
- }).catch(() => {})
- },
- handleViewType(row) {
- this.$router.push('/report-types')
- },
- }
- }
- </script>
- <style scoped>
- .detail-pre {
- background: #f5f7fa;
- border: 1px solid #e4e7ed;
- border-radius: 4px;
- padding: 10px;
- max-height: 300px;
- overflow: auto;
- font-size: 12px;
- white-space: pre-wrap;
- word-break: break-all;
- }
- </style>
|