v4.0.8任务和版本状态增加“已停止”
CI / verify (pull_request) Waiting to run

This commit is contained in:
2026-09-02 06:28:47 +08:00
parent bbb13cfd1a
commit a88fd6c29a
10 changed files with 44 additions and 18 deletions
+8
View File
@@ -10,6 +10,7 @@ describe('taskStatusFromVersionStatus', () => {
expect(taskStatusFromVersionStatus('IN_PROGRESS')).toBe('IN_PROGRESS');
expect(taskStatusFromVersionStatus('TESTING')).toBe('DEVELOPED');
expect(taskStatusFromVersionStatus('RELEASED')).toBe('RELEASED');
expect(taskStatusFromVersionStatus('STOPPED')).toBe('STOPPED');
});
});
@@ -22,4 +23,11 @@ describe('resolveTaskStatusFromVersions', () => {
expect(resolveTaskStatusFromVersions(['PENDING', 'TESTING'])).toBe('DEVELOPED');
expect(resolveTaskStatusFromVersions(['IN_PROGRESS', 'RELEASED'])).toBe('RELEASED');
});
it('syncs STOPPED only when every linked version is stopped', () => {
expect(resolveTaskStatusFromVersions(['STOPPED'])).toBe('STOPPED');
expect(resolveTaskStatusFromVersions(['STOPPED', 'STOPPED'])).toBe('STOPPED');
expect(resolveTaskStatusFromVersions(['STOPPED', 'IN_PROGRESS'])).toBe('IN_PROGRESS');
expect(resolveTaskStatusFromVersions(['STOPPED', 'RELEASED'])).toBe('RELEASED');
});
});
+10 -5
View File
@@ -1,5 +1,5 @@
export type DevPlanTaskStatus = 'TODO' | 'IN_PROGRESS' | 'DEVELOPED' | 'RELEASED';
export type DevPlanVersionStatus = 'PENDING' | 'IN_PROGRESS' | 'TESTING' | 'RELEASED';
export type DevPlanTaskStatus = 'TODO' | 'IN_PROGRESS' | 'DEVELOPED' | 'RELEASED' | 'STOPPED';
export type DevPlanVersionStatus = 'PENDING' | 'IN_PROGRESS' | 'TESTING' | 'RELEASED' | 'STOPPED';
export function computeDurationMinutes(
devStartedAt: Date | null | undefined,
@@ -63,13 +63,14 @@ export function taskCompletedAtOnStatus(
}
const TASK_STATUS_RANK: Record<DevPlanTaskStatus, number> = {
STOPPED: -1,
TODO: 0,
IN_PROGRESS: 1,
DEVELOPED: 2,
RELEASED: 3,
};
/** 版本状态 → 任务状态:待开始/开发中/测试中/已发布 ↔ 待处理/进行中/已开发/已发布 */
/** 版本状态 → 任务状态:待开始/开发中/测试中/已发布/已停止 ↔ 待处理/进行中/已开发/已发布/已停止 */
export function taskStatusFromVersionStatus(status: DevPlanVersionStatus): DevPlanTaskStatus {
switch (status) {
case 'PENDING':
@@ -80,15 +81,19 @@ export function taskStatusFromVersionStatus(status: DevPlanVersionStatus): DevPl
return 'DEVELOPED';
case 'RELEASED':
return 'RELEASED';
case 'STOPPED':
return 'STOPPED';
}
}
/** 任务挂多个版本时取进度最高的对应状态 */
/** 任务挂多个版本时取进度最高的对应状态;仅当全部版本已停止时任务才为已停止 */
export function resolveTaskStatusFromVersions(
versionStatuses: DevPlanVersionStatus[],
): DevPlanTaskStatus | null {
if (!versionStatuses.length) return null;
return versionStatuses
const active = versionStatuses.filter((s) => s !== 'STOPPED');
if (!active.length) return 'STOPPED';
return active
.map(taskStatusFromVersionStatus)
.reduce((highest, current) =>
TASK_STATUS_RANK[current] > TASK_STATUS_RANK[highest] ? current : highest,
+4 -2
View File
@@ -22,11 +22,11 @@ export const DEV_PLAN_TASK_TYPE_LABELS: Record<DevPlanTaskTypeDto, string> = {
/** 开发计划任务状态 */
export type DevPlanTaskStatusDto = 'TODO' | 'IN_PROGRESS' | 'DEVELOPED' | 'RELEASED';
export type DevPlanTaskStatusDto = 'TODO' | 'IN_PROGRESS' | 'DEVELOPED' | 'RELEASED' | 'STOPPED';
export const DEV_PLAN_TASK_STATUSES = ['TODO', 'IN_PROGRESS', 'DEVELOPED', 'RELEASED'] as const;
export const DEV_PLAN_TASK_STATUSES = ['TODO', 'IN_PROGRESS', 'DEVELOPED', 'RELEASED', 'STOPPED'] as const;
@@ -40,6 +40,8 @@ export const DEV_PLAN_TASK_STATUS_LABELS: Record<DevPlanTaskStatusDto, string> =
RELEASED: '已上线',
STOPPED: '已停止',
};