diff --git a/demo/App.vue b/demo/App.vue index 7fb0ec8..215794e 100644 --- a/demo/App.vue +++ b/demo/App.vue @@ -831,7 +831,7 @@ const handleTaskUpdateEvent = (e: { task: Task }) => { // 任务添加事件处理器 const handleTaskAddEvent = (e: { task: Task }) => { // 打印全部的tasks - console.log('当前所有任务:', tasks.value) + //console.log('当前所有任务:', tasks.value) const newTask = e.task showMessage(`Demo 任务[${newTask.name}] 已创建`, 'success') diff --git a/demo/data-resources-large.json b/demo/data-resources-large.json index 3e625a2..1595734 100644 --- a/demo/data-resources-large.json +++ b/demo/data-resources-large.json @@ -4,7 +4,7 @@ "id": "resource-001", "name": "资源1 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=1", + "avatar": "/50-11.jpg", "department": "临床部", "skills": [ "技能A", @@ -470,7 +470,7 @@ "id": "resource-002", "name": "资源2 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=2", + "avatar": "/50-12.jpg", "department": "质量部", "skills": [ "技能A", @@ -921,7 +921,7 @@ "id": "resource-003", "name": "资源3 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=3", + "avatar": "/50-13.jpg", "department": "注册部", "skills": [ "技能A", @@ -1387,7 +1387,7 @@ "id": "resource-004", "name": "资源4 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=4", + "avatar": "/50-14.jpg", "department": "生产部", "skills": [ "技能A", @@ -1808,7 +1808,7 @@ "id": "resource-005", "name": "资源5 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=5", + "avatar": "/50-15.jpg", "department": "市场部", "skills": [ "技能A", @@ -2259,7 +2259,7 @@ "id": "resource-006", "name": "资源6 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=6", + "avatar": "/50-16.jpg", "department": "工程部", "skills": [ "技能A", @@ -2650,7 +2650,7 @@ "id": "resource-007", "name": "资源7 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=7", + "avatar": "/50-17.jpg", "department": "测试部", "skills": [ "技能A", @@ -2658,7 +2658,7 @@ "技能C" ], "utilization": 93, - "color": "#ffc107", + "color": "#a8a8a8", "tasks": [ { "id": 7000, @@ -3101,7 +3101,7 @@ "id": "resource-008", "name": "资源8 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=8", + "avatar": "/50-18.jpg", "department": "研发部", "skills": [ "技能A", @@ -3447,7 +3447,7 @@ "id": "resource-009", "name": "资源9 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=9", + "avatar": "/50-19.jpg", "department": "临床部", "skills": [ "技能A", @@ -3913,7 +3913,7 @@ "id": "resource-010", "name": "资源10 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=10", + "avatar": "/50-20.jpg", "department": "质量部", "skills": [ "技能A", @@ -4244,7 +4244,7 @@ "id": "resource-011", "name": "资源11 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=11", + "avatar": "/50-21.jpg", "department": "注册部", "skills": [ "技能A", @@ -4665,7 +4665,7 @@ "id": "resource-012", "name": "资源12 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=12", + "avatar": "/50-22.jpg", "department": "生产部", "skills": [ "技能A", @@ -5011,7 +5011,7 @@ "id": "resource-013", "name": "资源13 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=13", + "avatar": "/50-23.jpg", "department": "市场部", "skills": [ "技能A", @@ -5387,7 +5387,7 @@ "id": "resource-014", "name": "资源14 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=14", + "avatar": "/50-24.jpg", "department": "工程部", "skills": [ "技能A", @@ -5778,7 +5778,7 @@ "id": "resource-015", "name": "资源15 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=15", + "avatar": "/50-25.jpg", "department": "测试部", "skills": [ "技能A", @@ -6214,7 +6214,7 @@ "id": "resource-016", "name": "资源16 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=16", + "avatar": "/50-26.jpg", "department": "研发部", "skills": [ "技能A", @@ -6530,7 +6530,7 @@ "id": "resource-017", "name": "资源17 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=17", + "avatar": "/50-27.jpg", "department": "临床部", "skills": [ "技能A", @@ -6981,7 +6981,7 @@ "id": "resource-018", "name": "资源18 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=18", + "avatar": "/50-28.jpg", "department": "质量部", "skills": [ "技能A", @@ -7357,7 +7357,7 @@ "id": "resource-019", "name": "资源19 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=19", + "avatar": "/50-29.jpg", "department": "注册部", "skills": [ "技能A", @@ -7718,7 +7718,7 @@ "id": "resource-020", "name": "资源20 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=20", + "avatar": "/50-30.jpg", "department": "生产部", "skills": [ "技能A", @@ -8154,7 +8154,7 @@ "id": "resource-021", "name": "资源21 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=21", + "avatar": "/50-31.jpg", "department": "市场部", "skills": [ "技能A", @@ -8515,7 +8515,7 @@ "id": "resource-022", "name": "资源22 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=22", + "avatar": "/50-32.jpg", "department": "工程部", "skills": [ "技能A", @@ -8921,7 +8921,7 @@ "id": "resource-023", "name": "资源23 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=23", + "avatar": "/50-33.jpg", "department": "测试部", "skills": [ "技能A", @@ -9297,7 +9297,7 @@ "id": "resource-024", "name": "资源24 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=24", + "avatar": "/50-34.jpg", "department": "研发部", "skills": [ "技能A", @@ -9718,7 +9718,7 @@ "id": "resource-025", "name": "资源25 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=25", + "avatar": "/50-35.jpg", "department": "临床部", "skills": [ "技能A", @@ -10064,7 +10064,7 @@ "id": "resource-026", "name": "资源26 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=26", + "avatar": "/50-36.jpg", "department": "质量部", "skills": [ "技能A", @@ -10455,7 +10455,7 @@ "id": "resource-027", "name": "资源27 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=27", + "avatar": "/50-37.jpg", "department": "注册部", "skills": [ "技能A", @@ -10771,7 +10771,7 @@ "id": "resource-028", "name": "资源28 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=28", + "avatar": "/50-38.jpg", "department": "生产部", "skills": [ "技能A", @@ -11192,7 +11192,7 @@ "id": "resource-029", "name": "资源29 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=29", + "avatar": "/50-39.jpg", "department": "市场部", "skills": [ "技能A", @@ -11598,7 +11598,7 @@ "id": "resource-030", "name": "资源30 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=30", + "avatar": "/50-40.jpg", "department": "工程部", "skills": [ "技能A", @@ -11944,7 +11944,7 @@ "id": "resource-031", "name": "资源31 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=31", + "avatar": "/50-41.jpg", "department": "测试部", "skills": [ "技能A", @@ -12410,7 +12410,7 @@ "id": "resource-032", "name": "资源32 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=32", + "avatar": "/50-42.jpg", "department": "研发部", "skills": [ "技能A", @@ -12816,7 +12816,7 @@ "id": "resource-033", "name": "资源33 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=33", + "avatar": "/50-43.jpg", "department": "临床部", "skills": [ "技能A", @@ -13222,7 +13222,7 @@ "id": "resource-034", "name": "资源34 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=34", + "avatar": "/50-44.jpg", "department": "质量部", "skills": [ "技能A", @@ -13688,7 +13688,7 @@ "id": "resource-035", "name": "资源35 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=35", + "avatar": "/50-45.jpg", "department": "注册部", "skills": [ "技能A", @@ -14139,7 +14139,7 @@ "id": "resource-036", "name": "资源36 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=36", + "avatar": "/50-46.jpg", "department": "生产部", "skills": [ "技能A", @@ -14590,7 +14590,7 @@ "id": "resource-037", "name": "资源37 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=37", + "avatar": "/50-47.jpg", "department": "市场部", "skills": [ "技能A", @@ -14951,7 +14951,7 @@ "id": "resource-038", "name": "资源38 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=38", + "avatar": "/50-48.jpg", "department": "工程部", "skills": [ "技能A", @@ -15357,7 +15357,7 @@ "id": "resource-039", "name": "资源39 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=39", + "avatar": "/50-49.jpg", "department": "测试部", "skills": [ "技能A", @@ -15673,7 +15673,7 @@ "id": "resource-040", "name": "资源40 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=40", + "avatar": "/50-50.jpg", "department": "研发部", "skills": [ "技能A", @@ -16109,7 +16109,7 @@ "id": "resource-041", "name": "资源41 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=41", + "avatar": "/50-51.jpg", "department": "临床部", "skills": [ "技能A", @@ -16485,7 +16485,7 @@ "id": "resource-042", "name": "资源42 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=42", + "avatar": "/50-52.jpg", "department": "质量部", "skills": [ "技能A", @@ -16906,7 +16906,7 @@ "id": "resource-043", "name": "资源43 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=43", + "avatar": "/50-53.jpg", "department": "注册部", "skills": [ "技能A", @@ -17252,7 +17252,7 @@ "id": "resource-044", "name": "资源44 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=44", + "avatar": "/50-54.jpg", "department": "生产部", "skills": [ "技能A", @@ -17583,7 +17583,7 @@ "id": "resource-045", "name": "资源45 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=45", + "avatar": "/50-55.jpg", "department": "市场部", "skills": [ "技能A", @@ -17944,7 +17944,7 @@ "id": "resource-046", "name": "资源46 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=46", + "avatar": "/50-56.jpg", "department": "工程部", "skills": [ "技能A", @@ -18380,7 +18380,7 @@ "id": "resource-047", "name": "资源47 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=47", + "avatar": "/50-57.jpg", "department": "测试部", "skills": [ "技能A", @@ -18726,7 +18726,7 @@ "id": "resource-048", "name": "资源48 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=48", + "avatar": "/50-58.jpg", "department": "研发部", "skills": [ "技能A", @@ -19147,7 +19147,7 @@ "id": "resource-049", "name": "资源49 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=49", + "avatar": "/50-59.jpg", "department": "临床部", "skills": [ "技能A", @@ -19493,7 +19493,7 @@ "id": "resource-050", "name": "资源50 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=50", + "avatar": "/50-60.jpg", "department": "质量部", "skills": [ "技能A", @@ -19914,7 +19914,7 @@ "id": "resource-051", "name": "资源51 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=51", + "avatar": "/50-61.jpg", "department": "注册部", "skills": [ "技能A", @@ -20320,7 +20320,7 @@ "id": "resource-052", "name": "资源52 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=52", + "avatar": "/50-62.jpg", "department": "生产部", "skills": [ "技能A", @@ -20651,7 +20651,7 @@ "id": "resource-053", "name": "资源53 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=53", + "avatar": "/50-63.jpg", "department": "市场部", "skills": [ "技能A", @@ -21027,7 +21027,7 @@ "id": "resource-054", "name": "资源54 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=54", + "avatar": "/50-64.jpg", "department": "工程部", "skills": [ "技能A", @@ -21343,7 +21343,7 @@ "id": "resource-055", "name": "资源55 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=55", + "avatar": "/50-65.jpg", "department": "测试部", "skills": [ "技能A", @@ -21779,7 +21779,7 @@ "id": "resource-056", "name": "资源56 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=56", + "avatar": "/50-66.jpg", "department": "研发部", "skills": [ "技能A", @@ -22245,7 +22245,7 @@ "id": "resource-057", "name": "资源57 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=57", + "avatar": "/50-67.jpg", "department": "临床部", "skills": [ "技能A", @@ -22561,7 +22561,7 @@ "id": "resource-058", "name": "资源58 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=58", + "avatar": "/50-68.jpg", "department": "质量部", "skills": [ "技能A", @@ -22937,7 +22937,7 @@ "id": "resource-059", "name": "资源59 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=59", + "avatar": "/50-69.jpg", "department": "注册部", "skills": [ "技能A", @@ -23373,7 +23373,7 @@ "id": "resource-060", "name": "资源60 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=60", + "avatar": "/50-70.jpg", "department": "生产部", "skills": [ "技能A", @@ -23794,7 +23794,7 @@ "id": "resource-061", "name": "资源61 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=61", + "avatar": "/50-71.jpg", "department": "市场部", "skills": [ "技能A", @@ -24110,7 +24110,7 @@ "id": "resource-062", "name": "资源62 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=62", + "avatar": "/50-72.jpg", "department": "工程部", "skills": [ "技能A", @@ -24531,7 +24531,7 @@ "id": "resource-063", "name": "资源63 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=63", + "avatar": "/50-73.jpg", "department": "测试部", "skills": [ "技能A", @@ -24982,7 +24982,7 @@ "id": "resource-064", "name": "资源64 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=64", + "avatar": "/50-74.jpg", "department": "研发部", "skills": [ "技能A", @@ -25313,7 +25313,7 @@ "id": "resource-065", "name": "资源65 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=65", + "avatar": "/50-75.jpg", "department": "临床部", "skills": [ "技能A", @@ -25719,7 +25719,7 @@ "id": "resource-066", "name": "资源66 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=66", + "avatar": "/50-76.jpg", "department": "质量部", "skills": [ "技能A", @@ -26125,7 +26125,7 @@ "id": "resource-067", "name": "资源67 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=67", + "avatar": "/50-77.jpg", "department": "注册部", "skills": [ "技能A", @@ -26531,7 +26531,7 @@ "id": "resource-068", "name": "资源68 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=68", + "avatar": "/50-78.jpg", "department": "生产部", "skills": [ "技能A", @@ -26937,7 +26937,7 @@ "id": "resource-069", "name": "资源69 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=69", + "avatar": "/50-79.jpg", "department": "市场部", "skills": [ "技能A", @@ -27403,7 +27403,7 @@ "id": "resource-070", "name": "资源70 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=70", + "avatar": "/50-80.jpg", "department": "工程部", "skills": [ "技能A", @@ -27794,7 +27794,7 @@ "id": "resource-071", "name": "资源71 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=71", + "avatar": "/50-81.jpg", "department": "测试部", "skills": [ "技能A", @@ -28140,7 +28140,7 @@ "id": "resource-072", "name": "资源72 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=72", + "avatar": "/50-82.jpg", "department": "研发部", "skills": [ "技能A", @@ -28561,7 +28561,7 @@ "id": "resource-073", "name": "资源73 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=73", + "avatar": "/50-83.jpg", "department": "临床部", "skills": [ "技能A", @@ -28982,7 +28982,7 @@ "id": "resource-074", "name": "资源74 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=74", + "avatar": "/50-84.jpg", "department": "质量部", "skills": [ "技能A", @@ -29298,7 +29298,7 @@ "id": "resource-075", "name": "资源75 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=75", + "avatar": "/50-85.jpg", "department": "注册部", "skills": [ "技能A", @@ -29689,7 +29689,7 @@ "id": "resource-076", "name": "资源76 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=76", + "avatar": "/50-86.jpg", "department": "生产部", "skills": [ "技能A", @@ -30110,7 +30110,7 @@ "id": "resource-077", "name": "资源77 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=77", + "avatar": "/50-87.jpg", "department": "市场部", "skills": [ "技能A", @@ -30546,7 +30546,7 @@ "id": "resource-078", "name": "资源78 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=78", + "avatar": "/50-88.jpg", "department": "工程部", "skills": [ "技能A", @@ -30967,7 +30967,7 @@ "id": "resource-079", "name": "资源79 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=79", + "avatar": "/50-89.jpg", "department": "测试部", "skills": [ "技能A", @@ -31328,7 +31328,7 @@ "id": "resource-080", "name": "资源80 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=80", + "avatar": "/50-90.jpg", "department": "研发部", "skills": [ "技能A", @@ -31704,7 +31704,7 @@ "id": "resource-081", "name": "资源81 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=81", + "avatar": "/50-91.jpg", "department": "临床部", "skills": [ "技能A", @@ -32020,7 +32020,7 @@ "id": "resource-082", "name": "资源82 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=82", + "avatar": "/50-92.jpg", "department": "质量部", "skills": [ "技能A", @@ -32366,7 +32366,7 @@ "id": "resource-083", "name": "资源83 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=83", + "avatar": "/50-93.jpg", "department": "注册部", "skills": [ "技能A", @@ -32712,7 +32712,7 @@ "id": "resource-084", "name": "资源84 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=84", + "avatar": "/50-94.jpg", "department": "生产部", "skills": [ "技能A", @@ -33058,7 +33058,7 @@ "id": "resource-085", "name": "资源85 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=85", + "avatar": "/50-95.jpg", "department": "市场部", "skills": [ "技能A", @@ -33374,7 +33374,7 @@ "id": "resource-086", "name": "资源86 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=86", + "avatar": "/50-96.jpg", "department": "工程部", "skills": [ "技能A", @@ -33825,7 +33825,7 @@ "id": "resource-087", "name": "资源87 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=87", + "avatar": "/50-97.jpg", "department": "测试部", "skills": [ "技能A", @@ -34186,7 +34186,7 @@ "id": "resource-088", "name": "资源88 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=88", + "avatar": "/50-98.jpg", "department": "研发部", "skills": [ "技能A", @@ -34517,7 +34517,7 @@ "id": "resource-089", "name": "资源89 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=89", + "avatar": "/50-99.jpg", "department": "临床部", "skills": [ "技能A", @@ -34953,7 +34953,7 @@ "id": "resource-090", "name": "资源90 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=90", + "avatar": "/50-100.jpg", "department": "质量部", "skills": [ "技能A", @@ -35404,7 +35404,7 @@ "id": "resource-091", "name": "资源91 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=91", + "avatar": "/50-101.jpg", "department": "注册部", "skills": [ "技能A", @@ -35795,7 +35795,7 @@ "id": "resource-092", "name": "资源92 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=92", + "avatar": "/50-102.jpg", "department": "生产部", "skills": [ "技能A", @@ -36186,7 +36186,7 @@ "id": "resource-093", "name": "资源93 - 项目经理", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=93", + "avatar": "/50-103.jpg", "department": "市场部", "skills": [ "技能A", @@ -36517,7 +36517,7 @@ "id": "resource-094", "name": "资源94 - 工程师", "type": "工程师", - "avatar": "https://i.pravatar.cc/150?img=94", + "avatar": "/50-104.jpg", "department": "工程部", "skills": [ "技能A", @@ -36863,7 +36863,7 @@ "id": "resource-095", "name": "资源95 - 测试工程师", "type": "测试工程师", - "avatar": "https://i.pravatar.cc/150?img=95", + "avatar": "/50-105.jpg", "department": "测试部", "skills": [ "技能A", @@ -37194,7 +37194,7 @@ "id": "resource-096", "name": "资源96 - 研究员", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=96", + "avatar": "/50-106.jpg", "department": "研发部", "skills": [ "技能A", @@ -37615,7 +37615,7 @@ "id": "resource-097", "name": "资源97 - 试验主任", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=97", + "avatar": "/50-107.jpg", "department": "临床部", "skills": [ "技能A", @@ -38066,7 +38066,7 @@ "id": "resource-098", "name": "资源98 - 数据分析师", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=98", + "avatar": "/50-108.jpg", "department": "质量部", "skills": [ "技能A", @@ -38517,7 +38517,7 @@ "id": "resource-099", "name": "资源99 - 质量专员", "type": "质量专员", - "avatar": "https://i.pravatar.cc/150?img=99", + "avatar": "/50-109.jpg", "department": "注册部", "skills": [ "技能A", @@ -38863,7 +38863,7 @@ "id": "resource-100", "name": "资源100 - 注册专员", "type": "注册专员", - "avatar": "https://i.pravatar.cc/150?img=100", + "avatar": "/50-110.jpg", "department": "生产部", "skills": [ "技能A", diff --git a/demo/data-resources.json b/demo/data-resources.json index d4217e0..bbe8bf7 100644 --- a/demo/data-resources.json +++ b/demo/data-resources.json @@ -4,7 +4,7 @@ "id": "resource-chen", "name": "首席研究员 Dr. Chen", "type": "研究员", - "avatar": "https://i.pravatar.cc/150?img=1", + "avatar": "/50-11.jpg", "department": "临床研究部", "skills": ["临床试验管理", "项目规划", "团队领导"], "utilization": 85, @@ -49,7 +49,7 @@ "id": "resource-wang", "name": "I期试验主任 Dr. Wang", "type": "试验主任", - "avatar": "https://i.pravatar.cc/150?img=2", + "avatar": "/50-12.jpg", "department": "I期临床研究组", "skills": ["I期试验设计", "药代动力学", "安全性评估"], "utilization": 92, @@ -94,7 +94,7 @@ "id": "resource-li", "name": "方案设计师 李明", "type": "方案设计师", - "avatar": "https://i.pravatar.cc/150?img=3", + "avatar": "/50-13.jpg", "department": "临床研究部", "skills": ["方案设计", "伦理审查", "监管申报"], "utilization": 75, @@ -128,7 +128,7 @@ "id": "resource-zhang", "name": "数据分析师 张伟", "type": "数据分析师", - "avatar": "https://i.pravatar.cc/150?img=4", + "avatar": "/50-14.jpg", "department": "数据管理与统计部", "skills": ["统计分析", "数据可视化", "报告撰写"], "utilization": 68, @@ -173,7 +173,7 @@ "id": "resource-liu", "name": "质量保证专员 刘芳", "type": "质量保证", - "avatar": "https://i.pravatar.cc/150?img=5", + "avatar": "/50-15.jpg", "department": "质量保证部", "skills": ["GCP审计", "质量控制", "SOP管理"], "utilization": 88, @@ -208,7 +208,7 @@ "id": "resource-zhao", "name": "II期试验协调员 赵敏", "type": "试验协调员", - "avatar": "https://i.pravatar.cc/150?img=6", + "avatar": "/50-16.jpg", "department": "II期临床研究组", "skills": ["试验协调", "中心管理", "受试者跟踪"], "utilization": 55, @@ -235,7 +235,7 @@ "id": "resource-wu", "name": "设备管理员 吴强", "type": "设备管理", - "avatar": "https://i.pravatar.cc/150?img=7", + "avatar": "/50-17.jpg", "department": "设备与后勤部", "skills": ["设备维护", "库存管理", "供应链协调"], "utilization": 42, @@ -262,7 +262,7 @@ "id": "resource-huang", "name": "III期项目经理 黄建国", "type": "项目经理", - "avatar": "https://i.pravatar.cc/150?img=8", + "avatar": "/50-18.jpg", "department": "III期临床研究组", "skills": ["大型试验管理", "多中心协调", "里程碑管理"], "utilization": 35, @@ -282,7 +282,7 @@ "id": "resource-sun", "name": "生物统计师 孙丽", "type": "生物统计师", - "avatar": "https://i.pravatar.cc/150?img=9", + "avatar": "/50-19.jpg", "department": "数据管理与统计部", "skills": ["统计建模", "样本量计算", "数据分析"], "utilization": 95, @@ -338,7 +338,7 @@ "id": "resource-zhou", "name": "临床监查员 周杰", "type": "临床监查员", - "avatar": "https://i.pravatar.cc/150?img=10", + "avatar": "/50-20.jpg", "department": "临床监查部", "skills": ["现场监查", "数据核查", "问题解决"], "utilization": 110, @@ -394,7 +394,7 @@ "id": "resource-xu", "name": "医学撰写员 徐静", "type": "医学撰写员", - "avatar": "https://i.pravatar.cc/150?img=11", + "avatar": "/50-21.jpg", "department": "医学事务部", "skills": ["研究报告撰写", "文献检索", "医学翻译"], "utilization": 72, @@ -439,7 +439,7 @@ "id": "resource-ma", "name": "药物警戒专员 马云飞", "type": "药物警戒", - "avatar": "https://i.pravatar.cc/150?img=12", + "avatar": "/50-22.jpg", "department": "药物警戒部", "skills": ["不良事件管理", "安全性报告", "信号检测"], "utilization": 88, @@ -475,7 +475,7 @@ "id": "resource-gao", "name": "注册事务专员 高敏", "type": "注册事务", - "avatar": "https://i.pravatar.cc/150?img=13", + "avatar": "/50-23.jpg", "department": "注册事务部", "skills": ["IND申报", "监管沟通", "文件管理"], "utilization": 65, diff --git a/demo/public/50-11.jpg b/demo/public/50-11.jpg new file mode 100644 index 0000000..2b6139d Binary files /dev/null and b/demo/public/50-11.jpg differ diff --git a/demo/public/50-12.jpg b/demo/public/50-12.jpg new file mode 100644 index 0000000..5c4483d Binary files /dev/null and b/demo/public/50-12.jpg differ diff --git a/demo/public/50-13.jpg b/demo/public/50-13.jpg new file mode 100644 index 0000000..5e1f824 Binary files /dev/null and b/demo/public/50-13.jpg differ diff --git a/demo/public/50-14.jpg b/demo/public/50-14.jpg new file mode 100644 index 0000000..fb81042 Binary files /dev/null and b/demo/public/50-14.jpg differ diff --git a/demo/public/50-15.jpg b/demo/public/50-15.jpg new file mode 100644 index 0000000..eef017d Binary files /dev/null and b/demo/public/50-15.jpg differ diff --git a/demo/public/50-16.jpg b/demo/public/50-16.jpg new file mode 100644 index 0000000..3aea5a1 Binary files /dev/null and b/demo/public/50-16.jpg differ diff --git a/demo/public/50-17.jpg b/demo/public/50-17.jpg new file mode 100644 index 0000000..b41df76 Binary files /dev/null and b/demo/public/50-17.jpg differ diff --git a/demo/public/50-18.jpg b/demo/public/50-18.jpg new file mode 100644 index 0000000..1fed73b Binary files /dev/null and b/demo/public/50-18.jpg differ diff --git a/demo/public/50-19.jpg b/demo/public/50-19.jpg new file mode 100644 index 0000000..774ccab Binary files /dev/null and b/demo/public/50-19.jpg differ diff --git a/demo/public/50-20.jpg b/demo/public/50-20.jpg new file mode 100644 index 0000000..b59eeee Binary files /dev/null and b/demo/public/50-20.jpg differ diff --git a/demo/public/50-21.jpg b/demo/public/50-21.jpg new file mode 100644 index 0000000..95656e5 Binary files /dev/null and b/demo/public/50-21.jpg differ diff --git a/demo/public/50-22.jpg b/demo/public/50-22.jpg new file mode 100644 index 0000000..e4b5fdc Binary files /dev/null and b/demo/public/50-22.jpg differ diff --git a/demo/public/50-23.jpg b/demo/public/50-23.jpg new file mode 100644 index 0000000..0ed5dc0 Binary files /dev/null and b/demo/public/50-23.jpg differ diff --git a/demo/public/50-24.jpg b/demo/public/50-24.jpg new file mode 100644 index 0000000..3f43aa0 Binary files /dev/null and b/demo/public/50-24.jpg differ diff --git a/demo/public/50-25.jpg b/demo/public/50-25.jpg new file mode 100644 index 0000000..428ad30 Binary files /dev/null and b/demo/public/50-25.jpg differ diff --git a/demo/public/50-26.jpg b/demo/public/50-26.jpg new file mode 100644 index 0000000..44c98be Binary files /dev/null and b/demo/public/50-26.jpg differ diff --git a/demo/public/50-27.jpg b/demo/public/50-27.jpg new file mode 100644 index 0000000..b343f74 Binary files /dev/null and b/demo/public/50-27.jpg differ diff --git a/demo/public/50-28.jpg b/demo/public/50-28.jpg new file mode 100644 index 0000000..9c37b83 Binary files /dev/null and b/demo/public/50-28.jpg differ diff --git a/demo/public/50-29.jpg b/demo/public/50-29.jpg new file mode 100644 index 0000000..360d978 Binary files /dev/null and b/demo/public/50-29.jpg differ diff --git a/demo/public/50-30.jpg b/demo/public/50-30.jpg new file mode 100644 index 0000000..a19777a Binary files /dev/null and b/demo/public/50-30.jpg differ diff --git a/demo/public/50-31.jpg b/demo/public/50-31.jpg new file mode 100644 index 0000000..ae68c96 Binary files /dev/null and b/demo/public/50-31.jpg differ diff --git a/demo/public/50-32.jpg b/demo/public/50-32.jpg new file mode 100644 index 0000000..17bd80d Binary files /dev/null and b/demo/public/50-32.jpg differ diff --git a/demo/public/50-33.jpg b/demo/public/50-33.jpg new file mode 100644 index 0000000..17c508f Binary files /dev/null and b/demo/public/50-33.jpg differ diff --git a/demo/public/50-34.jpg b/demo/public/50-34.jpg new file mode 100644 index 0000000..afd7906 Binary files /dev/null and b/demo/public/50-34.jpg differ diff --git a/demo/public/50-35.jpg b/demo/public/50-35.jpg new file mode 100644 index 0000000..16d0e97 Binary files /dev/null and b/demo/public/50-35.jpg differ diff --git a/demo/public/50-36.jpg b/demo/public/50-36.jpg new file mode 100644 index 0000000..4c52cc1 Binary files /dev/null and b/demo/public/50-36.jpg differ diff --git a/demo/public/50-37.jpg b/demo/public/50-37.jpg new file mode 100644 index 0000000..f2f1c1d Binary files /dev/null and b/demo/public/50-37.jpg differ diff --git a/demo/public/50-38.jpg b/demo/public/50-38.jpg new file mode 100644 index 0000000..9bc61b6 Binary files /dev/null and b/demo/public/50-38.jpg differ diff --git a/demo/public/50-39.jpg b/demo/public/50-39.jpg new file mode 100644 index 0000000..16e45b4 Binary files /dev/null and b/demo/public/50-39.jpg differ diff --git a/demo/public/50-40.jpg b/demo/public/50-40.jpg new file mode 100644 index 0000000..b00f70d Binary files /dev/null and b/demo/public/50-40.jpg differ diff --git a/demo/public/50-41.jpg b/demo/public/50-41.jpg new file mode 100644 index 0000000..0332562 Binary files /dev/null and b/demo/public/50-41.jpg differ diff --git a/demo/public/50-42.jpg b/demo/public/50-42.jpg new file mode 100644 index 0000000..de1d06b Binary files /dev/null and b/demo/public/50-42.jpg differ diff --git a/demo/public/50-43.jpg b/demo/public/50-43.jpg new file mode 100644 index 0000000..e0dccde Binary files /dev/null and b/demo/public/50-43.jpg differ diff --git a/demo/public/50-44.jpg b/demo/public/50-44.jpg new file mode 100644 index 0000000..f239ecc Binary files /dev/null and b/demo/public/50-44.jpg differ diff --git a/demo/public/50-45.jpg b/demo/public/50-45.jpg new file mode 100644 index 0000000..a9ca74b Binary files /dev/null and b/demo/public/50-45.jpg differ diff --git a/demo/public/50-46.jpg b/demo/public/50-46.jpg new file mode 100644 index 0000000..997f039 Binary files /dev/null and b/demo/public/50-46.jpg differ diff --git a/demo/public/50-47.jpg b/demo/public/50-47.jpg new file mode 100644 index 0000000..48b0683 Binary files /dev/null and b/demo/public/50-47.jpg differ diff --git a/demo/public/50-48.jpg b/demo/public/50-48.jpg new file mode 100644 index 0000000..9539cb7 Binary files /dev/null and b/demo/public/50-48.jpg differ diff --git a/demo/public/50-49.jpg b/demo/public/50-49.jpg new file mode 100644 index 0000000..c1eb857 Binary files /dev/null and b/demo/public/50-49.jpg differ diff --git a/demo/public/50-50.jpg b/demo/public/50-50.jpg new file mode 100644 index 0000000..80e1ed9 Binary files /dev/null and b/demo/public/50-50.jpg differ diff --git a/demo/public/50-51.jpg b/demo/public/50-51.jpg new file mode 100644 index 0000000..89d1da0 Binary files /dev/null and b/demo/public/50-51.jpg differ diff --git a/demo/public/50-52.jpg b/demo/public/50-52.jpg new file mode 100644 index 0000000..146c29e Binary files /dev/null and b/demo/public/50-52.jpg differ diff --git a/demo/public/50-53.jpg b/demo/public/50-53.jpg new file mode 100644 index 0000000..148bac0 Binary files /dev/null and b/demo/public/50-53.jpg differ diff --git a/demo/public/50-54.jpg b/demo/public/50-54.jpg new file mode 100644 index 0000000..6e7dcc3 Binary files /dev/null and b/demo/public/50-54.jpg differ diff --git a/demo/public/50-55.jpg b/demo/public/50-55.jpg new file mode 100644 index 0000000..73fcb7d Binary files /dev/null and b/demo/public/50-55.jpg differ diff --git a/demo/public/50-56.jpg b/demo/public/50-56.jpg new file mode 100644 index 0000000..08fa186 Binary files /dev/null and b/demo/public/50-56.jpg differ diff --git a/demo/public/50-57.jpg b/demo/public/50-57.jpg new file mode 100644 index 0000000..c59d6ef Binary files /dev/null and b/demo/public/50-57.jpg differ diff --git a/demo/public/50-59.jpg b/demo/public/50-59.jpg new file mode 100644 index 0000000..6c5f171 Binary files /dev/null and b/demo/public/50-59.jpg differ diff --git a/demo/public/50-60.jpg b/demo/public/50-60.jpg new file mode 100644 index 0000000..54c09a5 Binary files /dev/null and b/demo/public/50-60.jpg differ diff --git a/demo/public/50-61.jpg b/demo/public/50-61.jpg new file mode 100644 index 0000000..36f4d4f Binary files /dev/null and b/demo/public/50-61.jpg differ diff --git a/demo/public/50-62.jpg b/demo/public/50-62.jpg new file mode 100644 index 0000000..b160fe1 Binary files /dev/null and b/demo/public/50-62.jpg differ diff --git a/demo/public/50-63.jpg b/demo/public/50-63.jpg new file mode 100644 index 0000000..0b693fd Binary files /dev/null and b/demo/public/50-63.jpg differ diff --git a/demo/public/50-64.jpg b/demo/public/50-64.jpg new file mode 100644 index 0000000..24dff7c Binary files /dev/null and b/demo/public/50-64.jpg differ diff --git a/demo/public/50-65.jpg b/demo/public/50-65.jpg new file mode 100644 index 0000000..42c971a Binary files /dev/null and b/demo/public/50-65.jpg differ diff --git a/demo/public/50-66.jpg b/demo/public/50-66.jpg new file mode 100644 index 0000000..063cec3 Binary files /dev/null and b/demo/public/50-66.jpg differ diff --git a/demo/public/50-67.jpg b/demo/public/50-67.jpg new file mode 100644 index 0000000..b83f073 Binary files /dev/null and b/demo/public/50-67.jpg differ diff --git a/demo/public/50-68.jpg b/demo/public/50-68.jpg new file mode 100644 index 0000000..298d3e8 Binary files /dev/null and b/demo/public/50-68.jpg differ diff --git a/demo/public/50-69.jpg b/demo/public/50-69.jpg new file mode 100644 index 0000000..2ef8362 Binary files /dev/null and b/demo/public/50-69.jpg differ diff --git a/demo/public/50-70.jpg b/demo/public/50-70.jpg new file mode 100644 index 0000000..88a8a86 Binary files /dev/null and b/demo/public/50-70.jpg differ diff --git a/demo/public/50-71.jpg b/demo/public/50-71.jpg new file mode 100644 index 0000000..b8d42a3 Binary files /dev/null and b/demo/public/50-71.jpg differ diff --git a/demo/public/50-72.jpg b/demo/public/50-72.jpg new file mode 100644 index 0000000..308bd46 Binary files /dev/null and b/demo/public/50-72.jpg differ diff --git a/demo/public/50-73.jpg b/demo/public/50-73.jpg new file mode 100644 index 0000000..f7604aa Binary files /dev/null and b/demo/public/50-73.jpg differ diff --git a/demo/public/50-74.jpg b/demo/public/50-74.jpg new file mode 100644 index 0000000..75ee9d1 Binary files /dev/null and b/demo/public/50-74.jpg differ diff --git a/demo/public/50-75.jpg b/demo/public/50-75.jpg new file mode 100644 index 0000000..d748e6d Binary files /dev/null and b/demo/public/50-75.jpg differ diff --git a/demo/public/50-76.jpg b/demo/public/50-76.jpg new file mode 100644 index 0000000..490c42d Binary files /dev/null and b/demo/public/50-76.jpg differ diff --git a/demo/public/50-77.jpg b/demo/public/50-77.jpg new file mode 100644 index 0000000..8288fc1 Binary files /dev/null and b/demo/public/50-77.jpg differ diff --git a/demo/public/50-79.jpg b/demo/public/50-79.jpg new file mode 100644 index 0000000..501d17f Binary files /dev/null and b/demo/public/50-79.jpg differ diff --git a/demo/public/50-80.jpg b/demo/public/50-80.jpg new file mode 100644 index 0000000..34c528a Binary files /dev/null and b/demo/public/50-80.jpg differ diff --git a/npm-demo/src/components/GanttTest.vue b/npm-demo/src/components/GanttTest.vue index 6181263..38dc54f 100644 --- a/npm-demo/src/components/GanttTest.vue +++ b/npm-demo/src/components/GanttTest.vue @@ -234,7 +234,7 @@ const addMilestone = () => { type: 'milestone', icon: 'diamond', }) - console.log('milestones: ', milestones.value) + //console.log('milestones: ', milestones.value) newTask.value = { name: '', startDate: '', endDate: '' } showAddMilestoneDialog.value = false } diff --git a/npm-webpack-demo/src/App.vue b/npm-webpack-demo/src/App.vue index baa71e4..4bc7581 100644 --- a/npm-webpack-demo/src/App.vue +++ b/npm-webpack-demo/src/App.vue @@ -220,7 +220,7 @@ const addMilestone = () => { type: 'milestone', icon: 'diamond', }) - console.log('milestones: ', milestones.value) + //console.log('milestones: ', milestones.value) newTask.value = { name: '', startDate: '', endDate: '' } showAddMilestoneDialog.value = false } diff --git a/scripts/replace-avatar-urls.js b/scripts/replace-avatar-urls.js new file mode 100644 index 0000000..11b21ef --- /dev/null +++ b/scripts/replace-avatar-urls.js @@ -0,0 +1,35 @@ +// 替换数据集中的远程头像URL为本地路径 +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +const files = [ + 'demo/data.json', + 'demo/data-resources.json', + 'demo/data-resources-large.json', +] + +files.forEach(filePath => { + const fullPath = path.join(__dirname, '..', filePath) + console.log(`Processing ${filePath}...`) + + try { + let content = fs.readFileSync(fullPath, 'utf-8') + + // 替换 https://i.pravatar.cc/150?img=X 为 /50-(X+10).jpg + content = content.replace(/https:\/\/i\.pravatar\.cc\/150\?img=(\d+)/g, (match, num) => { + const newNum = parseInt(num) + 10 + return `/50-${newNum}.jpg` + }) + + fs.writeFileSync(fullPath, content, 'utf-8') + console.log(`✓ ${filePath} updated successfully`) + } catch (error) { + console.error(`✗ Error processing ${filePath}:`, error.message) + } +}) + +console.log('\nAll files processed!') diff --git a/src/components/TaskDrawer.vue b/src/components/TaskDrawer.vue index a7967bd..e2a640d 100644 --- a/src/components/TaskDrawer.vue +++ b/src/components/TaskDrawer.vue @@ -13,6 +13,7 @@ interface AssigneeOption { key?: string | number value: string | number label: string + avatar?: string // v1.9.0 资源头像 } interface Props { @@ -367,6 +368,9 @@ watch( // 使用 nextTick 确保 resetForm 的响应式更新完成后再赋值 nextTick(() => { Object.assign(formData, taskData) + + // v1.9.0 从 assignee/avatar 映射到 resources + mapAssigneeToResources() }) } else if (props.task && !props.isEdit) { // 新建模式,重置表单 @@ -489,6 +493,10 @@ const handleSubmit = async () => { } try { submitting.value = true + + // v1.9.0 提交前从 resources 映射到 assignee/avatar + mapResourcesToAssignee() + const taskData: Task = { ...formData, id: props.isEdit && props.task ? props.task.id : Date.now(), @@ -667,18 +675,6 @@ function confirmTimer(desc: string) { handleStartTimer(desc) } -// 处理负责人变更 -const handleAssigneeChanged = (event: Event) => { - const value = (event.target as HTMLSelectElement).value - // 通过value过滤props.assigneeOptions获取对应的label - const selected = props.assigneeOptions?.find(option => option.value === value) - if (selected) { - // 这里可以根据需要处理选中的负责人信息 - // 例如,可以将负责人名称存储在formData中 - formData.assigneeName = selected.label - } -} - // v1.9.0 资源占比管理 const addResource = () => { if (!formData.resources) { @@ -715,6 +711,54 @@ const handleResourceChange = (index: number, field: 'id' | 'percent', value: str } } +// v1.9.0 从 task.assignee/avatar 映射到 resources +const mapAssigneeToResources = () => { + if (!formData.resources) { + formData.resources = [] + } + + // 如果已有resources数据,保持不变(优先使用resources) + if (formData.resources && formData.resources.length > 0) { + return + } + + // 从 assignee/avatar 映射到 resources + const assignees = Array.isArray(formData.assignee) ? formData.assignee : (formData.assignee ? [formData.assignee] : []) + + formData.resources = assignees.map((assigneeId) => { + // 查找对应的assigneeOption获取名称 + const option = props.assigneeOptions?.find(opt => opt.value === assigneeId) + return { + id: assigneeId, + name: option?.label || String(assigneeId), + percent: 100, // 默认100% + } + }) +} + +// v1.9.0 从 resources 映射回 task.assignee/avatar 数组 +const mapResourcesToAssignee = () => { + if (!formData.resources || formData.resources.length === 0) { + formData.assignee = '' + formData.avatar = '' + return + } + + // 映射 assignee 数组 + const assignees = formData.resources.map(r => String(r.id)).filter(id => id) + formData.assignee = assignees.length > 1 ? assignees : (assignees[0] || '') + + // 映射 avatar 数组(从assigneeOptions中查找对应的avatar) + const avatars = formData.resources + .map(r => { + const option = props.assigneeOptions?.find(opt => opt.value === r.id) + return option?.avatar || '' + }) + .filter(avatar => avatar) + + formData.avatar = avatars.length > 1 ? avatars : (avatars[0] || '') +} + // 计算任务状态 const taskStatus = computed(() => { if (!props.task) return { text: '', color: '', bgColor: '', borderColor: '' } @@ -949,24 +993,17 @@ const taskStatus = computed(() => { {{ errors.type }} -
- - -
-
+ +
+ 资源名称 + 占用比例 + +
+
{ v-for="assignee in props.assigneeOptions" :key="assignee.key ?? assignee.value" :value="assignee.value" + :data-avatar="assignee.avatar" > {{ assignee.label }} -
- - - % -
+
+
资源超载警告 + +{{ totalOverloadPercent }}%
-
-
与《{{ info.taskName }}》冲突
-
- 冲突时段: - {{ info.overlapStart }} ~ {{ info.overlapEnd }} -
-
- 资源占用: - {{ info.currentPercent }}% + {{ info.conflictPercent }}% = {{ info.totalPercent }}% -
-
- 超载: - +{{ info.overloadPercent }}% + +
+
+
与《{{ info.taskName }}》冲突
+
+ 冲突时段: + {{ info.overlapStart }} ~ {{ info.overlapEnd }} +
+
+ 任务投入占比: + {{ info.conflictPercent }}% +
@@ -489,8 +549,14 @@ onUnmounted(() => { .conflict-section { margin-top: 8px; padding-top: 8px; - border-top: 1px solid rgba(255, 255, 255, 0.2); /* 添加滚动支持 */ - max-height: 200px; /* 限制冲突区域最大高度 */ + border-top: 1px solid rgba(255, 255, 255, 0.2); + display: flex; + flex-direction: column; +} + +/* 可滚动的冲突列表容器 - v1.9.8 */ +.conflict-list-container { + max-height: 200px; /* 限制冲突列表最大高度 */ overflow-y: auto; /* 垂直滚动 */ overflow-x: hidden; /* 细滚动条样式 */ @@ -499,21 +565,22 @@ onUnmounted(() => { } /* Webkit浏览器(Chrome、Safari、Edge)的细滚动条样式 */ -.conflict-section::-webkit-scrollbar { +.conflict-list-container::-webkit-scrollbar { width: 4px; /* 细滚动条 */ } -.conflict-section::-webkit-scrollbar-track { +.conflict-list-container::-webkit-scrollbar-track { background: transparent; /* 透明轨道 */ } -.conflict-section::-webkit-scrollbar-thumb { +.conflict-list-container::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.3); /* 半透明滑块 */ border-radius: 2px; } -.conflict-section::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.5); /* 悬停时更明显 */} +.conflict-list-container::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.5); /* 悬停时更明显 */ +} .conflict-header { display: flex; @@ -527,6 +594,14 @@ onUnmounted(() => { .conflict-title { font-size: 12px; + flex: 1; +} + +.total-overload { + font-size: 13px; + font-weight: 700; + color: #ff5252; + margin-left: auto; } .conflict-item {