Files
cn-rdms-web/src/views/project/shared/project-master-data.ts

88 lines
2.9 KiB
TypeScript
Raw Normal View History

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';
}