88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
|
|
import { transformRecordToOption } from '@/utils/common';
|
|||
|
|
|
|||
|
|
/** 项目状态编码与中文标签映射 */
|
|||
|
|
export const projectStatusRecord: Record<Api.Project.ProjectStatusCode, string> = {
|
|||
|
|
pending: '待开始',
|
|||
|
|
active: '进行中',
|
|||
|
|
paused: '已暂停',
|
|||
|
|
completed: '已完成',
|
|||
|
|
cancelled: '已取消',
|
|||
|
|
archived: '已归档'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export const projectStatusOptions = transformRecordToOption(projectStatusRecord);
|
|||
|
|
|
|||
|
|
/** 项目状态动作编码与中文标签映射 */
|
|||
|
|
export const projectStatusActionRecord: Record<Api.Project.ProjectStatusActionCode, string> = {
|
|||
|
|
auto_start: '自动开始',
|
|||
|
|
pause: '暂停项目',
|
|||
|
|
resume: '恢复项目',
|
|||
|
|
complete: '完成项目',
|
|||
|
|
cancel: '取消项目',
|
|||
|
|
reopen: '重新开启',
|
|||
|
|
archive: '归档项目'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export function getProjectStatusLabel(status: Api.Project.ProjectStatusCode) {
|
|||
|
|
return projectStatusRecord[status];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 根据项目状态返回对应的 Tag 类型,用于 ElTag 组件的颜色映射 */
|
|||
|
|
export function getProjectStatusTagType(status: Api.Project.ProjectStatusCode): UI.ThemeColor {
|
|||
|
|
const statusTagTypeMap: Record<Api.Project.ProjectStatusCode, UI.ThemeColor> = {
|
|||
|
|
pending: 'info',
|
|||
|
|
active: 'success',
|
|||
|
|
paused: 'warning',
|
|||
|
|
completed: 'success',
|
|||
|
|
cancelled: 'info',
|
|||
|
|
archived: 'info'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return statusTagTypeMap[status];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 判断项目是否可编辑:pending / active / paused 状态允许编辑 */
|
|||
|
|
export function isProjectEditable(status: Api.Project.ProjectStatusCode) {
|
|||
|
|
return status === 'active' || status === 'pending';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 判断项目编辑是否受限:paused / completed 状态只能编辑部分字段 */
|
|||
|
|
export function isProjectEditLimited(status: Api.Project.ProjectStatusCode) {
|
|||
|
|
return status === 'paused' || status === 'completed';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 根据当前状态获取允许的状态动作列表 */
|
|||
|
|
export function getAllowedProjectStatusActions(
|
|||
|
|
status: Api.Project.ProjectStatusCode
|
|||
|
|
): Array<Exclude<Api.Project.ProjectStatusActionCode, 'auto_start'>> {
|
|||
|
|
const actionMap: Record<
|
|||
|
|
Api.Project.ProjectStatusCode,
|
|||
|
|
Array<Exclude<Api.Project.ProjectStatusActionCode, 'auto_start'>>
|
|||
|
|
> = {
|
|||
|
|
pending: ['cancel'],
|
|||
|
|
active: ['pause', 'complete', 'cancel'],
|
|||
|
|
paused: ['resume', 'cancel'],
|
|||
|
|
completed: ['reopen', 'archive'],
|
|||
|
|
cancelled: [],
|
|||
|
|
archived: []
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return actionMap[status];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function getProjectStatusActionLabel(actionCode: Api.Project.ProjectStatusActionCode) {
|
|||
|
|
return projectStatusActionRecord[actionCode];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function getProjectStatusActionOptions(status: Api.Project.ProjectStatusCode) {
|
|||
|
|
return getAllowedProjectStatusActions(status).map(actionCode => ({
|
|||
|
|
value: actionCode,
|
|||
|
|
label: getProjectStatusActionLabel(actionCode)
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 判断状态动作是否必须填写原因:resume 和 auto_start 不需要原因 */
|
|||
|
|
export function isProjectActionReasonRequired(actionCode: Api.Project.ProjectStatusActionCode) {
|
|||
|
|
return actionCode !== 'resume' && actionCode !== 'auto_start';
|
|||
|
|
}
|