feat: 添加工作任务管理功能
- 新增 Task 模型(状态、优先级、进展百分比) - 任务 API(列表、统计、进展更新、完成标记) - 前端任务板块(统计卡片 + 任务列表) - 进展可视化(进度条 + 进展记录)
This commit is contained in:
@@ -2,8 +2,8 @@ from rest_framework import viewsets
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from django.utils import timezone
|
||||
from .models import DiaryEntry, DailyProgress, Experience
|
||||
from .serializers import DiaryEntrySerializer, DailyProgressSerializer, ExperienceSerializer
|
||||
from .models import DiaryEntry, DailyProgress, Experience, Task
|
||||
from .serializers import DiaryEntrySerializer, DailyProgressSerializer, ExperienceSerializer, TaskSerializer
|
||||
|
||||
class DiaryEntryViewSet(viewsets.ModelViewSet):
|
||||
queryset = DiaryEntry.objects.all()
|
||||
@@ -60,3 +60,59 @@ class ExperienceViewSet(viewsets.ModelViewSet):
|
||||
experiences = Experience.objects.order_by('-date', '-created_at')[:10]
|
||||
serializer = self.get_serializer(experiences, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class TaskViewSet(viewsets.ModelViewSet):
|
||||
queryset = Task.objects.all()
|
||||
serializer_class = TaskSerializer
|
||||
|
||||
@action(detail=False, methods=['get'])
|
||||
def by_status(self, request):
|
||||
"""按状态分组获取任务"""
|
||||
statuses = {}
|
||||
for task in Task.objects.all():
|
||||
status = task.get_status_display()
|
||||
if status not in statuses:
|
||||
statuses[status] = []
|
||||
statuses[status].append(TaskSerializer(task).data)
|
||||
return Response(statuses)
|
||||
|
||||
@action(detail=False, methods=['get'])
|
||||
def active(self, request):
|
||||
"""获取活跃任务(未完成和未取消)"""
|
||||
tasks = Task.objects.exclude(status__in=['completed', 'cancelled'])
|
||||
serializer = self.get_serializer(tasks, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
@action(detail=False, methods=['get'])
|
||||
def stats(self, request):
|
||||
"""获取任务统计"""
|
||||
total = Task.objects.count()
|
||||
completed = Task.objects.filter(status='completed').count()
|
||||
in_progress = Task.objects.filter(status='in_progress').count()
|
||||
pending = Task.objects.filter(status='pending').count()
|
||||
blocked = Task.objects.filter(status='blocked').count()
|
||||
return Response({
|
||||
'total': total,
|
||||
'completed': completed,
|
||||
'in_progress': in_progress,
|
||||
'pending': pending,
|
||||
'blocked': blocked,
|
||||
'completion_rate': round(completed / total * 100, 1) if total > 0 else 0
|
||||
})
|
||||
|
||||
@action(detail=True, methods=['post'])
|
||||
def update_progress(self, request, pk=None):
|
||||
"""更新任务进展"""
|
||||
task = self.get_object()
|
||||
percent = request.data.get('percent', task.progress_percent)
|
||||
notes = request.data.get('notes', '')
|
||||
task.update_progress(int(percent), notes)
|
||||
return Response(TaskSerializer(task).data)
|
||||
|
||||
@action(detail=True, methods=['post'])
|
||||
def complete(self, request, pk=None):
|
||||
"""标记任务为完成"""
|
||||
task = self.get_object()
|
||||
task.mark_completed()
|
||||
return Response(TaskSerializer(task).data)
|
||||
|
||||
Reference in New Issue
Block a user