Переглянути джерело

feat: 发布列表目标账号显示成功/失败数量统计

ethanfly 3 днів тому
батько
коміт
0e05d4f736

+ 9 - 1
client/src/views/Publish/index.vue

@@ -37,9 +37,17 @@
           </template>
         </el-table-column>
         
-        <el-table-column label="目标账号" min-width="180">
+        <el-table-column label="目标账号" min-width="220">
           <template #default="{ row }">
             <span>{{ row.targetAccounts?.length || 0 }} 个</span>
+            <template v-if="row.successCount !== undefined || row.failCount !== undefined">
+              <el-tag v-if="(row.successCount || 0) > 0" type="success" size="small" style="margin-left: 4px">
+                ✓ {{ row.successCount }}
+              </el-tag>
+              <el-tag v-if="(row.failCount || 0) > 0" type="danger" size="small" style="margin-left: 4px">
+                ✗ {{ row.failCount }}
+              </el-tag>
+            </template>
             <el-tag
               v-for="platform in getTaskPlatforms(row)"
               :key="platform"

+ 31 - 1
server/src/services/PublishService.ts

@@ -137,8 +137,38 @@ export class PublishService {
       .take(pageSize)
       .getManyAndCount();
 
+    // 批量查询每个任务的发布结果统计
+    let resultStatsMap: Record<number, { successCount: number; failCount: number }> = {};
+    if (tasks.length > 0) {
+      const taskIds = tasks.map(t => t.id);
+      const stats = await this.resultRepository
+        .createQueryBuilder('r')
+        .select('r.taskId', 'taskId')
+        .addSelect('COUNT(CASE WHEN r.status = :success THEN 1 END)', 'successCount')
+        .addSelect('COUNT(CASE WHEN r.status = :failed THEN 1 END)', 'failCount')
+        .setParameter('success', 'success')
+        .setParameter('failed', 'failed')
+        .where('r.taskId IN (:...taskIds)', { taskIds })
+        .groupBy('r.taskId')
+        .getRawMany();
+      for (const s of stats) {
+        resultStatsMap[s.taskId] = {
+          successCount: Number(s.successCount) || 0,
+          failCount: Number(s.failCount) || 0,
+        };
+      }
+    }
+
     return {
-      items: tasks.map(this.formatTask),
+      items: tasks.map(t => {
+        const formatted = this.formatTask(t);
+        const stats = resultStatsMap[t.id];
+        if (stats) {
+          formatted.successCount = stats.successCount;
+          formatted.failCount = stats.failCount;
+        }
+        return formatted;
+      }),
       total,
       page,
       pageSize,

+ 4 - 0
shared/src/types/publish.ts

@@ -54,6 +54,10 @@ export interface PublishTask {
   publishedAt: string | null;
   createdAt: string;
   updatedAt: string;
+  /** 成功数 */
+  successCount?: number;
+  /** 失败数 */
+  failCount?: number;
 }
 
 /**