feat(topone): 实现任务下发功能并优化界面布局
- 添加任务下发API接口并在任务列表组件中引入 - 修改任务创建逻辑,对接后端API - 获取下属人员列表用于任务分配 - 优化表格布局,移除总业绩列 - 删除不必要的指导建议模块
This commit is contained in:
@@ -5,154 +5,10 @@
|
||||
<div class="header-controls">
|
||||
<select v-model="filterPriority" class="priority-filter">
|
||||
<option value="all">全部优先级</option>
|
||||
<option value="urgent">紧急</option>
|
||||
<option value="high">高</option>
|
||||
<option value="medium">中</option>
|
||||
<option value="low">低</option>
|
||||
<option value="urgent">待处理</option>
|
||||
<option value="high">正在处理</option>
|
||||
<option value="medium">已完成</option>
|
||||
</select>
|
||||
<button class="add-btn" @click="showAddForm = true">+ 新增</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 统计概览 -->
|
||||
<div class="actions-summary">
|
||||
<div class="summary-item urgent">
|
||||
<div class="summary-count">{{ getCountByPriority('urgent') }}</div>
|
||||
<div class="summary-label">紧急事项</div>
|
||||
</div>
|
||||
<div class="summary-item high">
|
||||
<div class="summary-count">{{ getCountByPriority('high') }}</div>
|
||||
<div class="summary-label">高优先级</div>
|
||||
</div>
|
||||
<div class="summary-item medium">
|
||||
<div class="summary-count">{{ getCountByPriority('medium') }}</div>
|
||||
<div class="summary-label">中优先级</div>
|
||||
</div>
|
||||
<div class="summary-item completed">
|
||||
<div class="summary-count">{{ completedCount }}</div>
|
||||
<div class="summary-label">已完成</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 事项列表 -->
|
||||
<div class="actions-list">
|
||||
<div
|
||||
v-for="action in filteredActions"
|
||||
:key="action.id"
|
||||
class="action-item"
|
||||
:class="[action.priority, { completed: action.completed, overdue: isOverdue(action.dueDate) }]"
|
||||
>
|
||||
<div class="action-checkbox">
|
||||
<input
|
||||
type="checkbox"
|
||||
:checked="action.completed"
|
||||
@change="toggleComplete(action.id)"
|
||||
class="checkbox"
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="action-content">
|
||||
<div class="action-header">
|
||||
<h4 class="action-title" :class="{ completed: action.completed }">{{ action.title }}</h4>
|
||||
<div class="action-meta">
|
||||
<span class="priority-badge" :class="action.priority">{{ getPriorityText(action.priority) }}</span>
|
||||
<span class="due-date" :class="{ overdue: isOverdue(action.dueDate) }">
|
||||
{{ formatDueDate(action.dueDate) }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="action-description">{{ action.description }}</p>
|
||||
|
||||
<div class="action-details">
|
||||
<div class="detail-item">
|
||||
<span class="detail-label">关联组别:</span>
|
||||
<span class="detail-value">{{ action.relatedGroup || '全部' }}</span>
|
||||
</div>
|
||||
<div class="detail-item" v-if="action.assignee">
|
||||
<span class="detail-label">负责人:</span>
|
||||
<span class="detail-value">{{ action.assignee }}</span>
|
||||
</div>
|
||||
<div class="detail-item" v-if="action.progress !== undefined">
|
||||
<span class="detail-label">进度:</span>
|
||||
<div class="progress-mini">
|
||||
<div class="progress-bar-mini">
|
||||
<div class="progress-fill-mini" :style="{ width: action.progress + '%' }"></div>
|
||||
</div>
|
||||
<span class="progress-text-mini">{{ action.progress }}%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="action-footer">
|
||||
<div class="action-tags">
|
||||
<span v-for="tag in action.tags" :key="tag" class="tag">{{ tag }}</span>
|
||||
</div>
|
||||
<div class="action-buttons">
|
||||
<button class="btn-edit" @click="editAction(action)">编辑</button>
|
||||
<button class="btn-delete" @click="deleteAction(action.id)">删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 空状态 -->
|
||||
<div v-if="filteredActions.length === 0" class="empty-state">
|
||||
<div class="empty-icon">✅</div>
|
||||
<div class="empty-text">
|
||||
<h3>暂无待处理事项</h3>
|
||||
<p>{{ filterPriority === 'all' ? '所有事项都已处理完成' : '该优先级下暂无事项' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 新增表单模态框 -->
|
||||
<div v-if="showAddForm" class="modal-overlay" @click="showAddForm = false">
|
||||
<div class="modal-content" @click.stop>
|
||||
<div class="modal-header">
|
||||
<h3>新增待处理事项</h3>
|
||||
<button class="close-btn" @click="showAddForm = false">×</button>
|
||||
</div>
|
||||
<form @submit.prevent="addAction" class="add-form">
|
||||
<div class="form-group">
|
||||
<label>标题</label>
|
||||
<input v-model="newAction.title" type="text" required class="form-input">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>描述</label>
|
||||
<textarea v-model="newAction.description" class="form-textarea"></textarea>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label>优先级</label>
|
||||
<select v-model="newAction.priority" class="form-select">
|
||||
<option value="low">低</option>
|
||||
<option value="medium">中</option>
|
||||
<option value="high">高</option>
|
||||
<option value="urgent">紧急</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>截止日期</label>
|
||||
<input v-model="newAction.dueDate" type="date" class="form-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>关联组别</label>
|
||||
<select v-model="newAction.relatedGroup" class="form-select">
|
||||
<option value="">全部</option>
|
||||
<option value="精英组">精英组</option>
|
||||
<option value="冲锋组">冲锋组</option>
|
||||
<option value="突破组">突破组</option>
|
||||
<option value="新星组">新星组</option>
|
||||
<option value="潜力组">潜力组</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button type="button" @click="showAddForm = false" class="btn-cancel">取消</button>
|
||||
<button type="submit" class="btn-submit">添加</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -292,34 +148,7 @@ const completedCount = computed(() => {
|
||||
return actions.value.filter(action => action.completed).length
|
||||
})
|
||||
|
||||
// 按优先级获取数量
|
||||
const getCountByPriority = (priority) => {
|
||||
return actions.value.filter(action => action.priority === priority && !action.completed).length
|
||||
}
|
||||
|
||||
// 切换完成状态
|
||||
const toggleComplete = (id) => {
|
||||
const action = actions.value.find(a => a.id === id)
|
||||
if (action) {
|
||||
action.completed = !action.completed
|
||||
}
|
||||
}
|
||||
|
||||
// 判断是否过期
|
||||
const isOverdue = (dueDate) => {
|
||||
return new Date(dueDate) < new Date()
|
||||
}
|
||||
|
||||
// 获取优先级文本
|
||||
const getPriorityText = (priority) => {
|
||||
const priorityMap = {
|
||||
urgent: '紧急',
|
||||
high: '高',
|
||||
medium: '中',
|
||||
low: '低'
|
||||
}
|
||||
return priorityMap[priority] || priority
|
||||
}
|
||||
|
||||
// 格式化截止日期
|
||||
const formatDueDate = (dueDate) => {
|
||||
|
||||
Reference in New Issue
Block a user