fix(version): 限制任务需求候选为版本已关联需求

This commit is contained in:
2026-07-06 11:43:23 +08:00
parent bc6e9357ea
commit 8d61bb7c13
7 changed files with 84 additions and 12 deletions

View File

@@ -10,13 +10,16 @@ import { useAuthStore } from '@/stores/useAuthStore';
import { FilterSelect } from '@/components/FilterSelect';
import { WorkDateTimePicker } from '@/components/WorkDateTimePicker';
import type { Priority } from '@/lib/derive';
import type { Requirement } from '@/lib/requirement';
import { getCategoriesByGroup, getDefaultCategoryByGroup } from '@/lib/task-category';
import { getVersionLinkedRequirementCandidates } from '@/lib/requirement-selector';
import { clampTestCaseEstimateHours, getDefaultTestCaseEstimateHours } from '@/lib/ai-estimation-policy';
import { isoToLocal, localToISO } from '@/lib/work-hours';
interface Props {
versionId: string;
requirementIds: string[];
versionRequirements?: Requirement[];
roundNo?: number;
onClose: () => void;
}
@@ -33,16 +36,17 @@ function defaultPlannedEndLocal(): string {
return isoToLocal(d.toISOString());
}
export function TestCaseCreateModal({ versionId, requirementIds, roundNo, onClose }: Props) {
export function TestCaseCreateModal({ versionId, requirementIds, versionRequirements, roundNo, onClose }: Props) {
const { createTestCase } = useTestCaseStore();
const { requirements } = useRequirementStore();
const { members } = useMemberStore();
const { categories } = useTaskCategoryStore();
const user = useAuthStore((s) => s.user);
const requirementSource = versionRequirements ?? requirements;
const versionReqs = useMemo(
() => requirements.filter((r) => requirementIds.includes(r.id)),
[requirements, requirementIds],
() => getVersionLinkedRequirementCandidates(requirementSource, requirementIds),
[requirementSource, requirementIds],
);
const testCategories = useMemo(() => getCategoriesByGroup(categories, 'testing'), [categories]);
@@ -69,6 +73,12 @@ export function TestCaseCreateModal({ versionId, requirementIds, roundNo, onClos
setEstimateHours(getDefaultTestCaseEstimateHours(next.code));
}, [categoryId, testCategories]);
useEffect(() => {
if (!requirementId) return;
if (versionReqs.some((r) => r.id === requirementId)) return;
setRequirementId('');
}, [versionReqs, requirementId]);
const handleCategoryChange = (nextCategoryId: string) => {
setCategoryId(nextCategoryId);
const category = categories.find((c) => c.id === nextCategoryId) ?? testCategories.find((c) => c.id === nextCategoryId);

View File

@@ -332,7 +332,15 @@ export function TestCaseTab({
{total > 20 && <Pagination total={total} page={page} pageSize={pageSize} onChange={setPage} onPageSizeChange={setPageSize} />}
{showCreate && !readOnly && <TestCaseCreateModal versionId={versionId} requirementIds={requirementIds} roundNo={activeRound} onClose={() => setShowCreate(false)} />}
{showCreate && !readOnly && (
<TestCaseCreateModal
versionId={versionId}
requirementIds={requirementIds}
versionRequirements={versionRequirements}
roundNo={activeRound}
onClose={() => setShowCreate(false)}
/>
)}
{selectedCaseId && <TestCaseDetailDrawer testCaseId={selectedCaseId} readOnly={readOnly} onClose={() => setSelectedCaseId(null)} onCreateBug={(id) => { if (!readOnly) setBugForCaseId(id); }} />}
{bugForCaseId && !readOnly && <BugCreateModal testCaseId={bugForCaseId} onClose={() => setBugForCaseId(null)} />}
</div>