fix: 任务大厅卡片显示任务子类型和预览图

This commit is contained in:
Your Name 2026-01-06 21:45:01 +08:00
parent 2193a9dd77
commit c2f6aef463

View File

@ -200,154 +200,95 @@
class="task-card chart-card"
@click="handleTaskClick(task)"
>
<!-- 带预览图的卡片布局 -->
<div class="card-with-preview">
<!-- 预览图 -->
<div v-if="task.previewImage" class="task-preview">
<img :src="task.previewImage" alt="预览图" />
<!-- 新版卡片布局 -->
<div class="card-new-layout">
<!-- 预览图区域 -->
<div v-if="task.previewImage" class="preview-cover">
<img :src="task.previewImage" alt="预览图" loading="lazy" />
<div class="preview-overlay"></div>
<!-- 悬浮标签 -->
<div class="floating-badges">
<span v-if="task.isSubTask" class="badge-mini subtask">子任务</span>
<span v-if="isNewTask(task)" class="badge-mini new">新发布</span>
<span v-if="task.isUrgent" class="badge-mini urgent">紧急</span>
</div>
</div>
<!-- 卡片内容 -->
<div class="card-content" :class="{ 'has-preview': task.previewImage }">
<!-- 任务标题 -->
<div class="task-header">
<h3 class="task-title">{{ task.title }}</h3>
<div class="task-badges">
<span v-if="task.isSubTask" class="badge badge-subtask">
<Icon name="layers" size="sm" color="#1890ff" style="margin-right: 4px; vertical-align: middle;" />
子任务
</span>
<span v-if="isNewTask(task)" class="badge badge-new">
<Icon name="sparkles" size="sm" color="#31f08b" style="margin-right: 4px; vertical-align: middle;" />
新发布
</span>
<span v-if="isHighScoreTask(task)" class="badge badge-high-score">
<Icon name="star" size="sm" color="#31f08b" style="margin-right: 4px; vertical-align: middle;" />
高分
</span>
<span v-if="task.isUrgent" class="badge badge-urgent">
<Icon name="fire" size="sm" color="#31f08b" style="margin-right: 4px; vertical-align: middle;" />
紧急
</span>
</div>
<div class="card-body">
<!-- 头部标签(无预览图时显示) -->
<div v-if="!task.previewImage" class="header-badges">
<span v-if="task.isSubTask" class="badge-tag subtask">子任务</span>
<span v-if="isNewTask(task)" class="badge-tag new">新发布</span>
<span v-if="task.isUrgent" class="badge-tag urgent">紧急</span>
<span v-if="isHighScoreTask(task)" class="badge-tag high-score">高分</span>
</div>
<!-- 流程阶段 -->
<div v-if="getProcessStage(task)" class="process-stage">
<span class="stage-icon">
<Icon name="clock" size="sm" color="#31f08b" />
<!-- 标题 -->
<h3 class="card-title" :title="task.title">{{ task.title }}</h3>
<!-- 核心指标 -->
<div class="metrics-row">
<div class="metric">
<span class="label">类型</span>
<span class="value type" :title="getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType)">
{{ getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType) }}
</span>
<span class="stage-text">{{ getProcessStage(task) }}</span>
</div>
<!-- 任务信息 -->
<div class="task-info">
<div class="info-item">
<span class="label">任务类型</span>
<span class="value">{{ getTaskTypeName(task.taskTypeId, task.taskTypeName) }}</span>
<div class="metric divider"></div>
<div class="metric">
<span class="label">积分</span>
<span class="value score">{{ task.score || '--' }}</span>
</div>
<div class="info-item">
<span class="label">预估积分</span>
<span class="value text-brand">{{ task.score || '--' }} 分</span>
</div>
<div class="info-item">
<div class="metric divider"></div>
<div class="metric">
<span class="label">数量</span>
<span class="value">{{ task.quantity || 1 }} 个</span>
<span class="value">{{ task.quantity || 1 }}</span>
</div>
</div>
<!-- 任务详情 -->
<div class="task-details">
<div v-if="task.brandName" class="detail-item">
<span class="icon">
<Icon name="tag" size="sm" color="#31f08b" />
<!-- 详细信息 -->
<div class="details-grid">
<div class="detail-item" v-if="task.brandName || task.categoryName">
<Icon name="tag" size="xs" class="icon" />
<span class="text text-ellipsis">
{{ task.brandName }} <span v-if="task.brandName && task.categoryName">·</span> {{ task.categoryName }}
</span>
<span>品牌: {{ task.brandName }}</span>
</div>
<div v-if="task.categoryName" class="detail-item">
<span class="icon">
<Icon name="folder" size="sm" color="#31f08b" />
<div class="detail-item" v-if="task.platformName || task.spuInfo">
<Icon name="monitor" size="xs" class="icon" />
<span class="text text-ellipsis">
{{ task.platformName || '--' }} <span v-if="task.spuInfo">· {{ task.spuInfo }}</span>
</span>
<span>类目: {{ task.categoryName }}</span>
</div>
<div v-if="task.platformName" class="detail-item">
<span class="icon">
<Icon name="monitor" size="sm" color="#31f08b" />
</span>
<span>平台: {{ task.platformName }}</span>
</div>
<div v-if="task.spuInfo" class="detail-item">
<span class="icon">
<Icon name="tag" size="sm" color="#31f08b" />
</span>
<span>SPU: {{ task.spuInfo }}</span>
</div>
<div class="detail-item">
<span class="icon">
<Icon name="user" size="sm" color="#31f08b" />
</span>
<span>发布人: {{ task.publisherName || '未知' }}</span>
</div>
<div v-if="task.attachmentUrl" class="detail-item detail-item-attachment">
<span class="icon">
<Icon name="paperclip" size="sm" color="#31f08b" />
</span>
<span>附件:
<a
v-for="(url, index) in (task.attachmentUrl || '').split(',').filter(u => u.trim())"
:key="index"
:href="url.trim()"
target="_blank"
class="attachment-link"
@click.stop
>
附件{{ index + 1 }}
</a>
</span>
<Icon name="user" size="xs" class="icon" />
<span class="text text-ellipsis">{{ task.publisherName || '未知' }}</span>
</div>
<div class="detail-item">
<span class="icon">
<Icon name="clock" size="sm" color="#31f08b" />
</span>
<span>时效要求: {{ formatEstimatedTime(task.estimatedHours) }}</span>
</div>
<div class="detail-item">
<span class="icon">
<Icon name="calendar" size="sm" color="#31f08b" />
</span>
<span>发布时间: {{ formatTime(task.createTime) }}</span>
<Icon name="clock" size="xs" class="icon" />
<span class="text">时效: {{ formatEstimatedTime(task.estimatedHours) }}</span>
</div>
</div>
<!-- 操作按钮 -->
<div class="task-actions">
<button
class="btn btn-secondary"
style="flex: 1"
@click.stop="handleTaskClick(task)"
>
查看详情
<!-- 底部操作栏 -->
<div class="card-actions">
<button class="action-btn secondary" @click.stop="handleTaskClick(task)">
详情
</button>
<button
:class="[
'btn',
canGrabTask(task).canGrab ? 'btn-primary' : 'btn-disabled'
]"
:style="{
flex: 1,
backgroundColor: canGrabTask(task).canGrab ? '#31f08b' : '#666',
cursor: canGrabTask(task).canGrab ? 'pointer' : 'not-allowed',
opacity: canGrabTask(task).canGrab ? 1 : 0.6
}"
class="action-btn primary"
:class="{ disabled: !canGrabTask(task).canGrab }"
:disabled="!canGrabTask(task).canGrab"
:title="canGrabTask(task).canGrab ? '点击抢单' : canGrabTask(task).reason"
@click.stop="handleGrab(task)"
>
{{ canGrabTask(task).canGrab ? '抢单' : '不可接单' }}
{{ canGrabTask(task).canGrab ? '立即抢单' : '不可抢' }}
</button>
</div>
</div> <!-- 结束 card-content -->
</div> <!-- 结束 card-with-preview -->
</div>
</div>
</div>
</div>
@ -2452,7 +2393,10 @@ const completedPagination = reactive({
})
// 获取任务类型名称
const getTaskTypeName = (typeId: number, taskTypeName?: string) => {
const getTaskTypeName = (typeId: number, taskTypeName?: string, taskSubType?: string) => {
// 如果有任务子类型(如:新品、优化),优先显示
if (taskSubType) return taskSubType
// 如果有直接传入的类型名称,优先使用
if (taskTypeName) return taskTypeName
@ -2672,6 +2616,7 @@ const loadTasks = async () => {
groupNo: item.groupNo,
taskTypeId: item.taskTypeId,
taskTypeName: item.taskTypeName, // 任务类型名称
taskSubType: item.taskSubType, // 任务子类型
score: item.totalScore || item.score, // 预估积分
estimatedHours: item.estimatedHours,
quantity: item.quantity || 1, // 数量