feat: 添加工作任务管理功能

- 新增 Task 模型(状态、优先级、进展百分比)
- 任务 API(列表、统计、进展更新、完成标记)
- 前端任务板块(统计卡片 + 任务列表)
- 进展可视化(进度条 + 进展记录)
This commit is contained in:
maoshen
2026-04-14 10:16:14 +00:00
parent b273789ae8
commit b680c573db
7 changed files with 292 additions and 17 deletions

View File

@@ -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)