本文目录导读:

- 核心数据模型(通用)
- 方案一:简单流程(适合小型团队或内部工具)
- 方案二:标准Bug跟踪流程(适合中等规模团队)
- 方案三:多阶段验收(适合复杂产品/合规要求)
- 方案四:敏捷/Scrum 验收(适合标准敏捷团队)
- 辅助功能建议(增强体验)
- 技术栈推荐
- 总结建议
在PHP项目中实现验收管理,通常涉及任务分配、测试执行、缺陷跟踪、审批流程以及最终确认,根据项目规模(个人小项目 vs. 企业级协同),实现方式可以从简单到复杂。
以下是几种不同场景下的实现方案:
核心数据模型(通用)
无论哪种实现,数据库里通常需要这几张核心表:
- 需求/任务表 (Tasks):
id,title,description,assignee_id(开发人员),deadline,status(开发中/待验收/已通过/已驳回),project_id
- 验收记录表 (AcceptanceRecords):
id,task_id,tester_id(验收人),result(通过/驳回),comment,created_at
- 缺陷表 (Bugs/Issues):
id,task_id,title,severity(严重/一般/建议),status(待修复/已修复/已验证),screenshot,reporter_id,handler_id,resolution_comment
- 项目配置表 (ProjectConfig):
存储验收标准、流程开关等。
简单流程(适合小型团队或内部工具)
实现方式:基于状态机的简单 CRUD + 权限控制。
流程:
- 开发完成:开发者将任务状态从“开发中”改为“待验收”(
status = pending_review)。 - 验收测试:
- 验收人(PM/测试/组长)看到“待验收”列表。
- 验收人点击“开始验收”,系统记录开始时间。
- 验收人执行测试,填写检查结果。
- 结果录入:
- 通过:状态变为“已通过”(
passed),系统自动发通知(邮件/站内信)给开发者。 - 驳回:状态变为“开发中”或“驳回修订”(
rejected),并填写驳回原因(必须填写)。
- 通过:状态变为“已通过”(
PHP 关键代码片段:
// 验收提交处理
public function accept(Request $request, $taskId) {
$task = Task::findOrFail($taskId);
// 权限检查:只有验收人能操作
$this->authorize('accept', $task);
$result = $request->input('result'); // 'passed' 或 'rejected'
$comment = $request->input('comment');
DB::transaction(function () use ($task, $result, $comment, $request) {
// 1. 更新任务状态
if ($result === 'passed') {
$task->status = 'passed';
$task->accepted_at = now();
} else {
$task->status = 'in_development'; // 驳回后回到开发中
// 或者创建一个独立状态 'rejected'
}
$task->save();
// 2. 记录验收日志
AcceptanceRecord::create([
'task_id' => $task->id,
'tester_id' => auth()->id(),
'result' => $result,
'comment' => $comment,
]);
// 3. 如果驳回,可以自动创建一个Bug记录
if ($result === 'rejected') {
// 简化处理
}
});
return redirect()->back()->with('success', '验收操作已完成');
}
优缺点:
- 优点:开发快,代码量少。
- 缺点:流程粗糙,不区分“重大Bug”和“可接受问题”。
标准Bug跟踪流程(适合中等规模团队)
实现方式:任务 + 缺陷独立管理,流程联动。
流程:
- 开发者提交“待验收”。
- 验收人从任务启动验收,进入独立的“验收测试页面”。
- 验收人发现Bug:
- 提交Bug、严重级别、截图、操作步骤,Bug状态为“待修复”。
- Bug自动关联任务。
- 开发者看到关联的Bug,修复后,标记Bug为“已修复”(
fixed)。 - 验收人验证Bug:
- 通过:Bug状态变为“已验证”(
verified)。 - 未通过:重新打开Bug(
reopened)。
- 通过:Bug状态变为“已验证”(
- 任务最终验收:只有当该任务“所有Bug都已解决”时,验收人才可以“通过任务”。
数据库表扩展:
bugs 表中增加 task_id 字段,并维护一个 severity 字段,对于“严重”级别的 Bug,可以设置“一票否决”规则——只要有一个严重 Bug 未关闭,任务就不能通过。
PHP 关键逻辑(任务通过检查):
// 检查任务是否允许被标记为通过
public function canBePassed(Task $task) {
// 1. 统计关联的所有严重 Bug 是否已关闭
$openCriticalBugs = Bug::where('task_id', $task->id)
->whereIn('severity', ['critical', 'blocker'])
->whereIn('status', ['open', 'reopened', 'in_progress'])
->count();
if ($openCriticalBugs > 0) {
return false; // 存在未关闭的严重Bug
}
// 2. 可选:检查是否所有的 Bug 都已被验证
$totalBugs = Bug::where('task_id', $task->id)->count();
$fixedBugs = Bug::where('task_id', $task->id)
->whereIn('status', ['verified', 'closed'])
->count();
return $totalBugs == 0 || $fixedBugs == $totalBugs;
// 如果没有Bug,或者所有Bug都已验证通过
}
多阶段验收(适合复杂产品/合规要求)
实现方式:引入“验收阶段”模型。
流程:
- 阶段定义:项目配置中定义阶段(如:功能验收 -> 集成验收 -> UAT(用户验收测试) -> 安全验收)。
- 任务配置:每个任务可以配置其属于哪个验收阶段。
- 验收记录:每次验收都记录阶段信息。
- 看板视图:使用 Laravel+Vue 或类似技术展示不同阶段的看板,方便拖拽。
实现要点:
- 状态机:任务状态需要支持多个阶段的流转(如
stage1_passed,stage2_rejected)。 - 角色验证:不同阶段可能需要不同的验收人(如 UAT 需要客户,安全需要安全员)。
- 审批流:集成简单的审批流引擎(如 Symfony Workflow 或 Laravel Workflow),或者自己写一个基于角色的 Approval 表。
敏捷/Scrum 验收(适合标准敏捷团队)
实现方式:结合 Sprint 和 Definition of Done (DoD)。
流程:
- Sprint 计划:将任务分配到一个 Sprint。
- Sprint 看板:包含“待开发”、“开发中”、“待验收”、“验收中”、“已完成”等列。
- Acceptance Criteria (验收标准):每个任务在创建时就写明 AC。
- 验收检查清单:在验收界面展示一个 Checkbox 列表,每个 Checkbox 对应一条 AC。
TaskAcceptanceCriteria表:task_id,criteria_text,is_checked,checked_by,checked_at
- Scrum Master 验证:可以设置只有 Scrum Master 或 Product Owner 才能将任务拖入“已完成”。
PHP 示例(检查清单):
// 勾选验收标准
public function checkCriteria(Request $request, $criteriaId) {
$criteria = TaskAcceptanceCriteria::findOrFail($criteriaId);
$this->authorize('check', $criteria); // 只有验收人能操作
$criteria->update([
'is_checked' => $request->boolean('checked'),
'checked_by' => auth()->id(),
'checked_at' => now(),
]);
return response()->json(['success' => true]);
}
辅助功能建议(增强体验)
- 通知系统:
- 当任务“待验收”时,通知验收人。
- 当验收“驳回”时,通知开发者并带上原因。
- 使用 Laravel 的 Notifications 或简单的数据库通知表。
- 附件/截图:
- 验收时可以上传截图作为证据。
- 使用 Laravel 的文件系统(本地或 S3 云存储)保存,并在表单中集成
dropzone.js或FilePond实现拖拽上传。
- 验收报告生成:
- 功能:为一次 Sprint 或一个版本生成 PDF/Excel 报告。
- 实现:使用 Laravel 的
barryvdh/laravel-dompdf或maatwebsite/laravel-excel。
- 历史记录:
- 展示某个任务的完整验收历史(谁、什么时候、说什么、结果是什么)。
- 使用
Activity Log包(如spatie/laravel-activitylog)或自定义日志表。
- 搜索与过滤:
按项目、验收人、状态、时间范围快速筛选“待验收”列表,提高操作效率。
技术栈推荐
- 框架:Laravel(生态最全,文档好),或 ThinkPHP(国内偏多)。
- 前端:Laravel 自带的 Bootstrap + Vue/React,或者完全解耦的 SPA(单页应用) + Inertia.js 或纯 Vue + API。
- 权限:
spatie/laravel-permission或 框架自带的 Auth + 中间件。 - 基础 UI:AdminLTE 或 Tabler(快速搭建后台界面)。
总结建议
- 小项目:直接使用方案一(状态机 + 评论),增删改查即可,不要过度设计。
- 中型项目:方案二(Bug跟踪)是不错的选择,能覆盖 80% 的验收场景。
- 大型或合规项目:方案三或四,但建议考虑是否真的需要(会增加复杂性)。
开发顺序建议:先做好 CRUD 和状态变更,再做权限和通知,最后优化 UI 和报表。