v1.9.0-rc.2 - Add resource durition conflicts and resource reloaded alert
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user