fix(admin): 列设置靠右并支持订单状态多选

HQ 列表主操作居右、列设置贴最右侧;订单筛选状态可多选,导出同步过滤。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-25 14:19:49 +08:00
parent f4da71e952
commit fed8ff3d3a
52 changed files with 566 additions and 437 deletions
@@ -155,7 +155,9 @@ export class AdminOrdersService {
const where: Prisma.OrderWhereInput = {};
if (query.orderNo) where.orderNo = { contains: query.orderNo };
if (query.status) where.status = query.status as Prisma.EnumOrderStatusFilter['equals'];
if (query.status?.length) {
where.status = { in: query.status as Prisma.EnumOrderStatusFilter['in'] };
}
if (query.orderType) where.orderType = query.orderType as Prisma.EnumOrderTypeFilter['equals'];
if (query.userId) where.userId = BigInt(query.userId);
if (query.cityId) where.cityId = BigInt(query.cityId);
@@ -1,6 +1,9 @@
import { OrderStatus } from '@dukang/shared-types';
import { Type, Transform } from 'class-transformer';
import { IsArray, IsBoolean, IsIn, IsInt, IsOptional, IsString, Max, Min } from 'class-validator';
const ORDER_STATUS_VALUES = Object.values(OrderStatus);
function toOptionalBoolean(value: unknown): boolean | undefined {
if (value === undefined || value === null || value === '') return undefined;
if (value === true || value === 'true' || value === '1' || value === 1) return true;
@@ -8,6 +11,19 @@ function toOptionalBoolean(value: unknown): boolean | undefined {
return undefined;
}
/** Query/body:单值、逗号串、重复 key、数组均可 → string[] */
function toOptionalStringList(value: unknown): string[] | undefined {
if (value === undefined || value === null || value === '') return undefined;
const raw = Array.isArray(value) ? value : [value];
const items = [...new Set(
raw
.flatMap((v) => String(v).split(','))
.map((s) => s.trim())
.filter(Boolean),
)];
return items.length ? items : undefined;
}
export class PaginationQueryDto {
@IsOptional()
@Type(() => Number)
@@ -57,9 +73,12 @@ export class AdminOrdersQueryDto extends PaginationQueryDto {
@IsString()
orderNo?: string;
/** 单值或多项:`?status=PENDING_PAY` / `?status=A&status=B` / `?status=A,B` */
@IsOptional()
@IsString()
status?: string;
@Transform(({ value }) => toOptionalStringList(value))
@IsArray()
@IsIn(ORDER_STATUS_VALUES, { each: true })
status?: string[];
@IsOptional()
@IsIn(['NORMAL', 'PROXY'])
@@ -117,8 +136,10 @@ export class AdminOrdersExportDto {
orderNo?: string;
@IsOptional()
@IsString()
status?: string;
@Transform(({ value }) => toOptionalStringList(value))
@IsArray()
@IsIn(ORDER_STATUS_VALUES, { each: true })
status?: string[];
@IsOptional()
@IsIn(['NORMAL', 'PROXY', 'RESHIPMENT'])