92 lines
2.0 KiB
TypeScript
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()
|
|
}
|
|
}
|