| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- <template>
- <div class="app-container">
- <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
- <el-form-item label="所属租户" prop="companyId">
- <el-select v-model="queryParams.companyId" placeholder="全部租户" clearable size="small" @change="handleQuery">
- <el-option v-for="item in companyList" :key="item.id" :label="item.companyName" :value="item.id" />
- </el-select>
- </el-form-item>
- <el-form-item label="工作流ID" prop="workflowId">
- <el-input v-model="queryParams.workflowId" placeholder="请输入工作流ID" clearable size="small" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
- <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
- </el-form-item>
- </el-form>
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5"><el-button type="success" plain icon="el-icon-check" size="mini" @click="handleBatchAudit(true)">批量通过</el-button></el-col>
- <el-col :span="1.5"><el-button type="danger" plain icon="el-icon-close" size="mini" @click="handleBatchAudit(false)">批量驳回</el-button></el-col>
- <el-col :span="1.5"><el-button type="primary" plain icon="el-icon-data-analysis" size="mini" @click="handleAnalyze">触发分析</el-button></el-col>
- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
- </el-row>
- <!-- 统计卡片 -->
- <el-row :gutter="16" class="mb8">
- <el-col :span="6"><el-card shadow="hover"><div class="stat-card"><div class="stat-value">{{ stats.totalOptimizations || 0 }}</div><div class="stat-label">总优化数</div></div></el-card></el-col>
- <el-col :span="6"><el-card shadow="hover"><div class="stat-card"><div class="stat-value" style="color:#E6A23C">{{ stats.pendingCount || 0 }}</div><div class="stat-label">待审核</div></div></el-card></el-col>
- <el-col :span="6"><el-card shadow="hover"><div class="stat-card"><div class="stat-value" style="color:#67C23A">{{ stats.appliedCount || 0 }}</div><div class="stat-label">已应用</div></div></el-card></el-col>
- <el-col :span="6"><el-card shadow="hover"><div class="stat-card"><div class="stat-value" style="color:#F56C6C">{{ stats.rejectedCount || 0 }}</div><div class="stat-label">已驳回</div></div></el-card></el-col>
- </el-row>
- <el-table border v-loading="loading" :data="list" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="优化ID" align="center" prop="optimizationId" width="80" />
- <el-table-column label="优化原因" align="center" prop="optimizationReason" show-overflow-tooltip />
- <el-table-column label="原始话术" align="center" prop="originalContent" show-overflow-tooltip />
- <el-table-column label="优化话术" align="center" prop="optimizedContent" show-overflow-tooltip />
- <el-table-column label="置信度" align="center" prop="confidence" width="80" />
- <el-table-column label="状态" align="center" prop="status" width="80">
- <template slot-scope="scope">
- <el-tag :type="scope.row.status==='pending'?'warning':scope.row.status==='applied'?'success':'danger'" size="small">{{ scope.row.status }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="操作" align="center" width="120">
- <template slot-scope="scope">
- <el-button v-if="scope.row.status==='pending'" size="mini" type="text" @click="handleAuditSingle(scope.row, true)">通过</el-button>
- <el-button v-if="scope.row.status==='pending'" size="mini" type="text" style="color:#F56C6C" @click="handleAuditSingle(scope.row, false)">驳回</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </template>
- <script>
- import { listAllCompanies } from '@/api/workflow/lobster-admin'
- import { listPendingAudit, batchAuditOptimization, auditSingleOptimization, getOptimizationStats, analyzeEvolution } from '@/api/workflow/lobster'
- export default {
- name: 'LobsterOptimization',
- data() {
- return { loading: false, showSearch: true, list: [], stats: {}, ids: [],
- queryParams: { page: 1, pageSize: 20, workflowId: null } }
- },
- created() { this.getCompanyList()
- this.getList(); this.getStats() },
- methods: {
- getCompanyList() {
- listAllCompanies().then(res => { this.companyList = res.data || [] })
- },
- getList() { this.loading = true; listPendingAudit(this.queryParams).then(res => { this.list = res.data || []; this.loading = false }).catch(() => { this.loading = false }) },
- getStats() { getOptimizationStats().then(res => { this.stats = res.data || {} }) },
- handleQuery() { this.queryParams.page = 1; this.getList() },
- resetQuery() { this.resetForm('queryForm'); this.handleQuery() },
- handleSelectionChange(sel) { this.ids = sel.map(s => s.optimizationId) },
- handleAuditSingle(row, approved) { auditSingleOptimization(row.optimizationId, approved, '').then(() => { this.$message.success(approved?'已通过':'已驳回'); this.getList(); this.getStats() }) },
- handleBatchAudit(approved) {
- if (this.ids.length===0) { this.$message.warning('请先选择要审核的项'); return }
- let items = this.ids.map(id => ({ optimizationId: id, approved, remark: '' }))
- batchAuditOptimization({ auditItems: items, auditRemark: approved?'批量通过':'批量驳回' }).then(() => { this.$message.success('批量审核完成'); this.getList(); this.getStats() })
- },
- handleAnalyze() {
- if (!this.queryParams.workflowId) { this.$message.warning('请输入工作流ID'); return }
- analyzeEvolution(this.queryParams.workflowId).then(() => {
- this.$message.success('进化分析已触发')
- this.getList(); this.getStats()
- })
- }
- }
- }
- </script>
- <style scoped>
- .stat-card { text-align: center; padding: 10px 0; }
- .stat-value { font-size: 24px; font-weight: bold; color: #409EFF; }
- .stat-label { font-size: 12px; color: #909399; margin-top: 4px; }
- </style>
|