import { Component, EventEmitter, Input, Output } from '@angular/core'; import { CommonModule, DatePipe } from '@angular/common'; // NG-ZORRO 组件 import { NzModalModule } from 'ng-zorro-antd/modal'; import { NzDescriptionsModule } from 'ng-zorro-antd/descriptions'; import { NzCardModule } from 'ng-zorro-antd/card'; import { NzTagModule } from 'ng-zorro-antd/tag'; import { NzSwitchModule } from 'ng-zorro-antd/switch'; import { NzCollapseModule } from 'ng-zorro-antd/collapse'; // 类型 import { IMessageActivity, FilterCondition } from '../services/message.service'; import { FormsModule } from '@angular/forms'; @Component({ selector: 'app-activity-detail', standalone: true, imports: [ CommonModule, NzModalModule, FormsModule, NzDescriptionsModule, NzCardModule, NzTagModule, NzSwitchModule, NzCollapseModule, DatePipe, ], template: ` {{ activity?.name }} {{ getTemplateName(activity?.templateId) }} {{ getStrategyName(activity?.strategy || 0) }} {{ activity?.scheduleAt | date : 'yyyy-MM-dd HH:mm:ss' }} {{ getStatusName(activity?.status || 0) }} {{ activity?.createdAt | date : 'yyyy-MM-dd HH:mm:ss' }} {{ activity?.updatedAt | date : 'yyyy-MM-dd HH:mm:ss' }} {{ activity?.action || '无' }} {{ activity?.param || '无' }} {{ activity?.extend || '无' }} @if (activity && activity.filter && activity.filter.length > 0) { @for (condition of activity.filter; track $index) { {{ getFieldLabel(condition.field) }} {{ getOperatorLabel(condition.operator) }} {{ formatConditionValue(condition) }} } } @else { 无筛选条件 } {{ activity?.description }} `, styles: [ ` nz-card { margin-bottom: 16px; } .filter-conditions { display: flex; flex-direction: column; gap: 8px; } .filter-condition { display: flex; align-items: center; gap: 8px; padding: 8px; background: #f5f5f5; border-radius: 4px; } .condition-field { font-weight: 500; min-width: 100px; } .condition-operator { color: #666; min-width: 80px; } .condition-value { flex: 1; } `, ], }) export class ActivityDetailComponent { @Input() activity: IMessageActivity | null = null; @Input() isVisible = false; @Input() templates: { _id: string; templateName: string }[] = []; @Output() onCancel = new EventEmitter(); getTemplateName(templateId: string | undefined): string { if (!templateId) return '-'; const template = this.templates.find((t) => t._id === templateId); return template ? template.templateName : '-'; } getStrategyName(strategy: number): string { const strategies = { 0: '自定义策略', 1: '活跃用户推送', 2: '新用户推送', 3: '沉默用户唤醒', }; return strategies[strategy as keyof typeof strategies] || '未知策略'; } getStrategyColor(strategy: number): string { const colors = { 0: 'blue', 1: 'green', 2: 'orange', 3: 'purple', }; return colors[strategy as keyof typeof colors] || 'default'; } getStatusName(status: number): string { const statuses = { 0: '未发布', 1: '已发布', 2: '已完成', }; return statuses[status as keyof typeof statuses] || '未知状态'; } getStatusColor(status: number): string { const colors = { 0: 'default', 1: 'processing', 2: 'success', }; return colors[status as keyof typeof colors] || 'default'; } /** * 获取字段的显示标签 */ getFieldLabel(field: string): string { const fieldLabels: { [key: string]: string } = { cc: '国家', firstLoginAt: '首次登录时间', lastActiveAt: '最后活跃时间', // 可以添加更多字段映射 }; return fieldLabels[field] || field; } /** * 获取运算符的显示标签 */ getOperatorLabel(operator: string): string { const operatorLabels: { [key: string]: string } = { $in: '包含', $nin: '不包含', $gt: '大于', $lt: '小于', $gte: '大于等于', $lte: '小于等于', }; return operatorLabels[operator] || operator; } /** * 格式化条件值的显示 */ formatConditionValue(condition: FilterCondition): string { if (condition.field === 'cc' && Array.isArray(condition.value)) { return condition.value.join(', '); } if ( condition.field === 'firstLoginAt' || condition.field === 'lastActiveAt' ) { if (condition.operator === '$in' && Array.isArray(condition.value)) { return `${condition.value[0]} 至 ${condition.value[1]} 天前`; } else if (typeof condition.value === 'number') { return `${condition.value} 天前`; } } return JSON.stringify(condition.value); } }