v1.9.0-rc.2 - Add resource durition conflicts and resource reloaded alert

This commit is contained in:
LINING-PC\lining
2026-01-31 22:24:33 +08:00
parent 961f8fefde
commit a879fe01f7
7 changed files with 2110 additions and 34 deletions
+45 -19
View File
@@ -190,31 +190,42 @@ const resourceConflicts = computed(() => {
// 依赖 updateTaskTrigger 以便在任务更新时重新计算冲突
if (updateTaskTrigger.value >= 0) {
resources.forEach(resource => {
const conflicts = new Set<number>()
const tasks = resource.tasks || []
const validTasks = tasks.filter(task => task.startDate && task.endDate)
// v1.9.2 使用 Resource.isOverloaded() 方法检测真正的资源超载
// 超载定义:同一时间段内,资源总占用比例 > 100%
if (typeof resource.isOverloaded === 'function' && resource.isOverloaded()) {
const conflicts = new Set<number>()
const tasks = resource.tasks || []
const validTasks = tasks.filter(task => task.startDate && task.endDate)
// 两两比较检测冲突
for (let i = 0; i < validTasks.length; i++) {
for (let j = i + 1; j < validTasks.length; j++) {
const task1 = validTasks[i]
const task2 = validTasks[j]
// 找出所有导致超载的任务对
for (let i = 0; i < validTasks.length; i++) {
for (let j = i + 1; j < validTasks.length; j++) {
const task1 = validTasks[i]
const task2 = validTasks[j]
// 检查时间重叠
const start1 = new Date(task1.startDate!).getTime()
const end1 = new Date(task1.endDate!).getTime()
const start2 = new Date(task2.startDate!).getTime()
const end2 = new Date(task2.endDate!).getTime()
// 检查时间重叠
const start1 = new Date(task1.startDate!).getTime()
const end1 = new Date(task1.endDate!).getTime()
const start2 = new Date(task2.startDate!).getTime()
const end2 = new Date(task2.endDate!).getTime()
if (start1 < end2 && start2 < end1) {
conflicts.add(task1.id)
conflicts.add(task2.id)
if (start1 < end2 && start2 < end1) {
// 有时间重叠,检查总占比是否超过100%
const percent1 = getTaskAllocationPercent(resource, task1)
const percent2 = getTaskAllocationPercent(resource, task2)
if (percent1 + percent2 > 100) {
// 超载,标记这两个任务
conflicts.add(task1.id)
conflicts.add(task2.id)
}
}
}
}
}
if (conflicts.size > 0) {
conflictsMap.set(String(resource.id), conflicts)
if (conflicts.size > 0) {
conflictsMap.set(String(resource.id), conflicts)
}
}
})
}
@@ -222,6 +233,21 @@ const resourceConflicts = computed(() => {
return conflictsMap
})
// 辅助函数:获取任务中当前资源的投入占比
function getTaskAllocationPercent(resource: Resource, task: Task): number {
if (!task.resources || !Array.isArray(task.resources)) {
return 100 // 未配置resources时,默认100%
}
const allocation = task.resources.find((r: any) => String(r.id) === String(resource.id))
if (!allocation) {
return 100 // 未找到当前资源的分配信息,默认100%
}
const percent = allocation.percent ?? 100
return Math.max(20, Math.min(100, percent)) // 限制范围 20-100
}
// 提供资源布局信息给子组件
provide('resourceTaskLayouts', resourceTaskLayouts)
provide('resourceRowPositions', resourceRowPositions)