v1.9.0 - 事件交叉Taskbar展示优化

This commit is contained in:
LINING-PC\lining
2026-01-30 16:53:59 +08:00
parent de6ce44000
commit 867c24186a
14 changed files with 1726 additions and 168 deletions
+28 -19
View File
@@ -86,7 +86,7 @@ const applyDataSource = (source: RawDataSource) => {
tasks.value = cloneData(payload.tasks ?? [])
milestones.value = cloneData(payload.milestones ?? [])
// 从独立的资源数据文件加载资源数据
// v1.9.0 从资源数据文件加载
const resourcePayload = resourcesData as { resources?: any[] }
if (resourcePayload.resources) {
resources.value = resourcePayload.resources.map(resData => {
@@ -100,9 +100,18 @@ const applyDataSource = (source: RawDataSource) => {
department: resData.department,
skills: resData.skills,
utilization: resData.utilization,
color: resData.color,
tasks: resData.tasks || []
})
})
// 更新assigneeOptions,添加资源作为责任人选项
const resourceAssigneeOptions = resources.value.map(res => ({
value: res.id as string,
label: res.name,
avatar: res.avatar
}))
assigneeOptions.value = [...resourceAssigneeOptions]
} else {
// 向后兼容:如果没有独立的资源数据,从任务中生成
const resourceMap = new Map<string, Resource>()
@@ -278,23 +287,9 @@ const resourceListConfig = computed<ResourceListConfig>(() => ({
key: 'name',
label: '资源名称',
visible: true,
width: 150,
width: 200,
formatter: (resource: Resource) => resource.name || '-',
},
{
key: 'type',
label: '类型',
visible: true,
width: 100,
formatter: (resource: Resource) => resource.type || '-',
},
{
key: 'taskCount',
label: '任务数',
visible: true,
width: 100,
formatter: (resource: Resource) => resource.tasks?.length?.toString() || '0',
},
{
key: 'utilization',
label: '利用率',
@@ -310,6 +305,20 @@ const resourceListConfig = computed<ResourceListConfig>(() => ({
return `${utilizationPercent}%`
},
},
{
key: 'type',
label: '类型',
visible: true,
width: 100,
formatter: (resource: Resource) => resource.type || '-',
},
{
key: 'taskCount',
label: '任务数',
visible: true,
width: 100,
formatter: (resource: Resource) => resource.tasks?.length?.toString() || '0',
},
],
defaultWidth:
widthUnit.value === '%'
@@ -2145,7 +2154,7 @@ const handleCustomMenuAction = (action: string, task: Task) => {
<template #header-name>
<div style="display: flex; align-items: center; gap: 6px;">
<img src="https://foruda.gitee.com/avatar/1764902889653058860/565633_nelson820125_1764902889.png!avatar200" width="32" height="32" style="border-radius: 50%;" />
<strong style="font-size: 14px;">{{ t.taskName }}</strong>
<strong style="font-size: 14px;">{{ viewMode === 'task' ? t.taskName : t.resourceName }}</strong>
</div>
</template>
<template #column-name="{ task, column, value }">
@@ -2203,10 +2212,10 @@ const handleCustomMenuAction = (action: string, task: Task) => {
</template>
<!-- 使用 TaskListColumn 组件自定义列 声明式模式 -->
<TaskListColumn prop="name" :label="t.taskName" width="300" align="center">
<TaskListColumn prop="name" :label="viewMode === 'task' ? t.taskName : t.resourceName" width="300" align="center">
<template #header>
<img src="https://foruda.gitee.com/avatar/1764902889653058860/565633_nelson820125_1764902889.png!avatar200" width="32" height="32" style="border-radius: 50%;" />
<strong style="font-size: 14px;">{{ t.taskName }}</strong>
<strong style="font-size: 14px;">{{ viewMode === 'task' ? t.taskName : t.resourceName }}</strong>
</template>
<template #default="scope">
<div style="display: flex; align-items: center; gap: 6px;">
+173
View File
@@ -0,0 +1,173 @@
{
"resources": [
{
"id": "resource-zhang",
"name": "张三 (前端开发)",
"type": "开发工程师",
"avatar": "https://i.pravatar.cc/150?img=11",
"department": "技术部",
"skills": ["Vue3", "TypeScript", "前端架构"],
"utilization": 125,
"color": "#2196f3",
"tasks": [
{
"id": 1001,
"name": "用户管理模块开发",
"startDate": "2026-01-20",
"endDate": "2026-01-30",
"progress": 60,
"type": "task",
"resources": [
{ "id": "resource-zhang", "name": "张三", "percent": 50 }
]
},
{
"id": 1002,
"name": "权限系统重构",
"startDate": "2026-01-22",
"endDate": "2026-02-05",
"progress": 30,
"type": "task",
"resources": [
{ "id": "resource-zhang", "name": "张三", "percent": 75 }
]
},
{
"id": 1003,
"name": "性能优化任务",
"startDate": "2026-02-08",
"endDate": "2026-02-15",
"progress": 0,
"type": "task",
"resources": [
{ "id": "resource-zhang", "name": "张三", "percent": 100 }
]
}
]
},
{
"id": "resource-li",
"name": "李四 (后端开发)",
"type": "开发工程师",
"avatar": "https://i.pravatar.cc/150?img=12",
"department": "技术部",
"skills": ["Java", "Spring Boot", "微服务"],
"utilization": 80,
"color": "#4caf50",
"tasks": [
{
"id": 2001,
"name": "API接口开发",
"startDate": "2026-01-15",
"endDate": "2026-01-28",
"progress": 80,
"type": "task",
"resources": [
{ "id": "resource-li", "name": "李四", "percent": 100 }
]
},
{
"id": 2002,
"name": "数据库优化",
"startDate": "2026-02-01",
"endDate": "2026-02-10",
"progress": 20,
"type": "task",
"resources": [
{ "id": "resource-li", "name": "李四", "percent": 50 }
]
}
]
},
{
"id": "resource-wang",
"name": "王五 (测试工程师)",
"type": "测试工程师",
"avatar": "https://i.pravatar.cc/150?img=13",
"department": "质量部",
"skills": ["自动化测试", "性能测试", "测试用例设计"],
"utilization": 60,
"color": "#ff9800",
"tasks": [
{
"id": 3001,
"name": "用户模块测试",
"startDate": "2026-01-25",
"endDate": "2026-02-03",
"progress": 40,
"type": "task",
"resources": [
{ "id": "resource-wang", "name": "王五", "percent": 75 }
]
},
{
"id": 3002,
"name": "集成测试",
"startDate": "2026-02-05",
"endDate": "2026-02-12",
"progress": 10,
"type": "task",
"resources": [
{ "id": "resource-wang", "name": "王五", "percent": 25 }
]
},
{
"id": 3003,
"name": "回归测试",
"startDate": "2026-02-14",
"endDate": "2026-02-20",
"progress": 0,
"type": "task",
"resources": [
{ "id": "resource-wang", "name": "王五", "percent": 50 }
]
}
]
},
{
"id": "resource-zhao",
"name": "赵六 (项目经理) [超负荷]",
"type": "项目管理",
"avatar": "https://i.pravatar.cc/150?img=14",
"department": "项目管理部",
"skills": ["项目管理", "敏捷开发", "团队协作"],
"utilization": 150,
"color": "#f56c6c",
"tasks": [
{
"id": 4001,
"name": "项目A管理",
"startDate": "2026-01-18",
"endDate": "2026-02-10",
"progress": 50,
"type": "task",
"resources": [
{ "id": "resource-zhao", "name": "赵六", "percent": 60 }
]
},
{
"id": 4002,
"name": "项目B管理",
"startDate": "2026-01-20",
"endDate": "2026-02-08",
"progress": 45,
"type": "task",
"resources": [
{ "id": "resource-zhao", "name": "赵六", "percent": 50 }
]
},
{
"id": 4003,
"name": "周报汇总",
"startDate": "2026-01-24",
"endDate": "2026-02-05",
"progress": 30,
"type": "task",
"resources": [
{ "id": "resource-zhao", "name": "赵六", "percent": 20 }
]
}
]
}
]
}
+268 -11
View File
@@ -8,6 +8,7 @@
"department": "临床研究部",
"skills": ["临床试验管理", "项目规划", "团队领导"],
"utilization": 85,
"color": "#2196f3",
"tasks": [
{
"id": 1000,
@@ -15,7 +16,10 @@
"startDate": "2025-01-01",
"endDate": "2027-12-31",
"progress": 15,
"type": "story"
"type": "story",
"resources": [
{ "id": "resource-chen", "name": "首席研究员 Dr. Chen", "percent": 100 }
]
},
{
"id": 5001,
@@ -23,7 +27,10 @@
"startDate": "2025-03-01",
"endDate": "2025-03-15",
"progress": 100,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-chen", "name": "首席研究员 Dr. Chen", "percent": 75 }
]
},
{
"id": 5002,
@@ -31,7 +38,10 @@
"startDate": "2025-06-10",
"endDate": "2025-06-12",
"progress": 80,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-chen", "name": "首席研究员 Dr. Chen", "percent": 50 }
]
}
]
},
@@ -43,6 +53,7 @@
"department": "I期临床研究组",
"skills": ["I期试验设计", "药代动力学", "安全性评估"],
"utilization": 92,
"color": "#4caf50",
"tasks": [
{
"id": 1100,
@@ -50,7 +61,10 @@
"startDate": "2025-01-01",
"endDate": "2025-08-31",
"progress": 65,
"type": "story"
"type": "story",
"resources": [
{ "id": "resource-wang", "name": "I期试验主任 Dr. Wang", "percent": 100 }
]
},
{
"id": 5003,
@@ -58,7 +72,10 @@
"startDate": "2025-03-01",
"endDate": "2025-04-30",
"progress": 100,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-wang", "name": "I期试验主任 Dr. Wang", "percent": 75 }
]
},
{
"id": 5004,
@@ -66,7 +83,10 @@
"startDate": "2025-05-01",
"endDate": "2025-07-31",
"progress": 45,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-wang", "name": "I期试验主任 Dr. Wang", "percent": 50 }
]
}
]
},
@@ -85,7 +105,10 @@
"startDate": "2025-01-01",
"endDate": "2025-02-28",
"progress": 100,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-li", "name": "方案设计师 李明", "percent": 100 }
]
},
{
"id": 5005,
@@ -93,7 +116,11 @@
"startDate": "2025-07-01",
"endDate": "2025-08-15",
"progress": 30,
"type": "task"
"type": "task",
"barColor": "#7B3FF2",
"resources": [
{ "id": "resource-li", "name": "方案设计师 李明", "percent": 75 }
]
}
]
},
@@ -105,6 +132,7 @@
"department": "数据管理与统计部",
"skills": ["统计分析", "数据可视化", "报告撰写"],
"utilization": 68,
"color": "#ff9800",
"tasks": [
{
"id": 1103,
@@ -112,7 +140,10 @@
"startDate": "2025-05-01",
"endDate": "2025-08-15",
"progress": 50,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-zhang", "name": "数据分析师 张伟", "percent": 100 }
]
},
{
"id": 5006,
@@ -120,7 +151,10 @@
"startDate": "2025-06-15",
"endDate": "2025-07-01",
"progress": 70,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-zhang", "name": "数据分析师 张伟", "percent": 50 }
]
},
{
"id": 5007,
@@ -128,7 +162,10 @@
"startDate": "2025-07-15",
"endDate": "2025-08-10",
"progress": 25,
"type": "task"
"type": "task",
"resources": [
{ "id": "resource-zhang", "name": "数据分析师 张伟", "percent": 75 }
]
}
]
},
@@ -229,6 +266,7 @@
"department": "III期临床研究组",
"skills": ["大型试验管理", "多中心协调", "里程碑管理"],
"utilization": 35,
"color": "#9c27b0",
"tasks": [
{
"id": 1300,
@@ -239,6 +277,225 @@
"type": "story"
}
]
},
{
"id": "resource-sun",
"name": "生物统计师 孙丽",
"type": "生物统计师",
"avatar": "https://i.pravatar.cc/150?img=9",
"department": "数据管理与统计部",
"skills": ["统计建模", "样本量计算", "数据分析"],
"utilization": 95,
"color": "#ff5733",
"tasks": [
{
"id": 6001,
"name": "I期统计分析计划",
"startDate": "2025-04-01",
"endDate": "2025-04-30",
"progress": 100,
"type": "task",
"resources": [
{ "id": "resource-sun", "name": "生物统计师 孙丽", "percent": 100 }
]
},
{
"id": 6002,
"name": "中期数据分析",
"startDate": "2025-05-15",
"endDate": "2025-06-15",
"progress": 75,
"type": "task",
"resources": [
{ "id": "resource-sun", "name": "生物统计师 孙丽", "percent": 75 }
]
},
{
"id": 6003,
"name": "II期样本量计算",
"startDate": "2025-05-20",
"endDate": "2025-06-10",
"progress": 85,
"type": "task",
"resources": [
{ "id": "resource-sun", "name": "生物统计师 孙丽", "percent": 50 }
]
},
{
"id": 6004,
"name": "最终报告统计",
"startDate": "2025-08-01",
"endDate": "2025-08-25",
"progress": 30,
"type": "task",
"resources": [
{ "id": "resource-sun", "name": "生物统计师 孙丽", "percent": 100 }
]
}
]
},
{
"id": "resource-zhou",
"name": "临床监查员 周杰",
"type": "临床监查员",
"avatar": "https://i.pravatar.cc/150?img=10",
"department": "临床监查部",
"skills": ["现场监查", "数据核查", "问题解决"],
"utilization": 110,
"color": "#3498db",
"tasks": [
{
"id": 6005,
"name": "中心A启动访视",
"startDate": "2025-03-10",
"endDate": "2025-03-15",
"progress": 100,
"type": "task",
"resources": [
{ "id": "resource-zhou", "name": "临床监查员 周杰", "percent": 100 }
]
},
{
"id": 6006,
"name": "中心B监查访视",
"startDate": "2025-03-12",
"endDate": "2025-03-18",
"progress": 100,
"type": "task",
"resources": [
{ "id": "resource-zhou", "name": "临床监查员 周杰", "percent": 75 }
]
},
{
"id": 6007,
"name": "中心C数据核查",
"startDate": "2025-04-01",
"endDate": "2025-04-10",
"progress": 90,
"type": "task",
"resources": [
{ "id": "resource-zhou", "name": "临床监查员 周杰", "percent": 50 }
]
},
{
"id": 6008,
"name": "中心D关闭访视",
"startDate": "2025-04-05",
"endDate": "2025-04-12",
"progress": 70,
"type": "task",
"resources": [
{ "id": "resource-zhou", "name": "临床监查员 周杰", "percent": 25 }
]
}
]
},
{
"id": "resource-xu",
"name": "医学撰写员 徐静",
"type": "医学撰写员",
"avatar": "https://i.pravatar.cc/150?img=11",
"department": "医学事务部",
"skills": ["研究报告撰写", "文献检索", "医学翻译"],
"utilization": 72,
"color": "#e74c3c",
"tasks": [
{
"id": 6009,
"name": "研究方案撰写",
"startDate": "2025-01-15",
"endDate": "2025-02-15",
"progress": 100,
"type": "task"
},
{
"id": 6010,
"name": "中期报告撰写",
"startDate": "2025-06-01",
"endDate": "2025-07-01",
"progress": 60,
"type": "task"
},
{
"id": 6011,
"name": "研究者手册更新",
"startDate": "2025-07-15",
"endDate": "2025-08-15",
"progress": 20,
"type": "task"
}
]
},
{
"id": "resource-ma",
"name": "药物警戒专员 马云飞",
"type": "药物警戒",
"avatar": "https://i.pravatar.cc/150?img=12",
"department": "药物警戒部",
"skills": ["不良事件管理", "安全性报告", "信号检测"],
"utilization": 88,
"color": "#f39c12",
"tasks": [
{
"id": 6012,
"name": "SAE快速报告",
"startDate": "2025-03-01",
"endDate": "2025-03-31",
"progress": 100,
"type": "task"
},
{
"id": 6013,
"name": "安全性季度报告",
"startDate": "2025-03-15",
"endDate": "2025-04-01",
"progress": 100,
"type": "task"
},
{
"id": 6014,
"name": "DSUR年度报告",
"startDate": "2025-06-01",
"endDate": "2025-07-15",
"progress": 45,
"type": "task"
}
]
},
{
"id": "resource-gao",
"name": "注册事务专员 高敏",
"type": "注册事务",
"avatar": "https://i.pravatar.cc/150?img=13",
"department": "注册事务部",
"skills": ["IND申报", "监管沟通", "文件管理"],
"utilization": 65,
"tasks": [
{
"id": 6015,
"name": "IND申报准备",
"startDate": "2024-12-01",
"endDate": "2025-01-15",
"progress": 100,
"type": "task"
},
{
"id": 6016,
"name": "与NMPA沟通会议",
"startDate": "2025-02-10",
"endDate": "2025-02-12",
"progress": 100,
"type": "task"
},
{
"id": 6017,
"name": "II期IND补充申请",
"startDate": "2025-08-01",
"endDate": "2025-08-31",
"progress": 15,
"type": "task"
}
]
}
]
}