137 lines
3.5 KiB
TypeScript
137 lines
3.5 KiB
TypeScript
|
|
/**
|
|||
|
|
* 风险与任务评估工具模块
|
|||
|
|
*
|
|||
|
|
* 本模块提供了一系列用于评估风险等级、任务紧急程度和综合问题级别的工具函数。
|
|||
|
|
* 主要用于项目管理、风险评估等场景,帮助用户量化分析各类风险因素。
|
|||
|
|
*
|
|||
|
|
* 版本历史:
|
|||
|
|
* - v1.0.0 初始版本,包含基础风险评估功能
|
|||
|
|
* - v1.1.0 新增任务紧急程度评估功能
|
|||
|
|
* - v1.2.0 添加综合问题级别评估功能
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
import dayjs from "dayjs";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 计算风险等级
|
|||
|
|
*
|
|||
|
|
* 根据概率和严重性的乘积来评估风险等级,采用线性分段评估方法。
|
|||
|
|
*
|
|||
|
|
* @param probability 风险发生概率,范围0-100
|
|||
|
|
* @param severity 风险严重程度,范围0-100
|
|||
|
|
* @returns 风险等级,1-4级,4级为最高风险
|
|||
|
|
*
|
|||
|
|
* 算法复杂度:O(1)
|
|||
|
|
* 空间复杂度:O(1)
|
|||
|
|
*/
|
|||
|
|
export function getRiskLevel(probability: number, severity: number) {
|
|||
|
|
// 计算风险值
|
|||
|
|
const riskValue = probability * severity;
|
|||
|
|
|
|||
|
|
// 分段评估风险等级
|
|||
|
|
if (riskValue > 70) {
|
|||
|
|
return 4;
|
|||
|
|
} else if (riskValue > 42) {
|
|||
|
|
return 3;
|
|||
|
|
} else if (riskValue > 21) {
|
|||
|
|
return 2;
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 计算任务紧急程度评分
|
|||
|
|
*
|
|||
|
|
* 根据截止日期与当前日期的差值来评估任务紧急程度。
|
|||
|
|
* 采用分段评分机制,距离截止日期越近,评分越高。
|
|||
|
|
*
|
|||
|
|
* @param deadline 任务截止日期,支持字符串、Date对象或空值
|
|||
|
|
* @returns 紧急程度评分,0-100分,100分为最紧急
|
|||
|
|
*
|
|||
|
|
* 算法复杂度:O(1)
|
|||
|
|
* 空间复杂度:O(1)
|
|||
|
|
*/
|
|||
|
|
export function getDeadlineScore(deadline: string | Date | null | undefined) {
|
|||
|
|
// 处理空值情况
|
|||
|
|
if (!deadline) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 计算距离截止日期的天数
|
|||
|
|
const deadlineDays = dayjs().diff(dayjs(deadline), "day");
|
|||
|
|
|
|||
|
|
// 初始化基础评分
|
|||
|
|
let deadlineScore = 25;
|
|||
|
|
|
|||
|
|
// 根据天数范围调整评分
|
|||
|
|
if (deadlineDays > 365) {
|
|||
|
|
deadlineScore = 100;
|
|||
|
|
} else if (deadlineDays > 90) {
|
|||
|
|
deadlineScore = 75;
|
|||
|
|
} else if (deadlineDays > 30) {
|
|||
|
|
deadlineScore = 50;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return deadlineScore;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 计算综合问题级别
|
|||
|
|
*
|
|||
|
|
* 综合考虑概率、严重性、影响程度、成本和截止日期等因素,
|
|||
|
|
* 采用加权平均算法评估问题级别。
|
|||
|
|
*
|
|||
|
|
* @param probability 问题发生概率,范围0-100
|
|||
|
|
* @param severity 问题严重程度,范围0-100
|
|||
|
|
* @param impact 问题影响范围,范围0-100
|
|||
|
|
* @param cost 问题解决成本,范围0-100
|
|||
|
|
* @param deadline 问题解决截止日期
|
|||
|
|
* @returns 问题级别,0-4级,4级为最严重问题
|
|||
|
|
*
|
|||
|
|
* 算法复杂度:O(1)
|
|||
|
|
* 空间复杂度:O(1)
|
|||
|
|
*/
|
|||
|
|
export function getTroubleLevel(
|
|||
|
|
probability: number,
|
|||
|
|
severity: number,
|
|||
|
|
impact: number,
|
|||
|
|
cost: number,
|
|||
|
|
deadline: string | Date
|
|||
|
|
) {
|
|||
|
|
// 计算距离截止日期的天数
|
|||
|
|
const deadlineDays = dayjs().diff(dayjs(deadline), "day");
|
|||
|
|
|
|||
|
|
// 初始化紧急程度评分
|
|||
|
|
let deadlineScore = 25;
|
|||
|
|
|
|||
|
|
// 根据天数范围调整评分
|
|||
|
|
if (deadlineDays > 365) {
|
|||
|
|
deadlineScore = 100;
|
|||
|
|
} else if (deadlineDays > 90) {
|
|||
|
|
deadlineScore = 75;
|
|||
|
|
} else if (deadlineDays > 30) {
|
|||
|
|
deadlineScore = 50;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 计算加权总分
|
|||
|
|
let total =
|
|||
|
|
0.257 * probability +
|
|||
|
|
0.325 * severity +
|
|||
|
|
0.269 * impact +
|
|||
|
|
0.084 * deadlineScore +
|
|||
|
|
0.065 * cost;
|
|||
|
|
|
|||
|
|
// 根据总分评估问题级别
|
|||
|
|
if (total > 90) {
|
|||
|
|
return 4;
|
|||
|
|
} else if (total > 60) {
|
|||
|
|
return 3;
|
|||
|
|
} else if (total > 30) {
|
|||
|
|
return 2;
|
|||
|
|
} else if (probability * severity * impact * cost !== 1) {
|
|||
|
|
return 1;
|
|||
|
|
} else {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|