Files
jordium-gantt-vue3/src/models/classes/Resource.ts
T

92 lines
2.0 KiB
TypeScript

import type { Task } from './Task'
/**
* 资源类 (Resource Class)
* 用于资源计划视图,代表可分配的人力或设备资源
*
* @version 1.9.0
* @description 支持资源视图的核心数据模型,每个资源可以关联多个任务
*/
export class Resource {
id: string | number
name: string
type?: string
avatar?: string
description?: string
department?: string
skills?: string[]
utilization?: number
tasks: Task[]
[key: string]: unknown
constructor(data: {
id: string | number
name: string
type?: string
avatar?: string
description?: string
department?: string
skills?: string[]
utilization?: number
tasks?: Task[]
[key: string]: unknown
}) {
this.id = data.id
this.name = data.name
this.type = data.type
this.avatar = data.avatar
this.description = data.description
this.department = data.department
this.skills = data.skills
this.utilization = data.utilization
this.tasks = data.tasks || []
// 复制其他自定义属性
Object.keys(data).forEach(key => {
if (!(key in this)) {
this[key] = data[key]
}
})
}
/**
* 添加任务到资源
*/
addTask(task: Task): void {
if (!this.tasks.find(t => t.id === task.id)) {
this.tasks.push(task)
}
}
/**
* 从资源中移除任务
*/
removeTask(taskId: number | string): void {
this.tasks = this.tasks.filter(t => t.id !== taskId)
}
/**
* 获取任务数量
*/
getTaskCount(): number {
return this.tasks.length
}
/**
* 计算资源利用率(基于任务时间重叠)
* @returns 利用率百分比 (0-100)
*/
calculateUtilization(): number {
if (this.tasks.length === 0) return 0
const baseUtilization = Math.min(this.tasks.length * 20, 100)
return Math.round(baseUtilization)
}
/**
* 更新利用率
*/
updateUtilization(): void {
this.utilization = this.calculateUtilization()
}
}