sa2kit 1.6.52 → 1.6.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/booking-BXtkG2ns.d.mts +386 -0
- package/dist/booking-BXtkG2ns.d.ts +386 -0
- package/dist/bookingAdminService-B2QDjSHJ.d.ts +193 -0
- package/dist/bookingAdminService-Dmg7dC6V.d.mts +193 -0
- package/dist/cart-CcZ7rQyG.d.mts +176 -0
- package/dist/cart-D3o67Q3H.d.ts +176 -0
- package/dist/chunk-53WLQ22S.js +119 -0
- package/dist/chunk-53WLQ22S.js.map +1 -0
- package/dist/{chunk-SHY424RZ.mjs → chunk-6NMIKAE7.mjs} +3 -3
- package/dist/{chunk-SHY424RZ.mjs.map → chunk-6NMIKAE7.mjs.map} +1 -1
- package/dist/chunk-ANKVXRPY.mjs +30 -0
- package/dist/chunk-ANKVXRPY.mjs.map +1 -0
- package/dist/{chunk-IZOIVYOW.js → chunk-DENROXAE.js} +2 -2
- package/dist/{chunk-IZOIVYOW.js.map → chunk-DENROXAE.js.map} +1 -1
- package/dist/chunk-HYZ5C6FY.mjs +3522 -0
- package/dist/chunk-HYZ5C6FY.mjs.map +1 -0
- package/dist/{chunk-7JN25DJB.js → chunk-IPY26RQH.js} +11 -11
- package/dist/{chunk-7JN25DJB.js.map → chunk-IPY26RQH.js.map} +1 -1
- package/dist/{chunk-GFVAIT6Y.mjs → chunk-MFG2Y6UR.mjs} +2 -2
- package/dist/{chunk-GFVAIT6Y.mjs.map → chunk-MFG2Y6UR.mjs.map} +1 -1
- package/dist/chunk-TJZDPOO7.js +34 -0
- package/dist/chunk-TJZDPOO7.js.map +1 -0
- package/dist/chunk-U7AQC2Z7.js +3542 -0
- package/dist/chunk-U7AQC2Z7.js.map +1 -0
- package/dist/chunk-UR5TU4MW.mjs +113 -0
- package/dist/chunk-UR5TU4MW.mjs.map +1 -0
- package/dist/chunk-V6BXO6ZS.mjs +6107 -0
- package/dist/chunk-V6BXO6ZS.mjs.map +1 -0
- package/dist/chunk-W2NCOORK.js +6138 -0
- package/dist/chunk-W2NCOORK.js.map +1 -0
- package/dist/showmasterpiece/db/index.d.mts +3028 -0
- package/dist/showmasterpiece/db/index.d.ts +3028 -0
- package/dist/showmasterpiece/db/index.js +179 -0
- package/dist/showmasterpiece/db/index.js.map +1 -0
- package/dist/showmasterpiece/db/index.mjs +6 -0
- package/dist/showmasterpiece/db/index.mjs.map +1 -0
- package/dist/showmasterpiece/index.d.mts +10 -1729
- package/dist/showmasterpiece/index.d.ts +10 -1729
- package/dist/showmasterpiece/index.js +435 -9654
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +9 -9628
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +372 -0
- package/dist/showmasterpiece/logic/index.d.ts +372 -0
- package/dist/showmasterpiece/logic/index.js +91 -0
- package/dist/showmasterpiece/logic/index.js.map +1 -0
- package/dist/showmasterpiece/logic/index.mjs +6 -0
- package/dist/showmasterpiece/logic/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.d.mts +3 -2704
- package/dist/showmasterpiece/server/index.d.ts +3 -2704
- package/dist/showmasterpiece/server/index.js +43 -43
- package/dist/showmasterpiece/server/index.mjs +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +86 -0
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +86 -0
- package/dist/showmasterpiece/ui/miniapp/index.js +196 -0
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -0
- package/dist/showmasterpiece/ui/miniapp/index.mjs +183 -0
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -0
- package/dist/showmasterpiece/ui/web/index.d.mts +600 -0
- package/dist/showmasterpiece/ui/web/index.d.ts +600 -0
- package/dist/showmasterpiece/ui/web/index.js +131 -0
- package/dist/showmasterpiece/ui/web/index.js.map +1 -0
- package/dist/showmasterpiece/ui/web/index.mjs +14 -0
- package/dist/showmasterpiece/ui/web/index.mjs.map +1 -0
- package/dist/universalFile/server/index.js +5877 -283
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +5795 -4
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/package.json +26 -1
- package/dist/chunk-PKKIDPXE.mjs +0 -5797
- package/dist/chunk-PKKIDPXE.mjs.map +0 -1
- package/dist/chunk-TSTBLX6B.js +0 -5888
- package/dist/chunk-TSTBLX6B.js.map +0 -1
- package/dist/popupConfig-BznThU1O.d.mts +0 -330
- package/dist/popupConfig-BznThU1O.d.ts +0 -330
- package/dist/showmasterpiece/migration/index.d.mts +0 -120
- package/dist/showmasterpiece/migration/index.d.ts +0 -120
- package/dist/showmasterpiece/migration/index.js +0 -595
- package/dist/showmasterpiece/migration/index.js.map +0 -1
- package/dist/showmasterpiece/migration/index.mjs +0 -589
- package/dist/showmasterpiece/migration/index.mjs.map +0 -1
- package/dist/showmasterpiece/scripts/index.d.mts +0 -28
- package/dist/showmasterpiece/scripts/index.d.ts +0 -28
- package/dist/showmasterpiece/scripts/index.js +0 -327
- package/dist/showmasterpiece/scripts/index.js.map +0 -1
- package/dist/showmasterpiece/scripts/index.mjs +0 -325
- package/dist/showmasterpiece/scripts/index.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/showmasterpiece/server/schema/masterpieces.ts","../src/showmasterpiece/server/schema/bookings.ts","../src/showmasterpiece/server/schema/popupConfig.ts","../src/showmasterpiece/server/schema/config.ts","../src/showmasterpiece/server/services/configService.ts","../src/showmasterpiece/server/services/popupConfigService.ts","../src/showmasterpiece/server/services/basicDbService.ts","../src/showmasterpiece/server/services/masterpiecesDbService.ts","../src/showmasterpiece/server/services/bookingQueryService.ts","../src/showmasterpiece/server/services/bookingCommandService.ts"],"names":["pgTable","serial","integer","varchar","text","timestamp","index","relations","boolean","jsonb","db","eq","and","desc","asc","MasterpiecesConfigDbService","CategoriesDbService","TagsDbService","getShowMasterpieceFileConfig","sql","like"],"mappings":"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","file":"chunk-SHY424RZ.mjs","sourcesContent":["/**\n * ShowMasterpiece 模块 - 数据库表结构定义\n * \n * 这个文件定义了ShowMasterpiece模块的完整数据库表结构,使用Drizzle ORM框架。\n * 包含了所有相关的表定义、索引优化和关系映射。\n * \n * 表结构概览:\n * - comicUniverseConfigs: 系统配置表\n * - comicUniverseCategories: 画集分类表 \n * - comicUniverseTags: 标签表\n * - comicUniverseCollections: 画集主表\n * - comicUniverseCollectionTags: 画集标签关联表(多对多)\n * - comicUniverseArtworks: 作品页面表\n * \n * 设计特点:\n * - 完整的外键约束和级联删除\n * - 针对查询场景的索引优化\n * - 支持软删除和发布状态控制\n * - 灵活的分类和标签系统\n * \n * @fileoverview 数据库表结构 - ShowMasterpiece模块\n */\n\nimport { relations } from 'drizzle-orm';\nimport { \n serial, \n text, \n timestamp, \n pgTable, \n json, \n integer, \n boolean,\n varchar,\n uuid,\n index\n} from 'drizzle-orm/pg-core';\n\n/**\n * 系统配置表 (comic_universe_configs)\n * \n * 存储ShowMasterpiece模块的全局配置信息,包括网站设置、显示选项等。\n * 通常只有一条记录,用于控制整个模块的行为和外观。\n * \n * 主要功能:\n * - 网站标题和描述配置\n * - 显示选项和分页设置\n * - 主题和语言设置\n * - 功能开关控制\n */\nexport const comicUniverseConfigs = pgTable('comic_universe_configs', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 网站名称 */\n siteName: varchar('site_name', { length: 255 }).notNull().default('画集展览'),\n \n /** 网站描述 */\n siteDescription: text('site_description').default('精美的艺术作品展览'),\n \n /** 首页主标题 */\n heroTitle: varchar('hero_title', { length: 255 }).notNull().default('艺术画集展览'),\n \n /** 首页副标题 */\n heroSubtitle: text('hero_subtitle').default('探索精美的艺术作品,感受创作的魅力'),\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: integer('max_collections_per_page').notNull().default(9),\n \n /** 是否启用搜索功能 */\n enableSearch: boolean('enable_search').notNull().default(true),\n \n /** 是否启用分类功能 */\n enableCategories: boolean('enable_categories').notNull().default(true),\n\n /** 首页分类Tab配置 */\n homeTabConfig: json('home_tab_config').default([]),\n \n /** 默认分类('all'表示显示所有分类) */\n defaultCategory: varchar('default_category', { length: 100 }).notNull().default('all'),\n \n /** 主题模式:light(浅色)、dark(深色)、auto(自动) */\n theme: varchar('theme', { length: 20 }).notNull().default('light'),\n \n /** 界面语言:zh(中文)、en(英文) */\n language: varchar('language', { length: 10 }).notNull().default('zh'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 画集分类表 (comic_universe_categories)\n * \n * 管理画集的分类信息,支持层级结构和排序。\n * 用于组织和筛选画集,提供更好的浏览体验。\n * \n * 主要功能:\n * - 分类名称和描述管理\n * - 显示顺序控制\n * - 启用/禁用状态控制\n * - 支持未来的层级分类扩展\n */\nexport const comicUniverseCategories = pgTable('comic_universe_categories', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 分类名称(唯一) */\n name: varchar('name', { length: 100 }).notNull().unique(),\n \n /** 分类描述 */\n description: text('description'),\n \n /** 显示顺序(数字越小越靠前) */\n displayOrder: integer('display_order').default(0),\n \n /** 是否启用该分类 */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按启用状态查询的索引 */\n isActiveIndex: index('categories_is_active_idx').on(table.isActive),\n \n /** 按显示顺序排序的索引 */\n displayOrderIndex: index('categories_display_order_idx').on(table.displayOrder),\n \n}));\n\n/**\n * 标签表 (comic_universe_tags)\n * \n * 管理画集的标签信息,支持颜色标识和状态控制。\n * 通过多对多关系与画集关联,实现灵活的标签系统。\n * \n * 主要功能:\n * - 标签名称管理(唯一性约束)\n * - 颜色标识(用于UI显示)\n * - 启用/禁用状态控制\n * - 支持标签的增删改查\n */\nexport const comicUniverseTags = pgTable('comic_universe_tags', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 标签名称(唯一) */\n name: varchar('name', { length: 50 }).notNull().unique(),\n \n /** 标签颜色(十六进制色值,用于UI显示) */\n color: varchar('color', { length: 7 }).default('#3b82f6'),\n \n /** 是否启用该标签 */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按启用状态查询的索引 */\n isActiveIndex: index('tags_is_active_idx').on(table.isActive),\n \n}));\n\n/**\n * 画集主表 (comic_universe_collections)\n * \n * 存储画集的基本信息和元数据,是系统的核心表之一。\n * 每个画集包含多个作品页面,支持分类、发布状态和访问统计。\n * \n * 主要功能:\n * - 画集基本信息(标题、作者、封面、描述)\n * - 分类关联(外键引用)\n * - 发布状态和时间控制\n * - 显示顺序和访问统计\n * - 支持软删除和草稿功能\n */\nexport const comicUniverseCollections = pgTable('comic_universe_collections', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 画集标题 */\n title: varchar('title', { length: 255 }).notNull(),\n \n /** 编号 */\n number: varchar('number', { length: 255 }).notNull(),\n \n /** 封面图片(支持URL或base64编码) */\n coverImage: text('cover_image').notNull(),\n \n /** 通用文件服务的封面图片文件ID(新架构) */\n coverImageFileId: uuid('cover_image_file_id'),\n \n /** 画集描述 */\n description: text('description'),\n \n /** 分类ID(外键,支持级联删除时设为null) */\n categoryId: integer('category_id').references(() => comicUniverseCategories.id, { onDelete: 'set null' }),\n \n /** 是否已发布(false表示草稿状态) */\n isPublished: boolean('is_published').notNull().default(true),\n \n /** 发布时间 */\n publishedAt: timestamp('published_at'),\n \n /** 显示顺序(数字越小越靠前) */\n displayOrder: integer('display_order').default(0),\n \n /** 画集价格(单位:元,null表示免费或价格待定) */\n price: integer('price'),\n \n /** 访问次数统计 */\n viewCount: integer('view_count').notNull().default(0),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按发布状态查询的索引 */\n isPublishedIndex: index('collections_is_published_idx').on(table.isPublished),\n \n /** 按显示顺序排序的索引 */\n displayOrderIndex: index('collections_display_order_idx').on(table.displayOrder),\n \n /** 按分类查询的索引 */\n categoryIdIndex: index('collections_category_id_idx').on(table.categoryId),\n \n /** 已发布画集按顺序排序的复合索引(优化首页查询) */\n publishedOrderIndex: index('collections_published_order_idx').on(table.isPublished, table.displayOrder),\n \n /** 已发布画集按创建时间排序的复合索引(优化时间线查询) */\n publishedCreatedIndex: index('collections_published_created_idx').on(table.isPublished, table.createdAt),\n \n /** 封面图片文件ID查询索引(新架构) */\n coverImageFileIdIndex: index('collections_cover_image_file_id_idx').on(table.coverImageFileId),\n}));\n\n/**\n * 画集标签关联表 (comic_universe_collection_tags)\n * \n * 实现画集和标签之间的多对多关系。\n * 每个画集可以有多个标签,每个标签也可以关联多个画集。\n * \n * 主要功能:\n * - 画集与标签的多对多关联\n * - 支持级联删除(删除画集或标签时自动清理关联)\n * - 复合主键确保关联的唯一性\n * - 针对查询场景的索引优化\n */\nexport const comicUniverseCollectionTags = pgTable('comic_universe_collection_tags', {\n /** 画集ID(外键,级联删除) */\n collectionId: integer('collection_id').notNull().references(() => comicUniverseCollections.id, { onDelete: 'cascade' }),\n \n /** 标签ID(外键,级联删除) */\n tagId: integer('tag_id').notNull().references(() => comicUniverseTags.id, { onDelete: 'cascade' }),\n}, (table) => ({\n /** 复合主键,确保同一画集不会重复关联同一标签 */\n pk: { primaryKey: [table.collectionId, table.tagId] },\n \n /** 按画集查询标签的索引 */\n collectionIdIndex: index('collection_tags_collection_id_idx').on(table.collectionId),\n \n /** 按标签查询画集的索引 */\n tagIdIndex: index('collection_tags_tag_id_idx').on(table.tagId),\n}));\n\n/**\n * 作品页面表 (comic_universe_artworks)\n * \n * 存储画集中的具体作品信息,每个画集包含多个作品页面。\n * 支持详细的作品元数据和页面排序功能。\n * \n * 主要功能:\n * - 作品详细信息(标题、作者、图片、描述等)\n * - 艺术作品元数据(创作时间、主题、尺寸等)\n * - 在画集中的页面顺序控制\n * - 启用/禁用状态(软删除)\n * - 支持富文本描述和多媒体内容\n */\nexport const comicUniverseArtworks = pgTable('comic_universe_artworks', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 所属画集ID(外键,级联删除) */\n collectionId: integer('collection_id').notNull().references(() => comicUniverseCollections.id, { onDelete: 'cascade' }),\n \n /** 作品标题 */\n title: varchar('title', { length: 255 }).notNull(),\n \n /** 编号 */\n number: varchar('number', { length: 255 }).notNull(),\n \n /** 作品图片(支持URL或base64编码,兼容旧数据) */\n image: text('image'),\n \n /** 通用文件服务的文件ID(新架构) */\n fileId: uuid('file_id'),\n \n /** 迁移状态:pending(待迁移), completed(已完成), failed(失败) */\n migrationStatus: varchar('migration_status', { length: 20 }).default('pending'),\n \n /** 作品描述 */\n description: text('description'),\n \n /** 创作时间(自由格式,如\"2024年春\" \"明代\" 等) */\n createdTime: varchar('created_time', { length: 20 }),\n \n /** 作品主题(如\"山水\" \"人物\" \"静物\"等) */\n theme: varchar('theme', { length: 255 }),\n \n /** 作品尺寸(如\"120x80cm\" \"A4\" 等) */\n dimensions: varchar('dimensions', { length: 100 }),\n \n /** 在画集中的页面顺序(从0开始) */\n pageOrder: integer('page_order').notNull().default(0),\n \n /** 是否启用(false表示已删除或隐藏) */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按画集查询作品的索引 */\n collectionIdIndex: index('artworks_collection_id_idx').on(table.collectionId),\n \n /** 按启用状态查询的索引 */\n isActiveIndex: index('artworks_is_active_idx').on(table.isActive),\n \n /** 按页面顺序排序的索引 */\n pageOrderIndex: index('artworks_page_order_idx').on(table.pageOrder),\n \n /** 画集和启用状态的复合索引(优化画集内容查询) */\n collectionActiveIndex: index('artworks_collection_active_idx').on(table.collectionId, table.isActive),\n \n /** 画集和页面顺序的复合索引(优化排序查询) */\n collectionOrderIndex: index('artworks_collection_order_idx').on(table.collectionId, table.pageOrder),\n \n /** 画集、启用状态和页面顺序的三元复合索引(优化完整查询) */\n collectionActiveOrderIndex: index('artworks_collection_active_order_idx').on(table.collectionId, table.isActive, table.pageOrder),\n \n /** 文件ID查询索引(新架构) */\n fileIdIndex: index('artworks_file_id_idx').on(table.fileId),\n \n /** 迁移状态查询索引 */\n migrationStatusIndex: index('artworks_migration_status_idx').on(table.migrationStatus),\n}));\n\n// ===== 关系定义 =====\n// 使用Drizzle ORM的关系定义,实现表之间的关联查询\n\n/**\n * 系统配置表关系\n * 配置表通常只有一条记录,不需要复杂的关系定义\n */\nexport const comicUniverseConfigsRelations = relations(comicUniverseConfigs, ({ many }) => ({\n // 配置表通常只有一条记录,不需要关系\n}));\n\n/**\n * 分类表关系\n * 一个分类可以包含多个画集,并属于一个活动\n */\nexport const comicUniverseCategoriesRelations = relations(comicUniverseCategories, ({ many }) => ({\n /** 该分类下的所有画集 */\n collections: many(comicUniverseCollections),\n}));\n\n/**\n * 标签表关系\n * 一个标签可以关联多个画集(通过关联表),并属于一个活动\n */\nexport const comicUniverseTagsRelations = relations(comicUniverseTags, ({ many }) => ({\n /** 该标签的所有关联记录 */\n collectionTags: many(comicUniverseCollectionTags),\n}));\n\n/**\n * 画集表关系\n * 画集属于一个分类,包含多个作品,可以有多个标签,并属于一个活动\n */\nexport const comicUniverseCollectionsRelations = relations(comicUniverseCollections, ({ one, many }) => ({\n /** 所属分类 */\n category: one(comicUniverseCategories, {\n fields: [comicUniverseCollections.categoryId],\n references: [comicUniverseCategories.id],\n }),\n \n /** 包含的所有作品页面 */\n artworks: many(comicUniverseArtworks),\n \n /** 关联的所有标签记录 */\n collectionTags: many(comicUniverseCollectionTags),\n}));\n\n/**\n * 画集标签关联表关系\n * 连接画集和标签的中间表\n */\nexport const comicUniverseCollectionTagsRelations = relations(comicUniverseCollectionTags, ({ one }) => ({\n /** 关联的画集 */\n collection: one(comicUniverseCollections, {\n fields: [comicUniverseCollectionTags.collectionId],\n references: [comicUniverseCollections.id],\n }),\n \n /** 关联的标签 */\n tag: one(comicUniverseTags, {\n fields: [comicUniverseCollectionTags.tagId],\n references: [comicUniverseTags.id],\n }),\n}));\n\n/**\n * 作品表关系\n * 作品属于一个画集\n */\nexport const comicUniverseArtworksRelations = relations(comicUniverseArtworks, ({ one }) => ({\n /** 所属画集 */\n collection: one(comicUniverseCollections, {\n fields: [comicUniverseArtworks.collectionId],\n references: [comicUniverseCollections.id],\n }),\n})); \n","/**\n * ShowMasterpiece 模块 - 预订表结构定义\n * \n * 这个文件定义了画集预订功能的数据库表结构,使用Drizzle ORM框架。\n * 包含了预订表和相关的关系映射。\n * \n * 表结构概览:\n * - comicUniverseBookings: 画集预订表\n * \n * 设计特点:\n * - 完整的外键约束和级联删除\n * - 针对查询场景的索引优化\n * - 支持预订状态管理\n * - 记录用户联系信息和预订详情\n * - 支持用户对同一画集进行多次预订\n * \n * @fileoverview 数据库表结构 - 画集预订功能\n */\n\nimport { relations } from 'drizzle-orm';\nimport { \n serial, \n text, \n timestamp, \n pgTable, \n integer, \n boolean,\n varchar,\n index\n} from 'drizzle-orm/pg-core';\nimport { comicUniverseCollections } from './masterpieces';\n\n/**\n * 画集预订表 (comic_universe_bookings)\n * \n * 存储用户对画集的预订信息,包括联系方式和预订详情。\n * 支持预订状态管理和历史记录查询。\n * \n * 主要功能:\n * - 记录用户预订的画集和数量\n * - 存储用户联系方式(QQ号+手机号)\n * - 预订状态管理(待确认、已确认、已完成、已取消)\n * - 预订时间记录和备注信息\n * - 支持管理员处理预订\n * - 支持对同一画集的多次预订\n */\nexport const comicUniverseBookings = pgTable('comic_universe_bookings', {\n /** 自增ID(用于内部管理) */\n id: serial('id'),\n \n /** 预订的画集ID(外键,级联删除) */\n collectionId: integer('collection_id').notNull().references(() => comicUniverseCollections.id, { onDelete: 'cascade' }),\n \n /** 用户QQ号 */\n qqNumber: varchar('qq_number', { length: 20 }).notNull(),\n \n /** 用户手机号 */\n phoneNumber: varchar('phone_number', { length: 20 }).notNull(),\n \n /** 预订数量 */\n quantity: integer('quantity').notNull().default(1),\n \n /** 预订状态:pending(待确认)、confirmed(已确认)、completed(已完成)、cancelled(已取消) */\n status: varchar('status', { length: 20 }).notNull().default('pending'),\n \n /** 预订备注信息 */\n notes: text('notes'),\n \n /** 领取方式 */\n pickupMethod: text('pickup_method'),\n \n /** 管理员处理备注 */\n adminNotes: text('admin_notes'),\n \n /** 预订时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n \n /** 确认时间 */\n confirmedAt: timestamp('confirmed_at'),\n \n /** 完成时间 */\n completedAt: timestamp('completed_at'),\n \n /** 取消时间 */\n cancelledAt: timestamp('cancelled_at'),\n}, (table) => ({\n // 移除复合主键约束,允许用户对同一画集进行多次预订\n // userCollectionPk: primaryKey({ columns: [table.qqNumber, table.phoneNumber, table.collectionId] }),\n \n /** 按画集查询预订的索引 */\n collectionIdIndex: index('bookings_collection_id_idx').on(table.collectionId),\n \n /** 按状态查询的索引 */\n statusIndex: index('bookings_status_idx').on(table.status),\n \n /** 按QQ号查询的索引 */\n qqNumberIndex: index('bookings_qq_number_idx').on(table.qqNumber),\n \n /** 按手机号查询的索引 */\n phoneNumberIndex: index('bookings_phone_number_idx').on(table.phoneNumber),\n \n /** 按创建时间排序的索引 */\n createdAtIndex: index('bookings_created_at_idx').on(table.createdAt),\n \n /** 画集和状态的复合索引(优化画集预订查询) */\n collectionStatusIndex: index('bookings_collection_status_idx').on(table.collectionId, table.status),\n \n /** QQ号和状态的复合索引(优化用户预订查询) */\n qqStatusIndex: index('bookings_qq_status_idx').on(table.qqNumber, table.status),\n \n /** QQ号+手机号的复合索引(优化用户查询) */\n userIndex: index('bookings_user_idx').on(table.qqNumber, table.phoneNumber),\n \n /** QQ号+手机号+状态的复合索引(优化用户状态查询) */\n userStatusIndex: index('bookings_user_status_idx').on(table.qqNumber, table.phoneNumber, table.status),\n}));\n\n// ===== 关系定义 =====\n\n/**\n * 预订表关系\n * 预订属于一个画集\n */\nexport const comicUniverseBookingsRelations = relations(comicUniverseBookings, ({ one }) => ({\n /** 预订的画集 */\n collection: one(comicUniverseCollections, {\n fields: [comicUniverseBookings.collectionId],\n references: [comicUniverseCollections.id],\n }),\n \n})); \n","/**\n * ShowMasterpiece 模块 - 弹窗配置表结构\n * \n * 管理限时弹窗的配置信息\n * \n * @fileoverview 弹窗配置数据库schema\n */\n\nimport { pgTable, text, timestamp, boolean, jsonb } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n/**\n * 弹窗配置表\n */\nexport const popupConfigs = pgTable('popup_configs', {\n /** 配置ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 配置名称 */\n name: text('name').notNull(),\n \n /** 配置描述 */\n description: text('description'),\n \n /** 弹窗类型 */\n type: text('type').notNull().default('deadline'), // deadline, announcement, etc.\n \n /** 是否启用 */\n enabled: boolean('enabled').default(false),\n \n /** 触发条件配置 */\n triggerConfig: jsonb('trigger_config').notNull().$type<{\n /** 截止时间 ISO 字符串 */\n deadlineTime?: string;\n /** 提前提醒时间(分钟) */\n advanceMinutes?: number;\n /** 触发条件类型 */\n triggerType: 'after_deadline' | 'before_deadline' | 'always';\n }>(),\n \n /** 弹窗内容配置 */\n contentConfig: jsonb('content_config').notNull().$type<{\n /** 弹窗标题 */\n title: string;\n /** 弹窗内容 */\n message: string;\n /** 确认按钮文本 */\n confirmText?: string;\n /** 取消按钮文本 */\n cancelText?: string;\n /** 是否显示取消按钮 */\n showCancel?: boolean;\n /** 弹窗主题 */\n theme?: 'warning' | 'info' | 'error' | 'success';\n }>(),\n \n /** 显示设置 */\n displayConfig: jsonb('display_config').$type<{\n /** 弹窗宽度 */\n width?: number;\n /** 弹窗高度 */\n height?: number | string;\n /** 是否可点击遮罩关闭 */\n maskClosable?: boolean;\n /** 自动关闭时间(秒,0表示不自动关闭) */\n autoCloseSeconds?: number;\n }>(),\n\n /** 是否阻断流程 - true: 阻断提交,false: 仅提醒但允许继续 */\n blockProcess: boolean('block_process').default(false),\n \n /** 业务模块 */\n businessModule: text('business_module').notNull().default('showmasterpiece'),\n \n /** 业务场景 */\n businessScene: text('business_scene').notNull().default('cart_checkout'),\n \n /** 排序权重 */\n sortOrder: text('sort_order').default('0'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n/**\n * 弹窗配置表关系\n */\nexport const popupConfigsRelations = relations(popupConfigs, () => ({}));\n\nexport type PopupConfig = typeof popupConfigs.$inferSelect;\nexport type NewPopupConfig = typeof popupConfigs.$inferInsert;\n","/**\n * ShowMasterpiece模块 - 配置管理数据库表结构\n * \n * 独立的配置管理表,不依赖全局配置表\n * 用于模块独立化部署\n */\n\nimport { pgTable, text, timestamp, boolean, integer, jsonb } from 'drizzle-orm/pg-core';\n\n/**\n * ShowMasterPieces配置分类表\n * 表名:showmaster_config_categories\n */\nexport const showmasterConfigCategories = pgTable('showmaster_config_categories', {\n /** 配置分类ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 分类名称(用于代码引用) */\n name: text('name').notNull(),\n \n /** 显示名称(用于界面显示) */\n displayName: text('display_name').notNull(),\n \n /** 分类描述 */\n description: text('description'),\n \n /** 分类图标 */\n icon: text('icon'),\n \n /** 排序顺序 */\n sortOrder: integer('sort_order').default(0),\n \n /** 是否激活 */\n isActive: boolean('is_active').default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n/**\n * ShowMasterPieces配置项表\n * 表名:showmaster_config_items\n */\nexport const showmasterConfigItems = pgTable('showmaster_config_items', {\n /** 配置项ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 分类ID */\n categoryId: text('category_id').references(() => showmasterConfigCategories.id),\n \n /** 配置键(必须唯一) */\n key: text('key').notNull().unique(),\n \n /** 显示名称 */\n displayName: text('display_name').notNull(),\n \n /** 配置描述 */\n description: text('description'),\n \n /** 配置值 */\n value: text('value'),\n \n /** 默认值 */\n defaultValue: text('default_value'),\n \n /** 配置类型:string, number, boolean, json, password */\n type: text('type').notNull(),\n \n /** 是否必填 */\n isRequired: boolean('is_required').default(false),\n \n /** 是否敏感信息 */\n isSensitive: boolean('is_sensitive').default(false),\n \n /** 验证规则(JSON格式) */\n validation: jsonb('validation'),\n \n /** 排序顺序 */\n sortOrder: integer('sort_order').default(0),\n \n /** 是否激活 */\n isActive: boolean('is_active').default(true),\n \n /** 环境标识(development, production, testing等) */\n environment: text('environment').default('development'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n/**\n * ShowMasterPieces配置历史表\n * 表名:showmaster_config_history\n */\nexport const showmasterConfigHistory = pgTable('showmaster_config_history', {\n /** 历史记录ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 配置项ID */\n configItemId: text('config_item_id').references(() => showmasterConfigItems.id),\n \n /** 旧值 */\n oldValue: text('old_value'),\n \n /** 新值 */\n newValue: text('new_value'),\n \n /** 修改人 */\n changedBy: text('changed_by').notNull(),\n \n /** 修改原因 */\n changeReason: text('change_reason'),\n \n /** 操作类型:create, update, delete */\n operationType: text('operation_type').notNull(),\n \n /** 环境标识 */\n environment: text('environment').default('development'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n});\n\n/**\n * ShowMasterPieces配置权限表(可选,用于细粒度权限控制)\n * 表名:showmaster_config_permissions\n */\nexport const showmasterConfigPermissions = pgTable('showmaster_config_permissions', {\n /** 权限ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 用户ID */\n userId: text('user_id').notNull(),\n \n /** 分类ID */\n categoryId: text('category_id').references(() => showmasterConfigCategories.id),\n \n /** 可读权限 */\n canRead: boolean('can_read').default(true),\n \n /** 可写权限 */\n canWrite: boolean('can_write').default(false),\n \n /** 可删除权限 */\n canDelete: boolean('can_delete').default(false),\n \n /** 环境权限(可以访问的环境) */\n allowedEnvironments: jsonb('allowed_environments').$type<string[]>().default(['development']),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n// 导出类型定义\nexport type ShowmasterConfigCategory = typeof showmasterConfigCategories.$inferSelect;\nexport type NewShowmasterConfigCategory = typeof showmasterConfigCategories.$inferInsert;\n\nexport type ShowmasterConfigItem = typeof showmasterConfigItems.$inferSelect;\nexport type NewShowmasterConfigItem = typeof showmasterConfigItems.$inferInsert;\n\nexport type ShowmasterConfigHistory = typeof showmasterConfigHistory.$inferSelect;\nexport type NewShowmasterConfigHistory = typeof showmasterConfigHistory.$inferInsert;\n\nexport type ShowmasterConfigPermission = typeof showmasterConfigPermissions.$inferSelect;\nexport type NewShowmasterConfigPermission = typeof showmasterConfigPermissions.$inferInsert;\n","/**\n * ShowMasterpiece模块 - 配置管理数据库服务\n * \n * 独立的配置管理服务,不依赖全局配置服务\n */\n\nimport { \n showmasterConfigCategories, \n showmasterConfigItems, \n showmasterConfigHistory,\n showmasterConfigPermissions,\n ShowmasterConfigCategory,\n ShowmasterConfigItem,\n ShowmasterConfigHistory,\n NewShowmasterConfigCategory,\n NewShowmasterConfigItem,\n NewShowmasterConfigHistory\n} from '../schema/config';\nimport { eq, and, like, desc, asc, sql, count } from 'drizzle-orm';\n\n/**\n * 配置搜索参数\n */\ninterface ConfigSearchParams {\n categoryId?: string;\n search?: string;\n type?: 'string' | 'number' | 'boolean' | 'json' | 'password';\n environment?: string;\n isActive?: boolean;\n page?: number;\n pageSize?: number;\n}\n\n/**\n * 分页响应\n */\ninterface PaginatedResponse<T> {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n/**\n * ShowMasterPieces配置管理服务\n */\nexport class ShowmasterConfigService {\n constructor(private readonly db: any) {}\n // ============= 配置分类管理 =============\n\n /**\n * 获取所有配置分类\n */\n async getAllCategories(): Promise<ShowmasterConfigCategory[]> {\n console.log('🎨 [ShowmasterConfigService] 获取所有配置分类');\n \n return await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(eq(showmasterConfigCategories.isActive, true))\n .orderBy(asc(showmasterConfigCategories.sortOrder), asc(showmasterConfigCategories.displayName));\n }\n\n /**\n * 根据ID获取配置分类\n */\n async getCategoryById(id: string): Promise<ShowmasterConfigCategory | null> {\n console.log('🎨 [ShowmasterConfigService] 获取配置分类:', id);\n \n const [category] = await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(and(\n eq(showmasterConfigCategories.id, id),\n eq(showmasterConfigCategories.isActive, true)\n ));\n \n return category || null;\n }\n\n /**\n * 根据名称获取配置分类\n */\n async getCategoryByName(name: string): Promise<ShowmasterConfigCategory | null> {\n console.log('🎨 [ShowmasterConfigService] 根据名称获取配置分类:', name);\n \n const [category] = await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(and(\n eq(showmasterConfigCategories.name, name),\n eq(showmasterConfigCategories.isActive, true)\n ));\n \n return category || null;\n }\n\n /**\n * 创建配置分类\n */\n async createCategory(data: Omit<NewShowmasterConfigCategory, 'id' | 'createdAt' | 'updatedAt'>): Promise<ShowmasterConfigCategory> {\n console.log('🎨 [ShowmasterConfigService] 创建配置分类:', data.name);\n \n const [category] = await this.db\n .insert(showmasterConfigCategories)\n .values({\n ...data,\n updatedAt: new Date(),\n })\n .returning();\n\n console.log('✅ [ShowmasterConfigService] 配置分类创建成功:', category.id);\n return category;\n }\n\n /**\n * 更新配置分类\n */\n async updateCategory(id: string, data: Partial<Omit<ShowmasterConfigCategory, 'id' | 'createdAt'>>): Promise<ShowmasterConfigCategory> {\n console.log('🎨 [ShowmasterConfigService] 更新配置分类:', id);\n \n const [category] = await this.db\n .update(showmasterConfigCategories)\n .set({\n ...data,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigCategories.id, id))\n .returning();\n\n if (!category) {\n throw new Error('配置分类不存在');\n }\n\n console.log('✅ [ShowmasterConfigService] 配置分类更新成功:', category.id);\n return category;\n }\n\n /**\n * 删除配置分类\n */\n async deleteCategory(id: string): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 删除配置分类:', id);\n \n // 软删除:设置为不活跃\n await this.db\n .update(showmasterConfigCategories)\n .set({\n isActive: false,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigCategories.id, id));\n\n console.log('✅ [ShowmasterConfigService] 配置分类删除成功:', id);\n }\n\n // ============= 配置项管理 =============\n\n /**\n * 获取配置项列表(支持分页和搜索)\n */\n async getConfigItems(params: ConfigSearchParams = {}): Promise<PaginatedResponse<ShowmasterConfigItem>> {\n const {\n categoryId,\n search,\n type,\n environment = 'development',\n isActive = true,\n page = 1,\n pageSize = 50\n } = params;\n\n console.log('🎨 [ShowmasterConfigService] 获取配置项列表:', { environment, page, pageSize });\n\n // 构建查询条件\n const conditions = [];\n \n if (isActive !== undefined) {\n conditions.push(eq(showmasterConfigItems.isActive, isActive));\n }\n \n if (categoryId) {\n conditions.push(eq(showmasterConfigItems.categoryId, categoryId));\n }\n \n if (type) {\n conditions.push(eq(showmasterConfigItems.type, type));\n }\n \n if (environment) {\n conditions.push(eq(showmasterConfigItems.environment, environment));\n }\n \n if (search) {\n conditions.push(\n sql`(${showmasterConfigItems.key} ILIKE ${'%' + search + '%'} OR \n ${showmasterConfigItems.displayName} ILIKE ${'%' + search + '%'} OR \n ${showmasterConfigItems.description} ILIKE ${'%' + search + '%'})`\n );\n }\n\n const whereCondition = conditions.length > 0 ? and(...conditions) : undefined;\n\n // 获取总数\n const [{ totalCount }] = await this.db\n .select({ totalCount: count() })\n .from(showmasterConfigItems)\n .where(whereCondition);\n\n // 获取数据\n const items = await this.db\n .select()\n .from(showmasterConfigItems)\n .where(whereCondition)\n .orderBy(asc(showmasterConfigItems.sortOrder), asc(showmasterConfigItems.displayName))\n .limit(pageSize)\n .offset((page - 1) * pageSize);\n\n const totalPages = Math.ceil(totalCount / pageSize);\n\n console.log(`✅ [ShowmasterConfigService] 找到 ${items.length}/${totalCount} 个配置项`);\n\n return {\n items,\n total: totalCount,\n page,\n pageSize,\n totalPages,\n };\n }\n\n /**\n * 根据ID获取配置项\n */\n async getConfigItemById(id: string): Promise<ShowmasterConfigItem | null> {\n console.log('🎨 [ShowmasterConfigService] 获取配置项:', id);\n \n const [item] = await this.db\n .select()\n .from(showmasterConfigItems)\n .where(eq(showmasterConfigItems.id, id));\n \n return item || null;\n }\n\n /**\n * 根据key获取配置项\n */\n async getConfigItemByKey(key: string, environment: string = 'development'): Promise<ShowmasterConfigItem | null> {\n console.log('🎨 [ShowmasterConfigService] 根据key获取配置项:', key, '环境:', environment);\n \n const [item] = await this.db\n .select()\n .from(showmasterConfigItems)\n .where(and(\n eq(showmasterConfigItems.key, key),\n eq(showmasterConfigItems.environment, environment),\n eq(showmasterConfigItems.isActive, true)\n ));\n \n return item || null;\n }\n\n /**\n * 创建配置项\n */\n async createConfigItem(data: Omit<NewShowmasterConfigItem, 'id' | 'createdAt' | 'updatedAt'>): Promise<ShowmasterConfigItem> {\n console.log('🎨 [ShowmasterConfigService] 创建配置项:', data.key);\n \n // 检查key是否已存在\n const existingItem = await this.getConfigItemByKey(data.key, data.environment || 'development');\n if (existingItem) {\n throw new Error(`配置项 ${data.key} 在 ${data.environment || 'development'} 环境中已存在`);\n }\n\n const [item] = await this.db\n .insert(showmasterConfigItems)\n .values({\n ...data,\n updatedAt: new Date(),\n })\n .returning();\n\n // 记录历史\n await this.recordHistory(item.id, null, item.value, 'system', 'create', item.environment || 'development');\n\n console.log('✅ [ShowmasterConfigService] 配置项创建成功:', item.id);\n return item;\n }\n\n /**\n * 更新配置项\n */\n async updateConfigItem(id: string, data: Partial<Omit<ShowmasterConfigItem, 'id' | 'createdAt'>>, changedBy: string = 'system'): Promise<ShowmasterConfigItem> {\n console.log('🎨 [ShowmasterConfigService] 更新配置项:', id);\n \n // 获取旧值用于历史记录\n const oldItem = await this.getConfigItemById(id);\n if (!oldItem) {\n throw new Error('配置项不存在');\n }\n\n const [item] = await this.db\n .update(showmasterConfigItems)\n .set({\n ...data,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigItems.id, id))\n .returning();\n\n if (!item) {\n throw new Error('配置项不存在');\n }\n\n // 记录历史(如果值发生变化)\n if (data.value !== undefined && data.value !== oldItem.value) {\n await this.recordHistory(item.id, oldItem.value, data.value, changedBy, 'update', item.environment || 'development');\n }\n\n console.log('✅ [ShowmasterConfigService] 配置项更新成功:', item.id);\n return item;\n }\n\n /**\n * 删除配置项\n */\n async deleteConfigItem(id: string, changedBy: string = 'system'): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 删除配置项:', id);\n \n // 获取配置项信息用于历史记录\n const item = await this.getConfigItemById(id);\n if (!item) {\n throw new Error('配置项不存在');\n }\n\n // 记录历史\n await this.recordHistory(item.id, item.value, null, changedBy, 'delete', item.environment || 'development');\n\n // 软删除:设置为不活跃\n await this.db\n .update(showmasterConfigItems)\n .set({\n isActive: false,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigItems.id, id));\n\n console.log('✅ [ShowmasterConfigService] 配置项删除成功:', id);\n }\n\n // ============= 历史记录管理 =============\n\n /**\n * 记录配置变更历史\n */\n private async recordHistory(\n configItemId: string,\n oldValue: string | null,\n newValue: string | null,\n changedBy: string,\n operationType: 'create' | 'update' | 'delete',\n environment: string\n ): Promise<void> {\n try {\n await this.db\n .insert(showmasterConfigHistory)\n .values({\n configItemId,\n oldValue,\n newValue,\n changedBy,\n operationType,\n environment,\n });\n \n console.log(`📝 [ShowmasterConfigService] 历史记录已保存: ${operationType} for ${configItemId}`);\n } catch (error) {\n console.error('❌ [ShowmasterConfigService] 保存历史记录失败:', error);\n // 不抛出错误,避免影响主要操作\n }\n }\n\n /**\n * 获取配置项历史记录\n */\n async getConfigItemHistory(configItemId: string, limit: number = 50): Promise<ShowmasterConfigHistory[]> {\n console.log('🎨 [ShowmasterConfigService] 获取配置项历史:', configItemId);\n \n return await this.db\n .select()\n .from(showmasterConfigHistory)\n .where(eq(showmasterConfigHistory.configItemId, configItemId))\n .orderBy(desc(showmasterConfigHistory.createdAt))\n .limit(limit);\n }\n\n // ============= 工具方法 =============\n\n /**\n * 获取配置值(带类型转换)\n */\n async getConfigValue<T = string>(key: string, environment: string = 'development'): Promise<T | null> {\n const item = await this.getConfigItemByKey(key, environment);\n \n if (!item || !item.value) {\n return null;\n }\n\n try {\n switch (item.type) {\n case 'number':\n return Number(item.value) as T;\n case 'boolean':\n return (item.value.toLowerCase() === 'true') as T;\n case 'json':\n return JSON.parse(item.value) as T;\n default:\n return item.value as T;\n }\n } catch (error) {\n console.error(`❌ [ShowmasterConfigService] 配置值类型转换失败: ${key}`, error);\n return item.value as T;\n }\n }\n\n /**\n * 设置配置值\n */\n async setConfigValue(key: string, value: any, environment: string = 'development', changedBy: string = 'system'): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 设置配置值:', key, '环境:', environment);\n \n const item = await this.getConfigItemByKey(key, environment);\n \n if (!item) {\n throw new Error(`配置项 ${key} 在 ${environment} 环境中不存在`);\n }\n\n let stringValue: string;\n \n try {\n switch (item.type) {\n case 'json':\n stringValue = JSON.stringify(value);\n break;\n default:\n stringValue = String(value);\n break;\n }\n } catch (error) {\n throw new Error(`配置值转换失败: ${error}`);\n }\n\n await this.updateConfigItem(item.id, { value: stringValue }, changedBy);\n }\n\n /**\n * 初始化默认配置分类\n */\n async initializeDefaultCategories(): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 初始化默认配置分类');\n \n const defaultCategories = [\n {\n name: 'general',\n displayName: '通用配置',\n description: 'ShowMasterPieces模块通用配置项',\n icon: '⚙️',\n sortOrder: 0,\n },\n {\n name: 'display',\n displayName: '显示配置',\n description: '界面显示相关配置',\n icon: '🎨',\n sortOrder: 1,\n },\n {\n name: 'business',\n displayName: '业务配置',\n description: '业务逻辑相关配置',\n icon: '💼',\n sortOrder: 2,\n },\n {\n name: 'integration',\n displayName: '集成配置',\n description: '第三方服务集成配置',\n icon: '🔗',\n sortOrder: 3,\n },\n ];\n\n for (const category of defaultCategories) {\n try {\n // 检查是否已存在\n const existing = await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(eq(showmasterConfigCategories.name, category.name));\n\n if (existing.length === 0) {\n await this.createCategory(category);\n console.log(`✅ [ShowmasterConfigService] 默认分类创建成功: ${category.name}`);\n }\n } catch (error) {\n console.error(`❌ [ShowmasterConfigService] 创建默认分类失败: ${category.name}`, error);\n }\n }\n }\n}\n\n// 导出单例实例\n\n\nexport function createShowmasterConfigService(db: any): ShowmasterConfigService {\n return new ShowmasterConfigService(db);\n}\n","/**\n * ShowMasterpiece 模块 - 弹窗配置数据库服务\n * \n * 提供弹窗配置的CRUD操作\n * \n * @fileoverview 弹窗配置数据库服务\n */\n\nimport { eq, and, desc } from 'drizzle-orm';\nimport { popupConfigs, PopupConfig, NewPopupConfig } from '../schema/popupConfig';\n\nexport class PopupConfigService {\n constructor(private readonly db: any) {}\n /**\n * 创建弹窗配置\n */\n async createPopupConfig(data: Omit<NewPopupConfig, 'id' | 'createdAt' | 'updatedAt'>): Promise<PopupConfig> {\n try {\n const [config] = await this.db\n .insert(popupConfigs)\n .values({\n ...data,\n updatedAt: new Date(),\n })\n .returning();\n\n console.log('✅ [PopupConfigService] 弹窗配置创建成功:', config.id);\n return config;\n } catch (error) {\n console.error('❌ [PopupConfigService] 创建弹窗配置失败:', error);\n throw new Error('创建弹窗配置失败');\n }\n }\n\n /**\n * 根据ID获取弹窗配置\n */\n async getPopupConfigById(id: string): Promise<PopupConfig | null> {\n try {\n const [config] = await this.db\n .select()\n .from(popupConfigs)\n .where(eq(popupConfigs.id, id))\n .limit(1);\n\n return config || null;\n } catch (error) {\n console.error('❌ [PopupConfigService] 获取弹窗配置失败:', error);\n throw new Error('获取弹窗配置失败');\n }\n }\n\n /**\n * 获取指定业务场景的启用弹窗配置\n */\n async getEnabledPopupConfigs(\n businessModule: string = 'showmasterpiece',\n businessScene: string = 'cart_checkout'\n ): Promise<PopupConfig[]> {\n try {\n // 构建查询条件\n const conditions = [\n eq(popupConfigs.enabled, true),\n eq(popupConfigs.businessModule, businessModule),\n eq(popupConfigs.businessScene, businessScene)\n ];\n \n const configs = await this.db\n .select()\n .from(popupConfigs)\n .where(and(...conditions))\n .orderBy(desc(popupConfigs.sortOrder), desc(popupConfigs.createdAt));\n\n console.log(`📊 [PopupConfigService] 获取到 ${configs.length} 个启用的弹窗配置`);\n return configs;\n } catch (error) {\n console.error('❌ [PopupConfigService] 获取启用弹窗配置失败:', error);\n throw new Error('获取启用弹窗配置失败');\n }\n }\n\n /**\n * 获取所有弹窗配置\n */\n async getAllPopupConfigs(): Promise<PopupConfig[]> {\n try {\n const configs = await this.db\n .select()\n .from(popupConfigs)\n .orderBy(desc(popupConfigs.createdAt));\n\n console.log(`📊 [PopupConfigService] 获取弹窗配置: 返回${configs.length}个配置`);\n return configs;\n } catch (error) {\n console.error('❌ [PopupConfigService] 获取所有弹窗配置失败:', error);\n throw new Error('获取所有弹窗配置失败');\n }\n }\n\n /**\n * 更新弹窗配置\n */\n async updatePopupConfig(id: string, data: Partial<Omit<PopupConfig, 'id' | 'createdAt'>>): Promise<PopupConfig> {\n try {\n const [config] = await this.db\n .update(popupConfigs)\n .set({\n ...data,\n updatedAt: new Date(),\n })\n .where(eq(popupConfigs.id, id))\n .returning();\n\n if (!config) {\n throw new Error('弹窗配置不存在');\n }\n\n console.log('✅ [PopupConfigService] 弹窗配置更新成功:', config.id);\n return config;\n } catch (error) {\n console.error('❌ [PopupConfigService] 更新弹窗配置失败:', error);\n throw new Error('更新弹窗配置失败');\n }\n }\n\n /**\n * 删除弹窗配置\n */\n async deletePopupConfig(id: string): Promise<boolean> {\n try {\n const result = await this.db\n .delete(popupConfigs)\n .where(eq(popupConfigs.id, id));\n\n console.log('✅ [PopupConfigService] 弹窗配置删除成功:', id);\n return true;\n } catch (error) {\n console.error('❌ [PopupConfigService] 删除弹窗配置失败:', error);\n throw new Error('删除弹窗配置失败');\n }\n }\n\n /**\n * 切换弹窗配置启用状态\n */\n async togglePopupConfig(id: string, enabled: boolean): Promise<PopupConfig> {\n try {\n const [config] = await this.db\n .update(popupConfigs)\n .set({\n enabled,\n updatedAt: new Date(),\n })\n .where(eq(popupConfigs.id, id))\n .returning();\n\n if (!config) {\n throw new Error('弹窗配置不存在');\n }\n\n console.log(`✅ [PopupConfigService] 弹窗配置${enabled ? '启用' : '禁用'}成功:`, config.id);\n return config;\n } catch (error) {\n console.error('❌ [PopupConfigService] 切换弹窗配置状态失败:', error);\n throw new Error('切换弹窗配置状态失败');\n }\n }\n\n /**\n * 检查是否需要显示弹窗\n */\n async shouldShowPopup(\n businessModule: string = 'showmasterpiece',\n businessScene: string = 'cart_checkout',\n currentTime: Date = new Date()\n ): Promise<PopupConfig[]> {\n try {\n const enabledConfigs = await this.getEnabledPopupConfigs(businessModule, businessScene);\n const triggeredConfigs: PopupConfig[] = [];\n\n for (const config of enabledConfigs) {\n const { triggerConfig } = config;\n \n if (triggerConfig.triggerType === 'always') {\n triggeredConfigs.push(config);\n continue;\n }\n\n if (triggerConfig.deadlineTime) {\n const deadlineTime = new Date(triggerConfig.deadlineTime);\n const timeDiff = deadlineTime.getTime() - currentTime.getTime();\n const minutesDiff = Math.floor(timeDiff / (1000 * 60));\n\n switch (triggerConfig.triggerType) {\n case 'after_deadline':\n if (currentTime > deadlineTime) {\n triggeredConfigs.push(config);\n }\n break;\n case 'before_deadline':\n if (triggerConfig.advanceMinutes && minutesDiff <= triggerConfig.advanceMinutes && minutesDiff > 0) {\n triggeredConfigs.push(config);\n }\n break;\n }\n }\n }\n\n console.log(`🔔 [PopupConfigService] 检查到 ${triggeredConfigs.length} 个需要显示的弹窗`);\n return triggeredConfigs;\n } catch (error) {\n console.error('❌ [PopupConfigService] 检查弹窗显示条件失败:', error);\n return [];\n }\n }\n}\n\n// 导出单例实例\n\n\nexport function createPopupConfigService(db: any): PopupConfigService {\n return new PopupConfigService(db);\n}\n","import { eq, asc, and } from 'drizzle-orm';\nimport {\n comicUniverseConfigs,\n comicUniverseCategories,\n comicUniverseTags,\n} from '../schema/masterpieces';\nimport { buildDefaultHomeTabConfig, normalizeHomeTabConfig } from '../../types';\n\ninterface MasterpiecesConfig {\n siteName: string;\n siteDescription?: string;\n heroTitle: string;\n heroSubtitle?: string;\n maxCollectionsPerPage: number;\n enableSearch: boolean;\n enableCategories: boolean;\n homeTabConfig: any[];\n defaultCategory: string;\n theme: 'light' | 'dark' | 'auto';\n language: 'zh' | 'en';\n}\n\nexport class MasterpiecesConfigDbService {\n constructor(private readonly db: any) {}\n\n async getConfig(): Promise<MasterpiecesConfig> {\n const configs = await this.db.select().from(comicUniverseConfigs).limit(1);\n\n if (configs.length === 0) {\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n\n return this.mapDbConfigToType(configs[0]);\n }\n\n async updateConfig(configData: Partial<MasterpiecesConfig>): Promise<MasterpiecesConfig> {\n const configs = await this.db.select().from(comicUniverseConfigs).limit(1);\n\n if (configs.length === 0) {\n const newConfig = await this.db.insert(comicUniverseConfigs).values({\n siteName: configData.siteName || '画集展览',\n siteDescription: configData.siteDescription || '精美的艺术作品展览',\n heroTitle: configData.heroTitle || '艺术画集展览',\n heroSubtitle: configData.heroSubtitle || '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: configData.maxCollectionsPerPage || 9,\n enableSearch: configData.enableSearch ?? true,\n enableCategories: configData.enableCategories ?? true,\n homeTabConfig: normalizeHomeTabConfig(configData.homeTabConfig),\n defaultCategory: configData.defaultCategory || 'all',\n theme: configData.theme || 'light',\n language: configData.language || 'zh',\n updatedAt: new Date(),\n }).returning();\n\n return this.mapDbConfigToType(newConfig[0]);\n }\n\n const updateData: any = { updatedAt: new Date() };\n if (configData.siteName !== undefined) updateData.siteName = configData.siteName;\n if (configData.siteDescription !== undefined) updateData.siteDescription = configData.siteDescription;\n if (configData.heroTitle !== undefined) updateData.heroTitle = configData.heroTitle;\n if (configData.heroSubtitle !== undefined) updateData.heroSubtitle = configData.heroSubtitle;\n if (configData.maxCollectionsPerPage !== undefined) updateData.maxCollectionsPerPage = configData.maxCollectionsPerPage;\n if (configData.enableSearch !== undefined) updateData.enableSearch = configData.enableSearch;\n if (configData.enableCategories !== undefined) updateData.enableCategories = configData.enableCategories;\n if (configData.homeTabConfig !== undefined) updateData.homeTabConfig = normalizeHomeTabConfig(configData.homeTabConfig);\n if (configData.defaultCategory !== undefined) updateData.defaultCategory = configData.defaultCategory;\n if (configData.theme !== undefined) updateData.theme = configData.theme;\n if (configData.language !== undefined) updateData.language = configData.language;\n\n const updatedConfig = await this.db.update(comicUniverseConfigs)\n .set(updateData)\n .where(eq(comicUniverseConfigs.id, configs[0].id))\n .returning();\n\n return this.mapDbConfigToType(updatedConfig[0]);\n }\n\n async resetConfig(): Promise<MasterpiecesConfig> {\n await this.db.delete(comicUniverseConfigs);\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n\n private async createDefaultConfig() {\n const newConfig = await this.db.insert(comicUniverseConfigs).values({\n siteName: '画集展览',\n siteDescription: '精美的艺术作品展览',\n heroTitle: '艺术画集展览',\n heroSubtitle: '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: 9,\n enableSearch: true,\n enableCategories: true,\n homeTabConfig: buildDefaultHomeTabConfig(),\n defaultCategory: 'all',\n theme: 'light',\n language: 'zh',\n }).returning();\n\n return newConfig[0];\n }\n\n private mapDbConfigToType(dbConfig: any): MasterpiecesConfig {\n return {\n siteName: dbConfig.siteName,\n siteDescription: dbConfig.siteDescription,\n heroTitle: dbConfig.heroTitle,\n heroSubtitle: dbConfig.heroSubtitle,\n maxCollectionsPerPage: dbConfig.maxCollectionsPerPage,\n enableSearch: dbConfig.enableSearch,\n enableCategories: dbConfig.enableCategories,\n homeTabConfig: normalizeHomeTabConfig(dbConfig.homeTabConfig),\n defaultCategory: dbConfig.defaultCategory,\n theme: dbConfig.theme,\n language: dbConfig.language,\n };\n }\n}\n\nexport class CategoriesDbService {\n constructor(private readonly db: any) {}\n\n async getCategories(): Promise<Array<{ name: string; description?: string | null }>> {\n const conditions = [eq(comicUniverseCategories.isActive, true)];\n\n const categories = await this.db.select()\n .from(comicUniverseCategories)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseCategories.displayOrder), asc(comicUniverseCategories.name));\n\n return categories.map((cat: any) => ({\n name: cat.name,\n description: cat.description ?? null,\n }));\n }\n\n async createCategory(name: string, description?: string): Promise<void> {\n await this.db.insert(comicUniverseCategories).values({ name, description });\n }\n}\n\nexport class TagsDbService {\n constructor(private readonly db: any) {}\n\n async getTags(): Promise<string[]> {\n const conditions = [eq(comicUniverseTags.isActive, true)];\n\n const tags = await this.db.select()\n .from(comicUniverseTags)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseTags.name));\n\n return tags.map((tag: any) => tag.name);\n }\n\n async createTag(name: string, color?: string): Promise<void> {\n await this.db.insert(comicUniverseTags).values({\n name,\n color: color || '#3b82f6',\n });\n }\n}\n\nexport function createMasterpiecesConfigDbService(db: any): MasterpiecesConfigDbService {\n return new MasterpiecesConfigDbService(db);\n}\n\nexport function createCategoriesDbService(db: any): CategoriesDbService {\n return new CategoriesDbService(db);\n}\n\nexport function createTagsDbService(db: any): TagsDbService {\n return new TagsDbService(db);\n}\n","// @ts-nocheck\nlet db: any;\nlet fileUrlResolver: ((fileId: string) => Promise<string | null | undefined>) | undefined;\n\nexport function initializeShowmasterpieceDb(\n database: any,\n resolver?: (fileId: string) => Promise<string | null | undefined>,\n): void {\n db = database;\n fileUrlResolver = resolver;\n (globalThis as any).__sa2kitShowmasterpieceResolveFileUrl = resolver;\n}\n\nimport { \n comicUniverseConfigs,\n comicUniverseCategories,\n comicUniverseTags,\n comicUniverseCollections,\n comicUniverseCollectionTags,\n comicUniverseArtworks\n} from '../schema/masterpieces';\nimport { eq, desc, asc, and, sql, inArray } from 'drizzle-orm';\nimport { buildDefaultHomeTabConfig, normalizeHomeTabConfig } from '../../types';\n\ninterface MasterpiecesConfig {\n siteName: string;\n siteDescription?: string;\n heroTitle: string;\n heroSubtitle?: string;\n maxCollectionsPerPage: number;\n enableSearch: boolean;\n enableCategories: boolean;\n homeTabConfig: any[];\n defaultCategory: string;\n theme: 'light' | 'dark' | 'auto';\n language: 'zh' | 'en';\n}\n\ntype CollectionCategoryType = string;\n\ninterface ArtworkPage {\n id: number;\n title: string;\n number: string;\n image: string;\n fileId?: string;\n description: string;\n createdTime?: string;\n theme?: string;\n pageOrder: number;\n}\n\ninterface ArtCollection {\n id: number;\n title: string;\n number: string;\n coverImage: string;\n coverImageFileId?: string;\n description: string;\n pages: ArtworkPage[];\n category: CollectionCategoryType;\n tags?: string[];\n isPublished?: boolean;\n price?: number;\n}\n\ninterface CollectionFormData {\n title: string;\n number: string;\n coverImage: string;\n coverImageFileId?: string;\n description: string;\n category: CollectionCategoryType;\n tags: string[];\n isPublished: boolean;\n price?: number;\n}\n\ninterface ArtworkFormData {\n title: string;\n number: string;\n image?: string;\n fileId?: string;\n description: string;\n createdTime?: string;\n theme?: string;\n}\n\nasync function resolveFileUrlMap(fileIds: string[]): Promise<Map<string, string>> {\n const fileIdToUrlMap = new Map<string, string>();\n\n if (!fileUrlResolver || fileIds.length === 0) {\n return fileIdToUrlMap;\n }\n\n const results = await Promise.all(\n fileIds.map(async (fileId) => {\n try {\n const fileUrl = await fileUrlResolver!(fileId);\n return { fileId, url: fileUrl || null };\n } catch (error) {\n return { fileId, url: null };\n }\n }),\n );\n\n results.forEach((result) => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n\n return fileIdToUrlMap;\n}\n\n// 配置相关服务\nexport class MasterpiecesConfigDbService {\n // 获取配置\n async getConfig(): Promise<MasterpiecesConfig> {\n const configs = await db.select().from(comicUniverseConfigs).limit(1);\n \n if (configs.length === 0) {\n // 如果没有配置,创建默认配置\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n \n return this.mapDbConfigToType(configs[0]);\n }\n\n // 更新配置\n async updateConfig(configData: Partial<MasterpiecesConfig>): Promise<MasterpiecesConfig> {\n const configs = await db.select().from(comicUniverseConfigs).limit(1);\n \n if (configs.length === 0) {\n // 如果没有配置,创建新配置\n const newConfig = await db.insert(comicUniverseConfigs).values({\n siteName: configData.siteName || '画集展览',\n siteDescription: configData.siteDescription || '精美的艺术作品展览',\n heroTitle: configData.heroTitle || '艺术画集展览',\n heroSubtitle: configData.heroSubtitle || '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: configData.maxCollectionsPerPage || 9,\n enableSearch: configData.enableSearch ?? true,\n enableCategories: configData.enableCategories ?? true,\n homeTabConfig: normalizeHomeTabConfig(configData.homeTabConfig),\n defaultCategory: configData.defaultCategory || 'all',\n theme: configData.theme || 'light',\n language: configData.language || 'zh',\n updatedAt: new Date(),\n }).returning();\n \n return this.mapDbConfigToType(newConfig[0]);\n } else {\n // 更新现有配置\n const updateData: any = {\n updatedAt: new Date(),\n };\n \n // 只更新提供的字段\n if (configData.siteName !== undefined) updateData.siteName = configData.siteName;\n if (configData.siteDescription !== undefined) updateData.siteDescription = configData.siteDescription;\n if (configData.heroTitle !== undefined) updateData.heroTitle = configData.heroTitle;\n if (configData.heroSubtitle !== undefined) updateData.heroSubtitle = configData.heroSubtitle;\n if (configData.maxCollectionsPerPage !== undefined) updateData.maxCollectionsPerPage = configData.maxCollectionsPerPage;\n if (configData.enableSearch !== undefined) updateData.enableSearch = configData.enableSearch;\n if (configData.enableCategories !== undefined) updateData.enableCategories = configData.enableCategories;\n if (configData.homeTabConfig !== undefined) updateData.homeTabConfig = normalizeHomeTabConfig(configData.homeTabConfig);\n if (configData.defaultCategory !== undefined) updateData.defaultCategory = configData.defaultCategory;\n if (configData.theme !== undefined) updateData.theme = configData.theme;\n if (configData.language !== undefined) updateData.language = configData.language;\n\n const updatedConfig = await db.update(comicUniverseConfigs)\n .set(updateData)\n .where(eq(comicUniverseConfigs.id, configs[0].id))\n .returning();\n \n return this.mapDbConfigToType(updatedConfig[0]);\n }\n }\n\n // 重置为默认配置\n async resetConfig(): Promise<MasterpiecesConfig> {\n await db.delete(comicUniverseConfigs);\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n\n // 创建默认配置\n private async createDefaultConfig() {\n const newConfig = await db.insert(comicUniverseConfigs).values({\n siteName: '画集展览',\n siteDescription: '精美的艺术作品展览',\n heroTitle: '艺术画集展览',\n heroSubtitle: '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: 9,\n enableSearch: true,\n enableCategories: true,\n homeTabConfig: buildDefaultHomeTabConfig(),\n defaultCategory: 'all',\n theme: 'light',\n language: 'zh',\n }).returning();\n \n return newConfig[0];\n }\n\n // 映射数据库配置到类型\n private mapDbConfigToType(dbConfig: any): MasterpiecesConfig {\n return {\n siteName: dbConfig.siteName,\n siteDescription: dbConfig.siteDescription,\n heroTitle: dbConfig.heroTitle,\n heroSubtitle: dbConfig.heroSubtitle,\n maxCollectionsPerPage: dbConfig.maxCollectionsPerPage,\n enableSearch: dbConfig.enableSearch,\n enableCategories: dbConfig.enableCategories,\n homeTabConfig: normalizeHomeTabConfig(dbConfig.homeTabConfig),\n defaultCategory: dbConfig.defaultCategory,\n theme: dbConfig.theme,\n language: dbConfig.language,\n };\n }\n}\n\n// 分类相关服务\nexport class CategoriesDbService {\n // 获取所有分类\n async getCategories(): Promise<Array<{ name: string; description?: string | null }>> {\n const conditions = [eq(comicUniverseCategories.isActive, true)];\n \n const categories = await db.select()\n .from(comicUniverseCategories)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseCategories.displayOrder), asc(comicUniverseCategories.name));\n \n console.log(`📊 [CategoriesDbService] 获取分类: 返回${categories.length}个分类`);\n return categories.map(cat => ({\n name: cat.name,\n description: cat.description ?? null,\n }));\n }\n\n // 创建分类\n async createCategory(name: string, description?: string): Promise<void> {\n await db.insert(comicUniverseCategories).values({\n name,\n description,\n });\n }\n}\n\n// 标签相关服务\nexport class TagsDbService {\n // 获取所有标签\n async getTags(): Promise<string[]> {\n const conditions = [eq(comicUniverseTags.isActive, true)];\n \n const tags = await db.select()\n .from(comicUniverseTags)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseTags.name));\n \n console.log(`📊 [TagsDbService] 获取标签: 返回${tags.length}个标签`);\n return tags.map(tag => tag.name);\n }\n\n // 创建标签\n async createTag(name: string, color?: string): Promise<void> {\n await db.insert(comicUniverseTags).values({\n name,\n color: color || '#3b82f6',\n });\n }\n}\n\n// 画集相关服务\nexport class CollectionsDbService {\n // 缓存配置 - 多层缓存策略\n private collectionsCache: ArtCollection[] | null = null;\n private collectionsCacheTime: number = 0;\n private collectionsOverviewCache: Omit<ArtCollection, 'pages'>[] | null = null;\n private collectionsOverviewCacheTime: number = 0;\n \n // 优化缓存时间配置\n private readonly CACHE_DURATION = 10 * 60 * 1000; // 延长到10分钟\n private readonly OVERVIEW_CACHE_DURATION = 15 * 60 * 1000; // 概览缓存15分钟\n private readonly STALE_WHILE_REVALIDATE = 30 * 60 * 1000; // 过期后30分钟内可用\n\n /**\n * 获取所有画集 - 优化版本\n * \n * 性能问题分析:\n * 1. 复杂的多表关联查询 - 涉及5个表的数据整合\n * 2. 作品数据量大 - 包含所有作品的完整信息(特别是图片数据)\n * 3. N+1查询风险 - 虽然使用并行查询,但仍有优化空间\n * 4. 缓存策略有限 - 2分钟缓存时间较短,首次访问必须全量查询\n * \n * 优化策略:\n * ✅ 并行查询 - 分类、标签、作品数据并行获取\n * ✅ 内存缓存 - 减少重复查询\n * ✅ 字段选择 - 只查询必要字段\n * ✅ 延长缓存时间 - 从2分钟增加到10分钟\n * ⚠️ 需要优化 - 数据库索引、分页加载、图片懒加载\n */\n async getAllCollections(useCache: boolean = true): Promise<ArtCollection[]> {\n // 检查缓存 - 首次访问时缓存为空,必须执行完整查询\n if (useCache && this.collectionsCache) {\n const cacheAge = Date.now() - this.collectionsCacheTime;\n \n // 如果在有效期内,直接返回缓存\n if (cacheAge < this.CACHE_DURATION) {\n return this.collectionsCache;\n }\n \n // 如果在stale-while-revalidate期内,返回缓存但异步更新\n if (cacheAge < this.STALE_WHILE_REVALIDATE) {\n // 异步更新缓存,不阻塞当前请求\n this.refreshCacheInBackground();\n return this.collectionsCache;\n }\n }\n\n try {\n // 执行完整查询\n const result = await this.fetchAllCollectionsFromDb();\n \n // 更新缓存\n this.collectionsCache = result;\n this.collectionsCacheTime = Date.now();\n\n return result;\n\n } catch (error) {\n console.error('获取画集数据失败:', error);\n \n // 如果查询失败但有过期缓存,返回过期缓存\n if (this.collectionsCache) {\n console.warn('数据库查询失败,返回过期缓存数据');\n return this.collectionsCache;\n }\n \n throw error;\n }\n }\n\n /**\n * 获取画集概览 - 不包含作品详情的轻量版本\n * 适用于首页列表、搜索结果等场景\n */\n async getCollectionsOverview(): Promise<Omit<ArtCollection, 'pages'>[]> {\n // 检查概览缓存\n if (this.collectionsOverviewCache) {\n const cacheAge = Date.now() - this.collectionsOverviewCacheTime;\n \n if (cacheAge < this.OVERVIEW_CACHE_DURATION) {\n return this.collectionsOverviewCache;\n }\n \n // stale-while-revalidate策略\n if (cacheAge < this.STALE_WHILE_REVALIDATE) {\n this.refreshOverviewCacheInBackground();\n return this.collectionsOverviewCache;\n }\n }\n\n try {\n const result = await this.fetchCollectionsOverviewFromDb();\n \n // 更新缓存\n this.collectionsOverviewCache = result;\n this.collectionsOverviewCacheTime = Date.now();\n\n return result;\n\n } catch (error) {\n console.error('获取画集概览失败:', error);\n \n // 降级策略:返回过期缓存\n if (this.collectionsOverviewCache) {\n console.warn('数据库查询失败,返回过期缓存数据');\n return this.collectionsOverviewCache;\n }\n \n throw error;\n }\n }\n\n /**\n * 后台异步刷新完整缓存\n */\n private async refreshCacheInBackground(): Promise<void> {\n try {\n const result = await this.fetchAllCollectionsFromDb();\n this.collectionsCache = result;\n this.collectionsCacheTime = Date.now();\n console.log('缓存已在后台更新');\n } catch (error) {\n console.error('后台缓存更新失败:', error);\n }\n }\n\n /**\n * 后台异步刷新概览缓存\n */\n private async refreshOverviewCacheInBackground(): Promise<void> {\n try {\n const result = await this.fetchCollectionsOverviewFromDb();\n this.collectionsOverviewCache = result;\n this.collectionsOverviewCacheTime = Date.now();\n console.log('概览缓存已在后台更新');\n } catch (error) {\n console.error('后台概览缓存更新失败:', error);\n }\n }\n\n /**\n * 从数据库获取完整画集数据\n * 优化版本:不再返回Base64图片数据,只返回fileId和imageUrl\n */\n private async fetchAllCollectionsFromDb(): Promise<ArtCollection[]> {\n try {\n // 1. 获取画集基本信息\n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n number: comicUniverseCollections.number,\n coverImage: comicUniverseCollections.coverImage,\n coverImageFileId: comicUniverseCollections.coverImageFileId, // 新增:封面图片文件ID\n description: comicUniverseCollections.description,\n isPublished: comicUniverseCollections.isPublished,\n displayOrder: comicUniverseCollections.displayOrder,\n price: comicUniverseCollections.price,\n createdAt: comicUniverseCollections.createdAt,\n categoryId: comicUniverseCollections.categoryId,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt)\n );\n\n if (collections.length === 0) {\n return [];\n }\n\n const collectionIds = collections.map(c => c.id);\n\n // 2. 并行获取分类、标签和作品数据\n const [categories, tags, artworks] = await Promise.all([\n // 获取分类信息\n db\n .select({\n id: comicUniverseCategories.id,\n name: comicUniverseCategories.name,\n })\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.isActive, true)),\n\n // 获取标签信息\n db\n .select({\n collectionId: comicUniverseCollectionTags.collectionId,\n tagName: comicUniverseTags.name,\n })\n .from(comicUniverseCollectionTags)\n .innerJoin(\n comicUniverseTags,\n eq(comicUniverseCollectionTags.tagId, comicUniverseTags.id)\n )\n .where(\n and(\n inArray(comicUniverseCollectionTags.collectionId, collectionIds),\n eq(comicUniverseTags.isActive, true)\n )\n ),\n\n // 获取作品数据(只查询fileId,不查询Base64图片)\n db\n .select({\n collectionId: comicUniverseArtworks.collectionId,\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n number: comicUniverseArtworks.number,\n fileId: comicUniverseArtworks.fileId, // 只查询fileId,不查询Base64图片\n description: comicUniverseArtworks.description,\n createdTime: comicUniverseArtworks.createdTime,\n theme: comicUniverseArtworks.theme,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(\n and(\n inArray(comicUniverseArtworks.collectionId, collectionIds),\n eq(comicUniverseArtworks.isActive, true)\n )\n )\n .orderBy(asc(comicUniverseArtworks.pageOrder))\n ]);\n\n // 3. 构建映射表\n const categoriesMap = new Map(categories.map(cat => [cat.id, cat.name]));\n \n const tagsMap = new Map<number, string[]>();\n tags.forEach(tag => {\n if (!tagsMap.has(tag.collectionId)) {\n tagsMap.set(tag.collectionId, []);\n }\n tagsMap.get(tag.collectionId)!.push(tag.tagName);\n });\n\n // 4. 批量获取文件URL(包括封面图片)\n const fileIdToUrlMap = new Map<string, string>();\n const allFileIds = [\n ...collections.filter(c => c.coverImageFileId).map(c => c.coverImageFileId!),\n ...artworks.filter(a => a.fileId).map(a => a.fileId!)\n ];\n \n if (allFileIds.length > 0) {\n try {\n // 使用ShowMasterpiece的独立文件服务配置\n const { getShowMasterpieceFileConfig } = await import('../services/fileService');\n const configManager = await getShowMasterpieceFileConfig();\n const { UniversalFileService } = await import('../../../universalFile/server/UniversalFileService');\n \n const fileService = new UniversalFileService(configManager.getConfig());\n await fileService.initialize();\n \n // 并行获取所有文件URL\n const urlPromises = allFileIds.map(async (fileId) => {\n try {\n const fileUrl = await fileService.getFileUrl(fileId);\n return { fileId, url: fileUrl };\n } catch (error) {\n console.warn(`⚠️ 获取文件URL失败: ${fileId}`, error);\n return { fileId, url: null };\n }\n });\n \n const urlResults = await Promise.all(urlPromises);\n urlResults.forEach(result => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n } catch (error) {\n console.warn('⚠️ 批量获取文件URL失败:', error);\n }\n }\n\n // 5. 构建作品映射表\n const artworksMap = new Map<number, ArtworkPage[]>();\n \n artworks.forEach(artwork => {\n if (!artworksMap.has(artwork.collectionId)) {\n artworksMap.set(artwork.collectionId, []);\n }\n \n // 创建基础作品对象,优先使用OSS URL,回退到API路径\n let imageUrl: string;\n if (artwork.fileId && fileIdToUrlMap.has(artwork.fileId)) {\n imageUrl = fileIdToUrlMap.get(artwork.fileId)!;\n } else {\n // 如果没有fileId或获取URL失败,使用API路径\n imageUrl = `/api/showmasterpiece/collections/${artwork.collectionId}/artworks/${artwork.id}/image`;\n }\n \n const artworkPage: ArtworkPage = {\n id: artwork.id,\n title: artwork.title || '',\n number: artwork.number || '',\n image: imageUrl, // 使用处理后的图片URL\n fileId: artwork.fileId || undefined, // 添加fileId支持\n description: artwork.description || '',\n createdTime: artwork.createdTime || '',\n theme: artwork.theme || '',\n pageOrder: artwork.pageOrder || 0, // 添加pageOrder字段\n };\n \n artworksMap.get(artwork.collectionId)!.push(artworkPage);\n });\n\n // 6. 构建最终结果\n return collections.map(collection => {\n // 处理封面图片URL\n let coverImageUrl: string;\n if (collection.coverImageFileId && fileIdToUrlMap.has(collection.coverImageFileId)) {\n // 优先使用OSS URL\n coverImageUrl = fileIdToUrlMap.get(collection.coverImageFileId)!;\n console.log(`🔗 [CollectionsDbService] 使用OSS URL: ${coverImageUrl}`);\n } else if (collection.coverImage) {\n // 回退到原始路径\n coverImageUrl = collection.coverImage;\n console.log(`🔗 [CollectionsDbService] 使用原始路径: ${coverImageUrl}`);\n } else {\n // 没有封面图片\n coverImageUrl = '';\n console.log(`🔗 [CollectionsDbService] 无封面图片`);\n }\n\n return {\n id: collection.id,\n title: collection.title,\n number: collection.number,\n coverImage: coverImageUrl, // ✅ 使用处理后的URL\n coverImageFileId: collection.coverImageFileId || undefined,\n description: collection.description || '',\n category: collection.categoryId ? (categoriesMap.get(collection.categoryId) || '画集') as CollectionCategoryType : '画集' as CollectionCategoryType,\n tags: tagsMap.get(collection.id) || [],\n isPublished: collection.isPublished,\n price: collection.price || undefined,\n pages: artworksMap.get(collection.id) || [], // 🚀 作品数据精简,大幅减少传输量\n };\n });\n } catch (error) {\n console.error('获取画集列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 从数据库获取画集概览数据\n */\n private async fetchCollectionsOverviewFromDb(): Promise<Omit<ArtCollection, 'pages'>[]> {\n try {\n // 1. 获取画集基本信息\n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n number: comicUniverseCollections.number,\n coverImage: comicUniverseCollections.coverImage,\n coverImageFileId: comicUniverseCollections.coverImageFileId, // 新增:封面图片文件ID\n description: comicUniverseCollections.description,\n isPublished: comicUniverseCollections.isPublished,\n displayOrder: comicUniverseCollections.displayOrder,\n price: comicUniverseCollections.price,\n createdAt: comicUniverseCollections.createdAt,\n categoryId: comicUniverseCollections.categoryId,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt)\n );\n\n if (collections.length === 0) {\n return [];\n }\n\n const collectionIds = collections.map(c => c.id);\n\n // 2. 并行获取分类、标签和作品数量\n const [categories, tags, artworkCounts] = await Promise.all([\n // 获取分类信息\n db\n .select({\n id: comicUniverseCategories.id,\n name: comicUniverseCategories.name,\n })\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.isActive, true)),\n\n // 获取标签信息\n db\n .select({\n collectionId: comicUniverseCollectionTags.collectionId,\n tagName: comicUniverseTags.name,\n })\n .from(comicUniverseCollectionTags)\n .innerJoin(\n comicUniverseTags,\n eq(comicUniverseCollectionTags.tagId, comicUniverseTags.id)\n )\n .where(\n and(\n inArray(comicUniverseCollectionTags.collectionId, collectionIds),\n eq(comicUniverseTags.isActive, true)\n )\n ),\n\n // 获取作品数量(而不是具体作品)\n db\n .select({\n collectionId: comicUniverseArtworks.collectionId,\n count: sql<number>`count(*)`.as('count'),\n })\n .from(comicUniverseArtworks)\n .where(\n and(\n inArray(comicUniverseArtworks.collectionId, collectionIds),\n eq(comicUniverseArtworks.isActive, true)\n )\n )\n .groupBy(comicUniverseArtworks.collectionId)\n ]);\n\n // 3. 构建映射表\n const categoriesMap = new Map(categories.map(cat => [cat.id, cat.name]));\n \n const tagsMap = new Map<number, string[]>();\n tags.forEach(tag => {\n if (!tagsMap.has(tag.collectionId)) {\n tagsMap.set(tag.collectionId, []);\n }\n tagsMap.get(tag.collectionId)!.push(tag.tagName);\n });\n\n const artworkCountsMap = new Map(artworkCounts.map(ac => [ac.collectionId, ac.count]));\n\n // 4. 批量获取封面图片URL\n const fileIdToUrlMap = new Map<string, string>();\n const coverImageFileIds = collections.filter(c => c.coverImageFileId).map(c => c.coverImageFileId!);\n \n if (coverImageFileIds.length > 0) {\n try {\n // 使用ShowMasterpiece的独立文件服务配置\n const { getShowMasterpieceFileConfig } = await import('../services/fileService');\n const configManager = await getShowMasterpieceFileConfig();\n const { UniversalFileService } = await import('../../../universalFile/server/UniversalFileService');\n \n const fileService = new UniversalFileService(configManager.getConfig());\n await fileService.initialize();\n \n // 并行获取所有封面图片URL\n const urlPromises = coverImageFileIds.map(async (fileId) => {\n try {\n const fileUrl = await fileService.getFileUrl(fileId);\n return { fileId, url: fileUrl };\n } catch (error) {\n console.warn(`⚠️ [CollectionsDbService] 获取封面图片URL失败: ${fileId}`, error);\n return { fileId, url: null };\n }\n });\n \n const urlResults = await Promise.all(urlPromises);\n urlResults.forEach(result => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n } catch (error) {\n console.warn('⚠️ [CollectionsDbService] 批量获取封面图片URL失败:', error);\n }\n }\n\n // 5. 构建结果(包含作品数量而不是具体作品)\n return collections.map(collection => {\n // 处理封面图片URL,优先使用OSS URL,回退到原始路径\n let coverImageUrl: string;\n if (collection.coverImageFileId && fileIdToUrlMap.has(collection.coverImageFileId)) {\n coverImageUrl = fileIdToUrlMap.get(collection.coverImageFileId)!;\n } else {\n // 如果没有fileId或获取URL失败,使用原始路径\n coverImageUrl = collection.coverImage || '';\n }\n console.log(`🔗 [CollectionsDbService] 1封面图片URL: ${coverImageUrl}`);\n\n return {\n id: collection.id,\n title: collection.title,\n number: collection.number,\n coverImage: coverImageUrl, // 使用处理后的封面图片URL\n coverImageFileId: collection.coverImageFileId || undefined, // 新增:封面图片文件ID\n description: collection.description || '',\n category: collection.categoryId ? (categoriesMap.get(collection.categoryId) || '画集') as CollectionCategoryType : '画集' as CollectionCategoryType,\n tags: tagsMap.get(collection.id) || [],\n isPublished: collection.isPublished,\n price: collection.price || undefined,\n artworkCount: artworkCountsMap.get(collection.id) || 0,\n };\n });\n\n } catch (error) {\n console.error('获取画集概览失败:', error);\n throw error;\n }\n }\n\n // 清除缓存的方法\n clearCache(): void {\n this.collectionsCache = null;\n this.collectionsCacheTime = 0;\n this.collectionsOverviewCache = null;\n this.collectionsOverviewCacheTime = 0;\n }\n\n // 创建画集\n async createCollection(collectionData: CollectionFormData): Promise<ArtCollection> {\n // 获取或创建分类\n let categoryId: number | null = null;\n if (collectionData.category) {\n const existingCategory = await db.select()\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.name, collectionData.category))\n .limit(1);\n \n if (existingCategory.length > 0) {\n categoryId = existingCategory[0].id;\n } else {\n const newCategory = await db.insert(comicUniverseCategories).values({\n name: collectionData.category,\n }).returning();\n categoryId = newCategory[0].id;\n }\n }\n\n // 创建画集\n const newCollection = await db.insert(comicUniverseCollections).values({\n title: collectionData.title,\n number: collectionData.number,\n coverImage: collectionData.coverImage,\n coverImageFileId: collectionData.coverImageFileId || null,\n description: collectionData.description,\n categoryId,\n isPublished: collectionData.isPublished,\n publishedAt: collectionData.isPublished ? new Date() : null,\n price: collectionData.price || null,\n }).returning();\n\n // 处理标签\n if (collectionData.tags && collectionData.tags.length > 0) {\n await this.updateCollectionTags(newCollection[0].id, collectionData.tags);\n }\n\n // 清除缓存\n this.clearCache();\n\n // 返回完整的画集数据\n const collections = await this.getAllCollections(false); // 强制重新查询\n const filterCollection = collections.filter(c => c.id === newCollection[0].id);\n console.log('🎨 [createCollection] 创建画集成功:', filterCollection);\n return filterCollection[0];\n }\n\n // 更新画集\n async updateCollection(id: number, collectionData: CollectionFormData): Promise<ArtCollection> {\n // 获取或创建分类\n let categoryId: number | null = null;\n if (collectionData.category) {\n const existingCategory = await db.select()\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.name, collectionData.category))\n .limit(1);\n \n if (existingCategory.length > 0) {\n categoryId = existingCategory[0].id;\n } else {\n const newCategory = await db.insert(comicUniverseCategories).values({\n name: collectionData.category,\n }).returning();\n categoryId = newCategory[0].id;\n }\n }\n\n // 更新画集\n await db.update(comicUniverseCollections)\n .set({\n title: collectionData.title,\n number: collectionData.number,\n coverImage: collectionData.coverImage,\n coverImageFileId: collectionData.coverImageFileId || null,\n description: collectionData.description,\n categoryId,\n isPublished: collectionData.isPublished,\n publishedAt: collectionData.isPublished ? new Date() : null,\n price: collectionData.price || null,\n updatedAt: new Date(),\n })\n .where(eq(comicUniverseCollections.id, id));\n\n // 更新标签\n await this.updateCollectionTags(id, collectionData.tags || []);\n\n // 清除缓存\n this.clearCache();\n\n // 返回更新后的画集数据\n const collections = await this.getAllCollections(false); // 强制重新查询\n return collections.find(c => c.id === id)!;\n }\n\n // 删除画集\n async deleteCollection(id: number): Promise<void> {\n // 首先验证画集存在性\n const collection = await db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.id, id))\n .limit(1);\n\n if (!collection.length) {\n throw new Error('画集不存在');\n }\n\n const collectionData = collection[0];\n\n console.log(`🗑️ [deleteCollection] 删除画集 ID:${id} \"${collectionData.title}\"`);\n\n // 执行删除(级联删除作品)\n await db.delete(comicUniverseCollections)\n .where(eq(comicUniverseCollections.id, id));\n \n // 清除缓存\n this.clearCache();\n }\n\n // 更新画集标签\n private async updateCollectionTags(collectionId: number, tagNames: string[]): Promise<void> {\n // 删除现有标签关联\n await db.delete(comicUniverseCollectionTags)\n .where(eq(comicUniverseCollectionTags.collectionId, collectionId));\n\n if (tagNames.length === 0) return;\n\n // 获取或创建标签\n const tagIds: number[] = [];\n for (const tagName of tagNames) {\n const existingTag = await db.select()\n .from(comicUniverseTags)\n .where(eq(comicUniverseTags.name, tagName))\n .limit(1);\n \n if (existingTag.length > 0) {\n tagIds.push(existingTag[0].id);\n } else {\n const newTag = await db.insert(comicUniverseTags).values({\n name: tagName,\n }).returning();\n tagIds.push(newTag[0].id);\n }\n }\n\n // 创建新的标签关联\n const tagRelations = tagIds.map(tagId => ({\n collectionId,\n tagId,\n }));\n\n await db.insert(comicUniverseCollectionTags).values(tagRelations);\n }\n\n // 更新画集显示顺序\n async updateCollectionOrder(collectionOrders: { id: number; displayOrder: number }[]): Promise<void> {\n try {\n // 使用事务批量更新显示顺序\n await db.transaction(async (tx) => {\n for (const { id, displayOrder } of collectionOrders) {\n await tx\n .update(comicUniverseCollections)\n .set({ \n displayOrder,\n updatedAt: new Date()\n })\n .where(eq(comicUniverseCollections.id, id));\n }\n });\n\n // 清除缓存\n this.clearCache();\n } catch (error) {\n console.error('更新画集顺序失败:', error);\n throw error;\n }\n }\n\n // 移动画集到指定位置\n async moveCollection(collectionId: number, targetOrder: number): Promise<void> {\n try {\n // 获取当前所有已发布的画集\n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n\n const normalized = await this.normalizeCollectionOrderIfNeeded(collections);\n const workingCollections = normalized ?? collections;\n\n // 找到要移动的画集\n const targetCollection = workingCollections.find(c => c.id === collectionId);\n if (!targetCollection) {\n throw new Error('画集不存在');\n }\n\n // 重新计算所有画集的显示顺序\n const sortedCollections = workingCollections.filter(c => c.id !== collectionId);\n sortedCollections.splice(targetOrder, 0, targetCollection);\n\n // 生成新的显示顺序,处理null值\n const updates = sortedCollections.map((collection, index) => ({\n id: collection.id,\n displayOrder: sortedCollections.length - index, // 从高到低排序\n }));\n\n await this.updateCollectionOrder(updates);\n } catch (error) {\n console.error('移动画集失败:', error);\n throw error;\n }\n }\n\n // 上移画集\n async moveCollectionUp(collectionId: number): Promise<void> {\n try {\n console.log('📊 [后端排序] 开始上移画集操作,collectionId:', collectionId);\n \n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n title: comicUniverseCollections.title,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n\n const normalized = await this.normalizeCollectionOrderIfNeeded(collections);\n const workingCollections = normalized ?? collections;\n\n console.log('📊 [后端排序] 当前数据库排序状态 (按displayOrder降序):', {\n totalCount: workingCollections.length,\n collections: workingCollections.map((c, i) => ({\n dbIndex: i,\n id: c.id,\n title: c.title,\n displayOrder: c.displayOrder,\n note: i === 0 ? '(数据库第一条/displayOrder最大)' : i === workingCollections.length - 1 ? '(数据库最后条/displayOrder最小)' : ''\n }))\n });\n\n const currentIndex = workingCollections.findIndex(c => c.id === collectionId);\n if (currentIndex === -1) {\n console.error('❌ [后端排序] 画集不存在');\n throw new Error('画集不存在');\n }\n if (currentIndex === 0) {\n console.error('❌ [后端排序] 画集已经在最顶部 (displayOrder最大值)');\n throw new Error('画集已经在最顶部');\n }\n\n console.log('📊 [后端排序] 上移操作详情:', {\n targetCollection: {\n id: workingCollections[currentIndex].id,\n title: workingCollections[currentIndex].title,\n currentDisplayOrder: workingCollections[currentIndex].displayOrder,\n currentDbIndex: currentIndex\n },\n willSwapWith: {\n id: workingCollections[currentIndex - 1].id,\n title: workingCollections[currentIndex - 1].title,\n currentDisplayOrder: workingCollections[currentIndex - 1].displayOrder,\n currentDbIndex: currentIndex - 1\n },\n semantics: '上移=交换displayOrder值,使目标画集获得更大的displayOrder值'\n });\n\n // 交换当前画集和上一个画集的顺序,处理null值\n const targetIndex = currentIndex - 1;\n const currentOrder = workingCollections[targetIndex].displayOrder ?? 0;\n const targetOrder = workingCollections[currentIndex].displayOrder ?? 0;\n \n const updates = [\n { id: workingCollections[currentIndex].id, displayOrder: currentOrder },\n { id: workingCollections[targetIndex].id, displayOrder: targetOrder }\n ];\n\n console.log('📊 [后端排序] 将执行的更新操作:', {\n updates,\n explanation: '目标画集将获得更大的displayOrder值,从而在列表中上移'\n });\n\n await this.updateCollectionOrder(updates);\n \n console.log('✅ [后端排序] 上移操作完成');\n } catch (error) {\n console.error('❌ [后端排序] 上移画集失败:', error);\n throw error;\n }\n }\n\n // 下移画集\n async moveCollectionDown(collectionId: number): Promise<void> {\n try {\n console.log('📊 [后端排序] 开始下移画集操作,collectionId:', collectionId);\n \n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n title: comicUniverseCollections.title,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n\n const normalized = await this.normalizeCollectionOrderIfNeeded(collections);\n const workingCollections = normalized ?? collections;\n\n console.log('📊 [后端排序] 当前数据库排序状态 (按displayOrder降序):', {\n totalCount: workingCollections.length,\n collections: workingCollections.map((c, i) => ({\n dbIndex: i,\n id: c.id,\n title: c.title,\n displayOrder: c.displayOrder,\n note: i === 0 ? '(数据库第一条/displayOrder最大)' : i === workingCollections.length - 1 ? '(数据库最后条/displayOrder最小)' : ''\n }))\n });\n\n const currentIndex = workingCollections.findIndex(c => c.id === collectionId);\n if (currentIndex === -1) {\n console.error('❌ [后端排序] 画集不存在');\n throw new Error('画集不存在');\n }\n if (currentIndex === workingCollections.length - 1) {\n console.error('❌ [后端排序] 画集已经在最底部 (displayOrder最小值)');\n throw new Error('画集已经在最底部');\n }\n\n console.log('📊 [后端排序] 下移操作详情:', {\n targetCollection: {\n id: workingCollections[currentIndex].id,\n title: workingCollections[currentIndex].title,\n currentDisplayOrder: workingCollections[currentIndex].displayOrder,\n currentDbIndex: currentIndex\n },\n willSwapWith: {\n id: workingCollections[currentIndex + 1].id,\n title: workingCollections[currentIndex + 1].title,\n currentDisplayOrder: workingCollections[currentIndex + 1].displayOrder,\n currentDbIndex: currentIndex + 1\n },\n semantics: '下移=交换displayOrder值,使目标画集获得更小的displayOrder值'\n });\n\n // 交换当前画集和下一个画集的顺序,处理null值\n const targetIndex = currentIndex + 1;\n const currentOrder = workingCollections[targetIndex].displayOrder ?? 0;\n const targetOrder = workingCollections[currentIndex].displayOrder ?? 0;\n \n const updates = [\n { id: workingCollections[currentIndex].id, displayOrder: currentOrder },\n { id: workingCollections[targetIndex].id, displayOrder: targetOrder }\n ];\n\n console.log('📊 [后端排序] 将执行的更新操作:', {\n updates,\n explanation: '目标画集将获得更小的displayOrder值,从而在列表中下移'\n });\n\n await this.updateCollectionOrder(updates);\n \n console.log('✅ [后端排序] 下移操作完成');\n } catch (error) {\n console.error('❌ [后端排序] 下移画集失败:', error);\n throw error;\n }\n }\n\n private async normalizeCollectionOrderIfNeeded(\n collections: Array<{ id: number; displayOrder: number | null; createdAt?: Date | null }>\n ): Promise<Array<{ id: number; displayOrder: number | null; createdAt?: Date | null }> | null> {\n if (collections.length <= 1) return null;\n\n const orders = collections.map((c) => c.displayOrder ?? 0);\n const uniqueOrders = new Set(orders);\n const hasDuplicates = uniqueOrders.size !== orders.length;\n const hasAllZero = uniqueOrders.size === 1 && orders[0] === 0;\n\n if (!hasDuplicates && !hasAllZero) return null;\n\n const updates = collections.map((collection, index) => ({\n id: collection.id,\n displayOrder: collections.length - index,\n }));\n\n await this.updateCollectionOrder(updates);\n\n return db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n }\n}\n\n// 作品相关服务\nexport class ArtworksDbService {\n constructor(private collectionsService: CollectionsDbService) {}\n\n // 添加作品到画集\n async addArtworkToCollection(collectionId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> {\n console.log('🗃️ [数据库] 开始添加作品到画集:', {\n collectionId,\n title: artworkData.title,\n number: artworkData.number\n });\n \n // 获取当前画集中作品的最大顺序号\n const maxOrder = await db.select({\n maxOrder: sql<number>`COALESCE(MAX(${comicUniverseArtworks.pageOrder}), -1)`\n })\n .from(comicUniverseArtworks)\n .where(eq(comicUniverseArtworks.collectionId, collectionId));\n\n const newOrder = (maxOrder[0]?.maxOrder || -1) + 1;\n console.log('📊 [数据库] 计算新的页面顺序:', newOrder);\n\n // 准备插入数据 - 只支持通用文件服务\n const insertData: any = {\n collectionId,\n title: artworkData.title,\n number: artworkData.number,\n description: artworkData.description,\n createdTime: artworkData.createdTime,\n theme: artworkData.theme,\n pageOrder: newOrder,\n };\n\n // 必须提供fileId\n if (!artworkData.fileId) {\n throw new Error('必须提供文件ID,请先上传图片');\n }\n \n insertData.fileId = artworkData.fileId;\n insertData.migrationStatus = 'completed';\n console.log('📁 [数据库] 使用通用文件服务ID:', artworkData.fileId);\n\n const newArtwork = await db.insert(comicUniverseArtworks).values(insertData).returning();\n\n console.log('✅ [数据库] 作品插入成功:', {\n id: newArtwork[0].id,\n collectionId: newArtwork[0].collectionId,\n pageOrder: newArtwork[0].pageOrder,\n title: newArtwork[0].title,\n fileId: newArtwork[0].fileId,\n migrationStatus: newArtwork[0].migrationStatus\n });\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n console.log('🧹 [数据库] 缓存已清除');\n\n const result = {\n id: newArtwork[0].id,\n title: newArtwork[0].title,\n number: newArtwork[0].number,\n image: newArtwork[0].image || '',\n fileId: newArtwork[0].fileId || undefined,\n description: newArtwork[0].description || '',\n createdTime: newArtwork[0].createdTime || undefined,\n theme: newArtwork[0].theme || undefined,\n pageOrder: newArtwork[0].pageOrder || 0,\n };\n \n console.log('📤 [数据库] 返回作品数据:', result);\n return result;\n }\n\n // 更新作品\n async updateArtwork(collectionId: number, artworkId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> {\n // 首先检查作品是否存在\n const existingArtwork = await db.select()\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ))\n .limit(1);\n\n if (existingArtwork.length === 0) {\n throw new Error(`作品不存在或不属于指定画集 (作品ID: ${artworkId}, 画集ID: ${collectionId})`);\n }\n\n // 准备更新数据 - 只支持通用文件服务\n const updateData: any = {\n title: artworkData.title,\n number: artworkData.number,\n description: artworkData.description,\n createdTime: artworkData.createdTime,\n theme: artworkData.theme,\n updatedAt: new Date(),\n };\n\n // 如果提供了新的fileId,则更新\n if (artworkData.fileId) {\n updateData.fileId = artworkData.fileId;\n updateData.migrationStatus = 'completed';\n // 清空旧的image字段\n updateData.image = null;\n console.log('📁 [数据库] 更新通用文件服务ID:', artworkData.fileId);\n }\n\n const updatedArtwork = await db.update(comicUniverseArtworks)\n .set(updateData)\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ))\n .returning();\n\n if (updatedArtwork.length === 0) {\n throw new Error('更新作品失败,未返回数据');\n }\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n\n return {\n id: updatedArtwork[0].id,\n title: updatedArtwork[0].title,\n number: updatedArtwork[0].number,\n image: updatedArtwork[0].image || '',\n fileId: updatedArtwork[0].fileId || undefined,\n description: updatedArtwork[0].description || '',\n createdTime: updatedArtwork[0].createdTime || '',\n theme: updatedArtwork[0].theme || '',\n pageOrder: updatedArtwork[0].pageOrder || 0,\n };\n }\n\n // 删除作品\n async deleteArtwork(collectionId: number, artworkId: number): Promise<void> {\n // 首先验证作品存在性\n const artworkWithCollection = await db\n .select({\n artworkId: comicUniverseArtworks.id,\n artworkTitle: comicUniverseArtworks.title,\n collectionId: comicUniverseCollections.id,\n collectionTitle: comicUniverseCollections.title,\n })\n .from(comicUniverseArtworks)\n .leftJoin(comicUniverseCollections, eq(comicUniverseArtworks.collectionId, comicUniverseCollections.id))\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ))\n .limit(1);\n\n if (!artworkWithCollection.length) {\n throw new Error('作品不存在或不属于指定画集');\n }\n\n const artwork = artworkWithCollection[0];\n\n console.log(`🗑️ [deleteArtwork] 删除作品 ID:${artworkId} \"${artwork.artworkTitle}\" 从画集 ID:${collectionId} \"${artwork.collectionTitle}\"`);\n\n // 执行删除\n await db.delete(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ));\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n }\n\n // 更新作品显示顺序\n async updateArtworkOrder(collectionId: number, artworkOrders: { id: number; pageOrder: number }[]): Promise<void> {\n try {\n // 使用事务批量更新显示顺序\n await db.transaction(async (tx) => {\n for (const { id, pageOrder } of artworkOrders) {\n await tx\n .update(comicUniverseArtworks)\n .set({ \n pageOrder,\n updatedAt: new Date()\n })\n .where(and(\n eq(comicUniverseArtworks.id, id),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ));\n }\n });\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n } catch (error) {\n console.error('更新作品顺序失败:', error);\n throw error;\n }\n }\n\n // 移动作品到指定位置\n async moveArtwork(collectionId: number, artworkId: number, targetOrder: number): Promise<void> {\n try {\n // 获取当前画集中的所有作品\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n\n // 找到要移动的作品\n const targetArtwork = artworks.find(a => a.id === artworkId);\n if (!targetArtwork) {\n throw new Error('作品不存在');\n }\n\n // 确保目标位置在有效范围内\n if (targetOrder < 0 || targetOrder >= artworks.length) {\n throw new Error('目标位置无效');\n }\n\n // 重新计算所有作品的显示顺序\n const sortedArtworks = artworks.filter(a => a.id !== artworkId);\n sortedArtworks.splice(targetOrder, 0, targetArtwork);\n\n // 生成新的显示顺序\n const updates = sortedArtworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n\n await this.updateArtworkOrder(collectionId, updates);\n } catch (error) {\n console.error('移动作品失败:', error);\n throw error;\n }\n }\n\n // 上移作品\n async moveArtworkUp(collectionId: number, artworkId: number): Promise<void> {\n try {\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder), asc(comicUniverseArtworks.id)); // 添加id作为次要排序\n\n // 检查并修复重复的pageOrder\n const pageOrders = artworks.map(a => a.pageOrder);\n const hasDuplicates = pageOrders.length !== new Set(pageOrders).size;\n \n if (hasDuplicates || artworks.some(a => a.pageOrder === null)) {\n console.log('检测到重复pageOrder,先修复顺序...');\n \n // 重新分配连续的pageOrder\n const fixUpdates = artworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n \n await this.updateArtworkOrder(collectionId, fixUpdates);\n \n // 重新获取修复后的数据\n const fixedArtworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n \n // 使用修复后的数据继续操作\n artworks.splice(0, artworks.length, ...fixedArtworks);\n }\n\n const currentIndex = artworks.findIndex(a => a.id === artworkId);\n if (currentIndex === -1) {\n throw new Error('作品不存在');\n }\n if (currentIndex === 0) {\n throw new Error('作品已经在最前面');\n }\n\n // 交换当前作品和前一个作品的顺序\n const targetIndex = currentIndex - 1;\n const currentOrder = artworks[targetIndex].pageOrder;\n const targetOrder = artworks[currentIndex].pageOrder;\n \n const updates = [\n { id: artworks[currentIndex].id, pageOrder: currentOrder },\n { id: artworks[targetIndex].id, pageOrder: targetOrder }\n ];\n\n await this.updateArtworkOrder(collectionId, updates);\n } catch (error) {\n console.error('上移作品失败:', error);\n throw error;\n }\n }\n\n // 下移作品\n async moveArtworkDown(collectionId: number, artworkId: number): Promise<void> {\n try {\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder), asc(comicUniverseArtworks.id)); // 添加id作为次要排序\n\n // 检查并修复重复的pageOrder\n const pageOrders = artworks.map(a => a.pageOrder);\n const hasDuplicates = pageOrders.length !== new Set(pageOrders).size;\n \n if (hasDuplicates || artworks.some(a => a.pageOrder === null)) {\n console.log('检测到重复pageOrder,先修复顺序...');\n \n // 重新分配连续的pageOrder\n const fixUpdates = artworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n \n await this.updateArtworkOrder(collectionId, fixUpdates);\n \n // 重新获取修复后的数据\n const fixedArtworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n \n // 使用修复后的数据继续操作\n artworks.splice(0, artworks.length, ...fixedArtworks);\n }\n\n // 添加调试信息\n console.log('下移作品后端调试信息:', {\n collectionId,\n artworkId,\n totalArtworks: artworks.length,\n artworkOrders: artworks.map(a => ({ id: a.id, pageOrder: a.pageOrder }))\n });\n\n const currentIndex = artworks.findIndex(a => a.id === artworkId);\n if (currentIndex === -1) {\n throw new Error('作品不存在');\n }\n if (currentIndex === artworks.length - 1) {\n throw new Error('作品已经在最后面');\n }\n\n // 交换当前作品和后一个作品的顺序\n const targetIndex = currentIndex + 1;\n const currentOrder = artworks[targetIndex].pageOrder;\n const targetOrder = artworks[currentIndex].pageOrder;\n \n console.log('下移交换信息:', {\n currentIndex,\n targetIndex,\n currentOrder,\n targetOrder,\n currentArtworkId: artworks[currentIndex].id,\n targetArtworkId: artworks[targetIndex].id\n });\n \n const updates = [\n { id: artworks[currentIndex].id, pageOrder: currentOrder },\n { id: artworks[targetIndex].id, pageOrder: targetOrder }\n ];\n\n await this.updateArtworkOrder(collectionId, updates);\n } catch (error) {\n console.error('下移作品失败:', error);\n throw error;\n }\n }\n\n // 获取指定画集的所有作品(按顺序)\n async getArtworksByCollection(collectionId: number): Promise<(ArtworkPage & { pageOrder: number })[]> {\n try {\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n number: comicUniverseArtworks.number,\n fileId: comicUniverseArtworks.fileId, // 只查询fileId,不查询Base64图片\n description: comicUniverseArtworks.description,\n createdTime: comicUniverseArtworks.createdTime,\n theme: comicUniverseArtworks.theme,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder), asc(comicUniverseArtworks.id)); // 添加id作为次要排序\n\n // 检查是否有重复的pageOrder,如果有则修复\n const pageOrders = artworks.map(a => a.pageOrder);\n const hasDuplicates = pageOrders.length !== new Set(pageOrders).size;\n \n if (hasDuplicates || artworks.some(a => a.pageOrder === null)) {\n console.log('检测到重复或空的pageOrder,开始修复...');\n \n // 重新分配连续的pageOrder\n const updates = artworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n \n await this.updateArtworkOrder(collectionId, updates);\n \n // 重新查询修复后的数据\n const fixedArtworks = await db\n .select({\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n number: comicUniverseArtworks.number,\n fileId: comicUniverseArtworks.fileId, // 只查询fileId,不查询Base64图片\n description: comicUniverseArtworks.description,\n createdTime: comicUniverseArtworks.createdTime,\n theme: comicUniverseArtworks.theme,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n \n return await this.buildArtworkPagesWithUrls(fixedArtworks, collectionId);\n }\n\n return await this.buildArtworkPagesWithUrls(artworks, collectionId);\n } catch (error) {\n console.error('获取作品列表失败:', error);\n throw error;\n }\n }\n\n // 构建作品页面数据,包含正确的图片URL\n private async buildArtworkPagesWithUrls(artworks: any[], collectionId: number): Promise<(ArtworkPage & { pageOrder: number })[]> {\n // 批量获取文件URL以提高性能\n const fileIdToUrlMap = new Map<string, string>();\n const artworksWithFileId = artworks.filter(artwork => artwork.fileId);\n \n if (artworksWithFileId.length > 0) {\n try {\n // 使用ShowMasterpiece的独立文件服务配置\n const { getShowMasterpieceFileConfig } = await import('../services/fileService');\n const configManager = await getShowMasterpieceFileConfig();\n const { UniversalFileService } = await import('../../../universalFile/server/UniversalFileService');\n \n const fileService = new UniversalFileService(configManager.getConfig());\n await fileService.initialize();\n \n // 并行获取所有文件URL\n const urlPromises = artworksWithFileId.map(async (artwork) => {\n try {\n const fileUrl = await fileService.getFileUrl(artwork.fileId);\n return { fileId: artwork.fileId, url: fileUrl };\n } catch (error) {\n console.warn(`⚠️ [ArtworksDbService] 获取文件URL失败: ${artwork.fileId}`, error);\n return { fileId: artwork.fileId, url: null };\n }\n });\n \n const urlResults = await Promise.all(urlPromises);\n urlResults.forEach(result => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n } catch (error) {\n console.warn('⚠️ [ArtworksDbService] 批量获取文件URL失败:', error);\n }\n }\n \n return artworks.map(artwork => {\n // 构建图片URL,优先使用OSS URL,回退到API路径\n let imageUrl: string;\n if (artwork.fileId && fileIdToUrlMap.has(artwork.fileId)) {\n imageUrl = fileIdToUrlMap.get(artwork.fileId)!;\n } else {\n // 如果没有fileId或获取URL失败,使用API路径\n imageUrl = `/api/showmasterpiece/collections/${collectionId}/artworks/${artwork.id}/image`;\n }\n \n return {\n id: artwork.id,\n title: artwork.title,\n number: artwork.number,\n image: imageUrl, // 使用OSS URL或API路径\n fileId: artwork.fileId || undefined,\n description: artwork.description || '',\n createdTime: artwork.createdTime || '',\n theme: artwork.theme || '',\n pageOrder: artwork.pageOrder,\n };\n });\n }\n}\n\n// 导出服务实例\nexport const masterpiecesConfigDbService = new MasterpiecesConfigDbService();\nexport const categoriesDbService = new CategoriesDbService();\nexport const tagsDbService = new TagsDbService();\nexport const collectionsDbService = new CollectionsDbService();\nexport const artworksDbService = new ArtworksDbService(collectionsDbService); \n","import { and, asc, desc, eq, like, sql } from 'drizzle-orm';\nimport { comicUniverseBookings } from '../schema/bookings';\nimport { comicUniverseCollections } from '../schema/masterpieces';\n\nexport interface AdminBookingQueryInput {\n qqNumber?: string | null;\n phoneNumber?: string | null;\n status?: string | null;\n applyFiltersToStats?: boolean;\n}\n\nexport interface BookableCollectionsQueryInput {\n categoryId?: number;\n limit?: number;\n orderBy?: 'displayOrder' | 'createdAt' | 'title' | string;\n}\n\nexport interface BookingListQueryInput {\n collectionId?: number;\n qqNumber?: string;\n phoneNumber?: string;\n status?: string;\n page?: number;\n limit?: number;\n}\n\nexport class BookingQueryService {\n constructor(private readonly db: any) {}\n\n private buildAdminConditions(input: {\n qqNumber?: string | null;\n phoneNumber?: string | null;\n status?: string | null;\n }): any[] {\n const conditions: any[] = [];\n\n if (input.qqNumber) {\n conditions.push(like(comicUniverseBookings.qqNumber, `%${input.qqNumber}%`));\n }\n\n if (input.phoneNumber) {\n conditions.push(like(comicUniverseBookings.phoneNumber, `%${input.phoneNumber}%`));\n }\n\n if (input.status && input.status !== 'all') {\n conditions.push(eq(comicUniverseBookings.status, input.status));\n }\n\n return conditions;\n }\n\n private formatAdminBooking(booking: any): any {\n return {\n id: booking.id,\n collectionId: booking.collectionId,\n qqNumber: booking.qqNumber,\n phoneNumber: booking.phoneNumber,\n quantity: booking.quantity,\n status: booking.status,\n notes: booking.notes,\n pickupMethod: booking.pickupMethod,\n adminNotes: booking.adminNotes,\n createdAt: booking.createdAt instanceof Date ? booking.createdAt.toISOString() : booking.createdAt,\n updatedAt: booking.updatedAt instanceof Date ? booking.updatedAt.toISOString() : booking.updatedAt,\n confirmedAt: booking.confirmedAt instanceof Date ? booking.confirmedAt.toISOString() : booking.confirmedAt,\n completedAt: booking.completedAt instanceof Date ? booking.completedAt.toISOString() : booking.completedAt,\n cancelledAt: booking.cancelledAt instanceof Date ? booking.cancelledAt.toISOString() : booking.cancelledAt,\n collection: {\n id: booking.collectionId,\n title: booking.collectionTitle || '未知画集',\n number: booking.collectionNumber || '未知编号',\n coverImage: booking.collectionCoverImage || '',\n price: booking.collectionPrice || 0,\n },\n totalPrice: (booking.collectionPrice || 0) * booking.quantity,\n };\n }\n\n async getAdminBookings(input: AdminBookingQueryInput = {}): Promise<any> {\n const {\n qqNumber,\n phoneNumber,\n status,\n applyFiltersToStats = true,\n } = input;\n\n const conditions = this.buildAdminConditions({ qqNumber, phoneNumber, status });\n\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n collectionId: comicUniverseBookings.collectionId,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n quantity: comicUniverseBookings.quantity,\n status: comicUniverseBookings.status,\n notes: comicUniverseBookings.notes,\n pickupMethod: comicUniverseBookings.pickupMethod,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionCoverImage: comicUniverseCollections.coverImage,\n collectionPrice: comicUniverseCollections.price,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(comicUniverseBookings.createdAt));\n\n const baseStatsQuery = this.db\n .select({\n totalBookings: sql<number>`count(*)`,\n pendingBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'pending')`,\n confirmedBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'confirmed')`,\n completedBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'completed')`,\n cancelledBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'cancelled')`,\n totalQuantity: sql<number>`coalesce(sum(${comicUniverseBookings.quantity}), 0)`,\n totalRevenue: sql<number>`coalesce(sum(${comicUniverseBookings.quantity} * coalesce(${comicUniverseCollections.price}, 0)), 0)`,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id));\n\n const stats = applyFiltersToStats && conditions.length > 0\n ? await baseStatsQuery.where(and(...conditions))\n : await baseStatsQuery;\n\n return {\n bookings: bookings.map((booking: any) => this.formatAdminBooking(booking)),\n stats: {\n totalBookings: stats[0]?.totalBookings || 0,\n pendingBookings: stats[0]?.pendingBookings || 0,\n confirmedBookings: stats[0]?.confirmedBookings || 0,\n completedBookings: stats[0]?.completedBookings || 0,\n cancelledBookings: stats[0]?.cancelledBookings || 0,\n totalQuantity: stats[0]?.totalQuantity || 0,\n totalRevenue: stats[0]?.totalRevenue || 0,\n },\n };\n }\n\n async getBookableCollections(input: BookableCollectionsQueryInput = {}): Promise<any[]> {\n const conditions: any[] = [eq(comicUniverseCollections.isPublished, true)];\n\n if (input.categoryId) {\n conditions.push(eq(comicUniverseCollections.categoryId, input.categoryId));\n }\n\n let orderByClause: any;\n switch (input.orderBy) {\n case 'createdAt':\n orderByClause = desc(comicUniverseCollections.createdAt);\n break;\n case 'title':\n orderByClause = asc(comicUniverseCollections.title);\n break;\n case 'displayOrder':\n default:\n orderByClause = asc(comicUniverseCollections.displayOrder);\n break;\n }\n\n const limit = Math.min(100, Math.max(1, input.limit ?? 50));\n\n const collections = await this.db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n number: comicUniverseCollections.number,\n coverImage: comicUniverseCollections.coverImage,\n price: comicUniverseCollections.price,\n description: comicUniverseCollections.description,\n displayOrder: comicUniverseCollections.displayOrder,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(and(...conditions))\n .orderBy(orderByClause)\n .limit(limit);\n\n return collections.map((collection: any) => ({\n id: collection.id,\n title: collection.title,\n number: collection.number,\n coverImage: collection.coverImage,\n price: collection.price,\n description: collection.description,\n displayOrder: collection.displayOrder,\n createdAt: collection.createdAt?.toISOString(),\n }));\n }\n\n async exportBookingsCsv(): Promise<string> {\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n collectionId: comicUniverseBookings.collectionId,\n status: comicUniverseBookings.status,\n quantity: comicUniverseBookings.quantity,\n notes: comicUniverseBookings.notes,\n pickupMethod: comicUniverseBookings.pickupMethod,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionPrice: comicUniverseCollections.price,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .orderBy(comicUniverseBookings.createdAt);\n\n const headers = [\n '预订ID',\n 'QQ号',\n '手机号',\n '画集ID',\n '画集标题',\n '画集编号',\n '画集价格',\n '预订状态',\n '预订数量',\n '用户备注',\n '领取方式',\n '管理员备注',\n '创建时间',\n '更新时间',\n '确认时间',\n '完成时间',\n '取消时间',\n ];\n\n const statusMap: Record<string, string> = {\n pending: '待确认',\n confirmed: '已确认',\n completed: '已完成',\n cancelled: '已取消',\n };\n\n const formatTime = (value: string | Date | null | undefined): string => {\n if (!value) return '';\n return new Date(value).toLocaleString('zh-CN');\n };\n\n const rows = bookings.map((booking: any) => [\n booking.id,\n booking.qqNumber || '',\n booking.phoneNumber || '',\n booking.collectionId,\n booking.collectionTitle || '',\n booking.collectionNumber || '',\n booking.collectionPrice || '',\n statusMap[booking.status] || booking.status,\n booking.quantity,\n booking.notes || '',\n booking.pickupMethod || '',\n booking.adminNotes || '',\n formatTime(booking.createdAt),\n formatTime(booking.updatedAt),\n formatTime(booking.confirmedAt),\n formatTime(booking.completedAt),\n formatTime(booking.cancelledAt),\n ]);\n\n const BOM = '\\uFEFF';\n return (\n BOM +\n headers.join(',') +\n '\\n' +\n rows\n .map((row: any[]) =>\n row\n .map((cell: any) => {\n const cellStr = String(cell || '');\n if (cellStr.includes(',') || cellStr.includes('\"') || cellStr.includes('\\n')) {\n return `\"${cellStr.replace(/\"/g, '\"\"')}\"`;\n }\n return cellStr;\n })\n .join(','),\n )\n .join('\\n')\n );\n }\n\n async getBookingsList(input: BookingListQueryInput = {}): Promise<any> {\n const conditions: any[] = [];\n\n if (input.collectionId) {\n conditions.push(eq(comicUniverseBookings.collectionId, input.collectionId));\n }\n\n if (input.qqNumber) {\n conditions.push(like(comicUniverseBookings.qqNumber, `%${input.qqNumber}%`));\n }\n\n if (input.phoneNumber) {\n conditions.push(like(comicUniverseBookings.phoneNumber, `%${input.phoneNumber}%`));\n }\n\n if (input.status) {\n conditions.push(eq(comicUniverseBookings.status, input.status));\n }\n\n const page = Math.max(1, input.page || 1);\n const limit = Math.min(100, Math.max(1, input.limit || 20));\n const offset = (page - 1) * limit;\n\n const totalResult = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(comicUniverseBookings)\n .where(conditions.length > 0 ? and(...conditions) : undefined);\n\n const total = totalResult[0]?.count || 0;\n\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n collectionId: comicUniverseBookings.collectionId,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n quantity: comicUniverseBookings.quantity,\n status: comicUniverseBookings.status,\n notes: comicUniverseBookings.notes,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionCoverImage: comicUniverseCollections.coverImage,\n collectionPrice: comicUniverseCollections.price,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(comicUniverseBookings.createdAt))\n .limit(limit)\n .offset(offset);\n\n return {\n bookings: bookings.map((booking: any) => ({\n id: booking.id,\n collectionId: booking.collectionId,\n qqNumber: booking.qqNumber,\n phoneNumber: booking.phoneNumber,\n quantity: booking.quantity,\n status: booking.status,\n notes: booking.notes,\n adminNotes: booking.adminNotes,\n createdAt: booking.createdAt?.toISOString(),\n updatedAt: booking.updatedAt?.toISOString(),\n confirmedAt: booking.confirmedAt?.toISOString(),\n completedAt: booking.completedAt?.toISOString(),\n cancelledAt: booking.cancelledAt?.toISOString(),\n collection: {\n id: booking.collectionId,\n title: booking.collectionTitle,\n number: booking.collectionNumber,\n coverImage: booking.collectionCoverImage,\n price: booking.collectionPrice,\n },\n })),\n total,\n page,\n limit,\n totalPages: Math.ceil(total / limit),\n };\n }\n\n async getBookingById(id: number): Promise<any | null> {\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n collectionId: comicUniverseBookings.collectionId,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n quantity: comicUniverseBookings.quantity,\n status: comicUniverseBookings.status,\n notes: comicUniverseBookings.notes,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionCoverImage: comicUniverseCollections.coverImage,\n collectionPrice: comicUniverseCollections.price,\n collectionDescription: comicUniverseCollections.description,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .where(eq(comicUniverseBookings.id, id))\n .limit(1);\n\n if (bookings.length === 0) {\n return null;\n }\n\n const booking = bookings[0];\n return {\n id: booking.id,\n collectionId: booking.collectionId,\n qqNumber: booking.qqNumber,\n phoneNumber: booking.phoneNumber,\n quantity: booking.quantity,\n status: booking.status,\n notes: booking.notes,\n adminNotes: booking.adminNotes,\n createdAt: booking.createdAt?.toISOString(),\n updatedAt: booking.updatedAt?.toISOString(),\n confirmedAt: booking.confirmedAt?.toISOString(),\n completedAt: booking.completedAt?.toISOString(),\n cancelledAt: booking.cancelledAt?.toISOString(),\n collection: {\n id: booking.collectionId,\n title: booking.collectionTitle,\n number: booking.collectionNumber,\n coverImage: booking.collectionCoverImage,\n price: booking.collectionPrice,\n description: booking.collectionDescription,\n },\n };\n }\n}\n\nexport function createBookingQueryService(db: any): BookingQueryService {\n return new BookingQueryService(db);\n}\n","import { and, eq } from 'drizzle-orm';\nimport { comicUniverseBookings } from '../schema/bookings';\nimport { comicUniverseCollections } from '../schema/masterpieces';\n\nexport type BookingCommandErrorCode =\n | 'INVALID_BOOKING_ID'\n | 'BOOKING_NOT_FOUND'\n | 'INVALID_PAYLOAD'\n | 'INVALID_PHONE'\n | 'INVALID_QQ'\n | 'INVALID_QUANTITY'\n | 'COLLECTION_NOT_FOUND'\n | 'INVALID_STATUS';\n\nexport class BookingCommandError extends Error {\n constructor(public readonly code: BookingCommandErrorCode, message: string) {\n super(message);\n this.name = 'BookingCommandError';\n }\n}\n\nexport class BookingCommandService {\n constructor(private readonly db: any) {}\n\n private async ensureBookingExists(id: number): Promise<void> {\n const existingBooking = await this.db\n .select({ id: comicUniverseBookings.id })\n .from(comicUniverseBookings)\n .where(eq(comicUniverseBookings.id, id))\n .limit(1);\n\n if (existingBooking.length === 0) {\n throw new BookingCommandError('BOOKING_NOT_FOUND', '预订不存在');\n }\n }\n\n private async ensureCollectionExists(collectionId: number): Promise<void> {\n const collection = await this.db\n .select({ id: comicUniverseCollections.id })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.id, collectionId))\n .limit(1);\n\n if (collection.length === 0) {\n throw new BookingCommandError('COLLECTION_NOT_FOUND', '画集不存在');\n }\n }\n\n private validatePhone(phoneNumber: string): void {\n const phoneRegex = /^1[3-9]\\d{9}$/;\n if (!phoneRegex.test(phoneNumber)) {\n throw new BookingCommandError('INVALID_PHONE', '手机号格式不正确');\n }\n }\n\n private validateQq(qqNumber: string): void {\n const qqRegex = /^\\d{5,11}$/;\n if (!qqRegex.test(qqNumber)) {\n throw new BookingCommandError('INVALID_QQ', 'QQ号格式不正确');\n }\n }\n\n async createBooking(body: any): Promise<any> {\n if (!body.collectionId || !body.qqNumber || !body.phoneNumber || !body.quantity) {\n throw new BookingCommandError('INVALID_PAYLOAD', '缺少必要参数:画集ID、QQ号、手机号、预订数量');\n }\n\n this.validatePhone(body.phoneNumber);\n this.validateQq(body.qqNumber);\n\n if (body.quantity < 1) {\n throw new BookingCommandError('INVALID_QUANTITY', '预订数量必须大于0');\n }\n\n await this.ensureCollectionExists(body.collectionId);\n\n const existingBooking = await this.db\n .select({\n id: comicUniverseBookings.id,\n quantity: comicUniverseBookings.quantity,\n notes: comicUniverseBookings.notes,\n })\n .from(comicUniverseBookings)\n .where(\n and(\n eq(comicUniverseBookings.qqNumber, body.qqNumber),\n eq(comicUniverseBookings.phoneNumber, body.phoneNumber),\n eq(comicUniverseBookings.collectionId, body.collectionId),\n ),\n )\n .limit(1);\n\n let resultBooking;\n\n if (existingBooking.length > 0) {\n const existing = existingBooking[0];\n const newQuantity = existing.quantity + body.quantity;\n const combinedNotes = existing.notes\n ? `${existing.notes}; 新增预订: ${body.notes || '无备注'}`\n : body.notes || null;\n\n const [updatedBooking] = await this.db\n .update(comicUniverseBookings)\n .set({\n quantity: newQuantity,\n notes: combinedNotes,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(comicUniverseBookings.qqNumber, body.qqNumber),\n eq(comicUniverseBookings.phoneNumber, body.phoneNumber),\n eq(comicUniverseBookings.collectionId, body.collectionId),\n ),\n )\n .returning();\n\n resultBooking = updatedBooking;\n } else {\n const [newBooking] = await this.db\n .insert(comicUniverseBookings)\n .values({\n collectionId: body.collectionId,\n qqNumber: body.qqNumber,\n phoneNumber: body.phoneNumber,\n quantity: body.quantity,\n notes: body.notes || null,\n status: 'pending',\n })\n .returning();\n\n resultBooking = newBooking;\n }\n\n return {\n id: resultBooking.id,\n collectionId: resultBooking.collectionId,\n qqNumber: resultBooking.qqNumber,\n phoneNumber: resultBooking.phoneNumber,\n quantity: resultBooking.quantity,\n status: resultBooking.status,\n notes: resultBooking.notes,\n createdAt:\n resultBooking.createdAt instanceof Date\n ? resultBooking.createdAt.toISOString()\n : resultBooking.createdAt,\n updatedAt:\n resultBooking.updatedAt instanceof Date\n ? resultBooking.updatedAt.toISOString()\n : resultBooking.updatedAt,\n };\n }\n\n async batchCreateBookings(body: any): Promise<any> {\n const { qqNumber, phoneNumber, items, notes, pickupMethod } = body;\n\n if (!qqNumber || !phoneNumber || !Array.isArray(items) || items.length === 0) {\n throw new BookingCommandError('INVALID_PAYLOAD', '缺少必要参数:QQ号、手机号、预订项列表');\n }\n\n this.validateQq(qqNumber);\n this.validatePhone(phoneNumber);\n\n const bookingIds: number[] = [];\n const failures: { collectionId: number; reason: string }[] = [];\n let successCount = 0;\n let failCount = 0;\n\n for (const item of items) {\n try {\n if (!item.collectionId || !item.quantity) {\n failures.push({ collectionId: item.collectionId, reason: '缺少必要参数' });\n failCount++;\n continue;\n }\n\n if (item.quantity < 1) {\n failures.push({ collectionId: item.collectionId, reason: '预订数量必须大于0' });\n failCount++;\n continue;\n }\n\n await this.ensureCollectionExists(item.collectionId);\n\n const [newBooking] = await this.db\n .insert(comicUniverseBookings)\n .values({\n collectionId: item.collectionId,\n qqNumber,\n phoneNumber,\n quantity: item.quantity,\n notes: notes || null,\n pickupMethod: pickupMethod || null,\n status: 'pending',\n })\n .returning();\n\n bookingIds.push(newBooking.id);\n successCount++;\n } catch {\n failures.push({ collectionId: item.collectionId, reason: '创建预订失败' });\n failCount++;\n }\n }\n\n return {\n bookingIds,\n successCount,\n failCount,\n failures: failures.length > 0 ? failures : undefined,\n };\n }\n\n async updateBooking(id: number, body: any): Promise<any> {\n await this.ensureBookingExists(id);\n\n const updateData: any = {\n updatedAt: new Date(),\n };\n\n if (body.status) {\n updateData.status = body.status;\n switch (body.status) {\n case 'confirmed':\n updateData.confirmedAt = new Date();\n break;\n case 'completed':\n updateData.completedAt = new Date();\n break;\n case 'cancelled':\n updateData.cancelledAt = new Date();\n break;\n }\n }\n\n if (body.adminNotes !== undefined) {\n updateData.adminNotes = body.adminNotes;\n }\n\n const [updatedBooking] = await this.db\n .update(comicUniverseBookings)\n .set(updateData)\n .where(eq(comicUniverseBookings.id, id))\n .returning();\n\n return {\n id: updatedBooking.id,\n collectionId: updatedBooking.collectionId,\n qqNumber: updatedBooking.qqNumber,\n quantity: updatedBooking.quantity,\n status: updatedBooking.status,\n notes: updatedBooking.notes,\n adminNotes: updatedBooking.adminNotes,\n createdAt: updatedBooking.createdAt?.toISOString(),\n updatedAt: updatedBooking.updatedAt?.toISOString(),\n confirmedAt: updatedBooking.confirmedAt?.toISOString(),\n completedAt: updatedBooking.completedAt?.toISOString(),\n cancelledAt: updatedBooking.cancelledAt?.toISOString(),\n };\n }\n\n async updateBookingStatus(id: number, status: string, adminNotes?: string): Promise<any> {\n if (!status || !['pending', 'confirmed', 'completed', 'cancelled'].includes(status)) {\n throw new BookingCommandError('INVALID_STATUS', '无效的预订状态');\n }\n\n await this.ensureBookingExists(id);\n\n const updateData: any = {\n status,\n updatedAt: new Date(),\n };\n\n if (adminNotes !== undefined) {\n updateData.adminNotes = adminNotes;\n }\n\n switch (status) {\n case 'confirmed':\n updateData.confirmedAt = new Date();\n break;\n case 'completed':\n updateData.completedAt = new Date();\n break;\n case 'cancelled':\n updateData.cancelledAt = new Date();\n break;\n }\n\n const updatedBookings = await this.db\n .update(comicUniverseBookings)\n .set(updateData)\n .where(eq(comicUniverseBookings.id, id))\n .returning();\n\n return updatedBookings[0];\n }\n\n async deleteBooking(id: number): Promise<void> {\n await this.ensureBookingExists(id);\n await this.db.delete(comicUniverseBookings).where(eq(comicUniverseBookings.id, id));\n }\n}\n\nexport function createBookingCommandService(db: any): BookingCommandService {\n return new BookingCommandService(db);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/showmasterpiece/server/schema/masterpieces.ts","../src/showmasterpiece/server/schema/bookings.ts","../src/showmasterpiece/server/schema/popupConfig.ts","../src/showmasterpiece/server/schema/config.ts","../src/showmasterpiece/server/services/configService.ts","../src/showmasterpiece/server/services/popupConfigService.ts","../src/showmasterpiece/server/services/basicDbService.ts","../src/showmasterpiece/server/services/masterpiecesDbService.ts","../src/showmasterpiece/server/services/bookingQueryService.ts","../src/showmasterpiece/server/services/bookingCommandService.ts"],"names":["pgTable","serial","integer","varchar","text","timestamp","index","relations","boolean","jsonb","db","eq","and","desc","asc","MasterpiecesConfigDbService","CategoriesDbService","TagsDbService","getShowMasterpieceFileConfig","sql","like"],"mappings":"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","file":"chunk-6NMIKAE7.mjs","sourcesContent":["/**\n * ShowMasterpiece 模块 - 数据库表结构定义\n * \n * 这个文件定义了ShowMasterpiece模块的完整数据库表结构,使用Drizzle ORM框架。\n * 包含了所有相关的表定义、索引优化和关系映射。\n * \n * 表结构概览:\n * - comicUniverseConfigs: 系统配置表\n * - comicUniverseCategories: 画集分类表 \n * - comicUniverseTags: 标签表\n * - comicUniverseCollections: 画集主表\n * - comicUniverseCollectionTags: 画集标签关联表(多对多)\n * - comicUniverseArtworks: 作品页面表\n * \n * 设计特点:\n * - 完整的外键约束和级联删除\n * - 针对查询场景的索引优化\n * - 支持软删除和发布状态控制\n * - 灵活的分类和标签系统\n * \n * @fileoverview 数据库表结构 - ShowMasterpiece模块\n */\n\nimport { relations } from 'drizzle-orm';\nimport { \n serial, \n text, \n timestamp, \n pgTable, \n json, \n integer, \n boolean,\n varchar,\n uuid,\n index\n} from 'drizzle-orm/pg-core';\n\n/**\n * 系统配置表 (comic_universe_configs)\n * \n * 存储ShowMasterpiece模块的全局配置信息,包括网站设置、显示选项等。\n * 通常只有一条记录,用于控制整个模块的行为和外观。\n * \n * 主要功能:\n * - 网站标题和描述配置\n * - 显示选项和分页设置\n * - 主题和语言设置\n * - 功能开关控制\n */\nexport const comicUniverseConfigs = pgTable('comic_universe_configs', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 网站名称 */\n siteName: varchar('site_name', { length: 255 }).notNull().default('画集展览'),\n \n /** 网站描述 */\n siteDescription: text('site_description').default('精美的艺术作品展览'),\n \n /** 首页主标题 */\n heroTitle: varchar('hero_title', { length: 255 }).notNull().default('艺术画集展览'),\n \n /** 首页副标题 */\n heroSubtitle: text('hero_subtitle').default('探索精美的艺术作品,感受创作的魅力'),\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: integer('max_collections_per_page').notNull().default(9),\n \n /** 是否启用搜索功能 */\n enableSearch: boolean('enable_search').notNull().default(true),\n \n /** 是否启用分类功能 */\n enableCategories: boolean('enable_categories').notNull().default(true),\n\n /** 首页分类Tab配置 */\n homeTabConfig: json('home_tab_config').default([]),\n \n /** 默认分类('all'表示显示所有分类) */\n defaultCategory: varchar('default_category', { length: 100 }).notNull().default('all'),\n \n /** 主题模式:light(浅色)、dark(深色)、auto(自动) */\n theme: varchar('theme', { length: 20 }).notNull().default('light'),\n \n /** 界面语言:zh(中文)、en(英文) */\n language: varchar('language', { length: 10 }).notNull().default('zh'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 画集分类表 (comic_universe_categories)\n * \n * 管理画集的分类信息,支持层级结构和排序。\n * 用于组织和筛选画集,提供更好的浏览体验。\n * \n * 主要功能:\n * - 分类名称和描述管理\n * - 显示顺序控制\n * - 启用/禁用状态控制\n * - 支持未来的层级分类扩展\n */\nexport const comicUniverseCategories = pgTable('comic_universe_categories', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 分类名称(唯一) */\n name: varchar('name', { length: 100 }).notNull().unique(),\n \n /** 分类描述 */\n description: text('description'),\n \n /** 显示顺序(数字越小越靠前) */\n displayOrder: integer('display_order').default(0),\n \n /** 是否启用该分类 */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按启用状态查询的索引 */\n isActiveIndex: index('categories_is_active_idx').on(table.isActive),\n \n /** 按显示顺序排序的索引 */\n displayOrderIndex: index('categories_display_order_idx').on(table.displayOrder),\n \n}));\n\n/**\n * 标签表 (comic_universe_tags)\n * \n * 管理画集的标签信息,支持颜色标识和状态控制。\n * 通过多对多关系与画集关联,实现灵活的标签系统。\n * \n * 主要功能:\n * - 标签名称管理(唯一性约束)\n * - 颜色标识(用于UI显示)\n * - 启用/禁用状态控制\n * - 支持标签的增删改查\n */\nexport const comicUniverseTags = pgTable('comic_universe_tags', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 标签名称(唯一) */\n name: varchar('name', { length: 50 }).notNull().unique(),\n \n /** 标签颜色(十六进制色值,用于UI显示) */\n color: varchar('color', { length: 7 }).default('#3b82f6'),\n \n /** 是否启用该标签 */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按启用状态查询的索引 */\n isActiveIndex: index('tags_is_active_idx').on(table.isActive),\n \n}));\n\n/**\n * 画集主表 (comic_universe_collections)\n * \n * 存储画集的基本信息和元数据,是系统的核心表之一。\n * 每个画集包含多个作品页面,支持分类、发布状态和访问统计。\n * \n * 主要功能:\n * - 画集基本信息(标题、作者、封面、描述)\n * - 分类关联(外键引用)\n * - 发布状态和时间控制\n * - 显示顺序和访问统计\n * - 支持软删除和草稿功能\n */\nexport const comicUniverseCollections = pgTable('comic_universe_collections', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 画集标题 */\n title: varchar('title', { length: 255 }).notNull(),\n \n /** 编号 */\n number: varchar('number', { length: 255 }).notNull(),\n \n /** 封面图片(支持URL或base64编码) */\n coverImage: text('cover_image').notNull(),\n \n /** 通用文件服务的封面图片文件ID(新架构) */\n coverImageFileId: uuid('cover_image_file_id'),\n \n /** 画集描述 */\n description: text('description'),\n \n /** 分类ID(外键,支持级联删除时设为null) */\n categoryId: integer('category_id').references(() => comicUniverseCategories.id, { onDelete: 'set null' }),\n \n /** 是否已发布(false表示草稿状态) */\n isPublished: boolean('is_published').notNull().default(true),\n \n /** 发布时间 */\n publishedAt: timestamp('published_at'),\n \n /** 显示顺序(数字越小越靠前) */\n displayOrder: integer('display_order').default(0),\n \n /** 画集价格(单位:元,null表示免费或价格待定) */\n price: integer('price'),\n \n /** 访问次数统计 */\n viewCount: integer('view_count').notNull().default(0),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按发布状态查询的索引 */\n isPublishedIndex: index('collections_is_published_idx').on(table.isPublished),\n \n /** 按显示顺序排序的索引 */\n displayOrderIndex: index('collections_display_order_idx').on(table.displayOrder),\n \n /** 按分类查询的索引 */\n categoryIdIndex: index('collections_category_id_idx').on(table.categoryId),\n \n /** 已发布画集按顺序排序的复合索引(优化首页查询) */\n publishedOrderIndex: index('collections_published_order_idx').on(table.isPublished, table.displayOrder),\n \n /** 已发布画集按创建时间排序的复合索引(优化时间线查询) */\n publishedCreatedIndex: index('collections_published_created_idx').on(table.isPublished, table.createdAt),\n \n /** 封面图片文件ID查询索引(新架构) */\n coverImageFileIdIndex: index('collections_cover_image_file_id_idx').on(table.coverImageFileId),\n}));\n\n/**\n * 画集标签关联表 (comic_universe_collection_tags)\n * \n * 实现画集和标签之间的多对多关系。\n * 每个画集可以有多个标签,每个标签也可以关联多个画集。\n * \n * 主要功能:\n * - 画集与标签的多对多关联\n * - 支持级联删除(删除画集或标签时自动清理关联)\n * - 复合主键确保关联的唯一性\n * - 针对查询场景的索引优化\n */\nexport const comicUniverseCollectionTags = pgTable('comic_universe_collection_tags', {\n /** 画集ID(外键,级联删除) */\n collectionId: integer('collection_id').notNull().references(() => comicUniverseCollections.id, { onDelete: 'cascade' }),\n \n /** 标签ID(外键,级联删除) */\n tagId: integer('tag_id').notNull().references(() => comicUniverseTags.id, { onDelete: 'cascade' }),\n}, (table) => ({\n /** 复合主键,确保同一画集不会重复关联同一标签 */\n pk: { primaryKey: [table.collectionId, table.tagId] },\n \n /** 按画集查询标签的索引 */\n collectionIdIndex: index('collection_tags_collection_id_idx').on(table.collectionId),\n \n /** 按标签查询画集的索引 */\n tagIdIndex: index('collection_tags_tag_id_idx').on(table.tagId),\n}));\n\n/**\n * 作品页面表 (comic_universe_artworks)\n * \n * 存储画集中的具体作品信息,每个画集包含多个作品页面。\n * 支持详细的作品元数据和页面排序功能。\n * \n * 主要功能:\n * - 作品详细信息(标题、作者、图片、描述等)\n * - 艺术作品元数据(创作时间、主题、尺寸等)\n * - 在画集中的页面顺序控制\n * - 启用/禁用状态(软删除)\n * - 支持富文本描述和多媒体内容\n */\nexport const comicUniverseArtworks = pgTable('comic_universe_artworks', {\n /** 主键ID */\n id: serial('id').primaryKey(),\n \n /** 所属画集ID(外键,级联删除) */\n collectionId: integer('collection_id').notNull().references(() => comicUniverseCollections.id, { onDelete: 'cascade' }),\n \n /** 作品标题 */\n title: varchar('title', { length: 255 }).notNull(),\n \n /** 编号 */\n number: varchar('number', { length: 255 }).notNull(),\n \n /** 作品图片(支持URL或base64编码,兼容旧数据) */\n image: text('image'),\n \n /** 通用文件服务的文件ID(新架构) */\n fileId: uuid('file_id'),\n \n /** 迁移状态:pending(待迁移), completed(已完成), failed(失败) */\n migrationStatus: varchar('migration_status', { length: 20 }).default('pending'),\n \n /** 作品描述 */\n description: text('description'),\n \n /** 创作时间(自由格式,如\"2024年春\" \"明代\" 等) */\n createdTime: varchar('created_time', { length: 20 }),\n \n /** 作品主题(如\"山水\" \"人物\" \"静物\"等) */\n theme: varchar('theme', { length: 255 }),\n \n /** 作品尺寸(如\"120x80cm\" \"A4\" 等) */\n dimensions: varchar('dimensions', { length: 100 }),\n \n /** 在画集中的页面顺序(从0开始) */\n pageOrder: integer('page_order').notNull().default(0),\n \n /** 是否启用(false表示已删除或隐藏) */\n isActive: boolean('is_active').notNull().default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n}, (table) => ({\n /** 按画集查询作品的索引 */\n collectionIdIndex: index('artworks_collection_id_idx').on(table.collectionId),\n \n /** 按启用状态查询的索引 */\n isActiveIndex: index('artworks_is_active_idx').on(table.isActive),\n \n /** 按页面顺序排序的索引 */\n pageOrderIndex: index('artworks_page_order_idx').on(table.pageOrder),\n \n /** 画集和启用状态的复合索引(优化画集内容查询) */\n collectionActiveIndex: index('artworks_collection_active_idx').on(table.collectionId, table.isActive),\n \n /** 画集和页面顺序的复合索引(优化排序查询) */\n collectionOrderIndex: index('artworks_collection_order_idx').on(table.collectionId, table.pageOrder),\n \n /** 画集、启用状态和页面顺序的三元复合索引(优化完整查询) */\n collectionActiveOrderIndex: index('artworks_collection_active_order_idx').on(table.collectionId, table.isActive, table.pageOrder),\n \n /** 文件ID查询索引(新架构) */\n fileIdIndex: index('artworks_file_id_idx').on(table.fileId),\n \n /** 迁移状态查询索引 */\n migrationStatusIndex: index('artworks_migration_status_idx').on(table.migrationStatus),\n}));\n\n// ===== 关系定义 =====\n// 使用Drizzle ORM的关系定义,实现表之间的关联查询\n\n/**\n * 系统配置表关系\n * 配置表通常只有一条记录,不需要复杂的关系定义\n */\nexport const comicUniverseConfigsRelations = relations(comicUniverseConfigs, ({ many }) => ({\n // 配置表通常只有一条记录,不需要关系\n}));\n\n/**\n * 分类表关系\n * 一个分类可以包含多个画集,并属于一个活动\n */\nexport const comicUniverseCategoriesRelations = relations(comicUniverseCategories, ({ many }) => ({\n /** 该分类下的所有画集 */\n collections: many(comicUniverseCollections),\n}));\n\n/**\n * 标签表关系\n * 一个标签可以关联多个画集(通过关联表),并属于一个活动\n */\nexport const comicUniverseTagsRelations = relations(comicUniverseTags, ({ many }) => ({\n /** 该标签的所有关联记录 */\n collectionTags: many(comicUniverseCollectionTags),\n}));\n\n/**\n * 画集表关系\n * 画集属于一个分类,包含多个作品,可以有多个标签,并属于一个活动\n */\nexport const comicUniverseCollectionsRelations = relations(comicUniverseCollections, ({ one, many }) => ({\n /** 所属分类 */\n category: one(comicUniverseCategories, {\n fields: [comicUniverseCollections.categoryId],\n references: [comicUniverseCategories.id],\n }),\n \n /** 包含的所有作品页面 */\n artworks: many(comicUniverseArtworks),\n \n /** 关联的所有标签记录 */\n collectionTags: many(comicUniverseCollectionTags),\n}));\n\n/**\n * 画集标签关联表关系\n * 连接画集和标签的中间表\n */\nexport const comicUniverseCollectionTagsRelations = relations(comicUniverseCollectionTags, ({ one }) => ({\n /** 关联的画集 */\n collection: one(comicUniverseCollections, {\n fields: [comicUniverseCollectionTags.collectionId],\n references: [comicUniverseCollections.id],\n }),\n \n /** 关联的标签 */\n tag: one(comicUniverseTags, {\n fields: [comicUniverseCollectionTags.tagId],\n references: [comicUniverseTags.id],\n }),\n}));\n\n/**\n * 作品表关系\n * 作品属于一个画集\n */\nexport const comicUniverseArtworksRelations = relations(comicUniverseArtworks, ({ one }) => ({\n /** 所属画集 */\n collection: one(comicUniverseCollections, {\n fields: [comicUniverseArtworks.collectionId],\n references: [comicUniverseCollections.id],\n }),\n})); \n","/**\n * ShowMasterpiece 模块 - 预订表结构定义\n * \n * 这个文件定义了画集预订功能的数据库表结构,使用Drizzle ORM框架。\n * 包含了预订表和相关的关系映射。\n * \n * 表结构概览:\n * - comicUniverseBookings: 画集预订表\n * \n * 设计特点:\n * - 完整的外键约束和级联删除\n * - 针对查询场景的索引优化\n * - 支持预订状态管理\n * - 记录用户联系信息和预订详情\n * - 支持用户对同一画集进行多次预订\n * \n * @fileoverview 数据库表结构 - 画集预订功能\n */\n\nimport { relations } from 'drizzle-orm';\nimport { \n serial, \n text, \n timestamp, \n pgTable, \n integer, \n boolean,\n varchar,\n index\n} from 'drizzle-orm/pg-core';\nimport { comicUniverseCollections } from './masterpieces';\n\n/**\n * 画集预订表 (comic_universe_bookings)\n * \n * 存储用户对画集的预订信息,包括联系方式和预订详情。\n * 支持预订状态管理和历史记录查询。\n * \n * 主要功能:\n * - 记录用户预订的画集和数量\n * - 存储用户联系方式(QQ号+手机号)\n * - 预订状态管理(待确认、已确认、已完成、已取消)\n * - 预订时间记录和备注信息\n * - 支持管理员处理预订\n * - 支持对同一画集的多次预订\n */\nexport const comicUniverseBookings = pgTable('comic_universe_bookings', {\n /** 自增ID(用于内部管理) */\n id: serial('id'),\n \n /** 预订的画集ID(外键,级联删除) */\n collectionId: integer('collection_id').notNull().references(() => comicUniverseCollections.id, { onDelete: 'cascade' }),\n \n /** 用户QQ号 */\n qqNumber: varchar('qq_number', { length: 20 }).notNull(),\n \n /** 用户手机号 */\n phoneNumber: varchar('phone_number', { length: 20 }).notNull(),\n \n /** 预订数量 */\n quantity: integer('quantity').notNull().default(1),\n \n /** 预订状态:pending(待确认)、confirmed(已确认)、completed(已完成)、cancelled(已取消) */\n status: varchar('status', { length: 20 }).notNull().default('pending'),\n \n /** 预订备注信息 */\n notes: text('notes'),\n \n /** 领取方式 */\n pickupMethod: text('pickup_method'),\n \n /** 管理员处理备注 */\n adminNotes: text('admin_notes'),\n \n /** 预订时间 */\n createdAt: timestamp('created_at').defaultNow().notNull(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n \n /** 确认时间 */\n confirmedAt: timestamp('confirmed_at'),\n \n /** 完成时间 */\n completedAt: timestamp('completed_at'),\n \n /** 取消时间 */\n cancelledAt: timestamp('cancelled_at'),\n}, (table) => ({\n // 移除复合主键约束,允许用户对同一画集进行多次预订\n // userCollectionPk: primaryKey({ columns: [table.qqNumber, table.phoneNumber, table.collectionId] }),\n \n /** 按画集查询预订的索引 */\n collectionIdIndex: index('bookings_collection_id_idx').on(table.collectionId),\n \n /** 按状态查询的索引 */\n statusIndex: index('bookings_status_idx').on(table.status),\n \n /** 按QQ号查询的索引 */\n qqNumberIndex: index('bookings_qq_number_idx').on(table.qqNumber),\n \n /** 按手机号查询的索引 */\n phoneNumberIndex: index('bookings_phone_number_idx').on(table.phoneNumber),\n \n /** 按创建时间排序的索引 */\n createdAtIndex: index('bookings_created_at_idx').on(table.createdAt),\n \n /** 画集和状态的复合索引(优化画集预订查询) */\n collectionStatusIndex: index('bookings_collection_status_idx').on(table.collectionId, table.status),\n \n /** QQ号和状态的复合索引(优化用户预订查询) */\n qqStatusIndex: index('bookings_qq_status_idx').on(table.qqNumber, table.status),\n \n /** QQ号+手机号的复合索引(优化用户查询) */\n userIndex: index('bookings_user_idx').on(table.qqNumber, table.phoneNumber),\n \n /** QQ号+手机号+状态的复合索引(优化用户状态查询) */\n userStatusIndex: index('bookings_user_status_idx').on(table.qqNumber, table.phoneNumber, table.status),\n}));\n\n// ===== 关系定义 =====\n\n/**\n * 预订表关系\n * 预订属于一个画集\n */\nexport const comicUniverseBookingsRelations = relations(comicUniverseBookings, ({ one }) => ({\n /** 预订的画集 */\n collection: one(comicUniverseCollections, {\n fields: [comicUniverseBookings.collectionId],\n references: [comicUniverseCollections.id],\n }),\n \n})); \n","/**\n * ShowMasterpiece 模块 - 弹窗配置表结构\n * \n * 管理限时弹窗的配置信息\n * \n * @fileoverview 弹窗配置数据库schema\n */\n\nimport { pgTable, text, timestamp, boolean, jsonb } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n/**\n * 弹窗配置表\n */\nexport const popupConfigs = pgTable('popup_configs', {\n /** 配置ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 配置名称 */\n name: text('name').notNull(),\n \n /** 配置描述 */\n description: text('description'),\n \n /** 弹窗类型 */\n type: text('type').notNull().default('deadline'), // deadline, announcement, etc.\n \n /** 是否启用 */\n enabled: boolean('enabled').default(false),\n \n /** 触发条件配置 */\n triggerConfig: jsonb('trigger_config').notNull().$type<{\n /** 截止时间 ISO 字符串 */\n deadlineTime?: string;\n /** 提前提醒时间(分钟) */\n advanceMinutes?: number;\n /** 触发条件类型 */\n triggerType: 'after_deadline' | 'before_deadline' | 'always';\n }>(),\n \n /** 弹窗内容配置 */\n contentConfig: jsonb('content_config').notNull().$type<{\n /** 弹窗标题 */\n title: string;\n /** 弹窗内容 */\n message: string;\n /** 确认按钮文本 */\n confirmText?: string;\n /** 取消按钮文本 */\n cancelText?: string;\n /** 是否显示取消按钮 */\n showCancel?: boolean;\n /** 弹窗主题 */\n theme?: 'warning' | 'info' | 'error' | 'success';\n }>(),\n \n /** 显示设置 */\n displayConfig: jsonb('display_config').$type<{\n /** 弹窗宽度 */\n width?: number;\n /** 弹窗高度 */\n height?: number | string;\n /** 是否可点击遮罩关闭 */\n maskClosable?: boolean;\n /** 自动关闭时间(秒,0表示不自动关闭) */\n autoCloseSeconds?: number;\n }>(),\n\n /** 是否阻断流程 - true: 阻断提交,false: 仅提醒但允许继续 */\n blockProcess: boolean('block_process').default(false),\n \n /** 业务模块 */\n businessModule: text('business_module').notNull().default('showmasterpiece'),\n \n /** 业务场景 */\n businessScene: text('business_scene').notNull().default('cart_checkout'),\n \n /** 排序权重 */\n sortOrder: text('sort_order').default('0'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n/**\n * 弹窗配置表关系\n */\nexport const popupConfigsRelations = relations(popupConfigs, () => ({}));\n\nexport type PopupConfig = typeof popupConfigs.$inferSelect;\nexport type NewPopupConfig = typeof popupConfigs.$inferInsert;\n","/**\n * ShowMasterpiece模块 - 配置管理数据库表结构\n * \n * 独立的配置管理表,不依赖全局配置表\n * 用于模块独立化部署\n */\n\nimport { pgTable, text, timestamp, boolean, integer, jsonb } from 'drizzle-orm/pg-core';\n\n/**\n * ShowMasterPieces配置分类表\n * 表名:showmaster_config_categories\n */\nexport const showmasterConfigCategories = pgTable('showmaster_config_categories', {\n /** 配置分类ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 分类名称(用于代码引用) */\n name: text('name').notNull(),\n \n /** 显示名称(用于界面显示) */\n displayName: text('display_name').notNull(),\n \n /** 分类描述 */\n description: text('description'),\n \n /** 分类图标 */\n icon: text('icon'),\n \n /** 排序顺序 */\n sortOrder: integer('sort_order').default(0),\n \n /** 是否激活 */\n isActive: boolean('is_active').default(true),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n/**\n * ShowMasterPieces配置项表\n * 表名:showmaster_config_items\n */\nexport const showmasterConfigItems = pgTable('showmaster_config_items', {\n /** 配置项ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 分类ID */\n categoryId: text('category_id').references(() => showmasterConfigCategories.id),\n \n /** 配置键(必须唯一) */\n key: text('key').notNull().unique(),\n \n /** 显示名称 */\n displayName: text('display_name').notNull(),\n \n /** 配置描述 */\n description: text('description'),\n \n /** 配置值 */\n value: text('value'),\n \n /** 默认值 */\n defaultValue: text('default_value'),\n \n /** 配置类型:string, number, boolean, json, password */\n type: text('type').notNull(),\n \n /** 是否必填 */\n isRequired: boolean('is_required').default(false),\n \n /** 是否敏感信息 */\n isSensitive: boolean('is_sensitive').default(false),\n \n /** 验证规则(JSON格式) */\n validation: jsonb('validation'),\n \n /** 排序顺序 */\n sortOrder: integer('sort_order').default(0),\n \n /** 是否激活 */\n isActive: boolean('is_active').default(true),\n \n /** 环境标识(development, production, testing等) */\n environment: text('environment').default('development'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n/**\n * ShowMasterPieces配置历史表\n * 表名:showmaster_config_history\n */\nexport const showmasterConfigHistory = pgTable('showmaster_config_history', {\n /** 历史记录ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 配置项ID */\n configItemId: text('config_item_id').references(() => showmasterConfigItems.id),\n \n /** 旧值 */\n oldValue: text('old_value'),\n \n /** 新值 */\n newValue: text('new_value'),\n \n /** 修改人 */\n changedBy: text('changed_by').notNull(),\n \n /** 修改原因 */\n changeReason: text('change_reason'),\n \n /** 操作类型:create, update, delete */\n operationType: text('operation_type').notNull(),\n \n /** 环境标识 */\n environment: text('environment').default('development'),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n});\n\n/**\n * ShowMasterPieces配置权限表(可选,用于细粒度权限控制)\n * 表名:showmaster_config_permissions\n */\nexport const showmasterConfigPermissions = pgTable('showmaster_config_permissions', {\n /** 权限ID */\n id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n \n /** 用户ID */\n userId: text('user_id').notNull(),\n \n /** 分类ID */\n categoryId: text('category_id').references(() => showmasterConfigCategories.id),\n \n /** 可读权限 */\n canRead: boolean('can_read').default(true),\n \n /** 可写权限 */\n canWrite: boolean('can_write').default(false),\n \n /** 可删除权限 */\n canDelete: boolean('can_delete').default(false),\n \n /** 环境权限(可以访问的环境) */\n allowedEnvironments: jsonb('allowed_environments').$type<string[]>().default(['development']),\n \n /** 创建时间 */\n createdAt: timestamp('created_at').defaultNow(),\n \n /** 更新时间 */\n updatedAt: timestamp('updated_at').defaultNow(),\n});\n\n// 导出类型定义\nexport type ShowmasterConfigCategory = typeof showmasterConfigCategories.$inferSelect;\nexport type NewShowmasterConfigCategory = typeof showmasterConfigCategories.$inferInsert;\n\nexport type ShowmasterConfigItem = typeof showmasterConfigItems.$inferSelect;\nexport type NewShowmasterConfigItem = typeof showmasterConfigItems.$inferInsert;\n\nexport type ShowmasterConfigHistory = typeof showmasterConfigHistory.$inferSelect;\nexport type NewShowmasterConfigHistory = typeof showmasterConfigHistory.$inferInsert;\n\nexport type ShowmasterConfigPermission = typeof showmasterConfigPermissions.$inferSelect;\nexport type NewShowmasterConfigPermission = typeof showmasterConfigPermissions.$inferInsert;\n","/**\n * ShowMasterpiece模块 - 配置管理数据库服务\n * \n * 独立的配置管理服务,不依赖全局配置服务\n */\n\nimport { \n showmasterConfigCategories, \n showmasterConfigItems, \n showmasterConfigHistory,\n showmasterConfigPermissions,\n ShowmasterConfigCategory,\n ShowmasterConfigItem,\n ShowmasterConfigHistory,\n NewShowmasterConfigCategory,\n NewShowmasterConfigItem,\n NewShowmasterConfigHistory\n} from '../schema/config';\nimport { eq, and, like, desc, asc, sql, count } from 'drizzle-orm';\n\n/**\n * 配置搜索参数\n */\ninterface ConfigSearchParams {\n categoryId?: string;\n search?: string;\n type?: 'string' | 'number' | 'boolean' | 'json' | 'password';\n environment?: string;\n isActive?: boolean;\n page?: number;\n pageSize?: number;\n}\n\n/**\n * 分页响应\n */\ninterface PaginatedResponse<T> {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n/**\n * ShowMasterPieces配置管理服务\n */\nexport class ShowmasterConfigService {\n constructor(private readonly db: any) {}\n // ============= 配置分类管理 =============\n\n /**\n * 获取所有配置分类\n */\n async getAllCategories(): Promise<ShowmasterConfigCategory[]> {\n console.log('🎨 [ShowmasterConfigService] 获取所有配置分类');\n \n return await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(eq(showmasterConfigCategories.isActive, true))\n .orderBy(asc(showmasterConfigCategories.sortOrder), asc(showmasterConfigCategories.displayName));\n }\n\n /**\n * 根据ID获取配置分类\n */\n async getCategoryById(id: string): Promise<ShowmasterConfigCategory | null> {\n console.log('🎨 [ShowmasterConfigService] 获取配置分类:', id);\n \n const [category] = await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(and(\n eq(showmasterConfigCategories.id, id),\n eq(showmasterConfigCategories.isActive, true)\n ));\n \n return category || null;\n }\n\n /**\n * 根据名称获取配置分类\n */\n async getCategoryByName(name: string): Promise<ShowmasterConfigCategory | null> {\n console.log('🎨 [ShowmasterConfigService] 根据名称获取配置分类:', name);\n \n const [category] = await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(and(\n eq(showmasterConfigCategories.name, name),\n eq(showmasterConfigCategories.isActive, true)\n ));\n \n return category || null;\n }\n\n /**\n * 创建配置分类\n */\n async createCategory(data: Omit<NewShowmasterConfigCategory, 'id' | 'createdAt' | 'updatedAt'>): Promise<ShowmasterConfigCategory> {\n console.log('🎨 [ShowmasterConfigService] 创建配置分类:', data.name);\n \n const [category] = await this.db\n .insert(showmasterConfigCategories)\n .values({\n ...data,\n updatedAt: new Date(),\n })\n .returning();\n\n console.log('✅ [ShowmasterConfigService] 配置分类创建成功:', category.id);\n return category;\n }\n\n /**\n * 更新配置分类\n */\n async updateCategory(id: string, data: Partial<Omit<ShowmasterConfigCategory, 'id' | 'createdAt'>>): Promise<ShowmasterConfigCategory> {\n console.log('🎨 [ShowmasterConfigService] 更新配置分类:', id);\n \n const [category] = await this.db\n .update(showmasterConfigCategories)\n .set({\n ...data,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigCategories.id, id))\n .returning();\n\n if (!category) {\n throw new Error('配置分类不存在');\n }\n\n console.log('✅ [ShowmasterConfigService] 配置分类更新成功:', category.id);\n return category;\n }\n\n /**\n * 删除配置分类\n */\n async deleteCategory(id: string): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 删除配置分类:', id);\n \n // 软删除:设置为不活跃\n await this.db\n .update(showmasterConfigCategories)\n .set({\n isActive: false,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigCategories.id, id));\n\n console.log('✅ [ShowmasterConfigService] 配置分类删除成功:', id);\n }\n\n // ============= 配置项管理 =============\n\n /**\n * 获取配置项列表(支持分页和搜索)\n */\n async getConfigItems(params: ConfigSearchParams = {}): Promise<PaginatedResponse<ShowmasterConfigItem>> {\n const {\n categoryId,\n search,\n type,\n environment = 'development',\n isActive = true,\n page = 1,\n pageSize = 50\n } = params;\n\n console.log('🎨 [ShowmasterConfigService] 获取配置项列表:', { environment, page, pageSize });\n\n // 构建查询条件\n const conditions = [];\n \n if (isActive !== undefined) {\n conditions.push(eq(showmasterConfigItems.isActive, isActive));\n }\n \n if (categoryId) {\n conditions.push(eq(showmasterConfigItems.categoryId, categoryId));\n }\n \n if (type) {\n conditions.push(eq(showmasterConfigItems.type, type));\n }\n \n if (environment) {\n conditions.push(eq(showmasterConfigItems.environment, environment));\n }\n \n if (search) {\n conditions.push(\n sql`(${showmasterConfigItems.key} ILIKE ${'%' + search + '%'} OR \n ${showmasterConfigItems.displayName} ILIKE ${'%' + search + '%'} OR \n ${showmasterConfigItems.description} ILIKE ${'%' + search + '%'})`\n );\n }\n\n const whereCondition = conditions.length > 0 ? and(...conditions) : undefined;\n\n // 获取总数\n const [{ totalCount }] = await this.db\n .select({ totalCount: count() })\n .from(showmasterConfigItems)\n .where(whereCondition);\n\n // 获取数据\n const items = await this.db\n .select()\n .from(showmasterConfigItems)\n .where(whereCondition)\n .orderBy(asc(showmasterConfigItems.sortOrder), asc(showmasterConfigItems.displayName))\n .limit(pageSize)\n .offset((page - 1) * pageSize);\n\n const totalPages = Math.ceil(totalCount / pageSize);\n\n console.log(`✅ [ShowmasterConfigService] 找到 ${items.length}/${totalCount} 个配置项`);\n\n return {\n items,\n total: totalCount,\n page,\n pageSize,\n totalPages,\n };\n }\n\n /**\n * 根据ID获取配置项\n */\n async getConfigItemById(id: string): Promise<ShowmasterConfigItem | null> {\n console.log('🎨 [ShowmasterConfigService] 获取配置项:', id);\n \n const [item] = await this.db\n .select()\n .from(showmasterConfigItems)\n .where(eq(showmasterConfigItems.id, id));\n \n return item || null;\n }\n\n /**\n * 根据key获取配置项\n */\n async getConfigItemByKey(key: string, environment: string = 'development'): Promise<ShowmasterConfigItem | null> {\n console.log('🎨 [ShowmasterConfigService] 根据key获取配置项:', key, '环境:', environment);\n \n const [item] = await this.db\n .select()\n .from(showmasterConfigItems)\n .where(and(\n eq(showmasterConfigItems.key, key),\n eq(showmasterConfigItems.environment, environment),\n eq(showmasterConfigItems.isActive, true)\n ));\n \n return item || null;\n }\n\n /**\n * 创建配置项\n */\n async createConfigItem(data: Omit<NewShowmasterConfigItem, 'id' | 'createdAt' | 'updatedAt'>): Promise<ShowmasterConfigItem> {\n console.log('🎨 [ShowmasterConfigService] 创建配置项:', data.key);\n \n // 检查key是否已存在\n const existingItem = await this.getConfigItemByKey(data.key, data.environment || 'development');\n if (existingItem) {\n throw new Error(`配置项 ${data.key} 在 ${data.environment || 'development'} 环境中已存在`);\n }\n\n const [item] = await this.db\n .insert(showmasterConfigItems)\n .values({\n ...data,\n updatedAt: new Date(),\n })\n .returning();\n\n // 记录历史\n await this.recordHistory(item.id, null, item.value, 'system', 'create', item.environment || 'development');\n\n console.log('✅ [ShowmasterConfigService] 配置项创建成功:', item.id);\n return item;\n }\n\n /**\n * 更新配置项\n */\n async updateConfigItem(id: string, data: Partial<Omit<ShowmasterConfigItem, 'id' | 'createdAt'>>, changedBy: string = 'system'): Promise<ShowmasterConfigItem> {\n console.log('🎨 [ShowmasterConfigService] 更新配置项:', id);\n \n // 获取旧值用于历史记录\n const oldItem = await this.getConfigItemById(id);\n if (!oldItem) {\n throw new Error('配置项不存在');\n }\n\n const [item] = await this.db\n .update(showmasterConfigItems)\n .set({\n ...data,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigItems.id, id))\n .returning();\n\n if (!item) {\n throw new Error('配置项不存在');\n }\n\n // 记录历史(如果值发生变化)\n if (data.value !== undefined && data.value !== oldItem.value) {\n await this.recordHistory(item.id, oldItem.value, data.value, changedBy, 'update', item.environment || 'development');\n }\n\n console.log('✅ [ShowmasterConfigService] 配置项更新成功:', item.id);\n return item;\n }\n\n /**\n * 删除配置项\n */\n async deleteConfigItem(id: string, changedBy: string = 'system'): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 删除配置项:', id);\n \n // 获取配置项信息用于历史记录\n const item = await this.getConfigItemById(id);\n if (!item) {\n throw new Error('配置项不存在');\n }\n\n // 记录历史\n await this.recordHistory(item.id, item.value, null, changedBy, 'delete', item.environment || 'development');\n\n // 软删除:设置为不活跃\n await this.db\n .update(showmasterConfigItems)\n .set({\n isActive: false,\n updatedAt: new Date(),\n })\n .where(eq(showmasterConfigItems.id, id));\n\n console.log('✅ [ShowmasterConfigService] 配置项删除成功:', id);\n }\n\n // ============= 历史记录管理 =============\n\n /**\n * 记录配置变更历史\n */\n private async recordHistory(\n configItemId: string,\n oldValue: string | null,\n newValue: string | null,\n changedBy: string,\n operationType: 'create' | 'update' | 'delete',\n environment: string\n ): Promise<void> {\n try {\n await this.db\n .insert(showmasterConfigHistory)\n .values({\n configItemId,\n oldValue,\n newValue,\n changedBy,\n operationType,\n environment,\n });\n \n console.log(`📝 [ShowmasterConfigService] 历史记录已保存: ${operationType} for ${configItemId}`);\n } catch (error) {\n console.error('❌ [ShowmasterConfigService] 保存历史记录失败:', error);\n // 不抛出错误,避免影响主要操作\n }\n }\n\n /**\n * 获取配置项历史记录\n */\n async getConfigItemHistory(configItemId: string, limit: number = 50): Promise<ShowmasterConfigHistory[]> {\n console.log('🎨 [ShowmasterConfigService] 获取配置项历史:', configItemId);\n \n return await this.db\n .select()\n .from(showmasterConfigHistory)\n .where(eq(showmasterConfigHistory.configItemId, configItemId))\n .orderBy(desc(showmasterConfigHistory.createdAt))\n .limit(limit);\n }\n\n // ============= 工具方法 =============\n\n /**\n * 获取配置值(带类型转换)\n */\n async getConfigValue<T = string>(key: string, environment: string = 'development'): Promise<T | null> {\n const item = await this.getConfigItemByKey(key, environment);\n \n if (!item || !item.value) {\n return null;\n }\n\n try {\n switch (item.type) {\n case 'number':\n return Number(item.value) as T;\n case 'boolean':\n return (item.value.toLowerCase() === 'true') as T;\n case 'json':\n return JSON.parse(item.value) as T;\n default:\n return item.value as T;\n }\n } catch (error) {\n console.error(`❌ [ShowmasterConfigService] 配置值类型转换失败: ${key}`, error);\n return item.value as T;\n }\n }\n\n /**\n * 设置配置值\n */\n async setConfigValue(key: string, value: any, environment: string = 'development', changedBy: string = 'system'): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 设置配置值:', key, '环境:', environment);\n \n const item = await this.getConfigItemByKey(key, environment);\n \n if (!item) {\n throw new Error(`配置项 ${key} 在 ${environment} 环境中不存在`);\n }\n\n let stringValue: string;\n \n try {\n switch (item.type) {\n case 'json':\n stringValue = JSON.stringify(value);\n break;\n default:\n stringValue = String(value);\n break;\n }\n } catch (error) {\n throw new Error(`配置值转换失败: ${error}`);\n }\n\n await this.updateConfigItem(item.id, { value: stringValue }, changedBy);\n }\n\n /**\n * 初始化默认配置分类\n */\n async initializeDefaultCategories(): Promise<void> {\n console.log('🎨 [ShowmasterConfigService] 初始化默认配置分类');\n \n const defaultCategories = [\n {\n name: 'general',\n displayName: '通用配置',\n description: 'ShowMasterPieces模块通用配置项',\n icon: '⚙️',\n sortOrder: 0,\n },\n {\n name: 'display',\n displayName: '显示配置',\n description: '界面显示相关配置',\n icon: '🎨',\n sortOrder: 1,\n },\n {\n name: 'business',\n displayName: '业务配置',\n description: '业务逻辑相关配置',\n icon: '💼',\n sortOrder: 2,\n },\n {\n name: 'integration',\n displayName: '集成配置',\n description: '第三方服务集成配置',\n icon: '🔗',\n sortOrder: 3,\n },\n ];\n\n for (const category of defaultCategories) {\n try {\n // 检查是否已存在\n const existing = await this.db\n .select()\n .from(showmasterConfigCategories)\n .where(eq(showmasterConfigCategories.name, category.name));\n\n if (existing.length === 0) {\n await this.createCategory(category);\n console.log(`✅ [ShowmasterConfigService] 默认分类创建成功: ${category.name}`);\n }\n } catch (error) {\n console.error(`❌ [ShowmasterConfigService] 创建默认分类失败: ${category.name}`, error);\n }\n }\n }\n}\n\n// 导出单例实例\n\n\nexport function createShowmasterConfigService(db: any): ShowmasterConfigService {\n return new ShowmasterConfigService(db);\n}\n","/**\n * ShowMasterpiece 模块 - 弹窗配置数据库服务\n * \n * 提供弹窗配置的CRUD操作\n * \n * @fileoverview 弹窗配置数据库服务\n */\n\nimport { eq, and, desc } from 'drizzle-orm';\nimport { popupConfigs, PopupConfig, NewPopupConfig } from '../schema/popupConfig';\n\nexport class PopupConfigService {\n constructor(private readonly db: any) {}\n /**\n * 创建弹窗配置\n */\n async createPopupConfig(data: Omit<NewPopupConfig, 'id' | 'createdAt' | 'updatedAt'>): Promise<PopupConfig> {\n try {\n const [config] = await this.db\n .insert(popupConfigs)\n .values({\n ...data,\n updatedAt: new Date(),\n })\n .returning();\n\n console.log('✅ [PopupConfigService] 弹窗配置创建成功:', config.id);\n return config;\n } catch (error) {\n console.error('❌ [PopupConfigService] 创建弹窗配置失败:', error);\n throw new Error('创建弹窗配置失败');\n }\n }\n\n /**\n * 根据ID获取弹窗配置\n */\n async getPopupConfigById(id: string): Promise<PopupConfig | null> {\n try {\n const [config] = await this.db\n .select()\n .from(popupConfigs)\n .where(eq(popupConfigs.id, id))\n .limit(1);\n\n return config || null;\n } catch (error) {\n console.error('❌ [PopupConfigService] 获取弹窗配置失败:', error);\n throw new Error('获取弹窗配置失败');\n }\n }\n\n /**\n * 获取指定业务场景的启用弹窗配置\n */\n async getEnabledPopupConfigs(\n businessModule: string = 'showmasterpiece',\n businessScene: string = 'cart_checkout'\n ): Promise<PopupConfig[]> {\n try {\n // 构建查询条件\n const conditions = [\n eq(popupConfigs.enabled, true),\n eq(popupConfigs.businessModule, businessModule),\n eq(popupConfigs.businessScene, businessScene)\n ];\n \n const configs = await this.db\n .select()\n .from(popupConfigs)\n .where(and(...conditions))\n .orderBy(desc(popupConfigs.sortOrder), desc(popupConfigs.createdAt));\n\n console.log(`📊 [PopupConfigService] 获取到 ${configs.length} 个启用的弹窗配置`);\n return configs;\n } catch (error) {\n console.error('❌ [PopupConfigService] 获取启用弹窗配置失败:', error);\n throw new Error('获取启用弹窗配置失败');\n }\n }\n\n /**\n * 获取所有弹窗配置\n */\n async getAllPopupConfigs(): Promise<PopupConfig[]> {\n try {\n const configs = await this.db\n .select()\n .from(popupConfigs)\n .orderBy(desc(popupConfigs.createdAt));\n\n console.log(`📊 [PopupConfigService] 获取弹窗配置: 返回${configs.length}个配置`);\n return configs;\n } catch (error) {\n console.error('❌ [PopupConfigService] 获取所有弹窗配置失败:', error);\n throw new Error('获取所有弹窗配置失败');\n }\n }\n\n /**\n * 更新弹窗配置\n */\n async updatePopupConfig(id: string, data: Partial<Omit<PopupConfig, 'id' | 'createdAt'>>): Promise<PopupConfig> {\n try {\n const [config] = await this.db\n .update(popupConfigs)\n .set({\n ...data,\n updatedAt: new Date(),\n })\n .where(eq(popupConfigs.id, id))\n .returning();\n\n if (!config) {\n throw new Error('弹窗配置不存在');\n }\n\n console.log('✅ [PopupConfigService] 弹窗配置更新成功:', config.id);\n return config;\n } catch (error) {\n console.error('❌ [PopupConfigService] 更新弹窗配置失败:', error);\n throw new Error('更新弹窗配置失败');\n }\n }\n\n /**\n * 删除弹窗配置\n */\n async deletePopupConfig(id: string): Promise<boolean> {\n try {\n const result = await this.db\n .delete(popupConfigs)\n .where(eq(popupConfigs.id, id));\n\n console.log('✅ [PopupConfigService] 弹窗配置删除成功:', id);\n return true;\n } catch (error) {\n console.error('❌ [PopupConfigService] 删除弹窗配置失败:', error);\n throw new Error('删除弹窗配置失败');\n }\n }\n\n /**\n * 切换弹窗配置启用状态\n */\n async togglePopupConfig(id: string, enabled: boolean): Promise<PopupConfig> {\n try {\n const [config] = await this.db\n .update(popupConfigs)\n .set({\n enabled,\n updatedAt: new Date(),\n })\n .where(eq(popupConfigs.id, id))\n .returning();\n\n if (!config) {\n throw new Error('弹窗配置不存在');\n }\n\n console.log(`✅ [PopupConfigService] 弹窗配置${enabled ? '启用' : '禁用'}成功:`, config.id);\n return config;\n } catch (error) {\n console.error('❌ [PopupConfigService] 切换弹窗配置状态失败:', error);\n throw new Error('切换弹窗配置状态失败');\n }\n }\n\n /**\n * 检查是否需要显示弹窗\n */\n async shouldShowPopup(\n businessModule: string = 'showmasterpiece',\n businessScene: string = 'cart_checkout',\n currentTime: Date = new Date()\n ): Promise<PopupConfig[]> {\n try {\n const enabledConfigs = await this.getEnabledPopupConfigs(businessModule, businessScene);\n const triggeredConfigs: PopupConfig[] = [];\n\n for (const config of enabledConfigs) {\n const { triggerConfig } = config;\n \n if (triggerConfig.triggerType === 'always') {\n triggeredConfigs.push(config);\n continue;\n }\n\n if (triggerConfig.deadlineTime) {\n const deadlineTime = new Date(triggerConfig.deadlineTime);\n const timeDiff = deadlineTime.getTime() - currentTime.getTime();\n const minutesDiff = Math.floor(timeDiff / (1000 * 60));\n\n switch (triggerConfig.triggerType) {\n case 'after_deadline':\n if (currentTime > deadlineTime) {\n triggeredConfigs.push(config);\n }\n break;\n case 'before_deadline':\n if (triggerConfig.advanceMinutes && minutesDiff <= triggerConfig.advanceMinutes && minutesDiff > 0) {\n triggeredConfigs.push(config);\n }\n break;\n }\n }\n }\n\n console.log(`🔔 [PopupConfigService] 检查到 ${triggeredConfigs.length} 个需要显示的弹窗`);\n return triggeredConfigs;\n } catch (error) {\n console.error('❌ [PopupConfigService] 检查弹窗显示条件失败:', error);\n return [];\n }\n }\n}\n\n// 导出单例实例\n\n\nexport function createPopupConfigService(db: any): PopupConfigService {\n return new PopupConfigService(db);\n}\n","import { eq, asc, and } from 'drizzle-orm';\nimport {\n comicUniverseConfigs,\n comicUniverseCategories,\n comicUniverseTags,\n} from '../schema/masterpieces';\nimport { buildDefaultHomeTabConfig, normalizeHomeTabConfig } from '../../types';\n\ninterface MasterpiecesConfig {\n siteName: string;\n siteDescription?: string;\n heroTitle: string;\n heroSubtitle?: string;\n maxCollectionsPerPage: number;\n enableSearch: boolean;\n enableCategories: boolean;\n homeTabConfig: any[];\n defaultCategory: string;\n theme: 'light' | 'dark' | 'auto';\n language: 'zh' | 'en';\n}\n\nexport class MasterpiecesConfigDbService {\n constructor(private readonly db: any) {}\n\n async getConfig(): Promise<MasterpiecesConfig> {\n const configs = await this.db.select().from(comicUniverseConfigs).limit(1);\n\n if (configs.length === 0) {\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n\n return this.mapDbConfigToType(configs[0]);\n }\n\n async updateConfig(configData: Partial<MasterpiecesConfig>): Promise<MasterpiecesConfig> {\n const configs = await this.db.select().from(comicUniverseConfigs).limit(1);\n\n if (configs.length === 0) {\n const newConfig = await this.db.insert(comicUniverseConfigs).values({\n siteName: configData.siteName || '画集展览',\n siteDescription: configData.siteDescription || '精美的艺术作品展览',\n heroTitle: configData.heroTitle || '艺术画集展览',\n heroSubtitle: configData.heroSubtitle || '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: configData.maxCollectionsPerPage || 9,\n enableSearch: configData.enableSearch ?? true,\n enableCategories: configData.enableCategories ?? true,\n homeTabConfig: normalizeHomeTabConfig(configData.homeTabConfig),\n defaultCategory: configData.defaultCategory || 'all',\n theme: configData.theme || 'light',\n language: configData.language || 'zh',\n updatedAt: new Date(),\n }).returning();\n\n return this.mapDbConfigToType(newConfig[0]);\n }\n\n const updateData: any = { updatedAt: new Date() };\n if (configData.siteName !== undefined) updateData.siteName = configData.siteName;\n if (configData.siteDescription !== undefined) updateData.siteDescription = configData.siteDescription;\n if (configData.heroTitle !== undefined) updateData.heroTitle = configData.heroTitle;\n if (configData.heroSubtitle !== undefined) updateData.heroSubtitle = configData.heroSubtitle;\n if (configData.maxCollectionsPerPage !== undefined) updateData.maxCollectionsPerPage = configData.maxCollectionsPerPage;\n if (configData.enableSearch !== undefined) updateData.enableSearch = configData.enableSearch;\n if (configData.enableCategories !== undefined) updateData.enableCategories = configData.enableCategories;\n if (configData.homeTabConfig !== undefined) updateData.homeTabConfig = normalizeHomeTabConfig(configData.homeTabConfig);\n if (configData.defaultCategory !== undefined) updateData.defaultCategory = configData.defaultCategory;\n if (configData.theme !== undefined) updateData.theme = configData.theme;\n if (configData.language !== undefined) updateData.language = configData.language;\n\n const updatedConfig = await this.db.update(comicUniverseConfigs)\n .set(updateData)\n .where(eq(comicUniverseConfigs.id, configs[0].id))\n .returning();\n\n return this.mapDbConfigToType(updatedConfig[0]);\n }\n\n async resetConfig(): Promise<MasterpiecesConfig> {\n await this.db.delete(comicUniverseConfigs);\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n\n private async createDefaultConfig() {\n const newConfig = await this.db.insert(comicUniverseConfigs).values({\n siteName: '画集展览',\n siteDescription: '精美的艺术作品展览',\n heroTitle: '艺术画集展览',\n heroSubtitle: '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: 9,\n enableSearch: true,\n enableCategories: true,\n homeTabConfig: buildDefaultHomeTabConfig(),\n defaultCategory: 'all',\n theme: 'light',\n language: 'zh',\n }).returning();\n\n return newConfig[0];\n }\n\n private mapDbConfigToType(dbConfig: any): MasterpiecesConfig {\n return {\n siteName: dbConfig.siteName,\n siteDescription: dbConfig.siteDescription,\n heroTitle: dbConfig.heroTitle,\n heroSubtitle: dbConfig.heroSubtitle,\n maxCollectionsPerPage: dbConfig.maxCollectionsPerPage,\n enableSearch: dbConfig.enableSearch,\n enableCategories: dbConfig.enableCategories,\n homeTabConfig: normalizeHomeTabConfig(dbConfig.homeTabConfig),\n defaultCategory: dbConfig.defaultCategory,\n theme: dbConfig.theme,\n language: dbConfig.language,\n };\n }\n}\n\nexport class CategoriesDbService {\n constructor(private readonly db: any) {}\n\n async getCategories(): Promise<Array<{ name: string; description?: string | null }>> {\n const conditions = [eq(comicUniverseCategories.isActive, true)];\n\n const categories = await this.db.select()\n .from(comicUniverseCategories)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseCategories.displayOrder), asc(comicUniverseCategories.name));\n\n return categories.map((cat: any) => ({\n name: cat.name,\n description: cat.description ?? null,\n }));\n }\n\n async createCategory(name: string, description?: string): Promise<void> {\n await this.db.insert(comicUniverseCategories).values({ name, description });\n }\n}\n\nexport class TagsDbService {\n constructor(private readonly db: any) {}\n\n async getTags(): Promise<string[]> {\n const conditions = [eq(comicUniverseTags.isActive, true)];\n\n const tags = await this.db.select()\n .from(comicUniverseTags)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseTags.name));\n\n return tags.map((tag: any) => tag.name);\n }\n\n async createTag(name: string, color?: string): Promise<void> {\n await this.db.insert(comicUniverseTags).values({\n name,\n color: color || '#3b82f6',\n });\n }\n}\n\nexport function createMasterpiecesConfigDbService(db: any): MasterpiecesConfigDbService {\n return new MasterpiecesConfigDbService(db);\n}\n\nexport function createCategoriesDbService(db: any): CategoriesDbService {\n return new CategoriesDbService(db);\n}\n\nexport function createTagsDbService(db: any): TagsDbService {\n return new TagsDbService(db);\n}\n","// @ts-nocheck\nlet db: any;\nlet fileUrlResolver: ((fileId: string) => Promise<string | null | undefined>) | undefined;\n\nexport function initializeShowmasterpieceDb(\n database: any,\n resolver?: (fileId: string) => Promise<string | null | undefined>,\n): void {\n db = database;\n fileUrlResolver = resolver;\n (globalThis as any).__sa2kitShowmasterpieceResolveFileUrl = resolver;\n}\n\nimport { \n comicUniverseConfigs,\n comicUniverseCategories,\n comicUniverseTags,\n comicUniverseCollections,\n comicUniverseCollectionTags,\n comicUniverseArtworks\n} from '../schema/masterpieces';\nimport { eq, desc, asc, and, sql, inArray } from 'drizzle-orm';\nimport { buildDefaultHomeTabConfig, normalizeHomeTabConfig } from '../../types';\n\ninterface MasterpiecesConfig {\n siteName: string;\n siteDescription?: string;\n heroTitle: string;\n heroSubtitle?: string;\n maxCollectionsPerPage: number;\n enableSearch: boolean;\n enableCategories: boolean;\n homeTabConfig: any[];\n defaultCategory: string;\n theme: 'light' | 'dark' | 'auto';\n language: 'zh' | 'en';\n}\n\ntype CollectionCategoryType = string;\n\ninterface ArtworkPage {\n id: number;\n title: string;\n number: string;\n image: string;\n fileId?: string;\n description: string;\n createdTime?: string;\n theme?: string;\n pageOrder: number;\n}\n\ninterface ArtCollection {\n id: number;\n title: string;\n number: string;\n coverImage: string;\n coverImageFileId?: string;\n description: string;\n pages: ArtworkPage[];\n category: CollectionCategoryType;\n tags?: string[];\n isPublished?: boolean;\n price?: number;\n}\n\ninterface CollectionFormData {\n title: string;\n number: string;\n coverImage: string;\n coverImageFileId?: string;\n description: string;\n category: CollectionCategoryType;\n tags: string[];\n isPublished: boolean;\n price?: number;\n}\n\ninterface ArtworkFormData {\n title: string;\n number: string;\n image?: string;\n fileId?: string;\n description: string;\n createdTime?: string;\n theme?: string;\n}\n\nasync function resolveFileUrlMap(fileIds: string[]): Promise<Map<string, string>> {\n const fileIdToUrlMap = new Map<string, string>();\n\n if (!fileUrlResolver || fileIds.length === 0) {\n return fileIdToUrlMap;\n }\n\n const results = await Promise.all(\n fileIds.map(async (fileId) => {\n try {\n const fileUrl = await fileUrlResolver!(fileId);\n return { fileId, url: fileUrl || null };\n } catch (error) {\n return { fileId, url: null };\n }\n }),\n );\n\n results.forEach((result) => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n\n return fileIdToUrlMap;\n}\n\n// 配置相关服务\nexport class MasterpiecesConfigDbService {\n // 获取配置\n async getConfig(): Promise<MasterpiecesConfig> {\n const configs = await db.select().from(comicUniverseConfigs).limit(1);\n \n if (configs.length === 0) {\n // 如果没有配置,创建默认配置\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n \n return this.mapDbConfigToType(configs[0]);\n }\n\n // 更新配置\n async updateConfig(configData: Partial<MasterpiecesConfig>): Promise<MasterpiecesConfig> {\n const configs = await db.select().from(comicUniverseConfigs).limit(1);\n \n if (configs.length === 0) {\n // 如果没有配置,创建新配置\n const newConfig = await db.insert(comicUniverseConfigs).values({\n siteName: configData.siteName || '画集展览',\n siteDescription: configData.siteDescription || '精美的艺术作品展览',\n heroTitle: configData.heroTitle || '艺术画集展览',\n heroSubtitle: configData.heroSubtitle || '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: configData.maxCollectionsPerPage || 9,\n enableSearch: configData.enableSearch ?? true,\n enableCategories: configData.enableCategories ?? true,\n homeTabConfig: normalizeHomeTabConfig(configData.homeTabConfig),\n defaultCategory: configData.defaultCategory || 'all',\n theme: configData.theme || 'light',\n language: configData.language || 'zh',\n updatedAt: new Date(),\n }).returning();\n \n return this.mapDbConfigToType(newConfig[0]);\n } else {\n // 更新现有配置\n const updateData: any = {\n updatedAt: new Date(),\n };\n \n // 只更新提供的字段\n if (configData.siteName !== undefined) updateData.siteName = configData.siteName;\n if (configData.siteDescription !== undefined) updateData.siteDescription = configData.siteDescription;\n if (configData.heroTitle !== undefined) updateData.heroTitle = configData.heroTitle;\n if (configData.heroSubtitle !== undefined) updateData.heroSubtitle = configData.heroSubtitle;\n if (configData.maxCollectionsPerPage !== undefined) updateData.maxCollectionsPerPage = configData.maxCollectionsPerPage;\n if (configData.enableSearch !== undefined) updateData.enableSearch = configData.enableSearch;\n if (configData.enableCategories !== undefined) updateData.enableCategories = configData.enableCategories;\n if (configData.homeTabConfig !== undefined) updateData.homeTabConfig = normalizeHomeTabConfig(configData.homeTabConfig);\n if (configData.defaultCategory !== undefined) updateData.defaultCategory = configData.defaultCategory;\n if (configData.theme !== undefined) updateData.theme = configData.theme;\n if (configData.language !== undefined) updateData.language = configData.language;\n\n const updatedConfig = await db.update(comicUniverseConfigs)\n .set(updateData)\n .where(eq(comicUniverseConfigs.id, configs[0].id))\n .returning();\n \n return this.mapDbConfigToType(updatedConfig[0]);\n }\n }\n\n // 重置为默认配置\n async resetConfig(): Promise<MasterpiecesConfig> {\n await db.delete(comicUniverseConfigs);\n const defaultConfig = await this.createDefaultConfig();\n return this.mapDbConfigToType(defaultConfig);\n }\n\n // 创建默认配置\n private async createDefaultConfig() {\n const newConfig = await db.insert(comicUniverseConfigs).values({\n siteName: '画集展览',\n siteDescription: '精美的艺术作品展览',\n heroTitle: '艺术画集展览',\n heroSubtitle: '探索精美的艺术作品,感受创作的魅力',\n maxCollectionsPerPage: 9,\n enableSearch: true,\n enableCategories: true,\n homeTabConfig: buildDefaultHomeTabConfig(),\n defaultCategory: 'all',\n theme: 'light',\n language: 'zh',\n }).returning();\n \n return newConfig[0];\n }\n\n // 映射数据库配置到类型\n private mapDbConfigToType(dbConfig: any): MasterpiecesConfig {\n return {\n siteName: dbConfig.siteName,\n siteDescription: dbConfig.siteDescription,\n heroTitle: dbConfig.heroTitle,\n heroSubtitle: dbConfig.heroSubtitle,\n maxCollectionsPerPage: dbConfig.maxCollectionsPerPage,\n enableSearch: dbConfig.enableSearch,\n enableCategories: dbConfig.enableCategories,\n homeTabConfig: normalizeHomeTabConfig(dbConfig.homeTabConfig),\n defaultCategory: dbConfig.defaultCategory,\n theme: dbConfig.theme,\n language: dbConfig.language,\n };\n }\n}\n\n// 分类相关服务\nexport class CategoriesDbService {\n // 获取所有分类\n async getCategories(): Promise<Array<{ name: string; description?: string | null }>> {\n const conditions = [eq(comicUniverseCategories.isActive, true)];\n \n const categories = await db.select()\n .from(comicUniverseCategories)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseCategories.displayOrder), asc(comicUniverseCategories.name));\n \n console.log(`📊 [CategoriesDbService] 获取分类: 返回${categories.length}个分类`);\n return categories.map(cat => ({\n name: cat.name,\n description: cat.description ?? null,\n }));\n }\n\n // 创建分类\n async createCategory(name: string, description?: string): Promise<void> {\n await db.insert(comicUniverseCategories).values({\n name,\n description,\n });\n }\n}\n\n// 标签相关服务\nexport class TagsDbService {\n // 获取所有标签\n async getTags(): Promise<string[]> {\n const conditions = [eq(comicUniverseTags.isActive, true)];\n \n const tags = await db.select()\n .from(comicUniverseTags)\n .where(and(...conditions))\n .orderBy(asc(comicUniverseTags.name));\n \n console.log(`📊 [TagsDbService] 获取标签: 返回${tags.length}个标签`);\n return tags.map(tag => tag.name);\n }\n\n // 创建标签\n async createTag(name: string, color?: string): Promise<void> {\n await db.insert(comicUniverseTags).values({\n name,\n color: color || '#3b82f6',\n });\n }\n}\n\n// 画集相关服务\nexport class CollectionsDbService {\n // 缓存配置 - 多层缓存策略\n private collectionsCache: ArtCollection[] | null = null;\n private collectionsCacheTime: number = 0;\n private collectionsOverviewCache: Omit<ArtCollection, 'pages'>[] | null = null;\n private collectionsOverviewCacheTime: number = 0;\n \n // 优化缓存时间配置\n private readonly CACHE_DURATION = 10 * 60 * 1000; // 延长到10分钟\n private readonly OVERVIEW_CACHE_DURATION = 15 * 60 * 1000; // 概览缓存15分钟\n private readonly STALE_WHILE_REVALIDATE = 30 * 60 * 1000; // 过期后30分钟内可用\n\n /**\n * 获取所有画集 - 优化版本\n * \n * 性能问题分析:\n * 1. 复杂的多表关联查询 - 涉及5个表的数据整合\n * 2. 作品数据量大 - 包含所有作品的完整信息(特别是图片数据)\n * 3. N+1查询风险 - 虽然使用并行查询,但仍有优化空间\n * 4. 缓存策略有限 - 2分钟缓存时间较短,首次访问必须全量查询\n * \n * 优化策略:\n * ✅ 并行查询 - 分类、标签、作品数据并行获取\n * ✅ 内存缓存 - 减少重复查询\n * ✅ 字段选择 - 只查询必要字段\n * ✅ 延长缓存时间 - 从2分钟增加到10分钟\n * ⚠️ 需要优化 - 数据库索引、分页加载、图片懒加载\n */\n async getAllCollections(useCache: boolean = true): Promise<ArtCollection[]> {\n // 检查缓存 - 首次访问时缓存为空,必须执行完整查询\n if (useCache && this.collectionsCache) {\n const cacheAge = Date.now() - this.collectionsCacheTime;\n \n // 如果在有效期内,直接返回缓存\n if (cacheAge < this.CACHE_DURATION) {\n return this.collectionsCache;\n }\n \n // 如果在stale-while-revalidate期内,返回缓存但异步更新\n if (cacheAge < this.STALE_WHILE_REVALIDATE) {\n // 异步更新缓存,不阻塞当前请求\n this.refreshCacheInBackground();\n return this.collectionsCache;\n }\n }\n\n try {\n // 执行完整查询\n const result = await this.fetchAllCollectionsFromDb();\n \n // 更新缓存\n this.collectionsCache = result;\n this.collectionsCacheTime = Date.now();\n\n return result;\n\n } catch (error) {\n console.error('获取画集数据失败:', error);\n \n // 如果查询失败但有过期缓存,返回过期缓存\n if (this.collectionsCache) {\n console.warn('数据库查询失败,返回过期缓存数据');\n return this.collectionsCache;\n }\n \n throw error;\n }\n }\n\n /**\n * 获取画集概览 - 不包含作品详情的轻量版本\n * 适用于首页列表、搜索结果等场景\n */\n async getCollectionsOverview(): Promise<Omit<ArtCollection, 'pages'>[]> {\n // 检查概览缓存\n if (this.collectionsOverviewCache) {\n const cacheAge = Date.now() - this.collectionsOverviewCacheTime;\n \n if (cacheAge < this.OVERVIEW_CACHE_DURATION) {\n return this.collectionsOverviewCache;\n }\n \n // stale-while-revalidate策略\n if (cacheAge < this.STALE_WHILE_REVALIDATE) {\n this.refreshOverviewCacheInBackground();\n return this.collectionsOverviewCache;\n }\n }\n\n try {\n const result = await this.fetchCollectionsOverviewFromDb();\n \n // 更新缓存\n this.collectionsOverviewCache = result;\n this.collectionsOverviewCacheTime = Date.now();\n\n return result;\n\n } catch (error) {\n console.error('获取画集概览失败:', error);\n \n // 降级策略:返回过期缓存\n if (this.collectionsOverviewCache) {\n console.warn('数据库查询失败,返回过期缓存数据');\n return this.collectionsOverviewCache;\n }\n \n throw error;\n }\n }\n\n /**\n * 后台异步刷新完整缓存\n */\n private async refreshCacheInBackground(): Promise<void> {\n try {\n const result = await this.fetchAllCollectionsFromDb();\n this.collectionsCache = result;\n this.collectionsCacheTime = Date.now();\n console.log('缓存已在后台更新');\n } catch (error) {\n console.error('后台缓存更新失败:', error);\n }\n }\n\n /**\n * 后台异步刷新概览缓存\n */\n private async refreshOverviewCacheInBackground(): Promise<void> {\n try {\n const result = await this.fetchCollectionsOverviewFromDb();\n this.collectionsOverviewCache = result;\n this.collectionsOverviewCacheTime = Date.now();\n console.log('概览缓存已在后台更新');\n } catch (error) {\n console.error('后台概览缓存更新失败:', error);\n }\n }\n\n /**\n * 从数据库获取完整画集数据\n * 优化版本:不再返回Base64图片数据,只返回fileId和imageUrl\n */\n private async fetchAllCollectionsFromDb(): Promise<ArtCollection[]> {\n try {\n // 1. 获取画集基本信息\n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n number: comicUniverseCollections.number,\n coverImage: comicUniverseCollections.coverImage,\n coverImageFileId: comicUniverseCollections.coverImageFileId, // 新增:封面图片文件ID\n description: comicUniverseCollections.description,\n isPublished: comicUniverseCollections.isPublished,\n displayOrder: comicUniverseCollections.displayOrder,\n price: comicUniverseCollections.price,\n createdAt: comicUniverseCollections.createdAt,\n categoryId: comicUniverseCollections.categoryId,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt)\n );\n\n if (collections.length === 0) {\n return [];\n }\n\n const collectionIds = collections.map(c => c.id);\n\n // 2. 并行获取分类、标签和作品数据\n const [categories, tags, artworks] = await Promise.all([\n // 获取分类信息\n db\n .select({\n id: comicUniverseCategories.id,\n name: comicUniverseCategories.name,\n })\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.isActive, true)),\n\n // 获取标签信息\n db\n .select({\n collectionId: comicUniverseCollectionTags.collectionId,\n tagName: comicUniverseTags.name,\n })\n .from(comicUniverseCollectionTags)\n .innerJoin(\n comicUniverseTags,\n eq(comicUniverseCollectionTags.tagId, comicUniverseTags.id)\n )\n .where(\n and(\n inArray(comicUniverseCollectionTags.collectionId, collectionIds),\n eq(comicUniverseTags.isActive, true)\n )\n ),\n\n // 获取作品数据(只查询fileId,不查询Base64图片)\n db\n .select({\n collectionId: comicUniverseArtworks.collectionId,\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n number: comicUniverseArtworks.number,\n fileId: comicUniverseArtworks.fileId, // 只查询fileId,不查询Base64图片\n description: comicUniverseArtworks.description,\n createdTime: comicUniverseArtworks.createdTime,\n theme: comicUniverseArtworks.theme,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(\n and(\n inArray(comicUniverseArtworks.collectionId, collectionIds),\n eq(comicUniverseArtworks.isActive, true)\n )\n )\n .orderBy(asc(comicUniverseArtworks.pageOrder))\n ]);\n\n // 3. 构建映射表\n const categoriesMap = new Map(categories.map(cat => [cat.id, cat.name]));\n \n const tagsMap = new Map<number, string[]>();\n tags.forEach(tag => {\n if (!tagsMap.has(tag.collectionId)) {\n tagsMap.set(tag.collectionId, []);\n }\n tagsMap.get(tag.collectionId)!.push(tag.tagName);\n });\n\n // 4. 批量获取文件URL(包括封面图片)\n const fileIdToUrlMap = new Map<string, string>();\n const allFileIds = [\n ...collections.filter(c => c.coverImageFileId).map(c => c.coverImageFileId!),\n ...artworks.filter(a => a.fileId).map(a => a.fileId!)\n ];\n \n if (allFileIds.length > 0) {\n try {\n // 使用ShowMasterpiece的独立文件服务配置\n const { getShowMasterpieceFileConfig } = await import('../services/fileService');\n const configManager = await getShowMasterpieceFileConfig();\n const { UniversalFileService } = await import('../../../universalFile/server/UniversalFileService');\n \n const fileService = new UniversalFileService(configManager.getConfig());\n await fileService.initialize();\n \n // 并行获取所有文件URL\n const urlPromises = allFileIds.map(async (fileId) => {\n try {\n const fileUrl = await fileService.getFileUrl(fileId);\n return { fileId, url: fileUrl };\n } catch (error) {\n console.warn(`⚠️ 获取文件URL失败: ${fileId}`, error);\n return { fileId, url: null };\n }\n });\n \n const urlResults = await Promise.all(urlPromises);\n urlResults.forEach(result => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n } catch (error) {\n console.warn('⚠️ 批量获取文件URL失败:', error);\n }\n }\n\n // 5. 构建作品映射表\n const artworksMap = new Map<number, ArtworkPage[]>();\n \n artworks.forEach(artwork => {\n if (!artworksMap.has(artwork.collectionId)) {\n artworksMap.set(artwork.collectionId, []);\n }\n \n // 创建基础作品对象,优先使用OSS URL,回退到API路径\n let imageUrl: string;\n if (artwork.fileId && fileIdToUrlMap.has(artwork.fileId)) {\n imageUrl = fileIdToUrlMap.get(artwork.fileId)!;\n } else {\n // 如果没有fileId或获取URL失败,使用API路径\n imageUrl = `/api/showmasterpiece/collections/${artwork.collectionId}/artworks/${artwork.id}/image`;\n }\n \n const artworkPage: ArtworkPage = {\n id: artwork.id,\n title: artwork.title || '',\n number: artwork.number || '',\n image: imageUrl, // 使用处理后的图片URL\n fileId: artwork.fileId || undefined, // 添加fileId支持\n description: artwork.description || '',\n createdTime: artwork.createdTime || '',\n theme: artwork.theme || '',\n pageOrder: artwork.pageOrder || 0, // 添加pageOrder字段\n };\n \n artworksMap.get(artwork.collectionId)!.push(artworkPage);\n });\n\n // 6. 构建最终结果\n return collections.map(collection => {\n // 处理封面图片URL\n let coverImageUrl: string;\n if (collection.coverImageFileId && fileIdToUrlMap.has(collection.coverImageFileId)) {\n // 优先使用OSS URL\n coverImageUrl = fileIdToUrlMap.get(collection.coverImageFileId)!;\n console.log(`🔗 [CollectionsDbService] 使用OSS URL: ${coverImageUrl}`);\n } else if (collection.coverImage) {\n // 回退到原始路径\n coverImageUrl = collection.coverImage;\n console.log(`🔗 [CollectionsDbService] 使用原始路径: ${coverImageUrl}`);\n } else {\n // 没有封面图片\n coverImageUrl = '';\n console.log(`🔗 [CollectionsDbService] 无封面图片`);\n }\n\n return {\n id: collection.id,\n title: collection.title,\n number: collection.number,\n coverImage: coverImageUrl, // ✅ 使用处理后的URL\n coverImageFileId: collection.coverImageFileId || undefined,\n description: collection.description || '',\n category: collection.categoryId ? (categoriesMap.get(collection.categoryId) || '画集') as CollectionCategoryType : '画集' as CollectionCategoryType,\n tags: tagsMap.get(collection.id) || [],\n isPublished: collection.isPublished,\n price: collection.price || undefined,\n pages: artworksMap.get(collection.id) || [], // 🚀 作品数据精简,大幅减少传输量\n };\n });\n } catch (error) {\n console.error('获取画集列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 从数据库获取画集概览数据\n */\n private async fetchCollectionsOverviewFromDb(): Promise<Omit<ArtCollection, 'pages'>[]> {\n try {\n // 1. 获取画集基本信息\n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n number: comicUniverseCollections.number,\n coverImage: comicUniverseCollections.coverImage,\n coverImageFileId: comicUniverseCollections.coverImageFileId, // 新增:封面图片文件ID\n description: comicUniverseCollections.description,\n isPublished: comicUniverseCollections.isPublished,\n displayOrder: comicUniverseCollections.displayOrder,\n price: comicUniverseCollections.price,\n createdAt: comicUniverseCollections.createdAt,\n categoryId: comicUniverseCollections.categoryId,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt)\n );\n\n if (collections.length === 0) {\n return [];\n }\n\n const collectionIds = collections.map(c => c.id);\n\n // 2. 并行获取分类、标签和作品数量\n const [categories, tags, artworkCounts] = await Promise.all([\n // 获取分类信息\n db\n .select({\n id: comicUniverseCategories.id,\n name: comicUniverseCategories.name,\n })\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.isActive, true)),\n\n // 获取标签信息\n db\n .select({\n collectionId: comicUniverseCollectionTags.collectionId,\n tagName: comicUniverseTags.name,\n })\n .from(comicUniverseCollectionTags)\n .innerJoin(\n comicUniverseTags,\n eq(comicUniverseCollectionTags.tagId, comicUniverseTags.id)\n )\n .where(\n and(\n inArray(comicUniverseCollectionTags.collectionId, collectionIds),\n eq(comicUniverseTags.isActive, true)\n )\n ),\n\n // 获取作品数量(而不是具体作品)\n db\n .select({\n collectionId: comicUniverseArtworks.collectionId,\n count: sql<number>`count(*)`.as('count'),\n })\n .from(comicUniverseArtworks)\n .where(\n and(\n inArray(comicUniverseArtworks.collectionId, collectionIds),\n eq(comicUniverseArtworks.isActive, true)\n )\n )\n .groupBy(comicUniverseArtworks.collectionId)\n ]);\n\n // 3. 构建映射表\n const categoriesMap = new Map(categories.map(cat => [cat.id, cat.name]));\n \n const tagsMap = new Map<number, string[]>();\n tags.forEach(tag => {\n if (!tagsMap.has(tag.collectionId)) {\n tagsMap.set(tag.collectionId, []);\n }\n tagsMap.get(tag.collectionId)!.push(tag.tagName);\n });\n\n const artworkCountsMap = new Map(artworkCounts.map(ac => [ac.collectionId, ac.count]));\n\n // 4. 批量获取封面图片URL\n const fileIdToUrlMap = new Map<string, string>();\n const coverImageFileIds = collections.filter(c => c.coverImageFileId).map(c => c.coverImageFileId!);\n \n if (coverImageFileIds.length > 0) {\n try {\n // 使用ShowMasterpiece的独立文件服务配置\n const { getShowMasterpieceFileConfig } = await import('../services/fileService');\n const configManager = await getShowMasterpieceFileConfig();\n const { UniversalFileService } = await import('../../../universalFile/server/UniversalFileService');\n \n const fileService = new UniversalFileService(configManager.getConfig());\n await fileService.initialize();\n \n // 并行获取所有封面图片URL\n const urlPromises = coverImageFileIds.map(async (fileId) => {\n try {\n const fileUrl = await fileService.getFileUrl(fileId);\n return { fileId, url: fileUrl };\n } catch (error) {\n console.warn(`⚠️ [CollectionsDbService] 获取封面图片URL失败: ${fileId}`, error);\n return { fileId, url: null };\n }\n });\n \n const urlResults = await Promise.all(urlPromises);\n urlResults.forEach(result => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n } catch (error) {\n console.warn('⚠️ [CollectionsDbService] 批量获取封面图片URL失败:', error);\n }\n }\n\n // 5. 构建结果(包含作品数量而不是具体作品)\n return collections.map(collection => {\n // 处理封面图片URL,优先使用OSS URL,回退到原始路径\n let coverImageUrl: string;\n if (collection.coverImageFileId && fileIdToUrlMap.has(collection.coverImageFileId)) {\n coverImageUrl = fileIdToUrlMap.get(collection.coverImageFileId)!;\n } else {\n // 如果没有fileId或获取URL失败,使用原始路径\n coverImageUrl = collection.coverImage || '';\n }\n console.log(`🔗 [CollectionsDbService] 1封面图片URL: ${coverImageUrl}`);\n\n return {\n id: collection.id,\n title: collection.title,\n number: collection.number,\n coverImage: coverImageUrl, // 使用处理后的封面图片URL\n coverImageFileId: collection.coverImageFileId || undefined, // 新增:封面图片文件ID\n description: collection.description || '',\n category: collection.categoryId ? (categoriesMap.get(collection.categoryId) || '画集') as CollectionCategoryType : '画集' as CollectionCategoryType,\n tags: tagsMap.get(collection.id) || [],\n isPublished: collection.isPublished,\n price: collection.price || undefined,\n artworkCount: artworkCountsMap.get(collection.id) || 0,\n };\n });\n\n } catch (error) {\n console.error('获取画集概览失败:', error);\n throw error;\n }\n }\n\n // 清除缓存的方法\n clearCache(): void {\n this.collectionsCache = null;\n this.collectionsCacheTime = 0;\n this.collectionsOverviewCache = null;\n this.collectionsOverviewCacheTime = 0;\n }\n\n // 创建画集\n async createCollection(collectionData: CollectionFormData): Promise<ArtCollection> {\n // 获取或创建分类\n let categoryId: number | null = null;\n if (collectionData.category) {\n const existingCategory = await db.select()\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.name, collectionData.category))\n .limit(1);\n \n if (existingCategory.length > 0) {\n categoryId = existingCategory[0].id;\n } else {\n const newCategory = await db.insert(comicUniverseCategories).values({\n name: collectionData.category,\n }).returning();\n categoryId = newCategory[0].id;\n }\n }\n\n // 创建画集\n const newCollection = await db.insert(comicUniverseCollections).values({\n title: collectionData.title,\n number: collectionData.number,\n coverImage: collectionData.coverImage,\n coverImageFileId: collectionData.coverImageFileId || null,\n description: collectionData.description,\n categoryId,\n isPublished: collectionData.isPublished,\n publishedAt: collectionData.isPublished ? new Date() : null,\n price: collectionData.price || null,\n }).returning();\n\n // 处理标签\n if (collectionData.tags && collectionData.tags.length > 0) {\n await this.updateCollectionTags(newCollection[0].id, collectionData.tags);\n }\n\n // 清除缓存\n this.clearCache();\n\n // 返回完整的画集数据\n const collections = await this.getAllCollections(false); // 强制重新查询\n const filterCollection = collections.filter(c => c.id === newCollection[0].id);\n console.log('🎨 [createCollection] 创建画集成功:', filterCollection);\n return filterCollection[0];\n }\n\n // 更新画集\n async updateCollection(id: number, collectionData: CollectionFormData): Promise<ArtCollection> {\n // 获取或创建分类\n let categoryId: number | null = null;\n if (collectionData.category) {\n const existingCategory = await db.select()\n .from(comicUniverseCategories)\n .where(eq(comicUniverseCategories.name, collectionData.category))\n .limit(1);\n \n if (existingCategory.length > 0) {\n categoryId = existingCategory[0].id;\n } else {\n const newCategory = await db.insert(comicUniverseCategories).values({\n name: collectionData.category,\n }).returning();\n categoryId = newCategory[0].id;\n }\n }\n\n // 更新画集\n await db.update(comicUniverseCollections)\n .set({\n title: collectionData.title,\n number: collectionData.number,\n coverImage: collectionData.coverImage,\n coverImageFileId: collectionData.coverImageFileId || null,\n description: collectionData.description,\n categoryId,\n isPublished: collectionData.isPublished,\n publishedAt: collectionData.isPublished ? new Date() : null,\n price: collectionData.price || null,\n updatedAt: new Date(),\n })\n .where(eq(comicUniverseCollections.id, id));\n\n // 更新标签\n await this.updateCollectionTags(id, collectionData.tags || []);\n\n // 清除缓存\n this.clearCache();\n\n // 返回更新后的画集数据\n const collections = await this.getAllCollections(false); // 强制重新查询\n return collections.find(c => c.id === id)!;\n }\n\n // 删除画集\n async deleteCollection(id: number): Promise<void> {\n // 首先验证画集存在性\n const collection = await db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.id, id))\n .limit(1);\n\n if (!collection.length) {\n throw new Error('画集不存在');\n }\n\n const collectionData = collection[0];\n\n console.log(`🗑️ [deleteCollection] 删除画集 ID:${id} \"${collectionData.title}\"`);\n\n // 执行删除(级联删除作品)\n await db.delete(comicUniverseCollections)\n .where(eq(comicUniverseCollections.id, id));\n \n // 清除缓存\n this.clearCache();\n }\n\n // 更新画集标签\n private async updateCollectionTags(collectionId: number, tagNames: string[]): Promise<void> {\n // 删除现有标签关联\n await db.delete(comicUniverseCollectionTags)\n .where(eq(comicUniverseCollectionTags.collectionId, collectionId));\n\n if (tagNames.length === 0) return;\n\n // 获取或创建标签\n const tagIds: number[] = [];\n for (const tagName of tagNames) {\n const existingTag = await db.select()\n .from(comicUniverseTags)\n .where(eq(comicUniverseTags.name, tagName))\n .limit(1);\n \n if (existingTag.length > 0) {\n tagIds.push(existingTag[0].id);\n } else {\n const newTag = await db.insert(comicUniverseTags).values({\n name: tagName,\n }).returning();\n tagIds.push(newTag[0].id);\n }\n }\n\n // 创建新的标签关联\n const tagRelations = tagIds.map(tagId => ({\n collectionId,\n tagId,\n }));\n\n await db.insert(comicUniverseCollectionTags).values(tagRelations);\n }\n\n // 更新画集显示顺序\n async updateCollectionOrder(collectionOrders: { id: number; displayOrder: number }[]): Promise<void> {\n try {\n // 使用事务批量更新显示顺序\n await db.transaction(async (tx) => {\n for (const { id, displayOrder } of collectionOrders) {\n await tx\n .update(comicUniverseCollections)\n .set({ \n displayOrder,\n updatedAt: new Date()\n })\n .where(eq(comicUniverseCollections.id, id));\n }\n });\n\n // 清除缓存\n this.clearCache();\n } catch (error) {\n console.error('更新画集顺序失败:', error);\n throw error;\n }\n }\n\n // 移动画集到指定位置\n async moveCollection(collectionId: number, targetOrder: number): Promise<void> {\n try {\n // 获取当前所有已发布的画集\n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n\n const normalized = await this.normalizeCollectionOrderIfNeeded(collections);\n const workingCollections = normalized ?? collections;\n\n // 找到要移动的画集\n const targetCollection = workingCollections.find(c => c.id === collectionId);\n if (!targetCollection) {\n throw new Error('画集不存在');\n }\n\n // 重新计算所有画集的显示顺序\n const sortedCollections = workingCollections.filter(c => c.id !== collectionId);\n sortedCollections.splice(targetOrder, 0, targetCollection);\n\n // 生成新的显示顺序,处理null值\n const updates = sortedCollections.map((collection, index) => ({\n id: collection.id,\n displayOrder: sortedCollections.length - index, // 从高到低排序\n }));\n\n await this.updateCollectionOrder(updates);\n } catch (error) {\n console.error('移动画集失败:', error);\n throw error;\n }\n }\n\n // 上移画集\n async moveCollectionUp(collectionId: number): Promise<void> {\n try {\n console.log('📊 [后端排序] 开始上移画集操作,collectionId:', collectionId);\n \n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n title: comicUniverseCollections.title,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n\n const normalized = await this.normalizeCollectionOrderIfNeeded(collections);\n const workingCollections = normalized ?? collections;\n\n console.log('📊 [后端排序] 当前数据库排序状态 (按displayOrder降序):', {\n totalCount: workingCollections.length,\n collections: workingCollections.map((c, i) => ({\n dbIndex: i,\n id: c.id,\n title: c.title,\n displayOrder: c.displayOrder,\n note: i === 0 ? '(数据库第一条/displayOrder最大)' : i === workingCollections.length - 1 ? '(数据库最后条/displayOrder最小)' : ''\n }))\n });\n\n const currentIndex = workingCollections.findIndex(c => c.id === collectionId);\n if (currentIndex === -1) {\n console.error('❌ [后端排序] 画集不存在');\n throw new Error('画集不存在');\n }\n if (currentIndex === 0) {\n console.error('❌ [后端排序] 画集已经在最顶部 (displayOrder最大值)');\n throw new Error('画集已经在最顶部');\n }\n\n console.log('📊 [后端排序] 上移操作详情:', {\n targetCollection: {\n id: workingCollections[currentIndex].id,\n title: workingCollections[currentIndex].title,\n currentDisplayOrder: workingCollections[currentIndex].displayOrder,\n currentDbIndex: currentIndex\n },\n willSwapWith: {\n id: workingCollections[currentIndex - 1].id,\n title: workingCollections[currentIndex - 1].title,\n currentDisplayOrder: workingCollections[currentIndex - 1].displayOrder,\n currentDbIndex: currentIndex - 1\n },\n semantics: '上移=交换displayOrder值,使目标画集获得更大的displayOrder值'\n });\n\n // 交换当前画集和上一个画集的顺序,处理null值\n const targetIndex = currentIndex - 1;\n const currentOrder = workingCollections[targetIndex].displayOrder ?? 0;\n const targetOrder = workingCollections[currentIndex].displayOrder ?? 0;\n \n const updates = [\n { id: workingCollections[currentIndex].id, displayOrder: currentOrder },\n { id: workingCollections[targetIndex].id, displayOrder: targetOrder }\n ];\n\n console.log('📊 [后端排序] 将执行的更新操作:', {\n updates,\n explanation: '目标画集将获得更大的displayOrder值,从而在列表中上移'\n });\n\n await this.updateCollectionOrder(updates);\n \n console.log('✅ [后端排序] 上移操作完成');\n } catch (error) {\n console.error('❌ [后端排序] 上移画集失败:', error);\n throw error;\n }\n }\n\n // 下移画集\n async moveCollectionDown(collectionId: number): Promise<void> {\n try {\n console.log('📊 [后端排序] 开始下移画集操作,collectionId:', collectionId);\n \n const collections = await db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n title: comicUniverseCollections.title,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n\n const normalized = await this.normalizeCollectionOrderIfNeeded(collections);\n const workingCollections = normalized ?? collections;\n\n console.log('📊 [后端排序] 当前数据库排序状态 (按displayOrder降序):', {\n totalCount: workingCollections.length,\n collections: workingCollections.map((c, i) => ({\n dbIndex: i,\n id: c.id,\n title: c.title,\n displayOrder: c.displayOrder,\n note: i === 0 ? '(数据库第一条/displayOrder最大)' : i === workingCollections.length - 1 ? '(数据库最后条/displayOrder最小)' : ''\n }))\n });\n\n const currentIndex = workingCollections.findIndex(c => c.id === collectionId);\n if (currentIndex === -1) {\n console.error('❌ [后端排序] 画集不存在');\n throw new Error('画集不存在');\n }\n if (currentIndex === workingCollections.length - 1) {\n console.error('❌ [后端排序] 画集已经在最底部 (displayOrder最小值)');\n throw new Error('画集已经在最底部');\n }\n\n console.log('📊 [后端排序] 下移操作详情:', {\n targetCollection: {\n id: workingCollections[currentIndex].id,\n title: workingCollections[currentIndex].title,\n currentDisplayOrder: workingCollections[currentIndex].displayOrder,\n currentDbIndex: currentIndex\n },\n willSwapWith: {\n id: workingCollections[currentIndex + 1].id,\n title: workingCollections[currentIndex + 1].title,\n currentDisplayOrder: workingCollections[currentIndex + 1].displayOrder,\n currentDbIndex: currentIndex + 1\n },\n semantics: '下移=交换displayOrder值,使目标画集获得更小的displayOrder值'\n });\n\n // 交换当前画集和下一个画集的顺序,处理null值\n const targetIndex = currentIndex + 1;\n const currentOrder = workingCollections[targetIndex].displayOrder ?? 0;\n const targetOrder = workingCollections[currentIndex].displayOrder ?? 0;\n \n const updates = [\n { id: workingCollections[currentIndex].id, displayOrder: currentOrder },\n { id: workingCollections[targetIndex].id, displayOrder: targetOrder }\n ];\n\n console.log('📊 [后端排序] 将执行的更新操作:', {\n updates,\n explanation: '目标画集将获得更小的displayOrder值,从而在列表中下移'\n });\n\n await this.updateCollectionOrder(updates);\n \n console.log('✅ [后端排序] 下移操作完成');\n } catch (error) {\n console.error('❌ [后端排序] 下移画集失败:', error);\n throw error;\n }\n }\n\n private async normalizeCollectionOrderIfNeeded(\n collections: Array<{ id: number; displayOrder: number | null; createdAt?: Date | null }>\n ): Promise<Array<{ id: number; displayOrder: number | null; createdAt?: Date | null }> | null> {\n if (collections.length <= 1) return null;\n\n const orders = collections.map((c) => c.displayOrder ?? 0);\n const uniqueOrders = new Set(orders);\n const hasDuplicates = uniqueOrders.size !== orders.length;\n const hasAllZero = uniqueOrders.size === 1 && orders[0] === 0;\n\n if (!hasDuplicates && !hasAllZero) return null;\n\n const updates = collections.map((collection, index) => ({\n id: collection.id,\n displayOrder: collections.length - index,\n }));\n\n await this.updateCollectionOrder(updates);\n\n return db\n .select({\n id: comicUniverseCollections.id,\n displayOrder: comicUniverseCollections.displayOrder,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.isPublished, true))\n .orderBy(\n desc(comicUniverseCollections.displayOrder),\n desc(comicUniverseCollections.createdAt),\n desc(comicUniverseCollections.id)\n );\n }\n}\n\n// 作品相关服务\nexport class ArtworksDbService {\n constructor(private collectionsService: CollectionsDbService) {}\n\n // 添加作品到画集\n async addArtworkToCollection(collectionId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> {\n console.log('🗃️ [数据库] 开始添加作品到画集:', {\n collectionId,\n title: artworkData.title,\n number: artworkData.number\n });\n \n // 获取当前画集中作品的最大顺序号\n const maxOrder = await db.select({\n maxOrder: sql<number>`COALESCE(MAX(${comicUniverseArtworks.pageOrder}), -1)`\n })\n .from(comicUniverseArtworks)\n .where(eq(comicUniverseArtworks.collectionId, collectionId));\n\n const newOrder = (maxOrder[0]?.maxOrder || -1) + 1;\n console.log('📊 [数据库] 计算新的页面顺序:', newOrder);\n\n // 准备插入数据 - 只支持通用文件服务\n const insertData: any = {\n collectionId,\n title: artworkData.title,\n number: artworkData.number,\n description: artworkData.description,\n createdTime: artworkData.createdTime,\n theme: artworkData.theme,\n pageOrder: newOrder,\n };\n\n // 必须提供fileId\n if (!artworkData.fileId) {\n throw new Error('必须提供文件ID,请先上传图片');\n }\n \n insertData.fileId = artworkData.fileId;\n insertData.migrationStatus = 'completed';\n console.log('📁 [数据库] 使用通用文件服务ID:', artworkData.fileId);\n\n const newArtwork = await db.insert(comicUniverseArtworks).values(insertData).returning();\n\n console.log('✅ [数据库] 作品插入成功:', {\n id: newArtwork[0].id,\n collectionId: newArtwork[0].collectionId,\n pageOrder: newArtwork[0].pageOrder,\n title: newArtwork[0].title,\n fileId: newArtwork[0].fileId,\n migrationStatus: newArtwork[0].migrationStatus\n });\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n console.log('🧹 [数据库] 缓存已清除');\n\n const result = {\n id: newArtwork[0].id,\n title: newArtwork[0].title,\n number: newArtwork[0].number,\n image: newArtwork[0].image || '',\n fileId: newArtwork[0].fileId || undefined,\n description: newArtwork[0].description || '',\n createdTime: newArtwork[0].createdTime || undefined,\n theme: newArtwork[0].theme || undefined,\n pageOrder: newArtwork[0].pageOrder || 0,\n };\n \n console.log('📤 [数据库] 返回作品数据:', result);\n return result;\n }\n\n // 更新作品\n async updateArtwork(collectionId: number, artworkId: number, artworkData: ArtworkFormData): Promise<ArtworkPage> {\n // 首先检查作品是否存在\n const existingArtwork = await db.select()\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ))\n .limit(1);\n\n if (existingArtwork.length === 0) {\n throw new Error(`作品不存在或不属于指定画集 (作品ID: ${artworkId}, 画集ID: ${collectionId})`);\n }\n\n // 准备更新数据 - 只支持通用文件服务\n const updateData: any = {\n title: artworkData.title,\n number: artworkData.number,\n description: artworkData.description,\n createdTime: artworkData.createdTime,\n theme: artworkData.theme,\n updatedAt: new Date(),\n };\n\n // 如果提供了新的fileId,则更新\n if (artworkData.fileId) {\n updateData.fileId = artworkData.fileId;\n updateData.migrationStatus = 'completed';\n // 清空旧的image字段\n updateData.image = null;\n console.log('📁 [数据库] 更新通用文件服务ID:', artworkData.fileId);\n }\n\n const updatedArtwork = await db.update(comicUniverseArtworks)\n .set(updateData)\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ))\n .returning();\n\n if (updatedArtwork.length === 0) {\n throw new Error('更新作品失败,未返回数据');\n }\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n\n return {\n id: updatedArtwork[0].id,\n title: updatedArtwork[0].title,\n number: updatedArtwork[0].number,\n image: updatedArtwork[0].image || '',\n fileId: updatedArtwork[0].fileId || undefined,\n description: updatedArtwork[0].description || '',\n createdTime: updatedArtwork[0].createdTime || '',\n theme: updatedArtwork[0].theme || '',\n pageOrder: updatedArtwork[0].pageOrder || 0,\n };\n }\n\n // 删除作品\n async deleteArtwork(collectionId: number, artworkId: number): Promise<void> {\n // 首先验证作品存在性\n const artworkWithCollection = await db\n .select({\n artworkId: comicUniverseArtworks.id,\n artworkTitle: comicUniverseArtworks.title,\n collectionId: comicUniverseCollections.id,\n collectionTitle: comicUniverseCollections.title,\n })\n .from(comicUniverseArtworks)\n .leftJoin(comicUniverseCollections, eq(comicUniverseArtworks.collectionId, comicUniverseCollections.id))\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ))\n .limit(1);\n\n if (!artworkWithCollection.length) {\n throw new Error('作品不存在或不属于指定画集');\n }\n\n const artwork = artworkWithCollection[0];\n\n console.log(`🗑️ [deleteArtwork] 删除作品 ID:${artworkId} \"${artwork.artworkTitle}\" 从画集 ID:${collectionId} \"${artwork.collectionTitle}\"`);\n\n // 执行删除\n await db.delete(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.id, artworkId),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ));\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n }\n\n // 更新作品显示顺序\n async updateArtworkOrder(collectionId: number, artworkOrders: { id: number; pageOrder: number }[]): Promise<void> {\n try {\n // 使用事务批量更新显示顺序\n await db.transaction(async (tx) => {\n for (const { id, pageOrder } of artworkOrders) {\n await tx\n .update(comicUniverseArtworks)\n .set({ \n pageOrder,\n updatedAt: new Date()\n })\n .where(and(\n eq(comicUniverseArtworks.id, id),\n eq(comicUniverseArtworks.collectionId, collectionId)\n ));\n }\n });\n\n // 清除画集缓存\n this.collectionsService.clearCache();\n } catch (error) {\n console.error('更新作品顺序失败:', error);\n throw error;\n }\n }\n\n // 移动作品到指定位置\n async moveArtwork(collectionId: number, artworkId: number, targetOrder: number): Promise<void> {\n try {\n // 获取当前画集中的所有作品\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n\n // 找到要移动的作品\n const targetArtwork = artworks.find(a => a.id === artworkId);\n if (!targetArtwork) {\n throw new Error('作品不存在');\n }\n\n // 确保目标位置在有效范围内\n if (targetOrder < 0 || targetOrder >= artworks.length) {\n throw new Error('目标位置无效');\n }\n\n // 重新计算所有作品的显示顺序\n const sortedArtworks = artworks.filter(a => a.id !== artworkId);\n sortedArtworks.splice(targetOrder, 0, targetArtwork);\n\n // 生成新的显示顺序\n const updates = sortedArtworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n\n await this.updateArtworkOrder(collectionId, updates);\n } catch (error) {\n console.error('移动作品失败:', error);\n throw error;\n }\n }\n\n // 上移作品\n async moveArtworkUp(collectionId: number, artworkId: number): Promise<void> {\n try {\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder), asc(comicUniverseArtworks.id)); // 添加id作为次要排序\n\n // 检查并修复重复的pageOrder\n const pageOrders = artworks.map(a => a.pageOrder);\n const hasDuplicates = pageOrders.length !== new Set(pageOrders).size;\n \n if (hasDuplicates || artworks.some(a => a.pageOrder === null)) {\n console.log('检测到重复pageOrder,先修复顺序...');\n \n // 重新分配连续的pageOrder\n const fixUpdates = artworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n \n await this.updateArtworkOrder(collectionId, fixUpdates);\n \n // 重新获取修复后的数据\n const fixedArtworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n \n // 使用修复后的数据继续操作\n artworks.splice(0, artworks.length, ...fixedArtworks);\n }\n\n const currentIndex = artworks.findIndex(a => a.id === artworkId);\n if (currentIndex === -1) {\n throw new Error('作品不存在');\n }\n if (currentIndex === 0) {\n throw new Error('作品已经在最前面');\n }\n\n // 交换当前作品和前一个作品的顺序\n const targetIndex = currentIndex - 1;\n const currentOrder = artworks[targetIndex].pageOrder;\n const targetOrder = artworks[currentIndex].pageOrder;\n \n const updates = [\n { id: artworks[currentIndex].id, pageOrder: currentOrder },\n { id: artworks[targetIndex].id, pageOrder: targetOrder }\n ];\n\n await this.updateArtworkOrder(collectionId, updates);\n } catch (error) {\n console.error('上移作品失败:', error);\n throw error;\n }\n }\n\n // 下移作品\n async moveArtworkDown(collectionId: number, artworkId: number): Promise<void> {\n try {\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder), asc(comicUniverseArtworks.id)); // 添加id作为次要排序\n\n // 检查并修复重复的pageOrder\n const pageOrders = artworks.map(a => a.pageOrder);\n const hasDuplicates = pageOrders.length !== new Set(pageOrders).size;\n \n if (hasDuplicates || artworks.some(a => a.pageOrder === null)) {\n console.log('检测到重复pageOrder,先修复顺序...');\n \n // 重新分配连续的pageOrder\n const fixUpdates = artworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n \n await this.updateArtworkOrder(collectionId, fixUpdates);\n \n // 重新获取修复后的数据\n const fixedArtworks = await db\n .select({\n id: comicUniverseArtworks.id,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n \n // 使用修复后的数据继续操作\n artworks.splice(0, artworks.length, ...fixedArtworks);\n }\n\n // 添加调试信息\n console.log('下移作品后端调试信息:', {\n collectionId,\n artworkId,\n totalArtworks: artworks.length,\n artworkOrders: artworks.map(a => ({ id: a.id, pageOrder: a.pageOrder }))\n });\n\n const currentIndex = artworks.findIndex(a => a.id === artworkId);\n if (currentIndex === -1) {\n throw new Error('作品不存在');\n }\n if (currentIndex === artworks.length - 1) {\n throw new Error('作品已经在最后面');\n }\n\n // 交换当前作品和后一个作品的顺序\n const targetIndex = currentIndex + 1;\n const currentOrder = artworks[targetIndex].pageOrder;\n const targetOrder = artworks[currentIndex].pageOrder;\n \n console.log('下移交换信息:', {\n currentIndex,\n targetIndex,\n currentOrder,\n targetOrder,\n currentArtworkId: artworks[currentIndex].id,\n targetArtworkId: artworks[targetIndex].id\n });\n \n const updates = [\n { id: artworks[currentIndex].id, pageOrder: currentOrder },\n { id: artworks[targetIndex].id, pageOrder: targetOrder }\n ];\n\n await this.updateArtworkOrder(collectionId, updates);\n } catch (error) {\n console.error('下移作品失败:', error);\n throw error;\n }\n }\n\n // 获取指定画集的所有作品(按顺序)\n async getArtworksByCollection(collectionId: number): Promise<(ArtworkPage & { pageOrder: number })[]> {\n try {\n const artworks = await db\n .select({\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n number: comicUniverseArtworks.number,\n fileId: comicUniverseArtworks.fileId, // 只查询fileId,不查询Base64图片\n description: comicUniverseArtworks.description,\n createdTime: comicUniverseArtworks.createdTime,\n theme: comicUniverseArtworks.theme,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder), asc(comicUniverseArtworks.id)); // 添加id作为次要排序\n\n // 检查是否有重复的pageOrder,如果有则修复\n const pageOrders = artworks.map(a => a.pageOrder);\n const hasDuplicates = pageOrders.length !== new Set(pageOrders).size;\n \n if (hasDuplicates || artworks.some(a => a.pageOrder === null)) {\n console.log('检测到重复或空的pageOrder,开始修复...');\n \n // 重新分配连续的pageOrder\n const updates = artworks.map((artwork, index) => ({\n id: artwork.id,\n pageOrder: index,\n }));\n \n await this.updateArtworkOrder(collectionId, updates);\n \n // 重新查询修复后的数据\n const fixedArtworks = await db\n .select({\n id: comicUniverseArtworks.id,\n title: comicUniverseArtworks.title,\n number: comicUniverseArtworks.number,\n fileId: comicUniverseArtworks.fileId, // 只查询fileId,不查询Base64图片\n description: comicUniverseArtworks.description,\n createdTime: comicUniverseArtworks.createdTime,\n theme: comicUniverseArtworks.theme,\n pageOrder: comicUniverseArtworks.pageOrder,\n })\n .from(comicUniverseArtworks)\n .where(and(\n eq(comicUniverseArtworks.collectionId, collectionId),\n eq(comicUniverseArtworks.isActive, true)\n ))\n .orderBy(asc(comicUniverseArtworks.pageOrder));\n \n return await this.buildArtworkPagesWithUrls(fixedArtworks, collectionId);\n }\n\n return await this.buildArtworkPagesWithUrls(artworks, collectionId);\n } catch (error) {\n console.error('获取作品列表失败:', error);\n throw error;\n }\n }\n\n // 构建作品页面数据,包含正确的图片URL\n private async buildArtworkPagesWithUrls(artworks: any[], collectionId: number): Promise<(ArtworkPage & { pageOrder: number })[]> {\n // 批量获取文件URL以提高性能\n const fileIdToUrlMap = new Map<string, string>();\n const artworksWithFileId = artworks.filter(artwork => artwork.fileId);\n \n if (artworksWithFileId.length > 0) {\n try {\n // 使用ShowMasterpiece的独立文件服务配置\n const { getShowMasterpieceFileConfig } = await import('../services/fileService');\n const configManager = await getShowMasterpieceFileConfig();\n const { UniversalFileService } = await import('../../../universalFile/server/UniversalFileService');\n \n const fileService = new UniversalFileService(configManager.getConfig());\n await fileService.initialize();\n \n // 并行获取所有文件URL\n const urlPromises = artworksWithFileId.map(async (artwork) => {\n try {\n const fileUrl = await fileService.getFileUrl(artwork.fileId);\n return { fileId: artwork.fileId, url: fileUrl };\n } catch (error) {\n console.warn(`⚠️ [ArtworksDbService] 获取文件URL失败: ${artwork.fileId}`, error);\n return { fileId: artwork.fileId, url: null };\n }\n });\n \n const urlResults = await Promise.all(urlPromises);\n urlResults.forEach(result => {\n if (result.url) {\n fileIdToUrlMap.set(result.fileId, result.url);\n }\n });\n } catch (error) {\n console.warn('⚠️ [ArtworksDbService] 批量获取文件URL失败:', error);\n }\n }\n \n return artworks.map(artwork => {\n // 构建图片URL,优先使用OSS URL,回退到API路径\n let imageUrl: string;\n if (artwork.fileId && fileIdToUrlMap.has(artwork.fileId)) {\n imageUrl = fileIdToUrlMap.get(artwork.fileId)!;\n } else {\n // 如果没有fileId或获取URL失败,使用API路径\n imageUrl = `/api/showmasterpiece/collections/${collectionId}/artworks/${artwork.id}/image`;\n }\n \n return {\n id: artwork.id,\n title: artwork.title,\n number: artwork.number,\n image: imageUrl, // 使用OSS URL或API路径\n fileId: artwork.fileId || undefined,\n description: artwork.description || '',\n createdTime: artwork.createdTime || '',\n theme: artwork.theme || '',\n pageOrder: artwork.pageOrder,\n };\n });\n }\n}\n\n// 导出服务实例\nexport const masterpiecesConfigDbService = new MasterpiecesConfigDbService();\nexport const categoriesDbService = new CategoriesDbService();\nexport const tagsDbService = new TagsDbService();\nexport const collectionsDbService = new CollectionsDbService();\nexport const artworksDbService = new ArtworksDbService(collectionsDbService); \n","import { and, asc, desc, eq, like, sql } from 'drizzle-orm';\nimport { comicUniverseBookings } from '../schema/bookings';\nimport { comicUniverseCollections } from '../schema/masterpieces';\n\nexport interface AdminBookingQueryInput {\n qqNumber?: string | null;\n phoneNumber?: string | null;\n status?: string | null;\n applyFiltersToStats?: boolean;\n}\n\nexport interface BookableCollectionsQueryInput {\n categoryId?: number;\n limit?: number;\n orderBy?: 'displayOrder' | 'createdAt' | 'title' | string;\n}\n\nexport interface BookingListQueryInput {\n collectionId?: number;\n qqNumber?: string;\n phoneNumber?: string;\n status?: string;\n page?: number;\n limit?: number;\n}\n\nexport class BookingQueryService {\n constructor(private readonly db: any) {}\n\n private buildAdminConditions(input: {\n qqNumber?: string | null;\n phoneNumber?: string | null;\n status?: string | null;\n }): any[] {\n const conditions: any[] = [];\n\n if (input.qqNumber) {\n conditions.push(like(comicUniverseBookings.qqNumber, `%${input.qqNumber}%`));\n }\n\n if (input.phoneNumber) {\n conditions.push(like(comicUniverseBookings.phoneNumber, `%${input.phoneNumber}%`));\n }\n\n if (input.status && input.status !== 'all') {\n conditions.push(eq(comicUniverseBookings.status, input.status));\n }\n\n return conditions;\n }\n\n private formatAdminBooking(booking: any): any {\n return {\n id: booking.id,\n collectionId: booking.collectionId,\n qqNumber: booking.qqNumber,\n phoneNumber: booking.phoneNumber,\n quantity: booking.quantity,\n status: booking.status,\n notes: booking.notes,\n pickupMethod: booking.pickupMethod,\n adminNotes: booking.adminNotes,\n createdAt: booking.createdAt instanceof Date ? booking.createdAt.toISOString() : booking.createdAt,\n updatedAt: booking.updatedAt instanceof Date ? booking.updatedAt.toISOString() : booking.updatedAt,\n confirmedAt: booking.confirmedAt instanceof Date ? booking.confirmedAt.toISOString() : booking.confirmedAt,\n completedAt: booking.completedAt instanceof Date ? booking.completedAt.toISOString() : booking.completedAt,\n cancelledAt: booking.cancelledAt instanceof Date ? booking.cancelledAt.toISOString() : booking.cancelledAt,\n collection: {\n id: booking.collectionId,\n title: booking.collectionTitle || '未知画集',\n number: booking.collectionNumber || '未知编号',\n coverImage: booking.collectionCoverImage || '',\n price: booking.collectionPrice || 0,\n },\n totalPrice: (booking.collectionPrice || 0) * booking.quantity,\n };\n }\n\n async getAdminBookings(input: AdminBookingQueryInput = {}): Promise<any> {\n const {\n qqNumber,\n phoneNumber,\n status,\n applyFiltersToStats = true,\n } = input;\n\n const conditions = this.buildAdminConditions({ qqNumber, phoneNumber, status });\n\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n collectionId: comicUniverseBookings.collectionId,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n quantity: comicUniverseBookings.quantity,\n status: comicUniverseBookings.status,\n notes: comicUniverseBookings.notes,\n pickupMethod: comicUniverseBookings.pickupMethod,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionCoverImage: comicUniverseCollections.coverImage,\n collectionPrice: comicUniverseCollections.price,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(comicUniverseBookings.createdAt));\n\n const baseStatsQuery = this.db\n .select({\n totalBookings: sql<number>`count(*)`,\n pendingBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'pending')`,\n confirmedBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'confirmed')`,\n completedBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'completed')`,\n cancelledBookings: sql<number>`count(*) filter (where ${comicUniverseBookings.status} = 'cancelled')`,\n totalQuantity: sql<number>`coalesce(sum(${comicUniverseBookings.quantity}), 0)`,\n totalRevenue: sql<number>`coalesce(sum(${comicUniverseBookings.quantity} * coalesce(${comicUniverseCollections.price}, 0)), 0)`,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id));\n\n const stats = applyFiltersToStats && conditions.length > 0\n ? await baseStatsQuery.where(and(...conditions))\n : await baseStatsQuery;\n\n return {\n bookings: bookings.map((booking: any) => this.formatAdminBooking(booking)),\n stats: {\n totalBookings: stats[0]?.totalBookings || 0,\n pendingBookings: stats[0]?.pendingBookings || 0,\n confirmedBookings: stats[0]?.confirmedBookings || 0,\n completedBookings: stats[0]?.completedBookings || 0,\n cancelledBookings: stats[0]?.cancelledBookings || 0,\n totalQuantity: stats[0]?.totalQuantity || 0,\n totalRevenue: stats[0]?.totalRevenue || 0,\n },\n };\n }\n\n async getBookableCollections(input: BookableCollectionsQueryInput = {}): Promise<any[]> {\n const conditions: any[] = [eq(comicUniverseCollections.isPublished, true)];\n\n if (input.categoryId) {\n conditions.push(eq(comicUniverseCollections.categoryId, input.categoryId));\n }\n\n let orderByClause: any;\n switch (input.orderBy) {\n case 'createdAt':\n orderByClause = desc(comicUniverseCollections.createdAt);\n break;\n case 'title':\n orderByClause = asc(comicUniverseCollections.title);\n break;\n case 'displayOrder':\n default:\n orderByClause = asc(comicUniverseCollections.displayOrder);\n break;\n }\n\n const limit = Math.min(100, Math.max(1, input.limit ?? 50));\n\n const collections = await this.db\n .select({\n id: comicUniverseCollections.id,\n title: comicUniverseCollections.title,\n number: comicUniverseCollections.number,\n coverImage: comicUniverseCollections.coverImage,\n price: comicUniverseCollections.price,\n description: comicUniverseCollections.description,\n displayOrder: comicUniverseCollections.displayOrder,\n createdAt: comicUniverseCollections.createdAt,\n })\n .from(comicUniverseCollections)\n .where(and(...conditions))\n .orderBy(orderByClause)\n .limit(limit);\n\n return collections.map((collection: any) => ({\n id: collection.id,\n title: collection.title,\n number: collection.number,\n coverImage: collection.coverImage,\n price: collection.price,\n description: collection.description,\n displayOrder: collection.displayOrder,\n createdAt: collection.createdAt?.toISOString(),\n }));\n }\n\n async exportBookingsCsv(): Promise<string> {\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n collectionId: comicUniverseBookings.collectionId,\n status: comicUniverseBookings.status,\n quantity: comicUniverseBookings.quantity,\n notes: comicUniverseBookings.notes,\n pickupMethod: comicUniverseBookings.pickupMethod,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionPrice: comicUniverseCollections.price,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .orderBy(comicUniverseBookings.createdAt);\n\n const headers = [\n '预订ID',\n 'QQ号',\n '手机号',\n '画集ID',\n '画集标题',\n '画集编号',\n '画集价格',\n '预订状态',\n '预订数量',\n '用户备注',\n '领取方式',\n '管理员备注',\n '创建时间',\n '更新时间',\n '确认时间',\n '完成时间',\n '取消时间',\n ];\n\n const statusMap: Record<string, string> = {\n pending: '待确认',\n confirmed: '已确认',\n completed: '已完成',\n cancelled: '已取消',\n };\n\n const formatTime = (value: string | Date | null | undefined): string => {\n if (!value) return '';\n return new Date(value).toLocaleString('zh-CN');\n };\n\n const rows = bookings.map((booking: any) => [\n booking.id,\n booking.qqNumber || '',\n booking.phoneNumber || '',\n booking.collectionId,\n booking.collectionTitle || '',\n booking.collectionNumber || '',\n booking.collectionPrice || '',\n statusMap[booking.status] || booking.status,\n booking.quantity,\n booking.notes || '',\n booking.pickupMethod || '',\n booking.adminNotes || '',\n formatTime(booking.createdAt),\n formatTime(booking.updatedAt),\n formatTime(booking.confirmedAt),\n formatTime(booking.completedAt),\n formatTime(booking.cancelledAt),\n ]);\n\n const BOM = '\\uFEFF';\n return (\n BOM +\n headers.join(',') +\n '\\n' +\n rows\n .map((row: any[]) =>\n row\n .map((cell: any) => {\n const cellStr = String(cell || '');\n if (cellStr.includes(',') || cellStr.includes('\"') || cellStr.includes('\\n')) {\n return `\"${cellStr.replace(/\"/g, '\"\"')}\"`;\n }\n return cellStr;\n })\n .join(','),\n )\n .join('\\n')\n );\n }\n\n async getBookingsList(input: BookingListQueryInput = {}): Promise<any> {\n const conditions: any[] = [];\n\n if (input.collectionId) {\n conditions.push(eq(comicUniverseBookings.collectionId, input.collectionId));\n }\n\n if (input.qqNumber) {\n conditions.push(like(comicUniverseBookings.qqNumber, `%${input.qqNumber}%`));\n }\n\n if (input.phoneNumber) {\n conditions.push(like(comicUniverseBookings.phoneNumber, `%${input.phoneNumber}%`));\n }\n\n if (input.status) {\n conditions.push(eq(comicUniverseBookings.status, input.status));\n }\n\n const page = Math.max(1, input.page || 1);\n const limit = Math.min(100, Math.max(1, input.limit || 20));\n const offset = (page - 1) * limit;\n\n const totalResult = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(comicUniverseBookings)\n .where(conditions.length > 0 ? and(...conditions) : undefined);\n\n const total = totalResult[0]?.count || 0;\n\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n collectionId: comicUniverseBookings.collectionId,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n quantity: comicUniverseBookings.quantity,\n status: comicUniverseBookings.status,\n notes: comicUniverseBookings.notes,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionCoverImage: comicUniverseCollections.coverImage,\n collectionPrice: comicUniverseCollections.price,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(desc(comicUniverseBookings.createdAt))\n .limit(limit)\n .offset(offset);\n\n return {\n bookings: bookings.map((booking: any) => ({\n id: booking.id,\n collectionId: booking.collectionId,\n qqNumber: booking.qqNumber,\n phoneNumber: booking.phoneNumber,\n quantity: booking.quantity,\n status: booking.status,\n notes: booking.notes,\n adminNotes: booking.adminNotes,\n createdAt: booking.createdAt?.toISOString(),\n updatedAt: booking.updatedAt?.toISOString(),\n confirmedAt: booking.confirmedAt?.toISOString(),\n completedAt: booking.completedAt?.toISOString(),\n cancelledAt: booking.cancelledAt?.toISOString(),\n collection: {\n id: booking.collectionId,\n title: booking.collectionTitle,\n number: booking.collectionNumber,\n coverImage: booking.collectionCoverImage,\n price: booking.collectionPrice,\n },\n })),\n total,\n page,\n limit,\n totalPages: Math.ceil(total / limit),\n };\n }\n\n async getBookingById(id: number): Promise<any | null> {\n const bookings = await this.db\n .select({\n id: comicUniverseBookings.id,\n collectionId: comicUniverseBookings.collectionId,\n qqNumber: comicUniverseBookings.qqNumber,\n phoneNumber: comicUniverseBookings.phoneNumber,\n quantity: comicUniverseBookings.quantity,\n status: comicUniverseBookings.status,\n notes: comicUniverseBookings.notes,\n adminNotes: comicUniverseBookings.adminNotes,\n createdAt: comicUniverseBookings.createdAt,\n updatedAt: comicUniverseBookings.updatedAt,\n confirmedAt: comicUniverseBookings.confirmedAt,\n completedAt: comicUniverseBookings.completedAt,\n cancelledAt: comicUniverseBookings.cancelledAt,\n collectionTitle: comicUniverseCollections.title,\n collectionNumber: comicUniverseCollections.number,\n collectionCoverImage: comicUniverseCollections.coverImage,\n collectionPrice: comicUniverseCollections.price,\n collectionDescription: comicUniverseCollections.description,\n })\n .from(comicUniverseBookings)\n .leftJoin(comicUniverseCollections, eq(comicUniverseBookings.collectionId, comicUniverseCollections.id))\n .where(eq(comicUniverseBookings.id, id))\n .limit(1);\n\n if (bookings.length === 0) {\n return null;\n }\n\n const booking = bookings[0];\n return {\n id: booking.id,\n collectionId: booking.collectionId,\n qqNumber: booking.qqNumber,\n phoneNumber: booking.phoneNumber,\n quantity: booking.quantity,\n status: booking.status,\n notes: booking.notes,\n adminNotes: booking.adminNotes,\n createdAt: booking.createdAt?.toISOString(),\n updatedAt: booking.updatedAt?.toISOString(),\n confirmedAt: booking.confirmedAt?.toISOString(),\n completedAt: booking.completedAt?.toISOString(),\n cancelledAt: booking.cancelledAt?.toISOString(),\n collection: {\n id: booking.collectionId,\n title: booking.collectionTitle,\n number: booking.collectionNumber,\n coverImage: booking.collectionCoverImage,\n price: booking.collectionPrice,\n description: booking.collectionDescription,\n },\n };\n }\n}\n\nexport function createBookingQueryService(db: any): BookingQueryService {\n return new BookingQueryService(db);\n}\n","import { and, eq } from 'drizzle-orm';\nimport { comicUniverseBookings } from '../schema/bookings';\nimport { comicUniverseCollections } from '../schema/masterpieces';\n\nexport type BookingCommandErrorCode =\n | 'INVALID_BOOKING_ID'\n | 'BOOKING_NOT_FOUND'\n | 'INVALID_PAYLOAD'\n | 'INVALID_PHONE'\n | 'INVALID_QQ'\n | 'INVALID_QUANTITY'\n | 'COLLECTION_NOT_FOUND'\n | 'INVALID_STATUS';\n\nexport class BookingCommandError extends Error {\n constructor(public readonly code: BookingCommandErrorCode, message: string) {\n super(message);\n this.name = 'BookingCommandError';\n }\n}\n\nexport class BookingCommandService {\n constructor(private readonly db: any) {}\n\n private async ensureBookingExists(id: number): Promise<void> {\n const existingBooking = await this.db\n .select({ id: comicUniverseBookings.id })\n .from(comicUniverseBookings)\n .where(eq(comicUniverseBookings.id, id))\n .limit(1);\n\n if (existingBooking.length === 0) {\n throw new BookingCommandError('BOOKING_NOT_FOUND', '预订不存在');\n }\n }\n\n private async ensureCollectionExists(collectionId: number): Promise<void> {\n const collection = await this.db\n .select({ id: comicUniverseCollections.id })\n .from(comicUniverseCollections)\n .where(eq(comicUniverseCollections.id, collectionId))\n .limit(1);\n\n if (collection.length === 0) {\n throw new BookingCommandError('COLLECTION_NOT_FOUND', '画集不存在');\n }\n }\n\n private validatePhone(phoneNumber: string): void {\n const phoneRegex = /^1[3-9]\\d{9}$/;\n if (!phoneRegex.test(phoneNumber)) {\n throw new BookingCommandError('INVALID_PHONE', '手机号格式不正确');\n }\n }\n\n private validateQq(qqNumber: string): void {\n const qqRegex = /^\\d{5,11}$/;\n if (!qqRegex.test(qqNumber)) {\n throw new BookingCommandError('INVALID_QQ', 'QQ号格式不正确');\n }\n }\n\n async createBooking(body: any): Promise<any> {\n if (!body.collectionId || !body.qqNumber || !body.phoneNumber || !body.quantity) {\n throw new BookingCommandError('INVALID_PAYLOAD', '缺少必要参数:画集ID、QQ号、手机号、预订数量');\n }\n\n this.validatePhone(body.phoneNumber);\n this.validateQq(body.qqNumber);\n\n if (body.quantity < 1) {\n throw new BookingCommandError('INVALID_QUANTITY', '预订数量必须大于0');\n }\n\n await this.ensureCollectionExists(body.collectionId);\n\n const existingBooking = await this.db\n .select({\n id: comicUniverseBookings.id,\n quantity: comicUniverseBookings.quantity,\n notes: comicUniverseBookings.notes,\n })\n .from(comicUniverseBookings)\n .where(\n and(\n eq(comicUniverseBookings.qqNumber, body.qqNumber),\n eq(comicUniverseBookings.phoneNumber, body.phoneNumber),\n eq(comicUniverseBookings.collectionId, body.collectionId),\n ),\n )\n .limit(1);\n\n let resultBooking;\n\n if (existingBooking.length > 0) {\n const existing = existingBooking[0];\n const newQuantity = existing.quantity + body.quantity;\n const combinedNotes = existing.notes\n ? `${existing.notes}; 新增预订: ${body.notes || '无备注'}`\n : body.notes || null;\n\n const [updatedBooking] = await this.db\n .update(comicUniverseBookings)\n .set({\n quantity: newQuantity,\n notes: combinedNotes,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(comicUniverseBookings.qqNumber, body.qqNumber),\n eq(comicUniverseBookings.phoneNumber, body.phoneNumber),\n eq(comicUniverseBookings.collectionId, body.collectionId),\n ),\n )\n .returning();\n\n resultBooking = updatedBooking;\n } else {\n const [newBooking] = await this.db\n .insert(comicUniverseBookings)\n .values({\n collectionId: body.collectionId,\n qqNumber: body.qqNumber,\n phoneNumber: body.phoneNumber,\n quantity: body.quantity,\n notes: body.notes || null,\n status: 'pending',\n })\n .returning();\n\n resultBooking = newBooking;\n }\n\n return {\n id: resultBooking.id,\n collectionId: resultBooking.collectionId,\n qqNumber: resultBooking.qqNumber,\n phoneNumber: resultBooking.phoneNumber,\n quantity: resultBooking.quantity,\n status: resultBooking.status,\n notes: resultBooking.notes,\n createdAt:\n resultBooking.createdAt instanceof Date\n ? resultBooking.createdAt.toISOString()\n : resultBooking.createdAt,\n updatedAt:\n resultBooking.updatedAt instanceof Date\n ? resultBooking.updatedAt.toISOString()\n : resultBooking.updatedAt,\n };\n }\n\n async batchCreateBookings(body: any): Promise<any> {\n const { qqNumber, phoneNumber, items, notes, pickupMethod } = body;\n\n if (!qqNumber || !phoneNumber || !Array.isArray(items) || items.length === 0) {\n throw new BookingCommandError('INVALID_PAYLOAD', '缺少必要参数:QQ号、手机号、预订项列表');\n }\n\n this.validateQq(qqNumber);\n this.validatePhone(phoneNumber);\n\n const bookingIds: number[] = [];\n const failures: { collectionId: number; reason: string }[] = [];\n let successCount = 0;\n let failCount = 0;\n\n for (const item of items) {\n try {\n if (!item.collectionId || !item.quantity) {\n failures.push({ collectionId: item.collectionId, reason: '缺少必要参数' });\n failCount++;\n continue;\n }\n\n if (item.quantity < 1) {\n failures.push({ collectionId: item.collectionId, reason: '预订数量必须大于0' });\n failCount++;\n continue;\n }\n\n await this.ensureCollectionExists(item.collectionId);\n\n const [newBooking] = await this.db\n .insert(comicUniverseBookings)\n .values({\n collectionId: item.collectionId,\n qqNumber,\n phoneNumber,\n quantity: item.quantity,\n notes: notes || null,\n pickupMethod: pickupMethod || null,\n status: 'pending',\n })\n .returning();\n\n bookingIds.push(newBooking.id);\n successCount++;\n } catch {\n failures.push({ collectionId: item.collectionId, reason: '创建预订失败' });\n failCount++;\n }\n }\n\n return {\n bookingIds,\n successCount,\n failCount,\n failures: failures.length > 0 ? failures : undefined,\n };\n }\n\n async updateBooking(id: number, body: any): Promise<any> {\n await this.ensureBookingExists(id);\n\n const updateData: any = {\n updatedAt: new Date(),\n };\n\n if (body.status) {\n updateData.status = body.status;\n switch (body.status) {\n case 'confirmed':\n updateData.confirmedAt = new Date();\n break;\n case 'completed':\n updateData.completedAt = new Date();\n break;\n case 'cancelled':\n updateData.cancelledAt = new Date();\n break;\n }\n }\n\n if (body.adminNotes !== undefined) {\n updateData.adminNotes = body.adminNotes;\n }\n\n const [updatedBooking] = await this.db\n .update(comicUniverseBookings)\n .set(updateData)\n .where(eq(comicUniverseBookings.id, id))\n .returning();\n\n return {\n id: updatedBooking.id,\n collectionId: updatedBooking.collectionId,\n qqNumber: updatedBooking.qqNumber,\n quantity: updatedBooking.quantity,\n status: updatedBooking.status,\n notes: updatedBooking.notes,\n adminNotes: updatedBooking.adminNotes,\n createdAt: updatedBooking.createdAt?.toISOString(),\n updatedAt: updatedBooking.updatedAt?.toISOString(),\n confirmedAt: updatedBooking.confirmedAt?.toISOString(),\n completedAt: updatedBooking.completedAt?.toISOString(),\n cancelledAt: updatedBooking.cancelledAt?.toISOString(),\n };\n }\n\n async updateBookingStatus(id: number, status: string, adminNotes?: string): Promise<any> {\n if (!status || !['pending', 'confirmed', 'completed', 'cancelled'].includes(status)) {\n throw new BookingCommandError('INVALID_STATUS', '无效的预订状态');\n }\n\n await this.ensureBookingExists(id);\n\n const updateData: any = {\n status,\n updatedAt: new Date(),\n };\n\n if (adminNotes !== undefined) {\n updateData.adminNotes = adminNotes;\n }\n\n switch (status) {\n case 'confirmed':\n updateData.confirmedAt = new Date();\n break;\n case 'completed':\n updateData.completedAt = new Date();\n break;\n case 'cancelled':\n updateData.cancelledAt = new Date();\n break;\n }\n\n const updatedBookings = await this.db\n .update(comicUniverseBookings)\n .set(updateData)\n .where(eq(comicUniverseBookings.id, id))\n .returning();\n\n return updatedBookings[0];\n }\n\n async deleteBooking(id: number): Promise<void> {\n await this.ensureBookingExists(id);\n await this.db.delete(comicUniverseBookings).where(eq(comicUniverseBookings.id, id));\n }\n}\n\nexport function createBookingCommandService(db: any): BookingCommandService {\n return new BookingCommandService(db);\n}\n"]}
|