v3.5.4 规格主图、门店使用规则与收银台 logo

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-21 17:36:53 +08:00
parent 62e61a9e63
commit 4d434c9c67
16 changed files with 276 additions and 48 deletions
@@ -0,0 +1,3 @@
-- SKU 规格主图(可选;空则 C 端回落商品封面)
ALTER TABLE `common_product_sku`
ADD COLUMN `image_url` VARCHAR(512) NULL AFTER `sort_order`;
+2
View File
@@ -894,6 +894,8 @@ model CommonProductSku {
bottlesPerUnit Int @default(1) @map("bottles_per_unit")
isDefault Boolean @default(false) @map("is_default")
sortOrder Int @default(0) @map("sort_order")
/// 规格主图;空则回落商品封面
imageUrl String? @map("image_url") @db.VarChar(512)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
@@ -188,6 +188,7 @@ export function mapSkuDto(sku: SkuWithSpecs) {
isDefault: sku.isDefault,
skuCode: sku.skuCode,
barcode69: sku.barcode69,
imageUrl: (sku as { imageUrl?: string | null }).imageUrl || undefined,
sortOrder: sku.sortOrder,
};
}
@@ -555,7 +555,8 @@ export class AdminProductsService {
bottlesPerUnit,
isDefault: !!row.isDefault,
sortOrder: row.sortOrder ?? i,
},
imageUrl: row.imageUrl?.trim() || null,
} as never,
});
await tx.commonProductSkuSpec.deleteMany({ where: { skuId } });
} else {
@@ -574,7 +575,8 @@ export class AdminProductsService {
bottlesPerUnit,
isDefault: !!row.isDefault,
sortOrder: row.sortOrder ?? i,
},
imageUrl: row.imageUrl?.trim() || null,
} as never,
});
skuId = created.id;
}
@@ -9,6 +9,7 @@ import {
IsObject,
IsOptional,
IsString,
MaxLength,
Min,
Max,
MinLength,
@@ -1400,6 +1401,12 @@ class AdminSkuRowDto {
@IsOptional()
@IsNumber()
sortOrder?: number;
/** 规格主图 URL;空则回落商品封面 */
@IsOptional()
@IsString()
@MaxLength(512)
imageUrl?: string | null;
}
export class SaveProductSkusDto {