import { type CreateIndustryInput, createIndustryInputSchema, type IndustryDetail, type IndustryListQuery, industryListQuerySchema, type IndustryTreeItem, type ListResponse, Permission, type SetIndustryStatusInput, setIndustryStatusInputSchema, type UpdateIndustryInput, updateIndustryInputSchema, } from '@lingxi/shared'; import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Patch, Post, Query, } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { ZodValidationPipe } from '../../common/pipes/zod-validation.pipe'; import { Audit, RequirePermissions } from '../../common/security/decorators'; import { IndustriesService } from './industries.service'; @ApiTags('client-industries') @ApiBearerAuth() @Controller('industries') export class IndustriesController { constructor(@Inject(IndustriesService) private readonly industries: IndustriesService) {} @Get() @RequirePermissions(Permission.CUSTOMER_READ) @ApiOperation({ summary: '两级行业树(一级 → 二级)' }) list( @Query(new ZodValidationPipe(industryListQuerySchema)) query: IndustryListQuery, ): Promise> { return this.industries.list(query); } @Get(':id') @RequirePermissions(Permission.CUSTOMER_READ) @ApiOperation({ summary: '行业详情与引用(子行业 / 客户 / 资产)' }) detail(@Param('id') id: string): Promise { return this.industries.detail(id); } @Post() @RequirePermissions(Permission.CUSTOMER_MANAGE) @Audit('client.industry.create') @ApiOperation({ summary: '新建一级 / 二级行业' }) create( @Body(new ZodValidationPipe(createIndustryInputSchema)) input: CreateIndustryInput, ): Promise { return this.industries.create(input); } @Patch(':id') @RequirePermissions(Permission.CUSTOMER_MANAGE) @Audit('client.industry.update') @ApiOperation({ summary: '更新行业名称 / 排序 / 备注(层级与上级不可变)' }) update( @Param('id') id: string, @Body(new ZodValidationPipe(updateIndustryInputSchema)) input: UpdateIndustryInput, ): Promise { return this.industries.update(id, input); } @Patch(':id/status') @RequirePermissions(Permission.CUSTOMER_MANAGE) @Audit('client.industry.status') @ApiOperation({ summary: '停用 / 启用行业(有启用子行业时禁止停用)' }) setStatus( @Param('id') id: string, @Body(new ZodValidationPipe(setIndustryStatusInputSchema)) input: SetIndustryStatusInput, ): Promise { return this.industries.setStatus(id, input); } @Delete(':id') @HttpCode(204) @RequirePermissions(Permission.CUSTOMER_MANAGE) @Audit('client.industry.delete') @ApiOperation({ summary: '删除行业(仅无子行业 / 客户 / 资产时)' }) async remove(@Param('id') id: string): Promise { await this.industries.remove(id); } }