From 273182bb0f9df0da70e0d0eec309b063b632e226 Mon Sep 17 00:00:00 2001 From: Script Generator Date: Mon, 15 Jun 2026 13:37:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Bug=20=E5=9B=BE=E7=89=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=20+=20=E8=BD=AC=E4=BA=A4=20+=20=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=97=A5=E5=BF=97=20+=20=E5=BC=80=E5=8F=91=E4=B8=AD=E5=90=AB?= =?UTF-8?q?=E8=87=AA=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 开发中统计包含 in_progress + testing(自测) 2. Bug 支持上传图片: - BugCreateModal 加宽为 max-w-2xl - 新增拖拽/点击上传图片区域,转 base64 存储 - 上传后可预览缩略图、可删除 - BugDetailDrawer 展示截图列表,点击可放大 3. Bug 支持转交: - BugDetailDrawer 操作栏新增"转交"按钮 - 选人下拉 + 备注输入 → 确认转交 - transferBug store 方法:更新 assigneeId + 追加日志 4. Bug 操作日志: - BugLog interface: create/status_change/transfer/resolve - createBug 时记录创建日志 - changeStatus 时记录状态变更/修复日志 - transferBug 时记录转交日志 - BugDetailDrawer 底部展示操作时间线 Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/app/versions/[id]/page.tsx | 2 +- apps/web/components/bug/BugCreateModal.tsx | 58 ++++++++++-- apps/web/components/bug/BugDetailDrawer.tsx | 99 +++++++++++++++++++-- apps/web/lib/bug.ts | 12 +++ apps/web/stores/useBugStore.ts | 34 +++++-- 5 files changed, 182 insertions(+), 23 deletions(-) diff --git a/apps/web/app/versions/[id]/page.tsx b/apps/web/app/versions/[id]/page.tsx index 5223b83..fb97101 100644 --- a/apps/web/app/versions/[id]/page.tsx +++ b/apps/web/app/versions/[id]/page.tsx @@ -208,7 +208,7 @@ export default function VersionDetailPage() { // DevTask 真实统计 const versionDevTasks = devTasks.filter((t) => versionReqs.some((r) => r.id === t.requirementId)); const devTaskTodo = versionDevTasks.filter((t) => t.status === 'todo').length; - const devTaskInProgress = versionDevTasks.filter((t) => t.status === 'in_progress').length; + const devTaskInProgress = versionDevTasks.filter((t) => t.status === 'in_progress' || t.status === 'testing').length; const devTaskBlocked = versionDevTasks.filter((t) => t.isBlocked).length; const versionBugs = bugs.filter((b) => b.versionId === version.id); const bugOpenCount = versionBugs.filter((b) => b.status === 'open' || b.status === 'fixing').length; diff --git a/apps/web/components/bug/BugCreateModal.tsx b/apps/web/components/bug/BugCreateModal.tsx index a56f88d..327eeaa 100644 --- a/apps/web/components/bug/BugCreateModal.tsx +++ b/apps/web/components/bug/BugCreateModal.tsx @@ -1,7 +1,7 @@ 'use client'; -import { useState, useMemo } from 'react'; -import { X } from 'lucide-react'; +import { useState, useMemo, useRef } from 'react'; +import { X, ImagePlus, Trash2 } from 'lucide-react'; import { useBugStore } from '@/stores/useBugStore'; import { useTestCaseStore } from '@/stores/useTestCaseStore'; import { useDevTaskStore } from '@/stores/useDevTaskStore'; @@ -27,7 +27,6 @@ export function BugCreateModal({ testCaseId, onClose }: Props) { const tc = testCases.find((c) => c.id === testCaseId); const requirement = requirements.find((r) => r.id === tc?.requirementId); - // 推导默认负责人 const defaultAssignee = useMemo(() => { if (!tc) return ''; const reqTasks = devTasks.filter((t) => t.requirementId === tc.requirementId); @@ -42,9 +41,23 @@ export function BugCreateModal({ testCaseId, onClose }: Props) { const [severity, setSeverity] = useState('major'); const [priority, setPriority] = useState(tc?.priority || 'P1'); const [assigneeId, setAssigneeId] = useState(defaultAssignee); + const [images, setImages] = useState([]); + const fileRef = useRef(null); const canSubmit = title.trim() && description.trim() && assigneeId; + const handleFiles = (files: FileList | null) => { + if (!files) return; + Array.from(files).forEach((file) => { + if (!file.type.startsWith('image/')) return; + const reader = new FileReader(); + reader.onload = () => { + setImages((prev) => [...prev, reader.result as string]); + }; + reader.readAsDataURL(file); + }); + }; + const handleSubmit = () => { if (!canSubmit) return; createBug({ @@ -57,19 +70,19 @@ export function BugCreateModal({ testCaseId, onClose }: Props) { priority, reportedBy: user?.name || '系统', assigneeId, - }); + images: images.length > 0 ? images : undefined, + }, user?.name || '系统'); onClose(); }; return (
-
e.stopPropagation()}> +
e.stopPropagation()}>

提交 Bug

- {/* 只读关联信息 */}
关联用例:{tc?.caseNo} {tc?.title}
{requirement &&
关联需求:{requirement.code} {requirement.title}
} @@ -82,8 +95,39 @@ export function BugCreateModal({ testCaseId, onClose }: Props) {
-