feat(product): 实现产品需求管理模块(后端 + 前端)

后端:Product Module(CRUD)、Requirement Module(CRUD + 状态机流转)、PrismaService
前端:产品列表页、产品详情页(含需求池 Tab)、Zustand Store、API 封装

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Script Generator
2026-06-08 11:06:16 +08:00
parent 8de1f93fd3
commit e261c3d0b8
27 changed files with 6993 additions and 3 deletions

View File

@@ -0,0 +1,60 @@
import { Controller, Get, Post, Patch, Delete, Param, Body, Query } from '@nestjs/common';
import { RequirementService } from './requirement.service';
import { CreateRequirementDto } from './dto/create-requirement.dto';
import { UpdateRequirementDto } from './dto/update-requirement.dto';
import { UpdateRequirementStatusDto } from './dto/update-requirement-status.dto';
@Controller('products/:productId/requirements')
export class RequirementController {
constructor(private readonly requirementService: RequirementService) {}
@Post()
create(
@Param('productId') productId: string,
@Body() dto: CreateRequirementDto,
) {
return this.requirementService.create(productId, dto);
}
@Get()
findAll(
@Param('productId') productId: string,
@Query('status') status?: string,
) {
return this.requirementService.findAll(productId, status);
}
@Get(':id')
findOne(
@Param('productId') productId: string,
@Param('id') id: string,
) {
return this.requirementService.findOne(productId, id);
}
@Patch(':id')
update(
@Param('productId') productId: string,
@Param('id') id: string,
@Body() dto: UpdateRequirementDto,
) {
return this.requirementService.update(productId, id, dto);
}
@Patch(':id/status')
updateStatus(
@Param('productId') productId: string,
@Param('id') id: string,
@Body() dto: UpdateRequirementStatusDto,
) {
return this.requirementService.updateStatus(productId, id, dto.status);
}
@Delete(':id')
remove(
@Param('productId') productId: string,
@Param('id') id: string,
) {
return this.requirementService.remove(productId, id);
}
}