48 lines
2.0 KiB
TypeScript
48 lines
2.0 KiB
TypeScript
import { Controller, Get, Post, Param, Body, Req } from '@nestjs/common';
|
|
import { ApiTags, ApiOperation, ApiBearerAuth, ApiParam, ApiBody } from '@nestjs/swagger';
|
|
import { IsString, IsOptional } from 'class-validator';
|
|
import { PrePlantingRestrictionService } from '../../application/services/pre-planting-restriction.service';
|
|
import { getClientIp } from '../../shared/utils/get-client-ip';
|
|
|
|
class UnlockRestrictionDto {
|
|
@IsString()
|
|
@IsOptional()
|
|
reason?: string;
|
|
}
|
|
|
|
/**
|
|
* 预种卖出限制管理接口(管理员端)
|
|
*
|
|
* [2026-03-04] 新增:管理员查询/解除用户的预种卖出限制。
|
|
*
|
|
* GET /pre-planting-restriction/:accountSequence → 查询限制状态
|
|
* POST /pre-planting-restriction/:accountSequence/unlock → 解除限制(严格审计)
|
|
*/
|
|
@ApiTags('Pre-planting Restriction')
|
|
@ApiBearerAuth()
|
|
@Controller('pre-planting-restriction')
|
|
export class PrePlantingRestrictionController {
|
|
constructor(private readonly restrictionService: PrePlantingRestrictionService) {}
|
|
|
|
@Get(':accountSequence')
|
|
@ApiOperation({ summary: '查询用户预种卖出限制状态' })
|
|
@ApiParam({ name: 'accountSequence', type: String, description: '账户序列' })
|
|
async getRestrictionStatus(@Param('accountSequence') accountSequence: string) {
|
|
return this.restrictionService.getRestrictionStatus(accountSequence);
|
|
}
|
|
|
|
@Post(':accountSequence/unlock')
|
|
@ApiOperation({ summary: '管理员手动解除预种卖出限制(操作记录审计日志)' })
|
|
@ApiParam({ name: 'accountSequence', type: String, description: '账户序列' })
|
|
@ApiBody({ type: UnlockRestrictionDto, required: false })
|
|
async unlockRestriction(
|
|
@Param('accountSequence') accountSequence: string,
|
|
@Body() body: UnlockRestrictionDto,
|
|
@Req() req: any,
|
|
) {
|
|
const adminId = req.admin?.id || req.admin?.username || 'ADMIN_MANUAL';
|
|
await this.restrictionService.unlockRestriction(adminId, accountSequence, body?.reason, getClientIp(req), req.headers['user-agent']);
|
|
return { success: true };
|
|
}
|
|
}
|