feat: 实现任务拆分和分配功能

## 功能概述
实现完整的任务拆分、分配和进度跟踪功能,支持将任务拆分为子任务并分配给不同用户。

## Phase 1: 数据库层
- 新增 t_task_meta 表(任务元数据协调表)
- 新增 t_task_assignment_log 表(分配日志表)
- 新增 3 个权限条目(read/write/assign)
- 新增 SQLAlchemy ORM 模型

## Phase 2: 后端 API (Java)
- 新增 task-coordination-service 模块(32 个文件)
- 实现 11 个 API 端点:
  - 任务查询(列表、子任务、我的任务)
  - 任务拆分(支持 4 种策略)
  - 任务分配(单个、批量、重新分配、撤回)
  - 进度管理(查询、更新、聚合)
  - 分配日志
- 集成权限控制和路由规则

## Phase 3: 前端 UI (React + TypeScript)
- 新增 10 个文件(模型、API、组件、页面)
- 实现 5 个核心组件:
  - SplitTaskDialog - 任务拆分对话框
  - AssignTaskDialog - 任务分配对话框
  - BatchAssignDialog - 批量分配对话框
  - TaskProgressPanel - 进度面板
  - AssignmentLogDrawer - 分配记录
- 实现 2 个页面:
  - TaskCoordination - 任务管理主页
  - MyTasks - 我的任务页面
- 集成侧边栏菜单和路由

## 问题修复
- 修复 getMyTasks 分页参数缺失
- 修复子任务 assignee 信息缺失(批量查询优化)
- 修复 proportion 精度计算(余量分配)

## 技术亮点
- 零侵入设计:通过独立协调表实现,不修改现有模块
- 批量查询优化:避免 N+1 查询问题
- 4 种拆分策略:按比例/数量/文件/手动
- 进度自动聚合:子任务更新自动聚合到父任务
- 权限细粒度控制:read/write/assign 三级权限

## 验证
- Maven 编译: 零错误
- TypeScript 编译: 零错误
- Vite 生产构建: 成功
This commit is contained in:
2026-02-09 00:42:34 +08:00
parent 78624915b7
commit 71f8f7d1c3
51 changed files with 3765 additions and 0 deletions

View File

@@ -0,0 +1,155 @@
// ── Enums ────────────────────────────────────────────────
export enum TaskMetaStatus {
PENDING = "PENDING",
IN_PROGRESS = "IN_PROGRESS",
COMPLETED = "COMPLETED",
FAILED = "FAILED",
STOPPED = "STOPPED",
CANCELLED = "CANCELLED",
}
export enum SplitStrategy {
BY_COUNT = "BY_COUNT",
BY_FILE = "BY_FILE",
BY_PERCENTAGE = "BY_PERCENTAGE",
MANUAL = "MANUAL",
}
export enum TaskModule {
ANNOTATION = "ANNOTATION",
CLEANING = "CLEANING",
EVALUATION = "EVALUATION",
SYNTHESIS = "SYNTHESIS",
COLLECTION = "COLLECTION",
RATIO = "RATIO",
}
export enum AssignmentAction {
ASSIGN = "ASSIGN",
REASSIGN = "REASSIGN",
REVOKE = "REVOKE",
}
// ── Response Interfaces ──────────────────────────────────
export interface AssigneeInfo {
id: number;
username: string;
fullName?: string;
}
export interface TaskMetaDto {
id: string;
parentId?: string;
module: string;
refTaskId: string;
taskName: string;
status: TaskMetaStatus;
assignedTo?: number;
assigneeName?: string;
progress: number;
totalItems: number;
completedItems: number;
failedItems: number;
splitStrategy?: string;
splitConfig?: string;
priority: number;
deadline?: string;
remark?: string;
createdBy?: number;
createdAt: string;
updatedAt: string;
childCount: number;
assignee?: AssigneeInfo;
}
export interface TaskAssignmentLogDto {
id: number;
taskMetaId: string;
action: AssignmentAction;
userId?: number;
userName?: string;
remark?: string;
operatorId?: number;
operatorName?: string;
createdAt: string;
}
export interface ChildTaskProgressDto {
taskId: string;
taskName: string;
assignee?: AssigneeInfo;
progress: number;
totalItems: number;
completedItems: number;
failedItems: number;
status: TaskMetaStatus;
}
export interface TaskProgressResponse {
taskId: string;
taskName: string;
overallProgress: number;
totalItems: number;
completedItems: number;
failedItems: number;
status: TaskMetaStatus;
children: ChildTaskProgressDto[];
}
// ── Request Interfaces ───────────────────────────────────
export interface CreateTaskMetaRequest {
module: string;
refTaskId: string;
taskName: string;
assignedTo?: number;
totalItems?: number;
priority?: number;
deadline?: string;
}
export interface SplitAssignment {
userId?: number;
proportion?: number;
itemCount?: number;
taskName?: string;
}
export interface SplitTaskRequest {
strategy: SplitStrategy;
splitConfig?: Record<string, unknown>;
assignments: SplitAssignment[];
}
export interface AssignTaskRequest {
userId: number;
remark?: string;
}
export interface BatchTaskAssignment {
taskMetaId: string;
userId: number;
remark?: string;
}
export interface BatchAssignRequest {
assignments: BatchTaskAssignment[];
}
export interface UpdateProgressRequest {
progress?: number;
totalItems?: number;
completedItems?: number;
failedItems?: number;
status?: TaskMetaStatus;
}
// ── User (for assignment selectors) ──────────────────────
export interface UserOption {
id: number;
username: string;
fullName?: string;
}