staff_data/packages/client/src/tools/level.ts

137 lines
3.5 KiB
TypeScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 风险与任务评估工具模块
*
* 本模块提供了一系列用于评估风险等级、任务紧急程度和综合问题级别的工具函数。
* 主要用于项目管理、风险评估等场景,帮助用户量化分析各类风险因素。
*
* 版本历史:
* - 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;
}
}