sa2kit 1.6.78 → 1.6.80

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.
Files changed (107) hide show
  1. package/dist/ai/llm/electron/index.js +2 -2
  2. package/dist/ai/llm/electron/index.js.map +1 -1
  3. package/dist/ai/llm/electron/index.mjs +2 -2
  4. package/dist/ai/llm/electron/index.mjs.map +1 -1
  5. package/dist/ai/llm/ui/electron/index.js +2 -2
  6. package/dist/ai/llm/ui/electron/index.js.map +1 -1
  7. package/dist/ai/llm/ui/electron/index.mjs +2 -2
  8. package/dist/ai/llm/ui/electron/index.mjs.map +1 -1
  9. package/dist/ai/llm/ui/web/index.js +2 -2
  10. package/dist/ai/llm/ui/web/index.js.map +1 -1
  11. package/dist/ai/llm/ui/web/index.mjs +2 -2
  12. package/dist/ai/llm/ui/web/index.mjs.map +1 -1
  13. package/dist/ai/llm/web/index.js +2 -2
  14. package/dist/ai/llm/web/index.js.map +1 -1
  15. package/dist/ai/llm/web/index.mjs +2 -2
  16. package/dist/ai/llm/web/index.mjs.map +1 -1
  17. package/dist/ar/index.d.mts +2 -2
  18. package/dist/ar/index.d.ts +2 -2
  19. package/dist/ar/index.js +43 -4
  20. package/dist/ar/index.js.map +1 -1
  21. package/dist/ar/index.mjs +43 -4
  22. package/dist/ar/index.mjs.map +1 -1
  23. package/dist/{booking-BX_0AXU6.d.mts → booking-473Db8Bo.d.mts} +6 -0
  24. package/dist/{booking-BX_0AXU6.d.ts → booking-473Db8Bo.d.ts} +6 -0
  25. package/dist/{bookingAdminService-ChzuoCUx.d.ts → bookingAdminService-DqQ7hEGw.d.ts} +1 -1
  26. package/dist/{bookingAdminService-B_D_Jq1W.d.mts → bookingAdminService-SBX4JA_U.d.mts} +1 -1
  27. package/dist/calendar/index.js +8 -4
  28. package/dist/calendar/index.js.map +1 -1
  29. package/dist/calendar/index.mjs +8 -4
  30. package/dist/calendar/index.mjs.map +1 -1
  31. package/dist/calendar/web/index.js +8 -4
  32. package/dist/calendar/web/index.js.map +1 -1
  33. package/dist/calendar/web/index.mjs +8 -4
  34. package/dist/calendar/web/index.mjs.map +1 -1
  35. package/dist/{client-B6JtOkEq.d.ts → client-Bkn6mRI7.d.ts} +1 -1
  36. package/dist/{client-DkSveTk-.d.mts → client-exYn2Qla.d.mts} +1 -1
  37. package/dist/components/index.d.mts +2 -0
  38. package/dist/components/index.d.ts +2 -0
  39. package/dist/components/index.js +8 -4
  40. package/dist/components/index.js.map +1 -1
  41. package/dist/components/index.mjs +8 -4
  42. package/dist/components/index.mjs.map +1 -1
  43. package/dist/{index-B9vIHUEv.d.ts → index-BJpxvH7X.d.ts} +1 -1
  44. package/dist/{index-C3_UPPdv.d.ts → index-CdTIsNsy.d.ts} +2 -2
  45. package/dist/{index-DDuTPOHu.d.mts → index-Cum2EknK.d.mts} +1 -1
  46. package/dist/{index-D6ZIkvt-.d.mts → index-DyxLpkmm.d.mts} +2 -2
  47. package/dist/{index-BjYZSfZa.d.ts → index-XTV6IU-M.d.ts} +2 -2
  48. package/dist/{index-3qQN9Lh_.d.mts → index-z15F7afa.d.mts} +2 -2
  49. package/dist/index.js +8 -4
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +8 -4
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/mmd/index.d.mts +9 -3
  54. package/dist/mmd/index.d.ts +9 -3
  55. package/dist/mmd/index.js +95 -13
  56. package/dist/mmd/index.js.map +1 -1
  57. package/dist/mmd/index.mjs +95 -13
  58. package/dist/mmd/index.mjs.map +1 -1
  59. package/dist/portfolio/index.js +2 -2
  60. package/dist/portfolio/index.js.map +1 -1
  61. package/dist/portfolio/index.mjs +2 -2
  62. package/dist/portfolio/index.mjs.map +1 -1
  63. package/dist/showmasterpiece/core.d.mts +3 -3
  64. package/dist/showmasterpiece/core.d.ts +3 -3
  65. package/dist/showmasterpiece/db.d.mts +25 -0
  66. package/dist/showmasterpiece/db.d.ts +25 -0
  67. package/dist/showmasterpiece/db.js +35 -0
  68. package/dist/showmasterpiece/db.js.map +1 -1
  69. package/dist/showmasterpiece/db.mjs +35 -0
  70. package/dist/showmasterpiece/db.mjs.map +1 -1
  71. package/dist/showmasterpiece/index.js +279 -226
  72. package/dist/showmasterpiece/index.js.map +1 -1
  73. package/dist/showmasterpiece/index.mjs +279 -226
  74. package/dist/showmasterpiece/index.mjs.map +1 -1
  75. package/dist/showmasterpiece/logic/index.d.mts +2 -2
  76. package/dist/showmasterpiece/logic/index.d.ts +2 -2
  77. package/dist/showmasterpiece/server/index.js +35 -0
  78. package/dist/showmasterpiece/server/index.js.map +1 -1
  79. package/dist/showmasterpiece/server/index.mjs +35 -0
  80. package/dist/showmasterpiece/server/index.mjs.map +1 -1
  81. package/dist/showmasterpiece/service/api/index.d.mts +1 -1
  82. package/dist/showmasterpiece/service/api/index.d.ts +1 -1
  83. package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
  84. package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
  85. package/dist/showmasterpiece/service/index.d.mts +6 -6
  86. package/dist/showmasterpiece/service/index.d.ts +6 -6
  87. package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
  88. package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
  89. package/dist/showmasterpiece/service/web/index.d.mts +4 -4
  90. package/dist/showmasterpiece/service/web/index.d.ts +4 -4
  91. package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
  92. package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
  93. package/dist/showmasterpiece/ui/miniapp/index.js +38 -8
  94. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  95. package/dist/showmasterpiece/ui/miniapp/index.mjs +38 -8
  96. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  97. package/dist/showmasterpiece/ui/web/index.js +279 -226
  98. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  99. package/dist/showmasterpiece/ui/web/index.mjs +279 -226
  100. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  101. package/dist/showmasterpiece/web/index.js +279 -226
  102. package/dist/showmasterpiece/web/index.js.map +1 -1
  103. package/dist/showmasterpiece/web/index.mjs +279 -226
  104. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  105. package/dist/{types-CvKvpyN8.d.mts → types-D4vSK3AJ.d.mts} +2 -1
  106. package/dist/{types-CvKvpyN8.d.ts → types-D4vSK3AJ.d.ts} +2 -1
  107. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/showmasterpiece/server/services/fileService.ts","../../src/logger/types.ts","../../src/logger/console-adapter.ts","../../src/logger/Logger.ts","../../src/logger/index.ts","../../src/universalFile/server/utils/mime.ts","../../src/universalFile/types.ts","../../src/universalFile/server/types.ts","../../src/universalFile/server/providers/AliyunOSSProvider.ts","../../src/universalFile/server/providers/LocalStorageProvider.ts","../../src/universalFile/server/UniversalFileService.ts","../../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/types/index.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","../../src/showmasterpiece/server/services/index.ts"],"names":["localStorage","timestamp","path","init_types","FileServiceError","StorageProviderError","logger","OSS","path2","fs","existsSync","createWriteStream","pipeline","createReadStream","EventEmitter","uuidv4","AliyunOSSProvider","LocalStorageProvider","path3","createHash","basename","pgTable","serial","varchar","text","integer","boolean","json","index","uuid","relations","jsonb","db","eq","asc","and","sql","count","desc","categories","MasterpiecesConfigDbService","CategoriesDbService","TagsDbService","inArray","getShowMasterpieceFileConfig","UniversalFileService","like"],"mappings":"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","file":"db.js","sourcesContent":["export interface ShowMasterpieceFileRuntimeConfig {\n defaultStorage: string;\n storageProviders: Record<string, any>;\n defaultCDN: string;\n cdnProviders: Record<string, any>;\n maxFileSize: number;\n allowedMimeTypes: string[];\n cache: {\n metadataTTL: number;\n urlTTL: number;\n };\n}\n\ninterface ConfigManager {\n getConfig(): ShowMasterpieceFileRuntimeConfig;\n}\n\nfunction buildDefaultConfig(): ShowMasterpieceFileRuntimeConfig {\n const localStorage = {\n type: 'local',\n enabled: true,\n rootPath: process.env.FILE_STORAGE_PATH || 'uploads',\n baseUrl: process.env.FILE_BASE_URL || '/uploads',\n };\n\n const ossConfig = {\n type: 'aliyun-oss',\n enabled: false,\n region: process.env.ALIYUN_OSS_REGION || '',\n bucket: process.env.ALIYUN_OSS_BUCKET || '',\n accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID || '',\n accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET || '',\n customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,\n secure: process.env.ALIYUN_OSS_SECURE === 'true',\n internal: process.env.ALIYUN_OSS_INTERNAL === 'true',\n };\n\n const hasOssConfig =\n !!ossConfig.region &&\n !!ossConfig.bucket &&\n !!ossConfig.accessKeyId &&\n !!ossConfig.accessKeySecret;\n\n const defaultStorage = hasOssConfig ? 'aliyun-oss' : 'local';\n ossConfig.enabled = hasOssConfig;\n\n return {\n defaultStorage,\n storageProviders: {\n local: localStorage,\n 'aliyun-oss': ossConfig,\n 'aws-s3': { type: 'aws-s3', enabled: false },\n 'qcloud-cos': { type: 'qcloud-cos', enabled: false },\n },\n defaultCDN: 'none',\n cdnProviders: {\n none: { type: 'none', enabled: false },\n 'aliyun-cdn': {\n type: 'aliyun-cdn',\n enabled: false,\n domain: process.env.ALIYUN_CDN_DOMAIN,\n accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,\n region: process.env.ALIYUN_CDN_REGION,\n },\n 'aws-cloudfront': { type: 'aws-cloudfront', enabled: false },\n 'qcloud-cdn': { type: 'qcloud-cdn', enabled: false },\n },\n maxFileSize: parseInt(process.env.MAX_FILE_SIZE || '104857600', 10),\n allowedMimeTypes: [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/ogg',\n 'audio/mp4',\n 'audio/aac',\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/webm',\n 'video/mkv',\n 'application/pdf',\n 'text/plain',\n 'application/json',\n 'application/javascript',\n 'text/css',\n 'text/html',\n 'text/markdown',\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n 'application/octet-stream',\n 'model/gltf+json',\n 'model/gltf-binary',\n ],\n cache: {\n metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || '3600', 10),\n urlTTL: parseInt(process.env.URL_CACHE_TTL || '1800', 10),\n },\n };\n}\n\nexport async function getShowMasterpieceFileConfig(): Promise<ConfigManager> {\n const config = buildDefaultConfig();\n return {\n getConfig() {\n return config;\n },\n };\n}\n","/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4, // 禁用所有日志\n}\n\n/**\n * 日志条目\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n data?: any;\n context?: string;\n error?: Error;\n}\n\n/**\n * 日志适配器接口\n * 不同平台实现不同的日志输出方式\n */\nexport interface LoggerAdapter {\n /**\n * 输出日志\n */\n log(entry: LogEntry): void;\n\n /**\n * 批量输出日志(可选)\n */\n logBatch?(entries: LogEntry[]): void;\n}\n\n/**\n * 日志配置\n */\nexport interface LoggerConfig {\n /**\n * 最小日志级别\n * 只有大于等于此级别的日志才会输出\n */\n minLevel: LogLevel;\n\n /**\n * 是否启用时间戳\n */\n enableTimestamp?: boolean;\n\n /**\n * 是否启用上下文(模块名)\n */\n enableContext?: boolean;\n\n /**\n * 环境(development/production)\n */\n environment?: 'development' | 'production';\n\n /**\n * 自定义适配器\n */\n adapter?: LoggerAdapter;\n}\n\n","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","export * from './types';\nexport * from './Logger';\nexport * from './console-adapter';\n\n","/**\n * MIME 类型工具函数\n */\n\nimport * as path from 'path';\n\n/** MIME 类型映射表 */\nconst MIME_TYPES: Record<string, string> = {\n // 图片\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\n\n // 视频\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.wmv': 'video/x-ms-wmv',\n '.flv': 'video/x-flv',\n '.mkv': 'video/x-matroska',\n '.webm': 'video/webm',\n\n // 音频\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.flac': 'audio/flac',\n '.aac': 'audio/aac',\n\n // 文档\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.txt': 'text/plain',\n '.rtf': 'application/rtf',\n\n // 压缩文件\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n\n // 代码文件\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.css': 'text/css',\n '.ts': 'application/typescript',\n\n // 其他\n '.csv': 'text/csv',\n '.md': 'text/markdown',\n};\n\n/**\n * 根据文件名获取 MIME 类型\n *\n * @param filename 文件名\n * @returns MIME 类型\n *\n * @example\n * ```typescript\n * getMimeType('photo.jpg') // 'image/jpeg'\n * getMimeType('video.mp4') // 'video/mp4'\n * getMimeType('unknown.xyz') // 'application/octet-stream'\n * ```\n */\nexport function getMimeType(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return MIME_TYPES[ext] || 'application/octet-stream';\n}\n\n/**\n * 根据 MIME 类型获取文件扩展名\n *\n * @param mimeType MIME 类型\n * @returns 文件扩展名(包含点号)\n *\n * @example\n * ```typescript\n * getExtensionFromMimeType('image/jpeg') // '.jpg'\n * getExtensionFromMimeType('video/mp4') // '.mp4'\n * ```\n */\nexport function getExtensionFromMimeType(mimeType: string): string | null {\n for (const [ext, mime] of Object.entries(MIME_TYPES)) {\n if (mime === mimeType) {\n return ext;\n }\n }\n return null;\n}\n\n/**\n * 检查是否为图片类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为图片\n */\nexport function isImageType(mimeType: string): boolean {\n return mimeType.startsWith('image/');\n}\n\n/**\n * 检查是否为视频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为视频\n */\nexport function isVideoType(mimeType: string): boolean {\n return mimeType.startsWith('video/');\n}\n\n/**\n * 检查是否为音频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为音频\n */\nexport function isAudioType(mimeType: string): boolean {\n return mimeType.startsWith('audio/');\n}\n\n/**\n * 检查是否为文档类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为文档\n */\nexport function isDocumentType(mimeType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument',\n 'text/plain',\n 'application/rtf',\n ];\n return documentTypes.some(type => mimeType.includes(type));\n}\n\n/**\n * 验证 MIME 类型是否在允许列表中\n *\n * @param mimeType MIME 类型\n * @param allowedTypes 允许的类型列表(支持通配符)\n * @returns 是否允许\n *\n * @example\n * ```typescript\n * isAllowedMimeType('image/jpeg', ['image/*']) // true\n * isAllowedMimeType('video/mp4', ['image/*']) // false\n * isAllowedMimeType('image/png', ['image/jpeg']) // false\n * ```\n */\nexport function isAllowedMimeType(\n mimeType: string,\n allowedTypes: string[]\n): boolean {\n return allowedTypes.some(allowed => {\n if (allowed === '*/*') {\n return true;\n }\n if (allowed.endsWith('/*')) {\n const prefix = allowed.slice(0, -2);\n return mimeType.startsWith(prefix + '/');\n }\n return mimeType === allowed;\n });\n}\n\n","/**\n * 通用文件服务类型定义\n *\n * 定义了文件存储、上传、下载等核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 文件存储类型 */\nexport type StorageType = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';\n\n/** CDN提供者类型 */\nexport type CDNType = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';\n\n/** 文件处理类型 */\nexport type ProcessorType = 'image' | 'audio' | 'video' | 'document';\n\n/** 文件上传状态 */\nexport type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';\n\n/** 访问权限类型 */\nexport type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';\n\n// ============= 文件元数据接口 =============\n\n/** 文件元数据基础接口 */\nexport interface FileMetadata {\n /** 文件ID */\n id: string;\n /** 原始文件名 */\n originalName: string;\n /** 存储文件名 */\n storageName: string;\n /** 文件大小(字节) */\n size: number;\n /** MIME类型 */\n mimeType: string;\n /** 文件扩展名 */\n extension: string;\n /** 文件哈希值 */\n hash?: string;\n /** 上传时间 */\n uploadTime: Date;\n /** 访问权限 */\n permission: AccessPermission;\n /** 上传者ID */\n uploaderId: string;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 存储提供者 */\n storageProvider: StorageType;\n /** 存储路径 */\n storagePath: string;\n /** CDN URL */\n cdnUrl?: string;\n /** 访问次数 */\n accessCount: number;\n /** 最后访问时间 */\n lastAccessTime?: Date;\n /** 过期时间 */\n expiresAt?: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** 上传文件信息(客户端使用) */\nexport interface UploadFileInfo {\n /** 文件对象 */\n file: File;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 自定义存储路径 */\n customPath?: string;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n /** 是否需要处理 */\n needsProcessing?: boolean;\n /** 处理选项 */\n processingOptions?: ProcessingOptions;\n}\n\n/** 文件处理选项基础接口 */\nexport interface ProcessingOptions {\n /** 处理器类型 */\n type: ProcessorType;\n /** 处理参数 */\n params?: Record<string, any>;\n}\n\n/** 图片处理选项 */\nexport interface ImageProcessingOptions extends ProcessingOptions {\n type: 'image';\n /** 压缩质量 0-100 */\n quality?: number;\n /** 目标宽度 */\n width?: number;\n /** 目标高度 */\n height?: number;\n /** 格式转换 */\n format?: 'jpeg' | 'png' | 'webp' | 'avif';\n /** 是否添加水印 */\n watermark?: boolean;\n /** 水印配置 */\n watermarkOptions?: {\n text?: string;\n image?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';\n opacity?: number;\n };\n}\n\n/** 音频处理选项 */\nexport interface AudioProcessingOptions extends ProcessingOptions {\n type: 'audio';\n /** 比特率 */\n bitrate?: number;\n /** 格式转换 */\n format?: 'mp3' | 'wav' | 'ogg' | 'aac';\n /** 采样率 */\n sampleRate?: number;\n /** 声道数 */\n channels?: number;\n}\n\n/** 视频处理选项 */\nexport interface VideoProcessingOptions extends ProcessingOptions {\n type: 'video';\n /** 视频质量 */\n quality?: number;\n /** 格式转换 */\n format?: 'mp4' | 'avi' | 'mov' | 'webm';\n /** 生成缩略图 */\n generateThumbnail?: boolean;\n /** 缩略图时间点(秒) */\n thumbnailTime?: number;\n}\n\n// ============= 上传相关接口 =============\n\n/** 上传进度 */\nexport interface UploadProgress {\n /** 文件ID */\n fileId: string;\n /** 上传状态 */\n status: UploadStatus;\n /** 进度百分比(0-100) */\n progress: number;\n /** 已上传字节数 */\n uploadedBytes: number;\n /** 总字节数 */\n totalBytes: number;\n /** 上传速度(字节/秒) */\n speed: number;\n /** 剩余时间(秒) */\n remainingTime: number;\n /** 错误信息 */\n error?: string;\n}\n\n/** 上传结果 */\nexport interface UploadResult {\n /** 是否成功 */\n success: boolean;\n /** 文件元数据 */\n file?: FileMetadata;\n /** 文件访问URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 查询相关接口 =============\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块标识 */\n moduleId?: string;\n /** 业务标识 */\n businessId?: string;\n /** 上传者ID */\n uploaderId?: string;\n /** MIME类型过滤 */\n mimeType?: string;\n /** 最小文件大小 */\n minSize?: number;\n /** 最大文件大小 */\n maxSize?: number;\n /** 开始时间 */\n startTime?: Date;\n /** 结束时间 */\n endTime?: Date;\n /** 搜索关键词 */\n keyword?: string;\n /** 标签 */\n tags?: string[];\n /** 排序字段 */\n sortBy?: string;\n /** 排序方向 */\n sortOrder?: 'asc' | 'desc';\n /** 页码 */\n page?: number;\n /** 每页数量 */\n pageSize?: number;\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据项 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n /** 是否有下一页 */\n hasNext: boolean;\n /** 是否有上一页 */\n hasPrev: boolean;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 事件相关接口 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'processing:start'\n | 'processing:complete'\n | 'processing:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件ID */\n fileId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 文件事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 异常类定义 =============\n\n/** 文件服务基础异常 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传错误 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理错误 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者错误 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者错误 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n\n","/**\n * UniversalFile Server 端类型定义\n */\n\nimport type {\n StorageType as _StorageType,\n CDNType as _CDNType,\n ProcessorType as _ProcessorType,\n FileMetadata,\n UploadStatus,\n AccessPermission,\n UploadFileInfo as _UploadFileInfo,\n ProcessingOptions as _ProcessingOptions,\n} from '../types';\n\n// Re-export client types for server use\nexport type StorageType = _StorageType;\nexport type CDNType = _CDNType;\nexport type ProcessorType = _ProcessorType;\nexport type UploadFileInfo = _UploadFileInfo;\nexport type ProcessingOptions = _ProcessingOptions;\n\n// ============= Provider 接口 =============\n\n/** 存储提供者接口 */\nexport interface IStorageProvider {\n /** 提供者类型 */\n readonly type: StorageType;\n\n /** 初始化 */\n initialize(config: StorageConfig): Promise<void>;\n\n /** 上传文件 */\n upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;\n\n /** 下载文件 */\n download(path: string): Promise<Buffer>;\n\n /** 删除文件 */\n delete(path: string): Promise<StorageResult>;\n\n /** 获取文件信息 */\n getFileInfo(path: string): Promise<StorageResult>;\n\n /** 生成访问URL */\n getAccessUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 生成预签名上传URL */\n getUploadUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 检查文件是否存在 */\n exists(path: string): Promise<boolean>;\n\n /** 列出文件 */\n list(prefix: string, maxKeys?: number): Promise<string[]>;\n}\n\n/** CDN 提供者接口 */\nexport interface ICDNProvider {\n /** 提供者类型 */\n readonly type: CDNType;\n\n /** 初始化 */\n initialize(config: CDNConfig): Promise<void>;\n\n /** 生成CDN URL */\n generateUrl(originalUrl: string): Promise<string>;\n\n /** 刷新缓存 */\n refreshCache(urls: string[]): Promise<CDNResult>;\n\n /** 预热缓存 */\n preheatCache(urls: string[]): Promise<CDNResult>;\n\n /** 获取访问统计 */\n getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;\n}\n\n/** 文件处理器接口 */\nexport interface IFileProcessor {\n /** 处理器类型 */\n readonly type: ProcessorType;\n\n /** 初始化 */\n initialize(): Promise<void>;\n\n /** 处理文件 */\n process(\n inputPath: string,\n outputPath: string,\n options: ProcessingOptions\n ): Promise<ProcessingResult>;\n\n /** 检查文件是否支持处理 */\n supports(mimeType: string): boolean;\n\n /** 获取文件信息 */\n getFileInfo(filePath: string): Promise<Record<string, any>>;\n}\n\n// ============= 配置接口 =============\n\n/** 存储配置基础接口 */\nexport interface StorageConfig {\n /** 存储类型 */\n type: StorageType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 本地存储配置 */\nexport interface LocalStorageConfig extends StorageConfig {\n type: 'local';\n /** 存储根目录 */\n rootPath: string;\n /** 基础URL */\n baseUrl: string;\n}\n\n/** 阿里云 OSS 配置 */\nexport interface AliyunOSSConfig extends StorageConfig {\n type: 'aliyun-oss';\n /** 地域 */\n region: string;\n /** 存储桶名称 */\n bucket: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 自定义域名 */\n customDomain?: string;\n /** 是否使用HTTPS */\n secure?: boolean;\n /** 是否使用内网访问 */\n internal?: boolean;\n}\n\n/** CDN配置基础接口 */\nexport interface CDNConfig {\n /** CDN类型 */\n type: CDNType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 阿里云 CDN 配置 */\nexport interface AliyunCDNConfig extends CDNConfig {\n type: 'aliyun-cdn';\n /** CDN域名 */\n domain: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 地域 */\n region?: string;\n}\n\n/** 缓存配置 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 最大缓存大小 */\n maxSize?: number;\n /** 缓存 TTL(秒) */\n ttl?: number;\n /** 是否使用 Redis */\n useRedis?: boolean;\n /** Redis 配置 */\n redisConfig?: {\n host: string;\n port: number;\n password?: string;\n db?: number;\n };\n}\n\n/** 文件服务配置 */\n/** 缓存配置扩展 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 元数据缓存TTL(秒) */\n metadataTTL?: number;\n /** URL缓存TTL(秒) */\n urlTTL?: number;\n /** 最大缓存条目数 */\n maxSize?: number;\n}\n\nexport interface UniversalFileServiceConfig {\n /** 存储配置 */\n storage: StorageConfig;\n /** CDN 配置(可选) */\n cdn?: CDNConfig;\n /** 缓存配置(可选) */\n cache?: CacheConfig;\n /** 数据库持久化配置(可选) */\n persistence?: FileServicePersistenceConfig;\n /** 启用的处理器 */\n processors?: ProcessorType[];\n /** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */\n db?: any;\n /** 最大文件大小(字节) */\n maxFileSize?: number;\n /** 允许的文件类型 */\n allowedMimeTypes?: string[];\n /** 是否启用监控 */\n enableMonitoring?: boolean;\n\n // 运行时字段(由服务类内部管理)\n /** 存储提供者映射(内部使用) */\n storageProviders?: Map<StorageType, IStorageProvider>;\n /** 默认存储类型 */\n defaultStorage?: StorageType;\n /** 默认CDN类型 */\n defaultCDN?: CDNType;\n}\n\n// ============= 结果类型 =============\n\n/** 存储结果 */\n/** 存储操作结果 */\nexport interface StorageResult {\n /** 是否成功 */\n success: boolean;\n /** 存储路径 */\n path?: string;\n /** 访问URL */\n url?: string;\n /** 文件大小 */\n size?: number;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 存储元数据 */\nexport interface StorageMetadata {\n /** 文件大小 */\n size: number;\n /** MIME 类型 */\n mimeType: string;\n /** 最后修改时间 */\n lastModified: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** CDN 结果 */\n/** CDN操作结果 */\nexport interface CDNResult {\n /** 是否成功 */\n success: boolean;\n /** CDN URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** CDN 统计信息 */\nexport interface CDNStats {\n /** 带宽(字节/秒) */\n bandwidth: number;\n /** 请求数 */\n requests: number;\n /** 流量(字节) */\n traffic: number;\n /** 统计时间范围 */\n timeRange: {\n start: Date;\n end: Date;\n };\n}\n\n/** 处理结果 */\nexport interface ProcessingResult {\n /** 是否成功 */\n success: boolean;\n /** 处理后的文件路径 */\n processedPath?: string;\n /** 处理后的文件大小 */\n processedSize?: number;\n /** 缩略图路径 */\n thumbnailPath?: string;\n /** 错误信息 */\n error?: string;\n /** 处理耗时(毫秒) */\n processingTime?: number;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 处理器信息 */\nexport interface ProcessorInfo {\n /** 处理器名称 */\n name: string;\n /** 处理器版本 */\n version: string;\n /** 支持的格式 */\n supportedFormats: string[];\n /** 支持的操作 */\n supportedOperations: string[];\n}\n\n// ============= 数据库相关类型 =============\n\n/** 文件数据库记录 */\nexport interface FileRecord extends FileMetadata {\n /** 创建时间 */\n createdAt: Date | string;\n /** 更新时间 */\n updatedAt: Date | string;\n}\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块 ID */\n moduleId?: string;\n /** 业务 ID */\n businessId?: string;\n /** 上传者 ID */\n uploaderId?: string;\n /** 文件类型 */\n mimeType?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 状态 */\n status?: UploadStatus;\n /** 分页 */\n page?: number;\n pageSize?: number;\n /** 排序 */\n orderBy?: string;\n orderDirection?: 'asc' | 'desc';\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据列表 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页 */\n page: number;\n /** 每页大小 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n}\n\n// ============= 事件类型 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'delete:error'\n | 'process:start'\n | 'process:complete'\n | 'process:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件 ID */\n fileId: string;\n /** 事件数据 */\n data?: any;\n /** 时间戳 */\n timestamp: Date;\n}\n\n/** 事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 数据库持久化接口 =============\n\n/**\n * 文件元数据数据库持久化接口\n *\n * 实现此接口以提供自定义的数据库持久化支持\n *\n * @example\n * ```typescript\n * // Drizzle ORM 实现\n * class DrizzleFileRepository implements IFileMetadataRepository {\n * async save(metadata: FileMetadata): Promise<void> {\n * await db.insert(fileMetadata).values(metadata);\n * }\n * // ... 其他方法\n * }\n * ```\n */\nexport interface IFileMetadataRepository {\n /**\n * 保存文件元数据到数据库\n */\n save(metadata: FileMetadata): Promise<void>;\n\n /**\n * 从数据库获取文件元数据\n */\n get(fileId: string): Promise<FileMetadata | null>;\n\n /**\n * 查询文件列表\n */\n query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;\n\n /**\n * 从数据库删除文件元数据\n */\n delete(fileId: string): Promise<void>;\n\n /**\n * 批量删除文件元数据\n */\n batchDelete(fileIds: string[]): Promise<void>;\n}\n\n/**\n * 数据库持久化配置\n */\nexport interface FileServicePersistenceConfig {\n /**\n * 是否启用持久化\n */\n enabled: boolean;\n\n /**\n * 持久化仓储实现\n */\n repository: IFileMetadataRepository;\n\n /**\n * 是否自动持久化(默认 true)\n * 如果为 true,文件上传完成后自动保存到数据库\n */\n autoPersist?: boolean;\n\n /**\n * 是否优先使用缓存(默认 false)\n * 如果为 true,查询时优先从缓存获取\n */\n cacheFirst?: boolean;\n}\n\n// ============= 异常类型定义 =============\n\n/** 文件服务异常基类 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传异常 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理异常 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者异常 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者异常 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n","/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n logger.info('🔄 [AliyunOSSProvider] 重新初始化OSS客户端', config);\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n '☁️ [AliyunOSSProvider] 新配置: bucket=' + (newConfig.bucket) + ', region=' + (newConfig.region)\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info('☁️ [AliyunOSSProvider] ' + (this.isInitialized ? '重新' : '') + '初始化阿里云OSS');\n logger.info('☁️ [AliyunOSSProvider] ' + (this.config ? JSON.stringify(this.config) : ''));\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n this.isInitialized = true;\n logger.info('✅ [AliyunOSSProvider] 阿里云OSS' + (configChanged ? '重新' : '') + '初始化完成');\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始上传文件到OSS: ' + (filePath));\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n '📦 [AliyunOSSProvider] 使用分片上传大文件: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n '📤 [AliyunOSSProvider] 使用普通上传: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [AliyunOSSProvider] 开始从OSS下载文件: ' + (filePath));\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n '✅ [AliyunOSSProvider] 文件下载完成: ' + (filePath) + ', 大小: ' + (result.content.length)\n );\n\n return result.content;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件下载失败: ' + (filePath) + ':', error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ' + (filePath));\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件删除完成: ' + (filePath));\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件删除失败: ' + (filePath) + ':', error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn('⚠️ [AliyunOSSProvider] 文件不存在: ' + (filePath));\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成访问URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成上传URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn('⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ' + (filePath) + ':', error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n \n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info('📦 [AliyunOSSProvider] 上传进度: ' + ((p * 100).toFixed(1)) + '%');\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.customDomain) + '/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用自定义域名: ' + (url));\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.bucket) + '.' + (this.config.region) + '.aliyuncs.com/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用默认OSS域名: ' + (url));\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n // if (this.isOSSError(error)) {\n // const requestId = error.requestId ? ' (RequestId: ' + (error.requestId) + ')' : '';\n // return (error.code) + ': ' + (error.message) + (requestId);\n // }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ' + (filePath));\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 流式上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ' + (filePaths.length));\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info('✅ [AliyunOSSProvider] 批量删除完成,成功: ' + (result.deleted?.length || 0));\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('📋 [AliyunOSSProvider] 开始复制文件: ' + (sourcePath) + ' -> ' + (targetPath));\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件复制完成: ' + (sourcePath) + ' -> ' + (targetPath));\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件复制失败: ' + (sourcePath) + ' -> ' + (targetPath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n","/**\n * 本地存储提供者实现\n */\n\nimport { promises as fs } from 'fs';\nimport { existsSync, createReadStream, createWriteStream } from 'fs';\nimport * as path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n LocalStorageConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('LocalStorageProvider');\n\n/**\n * 本地文件系统存储提供者\n */\nexport class LocalStorageProvider implements IStorageProvider {\n readonly type: StorageType = 'local';\n\n private config: LocalStorageConfig | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'local') {\n throw new StorageProviderError('配置类型不匹配:期望 local');\n }\n\n this.config = config as LocalStorageConfig;\n\n logger.info('📂 [LocalStorageProvider] 初始化本地存储,根目录: ' + (this.config.rootPath));\n\n try {\n // 确保根目录存在\n await this.ensureDirectoryExists(this.config.rootPath);\n\n // 验证目录访问权限\n await this.validateDirectoryAccess(this.config.rootPath);\n\n this.isInitialized = true;\n logger.info('✅ [LocalStorageProvider] 本地存储初始化完成');\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 本地存储初始化失败:', error);\n throw new StorageProviderError(`本地存储初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始上传文件: ' + (filePath));\n\n try {\n // 生成完整文件路径\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 写入文件\n await fs.writeFile(fullPath, buffer);\n\n // 验证文件写入\n const stats = await fs.stat(fullPath);\n\n if (stats.size !== fileInfo.file.size) {\n throw new StorageProviderError(\n '文件大小不匹配: 期望 ' + (fileInfo.file.size) + ', 实际 ' + (stats.size)\n );\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [LocalStorageProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '上传失败',\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(path: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [LocalStorageProvider] 开始下载文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n // 读取文件\n const buffer = await fs.readFile(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件下载完成: ' + (path) + ', 大小: ' + (buffer.length));\n\n return buffer;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件下载失败: ' + (path) + ':', error);\n throw new StorageProviderError(\n '文件下载失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 删除文件\n */\n async delete(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [LocalStorageProvider] 开始删除文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n logger.warn('⚠️ [LocalStorageProvider] 文件不存在: ' + (path));\n return {\n success: true, // 文件不存在也视为删除成功\n data: { reason: 'file_not_exists' },\n };\n }\n\n // 删除文件\n await fs.unlink(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件删除完成: ' + (path));\n\n return {\n success: true,\n data: { deletedPath: fullPath },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件删除失败: ' + (path) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '删除失败',\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n const stats = await fs.stat(fullPath);\n\n return {\n success: true,\n size: stats.size,\n data: {\n fullPath,\n size: stats.size,\n mtime: stats.mtime,\n ctime: stats.ctime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '获取文件信息失败',\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持过期时间,忽略expiresIn参数\n return this.generateAccessUrl(path);\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持预签名上传,返回普通访问URL\n logger.warn(`⚠️ [LocalStorageProvider] 本地存储不支持预签名上传URL`);\n return this.generateAccessUrl(path);\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(path: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n return existsSync(fullPath);\n } catch {\n return false;\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const fullPrefix = this.getFullPath(prefix);\n const baseDir = path.dirname(fullPrefix);\n const filePattern = path.basename(fullPrefix);\n\n if (!existsSync(baseDir)) {\n return [];\n }\n\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => name.startsWith(filePattern))\n .map((name) => path.join(path.dirname(prefix), name));\n\n // 限制返回数量\n if (maxKeys && maxKeys > 0) {\n files = files.slice(0, maxKeys);\n }\n\n return files;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n }\n\n /**\n * 获取完整文件路径\n */\n private getFullPath(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 防止路径遍历攻击\n const normalizedPath = path.normalize(relativePath);\n if (normalizedPath.includes('..')) {\n throw new StorageProviderError('非法路径:不允许使用父目录引用');\n }\n\n return path.join(this.config.rootPath, normalizedPath);\n }\n\n /**\n * 生成访问URL\n */\n private generateAccessUrl(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 规范化路径分隔符为URL格式\n const urlPath = relativePath.replace(/\\\\/g, '/');\n\n // 确保URL路径以/开头\n const normalizedUrlPath = urlPath.startsWith('/') ? urlPath : '/' + (urlPath);\n\n return (this.config.baseUrl) + (normalizedUrlPath);\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // 如果目录已存在,忽略错误\n if (error instanceof Error && 'code' in error && error.code !== 'EEXIST') {\n throw error;\n }\n }\n }\n\n /**\n * 验证目录访问权限\n */\n private async validateDirectoryAccess(dirPath: string): Promise<void> {\n try {\n // 检查读写权限\n await fs.access(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch (error) {\n throw new StorageProviderError(\n '目录访问权限不足: ' + (dirPath) + ', ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 流式上传大文件(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始流式上传文件: ' + (filePath));\n\n try {\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 创建写入流\n const writeStream = createWriteStream(fullPath);\n\n // 使用pipeline进行流式传输\n await pipeline(readableStream, writeStream);\n\n // 获取文件信息\n const stats = await fs.stat(fullPath);\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(\n '✅ [LocalStorageProvider] 流式上传完成: ' + (filePath) + ', 大小: ' + (stats.size) + ', 耗时: ' + (uploadTime) + 'ms'\n );\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '流式上传失败',\n };\n }\n }\n\n /**\n * 流式下载大文件(可选实现)\n */\n createDownloadStream(path: string): NodeJS.ReadableStream {\n this.ensureInitialized();\n\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n return createReadStream(fullPath);\n }\n}\n\n","/**\n * 通用文件服务核心实现\n *\n * 提供统一的文件上传、下载、管理接口\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport { createLogger } from '../../logger';\nimport { getMimeType } from './utils/mime';\n\nconst logger = createLogger('UniversalFileService');\n\nimport type {\n StorageType,\n CDNType,\n ProcessorType,\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n FileEvent,\n FileEventListener,\n UploadStatus,\n} from '../types';\n\n// Backend specific types\nimport type {\n UniversalFileServiceConfig,\n IStorageProvider,\n ICDNProvider,\n IFileProcessor,\n} from './types';\n\nimport {\n FileUploadError,\n FileProcessingError,\n StorageProviderError,\n} from '../types';\n\n/**\n * 通用文件服务类\n */\nexport class UniversalFileService extends EventEmitter {\n private config: UniversalFileServiceConfig;\n private storageProviders = new Map<StorageType, IStorageProvider>();\n private cdnProviders = new Map<CDNType, ICDNProvider>();\n private fileProcessors = new Map<ProcessorType, IFileProcessor>();\n private uploadProgressMap = new Map<string, UploadProgress>();\n private metadataCache = new Map<string, { data: FileMetadata; expires: number }>();\n private urlCache = new Map<string, { url: string; expires: number }>();\n private processingQueue: Array<{\n fileId: string;\n processor: IFileProcessor;\n inputPath: string;\n outputPath: string;\n options: any;\n }> = [];\n private isProcessingQueueRunning = false;\n\n constructor(config: UniversalFileServiceConfig) {\n super();\n this.config = config;\n\n // 如果启用了持久化,设置自动监听器\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n this.setupPersistenceListeners();\n }\n }\n\n // ============= 持久化设置 =============\n\n /**\n * 设置数据库持久化监听器\n *\n * 当文件上传完成或删除时,自动触发数据库操作\n */\n private setupPersistenceListeners(): void {\n const { repository, autoPersist = true } = this.config.persistence!;\n\n if (!autoPersist) {\n logger.info('⚙️ [UniversalFileService] 自动持久化已禁用');\n return;\n }\n\n logger.info('✅ [UniversalFileService] 已启用数据库持久化,自动监听文件事件');\n\n // 监听文件上传完成事件\n this.on('upload:complete', async (fileId: string, data: any) => {\n try {\n const metadata = data.metadata || data;\n await repository.save(metadata);\n logger.info('💾 [Persistence] 文件元数据已自动保存: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 保存失败: ' + (fileId), error);\n // 不抛出错误,避免影响上传流程\n }\n });\n\n // 监听文件删除事件\n this.on('file:deleted', async (fileId: string) => {\n try {\n await repository.delete(fileId);\n logger.info('🗑️ [Persistence] 文件元数据已自动删除: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 删除失败: ' + (fileId), error);\n }\n });\n\n // 监听批量删除事件\n this.on('files:batch-deleted', async (fileIds: string[]) => {\n try {\n await repository.batchDelete(fileIds);\n logger.info('🗑️ [Persistence] 批量删除元数据: ' + (fileIds.length) + ' 个文件');\n } catch (error) {\n logger.error(`❌ [Persistence] 批量删除失败`, error);\n }\n });\n }\n\n // ============= 初始化方法 =============\n\n /**\n * 初始化文件服务\n */\n async initialize(): Promise<void> {\n logger.info('🚀 [UniversalFileService] 开始初始化文件服务...');\n\n try {\n // 验证配置是否完整\n await this.validateConfiguration();\n\n // 初始化存储提供者\n await this.initializeStorageProviders();\n\n // 初始化CDN提供者\n await this.initializeCDNProviders();\n\n // 初始化文件处理器\n await this.initializeFileProcessors();\n\n logger.info('✅ [UniversalFileService] 文件服务初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件服务初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitializeStorageProviders(): Promise<void> {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者...');\n\n try {\n // 重新初始化所有存储提供者\n for (const [type, provider] of this.storageProviders) {\n if ('reinitialize' in provider) {\n try {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者: ' + (type) + '...');\n\n // 获取对应的配置(从原始配置中获取)\n const config = (this.config as any).storageProviders?.[type as string];\n if (config) {\n await (provider as any).reinitialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成: ' + (type));\n } else {\n logger.warn('⚠️ [UniversalFileService] 存储提供者配置不存在: ' + (type));\n }\n } catch (error) {\n logger.error('❌ [UniversalFileService] 存储提供者重新初始化失败: ' + (type), error);\n // 继续处理其他提供者\n }\n }\n }\n\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 存储提供者重新初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 注册存储提供者\n */\n registerStorageProvider(provider: IStorageProvider): void {\n this.storageProviders.set(provider.type, provider);\n logger.info('📦 [UniversalFileService] 注册存储提供者: ' + (provider.type));\n }\n\n /**\n * 注册CDN提供者\n */\n registerCDNProvider(provider: ICDNProvider): void {\n this.cdnProviders.set(provider.type, provider);\n logger.info('🌐 [UniversalFileService] 注册CDN提供者: ' + (provider.type));\n }\n\n /**\n * 注册文件处理器\n */\n registerFileProcessor(processor: IFileProcessor): void {\n this.fileProcessors.set(processor.type, processor);\n logger.info('⚙️ [UniversalFileService] 注册文件处理器: ' + (processor.type));\n }\n\n // ============= 核心文件操作方法 =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n storageType?: StorageType,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const fileId = uuidv4();\n const startTime = Date.now();\n\n logger.info('📤 [UniversalFileService] 开始上传文件: ' + (fileInfo.file.name) + ', ID: ' + (fileId));\n\n try {\n // 验证文件\n await this.validateFile(fileInfo.file);\n\n // 初始化上传进度\n const progress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n this.uploadProgressMap.set(fileId, progress);\n this.emitFileEvent('upload:start', fileId, { fileName: fileInfo.file.name });\n\n // 生成文件元数据\n const metadata = await this.generateFileMetadata(fileId, fileInfo);\n\n // 选择存储提供者\n const selectedStorageType = storageType || this.config.defaultStorage;\n let storageProvider = this.storageProviders.get(selectedStorageType as StorageType);\n\n // 如果指定的存储提供者不可用,优先尝试OSS\n if (!storageProvider) {\n logger.info(\n '⚠️ [UniversalFileService] 存储提供者 ' + (selectedStorageType) + ' 不可用,尝试使用OSS'\n );\n storageProvider = this.storageProviders.get('aliyun-oss');\n\n // 如果OSS也不可用,回退到本地存储\n if (!storageProvider) {\n logger.info(`⚠️ [UniversalFileService] OSS不可用,回退到本地存储`);\n storageProvider = this.storageProviders.get('local');\n }\n }\n\n if (!storageProvider) {\n throw new StorageProviderError(`没有可用的存储提供者`);\n }\n\n // 生成存储路径\n const storagePath = this.generateStoragePath(metadata);\n\n // 更新上传状态\n progress.status = 'uploading';\n progress.progress = 10;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n this.emitFileEvent('upload:progress', fileId, { progress: progress.progress });\n\n // 执行上传\n const uploadResult = await storageProvider.upload(fileInfo, storagePath);\n\n if (!uploadResult.success) {\n throw new FileUploadError('上传失败: ' + (uploadResult.error));\n }\n\n // 更新元数据\n metadata.storagePath = uploadResult.path || storagePath;\n metadata.storageProvider = selectedStorageType as StorageType;\n\n // 生成CDN URL(如果启用)\n if (this.config.defaultCDN !== 'none') {\n const cdnProvider = this.cdnProviders.get(this.config.defaultCDN as CDNType);\n if (cdnProvider && uploadResult.url) {\n metadata.cdnUrl = await cdnProvider.generateUrl(uploadResult.url);\n }\n }\n\n // 更新上传进度\n progress.status = fileInfo.needsProcessing ? 'processing' : 'completed';\n progress.progress = fileInfo.needsProcessing ? 70 : 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n // 如果需要处理,添加到处理队列\n if (fileInfo.needsProcessing && fileInfo.processingOptions) {\n await this.queueFileProcessing(metadata, fileInfo.processingOptions);\n }\n\n // 缓存元数据\n this.cacheMetadata(metadata);\n\n // 保存到数据库通过事件触发(如果启用了持久化)\n // persistence.repository 会监听 'upload:complete' 事件自动保存\n\n // 完成上传\n progress.status = 'completed';\n progress.progress = 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [UniversalFileService] 文件上传完成: ' + (fileId) + ', 耗时: ' + (uploadTime) + 'ms');\n\n this.emitFileEvent('upload:complete', fileId, {\n fileName: fileInfo.file.name,\n size: fileInfo.file.size,\n uploadTime,\n });\n\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件上传失败: ' + (fileId) + ':', error);\n\n // 更新上传状态为失败\n const progress = this.uploadProgressMap.get(fileId);\n if (progress) {\n progress.status = 'failed';\n progress.error = error instanceof Error ? error.message : '上传失败';\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n }\n\n this.emitFileEvent(\n 'upload:error',\n fileId,\n undefined,\n error instanceof Error ? error.message : '上传失败'\n );\n throw error;\n } finally {\n // 清理上传进度(可选,或设置过期时间)\n setTimeout(\n () => {\n this.uploadProgressMap.delete(fileId);\n },\n 5 * 60 * 1000\n ); // 5分钟后清理\n }\n }\n\n\n /**\n * 下载文件\n */\n async downloadFile(fileId: string, userId?: string): Promise<Buffer> {\n logger.info('📥 [UniversalFileService] 开始下载文件: ' + (fileId));\n\n try {\n this.emitFileEvent('download:start', fileId);\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查权限\n await this.checkFileAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 下载文件\n const fileBuffer = await storageProvider.download(metadata.storagePath);\n\n // 更新访问统计 (如果启用了持久化)\n if (this.config.persistence?.enabled) {\n await this.updateAccessStats(fileId);\n }\n\n logger.info('✅ [UniversalFileService] 文件下载完成: ' + (fileId));\n this.emitFileEvent('download:complete', fileId, { size: fileBuffer.length });\n\n return fileBuffer;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件下载失败: ' + (fileId) + ':', error);\n this.emitFileEvent('download:error', fileId, undefined, error instanceof Error ? error.message : '下载失败');\n throw error;\n }\n }\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string, userId?: string): Promise<void> {\n logger.info('🗑️ [UniversalFileService] 开始删除文件: ' + (fileId));\n\n try {\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查删除权限\n await this.checkFileDeleteAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 从存储中删除文件\n const deleteResult = await storageProvider.delete(metadata.storagePath);\n\n if (!deleteResult.success) {\n console.warn('⚠️ [UniversalFileService] 存储文件删除失败: ' + (deleteResult.error));\n }\n\n // 从数据库中删除元数据 (通过事件触发)\n if (this.config.persistence?.enabled) {\n await this.deleteFileMetadata(fileId);\n }\n\n // 清除缓存\n this.clearMetadataCache(fileId);\n\n logger.info('✅ [UniversalFileService] 文件删除完成: ' + (fileId));\n this.emitFileEvent('delete:complete', fileId);\n this.emit('file:deleted', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件删除失败: ' + (fileId) + ':', error);\n this.emitFileEvent('delete:error', fileId, undefined, error instanceof Error ? error.message : '删除失败');\n throw error;\n }\n }\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, userId?: string, expiresIn?: number): Promise<string> {\n // 检查缓存\n const cacheKey = (fileId) + '_' + (userId || 'public') + '_' + (expiresIn || 0);\n const cached = this.urlCache.get(cacheKey);\n\n if (cached && cached.expires > Date.now()) {\n return cached.url;\n }\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查访问权限\n await this.checkFileAccess(metadata, userId);\n\n let url: string;\n\n // 优先使用CDN URL\n if (metadata.cdnUrl) {\n url = metadata.cdnUrl;\n } else {\n // 获取存储提供者访问URL\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n url = await storageProvider.getAccessUrl(metadata.storagePath, expiresIn);\n }\n\n // 缓存URL\n const cacheExpires = Date.now() + (this.config.cache?.urlTTL || 1800) * 1000;\n this.urlCache.set(cacheKey, { url, expires: cacheExpires });\n\n return url;\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata | null> {\n // 检查缓存\n const cached = this.metadataCache.get(fileId);\n if (cached && cached.expires > Date.now()) {\n return cached.data;\n }\n\n // 如果启用了持久化,从数据库查询\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n try {\n const metadata = await this.config.persistence.repository.get(fileId);\n if (metadata) {\n // 缓存结果\n this.cacheMetadata(metadata);\n }\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件元数据失败:', error);\n return null;\n }\n }\n\n // 如果没有启用持久化,返回 null\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件元数据: ' + (fileId));\n return null;\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件列表');\n return {\n items: [],\n total: 0,\n page: options.page || 1,\n pageSize: options.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n\n try {\n const result = await this.config.persistence.repository.query(options);\n // 添加 hasNext 和 hasPrev\n const hasNext = result.page < result.totalPages;\n const hasPrev = result.page > 1;\n return {\n ...result,\n hasNext,\n hasPrev,\n };\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[], userId?: string): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n successCount: 0,\n failureCount: 0,\n failures: [],\n };\n\n for (const fileId of fileIds) {\n try {\n await this.deleteFile(fileId, userId);\n result.successCount++;\n } catch (error) {\n result.failureCount++;\n result.failures.push({\n fileId,\n error: error instanceof Error ? error.message : '删除失败',\n });\n }\n }\n\n // 触发批量删除事件\n if (result.successCount > 0) {\n this.emit('files:batch-deleted', fileIds.filter((_, i) => i < result.successCount));\n }\n\n return result;\n }\n\n /**\n * 获取上传进度\n */\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this.uploadProgressMap.get(fileId);\n }\n\n // ============= 事件处理方法 =============\n\n /**\n * 监听文件事件\n */\n onFileEvent(eventType: string, listener: FileEventListener): void {\n this.on(eventType, listener);\n }\n\n /**\n * 移除文件事件监听器\n */\n offFileEvent(eventType: string, listener: FileEventListener): void {\n this.off(eventType, listener);\n }\n\n // ============= 私有方法 =============\n\n /**\n * 验证配置是否完整\n */\n private async validateConfiguration(): Promise<void> {\n logger.info('🔍 [UniversalFileService] 验证配置文件...');\n\n // 检查基础配置\n if (!this.config) {\n throw new Error('文件服务配置为空');\n }\n\n // 检查存储配置\n if (!this.config.storage) {\n throw new Error('存储配置为空');\n }\n\n // 检查存储提供者配置\n if (this.config.storage.type === 'aliyun-oss') {\n const ossConfig = this.config.storage as any;\n\n // 如果配置不完整,等待配置加载\n if (!ossConfig.accessKeyId || !ossConfig.accessKeySecret || !ossConfig.bucket || !ossConfig.region) {\n logger.warn('⚠️ [UniversalFileService] OSS配置不完整,等待配置加载...');\n\n // 轮询检查配置是否加载完成,最多等待30秒\n const maxRetries = 30;\n const retryInterval = 1000; // 1秒\n\n for (let i = 0; i < maxRetries; i++) {\n await new Promise(resolve => setTimeout(resolve, retryInterval));\n\n // 重新检查配置(这里假设配置可能会被外部更新)\n const updatedConfig = this.config.storage as any;\n if (updatedConfig.accessKeyId && updatedConfig.accessKeySecret && updatedConfig.bucket && updatedConfig.region) {\n logger.info('✅ [UniversalFileService] OSS配置加载完成');\n break;\n }\n\n if (i === maxRetries - 1) {\n throw new Error('OSS配置加载超时:缺少必需的配置项 (accessKeyId, accessKeySecret, bucket, region)');\n }\n\n logger.debug('等待OSS配置加载中... (' + (i + 1) + '/' + (maxRetries) + ')');\n }\n }\n }\n\n // 检查默认存储类型\n if (!this.config.defaultStorage) {\n this.config.defaultStorage = this.config.storage.type as any;\n }\n\n logger.info('✅ [UniversalFileService] 配置验证完成');\n }\n\n private async initializeStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 开始初始化存储提供者...');\n\n // 如果还没有注册任何存储提供者,先注册默认的\n if (this.storageProviders.size === 0) {\n await this.registerDefaultStorageProviders();\n }\n\n if (this.config.storageProviders) {\n for (const [type, config] of Object.entries(this.config.storageProviders)) {\n if (config && config.enabled) {\n const provider = this.storageProviders.get(type as StorageType);\n if (provider) {\n try {\n await provider.initialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者初始化完成: ' + (type));\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 存储提供者初始化失败: ' + (type) + ':', error);\n // 如果默认存储提供者初始化失败,切换到本地存储\n // if (type === this.config.defaultStorage) {\n // console.warn('⚠️ [UniversalFileService] 默认存储提供者 ' + (type) + ' 初始化失败,切换到本地存储');\n // this.config.defaultStorage = 'local';\n // }\n }\n } else {\n console.warn('⚠️ [UniversalFileService] 存储提供者未注册: ' + (type));\n }\n }\n }\n }\n }\n\n private async registerDefaultStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 注册默认存储提供者...');\n\n // 根据配置注册相应的存储提供者\n try {\n if (this.config.storage) {\n if (this.config.storage.type === 'aliyun-oss' && this.config.storage.enabled) {\n const { AliyunOSSProvider } = await import('./providers/AliyunOSSProvider');\n const ossProvider = new AliyunOSSProvider();\n this.registerStorageProvider(ossProvider);\n logger.info('✅ [UniversalFileService] 阿里云OSS提供者注册成功');\n } else if (this.config.storage.type === 'local' && this.config.storage.enabled) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const localProvider = new LocalStorageProvider();\n this.registerStorageProvider(localProvider);\n logger.info('✅ [UniversalFileService] 本地存储提供者注册成功');\n }\n }\n\n // 如果没有注册任何提供者,注册本地存储作为后备\n if (this.storageProviders.size === 0) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const fallbackProvider = new LocalStorageProvider();\n this.registerStorageProvider(fallbackProvider);\n logger.info('✅ [UniversalFileService] 已注册备用本地存储提供者');\n }\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 注册默认存储提供者失败:', error);\n throw new Error('无法初始化存储提供者');\n }\n }\n\n private async initializeCDNProviders(): Promise<void> {\n // CDN 初始化暂时跳过,未来支持多个 CDN 提供者时实现\n if (this.config.cdn && this.config.cdn.enabled) {\n logger.info('✅ [UniversalFileService] CDN配置已启用: ' + (this.config.cdn.type));\n }\n }\n\n private async initializeFileProcessors(): Promise<void> {\n for (const processor of Array.from(this.fileProcessors.values())) {\n await processor.initialize();\n logger.info('✅ [UniversalFileService] 文件处理器初始化完成: ' + (processor.type));\n }\n }\n\n private async validateFile(file: File): Promise<void> {\n // 检查文件大小\n if (this.config.maxFileSize && file.size > this.config.maxFileSize) {\n throw new FileUploadError('文件大小超过限制: ' + (file.size) + ' > ' + (this.config.maxFileSize));\n }\n\n // 检查文件类型\n const mimeType = file.type || getMimeType(file.name);\n\n if (\n this.config.allowedMimeTypes &&\n this.config.allowedMimeTypes.length > 0 &&\n !this.config.allowedMimeTypes.includes(mimeType)\n ) {\n throw new FileUploadError('不支持的文件类型: ' + (mimeType));\n }\n }\n\n private async generateFileMetadata(\n fileId: string,\n fileInfo: UploadFileInfo\n ): Promise<FileMetadata> {\n const now = new Date();\n const mimeType = fileInfo.file.type || getMimeType(fileInfo.file.name);\n const extension = path.extname(fileInfo.file.name).toLowerCase();\n\n // 生成文件哈希(用于去重检测)\n const hash = await this.generateFileHash(fileInfo.file);\n\n return {\n id: fileId,\n originalName: fileInfo.file.name,\n storageName: (fileId) + (extension),\n size: fileInfo.file.size,\n mimeType,\n extension,\n hash,\n uploadTime: now,\n permission: fileInfo.permission || 'public',\n uploaderId: fileInfo.metadata?.uploadedBy || 'system',\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n storageProvider: (this.config.defaultStorage || 'local') as StorageType,\n storagePath: '',\n accessCount: 0,\n metadata: fileInfo.metadata || {},\n };\n }\n\n private generateStoragePath(metadata: FileMetadata): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return (metadata.moduleId) + '/' + (year) + '/' + (month) + '/' + (day) + '/' + (metadata.storageName);\n }\n\n private async generateFileHash(file: File): Promise<string> {\n const buffer = await file.arrayBuffer();\n const hash = createHash('sha256');\n hash.update(Buffer.from(buffer));\n return hash.digest('hex');\n }\n\n private async queueFileProcessing(metadata: FileMetadata, options: any): Promise<void> {\n if (!this.config.processors?.length || 0 > 0) {\n return;\n }\n\n const processor = this.fileProcessors.get(options.type);\n if (!processor) {\n console.warn('⚠️ [UniversalFileService] 文件处理器不存在: ' + (options.type));\n return;\n }\n\n if (this.processingQueue.length >= 1000) {\n throw new FileProcessingError('处理队列已满');\n }\n\n this.processingQueue.push({\n fileId: metadata.id,\n processor,\n inputPath: metadata.storagePath,\n outputPath: this.generateProcessedPath(metadata, options),\n options,\n });\n\n // 启动处理队列\n if (!this.isProcessingQueueRunning) {\n this.processFileQueue();\n }\n }\n\n private generateProcessedPath(metadata: FileMetadata, options: any): string {\n const basePath = metadata.storagePath;\n const extension = path.extname(basePath);\n const basename = basePath.replace(extension, '');\n\n return (basename) + '_processed' + (extension);\n }\n\n private async processFileQueue(): Promise<void> {\n if (this.isProcessingQueueRunning || this.processingQueue.length === 0) {\n return;\n }\n\n this.isProcessingQueueRunning = true;\n\n while (this.processingQueue.length > 0) {\n const task = this.processingQueue.shift();\n if (!task) break;\n\n try {\n this.emitFileEvent('processing:start', task.fileId);\n\n const result = await task.processor.process(task.inputPath, task.outputPath, task.options);\n\n if (result.success) {\n this.emitFileEvent('processing:complete', task.fileId, result);\n } else {\n this.emitFileEvent('processing:error', task.fileId, undefined, result.error);\n }\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件处理失败: ' + (task.fileId) + ':', error);\n this.emitFileEvent(\n 'processing:error',\n task.fileId,\n undefined,\n error instanceof Error ? error.message : '处理失败'\n );\n }\n }\n\n this.isProcessingQueueRunning = false;\n }\n\n private cacheMetadata(metadata: FileMetadata): void {\n const expires = Date.now() + (this.config.cache?.metadataTTL || 3600) * 1000;\n this.metadataCache.set(metadata.id, { data: metadata, expires });\n }\n\n private clearMetadataCache(fileId: string): void {\n this.metadataCache.delete(fileId);\n }\n\n private emitFileEvent(type: string, fileId: string, data?: any, error?: string): void {\n const event: FileEvent = {\n type: type as any,\n fileId,\n timestamp: new Date(),\n data,\n error,\n };\n\n this.emit(type, event);\n this.emit('*', event); // 通用事件监听\n }\n\n // ============= 数据库操作私有方法 =============\n\n /**\n * 保存文件元数据到数据库 (通过持久化仓储)\n */\n private async saveFileMetadata(metadata: FileMetadata): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,跳过保存元数据');\n return;\n }\n\n try {\n await this.config.persistence.repository.save(metadata);\n logger.info('💾 [UniversalFileService] 文件元数据保存成功:', metadata.id);\n } catch (error) {\n console.error('❌ [UniversalFileService] 保存文件元数据失败:', error);\n throw new FileUploadError(\n '保存文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 从数据库删除文件元数据 (通过持久化仓储)\n */\n private async deleteFileMetadata(fileId: string): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n return;\n }\n\n try {\n await this.config.persistence.repository.delete(fileId);\n logger.info('🗑️ [UniversalFileService] 文件元数据删除成功:', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 删除文件元数据失败:', error);\n throw new FileUploadError(\n '删除文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 更新访问统计\n */\n private async updateAccessStats(fileId: string): Promise<void> {\n // 访问统计更新由数据库仓储实现决定\n // 这里只记录日志\n logger.info('📊 [UniversalFileService] 需要更新访问统计:', fileId);\n }\n\n /**\n * 检查文件访问权限\n */\n private async checkFileAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 如果文件是公开的,允许访问\n if (metadata.permission === 'public') {\n return;\n }\n\n // 如果是私有文件,检查用户权限\n if (metadata.permission === 'private' && metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限访问此文件');\n }\n\n // 如果是认证用户可访问,检查是否提供了 userId\n if (metadata.permission === 'authenticated' && !userId) {\n throw new FileUploadError('需要登录才能访问此文件');\n }\n }\n\n /**\n * 检查文件删除权限\n */\n private async checkFileDeleteAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 只有上传者可以删除文件\n if (metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限删除此文件');\n }\n }\n\n /**\n * 检查服务是否完全可用(包括存储提供者)\n */\n isFullyInitialized(): boolean {\n // 检查是否有可用的存储提供者\n const hasStorageProvider = Array.from(this.storageProviders.values()).some(provider =>\n provider.type === 'aliyun-oss' || provider.type === 'local'\n );\n\n return hasStorageProvider;\n }\n\n /**\n * 等待服务完全初始化(带超时)\n */\n async waitForInitialization(timeoutMs: number = 30000): Promise<void> {\n const startTime = Date.now();\n\n while (!this.isFullyInitialized()) {\n if (Date.now() - startTime > timeoutMs) {\n throw new Error('服务初始化超时 (' + (timeoutMs) + 'ms)');\n }\n\n // 等待100ms后重试\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n logger.info('✅ [UniversalFileService] 服务完全初始化就绪');\n }\n}\n","/**\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","/**\n * ShowMasterpiece 模块类型定义\n * \n * 包含画集、作品、配置等相关的TypeScript类型定义\n */\n\n// ===== 画集分类枚举 =====\n\n/**\n * 画集分类枚举\n * \n * 定义画集的各种分类:\n * - COLLECTION: 画集 - 用于展示艺术作品\n * - ACRYLIC: 立牌 - 立牌制品\n * - BADGE: 吧唧 - 徽章类商品\n * - COLOR_PAPER: 色纸 - 彩色纸张制品\n * - POSTCARD: 明信片 - 明信片类商品\n * - LASER_TICKET: 镭射票 - 镭射票类商品\n * - CANVAS_BAG: 帆布包 - 帆布包类商品\n * - SUPPORT_STICK: 应援棒 - 应援棒类商品\n * - OTHER: 挂件/钥匙扣 - 挂件/钥匙扣类商品\n */\nexport enum CollectionCategory {\n /** 画集 - 用于展示艺术作品 */\n COLLECTION = 'collection',\n /** 立牌 - 立牌制品 */\n ACRYLIC = 'acrylic',\n /** 吧唧 - 徽章类商品 */\n BADGE = 'badge',\n /** 色纸 - 彩色纸张制品 */\n COLOR_PAPER = 'color_paper',\n /** 透卡 - 透明卡片制品 */\n TRANSPARENT_CARD = 'transparent_card',\n /** 明信片 - 明信片类商品 */\n POSTCARD = 'postcard',\n /** 镭射票 - 镭射票类商品 */\n LASER_TICKET = 'laser_ticket',\n /** 帆布包 - 帆布包类商品 */\n CANVAS_BAG = 'canvas_bag',\n /** 线圈笔记本 - 线圈装订笔记本 */\n SPIRAL_NOTEBOOK = 'spiral_notebook',\n /** 鼠标垫 - 鼠标垫类商品 */\n MOUSE_PAD = 'mouse_pad',\n /** 应援棒 - 应援棒类商品 */\n SUPPORT_STICK = 'support_stick',\n /** 挂件/钥匙扣 - 挂件/钥匙扣类商品 */\n KEYCHAIN = 'keychain',\n /** 其它 */\n OTHER = 'other'\n}\n\n/**\n * 画集分类类型\n * 使用枚举值作为类型\n */\nexport type CollectionCategoryType = `${CollectionCategory}` | string;\n\n/**\n * 分类信息接口\n * 包含分类值和显示名称\n */\nexport interface CategoryInfo {\n /** 分类值 */\n value: CollectionCategoryType;\n /** 显示名称 */\n displayName: string;\n /** 描述信息 */\n description?: string;\n}\n\n// ===== 基础类型定义 =====\n\n/**\n * 艺术作品页面数据结构\n * \n * 表示画集中的单个作品页面,包含图片、标题、描述等信息。\n * 每个画集包含多个这样的作品页面。\n */\nexport interface ArtworkPage {\n /** 作品的唯一标识符 */\n id: number;\n \n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片(支持URL或base64编码) */\n image: string;\n \n /** 通用文件服务的图片文件ID(新架构,可选) */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间(可选) */\n createdTime?: string;\n \n /** 作品主题(可选) */\n theme?: string;\n \n /** 作品年份(可选) */\n year?: string;\n \n /** 创作媒介(可选) */\n medium?: string;\n \n /** 作品尺寸(可选) */\n dimensions?: string;\n \n /** 在画集中的显示顺序 */\n pageOrder: number;\n \n /** 是否激活(可选,默认true) */\n isActive?: boolean;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n/**\n * 艺术画集数据结构\n * \n * 表示一个完整的艺术画集,包含多个作品页面和相关元数据。\n * 这是系统中的核心数据模型之一。\n */\nexport interface ArtCollection {\n /** 画集的唯一标识符 */\n id: number;\n \n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 画集封面图片路径 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID(新架构,可选) */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集包含的所有作品页面 */\n pages: ArtworkPage[];\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表(可选) */\n tags?: string[];\n \n /** 是否已发布(可选,默认true) */\n isPublished?: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n// ===== 配置相关类型 =====\n\n/**\n * 系统配置数据结构\n * \n * 存储ShowMasterpiece模块的全局配置信息,\n * 包括网站设置、显示选项、功能开关等。\n */\nexport interface MasterpiecesConfig {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription?: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle?: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式:light(浅色)、dark(深色)、auto(自动) */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言:zh(中文)、en(英文) */\n language: 'zh' | 'en';\n}\n\nexport interface CategoryOption {\n name: string;\n description?: string | null;\n}\n\nexport interface HomeTabConfigItem {\n name?: string;\n description?: string | null;\n category: CollectionCategoryType;\n visible: boolean;\n order: number;\n}\n\nexport const defaultHomeTabCategoryOrder: CollectionCategoryType[] = [\n CollectionCategory.CANVAS_BAG,\n CollectionCategory.SPIRAL_NOTEBOOK,\n CollectionCategory.MOUSE_PAD,\n CollectionCategory.ACRYLIC,\n CollectionCategory.BADGE,\n CollectionCategory.COLOR_PAPER,\n CollectionCategory.KEYCHAIN,\n CollectionCategory.TRANSPARENT_CARD,\n CollectionCategory.LASER_TICKET,\n];\n\nexport function buildDefaultHomeTabConfig(): HomeTabConfigItem[] {\n return [];\n}\n\nexport function normalizeHomeTabConfig(\n input?: HomeTabConfigItem[] | null,\n): HomeTabConfigItem[] {\n if (!input || input.length === 0) {\n return [];\n }\n\n const filtered = input\n .filter((item) => {\n if (!item) {\n return false;\n }\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n return typeof rawName === 'string' && rawName.trim().length > 0;\n })\n .map((item) => {\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n const name = typeof rawName === 'string' ? rawName.trim() : '';\n const description = typeof item.description === 'string' ? item.description.trim() : item.description;\n\n return {\n name,\n description: description && description.length > 0 ? description : null,\n category: name as CollectionCategoryType,\n visible: item.visible ?? true,\n order: Number.isFinite(item.order) ? Number(item.order) : 0,\n };\n });\n\n if (filtered.length === 0) {\n return [];\n }\n\n filtered.sort((a, b) => a.order - b.order);\n const normalized = filtered.map((item, index) => ({ ...item, order: index }));\n\n if (!normalized.some((item) => item.visible)) {\n const firstItem = normalized[0];\n if (firstItem) {\n normalized[0] = { ...firstItem, visible: true };\n }\n }\n\n return normalized;\n}\n\n// ===== 表单数据类型 =====\n\n/**\n * 画集表单数据结构\n * \n * 用于创建和编辑画集时的表单数据\n */\nexport interface CollectionFormData {\n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 封面图片 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表 */\ntags: string[];\n \n /** 是否已发布 */\n isPublished: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n}\n\n/**\n * 作品表单数据结构\n * \n * 用于创建和编辑作品时的表单数据\n */\nexport interface ArtworkFormData {\n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片 */\n image?: string;\n \n /** 通用文件服务的图片文件ID */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间 */\n createdTime: string;\n \n /** 作品主题 */\n theme: string;\n}\n\n/**\n * 配置表单数据结构\n * \n * 用于编辑系统配置时的表单数据\n */\nexport interface ConfigFormData {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式 */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言 */\n language: 'zh' | 'en';\n}\n\n// ===== 工具函数 =====\n\n/**\n * 获取所有可用的画集分类\n * \n * @returns 分类枚举值数组\n */\nexport function getAvailableCategories(): CollectionCategoryType[] {\n return [];\n}\n\n/**\n * 验证分类是否为有效值\n * \n * @param category - 要验证的分类值\n * @returns 是否为有效分类\n */\nexport function isValidCategory(category: string): category is CollectionCategoryType {\n if (typeof category !== 'string') {\n return false;\n }\n return category.trim().length > 0;\n}\n\n/**\n * 分类信息映射\n * 为每个分类提供完整的信息对象\n */\nexport const categories = {\n [CollectionCategory.COLLECTION]: {\n value: CollectionCategory.COLLECTION,\n displayName: '画集',\n description: '用于展示艺术作品'\n },\n [CollectionCategory.ACRYLIC]: {\n value: CollectionCategory.ACRYLIC,\n displayName: '立牌',\n description: '立牌制品'\n },\n [CollectionCategory.BADGE]: {\n value: CollectionCategory.BADGE,\n displayName: '吧唧',\n description: '徽章类商品'\n },\n [CollectionCategory.COLOR_PAPER]: {\n value: CollectionCategory.COLOR_PAPER,\n displayName: '色纸',\n description: '彩色纸张制品'\n },\n [CollectionCategory.TRANSPARENT_CARD]: {\n value: CollectionCategory.TRANSPARENT_CARD,\n displayName: '透卡',\n description: '透明卡片制品'\n },\n [CollectionCategory.POSTCARD]: {\n value: CollectionCategory.POSTCARD,\n displayName: '明信片',\n description: '明信片类商品'\n },\n [CollectionCategory.LASER_TICKET]: {\n value: CollectionCategory.LASER_TICKET,\n displayName: '镭射票',\n description: '镭射票类商品'\n },\n [CollectionCategory.CANVAS_BAG]: {\n value: CollectionCategory.CANVAS_BAG,\n displayName: '帆布包',\n description: '帆布包类商品'\n },\n [CollectionCategory.SPIRAL_NOTEBOOK]: {\n value: CollectionCategory.SPIRAL_NOTEBOOK,\n displayName: '线圈笔记本',\n description: '线圈装订笔记本'\n },\n [CollectionCategory.MOUSE_PAD]: {\n value: CollectionCategory.MOUSE_PAD,\n displayName: '鼠标垫',\n description: '鼠标垫类商品'\n },\n [CollectionCategory.SUPPORT_STICK]: {\n value: CollectionCategory.SUPPORT_STICK,\n displayName: '应援棒',\n description: '应援棒类商品'\n },\n [CollectionCategory.KEYCHAIN]: {\n value: CollectionCategory.KEYCHAIN,\n displayName: '挂件/钥匙扣',\n description: '挂件/钥匙扣类商品'\n },\n [CollectionCategory.OTHER]: {\n value: CollectionCategory.OTHER,\n displayName: '其它',\n description: '其他类型商品'\n }\n} as const satisfies Record<CollectionCategory, CategoryInfo>;\n\n\n/**\n * 获取分类的显示名称\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryDisplayName(category: CollectionCategoryType): string {\n return categories[category as CollectionCategory]?.displayName || category;\n}\n\n/**\n * 获取分类的完整信息\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryInfo(category: CollectionCategoryType): CategoryInfo {\n return categories[category as CollectionCategory] || {\n value: category,\n displayName: category,\n description: ''\n };\n}\n\n/**\n * 扩展 CollectionCategoryType,使其支持 displayName 属性访问\n * 使用方式: collection.category.displayName\n */\ndeclare global {\n interface String {\n get displayName(): string;\n get categoryInfo(): CategoryInfo;\n }\n}\n\n// 为字符串类型添加 displayName getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'displayName')) {\n Object.defineProperty(String.prototype, 'displayName', {\n get(this: string): string {\n return getCategoryDisplayName(this as CollectionCategoryType);\n }\n });\n}\n\n// 为字符串类型添加 categoryInfo getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'categoryInfo')) {\n Object.defineProperty(String.prototype, 'categoryInfo', {\n get(this: string): CategoryInfo {\n return getCategoryInfo(this as CollectionCategoryType);\n }\n });\n}\n\n/**\n * 获取分类的描述信息 (枚举调用方式)\n */\nexport const CategoryDescription = {\n [CollectionCategory.COLLECTION]: '用于展示艺术作品,包含多个作品页面的画集',\n [CollectionCategory.ACRYLIC]: '立牌制品,如亚克力立牌、展示立牌等',\n [CollectionCategory.BADGE]: '徽章类商品,如徽章、钥匙扣等',\n [CollectionCategory.COLOR_PAPER]: '彩色纸张制品,如彩色卡纸、彩色打印纸等',\n [CollectionCategory.TRANSPARENT_CARD]: '透明卡片制品,如透明卡片、透明卡等',\n [CollectionCategory.POSTCARD]: '明信片类商品,如艺术明信片、纪念明信片等',\n [CollectionCategory.LASER_TICKET]: '镭射票类商品,如演唱会门票、电影票等',\n [CollectionCategory.CANVAS_BAG]: '帆布包类商品,如帆布袋、帆布背包等',\n [CollectionCategory.SPIRAL_NOTEBOOK]: '线圈装订笔记本,如线圈笔记本、线圈装订笔记本等',\n [CollectionCategory.MOUSE_PAD]: '鼠标垫类商品,如鼠标垫、鼠标垫等',\n [CollectionCategory.SUPPORT_STICK]: '应援棒类商品,如荧光棒、应援棒等',\n [CollectionCategory.KEYCHAIN]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等',\n [CollectionCategory.OTHER]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等'\n} as const;\n\n// ===== 弹窗配置类型导出 =====\nexport type { PopupConfig, NewPopupConfig } from './popup';\n\n// ===== 上下文类型导出 =====\nexport type { CartContextState } from './context'; \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","export {\n ShowmasterConfigService,\n createShowmasterConfigService,\n} from './configService';\n\nexport {\n PopupConfigService,\n createPopupConfigService,\n} from './popupConfigService';\n\nexport {\n MasterpiecesConfigDbService,\n CategoriesDbService,\n TagsDbService,\n createMasterpiecesConfigDbService,\n createCategoriesDbService,\n createTagsDbService,\n} from './basicDbService';\n\nexport {\n initializeShowmasterpieceDb,\n masterpiecesConfigDbService,\n categoriesDbService,\n tagsDbService,\n collectionsDbService,\n artworksDbService,\n} from './masterpiecesDbService';\n\nexport {\n BookingQueryService,\n createBookingQueryService,\n} from './bookingQueryService';\n\nexport {\n BookingCommandService,\n BookingCommandError,\n createBookingCommandService,\n} from './bookingCommandService';\n\nexport {\n getShowMasterpieceFileConfig,\n} from './fileService';\n"]}
1
+ {"version":3,"sources":["../../src/showmasterpiece/server/services/fileService.ts","../../src/logger/types.ts","../../src/logger/console-adapter.ts","../../src/logger/Logger.ts","../../src/logger/index.ts","../../src/universalFile/server/utils/mime.ts","../../src/universalFile/types.ts","../../src/universalFile/server/types.ts","../../src/universalFile/server/providers/AliyunOSSProvider.ts","../../src/universalFile/server/providers/LocalStorageProvider.ts","../../src/universalFile/server/UniversalFileService.ts","../../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/types/index.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","../../src/showmasterpiece/server/services/index.ts"],"names":["localStorage","timestamp","path","init_types","FileServiceError","StorageProviderError","logger","OSS","path2","fs","existsSync","createWriteStream","pipeline","createReadStream","EventEmitter","uuidv4","AliyunOSSProvider","LocalStorageProvider","path3","createHash","basename","pgTable","serial","varchar","text","integer","boolean","json","index","uuid","relations","jsonb","db","eq","asc","and","sql","count","desc","categories","MasterpiecesConfigDbService","CategoriesDbService","TagsDbService","inArray","getShowMasterpieceFileConfig","UniversalFileService","like"],"mappings":"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","file":"db.js","sourcesContent":["export interface ShowMasterpieceFileRuntimeConfig {\n defaultStorage: string;\n storageProviders: Record<string, any>;\n defaultCDN: string;\n cdnProviders: Record<string, any>;\n maxFileSize: number;\n allowedMimeTypes: string[];\n cache: {\n metadataTTL: number;\n urlTTL: number;\n };\n}\n\ninterface ConfigManager {\n getConfig(): ShowMasterpieceFileRuntimeConfig;\n}\n\nfunction buildDefaultConfig(): ShowMasterpieceFileRuntimeConfig {\n const localStorage = {\n type: 'local',\n enabled: true,\n rootPath: process.env.FILE_STORAGE_PATH || 'uploads',\n baseUrl: process.env.FILE_BASE_URL || '/uploads',\n };\n\n const ossConfig = {\n type: 'aliyun-oss',\n enabled: false,\n region: process.env.ALIYUN_OSS_REGION || '',\n bucket: process.env.ALIYUN_OSS_BUCKET || '',\n accessKeyId: process.env.ALIYUN_OSS_ACCESS_KEY_ID || '',\n accessKeySecret: process.env.ALIYUN_OSS_ACCESS_KEY_SECRET || '',\n customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,\n secure: process.env.ALIYUN_OSS_SECURE === 'true',\n internal: process.env.ALIYUN_OSS_INTERNAL === 'true',\n };\n\n const hasOssConfig =\n !!ossConfig.region &&\n !!ossConfig.bucket &&\n !!ossConfig.accessKeyId &&\n !!ossConfig.accessKeySecret;\n\n const defaultStorage = hasOssConfig ? 'aliyun-oss' : 'local';\n ossConfig.enabled = hasOssConfig;\n\n return {\n defaultStorage,\n storageProviders: {\n local: localStorage,\n 'aliyun-oss': ossConfig,\n 'aws-s3': { type: 'aws-s3', enabled: false },\n 'qcloud-cos': { type: 'qcloud-cos', enabled: false },\n },\n defaultCDN: 'none',\n cdnProviders: {\n none: { type: 'none', enabled: false },\n 'aliyun-cdn': {\n type: 'aliyun-cdn',\n enabled: false,\n domain: process.env.ALIYUN_CDN_DOMAIN,\n accessKeyId: process.env.ALIYUN_CDN_ACCESS_KEY_ID,\n accessKeySecret: process.env.ALIYUN_CDN_ACCESS_KEY_SECRET,\n region: process.env.ALIYUN_CDN_REGION,\n },\n 'aws-cloudfront': { type: 'aws-cloudfront', enabled: false },\n 'qcloud-cdn': { type: 'qcloud-cdn', enabled: false },\n },\n maxFileSize: parseInt(process.env.MAX_FILE_SIZE || '104857600', 10),\n allowedMimeTypes: [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/ogg',\n 'audio/mp4',\n 'audio/aac',\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/webm',\n 'video/mkv',\n 'application/pdf',\n 'text/plain',\n 'application/json',\n 'application/javascript',\n 'text/css',\n 'text/html',\n 'text/markdown',\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n 'application/octet-stream',\n 'model/gltf+json',\n 'model/gltf-binary',\n ],\n cache: {\n metadataTTL: parseInt(process.env.METADATA_CACHE_TTL || '3600', 10),\n urlTTL: parseInt(process.env.URL_CACHE_TTL || '1800', 10),\n },\n };\n}\n\nexport async function getShowMasterpieceFileConfig(): Promise<ConfigManager> {\n const config = buildDefaultConfig();\n return {\n getConfig() {\n return config;\n },\n };\n}\n","/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4, // 禁用所有日志\n}\n\n/**\n * 日志条目\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n data?: any;\n context?: string;\n error?: Error;\n}\n\n/**\n * 日志适配器接口\n * 不同平台实现不同的日志输出方式\n */\nexport interface LoggerAdapter {\n /**\n * 输出日志\n */\n log(entry: LogEntry): void;\n\n /**\n * 批量输出日志(可选)\n */\n logBatch?(entries: LogEntry[]): void;\n}\n\n/**\n * 日志配置\n */\nexport interface LoggerConfig {\n /**\n * 最小日志级别\n * 只有大于等于此级别的日志才会输出\n */\n minLevel: LogLevel;\n\n /**\n * 是否启用时间戳\n */\n enableTimestamp?: boolean;\n\n /**\n * 是否启用上下文(模块名)\n */\n enableContext?: boolean;\n\n /**\n * 环境(development/production)\n */\n environment?: 'development' | 'production';\n\n /**\n * 自定义适配器\n */\n adapter?: LoggerAdapter;\n}\n\n","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","export * from './types';\nexport * from './Logger';\nexport * from './console-adapter';\n\n","/**\n * MIME 类型工具函数\n */\n\nimport * as path from 'path';\n\n/** MIME 类型映射表 */\nconst MIME_TYPES: Record<string, string> = {\n // 图片\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\n\n // 视频\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.wmv': 'video/x-ms-wmv',\n '.flv': 'video/x-flv',\n '.mkv': 'video/x-matroska',\n '.webm': 'video/webm',\n\n // 音频\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.m4a': 'audio/mp4',\n '.flac': 'audio/flac',\n '.aac': 'audio/aac',\n\n // 文档\n '.pdf': 'application/pdf',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.txt': 'text/plain',\n '.rtf': 'application/rtf',\n\n // 压缩文件\n '.zip': 'application/zip',\n '.rar': 'application/x-rar-compressed',\n '.7z': 'application/x-7z-compressed',\n '.tar': 'application/x-tar',\n '.gz': 'application/gzip',\n\n // 代码文件\n '.js': 'application/javascript',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.css': 'text/css',\n '.ts': 'application/typescript',\n\n // 其他\n '.csv': 'text/csv',\n '.md': 'text/markdown',\n};\n\n/**\n * 根据文件名获取 MIME 类型\n *\n * @param filename 文件名\n * @returns MIME 类型\n *\n * @example\n * ```typescript\n * getMimeType('photo.jpg') // 'image/jpeg'\n * getMimeType('video.mp4') // 'video/mp4'\n * getMimeType('unknown.xyz') // 'application/octet-stream'\n * ```\n */\nexport function getMimeType(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return MIME_TYPES[ext] || 'application/octet-stream';\n}\n\n/**\n * 根据 MIME 类型获取文件扩展名\n *\n * @param mimeType MIME 类型\n * @returns 文件扩展名(包含点号)\n *\n * @example\n * ```typescript\n * getExtensionFromMimeType('image/jpeg') // '.jpg'\n * getExtensionFromMimeType('video/mp4') // '.mp4'\n * ```\n */\nexport function getExtensionFromMimeType(mimeType: string): string | null {\n for (const [ext, mime] of Object.entries(MIME_TYPES)) {\n if (mime === mimeType) {\n return ext;\n }\n }\n return null;\n}\n\n/**\n * 检查是否为图片类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为图片\n */\nexport function isImageType(mimeType: string): boolean {\n return mimeType.startsWith('image/');\n}\n\n/**\n * 检查是否为视频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为视频\n */\nexport function isVideoType(mimeType: string): boolean {\n return mimeType.startsWith('video/');\n}\n\n/**\n * 检查是否为音频类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为音频\n */\nexport function isAudioType(mimeType: string): boolean {\n return mimeType.startsWith('audio/');\n}\n\n/**\n * 检查是否为文档类型\n *\n * @param mimeType MIME 类型\n * @returns 是否为文档\n */\nexport function isDocumentType(mimeType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument',\n 'text/plain',\n 'application/rtf',\n ];\n return documentTypes.some(type => mimeType.includes(type));\n}\n\n/**\n * 验证 MIME 类型是否在允许列表中\n *\n * @param mimeType MIME 类型\n * @param allowedTypes 允许的类型列表(支持通配符)\n * @returns 是否允许\n *\n * @example\n * ```typescript\n * isAllowedMimeType('image/jpeg', ['image/*']) // true\n * isAllowedMimeType('video/mp4', ['image/*']) // false\n * isAllowedMimeType('image/png', ['image/jpeg']) // false\n * ```\n */\nexport function isAllowedMimeType(\n mimeType: string,\n allowedTypes: string[]\n): boolean {\n return allowedTypes.some(allowed => {\n if (allowed === '*/*') {\n return true;\n }\n if (allowed.endsWith('/*')) {\n const prefix = allowed.slice(0, -2);\n return mimeType.startsWith(prefix + '/');\n }\n return mimeType === allowed;\n });\n}\n\n","/**\n * 通用文件服务类型定义\n *\n * 定义了文件存储、上传、下载等核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 文件存储类型 */\nexport type StorageType = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';\n\n/** CDN提供者类型 */\nexport type CDNType = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';\n\n/** 文件处理类型 */\nexport type ProcessorType = 'image' | 'audio' | 'video' | 'document';\n\n/** 文件上传状态 */\nexport type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';\n\n/** 访问权限类型 */\nexport type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';\n\n// ============= 文件元数据接口 =============\n\n/** 文件元数据基础接口 */\nexport interface FileMetadata {\n /** 文件ID */\n id: string;\n /** 原始文件名 */\n originalName: string;\n /** 存储文件名 */\n storageName: string;\n /** 文件大小(字节) */\n size: number;\n /** MIME类型 */\n mimeType: string;\n /** 文件扩展名 */\n extension: string;\n /** 文件哈希值 */\n hash?: string;\n /** 上传时间 */\n uploadTime: Date;\n /** 访问权限 */\n permission: AccessPermission;\n /** 上传者ID */\n uploaderId: string;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 存储提供者 */\n storageProvider: StorageType;\n /** 存储路径 */\n storagePath: string;\n /** CDN URL */\n cdnUrl?: string;\n /** 访问次数 */\n accessCount: number;\n /** 最后访问时间 */\n lastAccessTime?: Date;\n /** 过期时间 */\n expiresAt?: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** 上传文件信息(客户端使用) */\nexport interface UploadFileInfo {\n /** 文件对象 */\n file: File;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 自定义存储路径 */\n customPath?: string;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n /** 是否需要处理 */\n needsProcessing?: boolean;\n /** 处理选项 */\n processingOptions?: ProcessingOptions;\n}\n\n/** 文件处理选项基础接口 */\nexport interface ProcessingOptions {\n /** 处理器类型 */\n type: ProcessorType;\n /** 处理参数 */\n params?: Record<string, any>;\n}\n\n/** 图片处理选项 */\nexport interface ImageProcessingOptions extends ProcessingOptions {\n type: 'image';\n /** 压缩质量 0-100 */\n quality?: number;\n /** 目标宽度 */\n width?: number;\n /** 目标高度 */\n height?: number;\n /** 格式转换 */\n format?: 'jpeg' | 'png' | 'webp' | 'avif';\n /** 是否添加水印 */\n watermark?: boolean;\n /** 水印配置 */\n watermarkOptions?: {\n text?: string;\n image?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';\n opacity?: number;\n };\n}\n\n/** 音频处理选项 */\nexport interface AudioProcessingOptions extends ProcessingOptions {\n type: 'audio';\n /** 比特率 */\n bitrate?: number;\n /** 格式转换 */\n format?: 'mp3' | 'wav' | 'ogg' | 'aac';\n /** 采样率 */\n sampleRate?: number;\n /** 声道数 */\n channels?: number;\n}\n\n/** 视频处理选项 */\nexport interface VideoProcessingOptions extends ProcessingOptions {\n type: 'video';\n /** 视频质量 */\n quality?: number;\n /** 格式转换 */\n format?: 'mp4' | 'avi' | 'mov' | 'webm';\n /** 生成缩略图 */\n generateThumbnail?: boolean;\n /** 缩略图时间点(秒) */\n thumbnailTime?: number;\n}\n\n// ============= 上传相关接口 =============\n\n/** 上传进度 */\nexport interface UploadProgress {\n /** 文件ID */\n fileId: string;\n /** 上传状态 */\n status: UploadStatus;\n /** 进度百分比(0-100) */\n progress: number;\n /** 已上传字节数 */\n uploadedBytes: number;\n /** 总字节数 */\n totalBytes: number;\n /** 上传速度(字节/秒) */\n speed: number;\n /** 剩余时间(秒) */\n remainingTime: number;\n /** 错误信息 */\n error?: string;\n}\n\n/** 上传结果 */\nexport interface UploadResult {\n /** 是否成功 */\n success: boolean;\n /** 文件元数据 */\n file?: FileMetadata;\n /** 文件访问URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 查询相关接口 =============\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块标识 */\n moduleId?: string;\n /** 业务标识 */\n businessId?: string;\n /** 上传者ID */\n uploaderId?: string;\n /** MIME类型过滤 */\n mimeType?: string;\n /** 最小文件大小 */\n minSize?: number;\n /** 最大文件大小 */\n maxSize?: number;\n /** 开始时间 */\n startTime?: Date;\n /** 结束时间 */\n endTime?: Date;\n /** 搜索关键词 */\n keyword?: string;\n /** 标签 */\n tags?: string[];\n /** 排序字段 */\n sortBy?: string;\n /** 排序方向 */\n sortOrder?: 'asc' | 'desc';\n /** 页码 */\n page?: number;\n /** 每页数量 */\n pageSize?: number;\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据项 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n /** 是否有下一页 */\n hasNext: boolean;\n /** 是否有上一页 */\n hasPrev: boolean;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 事件相关接口 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'processing:start'\n | 'processing:complete'\n | 'processing:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件ID */\n fileId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 文件事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 异常类定义 =============\n\n/** 文件服务基础异常 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传错误 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理错误 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者错误 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者错误 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n\n","/**\n * UniversalFile Server 端类型定义\n */\n\nimport type {\n StorageType as _StorageType,\n CDNType as _CDNType,\n ProcessorType as _ProcessorType,\n FileMetadata,\n UploadStatus,\n AccessPermission,\n UploadFileInfo as _UploadFileInfo,\n ProcessingOptions as _ProcessingOptions,\n} from '../types';\n\n// Re-export client types for server use\nexport type StorageType = _StorageType;\nexport type CDNType = _CDNType;\nexport type ProcessorType = _ProcessorType;\nexport type UploadFileInfo = _UploadFileInfo;\nexport type ProcessingOptions = _ProcessingOptions;\n\n// ============= Provider 接口 =============\n\n/** 存储提供者接口 */\nexport interface IStorageProvider {\n /** 提供者类型 */\n readonly type: StorageType;\n\n /** 初始化 */\n initialize(config: StorageConfig): Promise<void>;\n\n /** 上传文件 */\n upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;\n\n /** 下载文件 */\n download(path: string): Promise<Buffer>;\n\n /** 删除文件 */\n delete(path: string): Promise<StorageResult>;\n\n /** 获取文件信息 */\n getFileInfo(path: string): Promise<StorageResult>;\n\n /** 生成访问URL */\n getAccessUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 生成预签名上传URL */\n getUploadUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 检查文件是否存在 */\n exists(path: string): Promise<boolean>;\n\n /** 列出文件 */\n list(prefix: string, maxKeys?: number): Promise<string[]>;\n}\n\n/** CDN 提供者接口 */\nexport interface ICDNProvider {\n /** 提供者类型 */\n readonly type: CDNType;\n\n /** 初始化 */\n initialize(config: CDNConfig): Promise<void>;\n\n /** 生成CDN URL */\n generateUrl(originalUrl: string): Promise<string>;\n\n /** 刷新缓存 */\n refreshCache(urls: string[]): Promise<CDNResult>;\n\n /** 预热缓存 */\n preheatCache(urls: string[]): Promise<CDNResult>;\n\n /** 获取访问统计 */\n getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;\n}\n\n/** 文件处理器接口 */\nexport interface IFileProcessor {\n /** 处理器类型 */\n readonly type: ProcessorType;\n\n /** 初始化 */\n initialize(): Promise<void>;\n\n /** 处理文件 */\n process(\n inputPath: string,\n outputPath: string,\n options: ProcessingOptions\n ): Promise<ProcessingResult>;\n\n /** 检查文件是否支持处理 */\n supports(mimeType: string): boolean;\n\n /** 获取文件信息 */\n getFileInfo(filePath: string): Promise<Record<string, any>>;\n}\n\n// ============= 配置接口 =============\n\n/** 存储配置基础接口 */\nexport interface StorageConfig {\n /** 存储类型 */\n type: StorageType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 本地存储配置 */\nexport interface LocalStorageConfig extends StorageConfig {\n type: 'local';\n /** 存储根目录 */\n rootPath: string;\n /** 基础URL */\n baseUrl: string;\n}\n\n/** 阿里云 OSS 配置 */\nexport interface AliyunOSSConfig extends StorageConfig {\n type: 'aliyun-oss';\n /** 地域 */\n region: string;\n /** 存储桶名称 */\n bucket: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 自定义域名 */\n customDomain?: string;\n /** 是否使用HTTPS */\n secure?: boolean;\n /** 是否使用内网访问 */\n internal?: boolean;\n}\n\n/** CDN配置基础接口 */\nexport interface CDNConfig {\n /** CDN类型 */\n type: CDNType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 阿里云 CDN 配置 */\nexport interface AliyunCDNConfig extends CDNConfig {\n type: 'aliyun-cdn';\n /** CDN域名 */\n domain: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 地域 */\n region?: string;\n}\n\n/** 缓存配置 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 最大缓存大小 */\n maxSize?: number;\n /** 缓存 TTL(秒) */\n ttl?: number;\n /** 是否使用 Redis */\n useRedis?: boolean;\n /** Redis 配置 */\n redisConfig?: {\n host: string;\n port: number;\n password?: string;\n db?: number;\n };\n}\n\n/** 文件服务配置 */\n/** 缓存配置扩展 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 元数据缓存TTL(秒) */\n metadataTTL?: number;\n /** URL缓存TTL(秒) */\n urlTTL?: number;\n /** 最大缓存条目数 */\n maxSize?: number;\n}\n\nexport interface UniversalFileServiceConfig {\n /** 存储配置 */\n storage: StorageConfig;\n /** CDN 配置(可选) */\n cdn?: CDNConfig;\n /** 缓存配置(可选) */\n cache?: CacheConfig;\n /** 数据库持久化配置(可选) */\n persistence?: FileServicePersistenceConfig;\n /** 启用的处理器 */\n processors?: ProcessorType[];\n /** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */\n db?: any;\n /** 最大文件大小(字节) */\n maxFileSize?: number;\n /** 允许的文件类型 */\n allowedMimeTypes?: string[];\n /** 是否启用监控 */\n enableMonitoring?: boolean;\n\n // 运行时字段(由服务类内部管理)\n /** 存储提供者映射(内部使用) */\n storageProviders?: Map<StorageType, IStorageProvider>;\n /** 默认存储类型 */\n defaultStorage?: StorageType;\n /** 默认CDN类型 */\n defaultCDN?: CDNType;\n}\n\n// ============= 结果类型 =============\n\n/** 存储结果 */\n/** 存储操作结果 */\nexport interface StorageResult {\n /** 是否成功 */\n success: boolean;\n /** 存储路径 */\n path?: string;\n /** 访问URL */\n url?: string;\n /** 文件大小 */\n size?: number;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 存储元数据 */\nexport interface StorageMetadata {\n /** 文件大小 */\n size: number;\n /** MIME 类型 */\n mimeType: string;\n /** 最后修改时间 */\n lastModified: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** CDN 结果 */\n/** CDN操作结果 */\nexport interface CDNResult {\n /** 是否成功 */\n success: boolean;\n /** CDN URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** CDN 统计信息 */\nexport interface CDNStats {\n /** 带宽(字节/秒) */\n bandwidth: number;\n /** 请求数 */\n requests: number;\n /** 流量(字节) */\n traffic: number;\n /** 统计时间范围 */\n timeRange: {\n start: Date;\n end: Date;\n };\n}\n\n/** 处理结果 */\nexport interface ProcessingResult {\n /** 是否成功 */\n success: boolean;\n /** 处理后的文件路径 */\n processedPath?: string;\n /** 处理后的文件大小 */\n processedSize?: number;\n /** 缩略图路径 */\n thumbnailPath?: string;\n /** 错误信息 */\n error?: string;\n /** 处理耗时(毫秒) */\n processingTime?: number;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 处理器信息 */\nexport interface ProcessorInfo {\n /** 处理器名称 */\n name: string;\n /** 处理器版本 */\n version: string;\n /** 支持的格式 */\n supportedFormats: string[];\n /** 支持的操作 */\n supportedOperations: string[];\n}\n\n// ============= 数据库相关类型 =============\n\n/** 文件数据库记录 */\nexport interface FileRecord extends FileMetadata {\n /** 创建时间 */\n createdAt: Date | string;\n /** 更新时间 */\n updatedAt: Date | string;\n}\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块 ID */\n moduleId?: string;\n /** 业务 ID */\n businessId?: string;\n /** 上传者 ID */\n uploaderId?: string;\n /** 文件类型 */\n mimeType?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 状态 */\n status?: UploadStatus;\n /** 分页 */\n page?: number;\n pageSize?: number;\n /** 排序 */\n orderBy?: string;\n orderDirection?: 'asc' | 'desc';\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据列表 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页 */\n page: number;\n /** 每页大小 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n}\n\n// ============= 事件类型 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'delete:error'\n | 'process:start'\n | 'process:complete'\n | 'process:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件 ID */\n fileId: string;\n /** 事件数据 */\n data?: any;\n /** 时间戳 */\n timestamp: Date;\n}\n\n/** 事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 数据库持久化接口 =============\n\n/**\n * 文件元数据数据库持久化接口\n *\n * 实现此接口以提供自定义的数据库持久化支持\n *\n * @example\n * ```typescript\n * // Drizzle ORM 实现\n * class DrizzleFileRepository implements IFileMetadataRepository {\n * async save(metadata: FileMetadata): Promise<void> {\n * await db.insert(fileMetadata).values(metadata);\n * }\n * // ... 其他方法\n * }\n * ```\n */\nexport interface IFileMetadataRepository {\n /**\n * 保存文件元数据到数据库\n */\n save(metadata: FileMetadata): Promise<void>;\n\n /**\n * 从数据库获取文件元数据\n */\n get(fileId: string): Promise<FileMetadata | null>;\n\n /**\n * 查询文件列表\n */\n query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;\n\n /**\n * 从数据库删除文件元数据\n */\n delete(fileId: string): Promise<void>;\n\n /**\n * 批量删除文件元数据\n */\n batchDelete(fileIds: string[]): Promise<void>;\n}\n\n/**\n * 数据库持久化配置\n */\nexport interface FileServicePersistenceConfig {\n /**\n * 是否启用持久化\n */\n enabled: boolean;\n\n /**\n * 持久化仓储实现\n */\n repository: IFileMetadataRepository;\n\n /**\n * 是否自动持久化(默认 true)\n * 如果为 true,文件上传完成后自动保存到数据库\n */\n autoPersist?: boolean;\n\n /**\n * 是否优先使用缓存(默认 false)\n * 如果为 true,查询时优先从缓存获取\n */\n cacheFirst?: boolean;\n}\n\n// ============= 异常类型定义 =============\n\n/** 文件服务异常基类 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传异常 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理异常 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者异常 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者异常 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n","/**\n * 阿里云OSS存储提供者实现\n */\n\nimport OSS from 'ali-oss';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n AliyunOSSConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('AliyunOSSProvider');\n\n/**\n * 阿里云OSS存储提供者\n */\nexport class AliyunOSSProvider implements IStorageProvider {\n readonly type: StorageType = 'aliyun-oss';\n\n private config: AliyunOSSConfig | null = null;\n private client: OSS | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n return this.reinitialize(config);\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitialize(config: StorageConfig): Promise<void> {\n logger.info('🔄 [AliyunOSSProvider] 重新初始化OSS客户端', config);\n if (config.type !== 'aliyun-oss') {\n throw new StorageProviderError('配置类型不匹配:期望 aliyun-oss');\n }\n\n const newConfig = config as AliyunOSSConfig;\n\n // 检查配置是否发生变化\n const configChanged =\n !this.config ||\n this.config.region !== newConfig.region ||\n this.config.bucket !== newConfig.bucket ||\n this.config.accessKeyId !== newConfig.accessKeyId ||\n this.config.accessKeySecret !== newConfig.accessKeySecret ||\n this.config.customDomain !== newConfig.customDomain ||\n this.config.secure !== newConfig.secure ||\n this.config.internal !== newConfig.internal;\n\n if (configChanged) {\n logger.info('🔄 [AliyunOSSProvider] 检测到配置变化,重新初始化OSS客户端');\n logger.info(\n '☁️ [AliyunOSSProvider] 新配置: bucket=' + (newConfig.bucket) + ', region=' + (newConfig.region)\n );\n } else if (this.isInitialized) {\n logger.info('ℹ️ [AliyunOSSProvider] 配置未变化,跳过重新初始化');\n return;\n }\n\n this.config = newConfig;\n\n logger.info('☁️ [AliyunOSSProvider] ' + (this.isInitialized ? '重新' : '') + '初始化阿里云OSS');\n logger.info('☁️ [AliyunOSSProvider] ' + (this.config ? JSON.stringify(this.config) : ''));\n\n try {\n // 验证必需的配置项\n this.validateConfig();\n\n // 确保配置值是有效的字符串\n if (!this.config.region || typeof this.config.region !== 'string') {\n throw new Error('OSS region 必须是有效的字符串');\n }\n if (!this.config.bucket || typeof this.config.bucket !== 'string') {\n throw new Error('OSS bucket 必须是有效的字符串');\n }\n if (!this.config.accessKeyId || typeof this.config.accessKeyId !== 'string') {\n throw new Error('OSS accessKeyId 必须是有效的字符串');\n }\n if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== 'string') {\n throw new Error('OSS accessKeySecret 必须是有效的字符串');\n }\n\n logger.info(`☁️ [AliyunOSSProvider] 创建OSS客户端配置:`, {\n region: this.config.region,\n bucket: this.config.bucket,\n hasAccessKeyId: !!this.config.accessKeyId,\n hasAccessKeySecret: !!this.config.accessKeySecret,\n secure: this.config.secure !== false,\n internal: this.config.internal || false,\n cname: !!this.config.customDomain,\n endpoint: this.config.customDomain || '默认端点',\n });\n\n // 创建OSS客户端\n this.client = new OSS({\n region: this.config.region,\n bucket: this.config.bucket,\n accessKeyId: this.config.accessKeyId,\n accessKeySecret: this.config.accessKeySecret,\n secure: this.config.secure !== false, // 默认使用HTTPS\n internal: this.config.internal || false, // 默认使用公网\n timeout: 300000, // 5分钟超时\n cname: !!this.config.customDomain, // 是否使用自定义域名\n endpoint: this.config.customDomain || undefined,\n });\n\n if (!this.client) {\n throw new Error('OSS客户端创建失败');\n }\n logger.info(`☁️ [AliyunOSSProvider] OSS客户端创建成功`);\n this.isInitialized = true;\n logger.info('✅ [AliyunOSSProvider] 阿里云OSS' + (configChanged ? '重新' : '') + '初始化完成');\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 阿里云OSS初始化失败:', error);\n throw new StorageProviderError(`阿里云OSS初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始上传文件到OSS: ' + (filePath));\n\n try {\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 构建上传选项\n const options: any = {\n headers: {\n 'Content-Type': fileInfo.file.type || 'application/octet-stream',\n 'Content-Length': fileInfo.file.size.toString(),\n },\n meta: {\n uid: 0, // 必需字段\n pid: 0, // 必需字段\n originalName: encodeURIComponent(fileInfo.file.name),\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId || '',\n uploadTime: new Date().toISOString(),\n // 对元数据进行编码处理,避免中文字符问题\n ...this.encodeMetadata(fileInfo.metadata || {}),\n },\n };\n\n // 根据文件大小选择上传方式\n let result: any;\n\n if (fileInfo.file.size > 100 * 1024 * 1024) {\n // 大于100MB使用分片上传\n logger.info(\n '📦 [AliyunOSSProvider] 使用分片上传大文件: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.multipartUpload(filePath, buffer, options);\n } else {\n logger.info(\n '📤 [AliyunOSSProvider] 使用普通上传: ' + (filePath) + ', 大小: ' + (fileInfo.file.size)\n );\n result = await this.client?.put(filePath, buffer, options);\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: fileInfo.file.size,\n data: {\n etag: result.data ? JSON.stringify(result.data) : '',\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(filePath: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [AliyunOSSProvider] 开始从OSS下载文件: ' + (filePath));\n\n try {\n const result = await this.client?.get(filePath) as any;\n\n if (!result.content || !Buffer.isBuffer(result.content)) {\n throw new StorageProviderError('下载的文件内容格式错误');\n }\n\n logger.info(\n '✅ [AliyunOSSProvider] 文件下载完成: ' + (filePath) + ', 大小: ' + (result.content.length)\n );\n\n return result.content;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件下载失败: ' + (filePath) + ':', error);\n\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n throw new StorageProviderError(`文件不存在`);\n }\n\n throw new StorageProviderError(`文件下载失败`);\n }\n }\n\n /**\n * 删除文件\n */\n async delete(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始从OSS删除文件: ' + (filePath));\n\n try {\n const result = await this.client?.delete(filePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件删除完成: ' + (filePath));\n\n return {\n success: true,\n data: {\n requestId: result?.res?.rt || 0,\n deletedPath: filePath,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件删除失败: ' + (filePath) + ':', error);\n\n // OSS中删除不存在的文件不会报错,但我们统一处理\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n logger.warn('⚠️ [AliyunOSSProvider] 文件不存在: ' + (filePath));\n return {\n success: true,\n data: { reason: 'file_not_exists' },\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const result = await this.client?.head(filePath) as any;\n\n return {\n success: true,\n size: parseInt(String(result.meta['content-length'] || '0')),\n data: {\n etag: result.meta.etag || '',\n lastModified: result.meta['last-modified'] || '',\n contentType: result.meta['content-type'],\n meta: result.meta,\n size: parseInt(String(result.meta['content-length'] || '0')),\n },\n };\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n // 对于图片文件,直接返回公开URL,避免CORS问题\n // 对于其他文件,使用签名URL\n const isImage = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);\n\n if (isImage) {\n // 图片文件使用公开URL\n return this.generateAccessUrl(filePath);\n } else {\n // 其他文件使用签名URL\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'GET',\n });\n\n return signedUrl || '' ;\n }\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成访问URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成访问URL失败`);\n }\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(filePath: string, expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n try {\n const expires = expiresIn || 3600; // 默认1小时\n const signedUrl = this.client?.signatureUrl(filePath, {\n expires,\n method: 'PUT',\n });\n\n return signedUrl || '' ;\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 生成上传URL失败: ' + (filePath) + ':', error);\n throw new StorageProviderError(`生成上传URL失败`);\n }\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(filePath: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n await this.client?.head(filePath);\n return true;\n } catch (error) {\n if (this.isOSSError(error) && error.code === 'NoSuchKey') {\n return false;\n }\n // 其他错误也视为文件不存在\n logger.warn('⚠️ [AliyunOSSProvider] 检查文件存在性时出错: ' + (filePath) + ':', error);\n return false;\n }\n }\n\n /**\n * 列出文件(详细信息)\n */\n async listFiles(prefix: string, delimiter: string = '/', maxKeys: number = 1000): Promise<{\n files: Array<{\n name: string;\n url: string;\n size: number;\n lastModified: string;\n etag: string;\n type: string;\n }>;\n folders: string[];\n nextMarker?: string;\n }> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n delimiter,\n 'max-keys': String(maxKeys),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n const files = (result.objects || []).map((obj: any) => ({\n name: obj.name,\n url: this.generateAccessUrl(obj.name),\n size: obj.size,\n lastModified: obj.lastModified,\n etag: obj.etag,\n type: 'file',\n }));\n\n const folders = result.prefixes || [];\n\n return {\n files,\n folders,\n nextMarker: result.nextMarker,\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n throw new StorageProviderError(`列出文件失败`);\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const options: any = {\n prefix,\n 'max-keys': String(maxKeys || 1000),\n };\n\n const result = await this.client?.list(options, {}) as any;\n\n return result.objects?.map((obj: any) => obj.name) || [];\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.client || !this.config) {\n throw new StorageProviderError('OSS存储提供者未初始化');\n }\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n const required = ['region', 'bucket', 'accessKeyId', 'accessKeySecret'];\n const missing = required.filter((key) => !this.config![key as keyof AliyunOSSConfig]);\n\n if (missing.length > 0) {\n throw new StorageProviderError(`OSS配置缺少必需项`);\n }\n }\n\n /**\n * 测试连接\n */\n private async testConnection(): Promise<void> {\n \n }\n\n /**\n * 分片上传大文件\n */\n private async multipartUpload(filePath: string, buffer: Buffer, options: any): Promise<any> {\n logger.info(`📦 [AliyunOSSProvider] 使用多分片上传`);\n\n // 使用OSS的multipartUpload方法\n const result = await this.client?.multipartUpload(filePath, buffer, {\n partSize: 10 * 1024 * 1024, // 10MB per chunk\n parallel: 4, // 并发数\n progress: (p: number) => {\n if (p % 0.1 < 0.01) {\n // 每10%显示一次进度\n logger.info('📦 [AliyunOSSProvider] 上传进度: ' + ((p * 100).toFixed(1)) + '%');\n }\n },\n meta: options.meta,\n headers: options.headers,\n });\n\n return {\n name: result?.name || '',\n url: result?.name || '', // OSS返回的是object名称\n data: result?.data || {},\n res: result?.res || {},\n };\n }\n\n /**\n * 生成公开访问URL\n */\n private generateAccessUrl(filePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('OSS配置为空');\n }\n\n // 确保文件路径不以斜杠开头\n const normalizedPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;\n\n if (this.config.customDomain) {\n // 使用自定义域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.customDomain) + '/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用自定义域名: ' + (url));\n return url;\n } else {\n // 使用默认OSS域名\n const protocol = this.config.secure !== false ? 'https' : 'http';\n const url = (protocol) + '://' + (this.config.bucket) + '.' + (this.config.region) + '.aliyuncs.com/' + (normalizedPath);\n logger.info('🔗 [AliyunOSSProvider] 使用默认OSS域名: ' + (url));\n return url;\n }\n }\n\n /**\n * 判断是否为OSS错误\n */\n private isOSSError(\n error: any\n ): error is { code: string; name: string; message: string; requestId?: string } {\n // 安全地检查错误属性,避免生产环境中的压缩问题\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n return typeof error.code === 'string' &&\n typeof (error.name || '') === 'string' &&\n typeof (error.message || '') === 'string';\n }\n\n /**\n * 格式化OSS错误信息\n */\n private formatOSSError(error: any): string {\n // if (this.isOSSError(error)) {\n // const requestId = error.requestId ? ' (RequestId: ' + (error.requestId) + ')' : '';\n // return (error.code) + ': ' + (error.message) + (requestId);\n // }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return '未知错误';\n }\n\n /**\n * 流式上传(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string,\n contentType?: string,\n contentLength?: number\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [AliyunOSSProvider] 开始流式上传文件到OSS: ' + (filePath));\n\n try {\n const options: any = {\n timeout: 300000,\n mime: contentType || 'application/octet-stream',\n meta: { uid: 0, pid: 0 },\n callback: { url: '', body: '' },\n headers: {} as any,\n };\n\n if (contentLength) {\n options.headers['Content-Length'] = contentLength.toString();\n }\n\n const result = await this.client?.putStream(filePath, readableStream, options) as any;\n\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [AliyunOSSProvider] 流式上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: contentLength,\n data: {\n name: result.name,\n requestId: result.res?.rt || 0,\n uploadTime,\n ossUrl: result.url || result.name,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDelete(filePaths: string[]): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [AliyunOSSProvider] 开始批量删除文件,数量: ' + (filePaths.length));\n\n try {\n const result = await this.client?.deleteMulti(filePaths, {\n quiet: false, // 返回删除结果\n }) as any;\n\n logger.info('✅ [AliyunOSSProvider] 批量删除完成,成功: ' + (result.deleted?.length || 0));\n\n return {\n success: true,\n data: {\n deleted: result.deleted,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error(`❌ [AliyunOSSProvider] 批量删除失败:`, error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 复制文件\n */\n async copy(sourcePath: string, targetPath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('📋 [AliyunOSSProvider] 开始复制文件: ' + (sourcePath) + ' -> ' + (targetPath));\n\n try {\n const result = await this.client?.copy(targetPath, sourcePath) as any;\n\n logger.info('✅ [AliyunOSSProvider] 文件复制完成: ' + (sourcePath) + ' -> ' + (targetPath));\n\n return {\n success: true,\n data: {\n etag: result.data?.etag,\n lastModified: result.data?.lastModified,\n requestId: result.res?.rt || 0,\n },\n };\n } catch (error) {\n logger.error('❌ [AliyunOSSProvider] 文件复制失败: ' + (sourcePath) + ' -> ' + (targetPath) + ':', error);\n\n return {\n success: false,\n error: this.formatOSSError(error),\n };\n }\n }\n\n /**\n * 编码元数据,避免中文字符在HTTP头部中的问题\n */\n private encodeMetadata(metadata: Record<string, any>): Record<string, string> {\n const encoded: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== null && value !== undefined) {\n // 将值转换为字符串并进行URL编码\n const stringValue = String(value);\n encoded[key] = encodeURIComponent(stringValue);\n }\n }\n\n return encoded;\n }\n}\n\n","/**\n * 本地存储提供者实现\n */\n\nimport { promises as fs } from 'fs';\nimport { existsSync, createReadStream, createWriteStream } from 'fs';\nimport * as path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n LocalStorageConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('LocalStorageProvider');\n\n/**\n * 本地文件系统存储提供者\n */\nexport class LocalStorageProvider implements IStorageProvider {\n readonly type: StorageType = 'local';\n\n private config: LocalStorageConfig | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'local') {\n throw new StorageProviderError('配置类型不匹配:期望 local');\n }\n\n this.config = config as LocalStorageConfig;\n\n logger.info('📂 [LocalStorageProvider] 初始化本地存储,根目录: ' + (this.config.rootPath));\n\n try {\n // 确保根目录存在\n await this.ensureDirectoryExists(this.config.rootPath);\n\n // 验证目录访问权限\n await this.validateDirectoryAccess(this.config.rootPath);\n\n this.isInitialized = true;\n logger.info('✅ [LocalStorageProvider] 本地存储初始化完成');\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 本地存储初始化失败:', error);\n throw new StorageProviderError(`本地存储初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始上传文件: ' + (filePath));\n\n try {\n // 生成完整文件路径\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 写入文件\n await fs.writeFile(fullPath, buffer);\n\n // 验证文件写入\n const stats = await fs.stat(fullPath);\n\n if (stats.size !== fileInfo.file.size) {\n throw new StorageProviderError(\n '文件大小不匹配: 期望 ' + (fileInfo.file.size) + ', 实际 ' + (stats.size)\n );\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [LocalStorageProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '上传失败',\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(path: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [LocalStorageProvider] 开始下载文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n // 读取文件\n const buffer = await fs.readFile(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件下载完成: ' + (path) + ', 大小: ' + (buffer.length));\n\n return buffer;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件下载失败: ' + (path) + ':', error);\n throw new StorageProviderError(\n '文件下载失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 删除文件\n */\n async delete(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [LocalStorageProvider] 开始删除文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n logger.warn('⚠️ [LocalStorageProvider] 文件不存在: ' + (path));\n return {\n success: true, // 文件不存在也视为删除成功\n data: { reason: 'file_not_exists' },\n };\n }\n\n // 删除文件\n await fs.unlink(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件删除完成: ' + (path));\n\n return {\n success: true,\n data: { deletedPath: fullPath },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件删除失败: ' + (path) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '删除失败',\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n const stats = await fs.stat(fullPath);\n\n return {\n success: true,\n size: stats.size,\n data: {\n fullPath,\n size: stats.size,\n mtime: stats.mtime,\n ctime: stats.ctime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '获取文件信息失败',\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持过期时间,忽略expiresIn参数\n return this.generateAccessUrl(path);\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持预签名上传,返回普通访问URL\n logger.warn(`⚠️ [LocalStorageProvider] 本地存储不支持预签名上传URL`);\n return this.generateAccessUrl(path);\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(path: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n return existsSync(fullPath);\n } catch {\n return false;\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const fullPrefix = this.getFullPath(prefix);\n const baseDir = path.dirname(fullPrefix);\n const filePattern = path.basename(fullPrefix);\n\n if (!existsSync(baseDir)) {\n return [];\n }\n\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => name.startsWith(filePattern))\n .map((name) => path.join(path.dirname(prefix), name));\n\n // 限制返回数量\n if (maxKeys && maxKeys > 0) {\n files = files.slice(0, maxKeys);\n }\n\n return files;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n }\n\n /**\n * 获取完整文件路径\n */\n private getFullPath(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 防止路径遍历攻击\n const normalizedPath = path.normalize(relativePath);\n if (normalizedPath.includes('..')) {\n throw new StorageProviderError('非法路径:不允许使用父目录引用');\n }\n\n return path.join(this.config.rootPath, normalizedPath);\n }\n\n /**\n * 生成访问URL\n */\n private generateAccessUrl(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 规范化路径分隔符为URL格式\n const urlPath = relativePath.replace(/\\\\/g, '/');\n\n // 确保URL路径以/开头\n const normalizedUrlPath = urlPath.startsWith('/') ? urlPath : '/' + (urlPath);\n\n return (this.config.baseUrl) + (normalizedUrlPath);\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // 如果目录已存在,忽略错误\n if (error instanceof Error && 'code' in error && error.code !== 'EEXIST') {\n throw error;\n }\n }\n }\n\n /**\n * 验证目录访问权限\n */\n private async validateDirectoryAccess(dirPath: string): Promise<void> {\n try {\n // 检查读写权限\n await fs.access(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch (error) {\n throw new StorageProviderError(\n '目录访问权限不足: ' + (dirPath) + ', ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 流式上传大文件(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始流式上传文件: ' + (filePath));\n\n try {\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 创建写入流\n const writeStream = createWriteStream(fullPath);\n\n // 使用pipeline进行流式传输\n await pipeline(readableStream, writeStream);\n\n // 获取文件信息\n const stats = await fs.stat(fullPath);\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(\n '✅ [LocalStorageProvider] 流式上传完成: ' + (filePath) + ', 大小: ' + (stats.size) + ', 耗时: ' + (uploadTime) + 'ms'\n );\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '流式上传失败',\n };\n }\n }\n\n /**\n * 流式下载大文件(可选实现)\n */\n createDownloadStream(path: string): NodeJS.ReadableStream {\n this.ensureInitialized();\n\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n return createReadStream(fullPath);\n }\n}\n\n","/**\n * 通用文件服务核心实现\n *\n * 提供统一的文件上传、下载、管理接口\n */\n\nimport { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createHash } from 'crypto';\nimport * as path from 'path';\nimport { createLogger } from '../../logger';\nimport { getMimeType } from './utils/mime';\n\nconst logger = createLogger('UniversalFileService');\n\nimport type {\n StorageType,\n CDNType,\n ProcessorType,\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n FileEvent,\n FileEventListener,\n UploadStatus,\n} from '../types';\n\n// Backend specific types\nimport type {\n UniversalFileServiceConfig,\n IStorageProvider,\n ICDNProvider,\n IFileProcessor,\n} from './types';\n\nimport {\n FileUploadError,\n FileProcessingError,\n StorageProviderError,\n} from '../types';\n\n/**\n * 通用文件服务类\n */\nexport class UniversalFileService extends EventEmitter {\n private config: UniversalFileServiceConfig;\n private storageProviders = new Map<StorageType, IStorageProvider>();\n private cdnProviders = new Map<CDNType, ICDNProvider>();\n private fileProcessors = new Map<ProcessorType, IFileProcessor>();\n private uploadProgressMap = new Map<string, UploadProgress>();\n private metadataCache = new Map<string, { data: FileMetadata; expires: number }>();\n private urlCache = new Map<string, { url: string; expires: number }>();\n private processingQueue: Array<{\n fileId: string;\n processor: IFileProcessor;\n inputPath: string;\n outputPath: string;\n options: any;\n }> = [];\n private isProcessingQueueRunning = false;\n\n constructor(config: UniversalFileServiceConfig) {\n super();\n this.config = config;\n\n // 如果启用了持久化,设置自动监听器\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n this.setupPersistenceListeners();\n }\n }\n\n // ============= 持久化设置 =============\n\n /**\n * 设置数据库持久化监听器\n *\n * 当文件上传完成或删除时,自动触发数据库操作\n */\n private setupPersistenceListeners(): void {\n const { repository, autoPersist = true } = this.config.persistence!;\n\n if (!autoPersist) {\n logger.info('⚙️ [UniversalFileService] 自动持久化已禁用');\n return;\n }\n\n logger.info('✅ [UniversalFileService] 已启用数据库持久化,自动监听文件事件');\n\n // 监听文件上传完成事件\n this.on('upload:complete', async (fileId: string, data: any) => {\n try {\n const metadata = data.metadata || data;\n await repository.save(metadata);\n logger.info('💾 [Persistence] 文件元数据已自动保存: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 保存失败: ' + (fileId), error);\n // 不抛出错误,避免影响上传流程\n }\n });\n\n // 监听文件删除事件\n this.on('file:deleted', async (fileId: string) => {\n try {\n await repository.delete(fileId);\n logger.info('🗑️ [Persistence] 文件元数据已自动删除: ' + (fileId));\n } catch (error) {\n logger.error('❌ [Persistence] 删除失败: ' + (fileId), error);\n }\n });\n\n // 监听批量删除事件\n this.on('files:batch-deleted', async (fileIds: string[]) => {\n try {\n await repository.batchDelete(fileIds);\n logger.info('🗑️ [Persistence] 批量删除元数据: ' + (fileIds.length) + ' 个文件');\n } catch (error) {\n logger.error(`❌ [Persistence] 批量删除失败`, error);\n }\n });\n }\n\n // ============= 初始化方法 =============\n\n /**\n * 初始化文件服务\n */\n async initialize(): Promise<void> {\n logger.info('🚀 [UniversalFileService] 开始初始化文件服务...');\n\n try {\n // 验证配置是否完整\n await this.validateConfiguration();\n\n // 初始化存储提供者\n await this.initializeStorageProviders();\n\n // 初始化CDN提供者\n await this.initializeCDNProviders();\n\n // 初始化文件处理器\n await this.initializeFileProcessors();\n\n logger.info('✅ [UniversalFileService] 文件服务初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件服务初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 重新初始化存储提供者(支持配置热更新)\n */\n async reinitializeStorageProviders(): Promise<void> {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者...');\n\n try {\n // 重新初始化所有存储提供者\n for (const [type, provider] of this.storageProviders) {\n if ('reinitialize' in provider) {\n try {\n logger.info('🔄 [UniversalFileService] 重新初始化存储提供者: ' + (type) + '...');\n\n // 获取对应的配置(从原始配置中获取)\n const config = (this.config as any).storageProviders?.[type as string];\n if (config) {\n await (provider as any).reinitialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成: ' + (type));\n } else {\n logger.warn('⚠️ [UniversalFileService] 存储提供者配置不存在: ' + (type));\n }\n } catch (error) {\n logger.error('❌ [UniversalFileService] 存储提供者重新初始化失败: ' + (type), error);\n // 继续处理其他提供者\n }\n }\n }\n\n logger.info('✅ [UniversalFileService] 存储提供者重新初始化完成');\n } catch (error) {\n console.error('❌ [UniversalFileService] 存储提供者重新初始化失败:', error);\n throw error;\n }\n }\n\n /**\n * 注册存储提供者\n */\n registerStorageProvider(provider: IStorageProvider): void {\n this.storageProviders.set(provider.type, provider);\n logger.info('📦 [UniversalFileService] 注册存储提供者: ' + (provider.type));\n }\n\n /**\n * 注册CDN提供者\n */\n registerCDNProvider(provider: ICDNProvider): void {\n this.cdnProviders.set(provider.type, provider);\n logger.info('🌐 [UniversalFileService] 注册CDN提供者: ' + (provider.type));\n }\n\n /**\n * 注册文件处理器\n */\n registerFileProcessor(processor: IFileProcessor): void {\n this.fileProcessors.set(processor.type, processor);\n logger.info('⚙️ [UniversalFileService] 注册文件处理器: ' + (processor.type));\n }\n\n // ============= 核心文件操作方法 =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n storageType?: StorageType,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const fileId = uuidv4();\n const startTime = Date.now();\n\n logger.info('📤 [UniversalFileService] 开始上传文件: ' + (fileInfo.file.name) + ', ID: ' + (fileId));\n\n try {\n // 验证文件\n await this.validateFile(fileInfo.file);\n\n // 初始化上传进度\n const progress: UploadProgress = {\n fileId,\n status: 'pending',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n };\n\n this.uploadProgressMap.set(fileId, progress);\n this.emitFileEvent('upload:start', fileId, { fileName: fileInfo.file.name });\n\n // 生成文件元数据\n const metadata = await this.generateFileMetadata(fileId, fileInfo);\n\n // 选择存储提供者\n const selectedStorageType = storageType || this.config.defaultStorage;\n let storageProvider = this.storageProviders.get(selectedStorageType as StorageType);\n\n // 如果指定的存储提供者不可用,优先尝试OSS\n if (!storageProvider) {\n logger.info(\n '⚠️ [UniversalFileService] 存储提供者 ' + (selectedStorageType) + ' 不可用,尝试使用OSS'\n );\n storageProvider = this.storageProviders.get('aliyun-oss');\n\n // 如果OSS也不可用,回退到本地存储\n if (!storageProvider) {\n logger.info(`⚠️ [UniversalFileService] OSS不可用,回退到本地存储`);\n storageProvider = this.storageProviders.get('local');\n }\n }\n\n if (!storageProvider) {\n throw new StorageProviderError(`没有可用的存储提供者`);\n }\n\n // 生成存储路径\n const storagePath = this.generateStoragePath(metadata);\n\n // 更新上传状态\n progress.status = 'uploading';\n progress.progress = 10;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n this.emitFileEvent('upload:progress', fileId, { progress: progress.progress });\n\n // 执行上传\n const uploadResult = await storageProvider.upload(fileInfo, storagePath);\n\n if (!uploadResult.success) {\n throw new FileUploadError('上传失败: ' + (uploadResult.error));\n }\n\n // 更新元数据\n metadata.storagePath = uploadResult.path || storagePath;\n metadata.storageProvider = selectedStorageType as StorageType;\n\n // 生成CDN URL(如果启用)\n if (this.config.defaultCDN !== 'none') {\n const cdnProvider = this.cdnProviders.get(this.config.defaultCDN as CDNType);\n if (cdnProvider && uploadResult.url) {\n metadata.cdnUrl = await cdnProvider.generateUrl(uploadResult.url);\n }\n }\n\n // 更新上传进度\n progress.status = fileInfo.needsProcessing ? 'processing' : 'completed';\n progress.progress = fileInfo.needsProcessing ? 70 : 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n // 如果需要处理,添加到处理队列\n if (fileInfo.needsProcessing && fileInfo.processingOptions) {\n await this.queueFileProcessing(metadata, fileInfo.processingOptions);\n }\n\n // 缓存元数据\n this.cacheMetadata(metadata);\n\n // 保存到数据库通过事件触发(如果启用了持久化)\n // persistence.repository 会监听 'upload:complete' 事件自动保存\n\n // 完成上传\n progress.status = 'completed';\n progress.progress = 100;\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [UniversalFileService] 文件上传完成: ' + (fileId) + ', 耗时: ' + (uploadTime) + 'ms');\n\n this.emitFileEvent('upload:complete', fileId, {\n fileName: fileInfo.file.name,\n size: fileInfo.file.size,\n uploadTime,\n });\n\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件上传失败: ' + (fileId) + ':', error);\n\n // 更新上传状态为失败\n const progress = this.uploadProgressMap.get(fileId);\n if (progress) {\n progress.status = 'failed';\n progress.error = error instanceof Error ? error.message : '上传失败';\n this.uploadProgressMap.set(fileId, progress);\n onProgress?.(progress);\n }\n\n this.emitFileEvent(\n 'upload:error',\n fileId,\n undefined,\n error instanceof Error ? error.message : '上传失败'\n );\n throw error;\n } finally {\n // 清理上传进度(可选,或设置过期时间)\n setTimeout(\n () => {\n this.uploadProgressMap.delete(fileId);\n },\n 5 * 60 * 1000\n ); // 5分钟后清理\n }\n }\n\n\n /**\n * 下载文件\n */\n async downloadFile(fileId: string, userId?: string): Promise<Buffer> {\n logger.info('📥 [UniversalFileService] 开始下载文件: ' + (fileId));\n\n try {\n this.emitFileEvent('download:start', fileId);\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查权限\n await this.checkFileAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 下载文件\n const fileBuffer = await storageProvider.download(metadata.storagePath);\n\n // 更新访问统计 (如果启用了持久化)\n if (this.config.persistence?.enabled) {\n await this.updateAccessStats(fileId);\n }\n\n logger.info('✅ [UniversalFileService] 文件下载完成: ' + (fileId));\n this.emitFileEvent('download:complete', fileId, { size: fileBuffer.length });\n\n return fileBuffer;\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件下载失败: ' + (fileId) + ':', error);\n this.emitFileEvent('download:error', fileId, undefined, error instanceof Error ? error.message : '下载失败');\n throw error;\n }\n }\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string, userId?: string): Promise<void> {\n logger.info('🗑️ [UniversalFileService] 开始删除文件: ' + (fileId));\n\n try {\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查删除权限\n await this.checkFileDeleteAccess(metadata, userId);\n\n // 获取存储提供者\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n // 从存储中删除文件\n const deleteResult = await storageProvider.delete(metadata.storagePath);\n\n if (!deleteResult.success) {\n console.warn('⚠️ [UniversalFileService] 存储文件删除失败: ' + (deleteResult.error));\n }\n\n // 从数据库中删除元数据 (通过事件触发)\n if (this.config.persistence?.enabled) {\n await this.deleteFileMetadata(fileId);\n }\n\n // 清除缓存\n this.clearMetadataCache(fileId);\n\n logger.info('✅ [UniversalFileService] 文件删除完成: ' + (fileId));\n this.emitFileEvent('delete:complete', fileId);\n this.emit('file:deleted', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件删除失败: ' + (fileId) + ':', error);\n this.emitFileEvent('delete:error', fileId, undefined, error instanceof Error ? error.message : '删除失败');\n throw error;\n }\n }\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, userId?: string, expiresIn?: number): Promise<string> {\n // 检查缓存\n const cacheKey = (fileId) + '_' + (userId || 'public') + '_' + (expiresIn || 0);\n const cached = this.urlCache.get(cacheKey);\n\n if (cached && cached.expires > Date.now()) {\n return cached.url;\n }\n\n // 获取文件元数据\n const metadata = await this.getFileMetadata(fileId);\n\n if (!metadata) {\n throw new FileUploadError('文件不存在: ' + (fileId));\n }\n\n // 检查访问权限\n await this.checkFileAccess(metadata, userId);\n\n let url: string;\n\n // 优先使用CDN URL\n if (metadata.cdnUrl) {\n url = metadata.cdnUrl;\n } else {\n // 获取存储提供者访问URL\n const storageProvider = this.storageProviders.get(metadata.storageProvider);\n\n if (!storageProvider) {\n throw new StorageProviderError('存储提供者不存在: ' + (metadata.storageProvider));\n }\n\n url = await storageProvider.getAccessUrl(metadata.storagePath, expiresIn);\n }\n\n // 缓存URL\n const cacheExpires = Date.now() + (this.config.cache?.urlTTL || 1800) * 1000;\n this.urlCache.set(cacheKey, { url, expires: cacheExpires });\n\n return url;\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata | null> {\n // 检查缓存\n const cached = this.metadataCache.get(fileId);\n if (cached && cached.expires > Date.now()) {\n return cached.data;\n }\n\n // 如果启用了持久化,从数据库查询\n if (this.config.persistence?.enabled && this.config.persistence.repository) {\n try {\n const metadata = await this.config.persistence.repository.get(fileId);\n if (metadata) {\n // 缓存结果\n this.cacheMetadata(metadata);\n }\n return metadata;\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件元数据失败:', error);\n return null;\n }\n }\n\n // 如果没有启用持久化,返回 null\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件元数据: ' + (fileId));\n return null;\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,无法查询文件列表');\n return {\n items: [],\n total: 0,\n page: options.page || 1,\n pageSize: options.pageSize || 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n\n try {\n const result = await this.config.persistence.repository.query(options);\n // 添加 hasNext 和 hasPrev\n const hasNext = result.page < result.totalPages;\n const hasPrev = result.page > 1;\n return {\n ...result,\n hasNext,\n hasPrev,\n };\n } catch (error) {\n console.error('❌ [UniversalFileService] 查询文件列表失败:', error);\n throw error;\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[], userId?: string): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n successCount: 0,\n failureCount: 0,\n failures: [],\n };\n\n for (const fileId of fileIds) {\n try {\n await this.deleteFile(fileId, userId);\n result.successCount++;\n } catch (error) {\n result.failureCount++;\n result.failures.push({\n fileId,\n error: error instanceof Error ? error.message : '删除失败',\n });\n }\n }\n\n // 触发批量删除事件\n if (result.successCount > 0) {\n this.emit('files:batch-deleted', fileIds.filter((_, i) => i < result.successCount));\n }\n\n return result;\n }\n\n /**\n * 获取上传进度\n */\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this.uploadProgressMap.get(fileId);\n }\n\n // ============= 事件处理方法 =============\n\n /**\n * 监听文件事件\n */\n onFileEvent(eventType: string, listener: FileEventListener): void {\n this.on(eventType, listener);\n }\n\n /**\n * 移除文件事件监听器\n */\n offFileEvent(eventType: string, listener: FileEventListener): void {\n this.off(eventType, listener);\n }\n\n // ============= 私有方法 =============\n\n /**\n * 验证配置是否完整\n */\n private async validateConfiguration(): Promise<void> {\n logger.info('🔍 [UniversalFileService] 验证配置文件...');\n\n // 检查基础配置\n if (!this.config) {\n throw new Error('文件服务配置为空');\n }\n\n // 检查存储配置\n if (!this.config.storage) {\n throw new Error('存储配置为空');\n }\n\n // 检查存储提供者配置\n if (this.config.storage.type === 'aliyun-oss') {\n const ossConfig = this.config.storage as any;\n\n // 如果配置不完整,等待配置加载\n if (!ossConfig.accessKeyId || !ossConfig.accessKeySecret || !ossConfig.bucket || !ossConfig.region) {\n logger.warn('⚠️ [UniversalFileService] OSS配置不完整,等待配置加载...');\n\n // 轮询检查配置是否加载完成,最多等待30秒\n const maxRetries = 30;\n const retryInterval = 1000; // 1秒\n\n for (let i = 0; i < maxRetries; i++) {\n await new Promise(resolve => setTimeout(resolve, retryInterval));\n\n // 重新检查配置(这里假设配置可能会被外部更新)\n const updatedConfig = this.config.storage as any;\n if (updatedConfig.accessKeyId && updatedConfig.accessKeySecret && updatedConfig.bucket && updatedConfig.region) {\n logger.info('✅ [UniversalFileService] OSS配置加载完成');\n break;\n }\n\n if (i === maxRetries - 1) {\n throw new Error('OSS配置加载超时:缺少必需的配置项 (accessKeyId, accessKeySecret, bucket, region)');\n }\n\n logger.debug('等待OSS配置加载中... (' + (i + 1) + '/' + (maxRetries) + ')');\n }\n }\n }\n\n // 检查默认存储类型\n if (!this.config.defaultStorage) {\n this.config.defaultStorage = this.config.storage.type as any;\n }\n\n logger.info('✅ [UniversalFileService] 配置验证完成');\n }\n\n private async initializeStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 开始初始化存储提供者...');\n\n // 如果还没有注册任何存储提供者,先注册默认的\n if (this.storageProviders.size === 0) {\n await this.registerDefaultStorageProviders();\n }\n\n if (this.config.storageProviders) {\n for (const [type, config] of Object.entries(this.config.storageProviders)) {\n if (config && config.enabled) {\n const provider = this.storageProviders.get(type as StorageType);\n if (provider) {\n try {\n await provider.initialize(config);\n logger.info('✅ [UniversalFileService] 存储提供者初始化完成: ' + (type));\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 存储提供者初始化失败: ' + (type) + ':', error);\n // 如果默认存储提供者初始化失败,切换到本地存储\n // if (type === this.config.defaultStorage) {\n // console.warn('⚠️ [UniversalFileService] 默认存储提供者 ' + (type) + ' 初始化失败,切换到本地存储');\n // this.config.defaultStorage = 'local';\n // }\n }\n } else {\n console.warn('⚠️ [UniversalFileService] 存储提供者未注册: ' + (type));\n }\n }\n }\n }\n }\n\n private async registerDefaultStorageProviders(): Promise<void> {\n logger.info('📦 [UniversalFileService] 注册默认存储提供者...');\n\n // 根据配置注册相应的存储提供者\n try {\n if (this.config.storage) {\n if (this.config.storage.type === 'aliyun-oss' && this.config.storage.enabled) {\n const { AliyunOSSProvider } = await import('./providers/AliyunOSSProvider');\n const ossProvider = new AliyunOSSProvider();\n this.registerStorageProvider(ossProvider);\n logger.info('✅ [UniversalFileService] 阿里云OSS提供者注册成功');\n } else if (this.config.storage.type === 'local' && this.config.storage.enabled) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const localProvider = new LocalStorageProvider();\n this.registerStorageProvider(localProvider);\n logger.info('✅ [UniversalFileService] 本地存储提供者注册成功');\n }\n }\n\n // 如果没有注册任何提供者,注册本地存储作为后备\n if (this.storageProviders.size === 0) {\n const { LocalStorageProvider } = await import('./providers/LocalStorageProvider');\n const fallbackProvider = new LocalStorageProvider();\n this.registerStorageProvider(fallbackProvider);\n logger.info('✅ [UniversalFileService] 已注册备用本地存储提供者');\n }\n } catch (error) {\n console.warn('⚠️ [UniversalFileService] 注册默认存储提供者失败:', error);\n throw new Error('无法初始化存储提供者');\n }\n }\n\n private async initializeCDNProviders(): Promise<void> {\n // CDN 初始化暂时跳过,未来支持多个 CDN 提供者时实现\n if (this.config.cdn && this.config.cdn.enabled) {\n logger.info('✅ [UniversalFileService] CDN配置已启用: ' + (this.config.cdn.type));\n }\n }\n\n private async initializeFileProcessors(): Promise<void> {\n for (const processor of Array.from(this.fileProcessors.values())) {\n await processor.initialize();\n logger.info('✅ [UniversalFileService] 文件处理器初始化完成: ' + (processor.type));\n }\n }\n\n private async validateFile(file: File): Promise<void> {\n // 检查文件大小\n if (this.config.maxFileSize && file.size > this.config.maxFileSize) {\n throw new FileUploadError('文件大小超过限制: ' + (file.size) + ' > ' + (this.config.maxFileSize));\n }\n\n // 检查文件类型\n const mimeType = file.type || getMimeType(file.name);\n\n if (\n this.config.allowedMimeTypes &&\n this.config.allowedMimeTypes.length > 0 &&\n !this.config.allowedMimeTypes.includes(mimeType)\n ) {\n throw new FileUploadError('不支持的文件类型: ' + (mimeType));\n }\n }\n\n private async generateFileMetadata(\n fileId: string,\n fileInfo: UploadFileInfo\n ): Promise<FileMetadata> {\n const now = new Date();\n const mimeType = fileInfo.file.type || getMimeType(fileInfo.file.name);\n const extension = path.extname(fileInfo.file.name).toLowerCase();\n\n // 生成文件哈希(用于去重检测)\n const hash = await this.generateFileHash(fileInfo.file);\n\n return {\n id: fileId,\n originalName: fileInfo.file.name,\n storageName: (fileId) + (extension),\n size: fileInfo.file.size,\n mimeType,\n extension,\n hash,\n uploadTime: now,\n permission: fileInfo.permission || 'public',\n uploaderId: fileInfo.metadata?.uploadedBy || 'system',\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n storageProvider: (this.config.defaultStorage || 'local') as StorageType,\n storagePath: '',\n accessCount: 0,\n metadata: fileInfo.metadata || {},\n };\n }\n\n private generateStoragePath(metadata: FileMetadata): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return (metadata.moduleId) + '/' + (year) + '/' + (month) + '/' + (day) + '/' + (metadata.storageName);\n }\n\n private async generateFileHash(file: File): Promise<string> {\n const buffer = await file.arrayBuffer();\n const hash = createHash('sha256');\n hash.update(Buffer.from(buffer));\n return hash.digest('hex');\n }\n\n private async queueFileProcessing(metadata: FileMetadata, options: any): Promise<void> {\n if (!this.config.processors?.length || 0 > 0) {\n return;\n }\n\n const processor = this.fileProcessors.get(options.type);\n if (!processor) {\n console.warn('⚠️ [UniversalFileService] 文件处理器不存在: ' + (options.type));\n return;\n }\n\n if (this.processingQueue.length >= 1000) {\n throw new FileProcessingError('处理队列已满');\n }\n\n this.processingQueue.push({\n fileId: metadata.id,\n processor,\n inputPath: metadata.storagePath,\n outputPath: this.generateProcessedPath(metadata, options),\n options,\n });\n\n // 启动处理队列\n if (!this.isProcessingQueueRunning) {\n this.processFileQueue();\n }\n }\n\n private generateProcessedPath(metadata: FileMetadata, options: any): string {\n const basePath = metadata.storagePath;\n const extension = path.extname(basePath);\n const basename = basePath.replace(extension, '');\n\n return (basename) + '_processed' + (extension);\n }\n\n private async processFileQueue(): Promise<void> {\n if (this.isProcessingQueueRunning || this.processingQueue.length === 0) {\n return;\n }\n\n this.isProcessingQueueRunning = true;\n\n while (this.processingQueue.length > 0) {\n const task = this.processingQueue.shift();\n if (!task) break;\n\n try {\n this.emitFileEvent('processing:start', task.fileId);\n\n const result = await task.processor.process(task.inputPath, task.outputPath, task.options);\n\n if (result.success) {\n this.emitFileEvent('processing:complete', task.fileId, result);\n } else {\n this.emitFileEvent('processing:error', task.fileId, undefined, result.error);\n }\n } catch (error) {\n console.error('❌ [UniversalFileService] 文件处理失败: ' + (task.fileId) + ':', error);\n this.emitFileEvent(\n 'processing:error',\n task.fileId,\n undefined,\n error instanceof Error ? error.message : '处理失败'\n );\n }\n }\n\n this.isProcessingQueueRunning = false;\n }\n\n private cacheMetadata(metadata: FileMetadata): void {\n const expires = Date.now() + (this.config.cache?.metadataTTL || 3600) * 1000;\n this.metadataCache.set(metadata.id, { data: metadata, expires });\n }\n\n private clearMetadataCache(fileId: string): void {\n this.metadataCache.delete(fileId);\n }\n\n private emitFileEvent(type: string, fileId: string, data?: any, error?: string): void {\n const event: FileEvent = {\n type: type as any,\n fileId,\n timestamp: new Date(),\n data,\n error,\n };\n\n this.emit(type, event);\n this.emit('*', event); // 通用事件监听\n }\n\n // ============= 数据库操作私有方法 =============\n\n /**\n * 保存文件元数据到数据库 (通过持久化仓储)\n */\n private async saveFileMetadata(metadata: FileMetadata): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n logger.warn('⚠️ [UniversalFileService] 持久化未启用,跳过保存元数据');\n return;\n }\n\n try {\n await this.config.persistence.repository.save(metadata);\n logger.info('💾 [UniversalFileService] 文件元数据保存成功:', metadata.id);\n } catch (error) {\n console.error('❌ [UniversalFileService] 保存文件元数据失败:', error);\n throw new FileUploadError(\n '保存文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 从数据库删除文件元数据 (通过持久化仓储)\n */\n private async deleteFileMetadata(fileId: string): Promise<void> {\n if (!this.config.persistence?.enabled || !this.config.persistence.repository) {\n return;\n }\n\n try {\n await this.config.persistence.repository.delete(fileId);\n logger.info('🗑️ [UniversalFileService] 文件元数据删除成功:', fileId);\n } catch (error) {\n console.error('❌ [UniversalFileService] 删除文件元数据失败:', error);\n throw new FileUploadError(\n '删除文件元数据失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 更新访问统计\n */\n private async updateAccessStats(fileId: string): Promise<void> {\n // 访问统计更新由数据库仓储实现决定\n // 这里只记录日志\n logger.info('📊 [UniversalFileService] 需要更新访问统计:', fileId);\n }\n\n /**\n * 检查文件访问权限\n */\n private async checkFileAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 如果文件是公开的,允许访问\n if (metadata.permission === 'public') {\n return;\n }\n\n // 如果是私有文件,检查用户权限\n if (metadata.permission === 'private' && metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限访问此文件');\n }\n\n // 如果是认证用户可访问,检查是否提供了 userId\n if (metadata.permission === 'authenticated' && !userId) {\n throw new FileUploadError('需要登录才能访问此文件');\n }\n }\n\n /**\n * 检查文件删除权限\n */\n private async checkFileDeleteAccess(metadata: FileMetadata, userId?: string): Promise<void> {\n // 只有上传者可以删除文件\n if (metadata.uploaderId !== userId) {\n throw new FileUploadError('无权限删除此文件');\n }\n }\n\n /**\n * 检查服务是否完全可用(包括存储提供者)\n */\n isFullyInitialized(): boolean {\n // 检查是否有可用的存储提供者\n const hasStorageProvider = Array.from(this.storageProviders.values()).some(provider =>\n provider.type === 'aliyun-oss' || provider.type === 'local'\n );\n\n return hasStorageProvider;\n }\n\n /**\n * 等待服务完全初始化(带超时)\n */\n async waitForInitialization(timeoutMs: number = 30000): Promise<void> {\n const startTime = Date.now();\n\n while (!this.isFullyInitialized()) {\n if (Date.now() - startTime > timeoutMs) {\n throw new Error('服务初始化超时 (' + (timeoutMs) + 'ms)');\n }\n\n // 等待100ms后重试\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n logger.info('✅ [UniversalFileService] 服务完全初始化就绪');\n }\n}\n","/**\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 /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: json('miniapp_floating_buttons').default({\n showCart: true,\n showHistory: true,\n }),\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","/**\n * ShowMasterpiece 模块类型定义\n * \n * 包含画集、作品、配置等相关的TypeScript类型定义\n */\n\n// ===== 画集分类枚举 =====\n\n/**\n * 画集分类枚举\n * \n * 定义画集的各种分类:\n * - COLLECTION: 画集 - 用于展示艺术作品\n * - ACRYLIC: 立牌 - 立牌制品\n * - BADGE: 吧唧 - 徽章类商品\n * - COLOR_PAPER: 色纸 - 彩色纸张制品\n * - POSTCARD: 明信片 - 明信片类商品\n * - LASER_TICKET: 镭射票 - 镭射票类商品\n * - CANVAS_BAG: 帆布包 - 帆布包类商品\n * - SUPPORT_STICK: 应援棒 - 应援棒类商品\n * - OTHER: 挂件/钥匙扣 - 挂件/钥匙扣类商品\n */\nexport enum CollectionCategory {\n /** 画集 - 用于展示艺术作品 */\n COLLECTION = 'collection',\n /** 立牌 - 立牌制品 */\n ACRYLIC = 'acrylic',\n /** 吧唧 - 徽章类商品 */\n BADGE = 'badge',\n /** 色纸 - 彩色纸张制品 */\n COLOR_PAPER = 'color_paper',\n /** 透卡 - 透明卡片制品 */\n TRANSPARENT_CARD = 'transparent_card',\n /** 明信片 - 明信片类商品 */\n POSTCARD = 'postcard',\n /** 镭射票 - 镭射票类商品 */\n LASER_TICKET = 'laser_ticket',\n /** 帆布包 - 帆布包类商品 */\n CANVAS_BAG = 'canvas_bag',\n /** 线圈笔记本 - 线圈装订笔记本 */\n SPIRAL_NOTEBOOK = 'spiral_notebook',\n /** 鼠标垫 - 鼠标垫类商品 */\n MOUSE_PAD = 'mouse_pad',\n /** 应援棒 - 应援棒类商品 */\n SUPPORT_STICK = 'support_stick',\n /** 挂件/钥匙扣 - 挂件/钥匙扣类商品 */\n KEYCHAIN = 'keychain',\n /** 其它 */\n OTHER = 'other'\n}\n\n/**\n * 画集分类类型\n * 使用枚举值作为类型\n */\nexport type CollectionCategoryType = `${CollectionCategory}` | string;\n\n/**\n * 分类信息接口\n * 包含分类值和显示名称\n */\nexport interface CategoryInfo {\n /** 分类值 */\n value: CollectionCategoryType;\n /** 显示名称 */\n displayName: string;\n /** 描述信息 */\n description?: string;\n}\n\n// ===== 基础类型定义 =====\n\n/**\n * 艺术作品页面数据结构\n * \n * 表示画集中的单个作品页面,包含图片、标题、描述等信息。\n * 每个画集包含多个这样的作品页面。\n */\nexport interface ArtworkPage {\n /** 作品的唯一标识符 */\n id: number;\n \n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片(支持URL或base64编码) */\n image: string;\n \n /** 通用文件服务的图片文件ID(新架构,可选) */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间(可选) */\n createdTime?: string;\n \n /** 作品主题(可选) */\n theme?: string;\n \n /** 作品年份(可选) */\n year?: string;\n \n /** 创作媒介(可选) */\n medium?: string;\n \n /** 作品尺寸(可选) */\n dimensions?: string;\n \n /** 在画集中的显示顺序 */\n pageOrder: number;\n \n /** 是否激活(可选,默认true) */\n isActive?: boolean;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n/**\n * 艺术画集数据结构\n * \n * 表示一个完整的艺术画集,包含多个作品页面和相关元数据。\n * 这是系统中的核心数据模型之一。\n */\nexport interface ArtCollection {\n /** 画集的唯一标识符 */\n id: number;\n \n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 画集封面图片路径 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID(新架构,可选) */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集包含的所有作品页面 */\n pages: ArtworkPage[];\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表(可选) */\n tags?: string[];\n \n /** 是否已发布(可选,默认true) */\n isPublished?: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n \n /** 创建时间(可选) */\n createdAt?: string;\n \n /** 更新时间(可选) */\n updatedAt?: string;\n}\n\n// ===== 配置相关类型 =====\n\n/**\n * 系统配置数据结构\n * \n * 存储ShowMasterpiece模块的全局配置信息,\n * 包括网站设置、显示选项、功能开关等。\n */\nexport interface MasterpiecesConfig {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription?: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle?: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n\n /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: MiniappFloatingButtonsConfig;\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式:light(浅色)、dark(深色)、auto(自动) */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言:zh(中文)、en(英文) */\n language: 'zh' | 'en';\n}\n\nexport interface MiniappFloatingButtonsConfig {\n showCart: boolean;\n showHistory: boolean;\n}\n\nexport interface CategoryOption {\n name: string;\n description?: string | null;\n}\n\nexport interface HomeTabConfigItem {\n name?: string;\n description?: string | null;\n category: CollectionCategoryType;\n visible: boolean;\n order: number;\n}\n\nexport const defaultHomeTabCategoryOrder: CollectionCategoryType[] = [\n CollectionCategory.CANVAS_BAG,\n CollectionCategory.SPIRAL_NOTEBOOK,\n CollectionCategory.MOUSE_PAD,\n CollectionCategory.ACRYLIC,\n CollectionCategory.BADGE,\n CollectionCategory.COLOR_PAPER,\n CollectionCategory.KEYCHAIN,\n CollectionCategory.TRANSPARENT_CARD,\n CollectionCategory.LASER_TICKET,\n];\n\nexport function buildDefaultHomeTabConfig(): HomeTabConfigItem[] {\n return [];\n}\n\nexport function normalizeHomeTabConfig(\n input?: HomeTabConfigItem[] | null,\n): HomeTabConfigItem[] {\n if (!input || input.length === 0) {\n return [];\n }\n\n const filtered = input\n .filter((item) => {\n if (!item) {\n return false;\n }\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n return typeof rawName === 'string' && rawName.trim().length > 0;\n })\n .map((item) => {\n const rawName = typeof item.name === 'string' ? item.name : item.category;\n const name = typeof rawName === 'string' ? rawName.trim() : '';\n const description = typeof item.description === 'string' ? item.description.trim() : item.description;\n\n return {\n name,\n description: description && description.length > 0 ? description : null,\n category: name as CollectionCategoryType,\n visible: item.visible ?? true,\n order: Number.isFinite(item.order) ? Number(item.order) : 0,\n };\n });\n\n if (filtered.length === 0) {\n return [];\n }\n\n filtered.sort((a, b) => a.order - b.order);\n const normalized = filtered.map((item, index) => ({ ...item, order: index }));\n\n if (!normalized.some((item) => item.visible)) {\n const firstItem = normalized[0];\n if (firstItem) {\n normalized[0] = { ...firstItem, visible: true };\n }\n }\n\n return normalized;\n}\n\nexport const defaultMiniappFloatingButtonsConfig: MiniappFloatingButtonsConfig = {\n showCart: true,\n showHistory: true,\n};\n\nexport function normalizeMiniappFloatingButtonsConfig(\n input?: Partial<MiniappFloatingButtonsConfig> | null,\n): MiniappFloatingButtonsConfig {\n return {\n showCart: input?.showCart ?? true,\n showHistory: input?.showHistory ?? true,\n };\n}\n\n// ===== 表单数据类型 =====\n\n/**\n * 画集表单数据结构\n * \n * 用于创建和编辑画集时的表单数据\n */\nexport interface CollectionFormData {\n /** 画集标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 封面图片 */\n coverImage: string;\n \n /** 通用文件服务的封面图片文件ID */\n coverImageFileId?: string;\n \n /** 画集描述 */\n description: string;\n \n /** 画集分类(使用枚举值) */\n category: CollectionCategoryType;\n \n /** 画集标签列表 */\ntags: string[];\n \n /** 是否已发布 */\n isPublished: boolean;\n \n /** 画集价格(单位:元,可选) */\n price?: number;\n}\n\n/**\n * 作品表单数据结构\n * \n * 用于创建和编辑作品时的表单数据\n */\nexport interface ArtworkFormData {\n /** 作品标题 */\n title: string;\n \n /** 编号 */\n number: string;\n \n /** 作品图片 */\n image?: string;\n \n /** 通用文件服务的图片文件ID */\n fileId?: string;\n \n /** 作品描述 */\n description: string;\n \n /** 创作时间 */\n createdTime: string;\n \n /** 作品主题 */\n theme: string;\n}\n\n/**\n * 配置表单数据结构\n * \n * 用于编辑系统配置时的表单数据\n */\nexport interface ConfigFormData {\n /** 网站名称 */\n siteName: string;\n \n /** 网站描述 */\n siteDescription: string;\n \n /** 首页主标题 */\n heroTitle: string;\n \n /** 首页副标题 */\n heroSubtitle: string;\n \n /** 每页显示的最大画集数量 */\n maxCollectionsPerPage: number;\n \n /** 是否启用搜索功能 */\n enableSearch: boolean;\n \n /** 是否启用分类功能 */\n enableCategories: boolean;\n\n /** 首页分类Tab配置 */\n homeTabConfig: HomeTabConfigItem[];\n\n /** 小程序悬浮按钮显示配置 */\n miniappFloatingButtons: MiniappFloatingButtonsConfig;\n \n /** 默认分类 */\n defaultCategory: string;\n \n /** 主题模式 */\n theme: 'light' | 'dark' | 'auto';\n \n /** 界面语言 */\n language: 'zh' | 'en';\n}\n\n// ===== 工具函数 =====\n\n/**\n * 获取所有可用的画集分类\n * \n * @returns 分类枚举值数组\n */\nexport function getAvailableCategories(): CollectionCategoryType[] {\n return [];\n}\n\n/**\n * 验证分类是否为有效值\n * \n * @param category - 要验证的分类值\n * @returns 是否为有效分类\n */\nexport function isValidCategory(category: string): category is CollectionCategoryType {\n if (typeof category !== 'string') {\n return false;\n }\n return category.trim().length > 0;\n}\n\n/**\n * 分类信息映射\n * 为每个分类提供完整的信息对象\n */\nexport const categories = {\n [CollectionCategory.COLLECTION]: {\n value: CollectionCategory.COLLECTION,\n displayName: '画集',\n description: '用于展示艺术作品'\n },\n [CollectionCategory.ACRYLIC]: {\n value: CollectionCategory.ACRYLIC,\n displayName: '立牌',\n description: '立牌制品'\n },\n [CollectionCategory.BADGE]: {\n value: CollectionCategory.BADGE,\n displayName: '吧唧',\n description: '徽章类商品'\n },\n [CollectionCategory.COLOR_PAPER]: {\n value: CollectionCategory.COLOR_PAPER,\n displayName: '色纸',\n description: '彩色纸张制品'\n },\n [CollectionCategory.TRANSPARENT_CARD]: {\n value: CollectionCategory.TRANSPARENT_CARD,\n displayName: '透卡',\n description: '透明卡片制品'\n },\n [CollectionCategory.POSTCARD]: {\n value: CollectionCategory.POSTCARD,\n displayName: '明信片',\n description: '明信片类商品'\n },\n [CollectionCategory.LASER_TICKET]: {\n value: CollectionCategory.LASER_TICKET,\n displayName: '镭射票',\n description: '镭射票类商品'\n },\n [CollectionCategory.CANVAS_BAG]: {\n value: CollectionCategory.CANVAS_BAG,\n displayName: '帆布包',\n description: '帆布包类商品'\n },\n [CollectionCategory.SPIRAL_NOTEBOOK]: {\n value: CollectionCategory.SPIRAL_NOTEBOOK,\n displayName: '线圈笔记本',\n description: '线圈装订笔记本'\n },\n [CollectionCategory.MOUSE_PAD]: {\n value: CollectionCategory.MOUSE_PAD,\n displayName: '鼠标垫',\n description: '鼠标垫类商品'\n },\n [CollectionCategory.SUPPORT_STICK]: {\n value: CollectionCategory.SUPPORT_STICK,\n displayName: '应援棒',\n description: '应援棒类商品'\n },\n [CollectionCategory.KEYCHAIN]: {\n value: CollectionCategory.KEYCHAIN,\n displayName: '挂件/钥匙扣',\n description: '挂件/钥匙扣类商品'\n },\n [CollectionCategory.OTHER]: {\n value: CollectionCategory.OTHER,\n displayName: '其它',\n description: '其他类型商品'\n }\n} as const satisfies Record<CollectionCategory, CategoryInfo>;\n\n\n/**\n * 获取分类的显示名称\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryDisplayName(category: CollectionCategoryType): string {\n return categories[category as CollectionCategory]?.displayName || category;\n}\n\n/**\n * 获取分类的完整信息\n * 支持 collection.category.displayName 的调用方式\n */\nexport function getCategoryInfo(category: CollectionCategoryType): CategoryInfo {\n return categories[category as CollectionCategory] || {\n value: category,\n displayName: category,\n description: ''\n };\n}\n\n/**\n * 扩展 CollectionCategoryType,使其支持 displayName 属性访问\n * 使用方式: collection.category.displayName\n */\ndeclare global {\n interface String {\n get displayName(): string;\n get categoryInfo(): CategoryInfo;\n }\n}\n\n// 为字符串类型添加 displayName getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'displayName')) {\n Object.defineProperty(String.prototype, 'displayName', {\n get(this: string): string {\n return getCategoryDisplayName(this as CollectionCategoryType);\n }\n });\n}\n\n// 为字符串类型添加 categoryInfo getter(避免重复定义)\nif (!Object.getOwnPropertyDescriptor(String.prototype, 'categoryInfo')) {\n Object.defineProperty(String.prototype, 'categoryInfo', {\n get(this: string): CategoryInfo {\n return getCategoryInfo(this as CollectionCategoryType);\n }\n });\n}\n\n/**\n * 获取分类的描述信息 (枚举调用方式)\n */\nexport const CategoryDescription = {\n [CollectionCategory.COLLECTION]: '用于展示艺术作品,包含多个作品页面的画集',\n [CollectionCategory.ACRYLIC]: '立牌制品,如亚克力立牌、展示立牌等',\n [CollectionCategory.BADGE]: '徽章类商品,如徽章、钥匙扣等',\n [CollectionCategory.COLOR_PAPER]: '彩色纸张制品,如彩色卡纸、彩色打印纸等',\n [CollectionCategory.TRANSPARENT_CARD]: '透明卡片制品,如透明卡片、透明卡等',\n [CollectionCategory.POSTCARD]: '明信片类商品,如艺术明信片、纪念明信片等',\n [CollectionCategory.LASER_TICKET]: '镭射票类商品,如演唱会门票、电影票等',\n [CollectionCategory.CANVAS_BAG]: '帆布包类商品,如帆布袋、帆布背包等',\n [CollectionCategory.SPIRAL_NOTEBOOK]: '线圈装订笔记本,如线圈笔记本、线圈装订笔记本等',\n [CollectionCategory.MOUSE_PAD]: '鼠标垫类商品,如鼠标垫、鼠标垫等',\n [CollectionCategory.SUPPORT_STICK]: '应援棒类商品,如荧光棒、应援棒等',\n [CollectionCategory.KEYCHAIN]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等',\n [CollectionCategory.OTHER]: '挂件/钥匙扣类商品,如装饰挂件、钥匙扣等'\n} as const;\n\n// ===== 弹窗配置类型导出 =====\nexport type { PopupConfig, NewPopupConfig } from './popup';\n\n// ===== 上下文类型导出 =====\nexport type { CartContextState } from './context'; \n","import { eq, asc, and } from 'drizzle-orm';\nimport {\n comicUniverseConfigs,\n comicUniverseCategories,\n comicUniverseTags,\n} from '../schema/masterpieces';\nimport {\n buildDefaultHomeTabConfig,\n normalizeHomeTabConfig,\n normalizeMiniappFloatingButtonsConfig,\n} 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 miniappFloatingButtons: {\n showCart: boolean;\n showHistory: boolean;\n };\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 miniappFloatingButtons: normalizeMiniappFloatingButtonsConfig(\n configData.miniappFloatingButtons,\n ),\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.miniappFloatingButtons !== undefined) {\n updateData.miniappFloatingButtons = normalizeMiniappFloatingButtonsConfig(\n configData.miniappFloatingButtons,\n );\n }\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 miniappFloatingButtons: normalizeMiniappFloatingButtonsConfig(undefined),\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 miniappFloatingButtons: normalizeMiniappFloatingButtonsConfig(\n dbConfig.miniappFloatingButtons,\n ),\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 {\n buildDefaultHomeTabConfig,\n normalizeHomeTabConfig,\n normalizeMiniappFloatingButtonsConfig,\n} 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 miniappFloatingButtons: {\n showCart: boolean;\n showHistory: boolean;\n };\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 miniappFloatingButtons: normalizeMiniappFloatingButtonsConfig(\n configData.miniappFloatingButtons,\n ),\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.miniappFloatingButtons !== undefined) {\n updateData.miniappFloatingButtons = normalizeMiniappFloatingButtonsConfig(\n configData.miniappFloatingButtons,\n );\n }\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 miniappFloatingButtons: normalizeMiniappFloatingButtonsConfig(undefined),\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 miniappFloatingButtons: normalizeMiniappFloatingButtonsConfig(\n dbConfig.miniappFloatingButtons,\n ),\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","export {\n ShowmasterConfigService,\n createShowmasterConfigService,\n} from './configService';\n\nexport {\n PopupConfigService,\n createPopupConfigService,\n} from './popupConfigService';\n\nexport {\n MasterpiecesConfigDbService,\n CategoriesDbService,\n TagsDbService,\n createMasterpiecesConfigDbService,\n createCategoriesDbService,\n createTagsDbService,\n} from './basicDbService';\n\nexport {\n initializeShowmasterpieceDb,\n masterpiecesConfigDbService,\n categoriesDbService,\n tagsDbService,\n collectionsDbService,\n artworksDbService,\n} from './masterpiecesDbService';\n\nexport {\n BookingQueryService,\n createBookingQueryService,\n} from './bookingQueryService';\n\nexport {\n BookingCommandService,\n BookingCommandError,\n createBookingCommandService,\n} from './bookingCommandService';\n\nexport {\n getShowMasterpieceFileConfig,\n} from './fileService';\n"]}