fix(ai): 拆解原型无需求ID任务
This commit is contained in:
@@ -28,6 +28,16 @@ interface Props {
|
||||
readOnly?: boolean;
|
||||
}
|
||||
|
||||
const NO_REQUIREMENT_GROUP_PREFIX = '__no_requirement__';
|
||||
|
||||
function getDevTaskGroupKey(task: DevTask): string {
|
||||
return task.requirementId || `${NO_REQUIREMENT_GROUP_PREFIX}${task.requirementName || '未命名需求'}`;
|
||||
}
|
||||
|
||||
function getNoRequirementGroupName(groupKey: string): string {
|
||||
return groupKey.slice(NO_REQUIREMENT_GROUP_PREFIX.length) || '未命名需求';
|
||||
}
|
||||
|
||||
export function DevTaskTab({ versionId, requirementIds, versionDeadline, readOnly = false }: Props) {
|
||||
const { tasks, fetchTasks, deleteTask } = useDevTaskStore();
|
||||
const { categories, fetchCategories } = useTaskCategoryStore();
|
||||
@@ -42,8 +52,8 @@ export function DevTaskTab({ versionId, requirementIds, versionDeadline, readOnl
|
||||
|
||||
const reqIdSet = useMemo(() => new Set(requirementIds), [requirementIds]);
|
||||
const versionTasks = useMemo(
|
||||
() => tasks.filter((t) => reqIdSet.has(t.requirementId)),
|
||||
[tasks, reqIdSet],
|
||||
() => tasks.filter((t) => t.versionId === versionId || (!t.versionId && reqIdSet.has(t.requirementId))),
|
||||
[tasks, reqIdSet, versionId],
|
||||
);
|
||||
|
||||
const [filterAssignee, setFilterAssignee] = useState('');
|
||||
@@ -107,9 +117,10 @@ export function DevTaskTab({ versionId, requirementIds, versionDeadline, readOnl
|
||||
const groupedByReq = useMemo(() => {
|
||||
const map = new Map<string, DevTask[]>();
|
||||
for (const t of paged) {
|
||||
const list = map.get(t.requirementId) || [];
|
||||
const key = getDevTaskGroupKey(t);
|
||||
const list = map.get(key) || [];
|
||||
list.push(t);
|
||||
map.set(t.requirementId, list);
|
||||
map.set(key, list);
|
||||
}
|
||||
return map;
|
||||
}, [paged]);
|
||||
@@ -197,7 +208,9 @@ export function DevTaskTab({ versionId, requirementIds, versionDeadline, readOnl
|
||||
</div>
|
||||
) : (
|
||||
Array.from(groupedByReq.entries()).map(([reqId, reqTasks]) => {
|
||||
const req = requirementMap.get(reqId);
|
||||
const isNoRequirementGroup = reqId.startsWith(NO_REQUIREMENT_GROUP_PREFIX);
|
||||
const req = isNoRequirementGroup ? undefined : requirementMap.get(reqId);
|
||||
const noRequirementName = isNoRequirementGroup ? getNoRequirementGroupName(reqId) : '';
|
||||
const reqProgress = calcGroupProgress(reqTasks);
|
||||
return (
|
||||
<div key={reqId} className="rounded-lg border border-[var(--line)] bg-[var(--bg-card)] overflow-hidden">
|
||||
@@ -209,8 +222,12 @@ export function DevTaskTab({ versionId, requirementIds, versionDeadline, readOnl
|
||||
)}
|
||||
<div className="flex flex-1 min-w-0 items-center gap-2 px-4 py-2">
|
||||
<span className="h-2 w-2 shrink-0" />
|
||||
<span className="w-16 shrink-0 truncate text-[11px] font-mono text-[var(--ink-muted)]" title={req?.code}>{req?.code}</span>
|
||||
<span className="min-w-0 flex-1 truncate text-[12px] font-medium text-[var(--ink)]">{req?.title}</span>
|
||||
<span className="w-16 shrink-0 truncate text-[11px] font-mono text-[var(--ink-muted)]" title={isNoRequirementGroup ? '无需求ID' : req?.code}>
|
||||
{isNoRequirementGroup ? '无需求ID' : req?.code}
|
||||
</span>
|
||||
<span className="min-w-0 flex-1 truncate text-[12px] font-medium text-[var(--ink)]">
|
||||
{isNoRequirementGroup ? noRequirementName : req?.title}
|
||||
</span>
|
||||
<span className="shrink-0 text-[11px] text-[var(--ink-muted)]">{reqProgress}%</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user