From 30db7d3bf51cc8c3780ea6d45f146bf6b194a3af Mon Sep 17 00:00:00 2001 From: GinHa <15201596918@163.com> Date: Thu, 25 Jun 2026 16:53:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BA=A4=E6=98=93=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E6=98=8E=E7=BB=86=E5=AF=BC=E5=87=BA=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + video-gen-admin/package-lock.json | 169 +++++++ video-gen-admin/package.json | 1 + video-gen-admin/src/api/index.ts | 49 +- .../src/pages/AdminCreditRecords.tsx | 466 ++++++++++++------ video-gen-admin/src/pages/AdminUsers.tsx | 53 +- video-gen-admin/src/types/index.ts | 97 +++- video-gen-admin/src/types/xlsx-js-style.d.ts | 4 + video-gen-admin/src/utils/excelExport.ts | 212 ++++++++ video-gen-api/app/api/v1/admin.py | 120 ++--- video-gen-api/app/api/v1/generation.py | 21 + video-gen-api/app/enums/__init__.py | 6 +- video-gen-api/app/enums/credit_record.py | 193 ++++++++ video-gen-api/app/enums/token_usage.py | 10 + video-gen-api/app/enums/user.py | 22 + video-gen-api/app/models/credit_record.py | 39 +- .../app/models/module_generation_step.py | 10 +- video-gen-api/app/models/token_usage.py | 14 +- video-gen-api/app/models/user.py | 13 +- video-gen-api/app/schemas/admin.py | 81 +++ .../services/admin_credit_record_service.py | 299 +++++++++++ .../services/credit_record_meta_service.py | 360 ++++++++++++++ video-gen-api/app/services/credits.py | 21 + .../services/generation_billing_service.py | 170 ++++++- .../app/services/generation_prompt_service.py | 10 +- .../app/services/generation_refund_service.py | 2 + .../generation_task_factory_service.py | 15 + .../services/hot_opening_replicate_service.py | 121 +++-- .../hot_opening_video_prompt_service.py | 10 +- video-gen-api/app/services/llm.py | 9 +- video-gen-api/app/services/payment.py | 65 +++ .../services/shot_replicate_flow_service.py | 121 +++-- .../services/shot_video_analysis_service.py | 10 +- .../app/tasks/shot_replicate_tasks.py | 23 + 34 files changed, 2491 insertions(+), 327 deletions(-) create mode 100644 video-gen-admin/src/types/xlsx-js-style.d.ts create mode 100644 video-gen-admin/src/utils/excelExport.ts create mode 100644 video-gen-api/app/enums/credit_record.py create mode 100644 video-gen-api/app/enums/token_usage.py create mode 100644 video-gen-api/app/enums/user.py create mode 100644 video-gen-api/app/services/admin_credit_record_service.py create mode 100644 video-gen-api/app/services/credit_record_meta_service.py diff --git a/.gitignore b/.gitignore index 7d9e5bf9..ea6cf067 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ bak/ *.tmp .DS_Store .playwright-mcp +*.zip +*.bat # 否定规则(不忽略) # !important.log diff --git a/video-gen-admin/package-lock.json b/video-gen-admin/package-lock.json index 4508c7be..36cb3390 100644 --- a/video-gen-admin/package-lock.json +++ b/video-gen-admin/package-lock.json @@ -14,6 +14,7 @@ "react": "^19.2.5", "react-dom": "^19.2.5", "react-router-dom": "^7.15.0", + "xlsx-js-style": "^1.2.0", "zustand": "^5.0.13" }, "devDependencies": { @@ -1235,6 +1236,22 @@ } } }, + "node_modules/adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==", + "license": "Apache-2.0", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + }, + "bin": { + "adler32": "bin/adler32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/antd": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/antd/-/antd-6.3.7.tgz", @@ -1299,6 +1316,28 @@ "react-dom": ">=18.0.0" } }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cfb/node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -1308,6 +1347,34 @@ "node": ">=6" } }, + "node_modules/codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==", + "license": "Apache-2.0", + "dependencies": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "bin": { + "codepage": "bin/codepage.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codepage/node_modules/commander": { + "version": "2.14.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "license": "MIT" + }, "node_modules/compute-scroll-into-view": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", @@ -1327,6 +1394,18 @@ "url": "https://opencollective.com/express" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -1349,6 +1428,15 @@ "node": ">=8" } }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -1367,6 +1455,21 @@ } } }, + "node_modules/fflate": { + "version": "0.3.11", + "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.3.11.tgz", + "integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==", + "license": "MIT" + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1726,6 +1829,18 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "license": "Apache-2.0", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/react": { "version": "19.2.6", "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", @@ -1863,6 +1978,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", @@ -2001,6 +2128,48 @@ } } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx-js-style": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/xlsx-js-style/-/xlsx-js-style-1.2.0.tgz", + "integrity": "sha512-DDT4FXFSWfT4DXMSok/m3TvmP1gvO3dn0Eu/c+eXHW5Kzmp7IczNkxg/iEPnImbG9X0Vb8QhROda5eatSR/97Q==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.14.0", + "commander": "~2.17.1", + "crc-32": "~1.2.0", + "exit-on-epipe": "~1.0.1", + "fflate": "^0.3.8", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/zustand": { "version": "5.0.13", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.13.tgz", diff --git a/video-gen-admin/package.json b/video-gen-admin/package.json index 31da407d..8fc6aa5d 100644 --- a/video-gen-admin/package.json +++ b/video-gen-admin/package.json @@ -15,6 +15,7 @@ "react": "^19.2.5", "react-dom": "^19.2.5", "react-router-dom": "^7.15.0", + "xlsx-js-style": "^1.2.0", "zustand": "^5.0.13" }, "devDependencies": { diff --git a/video-gen-admin/src/api/index.ts b/video-gen-admin/src/api/index.ts index 2296e9c2..a7fd3810 100644 --- a/video-gen-admin/src/api/index.ts +++ b/video-gen-admin/src/api/index.ts @@ -12,6 +12,7 @@ import type { AdminShotSegmentQueryParams, ShotSegmentListOut, ShotSegmentDetailOut, VideoPromptSchemaConfigOut, VideoPromptSchemaConfigSavePayload, VideoPromptSchemaPreviewPayload, VideoPromptSchemaPreviewOut, VideoPromptSchemaExportOut, + AdminCreditRecordListResponse, AdminCreditRecordQueryParams, } from '../types'; // ── Auth ────────────────────────────────────────────────── @@ -99,14 +100,26 @@ export async function getAdminStats(startDate?: string, endDate?: string): Promi return api.get(`/admin/stats${query ? `?${query}` : ''}`); } -export async function getAdminUsers(page = 1, pageSize = 20, search?: string): Promise<{ items: AdminUser[]; total: number }> { +export async function getAdminUsers( + page = 1, + pageSize = 20, + search?: string, + userType?: string, + frontendUserKind?: string, +): Promise<{ items: AdminUser[]; total: number }> { const params = new URLSearchParams(); params.set('page', String(page)); params.set('page_size', String(pageSize)); if (search) params.set('search', search); + if (userType) params.set('user_type', userType); + if (frontendUserKind) params.set('frontend_user_kind', frontendUserKind); return api.get(`/admin/users?${params.toString()}`); } +export async function updateFrontendUserKind(userId: string, frontendUserKind: 'internal' | 'external'): Promise { + return api.put(`/admin/users/${userId}/frontend-kind`, { frontend_user_kind: frontendUserKind }); +} + export async function adjustCredits(userId: string, amount: number, description: string): Promise { await api.post(`/admin/users/${userId}/credits`, { amount, description }); } @@ -171,19 +184,27 @@ export async function uploadLogo(file: File): Promise<{ url: string }> { return res.json(); } -export async function getCreditRecords(filters?: { - user_id?: string; - user_name?: string; - type?: string; - start_date?: string; - end_date?: string; -}): Promise { +function setMaybe(params: URLSearchParams, key: string, value: unknown): void { + if (value !== undefined && value !== null && String(value) !== '') params.set(key, String(value)); +} + +export async function getCreditRecords(filters?: AdminCreditRecordQueryParams): Promise { const params = new URLSearchParams(); - if (filters?.user_id) params.set('user_id', filters.user_id); - if (filters?.user_name) params.set('user_name', filters.user_name); - if (filters?.type) params.set('type', filters.type); - if (filters?.start_date) params.set('start_date', filters.start_date); - if (filters?.end_date) params.set('end_date', filters.end_date); + setMaybe(params, 'page', filters?.page); + setMaybe(params, 'page_size', filters?.pageSize); + setMaybe(params, 'user_id', filters?.userId); + setMaybe(params, 'user_name', filters?.userName); + setMaybe(params, 'user_type', filters?.userType); + setMaybe(params, 'frontend_user_kind', filters?.frontendUserKind); + setMaybe(params, 'record_type', filters?.recordType || filters?.type); + setMaybe(params, 'credit_subject', filters?.creditSubject); + setMaybe(params, 'media_type', filters?.mediaType); + setMaybe(params, 'charge_kind', filters?.chargeKind); + setMaybe(params, 'source_module', filters?.sourceModule); + setMaybe(params, 'source_step_code', filters?.sourceStepCode); + setMaybe(params, 'billing_scene', filters?.billingScene); + setMaybe(params, 'start_date', filters?.startDate); + setMaybe(params, 'end_date', filters?.endDate); const q = params.toString() ? `?${params}` : ''; return api.get(`/admin/credit-records${q}`); } @@ -324,7 +345,7 @@ export async function deleteMenuConfig(id: string): Promise { // ── User Creation ─────────────────────────────────────── -export async function createUser(data: { username: string; password: string; email?: string; phone?: string; credits: number; user_type: string; allowed_menus?: string[] | null }): Promise { +export async function createUser(data: { username?: string; password: string; email?: string; phone?: string; credits: number; user_type: string; frontend_user_kind?: string; allowed_menus?: string[] | null }): Promise { return api.post('/admin/users', data); } diff --git a/video-gen-admin/src/pages/AdminCreditRecords.tsx b/video-gen-admin/src/pages/AdminCreditRecords.tsx index 1023ffe9..12c4fdce 100644 --- a/video-gen-admin/src/pages/AdminCreditRecords.tsx +++ b/video-gen-admin/src/pages/AdminCreditRecords.tsx @@ -1,202 +1,358 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { - Button, Card, Select, Space, Table, Tag, Typography, message, Input, DatePicker, + Button, Card, DatePicker, Input, message, Select, Space, Table, Tag, Typography, } from 'antd'; import { - WalletOutlined, ArrowUpOutlined, ArrowDownOutlined, ReloadOutlined, RollbackOutlined, + ArrowDownOutlined, ArrowUpOutlined, DownloadOutlined, ReloadOutlined, RollbackOutlined, WalletOutlined, } from '@ant-design/icons'; -import { getCreditRecords } from '../api'; -import { formatDate } from '../utils/formatDate'; +import { exportStyledExcel, type StyledExcelColumn } from '../utils/excelExport'; import dayjs from 'dayjs'; +import { getCreditRecords } from '../api'; +import type { AdminCreditRecord, AdminCreditRecordQueryParams, AdminCreditRecordSummary } from '../types'; +import { formatDate } from '../utils/formatDate'; -interface CreditRecord { - id: string; - username: string; - type: string; - amount: number; - balanceAfter: number; - description: string; - createdAt: string; -} - -const CREDIT_TYPE_MAP: Record = { - recharge: { text: '充值', color: 'green', icon: }, - consume: { text: '消费', color: 'red', icon: }, - refund: { text: '退回', color: 'blue', icon: }, +const DEFAULT_SUMMARY: AdminCreditRecordSummary = { + totalRecharge: 0, + totalConsume: 0, + totalRefund: 0, + transactionCount: 0, + generationCount: 0, + generationAttemptCount: 0, + imageGenerationCount: 0, + videoGenerationCount: 0, + imageConsume: 0, + videoConsume: 0, + textConsume: 0, + analysisConsume: 0, + totalTokens: 0, + inputTokens: 0, + outputTokens: 0, }; +const RECORD_TYPE_MAP: Record = { + recharge: { text: '充值', color: 'green', icon: }, + consume: { text: '消费', color: 'red', icon: }, + refund: { text: '回退', color: 'blue', icon: }, +}; + +const userScopeOptions = [ + { value: '', label: '全部用户' }, + { value: 'admin', label: '后台用户' }, + { value: 'frontend_internal', label: '前台内部用户' }, + { value: 'frontend_external', label: '前台外部用户' }, +]; + +const recordTypeOptions = [ + { value: '', label: '全部流水' }, + { value: 'recharge', label: '充值' }, + { value: 'consume', label: '消费' }, + { value: 'refund', label: '回退' }, +]; + +const creditSubjectOptions = [ + { value: '', label: '全部积分类型' }, + { value: 'media', label: '图片/视频生成积分' }, + { value: 'text', label: '提词优化积分' }, + { value: 'module', label: '模块功能积分' }, + { value: 'analysis', label: '分析积分' }, + { value: 'split', label: '切片积分' }, + { value: 'admin_adjust', label: '管理员调整' }, + { value: 'recharge', label: '充值积分' }, + { value: 'unknown', label: '历史未知' }, +]; + +const mediaTypeOptions = [ + { value: '', label: '全部媒体' }, + { value: 'image', label: '图片' }, + { value: 'video', label: '视频' }, +]; + +const chargeKindOptions = [ + { value: '', label: '全部扣费子类' }, + { value: 'media', label: '媒体生成' }, + { value: 'text_prompt', label: '提词优化' }, + { value: 'file_parse', label: '文件解析' }, + { value: 'vision_input', label: '图片理解' }, + { value: 'module_create', label: '创建模块项目' }, + { value: 'video_analysis', label: '视频分析' }, + { value: 'video_split', label: '视频切片' }, + { value: 'admin_adjust', label: '管理员调整' }, +]; + +const sourceModuleOptions = [ + { value: '', label: '全部模块' }, + { value: 'ai_creation', label: 'AI创作' }, + { value: 'generation_record', label: '项目记录' }, + { value: 'hot_opening_replicate', label: '爆款开头复刻' }, + { value: 'shot_replicate', label: '拆镜复刻' }, + { value: 'admin', label: '后台管理' }, + { value: 'payment', label: '支付充值' }, + { value: 'unknown', label: '历史未知' }, +]; + +const sourceStepOptions = [ + { value: '', label: '全部步骤' }, + { value: 'image_prompt_optimize', label: '图片提词优化' }, + { value: 'image_generate', label: '图片生成' }, + { value: 'video_prompt_optimize', label: '视频提词优化' }, + { value: 'video_generate', label: '视频生成' }, + { value: 'video_analysis', label: '视频分析' }, +]; + +const billingSceneOptions = [ + { value: '', label: '全部计费场景' }, + { value: 'ai_creation_image_generate', label: 'AI创作图片生成' }, + { value: 'ai_creation_video_generate', label: 'AI创作视频生成' }, + { value: 'generation_record_text_prompt_optimize', label: '项目记录提词优化' }, + { value: 'generation_record_image_generate', label: '项目记录图片生成' }, + { value: 'generation_record_video_generate', label: '项目记录视频生成' }, + { value: 'generation_record_file_parse', label: '项目记录文件解析' }, + { value: 'generation_record_vision_input', label: '项目记录图片理解' }, + { value: 'hot_opening_project_create', label: '爆款开头复刻创建项目' }, + { value: 'hot_opening_image_prompt_optimize', label: '爆款开头复刻图片提词优化' }, + { value: 'hot_opening_image_generate', label: '爆款开头复刻图片生成' }, + { value: 'hot_opening_video_prompt_optimize', label: '爆款开头复刻视频提词优化' }, + { value: 'hot_opening_video_generate', label: '爆款开头复刻视频生成' }, + { value: 'shot_video_analysis', label: '拆镜视频分析' }, + { value: 'shot_original_video_analysis', label: '拆镜复刻原视频分析' }, + { value: 'shot_segment_video_analysis', label: '拆镜复刻片段视频分析' }, + { value: 'shot_video_split', label: '拆镜切片' }, + { value: 'shot_segment_replicate_create', label: '从切片创建复刻项目' }, + { value: 'shot_image_prompt_optimize', label: '拆镜复刻图片提词优化' }, + { value: 'shot_image_generate', label: '拆镜复刻图片生成' }, + { value: 'shot_video_prompt_optimize', label: '拆镜复刻视频提词优化' }, + { value: 'shot_video_generate', label: '拆镜复刻视频生成' }, + { value: 'recharge', label: '充值' }, + { value: 'admin_adjust', label: '管理员调整' }, + { value: 'refund', label: '回退' }, + { value: 'unknown', label: '历史未知' }, +]; + +function n(value: number | undefined | null): string { + return Number(value || 0).toLocaleString(); +} + +function engineTypeLabel(type?: string): string { + if (type === 'model') return '提词/分析模型'; + if (type === 'image') return '图片引擎'; + if (type === 'video') return '视频引擎'; + return '执行配置'; +} + +function buildScope(scope: string): Pick { + if (scope === 'admin') return { userType: 'admin' }; + if (scope === 'frontend_internal') return { userType: 'frontend', frontendUserKind: 'internal' }; + if (scope === 'frontend_external') return { userType: 'frontend', frontendUserKind: 'external' }; + return {}; +} + const AdminCreditRecords: React.FC = () => { - const [records, setRecords] = useState([]); + const [records, setRecords] = useState([]); + const [summary, setSummary] = useState(DEFAULT_SUMMARY); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); + const [exporting, setExporting] = useState(false); + const [exportProgress, setExportProgress] = useState(''); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); - const [typeFilter, setTypeFilter] = useState(''); - const [userNameFilter, setUserNameFilter] = useState(''); + + const [userScope, setUserScope] = useState(''); + const [recordType, setRecordType] = useState(''); + const [creditSubject, setCreditSubject] = useState(''); + const [mediaType, setMediaType] = useState(''); + const [chargeKind, setChargeKind] = useState(''); + const [sourceModule, setSourceModule] = useState(''); + const [sourceStepCode, setSourceStepCode] = useState(''); + const [billingScene, setBillingScene] = useState(''); + const [userNameFilter, setUserNameFilter] = useState(''); const [dateRange, setDateRange] = useState<[dayjs.Dayjs | null, dayjs.Dayjs | null]>([null, null]); + const query = useMemo(() => ({ + page, + pageSize, + userName: userNameFilter || undefined, + recordType: recordType || undefined, + creditSubject: creditSubject || undefined, + mediaType: mediaType || undefined, + chargeKind: chargeKind || undefined, + sourceModule: sourceModule || undefined, + sourceStepCode: sourceStepCode || undefined, + billingScene: billingScene || undefined, + startDate: dateRange[0]?.format('YYYY-MM-DD'), + endDate: dateRange[1]?.format('YYYY-MM-DD'), + ...buildScope(userScope), + }), [page, pageSize, userNameFilter, recordType, creditSubject, mediaType, chargeKind, sourceModule, sourceStepCode, billingScene, dateRange, userScope]); + const load = async () => { setLoading(true); try { - const filters: { type?: string; user_name?: string; start_date?: string; end_date?: string; page?: number; page_size?: number } = {}; - if (typeFilter) filters.type = typeFilter; - if (userNameFilter) filters.user_name = userNameFilter; - if (dateRange[0]) filters.start_date = dateRange[0].format('YYYY-MM-DD'); - if (dateRange[1]) filters.end_date = dateRange[1].format('YYYY-MM-DD'); - filters.page = page; - filters.page_size = pageSize; - const res = await getCreditRecords(Object.keys(filters).length > 0 ? filters : undefined); + const res = await getCreditRecords(query); setRecords(res.items || []); setTotal(res.total || 0); - } catch { - message.error('加载积分记录失败'); + setSummary(res.summary || DEFAULT_SUMMARY); + } catch (e: any) { + message.error(e?.message || '加载积分记录失败'); } finally { setLoading(false); } }; - useEffect(() => { load(); }, [page, pageSize, typeFilter, userNameFilter, dateRange]); - - const handlePageChange = (p: number, ps: number) => { - setPage(p); - setPageSize(ps); - }; - - useEffect(() => { load(); }, []); - - const handleSearch = () => { - load(); - }; + useEffect(() => { load(); }, [query]); const handleReset = () => { - setTypeFilter(''); + setUserScope(''); + setRecordType(''); + setCreditSubject(''); + setMediaType(''); + setChargeKind(''); + setSourceModule(''); + setSourceStepCode(''); + setBillingScene(''); setUserNameFilter(''); setDateRange([null, null]); - load(); + setPage(1); }; - const totalRecharge = records.filter(r => r.type === 'recharge').reduce((s, r) => s + r.amount, 0); - const totalConsume = records.filter(r => r.type === 'consume').reduce((s, r) => s + Math.abs(r.amount), 0); + const exportExcel = async () => { + setExporting(true); + setExportProgress('准备导出...'); + try { + const exportPageSize = 500; + const baseQuery = { ...query, page: 1, pageSize: exportPageSize }; + const first = await getCreditRecords(baseQuery); + const all: AdminCreditRecord[] = [...(first.items || [])]; + const exportSummary = first.summary || DEFAULT_SUMMARY; + const totalRows = first.total || 0; + const totalPages = Math.max(1, Math.ceil(totalRows / exportPageSize)); + setExportProgress(`正在获取 ${all.length} / ${totalRows}`); + for (let p = 2; p <= totalPages; p += 1) { + const res = await getCreditRecords({ ...baseQuery, page: p }); + all.push(...(res.items || [])); + setExportProgress(`正在获取 ${Math.min(all.length, totalRows)} / ${totalRows}`); + } + + const detailColumns: StyledExcelColumn[] = [ + { title: '时间', maxWidth: 22, render: (r) => formatDate(r.createdAt || '') }, + { title: '用户', minWidth: 12, maxWidth: 20, render: (r) => r.username || '-' }, + { title: '手机号', minWidth: 13, maxWidth: 18, render: (r) => r.phone || '-' }, + { title: '用户类型', maxWidth: 16, render: (r) => r.userTypeLabel || '-' }, + { title: '前台归类', maxWidth: 18, render: (r) => r.frontendUserKindLabel || '-' }, + { title: '流水类型', maxWidth: 14, align: 'center', render: (r) => r.recordTypeLabel || r.type || '-' }, + { title: '积分类型', maxWidth: 20, render: (r) => r.creditSubjectLabel || '-' }, + { title: '扣费子类', maxWidth: 22, render: (r) => r.chargeKindLabel || '-' }, + { title: '模块', maxWidth: 20, render: (r) => r.sourceModuleLabel || '-' }, + { title: '模块步骤', maxWidth: 22, render: (r) => r.sourceStepCodeLabel || '-' }, + { title: '计费场景', maxWidth: 32, render: (r) => r.billingSceneLabel || '-' }, + { title: '媒体类型', maxWidth: 12, align: 'center', render: (r) => r.mediaTypeLabel || '-' }, + { title: '变动积分', minWidth: 12, maxWidth: 14, align: 'right', numFmt: '#,##0.00', render: (r) => r.amount }, + { title: '变动后余额', minWidth: 12, maxWidth: 14, align: 'right', numFmt: '#,##0.00', render: (r) => r.balanceAfter }, + { title: '实际 Token', minWidth: 12, maxWidth: 14, align: 'right', numFmt: '#,##0', render: (r) => r.totalTokens || 0 }, + { title: '输入 Token', minWidth: 12, maxWidth: 14, align: 'right', numFmt: '#,##0', render: (r) => r.inputTokens || 0 }, + { title: '输出 Token', minWidth: 12, maxWidth: 14, align: 'right', numFmt: '#,##0', render: (r) => r.outputTokens || 0 }, + { title: '执行类型', maxWidth: 18, render: (r) => engineTypeLabel(r.engineType) }, + { title: '执行配置', maxWidth: 28, render: (r) => r.engineName || '-' }, + { title: '供应商', maxWidth: 18, render: (r) => r.engineProvider || '-' }, + { title: '模型版本', maxWidth: 26, render: (r) => r.engineModelName || '-' }, + { title: '关联状态', maxWidth: 14, align: 'center', render: (r) => r.ownerDeleted ? '关联已删除' : '正常' }, + { title: '说明', minWidth: 18, maxWidth: 42, render: (r) => r.description || '' }, + { title: '业务归属类型', maxWidth: 18, render: (r) => r.ownerType || '' }, + { title: '业务归属ID', maxWidth: 28, render: (r) => r.ownerId || '' }, + { title: 'BizKey', maxWidth: 36, render: (r) => r.bizKey || '' }, + ]; + + const filename = `积分流水_${dayjs().format('YYYYMMDD_HHmmss')}.xlsx`; + exportStyledExcel({ + filename, + sheetName: '积分流水', + title: '积分流水汇总', + metadataRows: [ + ['筛选时间', `${dateRange[0]?.format('YYYY-MM-DD') || '不限'} 至 ${dateRange[1]?.format('YYYY-MM-DD') || '不限'}`], + ['导出时间', dayjs().format('YYYY-MM-DD HH:mm:ss')], + ['导出条数', totalRows], + ], + summaryRows: [ + ['总充值', exportSummary.totalRecharge], + ['总消费', exportSummary.totalConsume], + ['总回退', exportSummary.totalRefund], + ['交易笔数', exportSummary.transactionCount], + ['生成条数', exportSummary.generationCount], + ['生成尝试次数', exportSummary.generationAttemptCount], + ['图片生成条数', exportSummary.imageGenerationCount], + ['视频生成条数', exportSummary.videoGenerationCount], + ['图片消费积分', exportSummary.imageConsume], + ['视频消费积分', exportSummary.videoConsume], + ['提词消费积分', exportSummary.textConsume], + ['视频分析积分', exportSummary.analysisConsume], + ['总 Token', exportSummary.totalTokens], + ['输入 Token', exportSummary.inputTokens], + ['输出 Token', exportSummary.outputTokens], + ], + columns: detailColumns, + rows: all, + }); + message.success('Excel 已导出'); + } catch (e: any) { + message.error(e?.message || '导出失败'); + } finally { + setExporting(false); + setExportProgress(''); + } + }; const columns = [ - { - title: '用户', dataIndex: 'username', width: 120, - render: (v: string) => {v}, - }, - { - title: '类型', dataIndex: 'type', width: 100, - render: (v: string) => { - const cfg = CREDIT_TYPE_MAP[v] || { text: v || '-', color: 'default', icon: null }; - return ( - - {cfg.text} - - ); - }, - }, - { - title: '变动积分', dataIndex: 'amount', width: 120, sorter: (a: CreditRecord, b: CreditRecord) => a.amount - b.amount, - render: (v: number) => ( - 0 ? '#10b981' : '#ef4444', fontSize: 15 }}> - {v > 0 ? '+' : ''}{v.toLocaleString()} - - ), - }, - { - title: '变动后余额', dataIndex: 'balanceAfter', width: 120, - render: (v: number) => {v.toLocaleString()}, - }, - { - title: '说明', dataIndex: 'description', ellipsis: true, - }, - { - title: '时间', dataIndex: 'createdAt', width: 160, - render: (v: string) => {formatDate(v)}, - }, + { title: '用户', dataIndex: 'username', width: 130, fixed: 'left' as const, render: (v: string, r: AdminCreditRecord) =>
{v || '-'}
{r.phone || '-'}
}, + { title: '用户类型', dataIndex: 'userTypeLabel', width: 120, render: (_: string, r: AdminCreditRecord) => {r.userTypeLabel || '-'} }, + { title: '流水类型', dataIndex: 'recordType', width: 100, render: (v: string, r: AdminCreditRecord) => { const cfg = RECORD_TYPE_MAP[v] || { text: r.recordTypeLabel || v || '-', color: 'default', icon: null }; return {cfg.text}; } }, + { title: '积分类型', dataIndex: 'creditSubjectLabel', width: 150, render: (v: string) => {v || '-'} }, + { title: '模块', dataIndex: 'sourceModuleLabel', width: 130, render: (v: string) => v || '-' }, + { title: '步骤/场景', key: 'scene', width: 210, render: (_: any, r: AdminCreditRecord) =>
{r.billingSceneLabel || '-'}
{r.sourceStepCodeLabel || '-'}
}, + { title: '媒体', dataIndex: 'mediaTypeLabel', width: 80, render: (v: string) => v ? {v} : '-' }, + { title: '变动积分', dataIndex: 'amount', width: 120, sorter: (a: AdminCreditRecord, b: AdminCreditRecord) => a.amount - b.amount, render: (v: number) => 0 ? '#10b981' : '#ef4444' }}>{v > 0 ? '+' : ''}{n(v)} }, + { title: '余额', dataIndex: 'balanceAfter', width: 110, render: (v: number) => n(v) }, + { title: 'Token', key: 'tokens', width: 140, render: (_: any, r: AdminCreditRecord) =>
{n(r.totalTokens)}
入 {n(r.inputTokens)} / 出 {n(r.outputTokens)}
}, + { title: '执行配置', key: 'engine', width: 230, render: (_: any, r: AdminCreditRecord) =>
{engineTypeLabel(r.engineType)}
{r.engineName || '-'}
{[r.engineProvider, r.engineModelName].filter(Boolean).join(' / ') || '-'}
}, + { title: '关联状态', dataIndex: 'ownerDeleted', width: 100, render: (v: boolean) => {v ? '已删除' : '正常'} }, + { title: '说明', dataIndex: 'description', width: 240, ellipsis: true }, + { title: '时间', dataIndex: 'createdAt', width: 160, render: (v: string) => {formatDate(v)} }, ]; return (
- {/* Summary Cards */} -
- -
-
-
-
总充值
-
+{totalRecharge.toLocaleString()}
-
-
-
- -
-
-
-
总消费
-
-{totalConsume.toLocaleString()}
-
-
-
- -
-
-
-
交易笔数
-
{total}
-
-
-
+
+
总充值
+{n(summary.totalRecharge)}
+
总消费
-{n(summary.totalConsume)}
+
总回退
+{n(summary.totalRefund)}
+
交易 / 生成
{n(summary.transactionCount)} / {n(summary.generationCount)}
+
+ +
+ 图片生成:{n(summary.imageGenerationCount)} 条 / {n(summary.imageConsume)} 积分 + 视频生成:{n(summary.videoGenerationCount)} 条 / {n(summary.videoConsume)} 积分 + 提词消费:{n(summary.textConsume)} 积分 + 视频分析:{n(summary.analysisConsume)} 积分
- setUserNameFilter(e.target.value)} - style={{ width: 180 }} - allowClear - /> - { if (dates) setDateRange([dates[0], dates[1]]); }} - placeholder={['开始日期', '结束日期']} - style={{ width: 250 }} - /> + { setPage(1); setRecordType(v); }} style={{ width: 130 }} options={recordTypeOptions} /> + { setPage(1); setMediaType(v); }} style={{ width: 110 }} options={mediaTypeOptions} /> + { setPage(1); setSourceModule(v); }} style={{ width: 150 }} options={sourceModuleOptions} /> + { setPage(1); setBillingScene(v); }} style={{ width: 220 }} options={billingSceneOptions} /> + { setPage(1); setUserNameFilter(e.target.value); }} style={{ width: 180 }} allowClear /> + { setPage(1); setDateRange(dates ? [dates[0], dates[1]] : [null, null]); }} placeholder={['开始日期', '结束日期']} style={{ width: 250 }} /> - +
+ {exportProgress &&
{exportProgress}
} { loading={loading} pagination={{ current: page, - pageSize: pageSize, - total: total, - onChange: handlePageChange, + pageSize, + total, + onChange: (p, ps) => { setPage(p); setPageSize(ps); }, showSizeChanger: true, showTotal: (t) => `共 ${t} 条记录`, }} - scroll={{ x: 800 }} + scroll={{ x: 1900 }} /> diff --git a/video-gen-admin/src/pages/AdminUsers.tsx b/video-gen-admin/src/pages/AdminUsers.tsx index e1fbd0ca..eac8c48d 100644 --- a/video-gen-admin/src/pages/AdminUsers.tsx +++ b/video-gen-admin/src/pages/AdminUsers.tsx @@ -5,7 +5,7 @@ import { import { UserOutlined, WalletOutlined, SearchOutlined, StopOutlined, CheckCircleOutlined, PlusOutlined, MenuOutlined, LockOutlined, SettingOutlined, SaveOutlined, } from '@ant-design/icons'; -import { getAdminUsers, adjustCredits, toggleUserStatus, createUser, updateUserMenus, getMenuConfigs, resetUserPassword, getSystemConfigs, updateSystemConfig } from '../api'; +import { getAdminUsers, adjustCredits, toggleUserStatus, createUser, updateUserMenus, getMenuConfigs, resetUserPassword, getSystemConfigs, updateSystemConfig, updateFrontendUserKind } from '../api'; import type { AdminUser, SystemConfig } from '../types'; import { formatDate } from '../utils/formatDate'; @@ -14,6 +14,7 @@ const AdminUsers: React.FC = () => { const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); const [activeTab, setActiveTab] = useState('frontend'); + const [frontendKindFilter, setFrontendKindFilter] = useState(''); const [creditModal, setCreditModal] = useState<{ open: boolean; user: AdminUser | null }>({ open: false, user: null }); const [createModal, setCreateModal] = useState(false); const [createType, setCreateType] = useState('frontend'); @@ -36,14 +37,14 @@ const AdminUsers: React.FC = () => { const load = async () => { setLoading(true); try { - const data = await getAdminUsers(page, pageSize, search || undefined); + const data = await getAdminUsers(page, pageSize, search || undefined, activeTab, activeTab === 'frontend' ? (frontendKindFilter || undefined) : undefined); setUsers(data.items || []); setTotal(data.total || 0); } catch { /* auth error handled by client */ } setLoading(false); }; - useEffect(() => { load(); }, [page, pageSize, search]); + useEffect(() => { load(); }, [page, pageSize, search, activeTab, frontendKindFilter]); useEffect(() => { const loadCreditConfigs = async () => { @@ -116,6 +117,7 @@ const AdminUsers: React.FC = () => { phone: userType === 'frontend' ? values.phone : (values.phone || undefined), credits: values.credits || 0, user_type: userType, + frontend_user_kind: values.frontend_user_kind || 'external', }); message.success('用户创建成功'); setCreateModal(false); @@ -176,7 +178,16 @@ const AdminUsers: React.FC = () => { } catch { /* validation */ } }; - const filteredUsers = users.filter(u => u.userType === activeTab); + const handleUpdateFrontendKind = async (user: AdminUser, kind: 'internal' | 'external') => { + try { + await updateFrontendUserKind(user.id, kind); + message.success(kind === 'internal' ? '已设为前台内部用户' : '已设为前台外部用户'); + load(); + } catch (e: any) { + message.error(e?.message || '设置失败'); + } + }; + const isAdminTab = activeTab === 'admin'; const columns = [ @@ -214,6 +225,10 @@ const AdminUsers: React.FC = () => { title: '手机号', dataIndex: 'phone', width: 130, render: (v: string) => {v || '-'}, }, + ...(!isAdminTab ? [{ + title: '前台归类', dataIndex: 'frontendUserKind', width: 110, + render: (v: string) => {v === 'internal' ? '内部用户' : '外部用户'}, + }] : []), { title: '状态', dataIndex: 'isActive', width: 80, render: (v: boolean) => ( @@ -238,6 +253,12 @@ const AdminUsers: React.FC = () => { 调整积分 )} + {!isAdminTab && r.frontendUserKind !== 'internal' && ( + + )} + {!isAdminTab && r.frontendUserKind === 'internal' && ( + + )}
{ { value: 'admin', label: '后台管理员' }, ]} /> + {createType === 'frontend' && ( + + diff --git a/video-gen-admin/src/types/index.ts b/video-gen-admin/src/types/index.ts index f548ceeb..3646e275 100644 --- a/video-gen-admin/src/types/index.ts +++ b/video-gen-admin/src/types/index.ts @@ -104,6 +104,7 @@ export interface AdminUser { isActive: boolean; isAdmin: boolean; userType: string; + frontendUserKind: 'internal' | 'external'; createdAt: string; lastLoginAt?: string; allowedMenus?: string[] | null; @@ -277,7 +278,6 @@ export interface GenerationAIEngineSnapshot { id?: string; name?: string; provider?: string; - modelName?: string; supportedModels?: string[]; defaultSize?: string; selectedSize?: string; @@ -673,3 +673,98 @@ export interface VideoPromptSchemaPreviewOut { runtimeSchema: Record; timePlan: Record[]; } + + +export interface AdminCreditRecordSummary { + totalRecharge: number; + totalConsume: number; + totalRefund: number; + transactionCount: number; + generationCount: number; + generationAttemptCount: number; + imageGenerationCount: number; + videoGenerationCount: number; + imageConsume: number; + videoConsume: number; + textConsume: number; + analysisConsume: number; + totalTokens: number; + inputTokens: number; + outputTokens: number; +} + +export interface AdminCreditRecord { + id: string; + userId: string; + username?: string; + phone?: string; + email?: string; + userType?: string; + userTypeLabel?: string; + frontendUserKind?: string; + frontendUserKindLabel?: string; + type: string; + recordType: string; + recordTypeLabel?: string; + amount: number; + balanceAfter: number; + description?: string; + relatedId?: string; + bizKey?: string; + refundForBizKey?: string; + ownerType?: string; + ownerId?: string; + ownerDeleted?: boolean; + ownerDeletedAt?: string; + attemptNo?: number; + chargeKind?: string; + chargeKindLabel?: string; + chargeAction?: string; + creditSubject?: string; + creditSubjectLabel?: string; + mediaType?: string; + mediaTypeLabel?: string; + billingScene?: string; + billingSceneLabel?: string; + sourceModule?: string; + sourceModuleLabel?: string; + sourceProjectId?: string; + sourceStepId?: string; + sourceStepCode?: string; + sourceStepCodeLabel?: string; + tokenUsageId?: string; + inputTokens: number; + outputTokens: number; + totalTokens: number; + engineType?: string; + engineId?: string; + engineName?: string; + engineProvider?: string; + engineModelName?: string; + createdAt?: string; +} + +export interface AdminCreditRecordListResponse { + items: AdminCreditRecord[]; + total: number; + summary: AdminCreditRecordSummary; +} + +export interface AdminCreditRecordQueryParams { + page?: number; + pageSize?: number; + userId?: string; + userName?: string; + userType?: string; + frontendUserKind?: string; + recordType?: string; + type?: string; + creditSubject?: string; + mediaType?: string; + chargeKind?: string; + sourceModule?: string; + sourceStepCode?: string; + billingScene?: string; + startDate?: string; + endDate?: string; +} diff --git a/video-gen-admin/src/types/xlsx-js-style.d.ts b/video-gen-admin/src/types/xlsx-js-style.d.ts new file mode 100644 index 00000000..7ccb0cac --- /dev/null +++ b/video-gen-admin/src/types/xlsx-js-style.d.ts @@ -0,0 +1,4 @@ +declare module 'xlsx-js-style' { + export const utils: any; + export function writeFile(workbook: any, filename: string, options?: any): void; +} diff --git a/video-gen-admin/src/utils/excelExport.ts b/video-gen-admin/src/utils/excelExport.ts new file mode 100644 index 00000000..1fc46324 --- /dev/null +++ b/video-gen-admin/src/utils/excelExport.ts @@ -0,0 +1,212 @@ +import * as XLSX from 'xlsx-js-style'; + +export type ExcelCellValue = string | number | boolean | Date | null | undefined; + +export interface StyledExcelColumn { + title: string; + key?: string; + width?: number; + minWidth?: number; + maxWidth?: number; + align?: 'left' | 'center' | 'right'; + numFmt?: string; + render: (row: T, rowIndex: number) => ExcelCellValue; +} + +export interface StyledExcelExportOptions { + filename: string; + sheetName: string; + title?: string; + metadataRows?: ExcelCellValue[][]; + summaryRows?: ExcelCellValue[][]; + columns: StyledExcelColumn[]; + rows: T[]; +} + +const BLACK_BORDER = { + top: { style: 'thin', color: { rgb: '000000' } }, + right: { style: 'thin', color: { rgb: '000000' } }, + bottom: { style: 'thin', color: { rgb: '000000' } }, + left: { style: 'thin', color: { rgb: '000000' } }, +}; + +const BASE_ALIGNMENT = { + vertical: 'center', + wrapText: true, +}; + +const TITLE_STYLE = { + font: { bold: true, sz: 16, color: { rgb: 'FFFFFF' } }, + fill: { fgColor: { rgb: '111827' } }, + alignment: { ...BASE_ALIGNMENT, horizontal: 'center' }, + border: BLACK_BORDER, +}; + +const SECTION_LABEL_STYLE = { + font: { bold: true, color: { rgb: '111827' } }, + fill: { fgColor: { rgb: 'F3F4F6' } }, + alignment: { ...BASE_ALIGNMENT, horizontal: 'center' }, + border: BLACK_BORDER, +}; + +const SECTION_VALUE_STYLE = { + font: { color: { rgb: '111827' } }, + fill: { fgColor: { rgb: 'FFFFFF' } }, + alignment: { ...BASE_ALIGNMENT, horizontal: 'left' }, + border: BLACK_BORDER, +}; + +const HEADER_STYLE = { + font: { bold: true, color: { rgb: 'FFFFFF' } }, + fill: { fgColor: { rgb: '374151' } }, + alignment: { ...BASE_ALIGNMENT, horizontal: 'center' }, + border: BLACK_BORDER, +}; + +const BODY_STYLE = { + font: { color: { rgb: '111827' } }, + fill: { fgColor: { rgb: 'FFFFFF' } }, + alignment: { ...BASE_ALIGNMENT, horizontal: 'left' }, + border: BLACK_BORDER, +}; + +function normalizeCellValue(value: ExcelCellValue): ExcelCellValue { + if (value === null || value === undefined) return ''; + return value; +} + +function visualLength(value: ExcelCellValue): number { + if (value === null || value === undefined) return 0; + const text = value instanceof Date ? value.toISOString() : String(value); + const lines = text.split(/\r?\n/); + return Math.max(...lines.map((line) => Array.from(line).reduce((len, ch) => len + (ch.charCodeAt(0) > 255 ? 2 : 1), 0)), 0); +} + +function clamp(value: number, min: number, max: number): number { + return Math.min(max, Math.max(min, value)); +} + +function estimateColumnWidths(rows: ExcelCellValue[][], columns: StyledExcelColumn[]): { wch: number }[] { + const totalColumns = Math.max(columns.length, ...rows.map((row) => row.length)); + return Array.from({ length: totalColumns }, (_, index) => { + const config = columns[index]; + if (config?.width) return { wch: config.width }; + + const maxLength = rows.reduce((max, row) => Math.max(max, visualLength(row[index])), visualLength(config?.title)); + const minWidth = config?.minWidth ?? 10; + const maxWidth = config?.maxWidth ?? 42; + return { wch: clamp(Math.ceil(maxLength * 1.15) + 2, minWidth, maxWidth) }; + }); +} + +function estimateRowHeight(row: ExcelCellValue[], colWidths: { wch: number }[], baseHeight = 20): number { + const maxLines = row.reduce((max, cell, index) => { + const width = Math.max(8, colWidths[index]?.wch || 12); + const text = cell === null || cell === undefined ? '' : String(cell); + const explicitLines = text.split(/\r?\n/); + const wrappedLines = explicitLines.reduce((sum, line) => sum + Math.max(1, Math.ceil(visualLength(line) / Math.max(8, width - 2))), 0); + return Math.max(max, wrappedLines); + }, 1); + + return clamp(baseHeight + (maxLines - 1) * 16, baseHeight, 120); +} + +function applyCellStyle(cell: any, style: any, numFmt?: string): void { + cell.s = { + ...style, + alignment: { ...style.alignment }, + border: BLACK_BORDER, + }; + if (numFmt) cell.z = numFmt; +} + +function isNumericCell(value: ExcelCellValue): boolean { + return typeof value === 'number' && Number.isFinite(value); +} + +export function exportStyledExcel(options: StyledExcelExportOptions): void { + const { filename, sheetName, title, metadataRows = [], summaryRows = [], columns, rows } = options; + const totalColumns = Math.max(1, columns.length); + const aoa: ExcelCellValue[][] = []; + let titleRowIndex = -1; + let headerRowIndex = -1; + + if (title) { + titleRowIndex = aoa.length; + aoa.push([title, ...Array.from({ length: totalColumns - 1 }, () => '')]); + } + + metadataRows.forEach((row) => aoa.push(row.map(normalizeCellValue))); + summaryRows.forEach((row) => aoa.push(row.map(normalizeCellValue))); + + if (metadataRows.length || summaryRows.length) { + aoa.push(Array.from({ length: totalColumns }, () => '')); + } + + headerRowIndex = aoa.length; + aoa.push(columns.map((column) => column.title)); + rows.forEach((row, rowIndex) => { + aoa.push(columns.map((column) => normalizeCellValue(column.render(row, rowIndex)))); + }); + + const worksheet = XLSX.utils.aoa_to_sheet(aoa); + const range = XLSX.utils.decode_range(worksheet['!ref'] || 'A1:A1'); + const colWidths = estimateColumnWidths(aoa, columns); + + worksheet['!cols'] = colWidths; + worksheet['!rows'] = aoa.map((row, index) => { + if (index === titleRowIndex) return { hpt: 34 }; + if (index === headerRowIndex) return { hpt: 28 }; + if (row.every((cell) => cell === '')) return { hpt: 10 }; + return { hpt: estimateRowHeight(row, colWidths) }; + }); + + if (titleRowIndex >= 0 && totalColumns > 1) { + worksheet['!merges'] = worksheet['!merges'] || []; + worksheet['!merges'].push({ + s: { r: titleRowIndex, c: 0 }, + e: { r: titleRowIndex, c: totalColumns - 1 }, + }); + } + + worksheet['!autofilter'] = { + ref: XLSX.utils.encode_range({ + s: { r: headerRowIndex, c: 0 }, + e: { r: Math.max(headerRowIndex, aoa.length - 1), c: totalColumns - 1 }, + }), + }; + + for (let rowIndex = range.s.r; rowIndex <= range.e.r; rowIndex += 1) { + for (let colIndex = range.s.c; colIndex <= range.e.c; colIndex += 1) { + const address = XLSX.utils.encode_cell({ r: rowIndex, c: colIndex }); + const cell = worksheet[address] || { t: 's', v: '' }; + worksheet[address] = cell; + + if (rowIndex === titleRowIndex) { + applyCellStyle(cell, TITLE_STYLE); + continue; + } + + if (rowIndex === headerRowIndex) { + applyCellStyle(cell, HEADER_STYLE); + continue; + } + + if (rowIndex < headerRowIndex) { + applyCellStyle(cell, colIndex === 0 ? SECTION_LABEL_STYLE : SECTION_VALUE_STYLE, isNumericCell(cell.v) ? '#,##0.00' : undefined); + continue; + } + + const column = columns[colIndex]; + const align = column?.align || (isNumericCell(cell.v) ? 'right' : 'left'); + applyCellStyle(cell, { + ...BODY_STYLE, + alignment: { ...BASE_ALIGNMENT, horizontal: align }, + }, column?.numFmt || (isNumericCell(cell.v) ? '#,##0.00' : undefined)); + } + } + + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, sheetName); + XLSX.writeFile(workbook, filename); +} diff --git a/video-gen-api/app/api/v1/admin.py b/video-gen-api/app/api/v1/admin.py index 8226626f..3d49b55a 100644 --- a/video-gen-api/app/api/v1/admin.py +++ b/video-gen-api/app/api/v1/admin.py @@ -22,6 +22,7 @@ from app.models.video_engine import VideoEngine from app.models.image_engine import ImageEngine from app.models.credit_ratio import CreditRatio from app.models.operation_log import OperationLog +from app.enums.user import FrontendUserKind, UserType from app.schemas.admin import ( CreditAdjustRequest, ModelConfigCreate, @@ -33,6 +34,7 @@ from app.schemas.admin import ( CreateUserRequest, UpdateMenusRequest, ResetPasswordRequest, + UpdateFrontendUserKindRequest, OperationLogOut, ) from app.schemas.industry import IndustryConfigCreate, IndustryConfigOut @@ -40,6 +42,8 @@ from app.schemas.video_engine import VideoEngineCreate, VideoEngineOut from app.schemas.image_engine import ImageEngineCreate, ImageEngineOut from app.schemas.credit_ratio import CreditRatioCreate, CreditRatioOut from app.services.credits import add_credits, deduct_credits +from app.services.credit_record_meta_service import build_admin_adjust_meta +from app.services.admin_credit_record_service import list_admin_credit_records from app.services.notification import create_notification from app.services.auth import hash_password, verify_password from app.services.operation_log import log_operation @@ -82,15 +86,24 @@ async def list_users( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=1000), search: str = Query(""), + user_type: str | None = Query(None, pattern="^(frontend|admin)$"), + frontend_user_kind: str | None = Query(None, pattern="^(internal|external)$"), admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): query = select(User).order_by(User.created_at.desc()) count_query = select(func.count(User.id)) if search: - search_filter = (User.username.ilike(f"%{search}%")) | (User.email.ilike(f"%{search}%")) + like = f"%{search}%" + search_filter = (User.username.ilike(like)) | (User.email.ilike(like)) | (User.phone.ilike(like)) query = query.where(search_filter) count_query = count_query.where(search_filter) + if user_type: + query = query.where(User.user_type == user_type) + count_query = count_query.where(User.user_type == user_type) + if frontend_user_kind: + query = query.where(User.user_type == UserType.FRONTEND.value, User.frontend_user_kind == frontend_user_kind) + count_query = count_query.where(User.user_type == UserType.FRONTEND.value, User.frontend_user_kind == frontend_user_kind) total = (await db.execute(count_query)).scalar() or 0 result = await db.execute(query.offset((page - 1) * page_size).limit(page_size)) items = result.scalars().all() @@ -132,6 +145,7 @@ async def create_user( credits=req.credits, is_admin=(req.user_type == "admin"), user_type=req.user_type, + frontend_user_kind=req.frontend_user_kind if req.user_type == "frontend" else FrontendUserKind.EXTERNAL.value, allowed_menus=req.allowed_menus, ) user.credits = round(user.credits, 2) @@ -180,9 +194,9 @@ async def adjust_credits( db: AsyncSession = Depends(get_db), ): if req.amount > 0: - await add_credits(db, user_id, req.amount, f"管理员调整: {req.description}") + await add_credits(db, user_id, req.amount, f"管理员调整: {req.description}", record_meta=build_admin_adjust_meta()) else: - await deduct_credits(db, user_id, abs(req.amount), f"管理员调整: {req.description}") + await deduct_credits(db, user_id, abs(req.amount), f"管理员调整: {req.description}", record_meta=build_admin_adjust_meta()) await create_notification( db, user_id, "积分变动通知", f"您的积分已{'增加' if req.amount > 0 else '扣除'}{abs(req.amount)}积分。原因:{req.description}", @@ -208,6 +222,25 @@ async def update_user_status( return {"message": "ok"} +@router.put("/users/{user_id}/frontend-kind", response_model=AdminUserOut) +async def update_user_frontend_kind( + user_id: str, + req: UpdateFrontendUserKindRequest, + admin: User = Depends(get_admin_user), + db: AsyncSession = Depends(get_db), +): + result = await db.execute(select(User).where(User.id == user_id).limit(1)) + user = result.scalar_one_or_none() + if not user: + raise HTTPException(status_code=404, detail="用户不存在") + if user.user_type != UserType.FRONTEND.value: + raise HTTPException(status_code=400, detail="仅前台用户支持设置内部/外部归类") + user.frontend_user_kind = req.frontend_user_kind or FrontendUserKind.EXTERNAL.value + await db.flush() + await log_operation(db, admin.id, admin.username, f"设置前台用户归类为 {user.frontend_user_kind}", "PUT", f"/admin/users/{user_id}/frontend-kind") + return user + + @router.put("/users/{user_id}/reset-password") async def reset_user_password( user_id: str, @@ -248,66 +281,43 @@ async def admin_change_password( @router.get("/credit-records") async def list_credit_records( page: int = Query(1, ge=1), - page_size: int = Query(20, ge=1, le=500), + page_size: int = Query(20, ge=1, le=1000), user_id: str | None = Query(None), user_name: str | None = Query(None), + user_type: str | None = Query(None), + frontend_user_kind: str | None = Query(None), + record_type: str | None = Query(None), type: str | None = Query(None), + credit_subject: str | None = Query(None), + media_type: str | None = Query(None), + charge_kind: str | None = Query(None), + source_module: str | None = Query(None), + source_step_code: str | None = Query(None), + billing_scene: str | None = Query(None), start_date: str = Query(None), end_date: str = Query(None), admin: User = Depends(get_admin_user), db: AsyncSession = Depends(get_db), ): - """List all credit transaction records with filters.""" - query = select(CreditRecord, User.username).join( - User, CreditRecord.user_id == User.id, isouter=True - ).order_by(CreditRecord.created_at.desc(), CreditRecord.id.desc()) - - count_query = select(func.count(CreditRecord.id)) - - if user_id: - query = query.where(CreditRecord.user_id == user_id) - count_query = count_query.where(CreditRecord.user_id == user_id) - if user_name: - query = query.where(User.username.like(f'%{user_name}%')) - count_query = count_query.join(User, CreditRecord.user_id == User.id).where(User.username.like(f'%{user_name}%')) - if type: - query = query.where(CreditRecord.type == type) - count_query = count_query.where(CreditRecord.type == type) - - try: - if start_date: - date_start = datetime.strptime(start_date, "%Y-%m-%d") - query = query.where(CreditRecord.created_at >= date_start) - count_query = count_query.where(CreditRecord.created_at >= date_start) - if end_date: - date_end = datetime.strptime(end_date, "%Y-%m-%d") - date_end = date_end.replace(hour=23, minute=59, second=59, microsecond=999999) - query = query.where(CreditRecord.created_at <= date_end) - count_query = count_query.where(CreditRecord.created_at <= date_end) - except: - pass - - total = (await db.execute(count_query)).scalar() or 0 - result = await db.execute(query.offset((page - 1) * page_size).limit(page_size)) - rows = result.all() - - return { - "total": total, - "items": [ - { - "id": record.id, - "user_id": record.user_id, - "username": username, - "type": record.type, - "amount": round(record.amount, 2), - "balance_after": round(record.balance_after, 2), - "description": record.description, - "related_id": record.related_id, - "created_at": _iso(record.created_at), - } - for record, username in rows - ], - } + """List all credit transaction records with filters and full summary.""" + return await list_admin_credit_records( + db, + page=page, + page_size=page_size, + user_id=user_id, + user_name=user_name, + user_type=user_type, + frontend_user_kind=frontend_user_kind, + record_type=record_type or type, + credit_subject=credit_subject, + media_type=media_type, + charge_kind=charge_kind, + source_module=source_module, + source_step_code=source_step_code, + billing_scene=billing_scene, + start_date=start_date, + end_date=end_date, + ) # ── Notification Admin ─────────────────────────────────── diff --git a/video-gen-api/app/api/v1/generation.py b/video-gen-api/app/api/v1/generation.py index 8b6b4dd0..a4c40c9f 100644 --- a/video-gen-api/app/api/v1/generation.py +++ b/video-gen-api/app/api/v1/generation.py @@ -35,12 +35,15 @@ from app.services.resource_accounting_service import ( ) from app.services.resource_signed_url_service import build_resource_signed_url from app.services.generation_billing_service import ( + CHARGE_TEXT_PROMPT, OWNER_GENERATION_RECORD, + build_credit_biz_key, charge_generation_media_by_params, charge_generation_media_for_record, get_next_credit_attempt_no, ) from app.services.generation_refund_service import mark_generation_record_failed_and_refund_once +from app.services.credit_record_meta_service import build_generation_record_prompt_meta from app.services.video_cover_service import async_create_video_cover_for_local_video from app.utils.id_gen import generate_id from app.utils.exceptions import InsufficientCreditsError, RecordNotFoundError, InvalidStatusError @@ -304,9 +307,27 @@ async def optimize( failed_record_id = record.id failed_user_id = current_user.id try: + prompt_attempt_no = 1 + prompt_biz_key = build_credit_biz_key( + owner_type=OWNER_GENERATION_RECORD, + owner_id=record.id, + attempt_no=prompt_attempt_no, + charge_kind=CHARGE_TEXT_PROMPT, + action="charge", + ) + prompt_meta = await build_generation_record_prompt_meta( + db, + record_id=record.id, + attempt_no=prompt_attempt_no, + charge_kind=CHARGE_TEXT_PROMPT, + usage=token_usage, + ) await deduct_credits( db, current_user.id, text_credits, f"提示词优化 - {project.name}", + related_id=record.id, + biz_key=prompt_biz_key, + record_meta=prompt_meta, ) except InsufficientCreditsError as e: # /optimize 阶段只处理提示词优化扣费。 diff --git a/video-gen-api/app/enums/__init__.py b/video-gen-api/app/enums/__init__.py index c26dc623..a116920b 100644 --- a/video-gen-api/app/enums/__init__.py +++ b/video-gen-api/app/enums/__init__.py @@ -1,4 +1,8 @@ from app.enums.common import * from app.enums.hot_opening_replicate import * -from app.enums.video_prompt_schema import * +from app.enums.module_generation_flow import * from app.enums.shot_replicate import * +from app.enums.video_prompt_schema import * +from app.enums.user import * +from app.enums.credit_record import * +from app.enums.token_usage import * diff --git a/video-gen-api/app/enums/credit_record.py b/video-gen-api/app/enums/credit_record.py new file mode 100644 index 00000000..1a6c0e58 --- /dev/null +++ b/video-gen-api/app/enums/credit_record.py @@ -0,0 +1,193 @@ +from enum import Enum + + +class CreditRecordType(str, Enum): + RECHARGE = "recharge" + CONSUME = "consume" + REFUND = "refund" + + +class CreditRecordOwnerType(str, Enum): + GENERATION_RECORD = "generation_record" + CHAT_GENERATION_TASK = "chat_generation_task" + MODULE_GENERATION_PROJECT = "module_generation_project" + MODULE_GENERATION_STEP = "module_generation_step" + SHOT_REPLICATE_TASK_SET = "shot_replicate_task_set" + SHOT_REPLICATE_SEGMENT = "shot_replicate_segment" + PAYMENT_ORDER = "payment_order" + ADMIN_ADJUST = "admin_adjust" + UNKNOWN = "unknown" + + +class CreditRecordChargeKind(str, Enum): + MEDIA = "media" + TEXT_PROMPT = "text_prompt" + FILE_PARSE = "file_parse" + VISION_INPUT = "vision_input" + MODULE_CREATE = "module_create" + VIDEO_ANALYSIS = "video_analysis" + VIDEO_SPLIT = "video_split" + RECHARGE = "recharge" + REFUND = "refund" + ADMIN_ADJUST = "admin_adjust" + UNKNOWN = "unknown" + + +class CreditRecordSubject(str, Enum): + MEDIA = "media" + TEXT = "text" + MODULE = "module" + ANALYSIS = "analysis" + SPLIT = "split" + RECHARGE = "recharge" + REFUND = "refund" + ADMIN_ADJUST = "admin_adjust" + UNKNOWN = "unknown" + + +class CreditRecordMediaType(str, Enum): + IMAGE = "image" + VIDEO = "video" + + +class CreditRecordAction(str, Enum): + CHARGE = "charge" + REFUND = "refund" + + +class CreditRecordSourceModule(str, Enum): + AI_CREATION = "ai_creation" + GENERATION_RECORD = "generation_record" + HOT_OPENING_REPLICATE = "hot_opening_replicate" + SHOT_REPLICATE = "shot_replicate" + PAYMENT = "payment" + ADMIN = "admin" + UNKNOWN = "unknown" + + +class CreditRecordSourceStepCode(str, Enum): + MATERIAL_INPUT = "material_input" + IMAGE_PROMPT_OPTIMIZE = "image_prompt_optimize" + IMAGE_GENERATE = "image_generate" + VIDEO_PROMPT_OPTIMIZE = "video_prompt_optimize" + VIDEO_GENERATE = "video_generate" + VIDEO_ANALYSIS = "video_analysis" + UNKNOWN = "unknown" + + +class CreditRecordBillingScene(str, Enum): + AI_CREATION_IMAGE_GENERATE = "ai_creation_image_generate" + AI_CREATION_VIDEO_GENERATE = "ai_creation_video_generate" + + GENERATION_RECORD_TEXT_PROMPT_OPTIMIZE = "generation_record_text_prompt_optimize" + GENERATION_RECORD_IMAGE_GENERATE = "generation_record_image_generate" + GENERATION_RECORD_VIDEO_GENERATE = "generation_record_video_generate" + GENERATION_RECORD_FILE_PARSE = "generation_record_file_parse" + GENERATION_RECORD_VISION_INPUT = "generation_record_vision_input" + + HOT_OPENING_PROJECT_CREATE = "hot_opening_project_create" + HOT_OPENING_IMAGE_PROMPT_OPTIMIZE = "hot_opening_image_prompt_optimize" + HOT_OPENING_IMAGE_GENERATE = "hot_opening_image_generate" + HOT_OPENING_VIDEO_PROMPT_OPTIMIZE = "hot_opening_video_prompt_optimize" + HOT_OPENING_VIDEO_GENERATE = "hot_opening_video_generate" + + SHOT_VIDEO_ANALYSIS = "shot_video_analysis" + SHOT_ORIGINAL_VIDEO_ANALYSIS = "shot_original_video_analysis" + SHOT_SEGMENT_VIDEO_ANALYSIS = "shot_segment_video_analysis" + SHOT_VIDEO_SPLIT = "shot_video_split" + SHOT_SEGMENT_REPLICATE_CREATE = "shot_segment_replicate_create" + SHOT_IMAGE_PROMPT_OPTIMIZE = "shot_image_prompt_optimize" + SHOT_IMAGE_GENERATE = "shot_image_generate" + SHOT_VIDEO_PROMPT_OPTIMIZE = "shot_video_prompt_optimize" + SHOT_VIDEO_GENERATE = "shot_video_generate" + + RECHARGE = "recharge" + ADMIN_ADJUST = "admin_adjust" + REFUND = "refund" + UNKNOWN = "unknown" + + +CREDIT_RECORD_TYPE_LABELS = { + CreditRecordType.RECHARGE.value: "充值", + CreditRecordType.CONSUME.value: "消费", + CreditRecordType.REFUND.value: "回退", +} + +CREDIT_RECORD_SUBJECT_LABELS = { + CreditRecordSubject.MEDIA.value: "图片/视频生成积分", + CreditRecordSubject.TEXT.value: "提词优化积分", + CreditRecordSubject.MODULE.value: "模块功能积分", + CreditRecordSubject.ANALYSIS.value: "分析积分", + CreditRecordSubject.SPLIT.value: "切片积分", + CreditRecordSubject.RECHARGE.value: "充值积分", + CreditRecordSubject.REFUND.value: "回退积分", + CreditRecordSubject.ADMIN_ADJUST.value: "管理员调整", + CreditRecordSubject.UNKNOWN.value: "历史未知", +} + +CREDIT_RECORD_CHARGE_KIND_LABELS = { + CreditRecordChargeKind.MEDIA.value: "媒体生成", + CreditRecordChargeKind.TEXT_PROMPT.value: "提词优化", + CreditRecordChargeKind.FILE_PARSE.value: "文件解析", + CreditRecordChargeKind.VISION_INPUT.value: "图片理解", + CreditRecordChargeKind.MODULE_CREATE.value: "创建模块项目", + CreditRecordChargeKind.VIDEO_ANALYSIS.value: "视频分析", + CreditRecordChargeKind.VIDEO_SPLIT.value: "视频切片", + CreditRecordChargeKind.RECHARGE.value: "充值", + CreditRecordChargeKind.REFUND.value: "回退", + CreditRecordChargeKind.ADMIN_ADJUST.value: "管理员调整", + CreditRecordChargeKind.UNKNOWN.value: "历史未知", +} + +CREDIT_RECORD_MEDIA_TYPE_LABELS = { + CreditRecordMediaType.IMAGE.value: "图片", + CreditRecordMediaType.VIDEO.value: "视频", +} + +CREDIT_RECORD_SOURCE_MODULE_LABELS = { + CreditRecordSourceModule.AI_CREATION.value: "AI创作", + CreditRecordSourceModule.GENERATION_RECORD.value: "项目记录", + CreditRecordSourceModule.HOT_OPENING_REPLICATE.value: "爆款开头复刻", + CreditRecordSourceModule.SHOT_REPLICATE.value: "拆镜复刻", + CreditRecordSourceModule.PAYMENT.value: "支付充值", + CreditRecordSourceModule.ADMIN.value: "后台管理", + CreditRecordSourceModule.UNKNOWN.value: "历史未知", +} + +CREDIT_RECORD_SOURCE_STEP_CODE_LABELS = { + CreditRecordSourceStepCode.MATERIAL_INPUT.value: "素材输入", + CreditRecordSourceStepCode.IMAGE_PROMPT_OPTIMIZE.value: "图片提词优化", + CreditRecordSourceStepCode.IMAGE_GENERATE.value: "图片生成", + CreditRecordSourceStepCode.VIDEO_PROMPT_OPTIMIZE.value: "视频提词优化", + CreditRecordSourceStepCode.VIDEO_GENERATE.value: "视频生成", + CreditRecordSourceStepCode.VIDEO_ANALYSIS.value: "视频分析", + CreditRecordSourceStepCode.UNKNOWN.value: "历史未知", +} + +CREDIT_RECORD_BILLING_SCENE_LABELS = { + CreditRecordBillingScene.AI_CREATION_IMAGE_GENERATE.value: "AI创作图片生成", + CreditRecordBillingScene.AI_CREATION_VIDEO_GENERATE.value: "AI创作视频生成", + CreditRecordBillingScene.GENERATION_RECORD_TEXT_PROMPT_OPTIMIZE.value: "项目记录提词优化", + CreditRecordBillingScene.GENERATION_RECORD_IMAGE_GENERATE.value: "项目记录图片生成", + CreditRecordBillingScene.GENERATION_RECORD_VIDEO_GENERATE.value: "项目记录视频生成", + CreditRecordBillingScene.GENERATION_RECORD_FILE_PARSE.value: "项目记录文件解析", + CreditRecordBillingScene.GENERATION_RECORD_VISION_INPUT.value: "项目记录图片理解", + CreditRecordBillingScene.HOT_OPENING_PROJECT_CREATE.value: "爆款开头复刻创建项目", + CreditRecordBillingScene.HOT_OPENING_IMAGE_PROMPT_OPTIMIZE.value: "爆款开头复刻图片提词优化", + CreditRecordBillingScene.HOT_OPENING_IMAGE_GENERATE.value: "爆款开头复刻图片生成", + CreditRecordBillingScene.HOT_OPENING_VIDEO_PROMPT_OPTIMIZE.value: "爆款开头复刻视频提词优化", + CreditRecordBillingScene.HOT_OPENING_VIDEO_GENERATE.value: "爆款开头复刻视频生成", + CreditRecordBillingScene.SHOT_VIDEO_ANALYSIS.value: "拆镜视频分析", + CreditRecordBillingScene.SHOT_ORIGINAL_VIDEO_ANALYSIS.value: "拆镜复刻原视频分析", + CreditRecordBillingScene.SHOT_SEGMENT_VIDEO_ANALYSIS.value: "拆镜复刻片段视频分析", + CreditRecordBillingScene.SHOT_VIDEO_SPLIT.value: "拆镜切片", + CreditRecordBillingScene.SHOT_SEGMENT_REPLICATE_CREATE.value: "从切片创建复刻项目", + CreditRecordBillingScene.SHOT_IMAGE_PROMPT_OPTIMIZE.value: "拆镜复刻图片提词优化", + CreditRecordBillingScene.SHOT_IMAGE_GENERATE.value: "拆镜复刻图片生成", + CreditRecordBillingScene.SHOT_VIDEO_PROMPT_OPTIMIZE.value: "拆镜复刻视频提词优化", + CreditRecordBillingScene.SHOT_VIDEO_GENERATE.value: "拆镜复刻视频生成", + CreditRecordBillingScene.RECHARGE.value: "充值", + CreditRecordBillingScene.ADMIN_ADJUST.value: "管理员调整", + CreditRecordBillingScene.REFUND.value: "回退", + CreditRecordBillingScene.UNKNOWN.value: "历史未知", +} diff --git a/video-gen-api/app/enums/token_usage.py b/video-gen-api/app/enums/token_usage.py new file mode 100644 index 00000000..9161ff26 --- /dev/null +++ b/video-gen-api/app/enums/token_usage.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class TokenUsageOwnerType(str, Enum): + GENERATION_RECORD = "generation_record" + CHAT_GENERATION_TASK = "chat_generation_task" + MODULE_GENERATION_STEP = "module_generation_step" + SHOT_REPLICATE_TASK_SET = "shot_replicate_task_set" + SHOT_REPLICATE_SEGMENT = "shot_replicate_segment" + UNKNOWN = "unknown" diff --git a/video-gen-api/app/enums/user.py b/video-gen-api/app/enums/user.py new file mode 100644 index 00000000..5ae95afc --- /dev/null +++ b/video-gen-api/app/enums/user.py @@ -0,0 +1,22 @@ +from enum import Enum + + +class UserType(str, Enum): + ADMIN = "admin" + FRONTEND = "frontend" + + +class FrontendUserKind(str, Enum): + INTERNAL = "internal" + EXTERNAL = "external" + + +USER_TYPE_LABELS = { + UserType.ADMIN.value: "后台用户", + UserType.FRONTEND.value: "前台用户", +} + +FRONTEND_USER_KIND_LABELS = { + FrontendUserKind.INTERNAL.value: "前台内部用户", + FrontendUserKind.EXTERNAL.value: "前台外部用户", +} diff --git a/video-gen-api/app/models/credit_record.py b/video-gen-api/app/models/credit_record.py index 908e3c84..d01d2e14 100644 --- a/video-gen-api/app/models/credit_record.py +++ b/video-gen-api/app/models/credit_record.py @@ -1,4 +1,4 @@ -from sqlalchemy import Float, ForeignKey, Index, String +from sqlalchemy import Float, ForeignKey, Index, Integer, String from sqlalchemy.orm import Mapped, mapped_column from app.models.base import Base, TimestampMixin @@ -12,13 +12,17 @@ class CreditRecord(Base, TimestampMixin): Index("uq_credit_records_user_biz_key", "user_id", "biz_key", unique=True), Index("ix_credit_records_user_refund_for_biz_key", "user_id", "refund_for_biz_key"), Index("ix_credit_records_related_type", "related_id", "type"), + Index("ix_credit_records_owner", "owner_type", "owner_id"), + Index("ix_credit_records_subject_media", "credit_subject", "media_type"), + Index("ix_credit_records_source_module_scene", "source_module", "billing_scene"), + Index("ix_credit_records_user_kind_time", "user_type_snapshot", "frontend_user_kind_snapshot", "created_at"), ) id: Mapped[str] = mapped_column(String(32), primary_key=True) user_id: Mapped[str] = mapped_column( String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True ) - type: Mapped[str] = mapped_column(String(16)) + type: Mapped[str] = mapped_column(String(16), index=True) amount: Mapped[float] = mapped_column(Float) balance_after: Mapped[float] = mapped_column(Float) description: Mapped[str] = mapped_column(String(256)) @@ -31,3 +35,34 @@ class CreditRecord(Base, TimestampMixin): # 如果当前流水是退款,记录它退的是哪一次扣费。 # 例如:generation_record:{record_id}:attempt:1:media:charge refund_for_biz_key: Mapped[str | None] = mapped_column(String(160), nullable=True, index=True) + + # 账务快照字段:保证业务步骤/资源软删后,流水仍可独立展示。 + owner_type: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + owner_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + attempt_no: Mapped[int | None] = mapped_column(Integer, nullable=True) + + charge_kind: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True) + charge_action: Mapped[str | None] = mapped_column(String(16), nullable=True) + credit_subject: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True) + media_type: Mapped[str | None] = mapped_column(String(16), nullable=True, index=True) + billing_scene: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + + source_module: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + source_project_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + source_step_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + source_step_code: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + + token_usage_id: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True) + input_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + output_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + total_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + + + engine_type: Mapped[str | None] = mapped_column(String(16), nullable=True) + engine_id: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True) + engine_name: Mapped[str | None] = mapped_column(String(128), nullable=True) + engine_provider: Mapped[str | None] = mapped_column(String(64), nullable=True) + engine_model_name: Mapped[str | None] = mapped_column(String(128), nullable=True) + + user_type_snapshot: Mapped[str | None] = mapped_column(String(16), nullable=True, index=True) + frontend_user_kind_snapshot: Mapped[str | None] = mapped_column(String(16), nullable=True, index=True) diff --git a/video-gen-api/app/models/module_generation_step.py b/video-gen-api/app/models/module_generation_step.py index 81156be1..1d378050 100644 --- a/video-gen-api/app/models/module_generation_step.py +++ b/video-gen-api/app/models/module_generation_step.py @@ -3,7 +3,7 @@ from __future__ import annotations from datetime import datetime from typing import Any -from sqlalchemy import Boolean, DateTime, ForeignKey, Index, Integer, JSON, String, Text +from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Index, Integer, JSON, String, Text from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column @@ -72,3 +72,11 @@ class ModuleGenerationStep(Base, TimestampMixin, SoftDeleteMixin): error_message: Mapped[str | None] = mapped_column(Text, nullable=True) started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + + # 提词优化成本快照,避免后台/详情页反复解析 output_json.usage。 + token_usage_id: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True) + model_config_id: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True) + input_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + output_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + total_tokens: Mapped[int | None] = mapped_column(Integer, nullable=True) + text_credits_cost: Mapped[float | None] = mapped_column(Float, nullable=True) diff --git a/video-gen-api/app/models/token_usage.py b/video-gen-api/app/models/token_usage.py index c08fd0d8..de403537 100644 --- a/video-gen-api/app/models/token_usage.py +++ b/video-gen-api/app/models/token_usage.py @@ -1,6 +1,4 @@ -from datetime import datetime - -from sqlalchemy import DateTime, ForeignKey, Integer, String +from sqlalchemy import ForeignKey, Index, Integer, String from sqlalchemy.orm import Mapped, mapped_column from app.models.base import Base, TimestampMixin @@ -8,6 +6,10 @@ from app.models.base import Base, TimestampMixin class TokenUsage(Base, TimestampMixin): __tablename__ = "token_usage" + __table_args__ = ( + Index("ix_token_usage_owner", "owner_type", "owner_id"), + Index("ix_token_usage_biz_key", "biz_key"), + ) id: Mapped[str] = mapped_column(String(32), primary_key=True) model_config_id: Mapped[str | None] = mapped_column( @@ -19,3 +21,9 @@ class TokenUsage(Base, TimestampMixin): input_tokens: Mapped[int] = mapped_column(Integer, default=0) output_tokens: Mapped[int] = mapped_column(Integer, default=0) total_tokens: Mapped[int] = mapped_column(Integer, default=0) + + owner_type: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + owner_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + biz_key: Mapped[str | None] = mapped_column(String(160), nullable=True, index=True) + source_module: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + source_step_code: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) diff --git a/video-gen-api/app/models/user.py b/video-gen-api/app/models/user.py index 573d6d87..ae276098 100644 --- a/video-gen-api/app/models/user.py +++ b/video-gen-api/app/models/user.py @@ -1,8 +1,9 @@ from datetime import datetime -from sqlalchemy import Boolean, DateTime, Float, Integer, String, JSON +from sqlalchemy import Boolean, DateTime, Float, String, JSON from sqlalchemy.orm import Mapped, mapped_column +from app.enums.user import FrontendUserKind from app.models.base import Base, TimestampMixin @@ -19,7 +20,15 @@ class User(Base, TimestampMixin): credits: Mapped[float] = mapped_column(Float, default=0.0) is_active: Mapped[bool] = mapped_column(Boolean, default=True) is_admin: Mapped[bool] = mapped_column(Boolean, default=False) - user_type: Mapped[str] = mapped_column(String(16), default="frontend") + user_type: Mapped[str] = mapped_column(String(16), default="frontend", index=True) + # 仅前台用户有业务意义;默认外部用户。取消内部标记时也设置回 external。 + frontend_user_kind: Mapped[str] = mapped_column( + String(16), + default=FrontendUserKind.EXTERNAL.value, + server_default=FrontendUserKind.EXTERNAL.value, + index=True, + nullable=False, + ) last_login_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True ) diff --git a/video-gen-api/app/schemas/admin.py b/video-gen-api/app/schemas/admin.py index f454475d..8a6abfc6 100644 --- a/video-gen-api/app/schemas/admin.py +++ b/video-gen-api/app/schemas/admin.py @@ -50,6 +50,7 @@ class AdminUserOut(BaseModel): is_active: bool is_admin: bool user_type: str = "frontend" + frontend_user_kind: str = "external" created_at: NaiveDatetime last_login_at: NaiveDatetimeOptional = None allowed_menus: list | None = None @@ -64,9 +65,14 @@ class CreateUserRequest(BaseModel): phone: str | None = None credits: float = 0.0 user_type: str = Field(default="frontend", pattern="^(frontend|admin)$") + frontend_user_kind: str = Field(default="external", pattern="^(internal|external)$") allowed_menus: list | None = None +class UpdateFrontendUserKindRequest(BaseModel): + frontend_user_kind: str = Field(..., pattern="^(internal|external)$") + + class UpdateMenusRequest(BaseModel): allowed_menus: list | None = None @@ -104,3 +110,78 @@ class AdminStatsOut(BaseModel): last_period_records: int = 0 last_period_revenue: float = 0.0 last_period_credits_consumed: float = 0.0 + + +class AdminCreditRecordSummaryOut(BaseModel): + total_recharge: float = 0.0 + total_consume: float = 0.0 + total_refund: float = 0.0 + transaction_count: int = 0 + generation_count: int = 0 + generation_attempt_count: int = 0 + image_generation_count: int = 0 + video_generation_count: int = 0 + image_consume: float = 0.0 + video_consume: float = 0.0 + text_consume: float = 0.0 + analysis_consume: float = 0.0 + total_tokens: int = 0 + input_tokens: int = 0 + output_tokens: int = 0 + + +class AdminCreditRecordOut(BaseModel): + id: str + user_id: str + username: str | None = None + phone: str | None = None + email: str | None = None + user_type: str | None = None + user_type_label: str | None = None + frontend_user_kind: str | None = None + frontend_user_kind_label: str | None = None + type: str + record_type: str + record_type_label: str | None = None + amount: float + balance_after: float + description: str | None = None + related_id: str | None = None + biz_key: str | None = None + refund_for_biz_key: str | None = None + owner_type: str | None = None + owner_id: str | None = None + owner_deleted: bool = False + owner_deleted_at: str | None = None + attempt_no: int | None = None + charge_kind: str | None = None + charge_kind_label: str | None = None + charge_action: str | None = None + credit_subject: str | None = None + credit_subject_label: str | None = None + media_type: str | None = None + media_type_label: str | None = None + billing_scene: str | None = None + billing_scene_label: str | None = None + source_module: str | None = None + source_module_label: str | None = None + source_project_id: str | None = None + source_step_id: str | None = None + source_step_code: str | None = None + source_step_code_label: str | None = None + token_usage_id: str | None = None + input_tokens: int = 0 + output_tokens: int = 0 + total_tokens: int = 0 + engine_type: str | None = None + engine_id: str | None = None + engine_name: str | None = None + engine_provider: str | None = None + engine_model_name: str | None = None + created_at: str | None = None + + +class AdminCreditRecordListOut(BaseModel): + items: list[AdminCreditRecordOut] + total: int + summary: AdminCreditRecordSummaryOut diff --git a/video-gen-api/app/services/admin_credit_record_service.py b/video-gen-api/app/services/admin_credit_record_service.py new file mode 100644 index 00000000..690d1303 --- /dev/null +++ b/video-gen-api/app/services/admin_credit_record_service.py @@ -0,0 +1,299 @@ +from __future__ import annotations + +from datetime import datetime +from typing import Any + +from sqlalchemy import and_, case, distinct, func, or_, select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.enums.credit_record import ( + CREDIT_RECORD_BILLING_SCENE_LABELS, + CREDIT_RECORD_CHARGE_KIND_LABELS, + CREDIT_RECORD_MEDIA_TYPE_LABELS, + CREDIT_RECORD_SOURCE_MODULE_LABELS, + CREDIT_RECORD_SOURCE_STEP_CODE_LABELS, + CREDIT_RECORD_SUBJECT_LABELS, + CREDIT_RECORD_TYPE_LABELS, + CreditRecordSubject, +) +from app.enums.user import FRONTEND_USER_KIND_LABELS, USER_TYPE_LABELS, UserType +from app.models.chat_generation_task import ChatGenerationTask +from app.models.credit_record import CreditRecord +from app.models.generation_record import GenerationRecord +from app.models.module_generation_project import ModuleGenerationProject +from app.models.module_generation_step import ModuleGenerationStep +from app.models.shot_replicate_segment import ShotReplicateSegment +from app.models.shot_replicate_task_set import ShotReplicateTaskSet +from app.models.user import User + + +def _iso(dt: Any) -> str | None: + if dt is None: + return None + try: + return dt.isoformat() + except Exception: + return str(dt) + + +def _round2(value: Any) -> float: + try: + return round(float(value or 0), 2) + except Exception: + return 0.0 + + +def _as_date_start(value: str | None) -> datetime | None: + if not value: + return None + try: + return datetime.strptime(value, "%Y-%m-%d") + except Exception: + return None + + +def _as_date_end(value: str | None) -> datetime | None: + if not value: + return None + try: + return datetime.strptime(value, "%Y-%m-%d").replace(hour=23, minute=59, second=59, microsecond=999999) + except Exception: + return None + + +def _label(mapping: dict[str, str], value: str | None) -> str: + if not value: + return "-" + return mapping.get(value, value) + + +def _build_filters( + *, + user_id: str | None = None, + user_name: str | None = None, + user_type: str | None = None, + frontend_user_kind: str | None = None, + record_type: str | None = None, + credit_subject: str | None = None, + media_type: str | None = None, + charge_kind: str | None = None, + source_module: str | None = None, + source_step_code: str | None = None, + billing_scene: str | None = None, + start_date: str | None = None, + end_date: str | None = None, +) -> list[Any]: + filters: list[Any] = [] + if user_id: + filters.append(CreditRecord.user_id == user_id) + if user_name: + like = f"%{user_name}%" + filters.append(or_(User.username.ilike(like), User.phone.ilike(like), User.email.ilike(like))) + if user_type: + filters.append(CreditRecord.user_type_snapshot == user_type) + if frontend_user_kind: + filters.append(CreditRecord.frontend_user_kind_snapshot == frontend_user_kind) + filters.append(CreditRecord.user_type_snapshot == UserType.FRONTEND.value) + if record_type: + filters.append(CreditRecord.type == record_type) + if credit_subject: + filters.append(CreditRecord.credit_subject == credit_subject) + if media_type: + filters.append(CreditRecord.media_type == media_type) + if charge_kind: + filters.append(CreditRecord.charge_kind == charge_kind) + if source_module: + filters.append(CreditRecord.source_module == source_module) + if source_step_code: + filters.append(CreditRecord.source_step_code == source_step_code) + if billing_scene: + filters.append(CreditRecord.billing_scene == billing_scene) + start = _as_date_start(start_date) + end = _as_date_end(end_date) + if start: + filters.append(CreditRecord.created_at >= start) + if end: + filters.append(CreditRecord.created_at <= end) + return filters + + +async def _load_deleted_map(db: AsyncSession, records: list[CreditRecord]) -> dict[tuple[str, str], tuple[bool, str | None]]: + grouped: dict[str, set[str]] = {} + for record in records: + if record.owner_type and record.owner_id: + grouped.setdefault(record.owner_type, set()).add(record.owner_id) + + model_map: dict[str, Any] = { + "chat_generation_task": ChatGenerationTask, + "generation_record": GenerationRecord, + "module_generation_project": ModuleGenerationProject, + "module_generation_step": ModuleGenerationStep, + "shot_replicate_task_set": ShotReplicateTaskSet, + "shot_replicate_segment": ShotReplicateSegment, + } + deleted_map: dict[tuple[str, str], tuple[bool, str | None]] = {} + for owner_type, ids in grouped.items(): + model = model_map.get(owner_type) + if not model or not ids: + continue + result = await db.execute(select(model.id, model.deleted_at).where(model.id.in_(ids))) + found = {row[0]: row[1] for row in result.all()} + for owner_id in ids: + deleted_at = found.get(owner_id) + deleted_map[(owner_type, owner_id)] = (bool(deleted_at), _iso(deleted_at)) if owner_id in found else (False, None) + return deleted_map + + +def _record_to_item(record: CreditRecord, user: User | None, deleted_map: dict[tuple[str, str], tuple[bool, str | None]]) -> dict[str, Any]: + owner_deleted = False + owner_deleted_at = None + if record.owner_type and record.owner_id: + owner_deleted, owner_deleted_at = deleted_map.get((record.owner_type, record.owner_id), (False, None)) + + user_type = record.user_type_snapshot or (user.user_type if user else None) + frontend_kind = record.frontend_user_kind_snapshot or (getattr(user, "frontend_user_kind", None) if user else None) + return { + "id": record.id, + "user_id": record.user_id, + "username": user.username if user else None, + "phone": user.phone if user else None, + "email": user.email if user else None, + "user_type": user_type, + "user_type_label": _label(USER_TYPE_LABELS, user_type), + "frontend_user_kind": frontend_kind, + "frontend_user_kind_label": _label(FRONTEND_USER_KIND_LABELS, frontend_kind), + "type": record.type, + "record_type": record.type, + "record_type_label": _label(CREDIT_RECORD_TYPE_LABELS, record.type), + "amount": _round2(record.amount), + "balance_after": _round2(record.balance_after), + "description": record.description, + "related_id": record.related_id, + "biz_key": record.biz_key, + "refund_for_biz_key": record.refund_for_biz_key, + "owner_type": record.owner_type, + "owner_id": record.owner_id, + "owner_deleted": owner_deleted, + "owner_deleted_at": owner_deleted_at, + "attempt_no": record.attempt_no, + "charge_kind": record.charge_kind, + "charge_kind_label": _label(CREDIT_RECORD_CHARGE_KIND_LABELS, record.charge_kind), + "charge_action": record.charge_action, + "credit_subject": record.credit_subject, + "credit_subject_label": _label(CREDIT_RECORD_SUBJECT_LABELS, record.credit_subject), + "media_type": record.media_type, + "media_type_label": _label(CREDIT_RECORD_MEDIA_TYPE_LABELS, record.media_type), + "billing_scene": record.billing_scene, + "billing_scene_label": _label(CREDIT_RECORD_BILLING_SCENE_LABELS, record.billing_scene), + "source_module": record.source_module, + "source_module_label": _label(CREDIT_RECORD_SOURCE_MODULE_LABELS, record.source_module), + "source_project_id": record.source_project_id, + "source_step_id": record.source_step_id, + "source_step_code": record.source_step_code, + "source_step_code_label": _label(CREDIT_RECORD_SOURCE_STEP_CODE_LABELS, record.source_step_code), + "token_usage_id": record.token_usage_id, + "input_tokens": record.input_tokens or 0, + "output_tokens": record.output_tokens or 0, + "total_tokens": record.total_tokens or 0, + "engine_type": record.engine_type, + "engine_id": record.engine_id, + "engine_name": record.engine_name, + "engine_provider": record.engine_provider, + "engine_model_name": record.engine_model_name, + "created_at": _iso(record.created_at), + } + + +async def list_admin_credit_records( + db: AsyncSession, + *, + page: int, + page_size: int, + user_id: str | None = None, + user_name: str | None = None, + user_type: str | None = None, + frontend_user_kind: str | None = None, + record_type: str | None = None, + credit_subject: str | None = None, + media_type: str | None = None, + charge_kind: str | None = None, + source_module: str | None = None, + source_step_code: str | None = None, + billing_scene: str | None = None, + start_date: str | None = None, + end_date: str | None = None, +) -> dict[str, Any]: + page = max(int(page or 1), 1) + page_size = min(max(int(page_size or 20), 1), 1000) + filters = _build_filters( + user_id=user_id, + user_name=user_name, + user_type=user_type, + frontend_user_kind=frontend_user_kind, + record_type=record_type, + credit_subject=credit_subject, + media_type=media_type, + charge_kind=charge_kind, + source_module=source_module, + source_step_code=source_step_code, + billing_scene=billing_scene, + start_date=start_date, + end_date=end_date, + ) + where_clause = and_(*filters) if filters else None + + base_query = select(CreditRecord, User).join(User, CreditRecord.user_id == User.id, isouter=True) + count_query = select(func.count(CreditRecord.id)).select_from(CreditRecord).join(User, CreditRecord.user_id == User.id, isouter=True) + if where_clause is not None: + base_query = base_query.where(where_clause) + count_query = count_query.where(where_clause) + total = (await db.execute(count_query)).scalar() or 0 + + result = await db.execute( + base_query.order_by(CreditRecord.created_at.desc(), CreditRecord.id.desc()) + .offset((page - 1) * page_size) + .limit(page_size) + ) + rows = result.all() + records = [row[0] for row in rows] + deleted_map = await _load_deleted_map(db, records) + items = [_record_to_item(record, user, deleted_map) for record, user in rows] + + summary_query = select( + func.coalesce(func.sum(case((CreditRecord.type == "recharge", CreditRecord.amount), else_=0)), 0), + func.coalesce(func.sum(case((CreditRecord.type == "consume", func.abs(CreditRecord.amount)), else_=0)), 0), + func.coalesce(func.sum(case((CreditRecord.type == "refund", CreditRecord.amount), else_=0)), 0), + func.count(CreditRecord.id), + func.count(distinct(case((and_(CreditRecord.credit_subject == CreditRecordSubject.MEDIA.value, CreditRecord.type == "consume"), func.concat(CreditRecord.owner_type, ":", CreditRecord.owner_id)), else_=None))), + func.count(case((and_(CreditRecord.credit_subject == CreditRecordSubject.MEDIA.value, CreditRecord.type == "consume"), 1), else_=None)), + func.count(distinct(case((and_(CreditRecord.credit_subject == CreditRecordSubject.MEDIA.value, CreditRecord.media_type == "image", CreditRecord.type == "consume"), func.concat(CreditRecord.owner_type, ":", CreditRecord.owner_id)), else_=None))), + func.count(distinct(case((and_(CreditRecord.credit_subject == CreditRecordSubject.MEDIA.value, CreditRecord.media_type == "video", CreditRecord.type == "consume"), func.concat(CreditRecord.owner_type, ":", CreditRecord.owner_id)), else_=None))), + func.coalesce(func.sum(case((and_(CreditRecord.credit_subject == CreditRecordSubject.MEDIA.value, CreditRecord.media_type == "image", CreditRecord.type == "consume"), func.abs(CreditRecord.amount)), else_=0)), 0), + func.coalesce(func.sum(case((and_(CreditRecord.credit_subject == CreditRecordSubject.MEDIA.value, CreditRecord.media_type == "video", CreditRecord.type == "consume"), func.abs(CreditRecord.amount)), else_=0)), 0), + func.coalesce(func.sum(case((and_(CreditRecord.credit_subject == CreditRecordSubject.TEXT.value, CreditRecord.type == "consume"), func.abs(CreditRecord.amount)), else_=0)), 0), + func.coalesce(func.sum(case((and_(CreditRecord.credit_subject == CreditRecordSubject.ANALYSIS.value, CreditRecord.type == "consume"), func.abs(CreditRecord.amount)), else_=0)), 0), + func.coalesce(func.sum(CreditRecord.total_tokens), 0), + func.coalesce(func.sum(CreditRecord.input_tokens), 0), + func.coalesce(func.sum(CreditRecord.output_tokens), 0), + ).select_from(CreditRecord).join(User, CreditRecord.user_id == User.id, isouter=True) + if where_clause is not None: + summary_query = summary_query.where(where_clause) + s = (await db.execute(summary_query)).one() + summary = { + "total_recharge": _round2(s[0]), + "total_consume": _round2(s[1]), + "total_refund": _round2(s[2]), + "transaction_count": int(s[3] or 0), + "generation_count": int(s[4] or 0), + "generation_attempt_count": int(s[5] or 0), + "image_generation_count": int(s[6] or 0), + "video_generation_count": int(s[7] or 0), + "image_consume": _round2(s[8]), + "video_consume": _round2(s[9]), + "text_consume": _round2(s[10]), + "analysis_consume": _round2(s[11]), + "total_tokens": int(s[12] or 0), + "input_tokens": int(s[13] or 0), + "output_tokens": int(s[14] or 0), + } + return {"items": items, "total": total, "summary": summary} diff --git a/video-gen-api/app/services/credit_record_meta_service.py b/video-gen-api/app/services/credit_record_meta_service.py new file mode 100644 index 00000000..14339537 --- /dev/null +++ b/video-gen-api/app/services/credit_record_meta_service.py @@ -0,0 +1,360 @@ +from __future__ import annotations + +from dataclasses import asdict, dataclass +from typing import Any, Mapping + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.enums.credit_record import ( + CreditRecordAction, + CreditRecordBillingScene, + CreditRecordChargeKind, + CreditRecordOwnerType, + CreditRecordSourceModule, + CreditRecordSourceStepCode, + CreditRecordSubject, +) +from app.enums.user import FrontendUserKind +from app.models.image_engine import ImageEngine +from app.models.model_config import ModelConfig +from app.models.module_generation_step import ModuleGenerationStep +from app.models.user import User +from app.models.video_engine import VideoEngine + + +@dataclass(slots=True) +class CreditRecordMeta: + owner_type: str | None = None + owner_id: str | None = None + attempt_no: int | None = None + + charge_kind: str | None = None + charge_action: str | None = None + credit_subject: str | None = None + media_type: str | None = None + billing_scene: str | None = None + + source_module: str | None = None + source_project_id: str | None = None + source_step_id: str | None = None + source_step_code: str | None = None + + token_usage_id: str | None = None + input_tokens: int | None = None + output_tokens: int | None = None + total_tokens: int | None = None + + # 统一执行配置冷备字段: + # - engine_type=model 时,engine_* 来源于 model_configs + # - engine_type=image 时,engine_* 来源于 image_engines + # - engine_type=video 时,engine_* 来源于 video_engines + engine_type: str | None = None + engine_id: str | None = None + engine_name: str | None = None + engine_provider: str | None = None + engine_model_name: str | None = None + + user_type_snapshot: str | None = None + frontend_user_kind_snapshot: str | None = None + + def to_record_kwargs(self) -> dict[str, Any]: + return {k: v for k, v in asdict(self).items() if v is not None} + + +def _safe_int(value: Any, default: int = 0) -> int: + try: + if value is None or value == "": + return default + return int(value) + except Exception: + return default + + +def _normalize_frontend_kind(value: str | None) -> str: + return value or FrontendUserKind.EXTERNAL.value + + +async def with_user_snapshot(db: AsyncSession, meta: CreditRecordMeta, user_id: str) -> CreditRecordMeta: + result = await db.execute(select(User).where(User.id == user_id).limit(1)) + user = result.scalar_one_or_none() + if user: + meta.user_type_snapshot = user.user_type + meta.frontend_user_kind_snapshot = _normalize_frontend_kind(getattr(user, "frontend_user_kind", None)) + return meta + + +async def get_model_snapshot(db: AsyncSession, model_config_id: str | None) -> dict[str, str | None]: + """把 ModelConfig 冷备为统一 engine_* 快照。""" + if not model_config_id: + return {"engine_type": "model"} + result = await db.execute(select(ModelConfig).where(ModelConfig.id == model_config_id).limit(1)) + config = result.scalar_one_or_none() + if not config: + return {"engine_type": "model", "engine_id": model_config_id} + return { + "engine_type": "model", + "engine_id": config.id, + "engine_name": config.name, + "engine_provider": config.provider, + "engine_model_name": config.model_name, + } + + +def _model_snapshot_from_usage(usage: Mapping[str, Any]) -> dict[str, str | None]: + model_config_id = usage.get("model_config_id") + return { + "engine_type": "model", + "engine_id": model_config_id, + "engine_name": usage.get("model_config_name") or usage.get("engine_name"), + "engine_provider": usage.get("model_provider") or usage.get("provider") or usage.get("engine_provider"), + "engine_model_name": usage.get("model_name") or usage.get("model") or usage.get("engine_model_name"), + } + + +async def _apply_model_snapshot(db: AsyncSession, meta: CreditRecordMeta, usage: Mapping[str, Any]) -> CreditRecordMeta: + for key, value in _model_snapshot_from_usage(usage).items(): + setattr(meta, key, value) + if meta.engine_id and not meta.engine_model_name: + for key, value in (await get_model_snapshot(db, meta.engine_id)).items(): + setattr(meta, key, value) + return meta + + +async def get_engine_snapshot(db: AsyncSession, *, gen_type: str, engine_id: str | None) -> dict[str, str | None]: + if not engine_id: + return {"engine_type": (gen_type or None)} + gen_type = (gen_type or "").lower().strip() + if gen_type == "image": + result = await db.execute(select(ImageEngine).where(ImageEngine.id == engine_id).limit(1)) + else: + result = await db.execute(select(VideoEngine).where(VideoEngine.id == engine_id).limit(1)) + engine = result.scalar_one_or_none() + if not engine: + return {"engine_type": gen_type or None, "engine_id": engine_id} + return { + "engine_type": gen_type or None, + "engine_id": engine.id, + "engine_name": getattr(engine, "name", None), + "engine_provider": getattr(engine, "provider", None), + "engine_model_name": getattr(engine, "model_name", None), + } + + +def infer_module_billing_scene(*, source_module: str | None, source_step_code: str | None, media_type: str | None = None) -> str | None: + if source_module == CreditRecordSourceModule.HOT_OPENING_REPLICATE.value: + mapping = { + "image_prompt_optimize": CreditRecordBillingScene.HOT_OPENING_IMAGE_PROMPT_OPTIMIZE.value, + "image_generate": CreditRecordBillingScene.HOT_OPENING_IMAGE_GENERATE.value, + "video_prompt_optimize": CreditRecordBillingScene.HOT_OPENING_VIDEO_PROMPT_OPTIMIZE.value, + "video_generate": CreditRecordBillingScene.HOT_OPENING_VIDEO_GENERATE.value, + } + return mapping.get(source_step_code) + if source_module == CreditRecordSourceModule.SHOT_REPLICATE.value: + mapping = { + "image_prompt_optimize": CreditRecordBillingScene.SHOT_IMAGE_PROMPT_OPTIMIZE.value, + "image_generate": CreditRecordBillingScene.SHOT_IMAGE_GENERATE.value, + "video_prompt_optimize": CreditRecordBillingScene.SHOT_VIDEO_PROMPT_OPTIMIZE.value, + "video_generate": CreditRecordBillingScene.SHOT_VIDEO_GENERATE.value, + CreditRecordSourceStepCode.VIDEO_ANALYSIS.value: CreditRecordBillingScene.SHOT_VIDEO_ANALYSIS.value, + } + return mapping.get(source_step_code) + if source_module == CreditRecordSourceModule.AI_CREATION.value: + return CreditRecordBillingScene.AI_CREATION_IMAGE_GENERATE.value if media_type == "image" else CreditRecordBillingScene.AI_CREATION_VIDEO_GENERATE.value + if source_module == CreditRecordSourceModule.GENERATION_RECORD.value: + return CreditRecordBillingScene.GENERATION_RECORD_IMAGE_GENERATE.value if media_type == "image" else CreditRecordBillingScene.GENERATION_RECORD_VIDEO_GENERATE.value + return None + + +def build_admin_adjust_meta(*, action: str = CreditRecordAction.CHARGE.value) -> CreditRecordMeta: + return CreditRecordMeta( + owner_type=CreditRecordOwnerType.ADMIN_ADJUST.value, + charge_kind=CreditRecordChargeKind.ADMIN_ADJUST.value, + charge_action=action, + credit_subject=CreditRecordSubject.ADMIN_ADJUST.value, + source_module=CreditRecordSourceModule.ADMIN.value, + billing_scene=CreditRecordBillingScene.ADMIN_ADJUST.value, + ) + + +def build_recharge_meta(*, owner_id: str | None = None) -> CreditRecordMeta: + return CreditRecordMeta( + owner_type=CreditRecordOwnerType.PAYMENT_ORDER.value if owner_id else None, + owner_id=owner_id, + charge_kind=CreditRecordChargeKind.RECHARGE.value, + charge_action=CreditRecordAction.CHARGE.value, + credit_subject=CreditRecordSubject.RECHARGE.value, + source_module=CreditRecordSourceModule.PAYMENT.value, + billing_scene=CreditRecordBillingScene.RECHARGE.value, + ) + + +def build_payment_refund_meta(*, owner_id: str | None = None) -> CreditRecordMeta: + return CreditRecordMeta( + owner_type=CreditRecordOwnerType.PAYMENT_ORDER.value if owner_id else None, + owner_id=owner_id, + charge_kind=CreditRecordChargeKind.REFUND.value, + charge_action=CreditRecordAction.REFUND.value, + credit_subject=CreditRecordSubject.REFUND.value, + source_module=CreditRecordSourceModule.PAYMENT.value, + billing_scene=CreditRecordBillingScene.REFUND.value, + ) + + +async def build_generation_media_meta( + db: AsyncSession, + *, + owner_type: str, + owner_id: str, + attempt_no: int, + gen_type: str, + engine_id: str | None, + source_module: str | None = None, + source_project_id: str | None = None, + source_step_id: str | None = None, + source_step_code: str | None = None, + billing_scene: str | None = None, +) -> CreditRecordMeta: + media_type = (gen_type or "").lower().strip() or None + if source_module is None: + source_module = CreditRecordSourceModule.GENERATION_RECORD.value if owner_type == CreditRecordOwnerType.GENERATION_RECORD.value else CreditRecordSourceModule.AI_CREATION.value + if billing_scene is None: + billing_scene = infer_module_billing_scene(source_module=source_module, source_step_code=source_step_code, media_type=media_type) + meta = CreditRecordMeta( + owner_type=owner_type, + owner_id=owner_id, + attempt_no=attempt_no, + charge_kind=CreditRecordChargeKind.MEDIA.value, + charge_action=CreditRecordAction.CHARGE.value, + credit_subject=CreditRecordSubject.MEDIA.value, + media_type=media_type, + billing_scene=billing_scene, + source_module=source_module, + source_project_id=source_project_id, + source_step_id=source_step_id, + source_step_code=source_step_code, + ) + for key, value in (await get_engine_snapshot(db, gen_type=media_type or "", engine_id=engine_id)).items(): + setattr(meta, key, value) + return meta + + +async def build_generation_record_prompt_meta( + db: AsyncSession, + *, + record_id: str, + attempt_no: int, + charge_kind: str, + usage: Mapping[str, Any], +) -> CreditRecordMeta: + scene_map = { + CreditRecordChargeKind.TEXT_PROMPT.value: CreditRecordBillingScene.GENERATION_RECORD_TEXT_PROMPT_OPTIMIZE.value, + CreditRecordChargeKind.FILE_PARSE.value: CreditRecordBillingScene.GENERATION_RECORD_FILE_PARSE.value, + CreditRecordChargeKind.VISION_INPUT.value: CreditRecordBillingScene.GENERATION_RECORD_VISION_INPUT.value, + } + meta = CreditRecordMeta( + owner_type=CreditRecordOwnerType.GENERATION_RECORD.value, + owner_id=record_id, + attempt_no=attempt_no, + charge_kind=charge_kind, + charge_action=CreditRecordAction.CHARGE.value, + credit_subject=CreditRecordSubject.TEXT.value, + billing_scene=scene_map.get(charge_kind), + source_module=CreditRecordSourceModule.GENERATION_RECORD.value, + token_usage_id=usage.get("token_usage_id"), + input_tokens=_safe_int(usage.get("input_tokens")), + output_tokens=_safe_int(usage.get("output_tokens")), + total_tokens=_safe_int(usage.get("total_tokens"), _safe_int(usage.get("input_tokens")) + _safe_int(usage.get("output_tokens"))), + ) + return await _apply_model_snapshot(db, meta, usage) + + +async def build_module_step_prompt_meta( + db: AsyncSession, + *, + step_id: str, + attempt_no: int, + usage: Mapping[str, Any], +) -> CreditRecordMeta: + result = await db.execute(select(ModuleGenerationStep).where(ModuleGenerationStep.id == step_id).limit(1)) + step = result.scalar_one_or_none() + source_module = getattr(step, "module", None) if step else None + source_step_code = getattr(step, "step_code", None) if step else None + meta = CreditRecordMeta( + owner_type=CreditRecordOwnerType.MODULE_GENERATION_STEP.value, + owner_id=step_id, + attempt_no=attempt_no, + charge_kind=CreditRecordChargeKind.TEXT_PROMPT.value, + charge_action=CreditRecordAction.CHARGE.value, + credit_subject=CreditRecordSubject.TEXT.value, + billing_scene=infer_module_billing_scene(source_module=source_module, source_step_code=source_step_code), + source_module=source_module, + source_project_id=getattr(step, "project_id", None) if step else None, + source_step_id=step_id, + source_step_code=source_step_code, + token_usage_id=usage.get("token_usage_id"), + input_tokens=_safe_int(usage.get("input_tokens")), + output_tokens=_safe_int(usage.get("output_tokens")), + total_tokens=_safe_int(usage.get("total_tokens"), _safe_int(usage.get("input_tokens")) + _safe_int(usage.get("output_tokens"))), + ) + return await _apply_model_snapshot(db, meta, usage) + + +async def build_shot_video_analysis_meta( + db: AsyncSession, + *, + owner_type: str, + owner_id: str, + attempt_no: int, + usage: Mapping[str, Any], + billing_scene: str, + source_project_id: str | None = None, + source_step_id: str | None = None, +) -> CreditRecordMeta: + meta = CreditRecordMeta( + owner_type=owner_type, + owner_id=owner_id, + attempt_no=attempt_no, + charge_kind=CreditRecordChargeKind.VIDEO_ANALYSIS.value, + charge_action=CreditRecordAction.CHARGE.value, + credit_subject=CreditRecordSubject.ANALYSIS.value, + media_type="video", + billing_scene=billing_scene, + source_module=CreditRecordSourceModule.SHOT_REPLICATE.value, + source_project_id=source_project_id, + source_step_id=source_step_id, + source_step_code=CreditRecordSourceStepCode.VIDEO_ANALYSIS.value, + token_usage_id=usage.get("token_usage_id"), + input_tokens=_safe_int(usage.get("input_tokens")), + output_tokens=_safe_int(usage.get("output_tokens")), + total_tokens=_safe_int(usage.get("total_tokens"), _safe_int(usage.get("input_tokens")) + _safe_int(usage.get("output_tokens"))), + ) + return await _apply_model_snapshot(db, meta, usage) + + +def build_refund_meta_from_charge(charge: Any, *, attempt_no: int | None = None) -> CreditRecordMeta: + return CreditRecordMeta( + owner_type=getattr(charge, "owner_type", None), + owner_id=getattr(charge, "owner_id", None), + attempt_no=attempt_no or getattr(charge, "attempt_no", None), + charge_kind=getattr(charge, "charge_kind", None), + charge_action=CreditRecordAction.REFUND.value, + credit_subject=getattr(charge, "credit_subject", None) or CreditRecordSubject.REFUND.value, + media_type=getattr(charge, "media_type", None), + billing_scene=CreditRecordBillingScene.REFUND.value, + source_module=getattr(charge, "source_module", None), + source_project_id=getattr(charge, "source_project_id", None), + source_step_id=getattr(charge, "source_step_id", None), + source_step_code=getattr(charge, "source_step_code", None), + token_usage_id=getattr(charge, "token_usage_id", None), + input_tokens=getattr(charge, "input_tokens", None), + output_tokens=getattr(charge, "output_tokens", None), + total_tokens=getattr(charge, "total_tokens", None), + engine_type=getattr(charge, "engine_type", None), + engine_id=getattr(charge, "engine_id", None), + engine_name=getattr(charge, "engine_name", None), + engine_provider=getattr(charge, "engine_provider", None), + engine_model_name=getattr(charge, "engine_model_name", None), + user_type_snapshot=getattr(charge, "user_type_snapshot", None), + frontend_user_kind_snapshot=getattr(charge, "frontend_user_kind_snapshot", None), + ) diff --git a/video-gen-api/app/services/credits.py b/video-gen-api/app/services/credits.py index fc3d045f..d00797bd 100644 --- a/video-gen-api/app/services/credits.py +++ b/video-gen-api/app/services/credits.py @@ -11,6 +11,7 @@ from app.models.image_engine import ImageEngine from app.models.credit_ratio import CreditRatio from app.utils.id_gen import generate_id from app.utils.exceptions import InsufficientCreditsError +from app.services.credit_record_meta_service import CreditRecordMeta, with_user_snapshot async def calc_text_credits(db: AsyncSession, input_tokens: int, output_tokens: int) -> float: @@ -167,6 +168,7 @@ async def deduct_credits( *, biz_key: str | None = None, refund_for_biz_key: str | None = None, + record_meta: CreditRecordMeta | dict | None = None, ) -> User: """扣减用户积分,并写入消费流水。 @@ -196,6 +198,13 @@ async def deduct_credits( raise InsufficientCreditsError() user.credits = round(float(user.credits or 0) - amount, 2) + meta_kwargs = {} + if record_meta: + if isinstance(record_meta, CreditRecordMeta): + record_meta = await with_user_snapshot(db, record_meta, user_id) + meta_kwargs = record_meta.to_record_kwargs() + elif isinstance(record_meta, dict): + meta_kwargs = {k: v for k, v in record_meta.items() if v is not None} record = CreditRecord( id=generate_id(), user_id=user_id, @@ -206,6 +215,7 @@ async def deduct_credits( related_id=related_id, biz_key=biz_key, refund_for_biz_key=refund_for_biz_key, + **meta_kwargs, ) db.add(record) await db.flush() @@ -222,6 +232,7 @@ async def add_credits( record_type: str = "recharge", biz_key: str | None = None, refund_for_biz_key: str | None = None, + record_meta: CreditRecordMeta | dict | None = None, ) -> User: """增加用户积分,并写入流水。 @@ -243,6 +254,13 @@ async def add_credits( return user user.credits = round(float(user.credits or 0) + amount, 2) + meta_kwargs = {} + if record_meta: + if isinstance(record_meta, CreditRecordMeta): + record_meta = await with_user_snapshot(db, record_meta, user_id) + meta_kwargs = record_meta.to_record_kwargs() + elif isinstance(record_meta, dict): + meta_kwargs = {k: v for k, v in record_meta.items() if v is not None} record = CreditRecord( id=generate_id(), user_id=user_id, @@ -253,6 +271,7 @@ async def add_credits( related_id=related_id, biz_key=biz_key, refund_for_biz_key=refund_for_biz_key, + **meta_kwargs, ) db.add(record) await db.flush() @@ -268,6 +287,7 @@ async def refund_credits( *, biz_key: str | None = None, refund_for_biz_key: str | None = None, + record_meta: CreditRecordMeta | dict | None = None, ) -> User: """生成失败积分回退。""" return await add_credits( @@ -279,6 +299,7 @@ async def refund_credits( record_type="refund", biz_key=biz_key, refund_for_biz_key=refund_for_biz_key, + record_meta=record_meta, ) diff --git a/video-gen-api/app/services/generation_billing_service.py b/video-gen-api/app/services/generation_billing_service.py index 51604d16..2a6a6417 100644 --- a/video-gen-api/app/services/generation_billing_service.py +++ b/video-gen-api/app/services/generation_billing_service.py @@ -4,23 +4,36 @@ import re from dataclasses import asdict, dataclass from typing import Any, Mapping -from sqlalchemy import func, select +from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession +from app.enums.credit_record import CreditRecordBillingScene, CreditRecordChargeKind, CreditRecordOwnerType, CreditRecordSourceModule from app.models.credit_record import CreditRecord from app.models.generation_record import GenerationRecord +from app.models.module_generation_step import ModuleGenerationStep +from app.models.token_usage import TokenUsage from app.models.system_config import SystemConfig +from app.services.credit_record_meta_service import ( + CreditRecordMeta, + build_generation_media_meta, + build_generation_record_prompt_meta, + build_module_step_prompt_meta, + build_shot_video_analysis_meta, +) from app.services.credits import calc_image_credits, calc_text_credits, calc_video_credits, deduct_credits -CHARGE_TEXT_PROMPT = "text_prompt" -CHARGE_FILE_PARSE = "file_parse" -CHARGE_VISION_INPUT = "vision_input" -CHARGE_MEDIA = "media" +CHARGE_TEXT_PROMPT = CreditRecordChargeKind.TEXT_PROMPT.value +CHARGE_FILE_PARSE = CreditRecordChargeKind.FILE_PARSE.value +CHARGE_VISION_INPUT = CreditRecordChargeKind.VISION_INPUT.value +CHARGE_MEDIA = CreditRecordChargeKind.MEDIA.value +CHARGE_VIDEO_ANALYSIS = CreditRecordChargeKind.VIDEO_ANALYSIS.value -OWNER_GENERATION_RECORD = "generation_record" -OWNER_CHAT_GENERATION_TASK = "chat_generation_task" -OWNER_MODULE_GENERATION_STEP = "module_generation_step" +OWNER_GENERATION_RECORD = CreditRecordOwnerType.GENERATION_RECORD.value +OWNER_CHAT_GENERATION_TASK = CreditRecordOwnerType.CHAT_GENERATION_TASK.value +OWNER_MODULE_GENERATION_STEP = CreditRecordOwnerType.MODULE_GENERATION_STEP.value +OWNER_SHOT_REPLICATE_TASK_SET = CreditRecordOwnerType.SHOT_REPLICATE_TASK_SET.value +OWNER_SHOT_REPLICATE_SEGMENT = CreditRecordOwnerType.SHOT_REPLICATE_SEGMENT.value _BIZ_KEY_PATTERN = re.compile( r"^(?P[^:]+):(?P[^:]+):attempt:(?P\d+):(?P[^:]+):(?Pcharge|refund)$" @@ -169,10 +182,12 @@ async def deduct_credits_locked_once( charge_key: str, biz_key: str | None = None, attempt_no: int | None = None, + record_meta: CreditRecordMeta | dict | None = None, ) -> BillingItem: """按 biz_key 做幂等扣费。 charge_key 只保留为业务分类;正式幂等以 biz_key 为准。 + record_meta 负责把业务归属、模块、步骤、token、模型快照写入 CreditRecord。 """ amount = _round2(amount) if amount <= 0: @@ -197,6 +212,7 @@ async def deduct_credits_locked_once( description=description, related_id=related_id, biz_key=biz_key, + record_meta=record_meta, ) return BillingItem(charge_key=charge_key, amount=amount, charged=True, biz_key=biz_key, attempt_no=attempt_no) @@ -208,7 +224,7 @@ async def charge_chatapi_prompt_usage( usage: Mapping[str, Any], project_name: str | None = None, ) -> BillingSummary: - """提示词整理扣费仍按记录维度一次性幂等,不参与生成失败媒体退款。""" + """项目记录提示词整理扣费;不参与生成失败媒体退款。""" project_name = project_name or "AI生成任务" items: list[BillingItem] = [] @@ -219,12 +235,19 @@ async def charge_chatapi_prompt_usage( input_tokens = _safe_int(usage.get("input_tokens")) output_tokens = _safe_int(usage.get("output_tokens")) text_credits = await calc_text_credits(db, input_tokens, output_tokens) + text_meta = await build_generation_record_prompt_meta( + db, + record_id=record.id, + attempt_no=attempt_no, + charge_kind=CHARGE_TEXT_PROMPT, + usage=usage, + ) items.append( await deduct_credits_locked_once( db, user_id=record.user_id, amount=text_credits, - description=f"ChatAPI提示词整理", + description=f"提示词优化 - {project_name}", related_id=record.id, charge_key=CHARGE_TEXT_PROMPT, biz_key=build_credit_biz_key( @@ -235,17 +258,25 @@ async def charge_chatapi_prompt_usage( action="charge", ), attempt_no=attempt_no, + record_meta=text_meta, ) ) file_tokens = usage.get("file_parse_tokens") or usage.get("file_tokens") or usage.get("document_tokens") or 0 file_parse_credits = await _calc_optional_token_credits(db, _safe_int(file_tokens), "file_parse_credits_per_1000_tokens") + file_meta = await build_generation_record_prompt_meta( + db, + record_id=record.id, + attempt_no=attempt_no, + charge_kind=CHARGE_FILE_PARSE, + usage={**dict(usage), "total_tokens": _safe_int(file_tokens), "input_tokens": _safe_int(file_tokens), "output_tokens": 0}, + ) items.append( await deduct_credits_locked_once( db, user_id=record.user_id, amount=file_parse_credits, - description=f"文件解析Token", + description="文件解析Token", related_id=record.id, charge_key=CHARGE_FILE_PARSE, biz_key=build_credit_biz_key( @@ -256,17 +287,25 @@ async def charge_chatapi_prompt_usage( action="charge", ), attempt_no=attempt_no, + record_meta=file_meta, ) ) vision_tokens = usage.get("vision_input_tokens") or usage.get("image_input_tokens") or usage.get("image_tokens") or 0 vision_input_credits = await _calc_optional_token_credits(db, _safe_int(vision_tokens), "vision_input_credits_per_1000_tokens") + vision_meta = await build_generation_record_prompt_meta( + db, + record_id=record.id, + attempt_no=attempt_no, + charge_kind=CHARGE_VISION_INPUT, + usage={**dict(usage), "total_tokens": _safe_int(vision_tokens), "input_tokens": _safe_int(vision_tokens), "output_tokens": 0}, + ) items.append( await deduct_credits_locked_once( db, user_id=record.user_id, amount=vision_input_credits, - description=f"图片理解Token", + description="图片理解Token", related_id=record.id, charge_key=CHARGE_VISION_INPUT, biz_key=build_credit_biz_key( @@ -277,6 +316,7 @@ async def charge_chatapi_prompt_usage( action="charge", ), attempt_no=attempt_no, + record_meta=vision_meta, ) ) @@ -297,7 +337,7 @@ async def charge_module_prompt_usage( description: str, attempt_no: int = 1, ) -> BillingSummary: - """爆款开头复刻模块图片/视频 AI 提词扣文本积分。 + """爆款开头复刻/拆镜复刻模块图片/视频 AI 提词扣文本积分。 文本提词属于已经发生的 LLM 消费: - 调用成功后按 input_tokens + output_tokens 扣费。 @@ -314,6 +354,7 @@ async def charge_module_prompt_usage( charge_kind=CHARGE_TEXT_PROMPT, action="charge", ) + record_meta = await build_module_step_prompt_meta(db, step_id=step_id, attempt_no=attempt_no, usage=usage) item = await deduct_credits_locked_once( db, user_id=user_id, @@ -323,10 +364,92 @@ async def charge_module_prompt_usage( charge_key=CHARGE_TEXT_PROMPT, biz_key=biz_key, attempt_no=attempt_no, + record_meta=record_meta, ) + + result = await db.execute(select(ModuleGenerationStep).where(ModuleGenerationStep.id == step_id).limit(1)) + step = result.scalar_one_or_none() + if step: + step.token_usage_id = record_meta.token_usage_id + step.model_config_id = usage.get("model_config_id") + step.input_tokens = record_meta.input_tokens + step.output_tokens = record_meta.output_tokens + step.total_tokens = record_meta.total_tokens + step.text_credits_cost = text_credits + return BillingSummary(record_id=step_id, user_id=user_id, items=[item]) +async def charge_shot_video_analysis_usage( + db: AsyncSession, + *, + user_id: str, + owner_type: str, + owner_id: str, + usage: Mapping[str, Any], + description: str, + billing_scene: str, + source_project_id: str | None = None, + source_step_id: str | None = None, + attempt_no: int | None = None, +) -> BillingSummary: + """拆镜复刻视频分析扣分析积分。 + + 视频分析属于“文字提示词 + 视频素材”的模型调用类消费, + 按 input_tokens + output_tokens 参考文本积分规则计费, + 但账务归类为 analysis/video_analysis,避免混入提词优化统计。 + """ + attempt_no = attempt_no or await get_next_credit_attempt_no( + db, + owner_type=owner_type, + owner_id=owner_id, + charge_kind=CHARGE_VIDEO_ANALYSIS, + ) + input_tokens = _safe_int(usage.get("input_tokens")) + output_tokens = _safe_int(usage.get("output_tokens")) + amount = await calc_text_credits(db, input_tokens, output_tokens) + biz_key = build_credit_biz_key( + owner_type=owner_type, + owner_id=owner_id, + attempt_no=attempt_no, + charge_kind=CHARGE_VIDEO_ANALYSIS, + action="charge", + ) + record_meta = await build_shot_video_analysis_meta( + db, + owner_type=owner_type, + owner_id=owner_id, + attempt_no=attempt_no, + usage=usage, + billing_scene=billing_scene, + source_project_id=source_project_id, + source_step_id=source_step_id, + ) + item = await deduct_credits_locked_once( + db, + user_id=user_id, + amount=amount, + description=description, + related_id=owner_id, + charge_key=CHARGE_VIDEO_ANALYSIS, + biz_key=biz_key, + attempt_no=attempt_no, + record_meta=record_meta, + ) + + if record_meta.token_usage_id: + result = await db.execute(select(TokenUsage).where(TokenUsage.id == record_meta.token_usage_id).limit(1)) + token_usage = result.scalar_one_or_none() + if token_usage: + token_usage.owner_type = token_usage.owner_type or owner_type + token_usage.owner_id = token_usage.owner_id or owner_id + token_usage.biz_key = token_usage.biz_key or biz_key + token_usage.source_module = token_usage.source_module or CreditRecordSourceModule.SHOT_REPLICATE.value + token_usage.source_step_code = token_usage.source_step_code or "video_analysis" + + return BillingSummary(record_id=owner_id, user_id=user_id, items=[item]) + + async def charge_generation_media_by_params( db: AsyncSession, *, @@ -341,6 +464,11 @@ async def charge_generation_media_by_params( description_prefix: str = "AI创作-", owner_type: str = OWNER_CHAT_GENERATION_TASK, attempt_no: int | None = None, + source_module: str | None = None, + source_project_id: str | None = None, + source_step_id: str | None = None, + source_step_code: str | None = None, + billing_scene: str | None = None, ) -> BillingSummary: """图片/视频媒体生成扣费。 @@ -363,6 +491,19 @@ async def charge_generation_media_by_params( action="charge", ) items: list[BillingItem] = [] + record_meta = await build_generation_media_meta( + db, + owner_type=owner_type, + owner_id=record_id, + attempt_no=attempt_no, + gen_type=gen_type, + engine_id=engine_id, + source_module=source_module, + source_project_id=source_project_id, + source_step_id=source_step_id, + source_step_code=source_step_code, + billing_scene=billing_scene, + ) if gen_type == "image": size = image_size or "2K" @@ -377,6 +518,7 @@ async def charge_generation_media_by_params( charge_key=CHARGE_MEDIA, biz_key=biz_key, attempt_no=attempt_no, + record_meta=record_meta, ) ) elif gen_type == "video": @@ -391,6 +533,7 @@ async def charge_generation_media_by_params( charge_key=CHARGE_MEDIA, biz_key=biz_key, attempt_no=attempt_no, + record_meta=record_meta, ) ) else: @@ -419,4 +562,5 @@ async def charge_generation_media_for_record( description_prefix=description_prefix, owner_type=OWNER_GENERATION_RECORD, attempt_no=attempt_no, + source_module=CreditRecordSourceModule.GENERATION_RECORD.value, ) diff --git a/video-gen-api/app/services/generation_prompt_service.py b/video-gen-api/app/services/generation_prompt_service.py index 25c7408f..f7719919 100644 --- a/video-gen-api/app/services/generation_prompt_service.py +++ b/video-gen-api/app/services/generation_prompt_service.py @@ -152,10 +152,13 @@ async def build_prompt_with_chatapi(db: AsyncSession, record: ChatGenerationTask if not content: raise RuntimeError("ChatAPI未返回有效prompt") + token_usage_id = generate_id() db.add(TokenUsage( - id=generate_id(), + id=token_usage_id, model_config_id=config.id, user_id=record.user_id, + owner_type="generation_record", + owner_id=record.id, input_tokens=input_tokens, output_tokens=output_tokens, total_tokens=total_tokens, @@ -178,6 +181,11 @@ async def build_prompt_with_chatapi(db: AsyncSession, record: ChatGenerationTask total_tokens=total_tokens, ) return content, { + "token_usage_id": token_usage_id, + "model_config_id": config.id, + "model_config_name": config.name, + "model_provider": config.provider, + "model_name": config.model_name, "input_tokens": input_tokens, "output_tokens": output_tokens, "total_tokens": total_tokens, diff --git a/video-gen-api/app/services/generation_refund_service.py b/video-gen-api/app/services/generation_refund_service.py index dcb0752a..7c937776 100644 --- a/video-gen-api/app/services/generation_refund_service.py +++ b/video-gen-api/app/services/generation_refund_service.py @@ -10,6 +10,7 @@ from app.models.chat_generation_task import ChatGenerationTask from app.models.credit_record import CreditRecord from app.models.generation_record import GenerationRecord from app.services.credits import refund_credits +from app.services.credit_record_meta_service import build_refund_meta_from_charge from app.services.generation_billing_service import ( CHARGE_MEDIA, OWNER_CHAT_GENERATION_TASK, @@ -113,6 +114,7 @@ async def refund_unrefunded_media_charges( related_id=owner_id, biz_key=refund_biz_key, refund_for_biz_key=charge.biz_key, + record_meta=build_refund_meta_from_charge(charge, attempt_no=attempt_no), ) total_refunded = round(total_refunded + amount, 2) return total_refunded diff --git a/video-gen-api/app/services/generation_task_factory_service.py b/video-gen-api/app/services/generation_task_factory_service.py index 21381157..6e4bbfab 100644 --- a/video-gen-api/app/services/generation_task_factory_service.py +++ b/video-gen-api/app/services/generation_task_factory_service.py @@ -63,6 +63,11 @@ async def create_chat_generation_task_for_module( resolution: str | None = None, billing_project_name: str = "模块生成任务", billing_description_prefix: str = "模块生成-", + billing_source_module: str | None = None, + billing_source_project_id: str | None = None, + billing_source_step_id: str | None = None, + billing_source_step_code: str | None = None, + billing_scene: str | None = None, ) -> ChatGenerationTask: """创建可复用的 ChatGenerationTask 子任务。 @@ -106,6 +111,11 @@ async def create_chat_generation_task_for_module( description_prefix=billing_description_prefix, owner_type=OWNER_CHAT_GENERATION_TASK, attempt_no=1, + source_module=billing_source_module, + source_project_id=billing_source_project_id, + source_step_id=billing_source_step_id, + source_step_code=billing_source_step_code, + billing_scene=billing_scene, ) snapshot = _build_image_snapshot(engine, size, proportion, px) task = ChatGenerationTask( @@ -155,6 +165,11 @@ async def create_chat_generation_task_for_module( description_prefix=billing_description_prefix, owner_type=OWNER_CHAT_GENERATION_TASK, attempt_no=1, + source_module=billing_source_module, + source_project_id=billing_source_project_id, + source_step_id=billing_source_step_id, + source_step_code=billing_source_step_code, + billing_scene=billing_scene, ) snapshot = _build_video_snapshot(engine, ratio, selected_resolution, selected_duration) task = ChatGenerationTask( diff --git a/video-gen-api/app/services/hot_opening_replicate_service.py b/video-gen-api/app/services/hot_opening_replicate_service.py index 70bd5ddd..2a76bb99 100644 --- a/video-gen-api/app/services/hot_opening_replicate_service.py +++ b/video-gen-api/app/services/hot_opening_replicate_service.py @@ -951,6 +951,24 @@ async def generate_image_from_prompt( {"type": "image", "url": material.get("material_image_url"), "name": "新产品图片"}, ] + step = await _create_step( + db, + project=project, + step_code=HotOpeningStepCodeEnum.IMAGE_GENERATE.value, + status=ModuleStepStatusEnum.PROCESSING.value, + parent_step_id=prompt_step.id, + source_step_id=prompt_step.id, + input_data={ + "engine_id": req.engine_id, + "params": { + "image_size": req.image_size, + "image_proportion": req.image_proportion, + "image_px": req.image_px, + }, + "prompt": optimized_prompt, + "media_references": refs, + }, + ) chat_task = await create_chat_generation_task_for_module( db, current_user=current_user, @@ -965,21 +983,30 @@ async def generate_image_from_prompt( image_px=req.image_px, billing_project_name=project.title or "爆款开头复刻", billing_description_prefix="爆款开头复刻图片生成", + billing_source_module=project.module, + billing_source_project_id=project.id, + billing_source_step_id=step.id, + billing_source_step_code=HotOpeningStepCodeEnum.IMAGE_GENERATE.value, ) - step = await _create_step( - db, - project=project, - step_code=HotOpeningStepCodeEnum.IMAGE_GENERATE.value, - status=ModuleStepStatusEnum.PROCESSING.value, - parent_step_id=prompt_step.id, - source_step_id=prompt_step.id, - chat_task_id=chat_task.id, - input_data={ - "engine_id": chat_task.engine_id, - "params": {"image_size": chat_task.image_size, "image_proportion": chat_task.image_proportion, "image_px": chat_task.image_px}, - "prompt": optimized_prompt, - "media_references": refs, - }, + step.chat_task_id = chat_task.id + _force_set_json( + step, + "input_json", + _step_input( + step_code=HotOpeningStepCodeEnum.IMAGE_GENERATE.value, + source_step_id=prompt_step.id, + parent_step_id=prompt_step.id, + payload={ + "engine_id": chat_task.engine_id, + "params": { + "image_size": chat_task.image_size, + "image_proportion": chat_task.image_proportion, + "image_px": chat_task.image_px, + }, + "prompt": optimized_prompt, + "media_references": refs, + }, + ), ) project.status = ModuleProjectStatusEnum.PROCESSING.value project.current_step_code = HotOpeningStepCodeEnum.IMAGE_GENERATE.value @@ -1261,6 +1288,25 @@ async def generate_video_from_prompt( {"type": "image", "url": _build_file_url_or_data_uri(generated_image_url), "name": "新项目图片"}, ] + step = await _create_step( + db, + project=project, + step_code=HotOpeningStepCodeEnum.VIDEO_GENERATE.value, + status=ModuleStepStatusEnum.PROCESSING.value, + parent_step_id=prompt_step.id, + source_step_id=prompt_step.id, + input_data={ + "engine_id": req.engine_id or prompt_params.get("engine_id"), + "params": { + "duration": duration, + "aspect_ratio": aspect_ratio, + "resolution": resolution, + }, + "prompt_schema": prompt_schema, + "final_prompt": final_prompt, + "media_references": refs, + }, + ) chat_task = await create_chat_generation_task_for_module( db, current_user=current_user, @@ -1275,29 +1321,34 @@ async def generate_video_from_prompt( resolution=resolution, billing_project_name=project.title or "爆款开头复刻", billing_description_prefix="爆款开头复刻视频生成", + billing_source_module=project.module, + billing_source_project_id=project.id, + billing_source_step_id=step.id, + billing_source_step_code=HotOpeningStepCodeEnum.VIDEO_GENERATE.value, ) - step = await _create_step( - db, - project=project, - step_code=HotOpeningStepCodeEnum.VIDEO_GENERATE.value, - status=ModuleStepStatusEnum.PROCESSING.value, - parent_step_id=prompt_step.id, - source_step_id=prompt_step.id, - chat_task_id=chat_task.id, - input_data={ - "engine_id": chat_task.engine_id, - "params": { - "duration": chat_task.duration, - "aspect_ratio": chat_task.aspect_ratio, - "resolution": chat_task.resolution, - "image_size": chat_task.image_size, - "image_proportion": chat_task.image_proportion, - "image_px": chat_task.image_px, + step.chat_task_id = chat_task.id + _force_set_json( + step, + "input_json", + _step_input( + step_code=HotOpeningStepCodeEnum.VIDEO_GENERATE.value, + source_step_id=prompt_step.id, + parent_step_id=prompt_step.id, + payload={ + "engine_id": chat_task.engine_id, + "params": { + "duration": chat_task.duration, + "aspect_ratio": chat_task.aspect_ratio, + "resolution": chat_task.resolution, + "image_size": chat_task.image_size, + "image_proportion": chat_task.image_proportion, + "image_px": chat_task.image_px, + }, + "prompt_schema": prompt_schema, + "final_prompt": final_prompt, + "media_references": refs, }, - "prompt_schema": prompt_schema, - "final_prompt": final_prompt, - "media_references": refs, - }, + ), ) project.status = ModuleProjectStatusEnum.PROCESSING.value project.current_step_code = HotOpeningStepCodeEnum.VIDEO_GENERATE.value diff --git a/video-gen-api/app/services/hot_opening_video_prompt_service.py b/video-gen-api/app/services/hot_opening_video_prompt_service.py index a6077153..1a384a41 100644 --- a/video-gen-api/app/services/hot_opening_video_prompt_service.py +++ b/video-gen-api/app/services/hot_opening_video_prompt_service.py @@ -1488,9 +1488,10 @@ async def optimize_hot_opening_video_prompt( "total_tokens": int(usage.get("total_tokens") or 0), "log_user_message": log_user_message, } + token_usage_id = generate_id() db.add( TokenUsage( - id=generate_id(), + id=token_usage_id, model_config_id=config.id, user_id=user_id, input_tokens=token_usage["input_tokens"], @@ -1499,6 +1500,13 @@ async def optimize_hot_opening_video_prompt( ) ) await db.flush() + token_usage.update({ + "token_usage_id": token_usage_id, + "model_config_id": config.id, + "model_config_name": config.name, + "model_provider": config.provider, + "model_name": config.model_name, + }) result = parse_model_json(content) result = normalize_video_prompt_schema_from_ai(result, video_config, schema_config_snapshot) diff --git a/video-gen-api/app/services/llm.py b/video-gen-api/app/services/llm.py index fa70a529..8f1447bb 100644 --- a/video-gen-api/app/services/llm.py +++ b/video-gen-api/app/services/llm.py @@ -370,9 +370,11 @@ async def _call_openai_compatible( output_tokens = usage.get("completion_tokens", 0) total_tokens = usage.get("total_tokens", input_tokens + output_tokens) + token_usage_id = None if db is not None: + token_usage_id = generate_id() record = TokenUsage( - id=generate_id(), + id=token_usage_id, model_config_id=config.id, user_id=user_id, input_tokens=input_tokens, @@ -384,6 +386,11 @@ async def _call_openai_compatible( content = data["choices"][0]["message"]["content"].strip() token_usage = { + "token_usage_id": token_usage_id, + "model_config_id": config.id, + "model_config_name": config.name, + "model_provider": config.provider, + "model_name": config.model_name, "input_tokens": input_tokens, "output_tokens": output_tokens, "total_tokens": total_tokens, diff --git a/video-gen-api/app/services/payment.py b/video-gen-api/app/services/payment.py index b6c61ab3..bc269881 100644 --- a/video-gen-api/app/services/payment.py +++ b/video-gen-api/app/services/payment.py @@ -17,9 +17,45 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.config import settings from app.models.payment_order import PaymentOrder from app.models.system_config import SystemConfig +from app.enums.credit_record import ( + CreditRecordAction, + CreditRecordBillingScene, + CreditRecordChargeKind, + CreditRecordOwnerType, + CreditRecordSourceModule, + CreditRecordSubject, +) +from app.services.credit_record_meta_service import CreditRecordMeta, build_recharge_meta from app.services.credits import add_credits, deduct_credits from app.utils.id_gen import generate_id, generate_order_no + + +def _payment_biz_key(order: PaymentOrder, *, charge_kind: str, action: str) -> str: + return ( + f"{CreditRecordOwnerType.PAYMENT_ORDER.value}:{order.id}:" + f"attempt:1:{charge_kind}:{action}" + ) + + +def _payment_recharge_meta(order: PaymentOrder) -> CreditRecordMeta: + meta = build_recharge_meta(owner_id=order.id) + meta.attempt_no = 1 + return meta + + +def _payment_refund_meta(order: PaymentOrder) -> CreditRecordMeta: + return CreditRecordMeta( + owner_type=CreditRecordOwnerType.PAYMENT_ORDER.value, + owner_id=order.id, + attempt_no=1, + charge_kind=CreditRecordChargeKind.REFUND.value, + charge_action=CreditRecordAction.REFUND.value, + credit_subject=CreditRecordSubject.REFUND.value, + billing_scene=CreditRecordBillingScene.REFUND.value, + source_module=CreditRecordSourceModule.PAYMENT.value, + ) + # --------------------------------------------------------------------------- # Payment logger → log/payment/YYYY-MM-DD.log (one file per day, no cleanup) # --------------------------------------------------------------------------- @@ -321,6 +357,12 @@ async def create_recharge_order( total_credits, desc, related_id=order.id, + biz_key=_payment_biz_key( + order, + charge_kind=CreditRecordChargeKind.RECHARGE.value, + action=CreditRecordAction.CHARGE.value, + ), + record_meta=_payment_recharge_meta(order), ) await db.flush() else: @@ -1094,6 +1136,12 @@ async def process_payment_success(db: AsyncSession, order_id: str): order.credits, f"充值成功({order.credits}积分)", related_id=order.id, + biz_key=_payment_biz_key( + order, + charge_kind=CreditRecordChargeKind.RECHARGE.value, + action=CreditRecordAction.CHARGE.value, + ), + record_meta=_payment_recharge_meta(order), ) await db.commit() @@ -1152,6 +1200,12 @@ async def process_payment_success_by_order_no( order.credits, f"充值成功({order.credits}积分), 订单号: {order_no}, 金额: {order.amount}", related_id=order.id, + biz_key=_payment_biz_key( + order, + charge_kind=CreditRecordChargeKind.RECHARGE.value, + action=CreditRecordAction.CHARGE.value, + ), + record_meta=_payment_recharge_meta(order), ) await db.commit() logger.info( @@ -1220,6 +1274,17 @@ async def process_refund( order.credits, refund_reason, related_id=order.id, + biz_key=_payment_biz_key( + order, + charge_kind=CreditRecordChargeKind.REFUND.value, + action=CreditRecordAction.REFUND.value, + ), + refund_for_biz_key=_payment_biz_key( + order, + charge_kind=CreditRecordChargeKind.RECHARGE.value, + action=CreditRecordAction.CHARGE.value, + ), + record_meta=_payment_refund_meta(order), ) except Exception as e: logger.exception(f"Failed to deduct credits for refund: {e}") diff --git a/video-gen-api/app/services/shot_replicate_flow_service.py b/video-gen-api/app/services/shot_replicate_flow_service.py index f0a2350a..3e0d0d68 100644 --- a/video-gen-api/app/services/shot_replicate_flow_service.py +++ b/video-gen-api/app/services/shot_replicate_flow_service.py @@ -903,6 +903,24 @@ async def generate_image_from_prompt( {"type": "image", "url": material.get("material_image_url"), "name": "新产品图片"}, ] + step = await _create_step( + db, + project=project, + step_code=ShotReplicateStepCodeEnum.IMAGE_GENERATE.value, + status=ModuleStepStatusEnum.PROCESSING.value, + parent_step_id=prompt_step.id, + source_step_id=prompt_step.id, + input_data={ + "engine_id": req.engine_id, + "params": { + "image_size": req.image_size, + "image_proportion": req.image_proportion, + "image_px": req.image_px, + }, + "prompt": optimized_prompt, + "media_references": refs, + }, + ) chat_task = await create_chat_generation_task_for_module( db, current_user=current_user, @@ -917,21 +935,30 @@ async def generate_image_from_prompt( image_px=req.image_px, billing_project_name=project.title or "拆镜复刻", billing_description_prefix="拆镜复刻图片生成", + billing_source_module=project.module, + billing_source_project_id=project.id, + billing_source_step_id=step.id, + billing_source_step_code=ShotReplicateStepCodeEnum.IMAGE_GENERATE.value, ) - step = await _create_step( - db, - project=project, - step_code=ShotReplicateStepCodeEnum.IMAGE_GENERATE.value, - status=ModuleStepStatusEnum.PROCESSING.value, - parent_step_id=prompt_step.id, - source_step_id=prompt_step.id, - chat_task_id=chat_task.id, - input_data={ - "engine_id": chat_task.engine_id, - "params": {"image_size": chat_task.image_size, "image_proportion": chat_task.image_proportion, "image_px": chat_task.image_px}, - "prompt": optimized_prompt, - "media_references": refs, - }, + step.chat_task_id = chat_task.id + _force_set_json( + step, + "input_json", + _step_input( + step_code=ShotReplicateStepCodeEnum.IMAGE_GENERATE.value, + source_step_id=prompt_step.id, + parent_step_id=prompt_step.id, + payload={ + "engine_id": chat_task.engine_id, + "params": { + "image_size": chat_task.image_size, + "image_proportion": chat_task.image_proportion, + "image_px": chat_task.image_px, + }, + "prompt": optimized_prompt, + "media_references": refs, + }, + ), ) project.status = ModuleProjectStatusEnum.PROCESSING.value project.current_step_code = ShotReplicateStepCodeEnum.IMAGE_GENERATE.value @@ -1223,6 +1250,25 @@ async def generate_video_from_prompt( {"type": "image", "url": _build_file_url_or_data_uri(generated_image_url), "name": "新项目图片"}, ] + step = await _create_step( + db, + project=project, + step_code=ShotReplicateStepCodeEnum.VIDEO_GENERATE.value, + status=ModuleStepStatusEnum.PROCESSING.value, + parent_step_id=prompt_step.id, + source_step_id=prompt_step.id, + input_data={ + "engine_id": req.engine_id or prompt_params.get("engine_id"), + "params": { + "duration": duration, + "aspect_ratio": aspect_ratio, + "resolution": resolution, + }, + "prompt_schema": prompt_schema, + "final_prompt": final_prompt, + "media_references": refs, + }, + ) chat_task = await create_chat_generation_task_for_module( db, current_user=current_user, @@ -1237,29 +1283,34 @@ async def generate_video_from_prompt( resolution=resolution, billing_project_name=project.title or "拆镜复刻", billing_description_prefix="拆镜复刻视频生成", + billing_source_module=project.module, + billing_source_project_id=project.id, + billing_source_step_id=step.id, + billing_source_step_code=ShotReplicateStepCodeEnum.VIDEO_GENERATE.value, ) - step = await _create_step( - db, - project=project, - step_code=ShotReplicateStepCodeEnum.VIDEO_GENERATE.value, - status=ModuleStepStatusEnum.PROCESSING.value, - parent_step_id=prompt_step.id, - source_step_id=prompt_step.id, - chat_task_id=chat_task.id, - input_data={ - "engine_id": chat_task.engine_id, - "params": { - "duration": chat_task.duration, - "aspect_ratio": chat_task.aspect_ratio, - "resolution": chat_task.resolution, - "image_size": chat_task.image_size, - "image_proportion": chat_task.image_proportion, - "image_px": chat_task.image_px, + step.chat_task_id = chat_task.id + _force_set_json( + step, + "input_json", + _step_input( + step_code=ShotReplicateStepCodeEnum.VIDEO_GENERATE.value, + source_step_id=prompt_step.id, + parent_step_id=prompt_step.id, + payload={ + "engine_id": chat_task.engine_id, + "params": { + "duration": chat_task.duration, + "aspect_ratio": chat_task.aspect_ratio, + "resolution": chat_task.resolution, + "image_size": chat_task.image_size, + "image_proportion": chat_task.image_proportion, + "image_px": chat_task.image_px, + }, + "prompt_schema": prompt_schema, + "final_prompt": final_prompt, + "media_references": refs, }, - "prompt_schema": prompt_schema, - "final_prompt": final_prompt, - "media_references": refs, - }, + ), ) project.status = ModuleProjectStatusEnum.PROCESSING.value project.current_step_code = ShotReplicateStepCodeEnum.VIDEO_GENERATE.value diff --git a/video-gen-api/app/services/shot_video_analysis_service.py b/video-gen-api/app/services/shot_video_analysis_service.py index 2da22640..643a5c2e 100644 --- a/video-gen-api/app/services/shot_video_analysis_service.py +++ b/video-gen-api/app/services/shot_video_analysis_service.py @@ -505,9 +505,10 @@ async def analyze_video_for_shot_split( if not token_usage["total_tokens"]: token_usage["total_tokens"] = token_usage["input_tokens"] + token_usage["output_tokens"] + token_usage_id = generate_id() db.add( TokenUsage( - id=generate_id(), + id=token_usage_id, model_config_id=config.id, user_id=user_id, input_tokens=token_usage["input_tokens"], @@ -516,6 +517,13 @@ async def analyze_video_for_shot_split( ) ) await db.flush() + token_usage.update({ + "token_usage_id": token_usage_id, + "model_config_id": config.id, + "model_config_name": config.name, + "model_provider": config.provider, + "model_name": config.model_name, + }) return ShotVideoAnalysisResult(result=result, raw_response=raw, usage=token_usage) diff --git a/video-gen-api/app/tasks/shot_replicate_tasks.py b/video-gen-api/app/tasks/shot_replicate_tasks.py index 2bf43753..8c5a5c73 100644 --- a/video-gen-api/app/tasks/shot_replicate_tasks.py +++ b/video-gen-api/app/tasks/shot_replicate_tasks.py @@ -7,6 +7,7 @@ from typing import Any from sqlalchemy import select from app.config import settings +from app.enums.credit_record import CreditRecordBillingScene, CreditRecordOwnerType from app.enums.shot_replicate import ( ModuleCodeEnum, ShotAnalysisStatusEnum, @@ -36,6 +37,7 @@ from app.services.module_async_recovery_service import ( ) from app.services.shot_replicate_taskset_service import refresh_task_set_split_summary from app.services.shot_video_analysis_service import analyze_video_for_shot_split +from app.services.generation_billing_service import charge_shot_video_analysis_usage from app.services.shot_video_split_service import split_video_segment_async from app.services.upload_video_asset_service import validate_split_range from app.tasks.async_runner import run_async @@ -141,6 +143,16 @@ async def _run_analyze_original_video(task_set_id: str) -> None: task_set.analysis_status = ShotAnalysisStatusEnum.COMPLETED.value task_set.status = ShotTaskSetStatusEnum.ANALYSIS_COMPLETED.value task_set.analysis_error_message = None + await charge_shot_video_analysis_usage( + db, + user_id=task_set.user_id, + owner_type=CreditRecordOwnerType.SHOT_REPLICATE_TASK_SET.value, + owner_id=task_set.id, + usage=analyzed.usage, + description="拆镜复刻-原视频分析", + billing_scene=CreditRecordBillingScene.SHOT_ORIGINAL_VIDEO_ANALYSIS.value, + source_project_id=task_set.id, + ) await db.commit() await cleanup_active_if_terminal(db, object_type=OBJECT_SHOT_TASK_SET_ANALYSIS, object_id=task_set_id) @@ -260,6 +272,17 @@ async def _run_analyze_custom_segment_video(segment_id: str) -> None: segment.analysis_json = result_json segment.analysis_status = ShotSegmentAnalysisStatusEnum.COMPLETED.value segment.analysis_error_message = None + await charge_shot_video_analysis_usage( + db, + user_id=segment.user_id, + owner_type=CreditRecordOwnerType.SHOT_REPLICATE_SEGMENT.value, + owner_id=segment.id, + usage=analyzed.usage, + description="拆镜复刻-片段视频分析", + billing_scene=CreditRecordBillingScene.SHOT_SEGMENT_VIDEO_ANALYSIS.value, + source_project_id=segment.task_set_id, + source_step_id=segment.id, + ) await db.commit() await cleanup_active_if_terminal(db, object_type=OBJECT_SHOT_SEGMENT_ANALYSIS, object_id=segment_id) From fa2e56d021322cf2af52a9bbacadbc9884b69821 Mon Sep 17 00:00:00 2001 From: GinHa <15201596918@163.com> Date: Thu, 25 Jun 2026 17:25:35 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=90=88=E5=B9=B6|=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=90=8E=E5=8F=B0build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-admin/dist/assets/index-CxLKoDUI.js | 543 ++++++++++ video-gen-admin/dist/assets/index-wN5bY_f7.js | 407 -------- video-gen-admin/dist/index.html | 2 +- video-gen-admin/src/pages/Adminplatform.tsx | 154 ++- video-gen-admin/src/types/index.ts | 2 + video-gen-admin/src/utils/excelExport.ts | 4 +- video-gen-admin/tsconfig.tsbuildinfo | 2 +- ...dd_credit_record_billing_snapshots_and_.py | 935 ++++++++++++++++++ ...1_merge_changes_from_remote_add_credit_.py | 25 + 9 files changed, 1629 insertions(+), 445 deletions(-) create mode 100644 video-gen-admin/dist/assets/index-CxLKoDUI.js delete mode 100644 video-gen-admin/dist/assets/index-wN5bY_f7.js create mode 100644 video-gen-api/alembic/versions/0a8da2d3c091_add_credit_record_billing_snapshots_and_.py create mode 100644 video-gen-api/alembic/versions/c72a6f69e641_merge_changes_from_remote_add_credit_.py diff --git a/video-gen-admin/dist/assets/index-CxLKoDUI.js b/video-gen-admin/dist/assets/index-CxLKoDUI.js new file mode 100644 index 00000000..7b74026b --- /dev/null +++ b/video-gen-admin/dist/assets/index-CxLKoDUI.js @@ -0,0 +1,543 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),l=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")});(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var u=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&j(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&j(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,A=k.port2;k.port1.onmessage=D,O=function(){A.postMessage(null)}}else O=function(){_(D,0)};function j(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,j(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),d=o(((e,t)=>{t.exports=u()})),f=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=f()})),m=o((e=>{var t=p();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=m()})),g=o((e=>{var t=d(),n=p(),r=h();function i(e){var t=`https://react.dev/errors/`+e;if(1B||(e.current=z[B],z[B]=null,B--)}function U(e,t){B++,z[B]=e.current,e.current=t}var W=V(null),ee=V(null),te=V(null),ne=V(null);function re(e,t){switch(U(te,t),U(ee,e),U(W,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Gd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Gd(t),e=Kd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}H(W),U(W,e)}function ie(){H(W),H(ee),H(te)}function ae(e){e.memoizedState!==null&&U(ne,e);var t=W.current,n=Kd(t,e.type);t!==n&&(U(ee,e),U(W,n))}function G(e){ee.current===e&&(H(W),H(ee)),ne.current===e&&(H(ne),np._currentValue=R)}var oe,K;function se(e){if(oe===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);oe=t&&t[1]||``,K=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{ce=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?se(n):``}function le(e,t){switch(e.tag){case 26:case 27:case 5:return se(e.type);case 16:return se(`Lazy`);case 13:return e.child!==t&&t!==null?se(`Suspense Fallback`):se(`Suspense`);case 19:return se(`SuspenseList`);case 0:case 15:return q(e.type,!1);case 11:return q(e.type.render,!1);case 1:return q(e.type,!0);case 31:return se(`Activity`);default:return``}}function ue(e){try{var t=``,n=null;do t+=le(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var de=Object.prototype.hasOwnProperty,fe=t.unstable_scheduleCallback,pe=t.unstable_cancelCallback,me=t.unstable_shouldYield,he=t.unstable_requestPaint,ge=t.unstable_now,_e=t.unstable_getCurrentPriorityLevel,ve=t.unstable_ImmediatePriority,ye=t.unstable_UserBlockingPriority,be=t.unstable_NormalPriority,xe=t.unstable_LowPriority,Se=t.unstable_IdlePriority,Ce=t.log,we=t.unstable_setDisableYieldValue,Te=null,Ee=null;function De(e){if(typeof Ce==`function`&&we(e),Ee&&typeof Ee.setStrictMode==`function`)try{Ee.setStrictMode(Te,e)}catch{}}var Oe=Math.clz32?Math.clz32:je,ke=Math.log,Ae=Math.LN2;function je(e){return e>>>=0,e===0?32:31-(ke(e)/Ae|0)|0}var Me=256,Ne=262144,Pe=4194304;function Fe(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ie(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Fe(n))):i=Fe(o):i=Fe(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Fe(n))):i=Fe(o)):i=Fe(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Le(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Re(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ze(){var e=Pe;return Pe<<=1,!(Pe&62914560)&&(Pe=4194304),e}function Be(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ve(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function He(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),en=!1;if($t)try{var tn={};Object.defineProperty(tn,`passive`,{get:function(){en=!0}}),window.addEventListener(`test`,tn,tn),window.removeEventListener(`test`,tn,tn)}catch{en=!1}var nn=null,rn=null,an=null;function on(){if(an)return an;var e,t=rn,n=t.length,r,i=`value`in nn?nn.value:nn.textContent,a=i.length;for(e=0;e=Rn),Vn=` `,Hn=!1;function Un(e,t){switch(e){case`keyup`:return In.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Wn(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Gn=!1;function Kn(e,t){switch(e){case`compositionend`:return Wn(t);case`keypress`:return t.which===32?(Hn=!0,Vn):null;case`textInput`:return e=t.data,e===Vn&&Hn?null:e;default:return null}}function qn(e,t){if(Gn)return e===`compositionend`||!Ln&&Un(e,t)?(e=on(),an=rn=nn=null,Gn=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=hr(n)}}function _r(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?_r(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function vr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Dt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Dt(e.document)}return t}function yr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var br=$t&&`documentMode`in document&&11>=document.documentMode,xr=null,Sr=null,Cr=null,wr=!1;function Tr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;wr||xr==null||xr!==Dt(r)||(r=xr,`selectionStart`in r&&yr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Cr&&mr(Cr,r)||(Cr=r,r=kd(Sr,`onSelect`),0>=o,i-=o,gi=1<<32-Oe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),Ti&&vi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),Ti&&vi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return Ti&&vi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),Ti&&vi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&va(l)===r.type){n(e,r.sibling),c=a(r,o.props),Ta(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=ri(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=ni(o.type,o.key,o.props,null,e.mode,c),Ta(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=oi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=va(o),b(e,r,o,c)}if(F(o))return h(e,r,o,c);if(M(o)){if(l=M(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,wa(o),c);if(o.$$typeof===C)return b(e,r,qi(e,o),c);Ea(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=ii(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Ca=0;var i=b(e,t,n,r);return Sa=null,i}catch(t){if(t===fa||t===ma)throw t;var a=Qr(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Oa=Da(!0),ka=Da(!1),Aa=!1;function ja(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ma(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Na(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Pa(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,Fl&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Yr(e),Jr(e,null,n),t}return J(e,r,t,n),Yr(e)}function Fa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,We(e,n)}}function Ia(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var La=!1;function Ra(){if(La){var e=ra;if(e!==null)throw e}}function za(e,t,n,r){La=!1;var i=e.updateQueue;Aa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(Rl&f)===f:(r&f)===f){f!==0&&f===na&&(La=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var h=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(h=g.payload,typeof h==`function`){d=h.call(_,d,f);break a}d=h;break a;case 3:h.flags=h.flags&-65537|128;case 0:if(h=g.payload,f=typeof h==`function`?h.call(_,d,f):h,f==null)break a;d=m({},d,f);break a;case 2:Aa=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Kl|=o,e.lanes=o,e.memoizedState=d}}function Ba(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Va(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=I.T,s={};I.T=s,Os(e,!1,t,n);try{var c=i(),l=I.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ds(e,t,oa(c,r),mu(e)):Ds(e,t,r,mu(e))}catch(n){Ds(e,t,{then:function(){},status:`rejected`,reason:n},mu())}finally{L.p=a,o!==null&&s.types!==null&&(o.types=s.types),I.T=o}}function _s(){}function vs(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=ys(e).queue;gs(e,a,t,R,n===null?_s:function(){return bs(e),n(r)})}function ys(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:R,baseState:R,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ko,lastRenderedState:R},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ko,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function bs(e){var t=ys(e);t.next===null&&(t=e.alternate.memoizedState),Ds(e,t.next.queue,{},mu())}function xs(){return Ki(np)}function Ss(){return wo().memoizedState}function Cs(){return wo().memoizedState}function ws(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=mu();e=Na(n);var r=Pa(t,e,n);r!==null&&(gu(r,t,n),Fa(r,t,n)),t={cache:Qi()},e.payload=t;return}t=t.return}}function Ts(e,t,n){var r=mu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},ks(e)?As(t,n):(n=Kr(e,t,n,r),n!==null&&(gu(n,e,r),js(n,t,r)))}function Es(e,t,n){Ds(e,t,n,mu())}function Ds(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(ks(e))As(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,pr(s,o))return J(e,t,i,0),Il===null&&Gr(),!1}catch{}if(n=Kr(e,t,i,r),n!==null)return gu(n,e,r),js(n,t,r),!0}return!1}function Os(e,t,n,r){if(r={lane:2,revertLane:pd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},ks(e)){if(t)throw Error(i(479))}else t=Kr(e,n,r,2),t!==null&&gu(t,e,2)}function ks(e){var t=e.alternate;return e===ro||t!==null&&t===ro}function As(e,t){so=oo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function js(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,We(e,n)}}var Ms={readContext:Ki,use:Do,useCallback:mo,useContext:mo,useEffect:mo,useImperativeHandle:mo,useLayoutEffect:mo,useInsertionEffect:mo,useMemo:mo,useReducer:mo,useRef:mo,useState:mo,useDebugValue:mo,useDeferredValue:mo,useTransition:mo,useSyncExternalStore:mo,useId:mo,useHostTransitionStatus:mo,useFormState:mo,useActionState:mo,useOptimistic:mo,useMemoCache:mo,useCacheRefresh:mo};Ms.useEffectEvent=mo;var Ns={readContext:Ki,use:Do,useCallback:function(e,t){return Co().memoizedState=[e,t===void 0?null:t],e},useContext:Ki,useEffect:rs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ts(4194308,4,ls.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ts(4194308,4,e,t)},useInsertionEffect:function(e,t){ts(4,2,e,t)},useMemo:function(e,t){var n=Co();t=t===void 0?null:t;var r=e();if(co){De(!0);try{e()}finally{De(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Co();if(n!==void 0){var i=n(t);if(co){De(!0);try{n(t)}finally{De(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ts.bind(null,ro,e),[r.memoizedState,e]},useRef:function(e){var t=Co();return e={current:e},t.memoizedState=e},useState:function(e){e=zo(e);var t=e.queue,n=Es.bind(null,ro,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ds,useDeferredValue:function(e,t){return ms(Co(),e,t)},useTransition:function(){var e=zo(!1);return e=gs.bind(null,ro,e.queue,!0,!1),Co().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=ro,a=Co();if(Ti){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Il===null)throw Error(i(349));Rl&127||Po(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,rs(Io.bind(null,r,o,e),[e]),r.flags|=2048,$o(9,{destroy:void 0},Fo.bind(null,r,o,n,t),null),n},useId:function(){var e=Co(),t=Il.identifierPrefix;if(Ti){var n=_i,r=gi;n=(r&~(1<<32-Oe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=lo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[Ze]=t,o[Qe]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Rd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Dc(t)}}return Mc(t),Oc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Dc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=te.current,Mi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ci,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[Ze]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Fd(e.nodeValue,n)),e||ki(t,!0)}else e=Wd(e).createTextNode(r),e[Ze]=t,t.stateNode=e}return Mc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Mi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[Ze]=t}else Ni(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Mc(t),e=!1}else n=Pi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?($a(t),t):($a(t),null);if(t.flags&128)throw Error(i(558))}return Mc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Mi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[Ze]=t}else Ni(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Mc(t),a=!1}else a=Pi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?($a(t),t):($a(t),null)}return $a(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Ac(t,t.updateQueue),Mc(t),null);case 4:return ie(),e===null&&Td(t.stateNode.containerInfo),Mc(t),null;case 10:return Bi(t.type),Mc(t),null;case 19:if(H(eo),r=t.memoizedState,r===null)return Mc(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)jc(r,!1);else{if(Gl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=to(e),o!==null){for(t.flags|=128,jc(r,!1),e=o.updateQueue,t.updateQueue=e,Ac(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)ti(n,e),n=n.sibling;return U(eo,eo.current&1|2),Ti&&vi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&ge()>nu&&(t.flags|=128,a=!0,jc(r,!1),t.lanes=4194304)}else{if(!a)if(e=to(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Ac(t,e),jc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!Ti)return Mc(t),null}else 2*ge()-r.renderingStartTime>nu&&n!==536870912&&(t.flags|=128,a=!0,jc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Mc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ge(),e.sibling=null,n=eo.current,U(eo,a?n&1|2:n&1),Ti&&vi(t,r.treeForkCount),e);case 22:case 23:return $a(t),Ka(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Mc(t),t.subtreeFlags&6&&(t.flags|=8192)):Mc(t),n=t.updateQueue,n!==null&&Ac(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&H(ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Bi(Zi),Mc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Pc(e,t){switch(xi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Bi(Zi),ie(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return G(t),null;case 31:if(t.memoizedState!==null){if($a(t),t.alternate===null)throw Error(i(340));Ni()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if($a(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Ni()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return H(eo),null;case 4:return ie(),null;case 10:return Bi(t.type),null;case 22:case 23:return $a(t),Ka(),e!==null&&H(ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Bi(Zi),null;case 25:return null;default:return null}}function Fc(e,t){switch(xi(t),t.tag){case 3:Bi(Zi),ie();break;case 26:case 27:case 5:G(t);break;case 4:ie();break;case 31:t.memoizedState!==null&&$a(t);break;case 13:$a(t);break;case 19:H(eo);break;case 10:Bi(t.type);break;case 22:case 23:$a(t),Ka(),e!==null&&H(ca);break;case 24:Bi(Zi)}}function Ic(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Ku(t,t.return,e)}}function Lc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Ku(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Ku(t,t.return,e)}}function Rc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Va(t,n)}catch(t){Ku(e,e.return,t)}}}function zc(e,t,n){n.props=Bs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Ku(e,t,n)}}function Bc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Ku(e,t,n)}}function Vc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Ku(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Ku(e,t,n)}else n.current=null}function Hc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Ku(e,e.return,t)}}function Uc(e,t,n){try{var r=e.stateNode;zd(r,e.type,n,t),r[Qe]=t}catch(t){Ku(e,e.return,t)}}function Wc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&tf(e.type)||e.tag===4}function Gc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Wc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&tf(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Kc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Wt));else if(r!==4&&(r===27&&tf(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Kc(e,t,n),e=e.sibling;e!==null;)Kc(e,t,n),e=e.sibling}function qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&tf(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(qc(e,t,n),e=e.sibling;e!==null;)qc(e,t,n),e=e.sibling}function Jc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Rd(t,r,n),t[Ze]=e,t[Qe]=n}catch(t){Ku(e,e.return,t)}}var Yc=!1,Xc=!1,Zc=!1,Qc=typeof WeakSet==`function`?WeakSet:Set,$c=null;function el(e,t){if(e=e.containerInfo,Hd=dp,e=vr(e),yr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Ud={focusedElem:e,selectionRange:n},dp=!1,$c=t;$c!==null;)if(t=$c,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,$c=e;else for(;$c!==null;){switch(t=$c,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Rd(o,r,n),o[Ze]=e,ut(o),r=o;break a;case`link`:var s=Gf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=gr(s,h),v=gr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,I.T=null,n=uu,uu=null;var o=ou,s=cu;if(au=0,su=ou=null,cu=0,Fl&6)throw Error(i(331));var c=Fl;if(Fl|=4,Al(o.current),Sl(o,o.current,s,n),Fl=c,od(0,!1),Ee&&typeof Ee.onPostCommitFiberRoot==`function`)try{Ee.onPostCommitFiberRoot(Te,o)}catch{}return!0}finally{L.p=a,I.T=r,Hu(e,t)}}function Gu(e,t,n){t=ci(n,t),t=Ks(e.stateNode,t,2),e=Pa(e,t,2),e!==null&&(Ve(e,2),ad(e))}function Ku(e,t,n){if(e.tag===3)Gu(e,e,n);else for(;t!==null;){if(t.tag===3){Gu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(iu===null||!iu.has(r))){e=ci(n,e),n=qs(2),r=Pa(t,n,2),r!==null&&(Js(n,r,t,e),Ve(r,2),ad(r));break}}t=t.return}}function qu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Pl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ju.bind(null,e,t,n),t.then(e,e))}function Ju(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Il===e&&(Rl&n)===n&&(Gl===4||Gl===3&&(Rl&62914560)===Rl&&300>ge()-eu?!(Fl&2)&&Cu(e,0):Jl|=n,Xl===Rl&&(Xl=0)),ad(e)}function Yu(e,t){t===0&&(t=ze()),e=qr(e,t),e!==null&&(Ve(e,t),ad(e))}function Xu(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Yu(e,n)}function Zu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),Yu(e,n)}function Qu(e,t){return fe(e,t)}var $u=null,ed=null,td=!1,nd=!1,rd=!1,id=0;function ad(e){e!==ed&&e.next===null&&(ed===null?$u=ed=e:ed=ed.next=e),nd=!0,td||(td=!0,fd())}function od(e,t){if(!rd&&nd){rd=!0;do for(var n=!1,r=$u;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Oe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,dd(r,a))}else a=Rl,a=Ie(r,r===Il?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Le(r,a)||(n=!0,dd(r,a));r=r.next}while(n);rd=!1}}function sd(){cd()}function cd(){nd=td=!1;var e=0;id!==0&&Yd()&&(e=id);for(var t=ge(),n=null,r=$u;r!==null;){var i=r.next,a=ld(r,t);a===0?(r.next=null,n===null?$u=i:n.next=i,i===null&&(ed=n)):(n=r,(e!==0||a&3)&&(nd=!0)),r=i}au!==0&&au!==5||od(e,!1),id!==0&&(id=0)}function ld(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Bd(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Tf(e,t,n){var r=wf;if(r&&typeof t==`string`&&t){var i=kt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),yf.has(i)||(yf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Rd(t,`link`,e),ut(t),r.head.appendChild(t)))}}function Ef(e){xf.D(e),Tf(`dns-prefetch`,e,null)}function Df(e,t){xf.C(e,t),Tf(`preconnect`,e,t)}function Of(e,t,n){xf.L(e,t,n);var r=wf;if(r&&e&&t){var i=`link[rel="preload"][as="`+kt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+kt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+kt(n.imageSizes)+`"]`)):i+=`[href="`+kt(e)+`"]`;var a=i;switch(t){case`style`:a=Pf(e);break;case`script`:a=Rf(e)}vf.has(a)||(e=m({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Ff(a))||t===`script`&&r.querySelector(zf(a))||(t=r.createElement(`link`),Rd(t,`link`,e),ut(t),r.head.appendChild(t)))}}function kf(e,t){xf.m(e,t);var n=wf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+kt(r)+`"][href="`+kt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rf(e)}if(!vf.has(a)&&(e=m({rel:`modulepreload`,href:e},t),vf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zf(a)))return}r=n.createElement(`link`),Rd(r,`link`,e),ut(r),n.head.appendChild(r)}}}function Af(e,t,n){xf.S(e,t,n);var r=wf;if(r&&e){var i=lt(r).hoistableStyles,a=Pf(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Ff(a)))s.loading=5;else{e=m({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vf.get(a))&&Hf(e,n);var c=o=r.createElement(`link`);ut(c),Rd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jf(e,t){xf.X(e,t);var n=wf;if(n&&e){var r=lt(n).hoistableScripts,i=Rf(e),a=r.get(i);a||(a=n.querySelector(zf(i)),a||(e=m({src:e,async:!0},t),(t=vf.get(i))&&Uf(e,t),a=n.createElement(`script`),ut(a),Rd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mf(e,t){xf.M(e,t);var n=wf;if(n&&e){var r=lt(n).hoistableScripts,i=Rf(e),a=r.get(i);a||(a=n.querySelector(zf(i)),a||(e=m({src:e,async:!0,type:`module`},t),(t=vf.get(i))&&Uf(e,t),a=n.createElement(`script`),ut(a),Rd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nf(e,t,n,r){var a=(a=te.current)?bf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Pf(n.href),n=lt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pf(n.href);var o=lt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Ff(e)))&&!o._p&&(s.instance=o,s.state.loading=5),vf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vf.set(e,n),o||Lf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Rf(n),n=lt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pf(e){return`href="`+kt(e)+`"`}function Ff(e){return`link[rel="stylesheet"][`+e+`]`}function If(e){return m({},e,{"data-precedence":e.precedence,precedence:null})}function Lf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Rd(t,`link`,n),ut(t),e.head.appendChild(t))}function Rf(e){return`[src="`+kt(e)+`"]`}function zf(e){return`script[async]`+e}function Bf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+kt(n.href)+`"]`);if(r)return t.instance=r,ut(r),r;var a=m({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),ut(r),Rd(r,`style`,a),Vf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pf(n.href);var o=e.querySelector(Ff(a));if(o)return t.state.loading|=4,t.instance=o,ut(o),o;r=If(n),(a=vf.get(a))&&Hf(r,a),o=(e.ownerDocument||e).createElement(`link`),ut(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Rd(o,`link`,r),t.state.loading|=4,Vf(o,n.precedence,e),t.instance=o;case`script`:return o=Rf(n.src),(a=e.querySelector(zf(o)))?(t.instance=a,ut(a),a):(r=n,(a=vf.get(o))&&(r=m({},n),Uf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),ut(a),Rd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vf(r,n.precedence,e));return t.instance}function Vf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Yf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pf(r.href),a=t.querySelector(Ff(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Qf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,ut(a);return}a=t.ownerDocument||t,r=If(r),(i=vf.get(i))&&Hf(r,i),a=a.createElement(`link`),ut(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Rd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Qf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Xf=0;function Zf(e,t){return e.stylesheets&&e.count===0&&ep(e,e.stylesheets),0Xf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Qf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)ep(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var $f=null;function ep(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,$f=new Map,t.forEach(tp,e),$f=null,Qf.call(e))}function tp(e,t){if(!(t.state.loading&4)){var n=$f.get(e);if(n)var r=n.get(null);else{n=new Map,$f.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=g()}))(),v=`modulepreload`,y=function(e){return`/`+e},b={},x=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=y(t,n),t in b)return;b[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:v,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},S=c(p(),1),C=`popstate`;function w(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function T(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return A(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:j(t)}return N(t,n,null,e)}function E(e,t){if(e===!1||e==null)throw Error(t)}function D(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function O(){return Math.random().toString(36).substring(2,10)}function k(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function A(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?M(t):t,state:n,key:t&&t.key||r||O(),mask:i}}function j({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function M(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function N(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=w(e)?e:A(h.location,e,t);n&&n(r,e),l=u()+1;let d=k(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=w(e)?e:A(h.location,e,t);n&&n(r,e),l=u();let i=k(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return P(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(C,d),c=e,()=>{i.removeEventListener(C,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function P(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),E(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:j(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function F(e,t,n=`/`){return I(e,t,n,!1)}function I(e,t,n,r,i){let a=ce((typeof t==`string`?M(t):t).pathname||`/`,n);if(a==null)return null;let o=i??R(e),s=null,c=se(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;E(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=ge([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(E(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),z(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:ie(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of B(e.path))a(e,t,!0,n)}),t}function B(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=B(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function V(e){e.sort((e,t)=>e.score===t.score?ae(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var H=/^:[\w-]+$/,U=3,W=2,ee=1,te=10,ne=-2,re=e=>e===`*`;function ie(e,t){let n=e.split(`/`),r=n.length;return n.some(re)&&(r+=ne),t&&(r+=W),n.filter(e=>!re(e)).reduce((e,t)=>e+(H.test(t)?U:t===``?ee:te),r)}function ae(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function G(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function K(e,t=!1,n=!0){D(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function se(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return D(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function ce(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var q=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function le(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?M(e):e,a;return n?(n=he(n),a=n.startsWith(`/`)?ue(n.substring(1),`/`):ue(n,t)):a=t,{pathname:a,search:ye(r),hash:be(i)}}function ue(e,t){let n=_e(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function de(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function fe(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function pe(e){let t=fe(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function me(e,t,n,r=!1){let i;typeof e==`string`?i=M(e):(i={...e},E(!i.pathname||!i.pathname.includes(`?`),de(`?`,`pathname`,`search`,i)),E(!i.pathname||!i.pathname.includes(`#`),de(`#`,`pathname`,`hash`,i)),E(!i.search||!i.search.includes(`#`),de(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=le(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var he=e=>e.replace(/\/\/+/g,`/`),ge=e=>he(e.join(`/`)),_e=e=>e.replace(/\/+$/,``),ve=e=>_e(e).replace(/^\/*/,`/`),ye=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,be=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,xe=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Se(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Ce(e){return ge(e.map(e=>e.route.path).filter(Boolean))||`/`}var we=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Te(e,t){let n=e;if(typeof n!=`string`||!q.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(we)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=ce(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{D(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Ee=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(Ee);var De=[`GET`,...Ee];new Set(De);var Oe=S.createContext(null);Oe.displayName=`DataRouter`;var ke=S.createContext(null);ke.displayName=`DataRouterState`;var Ae=S.createContext(!1);function je(){return S.useContext(Ae)}var Me=S.createContext({isTransitioning:!1});Me.displayName=`ViewTransition`;var Ne=S.createContext(new Map);Ne.displayName=`Fetchers`;var Pe=S.createContext(null);Pe.displayName=`Await`;var Fe=S.createContext(null);Fe.displayName=`Navigation`;var Ie=S.createContext(null);Ie.displayName=`Location`;var Le=S.createContext({outlet:null,matches:[],isDataRoute:!1});Le.displayName=`Route`;var Re=S.createContext(null);Re.displayName=`RouteError`;var ze=`REACT_ROUTER_ERROR`,Be=`REDIRECT`,Ve=`ROUTE_ERROR_RESPONSE`;function He(e){if(e.startsWith(`${ze}:${Be}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function Ue(e){if(e.startsWith(`${ze}:${Ve}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new xe(t.status,t.statusText,t.data)}catch{}}function We(e,{relative:t}={}){E(Ge(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=S.useContext(Fe),{hash:i,pathname:a,search:o}=et(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:ge([n,a])),r.createHref({pathname:s,search:o,hash:i})}function Ge(){return S.useContext(Ie)!=null}function Ke(){return E(Ge(),`useLocation() may be used only in the context of a component.`),S.useContext(Ie).location}var qe=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function Je(e){S.useContext(Fe).static||S.useLayoutEffect(e)}function Ye(){let{isDataRoute:e}=S.useContext(Le);return e?yt():Xe()}function Xe(){E(Ge(),`useNavigate() may be used only in the context of a component.`);let e=S.useContext(Oe),{basename:t,navigator:n}=S.useContext(Fe),{matches:r}=S.useContext(Le),{pathname:i}=Ke(),a=JSON.stringify(pe(r)),o=S.useRef(!1);return Je(()=>{o.current=!0}),S.useCallback((r,s={})=>{if(D(o.current,qe),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=me(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:ge([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}var Ze=S.createContext(null);function Qe(e){let t=S.useContext(Le).outlet;return S.useMemo(()=>t&&S.createElement(Ze.Provider,{value:e},t),[t,e])}function $e(){let{matches:e}=S.useContext(Le);return e[e.length-1]?.params??{}}function et(e,{relative:t}={}){let{matches:n}=S.useContext(Le),{pathname:r}=Ke(),i=JSON.stringify(pe(n));return S.useMemo(()=>me(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function tt(e,t){return nt(e,t)}function nt(e,t,n){E(Ge(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=S.useContext(Fe),{matches:i}=S.useContext(Le),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;xt(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let u=Ke(),d;if(t){let e=typeof t==`string`?M(t):t;E(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):F(e,{pathname:p});D(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),D(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let h=lt(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:ge([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:ge([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?S.createElement(Ie.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function rt(){let e=vt(),t=Se(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=S.createElement(S.Fragment,null,S.createElement(`p`,null,`💿 Hey developer 👋`),S.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,S.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,S.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),S.createElement(S.Fragment,null,S.createElement(`h2`,null,`Unexpected Application Error!`),S.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?S.createElement(`pre`,{style:i},n):null,o)}var it=S.createElement(rt,null),at=class extends S.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=Ue(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:S.createElement(Le.Provider,{value:this.props.routeContext},S.createElement(Re.Provider,{value:e,children:this.props.component}));return this.context?S.createElement(st,{error:e},t):t}};at.contextType=Ae;var ot=new WeakMap;function st({children:e,error:t}){let{basename:n}=S.useContext(Fe);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=He(t.digest);if(e){let r=ot.get(t);if(r)throw r;let i=Te(e.location,n);if(we&&!ot.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw ot.set(t,n),n}return S.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function ct({routeContext:e,match:t,children:n}){let r=S.useContext(Oe);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),S.createElement(Le.Provider,{value:e},n)}function lt(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);E(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:Ce(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||it,o&&(s<0&&c===0?(xt(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?S.createElement(n.route.Component,null):n.route.element?n.route.element:e,S.createElement(ct,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?S.createElement(at,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function ut(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function dt(e){let t=S.useContext(Oe);return E(t,ut(e)),t}function ft(e){let t=S.useContext(ke);return E(t,ut(e)),t}function pt(e){let t=S.useContext(Le);return E(t,ut(e)),t}function mt(e){let t=pt(e),n=t.matches[t.matches.length-1];return E(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function ht(){return mt(`useRouteId`)}function gt(){return ft(`useNavigation`).navigation}function _t(){let{matches:e,loaderData:t}=ft(`useMatches`);return S.useMemo(()=>e.map(e=>L(e,t)),[e,t])}function vt(){let e=S.useContext(Re),t=ft(`useRouteError`),n=mt(`useRouteError`);return e===void 0?t.errors?.[n]:e}function yt(){let{router:e}=dt(`useNavigate`),t=mt(`useNavigate`),n=S.useRef(!1);return Je(()=>{n.current=!0}),S.useCallback(async(r,i={})=>{D(n.current,qe),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var bt={};function xt(e,t,n){!t&&!bt[e]&&(bt[e]=!0,D(!1,n))}S.memo(St);function St({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return nt(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function Ct({to:e,replace:t,state:n,relative:r}){E(Ge(),` may be used only in the context of a component.`);let{static:i}=S.useContext(Fe);D(!i,` must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.`);let{matches:a}=S.useContext(Le),{pathname:o}=Ke(),s=Ye(),c=me(e,pe(a),o,r===`path`),l=JSON.stringify(c);return S.useEffect(()=>{s(JSON.parse(l),{replace:t,state:n,relative:r})},[s,l,r,t,n]),null}function wt(e){return Qe(e.context)}function Tt(e){E(!1,`A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .`)}function Et({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){E(!Ge(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=S.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=M(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=S.useMemo(()=>{let e=ce(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return D(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:S.createElement(Fe.Provider,{value:c},S.createElement(Ie.Provider,{children:t,value:h}))}function Dt({children:e,location:t}){return tt(Ot(e),t)}S.Component;function Ot(e,t=[]){let n=[];return S.Children.forEach(e,(e,r)=>{if(!S.isValidElement(e))return;let i=[...t,r];if(e.type===S.Fragment){n.push.apply(n,Ot(e.props.children,i));return}E(e.type===Tt,`[${typeof e.type==`string`?e.type:e.type.name}] is not a component. All component children of must be a or `),E(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=Ot(e.props.children,i)),n.push(a)}),n}var kt=`get`,At=`application/x-www-form-urlencoded`;function jt(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Mt(e){return jt(e)&&e.tagName.toLowerCase()===`button`}function Nt(e){return jt(e)&&e.tagName.toLowerCase()===`form`}function Pt(e){return jt(e)&&e.tagName.toLowerCase()===`input`}function Ft(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function It(e,t){return e.button===0&&(!t||t===`_self`)&&!Ft(e)}var Lt=null;function Rt(){if(Lt===null)try{new FormData(document.createElement(`form`),0),Lt=!1}catch{Lt=!0}return Lt}var zt=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function Bt(e){return e!=null&&!zt.has(e)?(D(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${At}"`),null):e}function Vt(e,t){let n,r,i,a,o;if(Nt(e)){let o=e.getAttribute(`action`);r=o?ce(o,t):null,n=e.getAttribute(`method`)||kt,i=Bt(e.getAttribute(`enctype`))||At,a=new FormData(e)}else if(Mt(e)||Pt(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a
`);if(e.length==1)return lr(Qu(e[0],t),t);var n=vf();return e.forEach(function(e,r){yf(n,Qu(e,t),`Sheet`+(r+1))}),n}(a,r);_u={"General Number":`General`,"General Date":V[22],"Long Date":`dddd, mmmm dd, yyyy`,"Medium Date":V[15],"Short Date":V[14],"Long Time":V[19],"Medium Time":V[18],"Short Time":V[20],Currency:`"$"#,##0.00_);[Red]\\("$"#,##0.00\\)`,Fixed:V[2],Standard:V[4],Percent:V[10],Scientific:V[11],"Yes/No":`"Yes";"Yes";"No";@`,"True/False":`"True";"True";"False";@`,"On/Off":`"Yes";"Yes";"No";@`};var l,u=[];g!=null&&r.dense==null&&(r.dense=g);var f,m={},h=[],_=r.dense?[]:{},v=``,y={},b={},x=bu(``),S=0,C=0,w=0,T={s:{r:2e6,c:2e6},e:{r:0,c:0}},E={},D={},O=``,k=0,A=[],j={},M={},N=0,P=[],F=[],I={},L=[],R=!1,z=[],B=[],H={},U=0,W=0,ee={Sheets:[],WBProps:{date1904:!1}},te={};an.lastIndex=0,a=a.replace(//gm,``);for(var ne,re,ie,ae,G=``;i=an.exec(a);)switch(i[3]=(G=i[3]).toLowerCase()){case`data`:if(G==`data`){if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`))}else i[0].charAt(i[0].length-2)!==`/`&&u.push([i[3],!0]);break}if(u[u.length-1][1])break;i[1]===`/`?function(e,t,n,r,i,a,o,s,c,l){var u=`General`,d=r.StyleID,f={};l||={};var p=[],m=0;for((d=d===void 0&&s?s.StyleID:d)===void 0&&o&&(d=o.StyleID);a[d]!==void 0&&(a[d].nf&&(u=a[d].nf),a[d].Interior&&p.push(a[d].Interior),a[d].Parent);)d=a[d].Parent;switch(n.Type){case`Boolean`:r.t=`b`,r.v=It(e);break;case`String`:r.t=`s`,r.r=Pt(Et(e)),r.v=-1/g,``):r.r;break;case`DateTime`:e.slice(-1)!=`Z`&&(e+=`Z`),r.v=(Je(e)-new Date(Date.UTC(1899,11,30)))/864e5,r.v==r.v?r.v<60&&--r.v:r.v=Et(e),u&&u!=`General`||(u=`yyyy-mm-dd`);case`Number`:r.v===void 0&&(r.v=+e),r.t||=`n`;break;case`Error`:r.t=`e`,r.v=Jr[e],!1!==l.cellText&&(r.w=e);break;default:e==``&&t==``?r.t=`z`:(r.t=`s`,r.v=Pt(t||e))}if(xu(r,u,l),!1!==l.cellFormula)if(r.Formula)n=Et(r.Formula),n.charCodeAt(0)==61&&(n=n.slice(1)),r.f=fc(n,i),delete r.Formula,r.ArrayRange==`RC`?r.F=fc(`RC:RC`,i):r.ArrayRange&&(r.F=fc(r.ArrayRange,i),c.push([or(r.F),r.F]));else for(m=0;m=c[m][0].s.r&&i.r<=c[m][0].e.r&&i.c>=c[m][0].s.c&&i.c<=c[m][0].e.c&&(r.F=c[m][1]);l.cellStyles&&(p.forEach(function(e){!f.patternType&&e.patternType&&(f.patternType=e.patternType)}),r.s=f),r.StyleID!==void 0&&(r.ixfe=r.StyleID)}(a.slice(S,i.index),O,x,u[u.length-1][0]==`comment`?I:y,{c:C,r:w},E,L[C],b,z,r):(O=``,x=bu(i[0]),S=i.index+i[0].length);break;case`cell`:if(i[1]===`/`)if(0w)&&y.v!==void 0&&(r.dense?(_[w]||(_[w]=[]),_[w][C]=y):_[tr(C)+$n(w)]=y),y.HRef&&(y.l={Target:Et(y.HRef)},y.HRefScreenTip&&(y.l.Tooltip=y.HRefScreenTip),delete y.HRef,delete y.HRefScreenTip),(y.MergeAcross||y.MergeDown)&&(U=C+(0|parseInt(y.MergeAcross,10)),W=w+(0|parseInt(y.MergeDown,10)),A.push({s:{c:C,r:w},e:{c:U,r:W}})),r.sheetStubs)if(y.MergeAcross||y.MergeDown){for(var oe=C;oe<=U;++oe)for(var K=w;K<=W;++K)(CT.e.c&&(T.e.c=C),i[0].slice(-2)===`/>`&&++C,F=[];break;case`row`:i[1]===`/`||i[0].slice(-2)===`/>`?(wT.e.r&&(T.e.r=w),i[0].slice(-2)===`/>`&&(b=bu(i[0])).Index&&(w=b.Index-1),C=0,++w):((b=bu(i[0])).Index&&(w=b.Index-1),H={},b.AutoFitHeight!=`0`&&!b.Height||(H.hpx=parseInt(b.Height,10),H.hpt=vs(H.hpx),B[w]=H),b.Hidden==`1`&&(H.hidden=!0,B[w]=H));break;case`worksheet`:if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`));h.push(v),T.s.r<=T.e.r&&T.s.c<=T.e.c&&(_[`!ref`]=ar(T),r.sheetRows&&r.sheetRows<=T.e.r&&(_[`!fullref`]=_[`!ref`],T.e.r=r.sheetRows-1,_[`!ref`]=ar(T))),A.length&&(_[`!merges`]=A),0`)break;u.push([i[3],!1]),R=!(L=[])}break;case`style`:i[1]===`/`?(re=E,ie=D,(ae=r).cellStyles&&(!ie.Interior||(ae=ie.Interior).Pattern&&(ae.patternType=bs[ae.Pattern]||ae.Pattern)),re[ie.ID]=ie):D=bu(i[0]);break;case`numberformat`:D.nf=Et(bu(i[0]).Format||`General`),_u[D.nf]&&(D.nf=_u[D.nf]);for(var se=0;se!=392&&V[se]!=D.nf;++se);if(se==392){for(se=57;se!=392;++se)if(V[se]==null){we(D.nf,se);break}}break;case`column`:if(u[u.length-1][0]!==`table`)break;if((f=bu(i[0])).Hidden&&(f.hidden=!0,delete f.Hidden),f.Width&&(f.wpx=parseInt(f.Width,10)),!R&&10`)break;i[1]===`/`?O+=a.slice(k,i.index):k=i.index+i[0].length;break;case`interior`:if(!r.cellStyles)break;D.Interior=bu(i[0]);break;case`protection`:break;case`author`:case`title`:case`description`:case`created`:case`keywords`:case`subject`:case`category`:case`company`:case`lastauthor`:case`lastsaved`:case`lastprinted`:case`version`:case`revision`:case`totaltime`:case`hyperlinkbase`:case`manager`:case`contentstatus`:case`identifier`:case`language`:case`appname`:if(i[0].slice(-2)===`/>`)break;i[1]===`/`?(ie=j,le=G,ue=a.slice(N,i.index),ie[le=(vi||=Le(yi))[le]||le]=ue):N=i.index+i[0].length;break;case`paragraphs`:break;case`styles`:case`workbook`:if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`))}else u.push([i[3],!1]);break;case`comment`:if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`));(ne=I).t=ne.v||``,ne.t=ne.t.replace(/\r\n/g,` +`).replace(/\r/g,` +`),ne.v=ne.w=ne.ixfe=void 0,F.push(I)}else u.push([i[3],!1]),I={a:(l=bu(i[0])).Author};break;case`autofilter`:if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`))}else i[0].charAt(i[0].length-2)!==`/`&&(ne=bu(i[0]),_[`!autofilter`]={ref:fc(ne.Range).replace(/\$/g,``)},u.push([i[3],!0]));break;case`name`:break;case`datavalidation`:if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`))}else i[0].charAt(i[0].length-2)!==`/`&&u.push([i[3],!0]);break;case`pixelsperinch`:break;case`componentoptions`:case`documentproperties`:case`customdocumentproperties`:case`officedocumentsettings`:case`pivottable`:case`pivotcache`:case`names`:case`mapinfo`:case`pagebreaks`:case`querytable`:case`sorting`:case`schema`:case`conditionalformatting`:case`smarttagtype`:case`smarttags`:case`excelworkbook`:case`workbookoptions`:case`worksheetoptions`:if(i[1]===`/`){if((l=u.pop())[0]!==i[3])throw Error(`Bad state: `+l.join(`|`))}else i[0].charAt(i[0].length-2)!==`/`&&u.push([i[3],!0]);break;case`null`:break;default:if(u.length==0&&i[3]==`document`||u.length==0&&i[3]==`uof`)return ud(a,r);var de=!0;switch(u[u.length-1][0]){case`officedocumentsettings`:switch(i[3]){case`allowpng`:case`removepersonalinformation`:case`downloadcomponents`:case`locationofcomponents`:case`colors`:case`color`:case`index`:case`rgb`:case`targetscreensize`:case`readonlyrecommended`:break;default:de=!1}break;case`componentoptions`:switch(i[3]){case`toolbar`:case`hideofficelogo`:case`spreadsheetautofit`:case`label`:case`caption`:case`maxheight`:case`maxwidth`:case`nextsheetnumber`:break;default:de=!1}break;case`excelworkbook`:switch(i[3]){case`date1904`:ee.WBProps.date1904=!0;break;case`windowheight`:case`windowwidth`:case`windowtopx`:case`windowtopy`:case`tabratio`:case`protectstructure`:case`protectwindow`:case`protectwindows`:case`activesheet`:case`displayinknotes`:case`firstvisiblesheet`:case`supbook`:case`sheetname`:case`sheetindex`:case`sheetindexfirst`:case`sheetindexlast`:case`dll`:case`acceptlabelsinformulas`:case`donotsavelinkvalues`:case`iteration`:case`maxiterations`:case`maxchange`:case`path`:case`xct`:case`count`:case`selectedsheets`:case`calculation`:case`uncalced`:case`startupprompt`:case`crn`:case`externname`:case`formula`:case`colfirst`:case`collast`:case`wantadvise`:case`boolean`:case`error`:case`text`:case`ole`:case`noautorecover`:case`publishobjects`:case`donotcalculatebeforesave`:case`number`:case`refmoder1c1`:case`embedsavesmarttags`:break;default:de=!1}break;case`workbookoptions`:switch(i[3]){case`owcversion`:case`height`:case`width`:break;default:de=!1}break;case`worksheetoptions`:switch(i[3]){case`visible`:if(i[0].slice(-2)!==`/>`)if(i[1]===`/`)switch(a.slice(N,i.index)){case`SheetHidden`:te.Hidden=1;break;case`SheetVeryHidden`:te.Hidden=2}else N=i.index+i[0].length;break;case`header`:_[`!margins`]||il(_[`!margins`]={},`xlml`),isNaN(+bt(i[0]).Margin)||(_[`!margins`].header=+bt(i[0]).Margin);break;case`footer`:_[`!margins`]||il(_[`!margins`]={},`xlml`),isNaN(+bt(i[0]).Margin)||(_[`!margins`].footer=+bt(i[0]).Margin);break;case`pagemargins`:var fe=bt(i[0]);_[`!margins`]||il(_[`!margins`]={},`xlml`),isNaN(+fe.Top)||(_[`!margins`].top=+fe.Top),isNaN(+fe.Left)||(_[`!margins`].left=+fe.Left),isNaN(+fe.Right)||(_[`!margins`].right=+fe.Right),isNaN(+fe.Bottom)||(_[`!margins`].bottom=+fe.Bottom);break;case`displayrighttoleft`:ee.Views||=[],ee.Views[0]||(ee.Views[0]={}),ee.Views[0].RTL=!0;break;case`freezepanes`:case`frozennosplit`:break;case`splithorizontal`:case`splitvertical`:case`donotdisplaygridlines`:case`activerow`:case`activecol`:case`toprowbottompane`:case`leftcolumnrightpane`:case`unsynced`:case`print`:case`printerrors`:case`panes`:case`scale`:case`pane`:case`number`:case`layout`:case`pagesetup`:case`selected`:case`protectobjects`:case`enableselection`:case`protectscenarios`:case`validprinterinfo`:case`horizontalresolution`:case`verticalresolution`:case`numberofcopies`:case`activepane`:case`toprowvisible`:case`leftcolumnvisible`:case`fittopage`:case`rangeselection`:case`papersizeindex`:case`pagelayoutzoom`:case`pagebreakzoom`:case`filteron`:case`fitwidth`:case`fitheight`:case`commentslayout`:case`zoom`:case`lefttoright`:case`gridlines`:case`allowsort`:case`allowfilter`:case`allowinsertrows`:case`allowdeleterows`:case`allowinsertcols`:case`allowdeletecols`:case`allowinserthyperlinks`:case`allowformatcells`:case`allowsizecols`:case`allowsizerows`:break;case`nosummaryrowsbelowdetail`:_[`!outline`]||={},_[`!outline`].above=!0;break;case`tabcolorindex`:case`donotdisplayheadings`:case`showpagelayoutzoom`:break;case`nosummarycolumnsrightdetail`:_[`!outline`]||={},_[`!outline`].left=!0;break;case`blackandwhite`:case`donotdisplayzeros`:case`displaypagebreak`:case`rowcolheadings`:case`donotdisplayoutline`:case`noorientation`:case`allowusepivottables`:case`zeroheight`:case`viewablerange`:case`selection`:case`protectcontents`:break;default:de=!1}break;case`pivottable`:case`pivotcache`:switch(i[3]){case`immediateitemsondrop`:case`showpagemultipleitemlabel`:case`compactrowindent`:case`location`:case`pivotfield`:case`orientation`:case`layoutform`:case`layoutsubtotallocation`:case`layoutcompactrow`:case`position`:case`pivotitem`:case`datatype`:case`datafield`:case`sourcename`:case`parentfield`:case`ptlineitems`:case`ptlineitem`:case`countofsameitems`:case`item`:case`itemtype`:case`ptsource`:case`cacheindex`:case`consolidationreference`:case`filename`:case`reference`:case`nocolumngrand`:case`norowgrand`:case`blanklineafteritems`:case`hidden`:case`subtotal`:case`basefield`:case`mapchilditems`:case`function`:case`refreshonfileopen`:case`printsettitles`:case`mergelabels`:case`defaultversion`:case`refreshname`:case`refreshdate`:case`refreshdatecopy`:case`versionlastrefresh`:case`versionlastupdate`:case`versionupdateablemin`:case`versionrefreshablemin`:case`calculation`:break;default:de=!1}break;case`pagebreaks`:switch(i[3]){case`colbreaks`:case`colbreak`:case`rowbreaks`:case`rowbreak`:case`colstart`:case`colend`:case`rowend`:break;default:de=!1}break;case`autofilter`:switch(i[3]){case`autofiltercolumn`:case`autofiltercondition`:case`autofilterand`:case`autofilteror`:break;default:de=!1}break;case`querytable`:switch(i[3]){case`id`:case`autoformatfont`:case`autoformatpattern`:case`querysource`:case`querytype`:case`enableredirections`:case`refreshedinxl9`:case`urlstring`:case`htmltables`:case`connection`:case`commandtext`:case`refreshinfo`:case`notitles`:case`nextid`:case`columninfo`:case`overwritecells`:case`donotpromptforfile`:case`textwizardsettings`:case`source`:case`number`:case`decimal`:case`thousandseparator`:case`trailingminusnumbers`:case`formatsettings`:case`fieldtype`:case`delimiters`:case`tab`:case`comma`:case`autoformatname`:case`versionlastedit`:case`versionlastrefresh`:break;default:de=!1}break;case`datavalidation`:switch(i[3]){case`range`:case`type`:case`min`:case`max`:case`sort`:case`descending`:case`order`:case`casesensitive`:case`value`:case`errorstyle`:case`errormessage`:case`errortitle`:case`inputmessage`:case`inputtitle`:case`combohide`:case`inputhide`:case`condition`:case`qualifier`:case`useblank`:case`value1`:case`value2`:case`format`:case`cellrangelist`:break;default:de=!1}break;case`sorting`:case`conditionalformatting`:switch(i[3]){case`range`:case`type`:case`min`:case`max`:case`sort`:case`descending`:case`order`:case`casesensitive`:case`value`:case`errorstyle`:case`errormessage`:case`errortitle`:case`cellrangelist`:case`inputmessage`:case`inputtitle`:case`combohide`:case`inputhide`:case`condition`:case`qualifier`:case`useblank`:case`value1`:case`value2`:case`format`:break;default:de=!1}break;case`mapinfo`:case`schema`:case`data`:switch(i[3]){case`map`:case`entry`:case`range`:case`xpath`:case`field`:case`xsdtype`:case`filteron`:case`aggregate`:case`elementtype`:case`attributetype`:break;case`schema`:case`element`:case`complextype`:case`datatype`:case`all`:case`attribute`:case`extends`:case`row`:break;default:de=!1}break;case`smarttags`:break;default:de=!1}if(de||i[3].match(/!\[CDATA/))break;if(!u[u.length-1][1])throw`Unrecognized tag: `+i[3]+`|`+u.join(`|`);if(u[u.length-1][0]===`customdocumentproperties`){if(i[0].slice(-2)===`/>`)break;i[1]===`/`?function(e,t,n,r){var i=r;switch((n[0].match(/dt:dt="([\w.]+)"/)||[``,``])[1]){case`boolean`:i=It(r);break;case`i2`:case`int`:i=parseInt(r,10);break;case`r4`:case`float`:i=parseFloat(r);break;case`date`:case`dateTime.tz`:i=Je(r);break;case`i8`:case`string`:case`fixed`:case`uuid`:case`bin.base64`:break;default:throw Error(`bad custprop:`+n[0])}e[Et(t)]=i}(M,G,P,a.slice(N,i.index)):N=(P=i).index+i[0].length;break}if(r.WTF)throw`Unrecognized tag: `+i[3]+`|`+u.join(`|`)}return c={},r.bookSheets||r.bookProps||(c.Sheets=m),c.SheetNames=h,c.Workbook=ee,c.SSF=Xe(V),c.Props=j,c.Custprops=M,c}function Cu(e,t){switch(Vd(t||={}),t.type||`base64`){case`base64`:return Su(b(e),t);case`binary`:case`buffer`:case`file`:return Su(e,t);case`array`:return Su(D(e),t)}}function wu(e,t){var n,r,i,a,o,s,c,l=[];return e.Props&&l.push((n=e.Props,r=t,i=[],Fe(yi).map(function(e){for(var t=0;t`+c.join(``)+``)),l.join(``)}function Tu(e){return tn(`NamedRange`,null,{"ss:Name":e.Name,"ss:RefersTo":`=`+hc(e.Ref,{r:0,c:0})})}function Eu(e,t,n,r,i,a,o){if(!e||e.v==null&&e.f==null)return``;var s={};if(e.f&&(s[`ss:Formula`]=`=`+kt(hc(e.f,o))),e.F&&e.F.slice(0,t.length)==t&&(t=nr(e.F.slice(t.length+1)),s[`ss:ArrayRange`]=`RC:R`+(t.r==o.r?``:`[`+(t.r-o.r)+`]`)+`C`+(t.c==o.c?``:`[`+(t.c-o.c)+`]`)),e.l&&e.l.Target&&(s[`ss:HRef`]=kt(e.l.Target),e.l.Tooltip&&(s[`x:HRefScreenTip`]=kt(e.l.Tooltip))),n[`!merges`])for(var c=n[`!merges`],l=0;l!=c.length;++l)c[l].s.c==o.c&&c[l].s.r==o.r&&(c[l].e.c>c[l].s.c&&(s[`ss:MergeAcross`]=c[l].e.c-c[l].s.c),c[l].e.r>c[l].s.r&&(s[`ss:MergeDown`]=c[l].e.r-c[l].s.r));var u=``,d=``;switch(e.t){case`z`:if(!r.sheetStubs)return``;break;case`n`:u=`Number`,d=String(e.v);break;case`b`:u=`Boolean`,d=e.v?`1`:`0`;break;case`e`:u=`Error`,d=qr[e.v];break;case`d`:u=`DateTime`,d=new Date(e.v).toISOString(),e.z??=e.z||V[14];break;case`s`:u=`String`,d=((e.v||``)+``).replace(Dt,function(e){return Tt[e]}).replace(jt,function(e){return`&#x`+e.charCodeAt(0).toString(16).toUpperCase()+`;`})}return n=al(r.cellXfs,e,r),s[`ss:StyleID`]=`s`+(21+n),s[`ss:Index`]=o.c+1,n=e.v==null?``:d,n=e.t==`z`?``:``+n+``,0<(e.c||[]).length&&(n+=e.c.map(function(e){return tn(`Comment`,tn(`ss:Data`,(e.t||``).replace(/(\r\n|[\r\n])/g,` `),{xmlns:`http://www.w3.org/TR/REC-html40`}),{"ss:Author":e.a})}).join(``)),tn(`Cell`,n,s)}function Du(e,t){if(!e[`!ref`])return``;var n=or(e[`!ref`]),r=e[`!merges`]||[],i=0,a=[];e[`!cols`]&&e[`!cols`].forEach(function(e,t){gs(e);var n=!!e.width,r=rl(t,e),t={"ss:Index":t+1};n&&(t[`ss:Width`]=ds(r.width)),e.hidden&&(t[`ss:Hidden`]=`1`),a.push(tn(`Column`,null,t))});for(var o,s,c=Array.isArray(e),l=n.s.r;l<=n.e.r;++l){for(var u=[(o=l,s=(e[`!rows`]||[])[l],o=``)],d=n.s.c;d<=n.e.c;++d){for(var f,p,m,h=!1,i=0;i!=r.length;++i)if(!(r[i].s.c>d||r[i].s.r>l||r[i].e.c`),2`+i+``),0<(i=a?Du(a,t):``).length&&r.push(`
`+i+`
`),r.push(function(e,t,n){if(!e)return``;var r=[];if(e[`!margins`]&&(r.push(``),e[`!margins`].header&&r.push(tn(`Header`,null,{"x:Margin":e[`!margins`].header})),e[`!margins`].footer&&r.push(tn(`Footer`,null,{"x:Margin":e[`!margins`].footer})),r.push(tn(`PageMargins`,null,{"x:Bottom":e[`!margins`].bottom||`0.75`,"x:Left":e[`!margins`].left||`0.7`,"x:Right":e[`!margins`].right||`0.7`,"x:Top":e[`!margins`].top||`0.75`})),r.push(``)),n&&n.Workbook&&n.Workbook.Sheets&&n.Workbook.Sheets[t])if(n.Workbook.Sheets[t].Hidden)r.push(tn(`Visible`,n.Workbook.Sheets[t].Hidden==1?`SheetHidden`:`SheetVeryHidden`,{}));else{for(var i=0;i`)}return((((n||{}).Workbook||{}).Views||[])[0]||{}).RTL&&r.push(``),e[`!protect`]&&(r.push($t(`ProtectContents`,`True`)),e[`!protect`].objects&&r.push($t(`ProtectObjects`,`True`)),e[`!protect`].scenarios&&r.push($t(`ProtectScenarios`,`True`)),e[`!protect`].selectLockedCells==null||e[`!protect`].selectLockedCells?e[`!protect`].selectUnlockedCells==null||e[`!protect`].selectUnlockedCells||r.push($t(`EnableSelection`,`UnlockedCells`)):r.push($t(`EnableSelection`,`NoSelection`)),[[`formatCells`,`AllowFormatCells`],[`formatColumns`,`AllowSizeCols`],[`formatRows`,`AllowSizeRows`],[`insertColumns`,`AllowInsertCols`],[`insertRows`,`AllowInsertRows`],[`insertHyperlinks`,`AllowInsertHyperlinks`],[`deleteColumns`,`AllowDeleteCols`],[`deleteRows`,`AllowDeleteRows`],[`sort`,`AllowSort`],[`autoFilter`,`AllowFilter`],[`pivotTables`,`AllowUsePivotTables`]].forEach(function(t){e[`!protect`][t[0]]&&r.push(`<`+t[1]+`/>`)})),r.length==0?``:tn(`WorksheetOptions`,r.join(``),{xmlns:cn.x})}(a,e,n)),r.join(``)}function ku(e,t){t||={},e.SSF||=Xe(V),e.SSF&&(Ee(),Te(e.SSF),t.revssf=Re(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF,t.cellXfs=[],al(t.cellXfs,{},{revssf:{General:0}}));var n=[];n.push(wu(e,t)),n.push(``),n.push(``),n.push(``);for(var r,i=0;i`],t.cellXfs.forEach(function(e,t){var n=[];n.push(tn(`NumberFormat`,null,{"ss:Format":kt(V[e.numFmtId])})),t={"ss:ID":`s`+(21+t)},r.push(tn(`Style`,n.join(``),t))}),tn(`Styles`,r.join(``))),n[3]=function(e){if(!((e||{}).Workbook||{}).Names)return``;for(var t=e.Workbook.Names,n=[],r=0;r=n.sheetRows)){var r,a,s;if(n.cellStyles&&t.XF&&t.XF.data&&(a=n,(s=(r=t).XF.data)&&s.patternType&&a&&a.cellStyles&&(r.s={},r.s.patternType=s.patternType,(a=as(i(s.icvFore)))&&(r.s.fgColor={rgb:a}),(a=as(i(s.icvBack)))&&(r.s.bgColor={rgb:a}))),delete t.ixfe,delete t.XF,b=rr(o=e),m&&m.s&&m.e||(m={s:{r:0,c:0},e:{r:0,c:0}}),e.rm.e.r&&(m.e.r=e.r+1),e.c+1>m.e.c&&(m.e.c=e.c+1),n.cellFormula&&t.f){for(var c=0;ce.c||S[c][0].s.r>e.r||S[c][0].e.c>8)!==W)throw Error(`rt mismatch: `+ne+`!=`+W);te.r==12&&(e.l+=10,ee-=10)}var re,ie,ae,G={},G=W===10?te.f(e,ee,D):function(e,t,n,r,i){var a=r,o=[],s=n.slice(n.l,n.l+a);if(i&&i.enc&&i.enc.insitu&&0>8&63]),Mu(q,t,n.opts.Date1904),a({c:G.c,r:G.r},q,t);break;case 5:case 517:q={ixfe:G.ixfe,XF:C[G.ixfe],v:G.val,t:G.t},0>8&63]),Mu(q,t,n.opts.Date1904),a({c:G.c,r:G.r},q,t);break;case 638:q={ixfe:G.ixfe,XF:C[G.ixfe],v:G.rknum,t:`n`},0>8&63]),Mu(q,t,n.opts.Date1904),a({c:G.c,r:G.r},q,t);break;case 189:for(var se=G.c;se<=G.C;++se){var ce=G.rkrec[se-G.c][0],q={ixfe:ce,XF:C[ce],v:G.rkrec[se-G.c][1],t:`n`};0>8&63]),Mu(q,t,n.opts.Date1904),a({c:se,r:G.r},q,t)}break;case 6:case 518:case 1030:if(G.val==`String`){h=G;break}(q=Nu(G.val,G.cell.ixfe,G.tt)).XF=C[q.ixfe],t.cellFormula&&(!((le=G.formula)&&le[0]&&le[0][0]&&le[0][0][0]==`PtgExp`)||x[ae=rr({r:re=le[0][0][1][0],c:ie=le[0][0][1][1]})]?q.f=``+Bc(G.formula,0,G.cell,P,D):q.F=((t.dense?(f[re]||[])[ie]:f[ae])||{}).F),0>8&63]),Mu(q,t,n.opts.Date1904),a(G.cell,q,t),h=G;break;case 7:case 519:if(!h)throw Error(`String record expects Formula`);(q=Nu(h.val=G,h.cell.ixfe,`s`)).XF=C[q.ixfe],t.cellFormula&&(q.f=``+Bc(h.formula,0,h.cell,P,D)),0>8&63]),Mu(q,t,n.opts.Date1904),a(h.cell,q,t),h=null;break;case 33:case 545:S.push(G);var le=rr(G[0].s),ue=t.dense?(f[G[0].s.r]||[])[G[0].s.c]:f[le];if(t.cellFormula&&ue){if(!h||!le||!ue)break;ue.f=``+Bc(G[1],0,G[0],P,D),ue.F=ar(G[0])}break;case 1212:if(!t.cellFormula)break;if(b){if(!h)break;x[rr(h.cell)]=G[0],((ue=t.dense?(f[h.cell.r]||[])[h.cell.c]:f[rr(h.cell)])||{}).f=``+Bc(G[0],0,o,P,D)}break;case 253:q=Nu(_[G.isst].t,G.ixfe,`s`),_[G.isst].h&&(q.h=_[G.isst].h),q.XF=C[q.ixfe],0>8&63]),Mu(q,t,n.opts.Date1904),a({c:G.c,r:G.r},q,t);break;case 513:t.sheetStubs&&(q={ixfe:G.ixfe,XF:C[G.ixfe],t:`z`},0>8&63]),Mu(q,t,n.opts.Date1904),a({c:G.c,r:G.r},q,t));break;case 190:if(t.sheetStubs)for(var de=G.c;de<=G.C;++de){var fe=G.ixfe[de-G.c];q={ixfe:fe,XF:C[fe],t:`z`},0>8&63]),Mu(q,t,n.opts.Date1904),a({c:de,r:G.r},q,t)}break;case 214:case 516:case 4:(q=Nu(G.val,G.ixfe,`s`)).XF=C[q.ixfe],0>8&63]),Mu(q,t,n.opts.Date1904),a({c:G.c,r:G.r},q,t);break;case 0:case 512:L===1&&(m=G);break;case 252:_=G;break;case 1054:if(D.biff==4){z[R++]=G[1];for(var pe=0;pe=G.s;)j[G.e--]={width:G.w/256,level:G.level||0,hidden:!!(1&G.flags)},N||(N=!0,hs(G.w/256)),gs(j[G.e+1]);break;case 520:he={},G.level!=null&&((M[G.r]=he).level=G.level),G.hidden&&((M[G.r]=he).hidden=!0),G.hpt&&((M[G.r]=he).hpt=G.hpt,he.hpx=ys(G.hpt));break;case 38:case 39:case 40:case 41:f[`!margins`]||il(f[`!margins`]={}),f[`!margins`][{38:`left`,39:`right`,40:`top`,41:`bottom`}[W]]=G;break;case 161:f[`!margins`]||il(f[`!margins`]={}),f[`!margins`].header=G.header,f[`!margins`].footer=G.footer;break;case 574:G.RTL&&(T.Views[0].RTL=!0);break;case 146:w=G;break;case 2198:d=G;break;case 140:u=G;break;case 442:v?E.CodeName=G||E.name:T.WBProps.CodeName=G||`ThisWorkbook`}}else te||console.error(`Missing Info for XLS Record 0x`+W.toString(16)),e.l+=ee}return n.SheetNames=Fe(p).sort(function(e,t){return Number(e)-Number(t)}).map(function(e){return p[e].name}),t.bookSheets||(n.Sheets=r),!n.SheetNames.length&&y[`!ref`]?(n.SheetNames.push(`Sheet1`),n.Sheets&&(n.Sheets.Sheet1=y)):n.Preamble=y,n.Sheets&&B.forEach(function(e,t){n.Sheets[n.SheetNames[t]][`!autofilter`]=e}),n.Strings=_,n.SSF=Xe(V),D.enc&&(n.Encryption=D.enc),d&&(n.Themes=d),n.Metadata={},u!==void 0&&(n.Metadata.Country=u),0>>1,r=e.read_shift(1),i=e.read_shift(2,`i`),a=e.read_shift(1),o=e.read_shift(1),s=e.read_shift(1);switch(e.l++,n){case 0:t.auto=1;break;case 1:t.index=r;var c=Kr[r];c&&(t.rgb=as(c));break;case 2:t.rgb=as([a,o,s]);break;case 3:t.theme=r}return i!=0&&(t.tint=0>13&3],n.showPivotChartFilter=!!(32768&r),n.updateLinks=[`userSet`,`never`,`always`][r>>8&3],n}},154:{},155:{},156:{f:function(e,t){var n={};return n.Hidden=e.read_shift(4),n.iTabID=e.read_shift(4),n.strRelID=Dr(e,t-8),n.name=pr(e),n}},157:{},158:{},159:{T:1,f:function(e){return[e.read_shift(4),e.read_shift(4)]}},160:{T:-1},161:{T:1,f:Mr},162:{T:-1},163:{T:1},164:{T:-1},165:{T:1},166:{T:-1},167:{},168:{},169:{},170:{},171:{},172:{T:1},173:{T:-1},174:{},175:{},176:{f:Ut},177:{T:1},178:{T:-1},179:{T:1},180:{T:-1},181:{T:1},182:{T:-1},183:{T:1},184:{T:-1},185:{T:1},186:{T:-1},187:{T:1},188:{T:-1},189:{T:1},190:{T:-1},191:{T:1},192:{T:-1},193:{T:1},194:{T:-1},195:{T:1},196:{T:-1},197:{T:1},198:{T:-1},199:{T:1},200:{T:-1},201:{T:1},202:{T:-1},203:{T:1},204:{T:-1},205:{T:1},206:{T:-1},207:{T:1},208:{T:-1},209:{T:1},210:{T:-1},211:{T:1},212:{T:-1},213:{T:1},214:{T:-1},215:{T:1},216:{T:-1},217:{T:1},218:{T:-1},219:{T:1},220:{T:-1},221:{T:1},222:{T:-1},223:{T:1},224:{T:-1},225:{T:1},226:{T:-1},227:{T:1},228:{T:-1},229:{T:1},230:{T:-1},231:{T:1},232:{T:-1},233:{T:1},234:{T:-1},235:{T:1},236:{T:-1},237:{T:1},238:{T:-1},239:{T:1},240:{T:-1},241:{T:1},242:{T:-1},243:{T:1},244:{T:-1},245:{T:1},246:{T:-1},247:{T:1},248:{T:-1},249:{T:1},250:{T:-1},251:{T:1},252:{T:-1},253:{T:1},254:{T:-1},255:{T:1},256:{T:-1},257:{T:1},258:{T:-1},259:{T:1},260:{T:-1},261:{T:1},262:{T:-1},263:{T:1},264:{T:-1},265:{T:1},266:{T:-1},267:{T:1},268:{T:-1},269:{T:1},270:{T:-1},271:{T:1},272:{T:-1},273:{T:1},274:{T:-1},275:{T:1},276:{T:-1},277:{},278:{T:1},279:{T:-1},280:{T:1},281:{T:-1},282:{T:1},283:{T:1},284:{T:-1},285:{T:1},286:{T:-1},287:{T:1},288:{T:-1},289:{T:1},290:{T:-1},291:{T:1},292:{T:-1},293:{T:1},294:{T:-1},295:{T:1},296:{T:-1},297:{T:1},298:{T:-1},299:{T:1},300:{T:-1},301:{T:1},302:{T:-1},303:{T:1},304:{T:-1},305:{T:1},306:{T:-1},307:{T:1},308:{T:-1},309:{T:1},310:{T:-1},311:{T:1},312:{T:-1},313:{T:-1},314:{T:1},315:{T:-1},316:{T:1},317:{T:-1},318:{T:1},319:{T:-1},320:{T:1},321:{T:-1},322:{T:1},323:{T:-1},324:{T:1},325:{T:-1},326:{T:1},327:{T:-1},328:{T:1},329:{T:-1},330:{T:1},331:{T:-1},332:{T:1},333:{T:-1},334:{T:1},335:{f:function(e,t){return{flags:e.read_shift(4),version:e.read_shift(4),name:pr(e)}}},336:{T:-1},337:{f:function(e){return e.l+=4,e.read_shift(4)!=0},T:1},338:{T:-1},339:{T:1},340:{T:-1},341:{T:1},342:{T:-1},343:{T:1},344:{T:-1},345:{T:1},346:{T:-1},347:{T:1},348:{T:-1},349:{T:1},350:{T:-1},351:{},352:{},353:{T:1},354:{T:-1},355:{f:Dr},357:{},358:{},359:{},360:{T:1},361:{},362:{f:ya},363:{},364:{},366:{},367:{},368:{},369:{},370:{},371:{},372:{T:1},373:{T:-1},374:{T:1},375:{T:-1},376:{T:1},377:{T:-1},378:{T:1},379:{T:-1},380:{T:1},381:{T:-1},382:{T:1},383:{T:-1},384:{T:1},385:{T:-1},386:{T:1},387:{T:-1},388:{T:1},389:{T:-1},390:{T:1},391:{T:-1},392:{T:1},393:{T:-1},394:{T:1},395:{T:-1},396:{},397:{},398:{},399:{},400:{},401:{T:1},403:{},404:{},405:{},406:{},407:{},408:{},409:{},410:{},411:{},412:{},413:{},414:{},415:{},416:{},417:{},418:{},419:{},420:{},421:{},422:{T:1},423:{T:1},424:{T:-1},425:{T:-1},426:{f:function(e,t,n){var r=e.l+t,i=jr(e),t=e.read_shift(1);return(i=[i])[2]=t,n.cellFormula?(n=Wc(e,r-e.l,n),i[1]=n):e.l=r,i}},427:{f:function(e,t,n){var r=e.l+t,t=[Mr(e,16)];return n.cellFormula&&(n=qc(e,r-e.l,n),t[1]=n),e.l=r,t}},428:{},429:{T:1},430:{T:-1},431:{T:1},432:{T:-1},433:{T:1},434:{T:-1},435:{T:1},436:{T:-1},437:{T:1},438:{T:-1},439:{T:1},440:{T:-1},441:{T:1},442:{T:-1},443:{T:1},444:{T:-1},445:{T:1},446:{T:-1},447:{T:1},448:{T:-1},449:{T:1},450:{T:-1},451:{T:1},452:{T:-1},453:{T:1},454:{T:-1},455:{T:1},456:{T:-1},457:{T:1},458:{T:-1},459:{T:1},460:{T:-1},461:{T:1},462:{T:-1},463:{T:1},464:{T:-1},465:{T:1},466:{T:-1},467:{T:1},468:{T:-1},469:{T:1},470:{T:-1},471:{},472:{},473:{T:1},474:{T:-1},475:{},476:{f:function(e){var t={};return Il.forEach(function(n){t[n]=Pr(e)}),t}},477:{},478:{},479:{T:1},480:{T:-1},481:{T:1},482:{T:-1},483:{T:1},484:{T:-1},485:{f:function(){}},486:{T:1},487:{T:-1},488:{T:1},489:{T:-1},490:{T:1},491:{T:-1},492:{T:1},493:{T:-1},494:{f:function(e,t){var n=e.l+t,r=Mr(e,16),i=wr(e),a=pr(e),o=pr(e),t=pr(e);return e.l=n,t={rfx:r,relId:i,loc:a,display:t},o&&(t.Tooltip=o),t}},495:{T:1},496:{T:-1},497:{T:1},498:{T:-1},499:{},500:{T:1},501:{T:-1},502:{T:1},503:{T:-1},504:{},505:{T:1},506:{T:-1},507:{},508:{T:1},509:{T:-1},510:{T:1},511:{T:-1},512:{},513:{},514:{T:1},515:{T:-1},516:{T:1},517:{T:-1},518:{T:1},519:{T:-1},520:{T:1},521:{T:-1},522:{},523:{},524:{},525:{},526:{},527:{},528:{T:1},529:{T:-1},530:{T:1},531:{T:-1},532:{T:1},533:{T:-1},534:{},535:{},536:{},537:{},538:{T:1},539:{T:-1},540:{T:1},541:{T:-1},542:{T:1},548:{},549:{},550:{f:Dr},551:{},552:{},553:{},554:{T:1},555:{T:-1},556:{T:1},557:{T:-1},558:{T:1},559:{T:-1},560:{T:1},561:{T:-1},562:{},564:{},565:{T:1},566:{T:-1},569:{T:1},570:{T:-1},572:{},573:{T:1},574:{T:-1},577:{},578:{},579:{},580:{},581:{},582:{},583:{},584:{},585:{},586:{},587:{},588:{T:-1},589:{},590:{T:1},591:{T:-1},592:{T:1},593:{T:-1},594:{T:1},595:{T:-1},596:{},597:{T:1},598:{T:-1},599:{T:1},600:{T:-1},601:{T:1},602:{T:-1},603:{T:1},604:{T:-1},605:{T:1},606:{T:-1},607:{},608:{T:1},609:{T:-1},610:{},611:{T:1},612:{T:-1},613:{T:1},614:{T:-1},615:{T:1},616:{T:-1},617:{T:1},618:{T:-1},619:{T:1},620:{T:-1},625:{},626:{T:1},627:{T:-1},628:{T:1},629:{T:-1},630:{T:1},631:{T:-1},632:{f:Ge},633:{T:1},634:{T:-1},635:{T:1,f:function(e){var t={};t.iauthor=e.read_shift(4);var n=Mr(e,16);return t.rfx=n.s,t.ref=rr(n.s),e.l+=16,t}},636:{T:-1},637:{f:gr},638:{T:1},639:{},640:{T:-1},641:{T:1},642:{T:-1},643:{T:1},644:{},645:{T:-1},646:{T:1},648:{T:1},649:{},650:{T:-1},651:{f:function(e,t){return e.l+=10,{name:pr(e)}}},652:{},653:{T:1},654:{T:-1},655:{T:1},656:{T:-1},657:{T:1},658:{T:-1},659:{},660:{T:1},661:{},662:{T:-1},663:{},664:{T:1},665:{},666:{T:-1},667:{},668:{},669:{},671:{T:1},672:{T:-1},673:{T:1},674:{T:-1},675:{},676:{},677:{},678:{},679:{},680:{},681:{},1024:{},1025:{},1026:{T:1},1027:{T:-1},1028:{T:1},1029:{T:-1},1030:{},1031:{T:1},1032:{T:-1},1033:{T:1},1034:{T:-1},1035:{},1036:{},1037:{},1038:{T:1},1039:{T:-1},1040:{},1041:{T:1},1042:{T:-1},1043:{},1044:{},1045:{},1046:{T:1},1047:{T:-1},1048:{T:1},1049:{T:-1},1050:{},1051:{T:1},1052:{T:1},1053:{f:function(){}},1054:{T:1},1055:{},1056:{T:1},1057:{T:-1},1058:{T:1},1059:{T:-1},1061:{},1062:{T:1},1063:{T:-1},1064:{T:1},1065:{T:-1},1066:{T:1},1067:{T:-1},1068:{T:1},1069:{T:-1},1070:{T:1},1071:{T:-1},1072:{T:1},1073:{T:-1},1075:{T:1},1076:{T:-1},1077:{T:1},1078:{T:-1},1079:{T:1},1080:{T:-1},1081:{T:1},1082:{T:-1},1083:{T:1},1084:{T:-1},1085:{},1086:{T:1},1087:{T:-1},1088:{T:1},1089:{T:-1},1090:{T:1},1091:{T:-1},1092:{T:1},1093:{T:-1},1094:{T:1},1095:{T:-1},1096:{},1097:{T:1},1098:{},1099:{T:-1},1100:{T:1},1101:{T:-1},1102:{},1103:{},1104:{},1105:{},1111:{},1112:{},1113:{T:1},1114:{T:-1},1115:{T:1},1116:{T:-1},1117:{},1118:{T:1},1119:{T:-1},1120:{T:1},1121:{T:-1},1122:{T:1},1123:{T:-1},1124:{T:1},1125:{T:-1},1126:{},1128:{T:1},1129:{T:-1},1130:{},1131:{T:1},1132:{T:-1},1133:{T:1},1134:{T:-1},1135:{T:1},1136:{T:-1},1137:{T:1},1138:{T:-1},1139:{T:1},1140:{T:-1},1141:{},1142:{T:1},1143:{T:-1},1144:{T:1},1145:{T:-1},1146:{},1147:{T:1},1148:{T:-1},1149:{T:1},1150:{T:-1},1152:{T:1},1153:{T:-1},1154:{T:-1},1155:{T:-1},1156:{T:-1},1157:{T:1},1158:{T:-1},1159:{T:1},1160:{T:-1},1161:{T:1},1162:{T:-1},1163:{T:1},1164:{T:-1},1165:{T:1},1166:{T:-1},1167:{T:1},1168:{T:-1},1169:{T:1},1170:{T:-1},1171:{},1172:{T:1},1173:{T:-1},1177:{},1178:{T:1},1180:{},1181:{},1182:{},2048:{T:1},2049:{T:-1},2050:{},2051:{T:1},2052:{T:-1},2053:{},2054:{},2055:{T:1},2056:{T:-1},2057:{T:1},2058:{T:-1},2060:{},2067:{},2068:{T:1},2069:{T:-1},2070:{},2071:{},2072:{T:1},2073:{T:-1},2075:{},2076:{},2077:{T:1},2078:{T:-1},2079:{},2080:{T:1},2081:{T:-1},2082:{},2083:{T:1},2084:{T:-1},2085:{T:1},2086:{T:-1},2087:{T:1},2088:{T:-1},2089:{T:1},2090:{T:-1},2091:{},2092:{},2093:{T:1},2094:{T:-1},2095:{},2096:{T:1},2097:{T:-1},2098:{T:1},2099:{T:-1},2100:{T:1},2101:{T:-1},2102:{},2103:{T:1},2104:{T:-1},2105:{},2106:{T:1},2107:{T:-1},2108:{},2109:{T:1},2110:{T:-1},2111:{T:1},2112:{T:-1},2113:{T:1},2114:{T:-1},2115:{},2116:{},2117:{},2118:{T:1},2119:{T:-1},2120:{},2121:{T:1},2122:{T:-1},2123:{T:1},2124:{T:-1},2125:{},2126:{T:1},2127:{T:-1},2128:{},2129:{T:1},2130:{T:-1},2131:{T:1},2132:{T:-1},2133:{T:1},2134:{},2135:{},2136:{},2137:{T:1},2138:{T:-1},2139:{T:1},2140:{T:-1},2141:{},3072:{},3073:{},4096:{T:1},4097:{T:-1},5002:{T:1},5003:{T:-1},5081:{T:1},5082:{T:-1},5083:{},5084:{T:1},5085:{T:-1},5086:{T:1},5087:{T:-1},5088:{},5089:{},5090:{},5092:{T:1},5093:{T:-1},5094:{},5095:{T:1},5096:{T:-1},5097:{},5099:{},65535:{n:``}},zu={6:{f:Vc},10:{f:Fi},12:{f:Ri},13:{f:Ri},14:{f:Ii},15:{f:Ii},16:{f:Pr},17:{f:Ii},18:{f:Ii},19:{f:Ri},20:{f:ha},21:{f:ha},23:{f:ya},24:{f:va},25:{f:Ii},26:{},27:{},28:{f:function(e,t,n){return function(e,t){if(!(t.biff<8)){var n=e.read_shift(2),r=e.read_shift(2),i=e.read_shift(2),a=e.read_shift(2),o=Gi(e,0,t);return t.biff<8&&e.read_shift(1),[{r:n,c:r},o,a,i]}}(e,n)}},29:{},34:{f:Ii},35:{f:ga},38:{f:Pr},39:{f:Pr},40:{f:Pr},41:{f:Pr},42:{f:Ii},43:{f:Ii},47:{f:function(e,t,n){var r={Type:8<=n.biff?e.read_shift(2):0};return r.Type?ts(e,t-2,r):(t=e,n.biff,e=n,n=r,t={key:Ri(t),verificationBytes:Ri(t)},e.password&&(t.verifier=Jo(e.password)),n.valid=t.verificationBytes===t.verifier,n.valid&&(n.insitu=es(e.password))),r}},49:{f:function(e,t,n){var r={dyHeight:e.read_shift(2),fl:e.read_shift(2)};switch(n&&n.biff||8){case 2:break;case 3:case 4:e.l+=2;break;default:e.l+=10}return r.name=Hi(e,0,n),r}},51:{f:Ri},60:{},61:{f:function(e){return{Pos:[e.read_shift(2),e.read_shift(2)],Dim:[e.read_shift(2),e.read_shift(2)],Flags:e.read_shift(2),CurTab:e.read_shift(2),FirstTab:e.read_shift(2),Selected:e.read_shift(2),TabRatio:e.read_shift(2)}}},64:{f:Ii},65:{f:function(){}},66:{f:Ri},77:{},80:{},81:{},82:{},85:{f:Ri},89:{},90:{},91:{},92:{f:function(e,t,n){if(n.enc)return e.l+=t,``;var r=e.l,n=Gi(e,0,n);return e.read_shift(t+r-e.l),n}},93:{f:function(e,t,n){return n&&n.biff<8?function(e,t,n){e.l+=4;var r=e.read_shift(2),i=e.read_shift(2),a=e.read_shift(2);e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=6,t-=36;var o=[];return o.push((xa[r]||Un)(e,t,n)),{cmo:[i,r,a],ft:o}}(e,t,n):{cmo:n=ia(e),ft:function(e,t){for(var n=e.l+t,r=[];e.l>2&1,t-=6,o.data=(r=e,o.fStyle,i=n,a={},t=r.read_shift(4),e=r.read_shift(4),n=r.read_shift(4),r=r.read_shift(2),a.patternType=J[n>>26],i.cellStyles&&(a.alc=7&t,a.fWrap=t>>3&1,a.alcV=t>>4&7,a.fJustLast=t>>7&1,a.trot=t>>8&255,a.cIndent=t>>16&15,a.fShrinkToFit=t>>20&1,a.iReadOrder=t>>22&2,a.fAtrNum=t>>26&1,a.fAtrFnt=t>>27&1,a.fAtrAlc=t>>28&1,a.fAtrBdr=t>>29&1,a.fAtrPat=t>>30&1,a.fAtrProt=t>>31&1,a.dgLeft=15&e,a.dgRight=e>>4&15,a.dgTop=e>>8&15,a.dgBottom=e>>12&15,a.icvLeft=e>>16&127,a.icvRight=e>>23&127,a.grbitDiag=e>>30&3,a.icvTop=127&n,a.icvBottom=n>>7&127,a.icvDiag=n>>14&127,a.dgDiag=n>>21&15,a.icvFore=127&r,a.icvBack=r>>7&127,a.fsxButton=r>>14&1),a),o}},225:{f:function(e,t){return t===0||e.read_shift(2),1200}},226:{f:Fi},227:{},229:{f:function(e,t){for(var n=[],r=e.read_shift(2);r--;)n.push(ea(e));return n}},233:{},235:{},236:{},237:{},239:{},240:{},241:{},242:{},244:{},245:{},246:{},247:{},248:{},249:{},251:{},252:{f:function(e,t){for(var n=e.l+t,t=e.read_shift(4),i=e.read_shift(4),a=[],o=0;o!=i&&e.l`+l.t+``,l.r=l.t),r=t,l}(e));return a.Count=t,a.Unique=i,a}},253:{f:function(e){var t=Zi(e);return t.isst=e.read_shift(4),t}},255:{f:function(e,t){var n={};return n.dsst=e.read_shift(2),e.l+=t-2,n}},256:{},259:{},290:{},311:{},312:{},315:{},317:{f:Bi},318:{},319:{},320:{},330:{},331:{},333:{},334:{},335:{},336:{},337:{},338:{},339:{},340:{},351:{},352:{f:Ii},353:{f:Fi},401:{},402:{},403:{},404:{},405:{},406:{},407:{},408:{},425:{},426:{},427:{},428:{},429:{},430:{f:function(e,t,n){var r=e.l+t,i=e.read_shift(2),t=e.read_shift(2);if((n.sbcch=t)==1025||t==14849)return[t,i];if(t<1||255e.l;)a.push(Wi(e));return[t,i,n,a]}},431:{f:Ii},432:{},433:{},434:{},437:{},438:{f:function(e,t,n){var r=e.l,i=``;try{e.l+=4;var a=(n.lastobj||{cmo:[0,0]}).cmo[1];[0,5,7,11,12,14].indexOf(a)==-1?e.l+=6:function(e){e.read_shift(1),e.l++,e.read_shift(2),e.l+=2}(e);var o=e.read_shift(2);e.read_shift(2),Ri(e),a=e.read_shift(2),e.l+=a;for(var s=1;s=(c?o:2*o))break}if(i.length!==o&&i.length!==2*o)throw Error(`cchText: `+o+` != `+i.length);return e.l=r+t,{t:i}}catch{return e.l=r+t,{t:i}}}},439:{f:Ii},440:{f:function(e,t){var n=ea(e);return e.l+=16,[n,function(e,t){var n=e.l+t;if((c=e.read_shift(4))!==2)throw Error(`Unrecognized streamVersion: `+c);t=e.read_shift(2),e.l+=2;var r,i,a,o,s,c=``;16&t&&(r=Y(e,e.l)),128&t&&(i=Y(e,e.l)),(257&t)==257&&(a=Y(e,e.l)),(257&t)==1&&(l=qi(e,e.l)),8&t&&(c=Y(e,e.l)),32&t&&(o=e.read_shift(16)),64&t&&(s=bi(e)),e.l=n;var l=i||a||l||``;return l&&c&&(l+=`#`+c),l||=`#`+c,l={Target:l=2&t&&l.charAt(0)==`/`&&l.charAt(1)!=`/`?`file://`+l:l},o&&(l.guid=o),s&&(l.time=s),r&&(l.Tooltip=r),l}(e,t-24)]}},441:{},442:{f:Wi},443:{},444:{f:Ri},445:{},446:{},448:{f:Fi},449:{f:function(e){return e.read_shift(2),e.read_shift(4)},r:2},450:{f:Fi},512:{f:fa},513:{f:wa},515:{f:function(e,t,n){return n.biffguess&&n.biff==2&&(n.biff=5),n=Zi(e),e=Pr(e),n.val=e,n}},516:{f:function(e,t,n){return n.biffguess&&n.biff==2&&(n.biff=5),e.l,t=Zi(e),n.biff==2&&e.l++,n=Wi(e,e.l,n),t.val=n,t}},517:{f:ma},519:{f:Ea},520:{f:function(e){var t={};t.r=e.read_shift(2),t.c=e.read_shift(2),t.cnt=e.read_shift(2)-t.c;var n=e.read_shift(2);e.l+=4;var r=e.read_shift(1);return e.l+=3,7&r&&(t.level=7&r),32&r&&(t.hidden=!0),64&r&&(t.hpt=n/20),t}},523:{},545:{f:ba},549:{f:ua},566:{},574:{f:function(e,t,n){return n&&2<=n.biff&&n.biff<5?{}:{RTL:64&e.read_shift(2)}}},638:{f:function(e){var t=e.read_shift(2),n=e.read_shift(2),e=$i(e);return{r:t,c:n,ixfe:e[0],rknum:e[1]}}},659:{},1048:{},1054:{f:function(e,t,n){return[e.read_shift(2),Gi(e,0,n)]}},1084:{},1212:{f:function(e,t,n){var r=na(e);e.l++;var i=e.read_shift(1);return[function(e,t,n){var r,i=e.l+t,a=e.read_shift(2),o=Ic(e,a,n);return a==65535?[[],Un(e,t-2)]:(t!==a+2&&(r=Fc(e,i-a-2,o,n)),[o,r])}(e,t-=8,n),i,r]}},2048:{f:function(e,t){return e.read_shift(2),[ea(e),e.read_shift((t-10)/2,`dbcs-cont`).replace(A,``)]}},2049:{},2050:{},2051:{},2052:{},2053:{},2054:{},2055:{},2056:{},2057:{f:sa},2058:{},2059:{},2060:{},2061:{},2062:{},2063:{},2064:{},2066:{},2067:{},2128:{},2129:{},2130:{},2131:{},2132:{},2133:{},2134:{},2135:{},2136:{},2137:{},2138:{},2146:{},2147:{r:12},2148:{},2149:{},2150:{},2151:{f:Fi},2152:{},2154:{},2155:{},2156:{},2161:{},2162:{},2164:{},2165:{},2166:{},2167:{},2168:{},2169:{},2170:{},2171:{},2172:{f:function(e){e.l+=2;var t={cxfs:0,crc:0};return t.cxfs=e.read_shift(2),t.crc=e.read_shift(4),t},r:12},2173:{f:function(e,t){e.l,e.l+=2,t=e.read_shift(2),e.l+=2;for(var n=e.read_shift(2),r=[];0s.l?s.slice(0,s.l):s).l??(s.l=s.length),s))})}function Ku(e,t){for(var n=0;n=m){if(t.WTF)throw Error(`Range `+(s[`!ref`]||`A1`)+` exceeds format limit A1:IV16384`);p.e.c=Math.min(p.e.c,255),p.e.r=Math.min(p.e.c,m-1)}Bu(a,2057,ca(0,16,t)),Bu(a,13,zi(1)),Bu(a,12,zi(100)),Bu(a,15,Li(!0)),Bu(a,17,Li(!1)),Bu(a,16,Fr(.001)),Bu(a,95,Li(!0)),Bu(a,42,Li(!1)),Bu(a,43,Li(!1)),Bu(a,130,zi(1)),Bu(a,128,(n=[0,0],(e=Wn(8)).write_shift(4,0),e.write_shift(2,n[0]?n[0]+1:0),e.write_shift(2,n[1]?n[1]+1:0),e)),Bu(a,131,Li(!1)),Bu(a,132,Li(!1)),d&&qu(a,s[`!cols`]),Bu(a,512,(m=p,(n=Wn(2*(e=(n=t).biff!=8&&n.biff?2:4)+6)).write_shift(e,m.s.r),n.write_shift(e,m.e.r+1),n.write_shift(2,m.s.c),n.write_shift(2,m.e.c+1),n.write_shift(2,0),n)),d&&(s[`!links`]=[]);for(var h=p.s.r;h<=p.e.r;++h){i=$n(h);for(var g=p.s.c;g<=p.e.c;++g){h===p.s.r&&(f[g]=tr(g)),r=f[g]+i;var _=u?(s[h]||[])[g]:s[r];_&&(Ju(a,_,h,g,t),d&&_.l&&s[`!links`].push([r,_.l]))}}var v,y,o=l.CodeName||l.name||o;return d&&Bu(a,574,(c=(c.Views||[])[0],y=Wn(18),v=1718,c&&c.RTL&&(v|=64),y.write_shift(2,v),y.write_shift(4,0),y.write_shift(4,64),y.write_shift(4,0),y.write_shift(4,0),y)),d&&(s[`!merges`]||[]).length&&Bu(a,229,function(e){var t=Wn(2+8*e.length);t.write_shift(2,e.length);for(var n=0;n/g,``)).match(/`);for(var a,t=e.match(/<\/table/i),o=i.index,s=t&&t.index||e.length,c=nt(e.slice(o,s),/(:?]*>)/i,``),l=-1,u=0,d={s:{r:1e7,c:1e7},e:{r:0,c:0}},f=[],o=0;o/i),s=0;s`));)v=v.slice(y+1);for(var b=0;b`))),C=S.colspan?+S.colspan:1;(1<(a=+S.rowspan)||1l&&(d.s.r=l),d.e.ru&&(d.s.c=u),d.e.cn||i[p].s.c>o||i[p].e.r`+l+``:c&&(u[`data-t`]=c&&c.t||`z`,c.v!=null&&(u[`data-v`]=c.v),c.z!=null&&(u[`data-z`]=c.z),c.l&&(c.l.Target||`#`).charAt(0)!=`#`&&(l=``+l+``)),u.id=(r.id||`sjs`)+`-`+s,a.push(tn(`td`,l,u)))}return``+a.join(``)+``}var ed=`SheetJS Table Export`,td=``;function nd(e,t,n){return[].join(``)+``}function rd(e,t){var n=t||{},r=n.header==null?ed:n.header,t=n.footer==null?td:n.footer,i=[r],a=ir(e[`!ref`]);n.dense=Array.isArray(e),i.push(nd(0,0,n));for(var o=a.s.r;o<=a.e.r;++o)i.push($u(e,a,o,n));return i.push(`
`+t),i.join(``)}function id(e,t,n){var r=n||{};g!=null&&(r.dense=g);var i=0,a=0;r.origin!=null&&(typeof r.origin==`number`?i=r.origin:(i=(n=typeof r.origin==`string`?nr(r.origin):r.origin).r,a=n.c));var o=t.getElementsByTagName(`tr`),s=Math.min(r.sheetRows||1e7,o.length),c={s:{r:0,c:0},e:{r:i,c:a}};e[`!ref`]&&(t=ir(e[`!ref`]),c.s.r=Math.min(c.s.r,t.s.r),c.s.c=Math.min(c.s.c,t.s.c),c.e.r=Math.max(c.e.r,t.e.r),c.e.c=Math.max(c.e.c,t.e.c),i==-1&&(c.e.r=i=t.e.r+1));var l,u,d=[],f=0,p=e[`!rows`]||=[],m=0,h=0,_=0,v=0;for(e[`!cols`]||=[];m/gm,``).replace(//gm,``);o=an.exec(c);)switch(o[3]=o[3].replace(/_.*$/,``)){case`table`:case`工作表`:o[1]===`/`?(C.e.c>=C.s.c&&C.e.r>=C.s.r?h[`!ref`]=ar(C):h[`!ref`]=`A1:A1`,0C.e.c&&(C.e.c=S),SC.e.r&&(C.e.r=H),F=[],I={},s={t:(_=bt(o[0],!1)).数据类型||_[`value-type`],v:null},n.cellFormula)if(_.formula&&=Et(_.formula),_[`number-matrix-columns-spanned`]&&_[`number-matrix-rows-spanned`]&&(D={s:{r:x,c:S},e:{r:x+(parseInt(_[`number-matrix-rows-spanned`],10)||0)-1,c:S+(parseInt(_[`number-matrix-columns-spanned`],10)||0)-1}},s.F=ar(D),j.push([D,s.F])),_.formula)s.f=Zc(_.formula);else for(V=0;V=j[V][0].s.r&&x<=j[V][0].e.r&&S>=j[V][0].s.c&&S<=j[V][0].e.c&&(s.F=j[V][1]);switch((_[`number-columns-spanned`]||_[`number-rows-spanned`])&&(D={s:{r:x,c:S},e:{r:x+(parseInt(_[`number-rows-spanned`],10)||0)-1,c:S+(parseInt(_[`number-columns-spanned`],10)||0)-1}},E.push(D)),_[`number-columns-repeated`]&&(A=parseInt(_[`number-columns-repeated`],10)),s.t){case`boolean`:s.t=`b`,s.v=It(_[`boolean-value`]);break;case`float`:case`percentage`:case`currency`:s.t=`n`,s.v=parseFloat(_.value);break;case`date`:s.t=`d`,s.v=Je(_[`date-value`]),n.cellDates||(s.t=`n`,s.v=Be(s.v)),s.z=`m/d/yy`;break;case`time`:s.t=`n`,s.v=function(e){var t=0,n=0,r=!1,i=e.match(/P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/);if(!i)throw Error(`|`+e+`| is not an ISO8601 Duration`);for(var a=1;a!=i.length;++a)if(i[a]){switch(n=1,3`)break;if(o[1]===`/`)switch(l[l.length-1][0]){case`number-style`:case`date-style`:case`time-style`:d+=c.slice(f,o.index)}else f=o.index+o[0].length;break;case`named-range`:P=Qc((i=bt(o[0],!1))[`cell-range-address`]);var W={Name:i.name,Ref:P[0]+`!`+P[1]};B&&(W.Sheet=m.length),M.Names.push(W);break;case`text-content`:case`text-properties`:case`embedded-text`:break;case`body`:case`电子表格`:case`forms`:case`table-column`:case`table-header-rows`:case`table-rows`:case`table-column-group`:case`table-header-columns`:case`table-columns`:case`null-date`:case`graphic-properties`:case`calculation-settings`:case`named-expressions`:case`label-range`:case`label-ranges`:case`named-expression`:case`sort`:case`sort-by`:case`sort-groups`:case`tab`:case`line-break`:case`span`:break;case`p`:case`文本串`:if(-1<[`master-styles`].indexOf(l[l.length-1][0]))break;o[1]!==`/`||_&&_[`string-value`]?(bt(o[0],!1),y=o.index+o[0].length):(W=(W=c.slice(y,o.index)).replace(/[\t\r\n]/g,` `).trim().replace(/ +/g,` `).replace(//g,` `).replace(//g,function(e,t){return Array(parseInt(t,10)+1).join(` `)}).replace(/]*\/>/g,` `).replace(//g,` +`),W=[Et(W.replace(/<[^>]*>/g,``))],v=(0`,``,``,``,``,``,``,``].join(``),t=``+e+``;return function(){return mt+t}}(),fd=function(){function e(e,n,r){var i=[];i.push(` +`);var a=0,o=0,s=ir(e[`!ref`]||`A1`),c=e[`!merges`]||[],l=0,u=Array.isArray(e);if(e[`!cols`])for(o=0;o<=s.e.c;++o)i.push(` +`);for(var d=``,f=e[`!rows`]||[],a=0;a +`);for(;a<=s.e.r;++a){for(d=f[a]?` table:style-name="ro`+f[a].ods+`"`:``,i.push(` +`),o=0;oo||c[l].s.r>a||c[l].e.c +`);else{var g=rr({r:a,c:o}),_=u?(e[a]||[])[o]:e[g];if(_&&_.f&&(m[`table:formula`]=kt((`of:=`+_.f.replace(mc,`$1[.$2$3$4$5]`).replace(/\]:\[/g,`:`)).replace(/;/g,`|`).replace(/,/g,`;`)),_.F&&_.F.slice(0,g.length)==g&&(v=ir(_.F),m[`table:number-matrix-columns-spanned`]=v.e.c-v.s.c+1,m[`table:number-matrix-rows-spanned`]=v.e.r-v.s.r+1)),_){switch(_.t){case`b`:h=_.v?`TRUE`:`FALSE`,m[`office:value-type`]=`boolean`,m[`office:boolean-value`]=_.v?`true`:`false`;break;case`n`:h=_.w||String(_.v||0),m[`office:value-type`]=`float`,m[`office:value`]=_.v||0;break;case`s`:case`str`:h=_.v==null?``:_.v,m[`office:value-type`]=`string`;break;case`d`:h=_.w||Je(_.v).toISOString(),m[`office:value-type`]=`date`,m[`office:date-value`]=Je(_.v).toISOString(),m[`table:style-name`]=`ce1`;break;default:i.push(t);continue}var v,g=kt(h).replace(/ +/g,function(e){return``}).replace(/\t/g,``).replace(/\n/g,``).replace(/^ /,``).replace(/ $/,``);_.l&&_.l.Target&&(g=tn(`text:a`,g,{"xlink:href":(v=(v=(v=_.l.Target).charAt(0)==`#`?`#`+v.slice(1).replace(/\./,`!`):v).charAt(0)!=`#`&&!v.match(/^\w+:/)?`../`+v:v).replace(/&/g,`&`)})),i.push(` `+tn(`table:table-cell`,tn(`text:p`,g,{}),m)+` +`)}else i.push(t)}}i.push(` +`)}return i.push(` +`),i.join(``)}var t=` +`;return function(t,n){var r=[mt],i=en({"xmlns:office":`urn:oasis:names:tc:opendocument:xmlns:office:1.0`,"xmlns:table":`urn:oasis:names:tc:opendocument:xmlns:table:1.0`,"xmlns:style":`urn:oasis:names:tc:opendocument:xmlns:style:1.0`,"xmlns:text":`urn:oasis:names:tc:opendocument:xmlns:text:1.0`,"xmlns:draw":`urn:oasis:names:tc:opendocument:xmlns:drawing:1.0`,"xmlns:fo":`urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0`,"xmlns:xlink":`http://www.w3.org/1999/xlink`,"xmlns:dc":`http://purl.org/dc/elements/1.1/`,"xmlns:meta":`urn:oasis:names:tc:opendocument:xmlns:meta:1.0`,"xmlns:number":`urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0`,"xmlns:presentation":`urn:oasis:names:tc:opendocument:xmlns:presentation:1.0`,"xmlns:svg":`urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0`,"xmlns:chart":`urn:oasis:names:tc:opendocument:xmlns:chart:1.0`,"xmlns:dr3d":`urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0`,"xmlns:math":`http://www.w3.org/1998/Math/MathML`,"xmlns:form":`urn:oasis:names:tc:opendocument:xmlns:form:1.0`,"xmlns:script":`urn:oasis:names:tc:opendocument:xmlns:script:1.0`,"xmlns:ooo":`http://openoffice.org/2004/office`,"xmlns:ooow":`http://openoffice.org/2004/writer`,"xmlns:oooc":`http://openoffice.org/2004/calc`,"xmlns:dom":`http://www.w3.org/2001/xml-events`,"xmlns:xforms":`http://www.w3.org/2002/xforms`,"xmlns:xsd":`http://www.w3.org/2001/XMLSchema`,"xmlns:xsi":`http://www.w3.org/2001/XMLSchema-instance`,"xmlns:sheet":`urn:oasis:names:tc:opendocument:sh33tjs:1.0`,"xmlns:rpt":`http://openoffice.org/2005/report`,"xmlns:of":`urn:oasis:names:tc:opendocument:xmlns:of:1.2`,"xmlns:xhtml":`http://www.w3.org/1999/xhtml`,"xmlns:grddl":`http://www.w3.org/2003/g/data-view#`,"xmlns:tableooo":`http://openoffice.org/2009/table`,"xmlns:drawooo":`http://openoffice.org/2010/draw`,"xmlns:calcext":`urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0`,"xmlns:loext":`urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0`,"xmlns:field":`urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0`,"xmlns:formx":`urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0`,"xmlns:css3t":`http://www.w3.org/TR/css3-text/`,"office:version":`1.2`}),a=en({"xmlns:config":`urn:oasis:names:tc:opendocument:xmlns:config:1.0`,"office:mimetype":`application/vnd.oasis.opendocument.spreadsheet`});n.bookType==`fods`?(r.push(` +`),r.push(oi().replace(/office:document-meta/g,`office:meta`))):r.push(` +`),function(e,t){e.push(` +`),e.push(` +`),e.push(` +`),e.push(` / +`),e.push(` +`),e.push(` / +`),e.push(` +`),e.push(` +`);var n=0;t.SheetNames.map(function(e){return t.Sheets[e]}).forEach(function(t){if(t&&t[`!cols`]){for(var r=0;r +`),e.push(` +`),e.push(` +`),++n}}});var r=0;t.SheetNames.map(function(e){return t.Sheets[e]}).forEach(function(t){if(t&&t[`!rows`])for(var n,i=0;i +`),e.push(` +`),e.push(` +`),++r)}),e.push(` +`),e.push(` +`),e.push(` +`),e.push(` +`),e.push(` +`)}(r,t),r.push(` +`),r.push(` +`);for(var o=0;o!=t.SheetNames.length;++o)r.push(e(t.Sheets[t.SheetNames[o]],t,o));return r.push(` +`),r.push(` +`),n.bookType==`fods`?r.push(``):r.push(``),r.join(``)}}();function pd(e,t){if(t.bookType==`fods`)return fd(e,t);var n=dt(),r=[],i=[];return ut(n,`mimetype`,`application/vnd.oasis.opendocument.spreadsheet`),ut(n,`content.xml`,fd(e,t)),r.push([`content.xml`,`text/xml`]),i.push([`content.xml`,`ContentFile`]),ut(n,`styles.xml`,dd(e,t)),r.push([`styles.xml`,`text/xml`]),i.push([`styles.xml`,`StylesFile`]),ut(n,`meta.xml`,mt+oi()),r.push([`meta.xml`,`text/xml`]),i.push([`meta.xml`,`MetadataFile`]),ut(n,`manifest.rdf`,function(e){var t=[mt];t.push(` +`);for(var n=0;n!=e.length;++n)t.push(ai(e[n][0],e[n][1])),t.push([` +`,` +`,` +`].join(``));return t.push(ai(``,`Document`,`pkg`)),t.push(``),t.join(``)}(i)),r.push([`manifest.rdf`,`application/rdf+xml`]),ut(n,`META-INF/manifest.xml`,function(e){var t=[mt];t.push(` +`),t.push(` +`);for(var n=0;n +`);return t.push(``),t.join(``)}(r)),n}function md(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function hd(e){return typeof TextDecoder<`u`?new TextDecoder().decode(e):Wt(D(e))}function gd(e){return typeof TextEncoder<`u`?new TextEncoder().encode(e):T(Gt(e))}function _d(e){var t=e.reduce(function(e,t){return e+t.length},0),n=new Uint8Array(t),r=0;return e.forEach(function(e){n.set(e,r),r+=e.length}),n}function vd(e){return 16843009*((e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135)>>>24}function yd(e,t){var n=t?t[0]:0,r=127&e[n];return 128<=e[n++]&&(r|=(127&e[n])<<7,e[n++]<128||(r|=(127&e[n])<<14,e[n++]<128||(r|=(127&e[n])<<21,e[n++]<128||(r+=(127&e[n])*2**28,++n,e[n++]<128||(r+=(127&e[n])*2**35,++n,e[n++]<128||(r+=(127&e[n])*2**42,++n,e[n++])))))),t&&(t[0]=n),r}function bd(e){var t=new Uint8Array(7);t[0]=127&e;var n=1;return 127>7&127,++n,e<=16383||(t[n-1]|=128,t[n]=e>>14&127,++n,e<=2097151||(t[n-1]|=128,t[n]=e>>21&127,++n,e<=268435455||(t[n-1]|=128,t[n]=e/256>>>21&127,++n,e<=34359738367||(t[n-1]|=128,t[n]=e/65536>>>21&127,++n,e<=4398046511103||(t[n-1]|=128,t[n]=e/16777216>>>21&127,++n)))))),t.slice(0,n)}function xd(e){var t=0,n=127&e[0];return 128<=e[t++]&&(n|=(127&e[1])<<7,e[t++]<128||(n|=(127&e[2])<<14,e[t++]<128||(n|=(127&e[3])<<21,e[+t]<128||(n|=(127&e[4])<<28)))),n}function Sd(e){for(var t=[],n=[0];n[0]>>0),t.push(a)}return t}function Ed(e){var t=[];return e.forEach(function(e){var n=[[],[{data:bd(e.id),type:0}],[]];e.merge!=null&&(n[3]=[{data:bd(+!!e.merge),type:0}]);var r=[];e.messages.forEach(function(e){r.push(e.data),e.meta[3]=[{type:0,data:bd(e.data.length)}],n[2].push({data:Cd(e.meta),type:2})}),e=Cd(n),t.push(bd(e.length)),t.push(e),r.forEach(function(e){return t.push(e)})}),_d(t)}function Dd(e){for(var t=[],n=0;n>2&7),o=(224&t[n[0]++])<<3,o|=t[n[0]++]):(s=1+(t[n[0]++]>>2),a==2?(o=t[n[0]]|t[n[0]+1]<<8,n[0]+=2):(o=(t[n[0]]|t[n[0]+1]<<8|t[n[0]+2]<<16|t[n[0]+3]<<24)>>>0,n[0]+=4)),i=[_d(i)],o==0)throw Error(`Invalid offset 0`);if(o>i[0].length)throw Error(`Invalid offset beyond length`);if(o<=s)for(i.push(i[0].slice(-o)),s-=o;s>=i[i.length-1].length;)i.push(i[i.length-1]),s-=i[i.length-1].length;i.push(i[0].slice(-o,-o+s))}else a=t[n[0]++]>>2,a<60?++a:(o=a-59,a=t[n[0]],1>>=0,a++,n[0]+=o),i.push(t.slice(n[0],n[0]+a)),n[0]+=a}if((e=_d(i)).length!=r)throw Error(`Unexpected length: ${e.length} != ${r}`);return e}(r,e.slice(n,n+i))),n+=i}if(n!==e.length)throw Error(`data is not a valid framed stream!`);return _d(t)}function Od(e){for(var t=[],n=0;n>8&255]))):r<=16777216?(o+=4,t.push(new Uint8Array([248,r-1&255,r-1>>8&255,r-1>>16&255]))):r<=4294967296&&(o+=5,t.push(new Uint8Array([252,r-1&255,r-1>>8&255,r-1>>16&255,r-1>>>24&255]))),t.push(e.slice(n,n+r)),o+=r,i[0]=0,i[1]=255&o,i[2]=o>>8&255,i[3]=o>>16&255,n+=r}return _d(t)}function kd(e,t,n){var r,i=md(e),a=i.getUint32(8,!0),o=12,s=-1,c=-1,l=NaN,u=NaN,d=new Date(2001,0,1);switch(1&a&&(l=function(e,t){for(var n=(127&e[t+15])<<7|e[t+14]>>1,r=1&e[t+14],i=t+13;t<=i;--i)r=256*r+e[i];return(128&e[t+15]?-r:r)*10**(n-6176)}(e,o),o+=16),2&a&&(u=i.getFloat64(o,!0),o+=8),4&a&&(d.setTime(d.getTime()+1e3*i.getFloat64(o,!0)),o+=8),8&a&&(c=i.getUint32(o,!0),o+=4),16&a&&(s=i.getUint32(o,!0),o+=4),e[1]){case 0:break;case 2:r={t:`n`,v:l};break;case 3:r={t:`s`,v:t[c]};break;case 5:r={t:`d`,v:d};break;case 6:r={t:`b`,v:0>7,e[t+14]|=(127&r)<<1;for(var a=0;1<=i;++a,i/=256)e[t+a]=255&i;e[t+15]|=0<=n?0:128}(n,i,e.v),a|=1,i+=16;break;case`b`:n[1]=6,r.setFloat64(i,+!!e.v,!0),a|=2,i+=8;break;case`s`:if(t.indexOf(e.v)==-1)throw Error(`Value ${e.v} missing from SST!`);n[1]=3,r.setUint32(i,t.indexOf(e.v),!0),a|=8,i+=4;break;default:throw`unsupported cell type `+e.t}return r.setUint32(8,a,!0),n.slice(0,i)}function jd(e,t){var n=new Uint8Array(32),r=md(n),i=12,a=0;switch(n[0]=3,e.t){case`n`:n[2]=2,r.setFloat64(i,e.v,!0),a|=32,i+=8;break;case`b`:n[2]=6,r.setFloat64(i,+!!e.v,!0),a|=32,i+=8;break;case`s`:if(t.indexOf(e.v)==-1)throw Error(`Value ${e.v} missing from SST!`);n[2]=3,r.setUint32(i,t.indexOf(e.v),!0),a|=16,i+=4;break;default:throw`unsupported cell type `+e.t}return r.setUint32(4,a,!0),n.slice(0,i)}function Md(e,t,n){switch(e[0]){case 0:case 1:case 2:case 3:return function(e,t,n,r){var i,a=md(e),o=a.getUint32(4,!0),s=(1>>0;switch(n){case 1:r[a]=hd(i[3][0].data);break;case 8:var o=Sd(e[Nd(i[9][0].data)][0].data),s=e[Nd(o[1][0].data)][0],o=xd(s.meta[1][0].data);if(o!=2001)throw Error(`2000 unexpected reference to ${o}`);s=Sd(s.data),r[a]=s[3].map(function(e){return hd(e.data)}).join(``)}}),r}function Fd(e,t){var n=Sd(t.data),r=(t=n?.[7])!=null&&t[0]?+(0>>0):-1,t=wd(n[5],function(e){return function(e,t){var n,r,i,a=Sd(e),o=xd(a[1][0].data)>>>0,s=xd(a[2][0].data)>>>0,c=(e=(c=a[8])?.[0])?.data&&0>>0,data:t.reduce(function(e,t){return e[t.R]||(e[t.R]=[]),t.cells.forEach(function(n,r){if(e[t.R][r])throw Error(`Duplicate cell r=${t.R} c=${r}`);e[t.R][r]=n}),e},[])}}function Id(e,t){var n={"!ref":`A1`},r=e[Nd(Sd(t.data)[2][0].data)],t=xd(r[0].meta[1][0].data);if(t!=6001)throw Error(`6000 unexpected reference to ${t}`);return function(e,t,n){var r=Sd(t.data);if((t={s:{r:0,c:0},e:{r:0,c:0}}).e.r=(xd(r[6][0].data)>>>0)-1,t.e.r<0)throw Error(`Invalid row varint ${r[6][0].data}`);if(t.e.c=(xd(r[7][0].data)>>>0)-1,t.e.c<0)throw Error(`Invalid col varint ${r[7][0].data}`);n[`!ref`]=ar(t);var t=Sd(r[4][0].data),i=Pd(e,e[Nd(t[4][0].data)][0]),a=(r=t[17])!=null&&r[0]?Pd(e,e[Nd(t[17][0].data)][0]):[],r=Sd(t[3][0].data),o=0;if(r[1].forEach(function(t){var r=Sd(t.data),t=e[Nd(r[2][0].data)][0],r=xd(t.meta[1][0].data);if(r!=6002)throw Error(`6001 unexpected reference to ${r}`);t=Fd(0,t),t.data.forEach(function(e,t){e.forEach(function(e,r){r=rr({r:o+t,c:r}),e=Md(e,i,a),e&&(n[r]=e)})}),o+=t.nrows}),(r=t[13])!=null&&r[0]){if(r=e[Nd(t[13][0].data)][0],t=xd(r.meta[1][0].data),t!=6144)throw Error(`Expected merge type 6144, found ${t}`);n[`!merges`]=(r=Sd(r.data))?.[1].map(function(e){var t=Sd(e.data),e=md(Sd(t[1][0].data)[1][0].data),t=md(Sd(t[2][0].data)[1][0].data);return{s:{r:e.getUint16(0,!0),c:e.getUint16(2,!0)},e:{r:e.getUint16(0,!0)+t.getUint16(0,!0)-1,c:e.getUint16(2,!0)+t.getUint16(2,!0)-1}}})}}(e,r[0],n),n}function Ld(e,t){var n=vf(),r=Sd(t.data);if((t=r[2])!=null&&t[0])throw Error(`Keynote presentations are not supported`);if(wd(r[1],Nd).forEach(function(t){e[t].forEach(function(t){var r,i,a,o;xd(t.meta[1][0].data)==2&&(i=e,t=Sd((a=t).data),o={name:(a=t[1])!=null&&a[0]?hd(t[1][0].data):``,sheets:[]},wd(t[2],Nd).forEach(function(e){i[e].forEach(function(e){xd(e.meta[1][0].data)==6e3&&o.sheets.push(Id(i,e))})}),(r=o).sheets.forEach(function(e,t){yf(n,e,t==0?r.name:r.name+`_`+t,!0)}))})}),n.SheetNames.length==0)throw Error(`Empty NUMBERS file`);return n}function Rd(e){var t={},n=[];if(e.FullPaths.forEach(function(e){if(e.match(/\.iwpv2/))throw Error(`Unsupported password protection`)}),e.FileIndex.forEach(function(e){if(e.name.match(/\.iwa$/)){var r,i;try{r=Dd(e.content)}catch(t){return console.log(`?? `+e.content.length+` `+(t.message||t))}try{i=Td(r)}catch(e){return console.log(`## `+(e.message||e))}i.forEach(function(e){t[e.id]=e.messages,n.push(e.id)})}}),!n.length)throw Error(`File has no messages`);if((e=(e=(e=(e=t?.[1])?.[0])?.meta)?.[1])!=null&&e[0].data&&xd(t[1][0].meta[1][0].data)==1e4)throw Error(`Pages documents are not supported`);var r=(e=(e=(e=(e=t?.[1])?.[0])?.meta)?.[1])?.[0].data&&xd(t[1][0].meta[1][0].data)==1&&t[1][0];if(r||n.forEach(function(e){t[e].forEach(function(e){if(xd(e.meta[1][0].data)>>>0==1){if(r)throw Error(`Document has multiple roots`);r=e}})}),!r)throw Error(`Cannot find Document root`);return Ld(t,r)}function zd(e,t){if(!t||!t.numbers)throw Error("Must pass a `numbers` option -- check the README");var n=e.Sheets[e.SheetNames[0]];1]*r:id="([^"]*)"/)||[``,``])[1],m[`!id`][h].Target):`??`),p),p=ei(h),g=Gl(ct(e,h,!0),0,0,ti(ct(e,p,!0),h),0,g);break;case`macro`:v=t,a[r],v.slice(-4),g={"!type":`macro`};break;case`dialog`:v=t,a[r],v.slice(-4),g={"!type":`dialog`};break;default:throw Error(`Unrecognized sheet type `+s)}o[r]=g;var _=[];a&&a[r]&&Fe(a[r]).forEach(function(n){var i,o,s,l,u,d,f=``;if(a[r][n].Type==$r.CMNT){f=pt(a[r][n].Target,t);var p=pu(st(e,f,!0),f,c);if(!p||!p.length)return;ac(g,p,!1)}a[r][n].Type==$r.TCMNT&&(f=pt(a[r][n].Target,t),_=_.concat((i=st(e,f,!0),o=c,l=!(s=[]),u={},d=0,i.replace(_t,function(e,t){var n=bt(e);switch(xt(n[0])){case``:break;case``:u.t!=null&&s.push(u);break;case``:case``:u.t=i.slice(d,t).replace(/\r\n/g,` +`).replace(/\r/g,` +`);break;case``:l=!0;break;case``:l=!1;break;case``:case``:case``:break;case``:l=!1;break;default:if(!l&&o.WTF)throw Error(`unrecognized `+n[0]+` in threaded comments`)}return e}),s)))}),_&&_.length&&ac(g,_,!0,c.people||[])}catch(e){if(c.WTF)throw e}var v,h}function Gd(e){return e.charAt(0)==`/`?e.slice(1):e}function Kd(e,t){if(Ee(),Vd(t||={}),at(e,`META-INF/manifest.xml`)||at(e,`objectdata.xml`))return ld(e,t);if(at(e,`Index/Document.iwa`)){if(typeof Uint8Array>`u`)throw Error(`NUMBERS file parsing requires Uint8Array support`);if(e.FileIndex)return Rd(e);var n=Me.utils.cfb_new();return lt(e).forEach(function(t){ut(n,t,function e(t,n,r){if(!r)return it(ot(t,n));if(!n)return null;try{return e(t,n)}catch{return null}}(e,t))}),Rd(n)}if(!at(e,`[Content_Types].xml`))throw at(e,`index.xml.gz`)?Error(`Unsupported NUMBERS 08 file`):at(e,`index.xml`)?Error(`Unsupported NUMBERS 09 file`):Error(`Unsupported ZIP file`);var r,i,a=lt(e),o=function(e){var t=Zr();if(!e||!e.match)return t;var n={};if((e.match(_t)||[]).forEach(function(e){var r=bt(e);switch(r[0].replace(vt,`<`)){case`]*>([\\s\\S]*?)`));n&&0`:r=null;break;default:if(o.indexOf(``),l=c[0].slice(4),u=c[1];switch(l){case`lpstr`:case`bstr`:case`lpwstr`:n[r]=Et(u);break;case`bool`:n[r]=It(u);break;case`i1`:case`i2`:case`i4`:case`i8`:case`int`:case`uint`:n[r]=parseInt(u,10);break;case`r4`:case`r8`:case`decimal`:n[r]=parseFloat(u);break;case`filetime`:case`date`:n[r]=Je(u);break;case`cy`:case`error`:n[r]=Et(u);break;default:if(l.slice(-1)==`/`)break;t.WTF&&typeof console<`u`&&console.warn(`Unexpected`,o,l,c)}}else if(o.slice(0,2)!==``:break;case``:break;case``:case``:case``:break;case``:O=!1;break;default:if(!O&&E.WTF)throw Error(`unrecognized `+t[0]+` in threaded comments`)}return e}),D)),k&&=Ud(k,p.Sheets);var A=+!!st(e,`xl/worksheets/sheet.xml`,!0);e:for(b=0;b!=m.Worksheets;++b){var j=`sheet`;if(k&&k[b]?(v=`xl/`+k[b][1].replace(/[\/]?xl\//,``),at(e,v)||(v=k[b][1]),at(e,v)||(v=T.replace(/_rels\/.*$/,``)+k[b][1]),j=k[b][2]):v=(v=`xl/worksheets/sheet`+(b+1-A)+`.`+w).replace(/sheet0\./,`sheet.`),y=v.replace(/^(.*)(\/)([^\/]*)$/,`$1/_rels/$3.rels`),t&&t.sheets!=null)switch(typeof t.sheets){case`number`:if(b!=t.sheets)continue e;break;case`string`:if(m.SheetNames[b].toLowerCase()!=t.sheets.toLowerCase())continue e;break;default:if(Array.isArray&&Array.isArray(t.sheets)){for(var M=!1,N=0;N!=t.sheets.length;++N)typeof t.sheets[N]==`number`&&t.sheets[N]==b&&(M=1),typeof t.sheets[N]==`string`&&t.sheets[N].toLowerCase()==m.SheetNames[b].toLowerCase()&&(M=1);if(!M)continue e}}Wd(e,v,y,m.SheetNames[b],b,x,r,j,t,p,c,l)}return _={Directory:o,Workbook:p,Props:m,Custprops:g,Deps:h,Sheets:r,SheetNames:m.SheetNames,Strings:$c,Styles:l,Themes:c,SSF:Xe(V)},t&&t.bookFiles&&(e.files?(_.keys=a,_.files=e.files):(_.keys=[],_.files={},e.FullPaths.forEach(function(t,n){t=t.replace(/^Root Entry[\/]/,``),_.keys.push(t),_.files[t]=e.FileIndex[n]}))),t&&t.bookVBA&&(0/,`>`)];return e.forEach(function(e){var i=``;(e[1]||[]).forEach(function(a,o){var s;a.T?(a.a&&t.indexOf(a.a)==-1&&t.push(a.a),s={ref:e[0],id:`{54EE7951-7262-4200-6969-`+(`000000000000`+ n.tcid++).slice(-12)+`}`},o==0?i=s.id:s.parentId=i,a.ID=s.id,a.a&&(s.personId=`{54EE7950-7262-4200-6969-`+(`000000000000`+t.indexOf(a.a)).slice(-12)+`}`),r.push(tn(`threadedComment`,$t(`text`,a.t||``),s))):delete a.ID})}),r.push(``),r.join(``)}(f,d,t)),i.threadedcomments.push(m),ri(g,-1,`../threadedComments/threadedComment`+s+`.`+n,$r.TCMNT)),ut(a,m=`xl/comments`+s+`.`+n,oc(f)),i.comments.push(m),ri(g,-1,`../comments`+s+`.`+n,$r.CMNT),p=!0),_[`!legacy`]&&p&&ut(a,`xl/drawings/vmlDrawing`+s+`.vml`,ic(s,_[`!comments`])),delete _[`!comments`],delete _[`!legacy`]),g[`!id`].rId1&&ut(a,ei(o),ni(g))}return t.Strings!=null&&0/,`>`)],r.forEach(function(e,t){u.push(tn(`person`,null,{displayName:e,id:`{54EE7950-7262-4200-6969-`+(`000000000000`+t).slice(-12)+`}`,userId:e,providerId:`None`}))}),u.push(``),u.join(``))),i.people.push(o),ri(t.wbrels,-1,`persons/person.xml`,$r.PEOPLE)),ut(a,`[Content_Types].xml`,Qr(i,t)),ut(a,`_rels/.rels`,ni(t.rels)),ut(a,`xl/_rels/workbook.xml.rels`,ni(t.wbrels)),delete t.revssf,delete t.ssf,a}function Xd(e,t){var n=``;switch((t||{}).type||`base64`){case`buffer`:return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case`base64`:n=b(e.slice(0,12));break;case`binary`:n=e;break;case`array`:return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];default:throw Error(`Unrecognized type `+(t&&t.type||`undefined`))}return[n.charCodeAt(0),n.charCodeAt(1),n.charCodeAt(2),n.charCodeAt(3),n.charCodeAt(4),n.charCodeAt(5),n.charCodeAt(6),n.charCodeAt(7)]}function Zd(e,t){var n=0;e:for(;n`u`||x||(r.type=`array`)),r.type==`string`&&(d=!0,r.type=`binary`,r.codepage=65001,l=(f=e).match(/[^\x00-\x7F]/)?Gt(f):f),r.type==`array`&&typeof Uint8Array<`u`&&e instanceof Uint8Array&&typeof ArrayBuffer<`u`){var f=new ArrayBuffer(3),f=new Uint8Array(f);if(f.foo=`bar`,!f.foo)return(r=Xe(r)).type=`array`,$d(O(l),r)}switch((i=Xd(l,r))[0]){case 208:if(i[1]===207&&i[2]===17&&i[3]===224&&i[4]===161&&i[5]===177&&i[6]===26&&i[7]===225)return s=Me.read(l,r),c=r,(Me.find(s,`EncryptedPackage`)?qd:Iu)(s,c);break;case 9:if(i[1]<=8)return Iu(l,r);break;case 60:return Cu(l,r);case 73:if(i[1]===73&&i[2]===42&&i[3]===0)throw Error(`TIFF Image File is not a spreadsheet`);if(i[1]===68)return function(e,t){var n=t||{},r=!!n.WTF;n.WTF=!0;try{var i=La.to_workbook(e,n);return n.WTF=r,i}catch(i){if(n.WTF=r,!i.message.match(/SYLK bad record ID/)&&r)throw i;return eo.to_workbook(e,t)}}(l,r);break;case 84:if(i[1]===65&&i[2]===66&&i[3]===76)return Ba.to_workbook(l,r);break;case 80:return i[1]===75&&i[2]<9&&i[3]<9?(o=c=l,(a=(a=r)||{}).type||(a.type=x&&Buffer.isBuffer(c)?`buffer`:`base64`),Kd(ft(o,a),a)):Qd(e,l,r,d);case 239:return i[3]===60?Cu(l,r):Qd(e,l,r,d);case 255:if(i[1]===254)return o=l,(a=r).type==`base64`&&(o=b(o)),o=n.utils.decode(1200,o.slice(2),`str`),a.type=`binary`,Zd(o,a);if(i[1]===0&&i[2]===2&&i[3]===0)return uo.to_workbook(l,r);break;case 0:if(i[1]===0&&(2<=i[2]&&i[3]===0||i[2]===0&&(i[3]===8||i[3]===9)))return uo.to_workbook(l,r);break;case 3:case 131:case 139:case 140:return ja.to_workbook(l,r);case 123:if(i[1]===92&&i[2]===114&&i[3]===116)return ns.to_workbook(l,r);break;case 10:case 13:case 32:return function(e,t){var n=``,r=Xd(e,t);switch(t.type){case`base64`:n=b(e);break;case`binary`:n=e;break;case`buffer`:n=e.toString(`binary`);break;case`array`:n=Ye(e);break;default:throw Error(`Unrecognized type `+t.type)}return r[0]==239&&r[1]==187&&r[2]==191&&(n=Wt(n)),t.type=`binary`,Zd(n,t)}(l,r);case 137:if(i[1]===80&&i[2]===78&&i[3]===71)throw Error(`PNG Image File is not a spreadsheet`)}return-1t)return t;throw Error(`Cannot find sheet # `+t)}if(typeof t!=`string`)throw Error(`Cannot find sheet |`+t+`|`);if(-1<(e=e.SheetNames.indexOf(t)))return e;throw Error(`Cannot find sheet name |`+t+`|`)}(e,t),e.Workbook.Sheets[t]||(e.Workbook.Sheets[t]={}),n){case 0:case 1:case 2:break;default:throw Error(`Bad sheet visibility setting `+n)}e.Workbook.Sheets[t].Hidden=n},cell_set_number_format:function(e,t){return e.z=t,e},cell_set_hyperlink:bf,cell_set_internal_link:function(e,t,n){return bf(e,`#`+t,n)},cell_add_comment:function(e,t,n){e.c||=[],e.c.push({t,a:n||`SheetJS`})},sheet_set_array_formula:function(e,t,n,r){for(var i=typeof t==`string`?or(t):t,a=typeof t==`string`?t:ar(t),o=i.s.r;o<=i.e.r;++o)for(var s=i.s.c;s<=i.e.c;++s){var c=_f(e,o,s);c.t=`n`,c.F=a,delete c.v,o==i.s.r&&s==i.s.c&&(c.f=n,r&&(c.D=!0))}return e},consts:{SHEET_VISIBLE:0,SHEET_HIDDEN:1,SHEET_VERY_HIDDEN:2}};function Sf(e){xf=e}var da={to_json:function(e,t){var n=xf({objectMode:!0});if(e==null||e[`!ref`]==null)return n.push(null),n;var r,i={t:`n`,v:0},a=0,o=1,s=[],c=``,l={s:{r:0,c:0},e:{r:0,c:0}},u=t||{},d=u.range==null?e[`!ref`]:u.range;switch(u.header===1?a=1:u.header===`A`?a=2:Array.isArray(u.header)&&(a=3),typeof d){case`string`:l=or(d);break;case`number`:(l=or(e[`!ref`])).s.r=d;break;default:l=d}0a.e.r)return s||(s=!0,n.push(``+i)),n.push(null);for(;o<=a.e.r;){n.push($u(e,a,o,r)),++o;break}},n},to_csv:function(e,t){var n=xf(),r=t??{};if(e==null||e[`!ref`]==null)return n.push(null),n;var i=or(e[`!ref`]),a=r.FS===void 0?`,`:r.FS,o=a.charCodeAt(0),s=r.RS===void 0?` +`:r.RS,c=s.charCodeAt(0),l=RegExp((a==`|`?`\\|`:a)+`+$`),u=``,d=[];r.dense=Array.isArray(e);for(var f=r.skipHidden&&e[`!cols`]||[],p=r.skipHidden&&e[`!rows`]||[],m=i.s.c;m<=i.e.c;++m)(f[m]||{}).hidden||(d[m]=tr(m));var h=i.s.r,g=!1,_=0;return n._read=function(){if(!g)return g=!0,n.push(``);for(;h<=i.e.r;)if(++h,!(p[h-1]||{}).hidden&&(u=pf(e,i,h-1,d,o,c,a,r),u!=null&&((u=r.strip?u.replace(l,``):u)||!1!==r.blankrows)))return n.push((_++?s:``)+u);return n.push(null)},n},set_readable:Sf},Cf=function(){function e(t,n,r){return this instanceof e?(this.tagName=t,this._attributes=n||{},this._children=r||[],this._prefix=``,this):new e(t,n,r)}return e.prototype.createElement=function(){return new e(arguments)},e.prototype.children=function(){return this._children},e.prototype.append=function(e){return this._children.push(e),this},e.prototype.prefix=function(e){return arguments.length==0?this._prefix:(this._prefix=e,this)},e.prototype.attr=function(e,t){if(t==null)return delete this._attributes[e],this;if(arguments.length==0)return this._attributes;if(typeof e==`string`&&arguments.length==1)return this._attributes.attr[e];if(typeof e==`object`&&arguments.length==1)for(var n in e)this._attributes[n]=e[n];else arguments.length==2&&typeof e==`string`&&(this._attributes[e]=t);return this},e.prototype.escapeAttributeValue=function(e){return`"`+e.replace(/\"/g,`"`)+`"`},e.prototype.toXml=function(e){var t=(e||=this)._prefix;if(t+=`<`+e.tagName,e._attributes)for(var n in e._attributes)t+=` `+n+`=`+this.escapeAttributeValue(``+e._attributes[n]);if(e._children&&0`;for(var r=0;r`}else t+=`/>`;return t},e}(),wf=function(e){var t,n=164,r={0:`General`,1:`0`,2:`0.00`,3:`#,##0`,4:`#,##0.00`,9:`0%`,10:`0.00%`,11:`0.00E+00`,12:`# ?/?`,13:`# ??/??`,14:`m/d/yy`,15:`d-mmm-yy`,16:`d-mmm`,17:`mmm-yy`,18:`h:mm AM/PM`,19:`h:mm:ss AM/PM`,20:`h:mm`,21:`h:mm:ss`,22:`m/d/yy h:mm`,37:`#,##0 ;(#,##0)`,38:`#,##0 ;[Red](#,##0)`,39:`#,##0.00;(#,##0.00)`,40:`#,##0.00;[Red](#,##0.00)`,45:`mm:ss`,46:`[h]:mm:ss`,47:`mmss.0`,48:`##0.0E+0`,49:`@`,56:`"上午/下午 "hh"時"mm"分"ss"秒 "`},i={};for(t in r)i[r[t]]=t;var a={};return{initialize:function(e){this.$fonts=Cf(`fonts`).attr(`count`,0).attr(`x14ac:knownFonts`,`1`),this.$fills=Cf(`fills`).attr(`count`,0),this.$borders=Cf(`borders`).attr(`count`,0),this.$numFmts=Cf(`numFmts`).attr(`count`,0),this.$cellStyleXfs=Cf(`cellStyleXfs`),this.$xf=Cf(`xf`).attr(`numFmtId`,0).attr(`fontId`,0).attr(`fillId`,0).attr(`borderId`,0),this.$cellXfs=Cf(`cellXfs`).attr(`count`,0),this.$cellStyles=Cf(`cellStyles`).append(Cf(`cellStyle`).attr(`name`,`Normal`).attr(`xfId`,0).attr(`builtinId`,0)),this.$dxfs=Cf(`dxfs`).attr(`count`,`0`),this.$tableStyles=Cf(`tableStyles`).attr(`count`,`0`).attr(`defaultTableStyle`,`TableStyleMedium9`).attr(`defaultPivotStyle`,`PivotStyleMedium4`),this.$styles=Cf(`styleSheet`).attr(`xmlns:mc`,`http://schemas.openxmlformats.org/markup-compatibility/2006`).attr(`xmlns:x14ac`,`http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac`).attr(`xmlns`,`http://schemas.openxmlformats.org/spreadsheetml/2006/main`).attr(`mc:Ignorable`,`x14ac`).prefix(``).append(this.$numFmts).append(this.$fonts).append(this.$fills).append(this.$borders).append(this.$cellStyleXfs.append(this.$xf)).append(this.$cellXfs).append(this.$cellStyles).append(this.$dxfs).append(this.$tableStyles);var t=e.defaultCellStyle||{};return t.font||={name:`Calibri`,sz:`11`},t.font.name||(t.font.name=`Calibri`),t.font.sz||(t.font.sz=11),t.fill||={patternType:`none`,fgColor:{}},t.border||={},t.numFmt||=0,this.defaultStyle=t,e=JSON.parse(JSON.stringify(t)),e.fill={patternType:`gray125`,fgColor:{}},this.addStyles([t,e]),this},addStyle:function(e){var t=JSON.stringify(e),n=a[t];return n==null?(n=this._addXf(e),a[t]=n):n=a[t],n},addStyles:function(e){var t=this;return e.map(function(e){return t.addStyle(e)})},_duckTypeStyle:function(e){return typeof e==`object`&&(e.patternFill||e.fgColor)?{fill:e}:e.font||e.numFmt||e.border||e.fill?e:this._getStyleCSS(e)},_getStyleCSS:function(e){return e},_addXf:function(e){var t=this._addFont(e.font),n=this._addFill(e.fill),r=this._addBorder(e.border),i=this._addNumFmt(e.numFmt),a=Cf(`xf`).attr(`numFmtId`,i).attr(`fontId`,t).attr(`fillId`,n).attr(`borderId`,r).attr(`xfId`,`0`);return 0/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),e=Cf(`numFmt`).attr(`numFmtId`,++n).attr(`formatCode`,e),this.$numFmts.append(e),e=this.$numFmts.children().length,this.$numFmts.attr(`count`,e),n)},_addFill:function(e){if(!e)return 0;var t,n=Cf(`patternFill`).attr(`patternType`,e.patternType||`solid`);return e.fgColor&&(t=Cf(`fgColor`),e.fgColor.rgb?(e.fgColor.rgb.length==6&&(e.fgColor.rgb=`FF`+e.fgColor.rgb),t.attr(`rgb`,e.fgColor.rgb),n.append(t)):e.fgColor.theme&&(t.attr(`theme`,e.fgColor.theme),e.fgColor.tint&&t.attr(`tint`,e.fgColor.tint),n.append(t)),e.bgColor||={indexed:`64`}),e.bgColor&&(e=Cf(`bgColor`).attr(e.bgColor),n.append(e)),n=Cf(`fill`).append(n),this.$fills.append(n),n=this.$fills.children().length,this.$fills.attr(`count`,n),n-1},_getSubBorder:function(e,t){var n=Cf(e);return t&&(n.attr(`style`,t.style||`medium`),t.color&&(e=Cf(`color`),t.color.auto?e.attr(`auto`,t.color.auto):t.color.rgb?e.attr(`rgb`,t.color.rgb):(t.color.theme||t.color.tint)&&(e.attr(`theme`,t.color.theme||`1`),e.attr(`tint`,t.color.tint||`0`)),n.append(e))),n},_addBorder:function(e){if(!e)return 0;var t=this,n=Cf(`border`).attr(`diagonalUp`,e.diagonalUp).attr(`diagonalDown`,e.diagonalDown);[`left`,`right`,`top`,`bottom`,`diagonal`].forEach(function(r){n.append(t._getSubBorder(r,e[r]))}),this.$borders.append(n);var r=this.$borders.children().length;return this.$borders.attr(`count`,r),r-1},toXml:function(){return this.$styles.toXml()}}.initialize(e||{})};Iu!==void 0&&(e.parse_xlscfb=Iu),e.parse_zip=Kd,e.read=$d,e.readFile=ef,e.readFileSync=ef,e.write=sf,e.writeFile=lf,e.writeFileSync=lf,e.writeFileAsync=function(e,t,n,r){var i=n||{};return i.type=`file`,i.file=e,cf(i),i.type=`buffer`,r instanceof Function||(r=n),Ae.writeFile(e,sf(t,i),r)},e.utils=Ea,e.writeXLSX=of,e.writeFileXLSX=function(e,t,n){return(n||={}).type=`file`,n.file=t,cf(n),of(e,n)},e.SSF=De,da!==void 0&&(e.stream=da),Me!==void 0&&(e.CFB=Me),l===void 0||((da=o7())||{}).Readable&&Sf(da.Readable)}if(e===void 0?t!==void 0&&t.exports?r(t.exports):typeof define==`function`&&define.amd?define(`xlsx`,function(){return n.version||r(n),n}):r(n):r(e),typeof window<`u`&&!window.XLSX)try{window.XLSX=n}catch{}}))(),1),c7={top:{style:`thin`,color:{rgb:`000000`}},right:{style:`thin`,color:{rgb:`000000`}},bottom:{style:`thin`,color:{rgb:`000000`}},left:{style:`thin`,color:{rgb:`000000`}}},l7={vertical:`center`,wrapText:!0},Yte={font:{bold:!0,sz:16,color:{rgb:`FFFFFF`}},fill:{fgColor:{rgb:`111827`}},alignment:{...l7,horizontal:`center`},border:c7},Xte={font:{bold:!0,color:{rgb:`111827`}},fill:{fgColor:{rgb:`F3F4F6`}},alignment:{...l7,horizontal:`center`},border:c7},Zte={font:{color:{rgb:`111827`}},fill:{fgColor:{rgb:`FFFFFF`}},alignment:{...l7,horizontal:`left`},border:c7},Qte={font:{bold:!0,color:{rgb:`FFFFFF`}},fill:{fgColor:{rgb:`374151`}},alignment:{...l7,horizontal:`center`},border:c7},$te={font:{color:{rgb:`111827`}},fill:{fgColor:{rgb:`FFFFFF`}},alignment:{...l7,horizontal:`left`},border:c7};function u7(e){return e??``}function d7(e){if(e==null)return 0;let t=(e instanceof Date?e.toISOString():String(e)).split(/\r?\n/);return Math.max(...t.map(e=>Array.from(e).reduce((e,t)=>e+(t.charCodeAt(0)>255?2:1),0)),0)}function f7(e,t,n){return Math.min(n,Math.max(t,e))}function ene(e,t){let n=Math.max(t.length,...e.map(e=>e.length));return Array.from({length:n},(n,r)=>{let i=t[r];if(i?.width)return{wch:i.width};let a=e.reduce((e,t)=>Math.max(e,d7(t[r])),d7(i?.title)),o=i?.minWidth??10,s=i?.maxWidth??42;return{wch:f7(Math.ceil(a*1.15)+2,o,s)}})}function tne(e,t,n=20){return f7(n+(e.reduce((e,n,r)=>{let i=Math.max(8,t[r]?.wch||12),a=(n==null?``:String(n)).split(/\r?\n/).reduce((e,t)=>e+Math.max(1,Math.ceil(d7(t)/Math.max(8,i-2))),0);return Math.max(e,a)},1)-1)*16,n,120)}function p7(e,t,n){e.s={...t,alignment:{...t.alignment},border:c7},n&&(e.z=n)}function m7(e){return typeof e==`number`&&Number.isFinite(e)}function nne(e){let{filename:t,sheetName:n,title:r,metadataRows:i=[],summaryRows:a=[],columns:o,rows:s}=e,c=Math.max(1,o.length),l=[],u=-1,d=-1;r&&(u=l.length,l.push([r,...Array.from({length:c-1},()=>``)])),i.forEach(e=>l.push(e.map(u7))),a.forEach(e=>l.push(e.map(u7))),(i.length||a.length)&&l.push(Array.from({length:c},()=>``)),d=l.length,l.push(o.map(e=>e.title)),s.forEach((e,t)=>{l.push(o.map(n=>u7(n.render(e,t))))});let f=s7.utils.aoa_to_sheet(l),p=s7.utils.decode_range(f[`!ref`]||`A1:A1`),m=ene(l,o);f[`!cols`]=m,f[`!rows`]=l.map((e,t)=>t===u?{hpt:34}:t===d?{hpt:28}:e.every(e=>e===``)?{hpt:10}:{hpt:tne(e,m)}),u>=0&&c>1&&(f[`!merges`]=f[`!merges`]||[],f[`!merges`].push({s:{r:u,c:0},e:{r:u,c:c-1}})),f[`!autofilter`]={ref:s7.utils.encode_range({s:{r:d,c:0},e:{r:Math.max(d,l.length-1),c:c-1}})};for(let e=p.s.r;e<=p.e.r;e+=1)for(let t=p.s.c;t<=p.e.c;t+=1){let n=s7.utils.encode_cell({r:e,c:t}),r=f[n]||{t:`s`,v:``};if(f[n]=r,e===u){p7(r,Yte);continue}if(e===d){p7(r,Qte);continue}if(e{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(h7),[i,a]=(0,S.useState)(0),[o,s]=(0,S.useState)(!1),[c,l]=(0,S.useState)(!1),[u,d]=(0,S.useState)(``),[f,p]=(0,S.useState)(1),[m,h]=(0,S.useState)(10),[g,_]=(0,S.useState)(``),[v,y]=(0,S.useState)(``),[b,x]=(0,S.useState)(``),[C,w]=(0,S.useState)(``),[T,E]=(0,S.useState)(``),[D,O]=(0,S.useState)(``),[k,A]=(0,S.useState)(``),[j,M]=(0,S.useState)(``),[N,P]=(0,S.useState)(``),[F,I]=(0,S.useState)([null,null]),L=(0,S.useMemo)(()=>({page:f,pageSize:m,userName:N||void 0,recordType:v||void 0,creditSubject:b||void 0,mediaType:C||void 0,chargeKind:T||void 0,sourceModule:D||void 0,sourceStepCode:k||void 0,billingScene:j||void 0,startDate:F[0]?.format(`YYYY-MM-DD`),endDate:F[1]?.format(`YYYY-MM-DD`),...fne(g)}),[f,m,N,v,b,C,T,D,k,j,F,g]),R=async()=>{s(!0);try{let e=await S8(L);t(e.items||[]),a(e.total||0),r(e.summary||h7)}catch(e){BG.error(e?.message||`加载积分记录失败`)}finally{s(!1)}};return(0,S.useEffect)(()=>{R()},[L]),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(4, minmax(0, 1fr))`,gap:16,marginBottom:16},children:[(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(r0,{style:{color:`#10b981`,fontSize:22}}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{style:{color:`#94a3b8`},children:`总充值`}),(0,Q.jsxs)(`div`,{style:{fontSize:22,fontWeight:800,color:`#10b981`},children:[`+`,g7(n.totalRecharge)]})]})]})}),(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(Z1,{style:{color:`#ef4444`,fontSize:22}}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{style:{color:`#94a3b8`},children:`总消费`}),(0,Q.jsxs)(`div`,{style:{fontSize:22,fontWeight:800,color:`#ef4444`},children:[`-`,g7(n.totalConsume)]})]})]})}),(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(f3,{style:{color:`#3b82f6`,fontSize:22}}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{style:{color:`#94a3b8`},children:`总回退`}),(0,Q.jsxs)(`div`,{style:{fontSize:22,fontWeight:800,color:`#3b82f6`},children:[`+`,g7(n.totalRefund)]})]})]})}),(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(N6,{style:{color:`#6366f1`,fontSize:22}}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{style:{color:`#94a3b8`},children:`交易 / 生成`}),(0,Q.jsxs)(`div`,{style:{fontSize:22,fontWeight:800},children:[g7(n.transactionCount),` / `,g7(n.generationCount)]})]})]})})]}),(0,Q.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(4, minmax(0, 1fr))`,gap:16,marginBottom:16},children:[(0,Q.jsxs)(LR,{size:`small`,bordered:!1,children:[`图片生成:`,g7(n.imageGenerationCount),` 条 / `,g7(n.imageConsume),` 积分`]}),(0,Q.jsxs)(LR,{size:`small`,bordered:!1,children:[`视频生成:`,g7(n.videoGenerationCount),` 条 / `,g7(n.videoConsume),` 积分`]}),(0,Q.jsxs)(LR,{size:`small`,bordered:!1,children:[`提词消费:`,g7(n.textConsume),` 积分`]}),(0,Q.jsxs)(LR,{size:`small`,bordered:!1,children:[`视频分析:`,g7(n.analysisConsume),` 积分`]})]}),(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16,flexWrap:`wrap`,gap:12},children:[(0,Q.jsxs)(WV,{wrap:!0,children:[(0,Q.jsx)(BC,{value:g,onChange:e=>{p(1),_(e)},style:{width:150},options:ine}),(0,Q.jsx)(BC,{value:v,onChange:e=>{p(1),y(e)},style:{width:130},options:ane}),(0,Q.jsx)(BC,{value:b,onChange:e=>{p(1),x(e)},style:{width:180},options:one}),(0,Q.jsx)(BC,{value:C,onChange:e=>{p(1),w(e)},style:{width:110},options:sne}),(0,Q.jsx)(BC,{value:T,onChange:e=>{p(1),E(e)},style:{width:150},options:cne}),(0,Q.jsx)(BC,{value:D,onChange:e=>{p(1),O(e)},style:{width:150},options:lne}),(0,Q.jsx)(BC,{value:k,onChange:e=>{p(1),A(e)},style:{width:150},options:une}),(0,Q.jsx)(BC,{value:j,onChange:e=>{p(1),M(e)},style:{width:220},options:dne}),(0,Q.jsx)(vW,{placeholder:`用户名/手机号/邮箱`,value:N,onChange:e=>{p(1),P(e.target.value)},style:{width:180},allowClear:!0}),(0,Q.jsx)(QB.RangePicker,{value:F,onChange:e=>{p(1),I(e?[e[0],e[1]]:[null,null])},placeholder:[`开始日期`,`结束日期`],style:{width:250}})]}),(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(YE,{onClick:()=>{_(``),y(``),x(``),w(``),E(``),O(``),A(``),M(``),P(``),I([null,null]),p(1)},children:`重置`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:R,children:`刷新`}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(w1,{}),loading:c,onClick:async()=>{l(!0),d(`准备导出...`);try{let e={...L,page:1,pageSize:500},t=await S8(e),n=[...t.items||[]],r=t.summary||h7,i=t.total||0,a=Math.max(1,Math.ceil(i/500));d(`正在获取 ${n.length} / ${i}`);for(let t=2;t<=a;t+=1){let r=await S8({...e,page:t});n.push(...r.items||[]),d(`正在获取 ${Math.min(n.length,i)} / ${i}`)}nne({filename:`积分流水_${(0,ZE.default)().format(`YYYYMMDD_HHmmss`)}.xlsx`,sheetName:`积分流水`,title:`积分流水汇总`,metadataRows:[[`筛选时间`,`${F[0]?.format(`YYYY-MM-DD`)||`不限`} 至 ${F[1]?.format(`YYYY-MM-DD`)||`不限`}`],[`导出时间`,(0,ZE.default)().format(`YYYY-MM-DD HH:mm:ss`)],[`导出条数`,i]],summaryRows:[[`总充值`,r.totalRecharge],[`总消费`,r.totalConsume],[`总回退`,r.totalRefund],[`交易笔数`,r.transactionCount],[`生成条数`,r.generationCount],[`生成尝试次数`,r.generationAttemptCount],[`图片生成条数`,r.imageGenerationCount],[`视频生成条数`,r.videoGenerationCount],[`图片消费积分`,r.imageConsume],[`视频消费积分`,r.videoConsume],[`提词消费积分`,r.textConsume],[`视频分析积分`,r.analysisConsume],[`总 Token`,r.totalTokens],[`输入 Token`,r.inputTokens],[`输出 Token`,r.outputTokens]],columns:[{title:`时间`,maxWidth:22,render:e=>Z5(e.createdAt||``)},{title:`用户`,minWidth:12,maxWidth:20,render:e=>e.username||`-`},{title:`手机号`,minWidth:13,maxWidth:18,render:e=>e.phone||`-`},{title:`用户类型`,maxWidth:16,render:e=>e.userTypeLabel||`-`},{title:`前台归类`,maxWidth:18,render:e=>e.frontendUserKindLabel||`-`},{title:`流水类型`,maxWidth:14,align:`center`,render:e=>e.recordTypeLabel||e.type||`-`},{title:`积分类型`,maxWidth:20,render:e=>e.creditSubjectLabel||`-`},{title:`扣费子类`,maxWidth:22,render:e=>e.chargeKindLabel||`-`},{title:`模块`,maxWidth:20,render:e=>e.sourceModuleLabel||`-`},{title:`模块步骤`,maxWidth:22,render:e=>e.sourceStepCodeLabel||`-`},{title:`计费场景`,maxWidth:32,render:e=>e.billingSceneLabel||`-`},{title:`媒体类型`,maxWidth:12,align:`center`,render:e=>e.mediaTypeLabel||`-`},{title:`变动积分`,minWidth:12,maxWidth:14,align:`right`,numFmt:`#,##0.00`,render:e=>e.amount},{title:`变动后余额`,minWidth:12,maxWidth:14,align:`right`,numFmt:`#,##0.00`,render:e=>e.balanceAfter},{title:`实际 Token`,minWidth:12,maxWidth:14,align:`right`,numFmt:`#,##0`,render:e=>e.totalTokens||0},{title:`输入 Token`,minWidth:12,maxWidth:14,align:`right`,numFmt:`#,##0`,render:e=>e.inputTokens||0},{title:`输出 Token`,minWidth:12,maxWidth:14,align:`right`,numFmt:`#,##0`,render:e=>e.outputTokens||0},{title:`执行类型`,maxWidth:18,render:e=>_7(e.engineType)},{title:`执行配置`,maxWidth:28,render:e=>e.engineName||`-`},{title:`供应商`,maxWidth:18,render:e=>e.engineProvider||`-`},{title:`模型版本`,maxWidth:26,render:e=>e.engineModelName||`-`},{title:`关联状态`,maxWidth:14,align:`center`,render:e=>e.ownerDeleted?`关联已删除`:`正常`},{title:`说明`,minWidth:18,maxWidth:42,render:e=>e.description||``},{title:`业务归属类型`,maxWidth:18,render:e=>e.ownerType||``},{title:`业务归属ID`,maxWidth:28,render:e=>e.ownerId||``},{title:`BizKey`,maxWidth:36,render:e=>e.bizKey||``}],rows:n}),BG.success(`Excel 已导出`)}catch(e){BG.error(e?.message||`导出失败`)}finally{l(!1),d(``)}},children:`下载 Excel`})]})]}),u&&(0,Q.jsx)(`div`,{style:{marginBottom:12,color:`#6366f1`},children:u}),(0,Q.jsx)(CQ,{columns:[{title:`用户`,dataIndex:`username`,width:130,fixed:`left`,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,children:e||`-`}),(0,Q.jsx)(`div`,{style:{fontSize:12,color:`#94a3b8`},children:t.phone||`-`})]})},{title:`用户类型`,dataIndex:`userTypeLabel`,width:120,render:(e,t)=>(0,Q.jsx)(IQ,{color:t.userType===`admin`?`orange`:`blue`,children:t.userTypeLabel||`-`})},{title:`流水类型`,dataIndex:`recordType`,width:100,render:(e,t)=>{let n=rne[e]||{text:t.recordTypeLabel||e||`-`,color:`default`,icon:null};return(0,Q.jsx)(IQ,{color:n.color,icon:n.icon,children:n.text})}},{title:`积分类型`,dataIndex:`creditSubjectLabel`,width:150,render:e=>(0,Q.jsx)(IQ,{children:e||`-`})},{title:`模块`,dataIndex:`sourceModuleLabel`,width:130,render:e=>e||`-`},{title:`步骤/场景`,key:`scene`,width:210,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`div`,{children:t.billingSceneLabel||`-`}),(0,Q.jsx)(`div`,{style:{fontSize:12,color:`#94a3b8`},children:t.sourceStepCodeLabel||`-`})]})},{title:`媒体`,dataIndex:`mediaTypeLabel`,width:80,render:e=>e?(0,Q.jsx)(IQ,{color:`purple`,children:e}):`-`},{title:`变动积分`,dataIndex:`amount`,width:120,sorter:(e,t)=>e.amount-t.amount,render:e=>(0,Q.jsxs)(Z.Text,{strong:!0,style:{color:e>0?`#10b981`:`#ef4444`},children:[e>0?`+`:``,g7(e)]})},{title:`余额`,dataIndex:`balanceAfter`,width:110,render:e=>g7(e)},{title:`Token`,key:`tokens`,width:140,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(`b`,{children:g7(t.totalTokens)}),(0,Q.jsxs)(`div`,{style:{fontSize:12,color:`#94a3b8`},children:[`入 `,g7(t.inputTokens),` / 出 `,g7(t.outputTokens)]})]})},{title:`执行配置`,key:`engine`,width:230,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(IQ,{color:t.engineType===`model`?`geekblue`:t.engineType===`image`?`purple`:t.engineType===`video`?`cyan`:`default`,children:_7(t.engineType)}),(0,Q.jsx)(`div`,{children:t.engineName||`-`}),(0,Q.jsx)(`div`,{style:{fontSize:12,color:`#94a3b8`},children:[t.engineProvider,t.engineModelName].filter(Boolean).join(` / `)||`-`})]})},{title:`关联状态`,dataIndex:`ownerDeleted`,width:100,render:e=>(0,Q.jsx)(IQ,{color:e?`red`:`green`,children:e?`已删除`:`正常`})},{title:`说明`,dataIndex:`description`,width:240,ellipsis:!0},{title:`时间`,dataIndex:`createdAt`,width:160,render:e=>(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:Z5(e)})}],dataSource:e,rowKey:`id`,loading:o,pagination:{current:f,pageSize:m,total:i,onChange:(e,t)=>{p(e),h(t)},showSizeChanger:!0,showTotal:e=>`共 ${e} 条记录`},scroll:{x:1900}})]})]})},mne=()=>{let[e,t]=(0,S.useState)(!1),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(!1),[c,l]=(0,S.useState)(180),[u]=X.useForm(),d=async()=>{try{let e=await F8(),t={};e.forEach(e=>{t[e.key]=e.value}),u.setFieldsValue({wechat_appid:t.payment_wechat_appid||``,wechat_mch_id:t.payment_wechat_mch_id||``,wechat_private_key:t.payment_wechat_private_key||``,wechat_cert_serial_no:t.payment_wechat_cert_serial_no||``,wechat_api_v3_key:t.payment_wechat_api_v3_key||``,wechat_notify_url:t.payment_wechat_notify_url||``,wechat_public_key:t.payment_wechat_public_key||``,wechat_public_key_id:t.payment_wechat_public_key_id||``,alipay_app_id:t.payment_alipay_app_id||``,alipay_private_key:t.payment_alipay_private_key||``,alipay_public_key:t.payment_alipay_public_key||``,alipay_notify_url:t.payment_alipay_notify_url||``,alipay_gateway:t.payment_alipay_gateway||``,order_timeout:t.payment_order_timeout||`180`}),r(t.payment_wechat_enabled===`true`),a(t.payment_alipay_enabled===`true`),s(t.payment_mock===`true`),l(parseInt(t.payment_order_timeout||`180`,10))}catch{BG.error(`加载支付配置失败`)}};return(0,S.useEffect)(()=>{d()},[]),(0,Q.jsxs)(`div`,{style:{maxWidth:`100%`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:24,flexWrap:`wrap`,marginBottom:24},children:[(0,Q.jsx)(`div`,{style:{flex:`1 1 400px`,minWidth:400},children:(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,Q.jsx)(`div`,{style:{width:40,height:40,borderRadius:10,background:`rgba(99,102,241,0.08)`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:20,color:`#6366f1`},children:(0,Q.jsx)(GB,{})}),(0,Q.jsx)(`div`,{children:(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:14},children:`订单超时时间`})})]}),(0,Q.jsx)(X,{form:u,layout:`inline`,children:(0,Q.jsx)(X.Item,{name:`order_timeout`,style:{margin:0},children:(0,Q.jsx)(lB,{min:30,max:86400,placeholder:`180`,style:{width:140},size:`middle`,addonAfter:`秒`})})})]})})}),(0,Q.jsx)(`div`,{style:{flex:`1 1 400px`,minWidth:400},children:(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`,background:o?`#fff7e6`:`#fafbff`},children:(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,Q.jsx)(`div`,{style:{width:40,height:40,borderRadius:10,background:o?`rgba(245,158,11,0.15)`:`rgba(99,102,241,0.08)`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:20,color:o?`#f59e0b`:`#6366f1`},children:(0,Q.jsx)(f2,{})}),(0,Q.jsx)(`div`,{children:(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:14},children:`模拟支付模式`})})]}),(0,Q.jsx)(Fq,{checked:o,onChange:s,checkedChildren:`已开启`,unCheckedChildren:`已关闭`})]})})})]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:24,flexWrap:`wrap`},children:[(0,Q.jsx)(`div`,{style:{flex:`1 1 400px`,minWidth:400},children:(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:20},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,Q.jsx)(`div`,{style:{width:44,height:44,borderRadius:10,background:`rgba(7,193,96,0.08)`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:22,color:`#07c160`},children:(0,Q.jsx)(I6,{})}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Title,{level:5,style:{margin:0},children:`微信支付`}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:`微信商户号支付配置`})]})]}),(0,Q.jsx)(Fq,{checked:n,onChange:r,checkedChildren:`已启用`,unCheckedChildren:`未启用`})]}),(0,Q.jsxs)(X,{form:u,layout:`vertical`,children:[(0,Q.jsx)(X.Item,{name:`wechat_appid`,label:`AppID`,children:(0,Q.jsx)(vW,{placeholder:`微信支付 AppID`,size:`large`,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_mch_id`,label:`商户号 (MchID)`,children:(0,Q.jsx)(vW,{placeholder:`微信支付商户号`,size:`large`,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_private_key`,label:`商户私钥`,extra:` + ⚠️ 重要:请填写 apiclient_key.pem 的内容,不是 apiclient_cert.pem! + 内容应该以 -----BEGIN PRIVATE KEY----- 或 -----BEGIN RSA PRIVATE KEY----- 开头 + `,children:(0,Q.jsx)(vW.TextArea,{rows:4,placeholder:`\r +-----BEGIN PRIVATE KEY-----\r +...这里是私钥内容...\r +-----END PRIVATE KEY-----\r + `,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_cert_serial_no`,label:`商户证书序列号`,extra:`从 apiclient_cert.pem 中提取的证书序列号`,children:(0,Q.jsx)(vW,{placeholder:`商户证书序列号`,size:`large`,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_api_v3_key`,label:`API v3 密钥`,children:(0,Q.jsx)(vW.Password,{placeholder:`API v3 密钥`,size:`large`,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_notify_url`,label:`回调地址`,children:(0,Q.jsx)(vW,{placeholder:`https://yourdomain.com/api/payments/wechat/callback`,size:`large`,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_public_key`,label:`微信平台公钥(可选)`,children:(0,Q.jsx)(vW.TextArea,{rows:3,placeholder:`微信支付平台公钥内容`,disabled:!n})}),(0,Q.jsx)(X.Item,{name:`wechat_public_key_id`,label:`微信平台公钥ID(可选)`,children:(0,Q.jsx)(vW,{placeholder:`平台公钥ID`,size:`large`,disabled:!n})})]})]})}),(0,Q.jsx)(`div`,{style:{flex:`1 1 400px`,minWidth:400},children:(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:20},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,Q.jsx)(`div`,{style:{width:44,height:44,borderRadius:10,background:`rgba(0,122,255,0.08)`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:22,color:`#007aff`},children:(0,Q.jsx)(H1,{})}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Title,{level:5,style:{margin:0},children:`支付宝`}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:`支付宝应用支付配置`})]})]}),(0,Q.jsx)(Fq,{checked:i,onChange:a,checkedChildren:`已启用`,unCheckedChildren:`未启用`})]}),(0,Q.jsxs)(X,{form:u,layout:`vertical`,children:[(0,Q.jsx)(X.Item,{name:`alipay_app_id`,label:`AppID`,children:(0,Q.jsx)(vW,{placeholder:`支付宝应用AppID`,size:`large`,disabled:!i})}),(0,Q.jsx)(X.Item,{name:`alipay_private_key`,label:`应用私钥`,extra:`支付宝应用私钥(PKCS8格式),不需要添加头部和尾部标记`,children:(0,Q.jsx)(vW.TextArea,{rows:4,placeholder:`\r +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...\r + `,disabled:!i})}),(0,Q.jsx)(X.Item,{name:`alipay_public_key`,label:`支付宝公钥`,extra:`从支付宝开放平台获取的支付宝公钥`,children:(0,Q.jsx)(vW.TextArea,{rows:4,placeholder:`\r +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\r + `,disabled:!i})}),(0,Q.jsx)(X.Item,{name:`alipay_gateway`,label:`网关地址`,children:(0,Q.jsx)(vW,{placeholder:`https://openapi.alipay.com/gateway.do`,size:`large`,disabled:!i})}),(0,Q.jsx)(X.Item,{name:`alipay_notify_url`,label:`回调地址`,children:(0,Q.jsx)(vW,{placeholder:`https://yourdomain.com/api/payments/alipay/callback`,size:`large`,disabled:!i})})]})]})})]}),(0,Q.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,marginTop:24},children:(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(v3,{}),onClick:async()=>{try{let e=await u.validateFields();t(!0),await I8({payment_mock:String(o),payment_wechat_enabled:String(n),payment_wechat_appid:e.wechat_appid||``,payment_wechat_mch_id:e.wechat_mch_id||``,payment_wechat_private_key:e.wechat_private_key||``,payment_wechat_cert_serial_no:e.wechat_cert_serial_no||``,payment_wechat_api_v3_key:e.wechat_api_v3_key||``,payment_wechat_notify_url:e.wechat_notify_url||``,payment_wechat_public_key:e.wechat_public_key||``,payment_wechat_public_key_id:e.wechat_public_key_id||``,payment_alipay_enabled:String(i),payment_alipay_app_id:e.alipay_app_id||``,payment_alipay_private_key:e.alipay_private_key||``,payment_alipay_public_key:e.alipay_public_key||``,payment_alipay_notify_url:e.alipay_notify_url||``,payment_alipay_gateway:e.alipay_gateway||``,payment_order_timeout:String(e.order_timeout||180)}),BG.success(`支付配置已保存`),d()}catch{BG.error(`保存失败`)}finally{t(!1)}},loading:e,size:`large`,style:{borderRadius:8,minWidth:160,height:44,fontSize:15},children:`保存配置`})})]})},{Option:v7}=BC,{RangePicker:hne}=QB,gne=()=>{let[e,t]=(0,S.useState)(!1),[n,r]=(0,S.useState)(null),[i,a]=(0,S.useState)(1),[o,s]=(0,S.useState)(10),[c,l]=(0,S.useState)(0),[u,d]=(0,S.useState)({startDate:(0,ZE.default)().format(`YYYY-MM-DD`),endDate:(0,ZE.default)().format(`YYYY-MM-DD`)}),f=async()=>{try{t(!0);let[e,n]=await Promise.all([L8(u),R8({...u,page:i,pageSize:o})]);r({...e,recent:n.items||[]}),l(n.total)}catch{BG.error(`加载支付统计失败`)}finally{t(!1)}};(0,S.useEffect)(()=>{f()},[u,i,o]);let p=(e,t)=>{a(e),s(t)},m=()=>{d({startDate:(0,ZE.default)().format(`YYYY-MM-DD`),endDate:(0,ZE.default)().format(`YYYY-MM-DD`)})},h=async e=>{try{t(!0),await z8(e),BG.success(`退款成功`),await f()}catch(e){BG.error(e?.response?.data?.detail||`退款失败`)}finally{t(!1)}},g=e=>{e&&e.length===2&&d(t=>({...t,startDate:e[0].format(`YYYY-MM-DD`),endDate:e[1].format(`YYYY-MM-DD`)}))},_={paid:{color:`green`,label:`已支付`,icon:(0,Q.jsx)(I0,{})},pending:{color:`gold`,label:`待支付`,icon:(0,Q.jsx)(GB,{})},cancelled:{color:`default`,label:`已取消`,icon:(0,Q.jsx)(z0,{})},refunded:{color:`red`,label:`已退款`,icon:(0,Q.jsx)(x6,{})}},v={alipay:{color:`blue`,label:`支付宝`},wechat:{color:`green`,label:`微信`}},y=[{title:`订单号`,dataIndex:`orderNo`,key:`orderNo`,width:200},{title:`用户`,dataIndex:`username`,key:`username`,width:120},{title:`支付方式`,dataIndex:`paymentMethod`,key:`paymentMethod`,width:100,render:e=>{let t=v[e]||{color:`default`,label:e};return(0,Q.jsx)(IQ,{color:t.color,children:t.label})}},{title:`金额`,dataIndex:`amount`,key:`amount`,width:100,render:e=>(0,Q.jsxs)(Z.Text,{strong:!0,style:{color:`#10b981`},children:[`¥`,e.toFixed(2)]})},{title:`积分`,dataIndex:`credits`,key:`credits`,width:80},{title:`状态`,dataIndex:`status`,key:`status`,width:100,render:e=>{let t=_[e]||{color:`default`,label:e,icon:null};return(0,Q.jsx)(IQ,{color:t.color,icon:t.icon,children:t.label})}},{title:`支付宝交易号`,dataIndex:`tradeNo`,key:`tradeNo`,width:200,render:e=>e||`-`},{title:`创建时间`,dataIndex:`createdAt`,key:`createdAt`,width:160,render:e=>(0,Q.jsx)(`span`,{className:`date-display`,style:{color:`#94a3b8`},children:e?Z5(e):`-`})},{title:`支付时间`,dataIndex:`paidAt`,key:`paidAt`,width:160,render:e=>(0,Q.jsx)(`span`,{className:`date-display`,style:{color:`#94a3b8`},children:e?Z5(e):`-`})},{title:`操作`,key:`action`,width:120,render:(e,t)=>t.status===`paid`?(0,Q.jsx)(qG,{title:`确认要退款该订单吗?`,description:`退款后积分会扣除,金额会原路返回`,onConfirm:()=>h(t.orderNo),okText:`确认`,cancelText:`取消`,children:(0,Q.jsx)(YE,{type:`link`,danger:!0,size:`small`,icon:(0,Q.jsx)(x6,{}),children:`退款`})}):null}];if(!n)return(0,Q.jsx)(`div`,{style:{padding:24,color:`#94a3b8`},children:`加载中…`});let b=n.byStatus?.paid||{count:0,amount:0},x=n.byStatus?.pending||{count:0,amount:0},C=n.byStatus?.cancelled||{count:0,amount:0},w=n.byStatus?.refunded||{count:0,amount:0},T=b.count+x.count+C.count+w.count,E=n.month||{count:0,amount:0};return(0,Q.jsx)(am,{locale:U6.default,children:(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(AK,{gutter:[16,16],style:{marginBottom:24},children:[(0,Q.jsx)(gz,{xs:24,sm:12,lg:12,children:(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsx)(HK,{title:`今日收入`,value:n.today.paidAmount,precision:2,prefix:(0,Q.jsx)(f2,{style:{color:`#10b981`}}),suffix:`元`,valueStyle:{color:`#10b981`,fontWeight:700}}),(0,Q.jsxs)(Z.Text,{type:`secondary`,style:{fontSize:12},children:[n.today.paidCount,` 笔订单`]})]})}),(0,Q.jsx)(gz,{xs:24,sm:12,lg:12,children:(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsx)(HK,{title:`本月累计`,value:E.paidAmount,precision:2,prefix:(0,Q.jsx)(f2,{style:{color:`#6366f1`}}),suffix:`元`,valueStyle:{color:`#6366f1`,fontWeight:700}}),(0,Q.jsxs)(Z.Text,{type:`secondary`,style:{fontSize:12},children:[E.paidCount,` 笔订单`]})]})})]}),(0,Q.jsx)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`,marginBottom:16},title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(f2,{}),`订单状态分布`]}),children:(0,Q.jsx)(AK,{gutter:16,children:[`paid`,`pending`,`cancelled`,`refunded`].map(e=>{let t=n.byStatus?.[e]||{count:0,amount:0},r=_[e],i=T>0?(t.count/T*100).toFixed(1):`0.0`;return(0,Q.jsx)(gz,{span:6,children:(0,Q.jsxs)(`div`,{style:{padding:16,borderRadius:10,background:`#fafbff`,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(IQ,{color:r.color,icon:r.icon,children:r.label}),(0,Q.jsxs)(Z.Text,{type:`secondary`,style:{fontSize:12},children:[i,`%`]})]}),(0,Q.jsxs)(`div`,{style:{marginTop:8,fontSize:20,fontWeight:700},children:[t.count,` `,(0,Q.jsx)(`span`,{style:{fontSize:13,color:`#94a3b8`,fontWeight:400},children:`笔`})]}),(0,Q.jsxs)(`div`,{style:{fontSize:13,color:`#64748b`,marginTop:4},children:[`¥`,t.amount.toFixed(2)]})]})},e)})})}),(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(f2,{}),`订单列表`]}),children:[(0,Q.jsxs)(AK,{gutter:[16,16],align:`middle`,style:{marginBottom:24},children:[(0,Q.jsxs)(gz,{xs:24,sm:12,md:6,children:[(0,Q.jsx)(`span`,{style:{marginRight:8},children:`支付方式:`}),(0,Q.jsxs)(BC,{placeholder:`全部`,allowClear:!0,style:{width:150},value:u.paymentMethod,onChange:e=>d(t=>({...t,paymentMethod:e})),children:[(0,Q.jsx)(v7,{value:`alipay`,children:`支付宝`}),(0,Q.jsx)(v7,{value:`wechat`,children:`微信`})]})]}),(0,Q.jsxs)(gz,{xs:24,sm:12,md:6,children:[(0,Q.jsx)(`span`,{style:{marginRight:8},children:`状态:`}),(0,Q.jsxs)(BC,{placeholder:`全部`,allowClear:!0,style:{width:150},value:u.status,onChange:e=>d(t=>({...t,status:e})),children:[(0,Q.jsx)(v7,{value:`paid`,children:`已支付`}),(0,Q.jsx)(v7,{value:`pending`,children:`待支付`}),(0,Q.jsx)(v7,{value:`cancelled`,children:`已取消`}),(0,Q.jsx)(v7,{value:`refunded`,children:`已退款`})]})]}),(0,Q.jsxs)(gz,{xs:24,sm:12,md:8,children:[(0,Q.jsx)(`span`,{style:{marginRight:8},children:`日期范围:`}),(0,Q.jsx)(hne,{value:[(0,ZE.default)(u.startDate),(0,ZE.default)(u.endDate)],onChange:g})]}),(0,Q.jsx)(gz,{xs:24,sm:12,md:4,children:(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:m,children:`重置`})})]}),(0,Q.jsx)(CQ,{columns:y,dataSource:n.recent||[],rowKey:`id`,loading:e,pagination:{current:i,pageSize:o,total:c,onChange:p,showSizeChanger:!0,showTotal:e=>`共 ${e} 条`},scroll:{x:1e3},size:`middle`})]})]})})},y7=[{name:`ShoppingCartOutlined`,label:`购物`,component:(0,Q.jsx)(A3,{})},{name:`BookOutlined`,label:`书籍`,component:(0,Q.jsx)(v0,{})},{name:`HomeOutlined`,label:`房产`,component:(0,Q.jsx)(Z2,{})},{name:`FireOutlined`,label:`火`,component:(0,Q.jsx)(D2,{})},{name:`RocketOutlined`,label:`科技`,component:(0,Q.jsx)(l3,{})},{name:`SkinOutlined`,label:`时尚`,component:(0,Q.jsx)(z3,{})},{name:`CompassOutlined`,label:`指南`,component:(0,Q.jsx)(e2,{})},{name:`HeartOutlined`,label:`健康`,component:(0,Q.jsx)(H2,{})},{name:`CarOutlined`,label:`汽车`,component:(0,Q.jsx)(N0,{})},{name:`CameraOutlined`,label:`相机`,component:(0,Q.jsx)(A0,{})},{name:`CloudOutlined`,label:`云`,component:(0,Q.jsx)(H0,{})},{name:`StarOutlined`,label:`星`,component:(0,Q.jsx)(Z3,{})},{name:`TrophyOutlined`,label:`奖杯`,component:(0,Q.jsx)(h6,{})},{name:`ThunderboltOutlined`,label:`闪电`,component:(0,Q.jsx)(l6,{})},{name:`BulbOutlined`,label:`灯泡`,component:(0,Q.jsx)(w0,{})},{name:`CoffeeOutlined`,label:`咖啡`,component:(0,Q.jsx)(Z0,{})},{name:`CrownOutlined`,label:`皇冠`,component:(0,Q.jsx)(r2,{})},{name:`DashboardOutlined`,label:`仪表`,component:(0,Q.jsx)(o2,{})},{name:`FlagOutlined`,label:`旗帜`,component:(0,Q.jsx)(A2,{})},{name:`GlobalOutlined`,label:`全球`,component:(0,Q.jsx)(z2,{})},{name:`GiftOutlined`,label:`礼物`,component:(0,Q.jsx)(I2,{})},{name:`LaptopOutlined`,label:`笔记本`,component:(0,Q.jsx)(r4,{})},{name:`MobileOutlined`,label:`手机`,component:(0,Q.jsx)(A4,{})},{name:`MonitorOutlined`,label:`显示器`,component:(0,Q.jsx)(N4,{})},{name:`PayCircleOutlined`,label:`支付`,component:(0,Q.jsx)(I4,{})},{name:`PictureOutlined`,label:`图片`,component:(0,Q.jsx)(H4,{})},{name:`PlayCircleOutlined`,label:`播放`,component:(0,Q.jsx)(J4,{})},{name:`SafetyOutlined`,label:`安全`,component:(0,Q.jsx)(h3,{})},{name:`ShoppingOutlined`,label:`商店`,component:(0,Q.jsx)(N3,{})},{name:`SmileOutlined`,label:`笑脸`,component:(0,Q.jsx)(H3,{})},{name:`SoundOutlined`,label:`声音`,component:(0,Q.jsx)(J3,{})},{name:`TagOutlined`,label:`标签`,component:(0,Q.jsx)(r6,{})},{name:`TeamOutlined`,label:`团队`,component:(0,Q.jsx)(o6,{})},{name:`ToolOutlined`,label:`工具`,component:(0,Q.jsx)(f6,{})},{name:`TruckOutlined`,label:`物流`,component:(0,Q.jsx)(v6,{})},{name:`VideoCameraOutlined`,label:`视频`,component:(0,Q.jsx)(A6,{})},{name:`WalletOutlined`,label:`钱包`,component:(0,Q.jsx)(N6,{})},{name:`BankOutlined`,label:`银行`,component:(0,Q.jsx)(l0,{})},{name:`BuildOutlined`,label:`建筑`,component:(0,Q.jsx)(x0,{})},{name:`ExperimentOutlined`,label:`实验`,component:(0,Q.jsx)(v2,{})},{name:`HighlightOutlined`,label:`高亮`,component:(0,Q.jsx)(G2,{})},{name:`IdcardOutlined`,label:`名片`,component:(0,Q.jsx)(e4,{})},{name:`MedicineBoxOutlined`,label:`医药`,component:(0,Q.jsx)(x4,{})},{name:`ReadOutlined`,label:`阅读`,component:(0,Q.jsx)(e3,{})},{name:`RestOutlined`,label:`休息`,component:(0,Q.jsx)(r3,{})},{name:`SketchOutlined`,label:`钻石`,component:(0,Q.jsx)(I3,{})},{name:`SolutionOutlined`,label:`方案`,component:(0,Q.jsx)(G3,{})}],_ne=Object.fromEntries(y7.map(e=>[e.name,e.component]));function b7(e){return _ne[e]||(0,Q.jsx)(J1,{})}function vne(e){try{let t=typeof e==`string`?JSON.parse(e):e;if(!Array.isArray(t))return{skillItems:[],optionGroups:[]};let n=[],r=[];for(let e of t)e&&e.type===`option_group`&&e.name&&Array.isArray(e.options)?r.push({name:e.name,options:e.options}):e&&e.key&&e.label&&n.push({key:e.key,label:e.label});return{skillItems:n,optionGroups:r}}catch{return{skillItems:[],optionGroups:[]}}}var yne=({value:e,onChange:t})=>{let n=y7.find(t=>t.name===e);return(0,Q.jsx)(KV,{trigger:[`click`],dropdownRender:()=>(0,Q.jsx)(`div`,{style:{background:`#fff`,borderRadius:12,padding:12,width:360,boxShadow:`0 12px 40px rgba(0,0,0,0.15)`,border:`1px solid #f0f0f5`},children:(0,Q.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(8, 1fr)`,gap:4},children:y7.map(n=>(0,Q.jsx)(`div`,{onMouseDown:e=>{e.preventDefault(),e.stopPropagation(),t?.(n.name)},title:n.label,style:{width:40,height:40,borderRadius:8,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`,fontSize:18,transition:`all 0.15s`,background:e===n.name?`#6366f1`:`transparent`,color:e===n.name?`#fff`:`#64748b`,border:e===n.name?`none`:`1px solid transparent`},onMouseEnter:t=>{e!==n.name&&(t.currentTarget.style.background=`#f1f5f9`)},onMouseLeave:t=>{e!==n.name&&(t.currentTarget.style.background=`transparent`)},children:n.component},n.name))})}),children:(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,padding:`8px 12px`,borderRadius:8,border:`1px solid #d9d9d9`,cursor:`pointer`,height:40},children:[e?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{style:{fontSize:18,color:`#6366f1`},children:b7(e)}),(0,Q.jsx)(`span`,{style:{color:`#64748b`,fontSize:13},children:n?.label||e})]}):(0,Q.jsx)(`span`,{style:{color:`#bfbfbf`,fontSize:13},children:`选择图标`}),(0,Q.jsx)(MC,{style:{fontSize:10,color:`#bfbfbf`,marginLeft:`auto`}})]})})},bne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)({open:!1,item:null}),[c]=X.useForm(),l=async()=>{r(!0);try{t((await C8()).map(e=>{let{skillItems:t,optionGroups:n}=vne(e.skills);return{id:e.id,key:e.key,label:e.label,icon:e.icon||``,description:e.description||``,skills:JSON.stringify(t),optionGroups:n,isActive:e.is_active??e.isActive??!0,sortOrder:e.sort_order??e.sortOrder??0}}))}catch{BG.error(`加载行业配置失败`)}finally{r(!1)}};(0,S.useEffect)(()=>{l()},[]);let u=async()=>{try{let e=await c.validateFields();a(!0);let t=[];e.skills_wentutujie?.trim()&&t.push({type:`skill`,key:`文图理解生成视频提示词`,label:e.skills_wentutujie.trim()}),e.skills_wentutujie_image?.trim()&&t.push({type:`skill`,key:`文图理解生成图片提示词`,label:e.skills_wentutujie_image.trim()});let n=(e.optionGroups||[]).filter(e=>e?.name?.trim()).map(e=>({name:e.name.trim(),options:(e.options||[]).filter(e=>e?.trim())})).filter(e=>e.options.length>0);for(let e of n)t.push({type:`option_group`,name:e.name,options:e.options});let r={key:e.key,label:e.label,icon:e.icon||``,description:e.description||``,skills:t,is_active:e.is_active??!0,sort_order:e.sort_order??0};o.item?.id?(await w8({id:o.item.id,...r}),BG.success(`已更新`)):(await w8(r),BG.success(`已添加`)),s({open:!1,item:null}),c.resetFields(),l()}catch(e){if(e?.errorFields)return;BG.error(e?.message||`保存失败`)}finally{a(!1)}},d=async e=>{try{await T8(e),BG.success(`已删除`),l()}catch(e){BG.error(e?.message||`删除失败`)}},f=e=>{s({open:!0,item:e||null});let t=``,n=``,r=[];if(e){try{let r=JSON.parse(e.skills);if(Array.isArray(r))for(let e of r)(e.key===`文图理解生成视频提示词`||e.key===`文图理解`)&&(t=e.label||``),e.key===`文图理解生成图片提示词`&&(n=e.label||``)}catch{}r=e.optionGroups.length>0?e.optionGroups:[{name:``,options:[]}]}e?c.setFieldsValue({key:e.key,label:e.label,icon:e.icon||``,description:e.description,skills_wentutujie:t,skills_wentutujie_image:n,optionGroups:r,is_active:e.isActive,sort_order:e.sortOrder}):(c.resetFields(),c.setFieldsValue({is_active:!0,sort_order:0,optionGroups:[{name:``,options:[]}]}))};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J1,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`行业与技能配置`}),(0,Q.jsxs)(IQ,{color:`purple`,children:[e.length,` 个行业`]})]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>f(),style:{borderRadius:8},children:`添加行业`})]}),(0,Q.jsx)(CQ,{columns:[{title:`行业`,key:`industry`,width:180,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,Q.jsx)(`div`,{style:{width:36,height:36,borderRadius:10,background:`#f1f5f9`,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:18,color:`#6366f1`,flexShrink:0},children:b7(t.icon)}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,children:t.label}),(0,Q.jsx)(`div`,{style:{color:`#94a3b8`,fontSize:12},children:t.key})]})]})},{title:`描述`,dataIndex:`description`,ellipsis:!0},{title:`选项配置`,key:`optionGroups`,width:260,render:(e,t)=>!t.optionGroups||t.optionGroups.length===0?(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#cbd5e1`},children:`未配置`}):(0,Q.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:4},children:t.optionGroups.map((e,t)=>(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,Q.jsx)(IQ,{color:`blue`,style:{margin:0,fontSize:11},children:e.name}),(0,Q.jsxs)(Z.Text,{style:{fontSize:11,color:`#64748b`},children:[e.options.slice(0,3).join(`、`),e.options.length>3?`...${e.options.length}项`:``]})]},t))})},{title:`文图理解生成视频提示词`,dataIndex:`skills`,ellipsis:!0,render:e=>{try{let t=JSON.parse(e);if(Array.isArray(t)){let e=t.find(e=>e.key===`文图理解生成视频提示词`||e.key===`文图理解`);if(e)return(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{fontSize:12},children:e.label})}}catch{}return(0,Q.jsx)(`span`,{style:{color:`#bfbfbf`},children:`-`})}},{title:`文图理解生成图片提示词`,dataIndex:`skills`,ellipsis:!0,render:e=>{try{let t=JSON.parse(e);if(Array.isArray(t)){let e=t.find(e=>e.key===`文图理解生成图片提示词`);if(e)return(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{fontSize:12},children:e.label})}}catch{}return(0,Q.jsx)(`span`,{style:{color:`#bfbfbf`},children:`-`})}},{title:`状态`,dataIndex:`isActive`,width:80,render:e=>(0,Q.jsx)(IQ,{color:e?`green`:`default`,children:e?`启用`:`停用`})},{title:`操作`,key:`action`,width:150,fixed:`right`,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,children:[(0,Q.jsx)(YE,{type:`link`,size:`small`,icon:(0,Q.jsx)(HQ,{}),onClick:()=>f(t),children:`编辑`}),(0,Q.jsx)(qG,{title:`确定删除该行业?`,onConfirm:()=>d(t.id),children:(0,Q.jsx)(YE,{type:`link`,size:`small`,danger:!0,icon:(0,Q.jsx)(zQ,{}),children:`删除`})})]})}],dataSource:e,rowKey:`id`,loading:n,pagination:!1,scroll:{x:900}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J1,{}),o.item?`编辑行业`:`添加行业`]}),open:o.open,onOk:u,onCancel:()=>{s({open:!1,item:null}),c.resetFields()},okText:`保存`,cancelText:`取消`,width:640,confirmLoading:i,children:(0,Q.jsxs)(X,{form:c,layout:`vertical`,style:{marginTop:16},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`key`,label:`行业标识`,style:{flex:1},rules:[{required:!0,message:`请输入标识`}],children:(0,Q.jsx)(vW,{placeholder:`例如:ecommerce`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`label`,label:`行业名称`,style:{flex:1},rules:[{required:!0,message:`请输入名称`}],children:(0,Q.jsx)(vW,{placeholder:`例如:电商`,size:`large`})})]}),(0,Q.jsx)(X.Item,{name:`icon`,label:`行业图标`,children:(0,Q.jsx)(yne,{})}),(0,Q.jsx)(X.Item,{name:`description`,label:`行业描述`,children:(0,Q.jsx)(vW.TextArea,{rows:2,placeholder:`行业描述`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`skills_wentutujie`,label:`文图理解生成视频提示词`,extra:`用于LLM优化视频提示词的系统指令,根据行业特点引导AI理解文案与画面的关系`,children:(0,Q.jsx)(vW.TextArea,{rows:3,placeholder:`请输入文图理解生成视频提示词,例如: +你是一位专业的电商视频文案专家,擅长将产品卖点转化为视觉语言`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`skills_wentutujie_image`,label:`文图理解生成图片提示词`,extra:`用于LLM优化图片提示词的系统指令,根据行业特点引导AI理解文案与画面的关系`,children:(0,Q.jsx)(vW.TextArea,{rows:3,placeholder:`请输入文图理解生成图片提示词,例如: +你是一位专业的电商图片文案专家,擅长将产品卖点转化为图片生成提示词`,size:`large`})}),(0,Q.jsxs)(`div`,{style:{marginBottom:8},children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:13},children:`行业选项配置`}),(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,marginLeft:8},children:`添加选项组,每组包含名称和多个选项,前台将显示为下拉选择`})]}),(0,Q.jsx)(X.List,{name:`optionGroups`,children:(e,{add:t,remove:n})=>(0,Q.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:8,marginBottom:16},children:[e.map(({key:e,name:t,...r})=>(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:8,alignItems:`flex-start`,padding:`10px 12px`,borderRadius:10,background:`#f8f9fc`,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,gap:8},children:[(0,Q.jsx)(X.Item,{...r,name:[t,`name`],label:`选项名称`,style:{marginBottom:0},rules:[{required:!0,message:`请输入选项名称`}],children:(0,Q.jsx)(vW,{placeholder:`例如:视频风格`,size:`middle`,style:{borderRadius:8}})}),(0,Q.jsx)(X.Item,{...r,name:[t,`options`],label:`选项内容`,style:{marginBottom:0},children:(0,Q.jsx)(BC,{mode:`tags`,size:`middle`,placeholder:`输入选项后回车添加`,style:{borderRadius:8},tokenSeparators:[`,`,`,`,`、`]})})]}),(0,Q.jsx)(D4,{onClick:()=>n(t),style:{color:`#ef4444`,fontSize:16,marginTop:34,cursor:`pointer`,flexShrink:0}})]},e)),(0,Q.jsx)(YE,{type:`dashed`,onClick:()=>t(),block:!0,icon:(0,Q.jsx)(DL,{}),style:{borderRadius:8,height:36},children:`添加选项组`})]})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`is_active`,label:`启用状态`,valuePropName:`checked`,initialValue:!0,style:{flex:1},children:(0,Q.jsx)(Fq,{})}),(0,Q.jsx)(X.Item,{name:`sort_order`,label:`排序`,initialValue:0,style:{flex:1},children:(0,Q.jsx)(vW,{type:`number`,size:`large`})})]})]})})]})};function x7(e){if(Array.isArray(e))return e;if(typeof e==`string`)try{return JSON.parse(e)}catch{return[]}return[]}var xne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)({open:!1,engine:null}),[o]=X.useForm(),s=async()=>{r(!0);try{t((await E8()).map(e=>({...e,supportedRatios:x7(e.supportedRatios),supportedResolutions:x7(e.supportedResolutions),supportedDurations:x7(e.supportedDurations)})))}catch{BG.error(`加载视频引擎失败`)}finally{r(!1)}};(0,S.useEffect)(()=>{s()},[]);let c=async()=>{try{let e=await o.validateFields(),t={name:e.name,provider:e.provider,api_base:e.apiBase,api_key:e.apiKey,model_name:e.modelName,supported_ratios:JSON.stringify(e.supportedRatios||[]),supported_resolutions:JSON.stringify(e.supportedResolutions||[]),supported_durations:JSON.stringify(e.supportedDurations||[]),is_active:e.isActive??!0,priority:e.priority??0};i.engine?(await D8({id:i.engine.id,...t}),BG.success(`已更新`)):(await D8(t),BG.success(`已添加`)),a({open:!1,engine:null}),o.resetFields(),s()}catch(e){if(e?.errorFields)return;BG.error(e?.message||`保存失败`)}},l=async e=>{try{await O8(e),BG.success(`已删除`),s()}catch{BG.error(`删除失败`)}},u=e=>{a({open:!0,engine:e||null}),e?o.setFieldsValue(e):(o.resetFields(),o.setFieldsValue({isActive:!0,priority:0,supportedRatios:[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],supportedResolutions:[`480p`,`720p`,`1080p`],supportedDurations:[4,5,6,7,8,9,10,11,12,13,14,15]}))};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J4,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`视频引擎配置`}),(0,Q.jsxs)(IQ,{color:`purple`,children:[e.length,` 个引擎`]})]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>u(),style:{borderRadius:8},children:`添加引擎`})]}),(0,Q.jsx)(CQ,{columns:[{title:`引擎名称`,key:`name`,width:180,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,Q.jsx)(`div`,{style:{width:36,height:36,borderRadius:8,background:t.isActive?`linear-gradient(135deg, #6366f1, #8b5cf6)`:`linear-gradient(135deg, #94a3b8, #cbd5e1)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#fff`,fontSize:16},children:(0,Q.jsx)(J4,{})}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,children:t.name}),(0,Q.jsx)(`div`,{style:{color:`#94a3b8`,fontSize:12},children:t.provider})]})]})},{title:`支持比例`,dataIndex:`supportedRatios`,width:200,render:e=>(0,Q.jsx)(WV,{size:2,wrap:!0,children:e.map(e=>(0,Q.jsx)(IQ,{children:e},e))})},{title:`支持分辨率`,dataIndex:`supportedResolutions`,width:150,render:e=>(0,Q.jsx)(WV,{size:2,wrap:!0,children:e.map(e=>(0,Q.jsx)(IQ,{color:`blue`,children:e},e))})},{title:`支持时长`,dataIndex:`supportedDurations`,width:120,render:e=>(0,Q.jsx)(IQ,{color:`orange`,children:e?.length?`${Math.min(...e)}-${Math.max(...e)}s`:`-`})},{title:`状态`,dataIndex:`isActive`,width:80,render:e=>(0,Q.jsx)(IQ,{color:e?`green`:`default`,children:e?`启用`:`停用`})},{title:`操作`,key:`action`,width:150,fixed:`right`,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,children:[(0,Q.jsx)(YE,{type:`link`,size:`small`,icon:(0,Q.jsx)(HQ,{}),onClick:()=>u(t),children:`编辑`}),(0,Q.jsx)(qG,{title:`确定删除?`,onConfirm:()=>l(t.id),children:(0,Q.jsx)(YE,{type:`link`,size:`small`,danger:!0,icon:(0,Q.jsx)(zQ,{}),children:`删除`})})]})}],dataSource:e,rowKey:`id`,loading:n,pagination:!1,scroll:{x:900}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J4,{}),i.engine?`编辑引擎`:`添加引擎`]}),open:i.open,onOk:c,onCancel:()=>{a({open:!1,engine:null}),o.resetFields()},okText:`保存`,cancelText:`取消`,width:620,children:(0,Q.jsxs)(X,{form:o,layout:`vertical`,style:{marginTop:16},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`name`,label:`引擎名称`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(vW,{placeholder:`Seedance 2.0`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`provider`,label:`提供商`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`ark`,label:`火山引擎 (Ark)`}]})})]}),(0,Q.jsx)(X.Item,{name:`apiBase`,label:`API基础地址`,rules:[{required:!0}],children:(0,Q.jsx)(vW,{placeholder:`https://ark.cn-beijing.volces.com/api/v3`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`apiKey`,label:`API Key`,children:(0,Q.jsx)(vW.Password,{placeholder:`sk-****`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`modelName`,label:`模型名称`,children:(0,Q.jsx)(vW,{placeholder:`doubao-seedance-2-0-260128`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`supportedRatios`,label:`支持比例`,children:(0,Q.jsx)(BC,{mode:`multiple`,size:`large`,options:[{value:`16:9`,label:`16:9 (横屏)`},{value:`4:3`,label:`4:3 (标准)`},{value:`1:1`,label:`1:1 (方形)`},{value:`3:4`,label:`3:4 (竖版)`},{value:`9:16`,label:`9:16 (竖屏)`},{value:`21:9`,label:`21:9 (超宽)`}]})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`supportedResolutions`,label:`支持分辨率`,style:{flex:1},children:(0,Q.jsx)(BC,{mode:`multiple`,size:`large`,options:[{value:`480p`},{value:`720p`},{value:`1080p`}]})}),(0,Q.jsx)(X.Item,{name:`supportedDurations`,label:`支持时长(秒)`,style:{flex:1},children:(0,Q.jsx)(BC,{mode:`multiple`,size:`large`,options:Array.from({length:12},(e,t)=>({value:t+4,label:`${t+4}秒`}))})})]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`priority`,label:`优先级`,children:(0,Q.jsx)(BC,{size:`large`,options:[{value:0,label:`0 (默认)`},{value:1,label:`1`},{value:2,label:`2`},{value:3,label:`3`},{value:5,label:`5`},{value:10,label:`10 (最高)`}]})}),(0,Q.jsx)(X.Item,{name:`isActive`,label:`启用状态`,valuePropName:`checked`,style:{paddingTop:30},children:(0,Q.jsx)(Fq,{})})]})]})})]})};function Sne(e){if(Array.isArray(e))return e;if(typeof e==`string`)try{return JSON.parse(e)}catch{return[]}return[]}function Cne(e){if(e&&typeof e==`object`&&!Array.isArray(e))return e;if(typeof e==`string`)try{let t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}return{}}var S7={"2K":{"1:1":`2048×2048`,"4:3":`2304×1728`,"3:4":`1728×2304`,"16:9":`2560×1440`,"9:16":`1600×2848`,"3:2":`2496×1664`,"2:3":`1664×2496`,"21:9":`3024×1296`},"4K":{"1:1":`4096×4096`,"4:3":`4608×3456`,"3:4":`3520×4704`,"16:9":`5404×3040`,"9:16":`3040×5504`,"3:2":`4992×3328`,"2:3":`3328×4992`,"21:9":`6197×2656`}},C7=[`1:1`,`4:3`,`3:4`,`16:9`,`9:16`,`3:2`,`2:3`,`21:9`],wne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)({open:!1,engine:null}),[o]=X.useForm(),s=async()=>{r(!0);try{t((await k8()).map(e=>({...e,supportedModels:Sne(e.supportedModels),supportedSizes:Cne(e.supportedSizes)})))}catch{BG.error(`加载图片引擎失败`)}finally{r(!1)}};(0,S.useEffect)(()=>{s()},[]);let c=async()=>{try{let e=await o.validateFields(),t={};for(let n of[`2K`,`4K`]){let r=e[`size_${n}`]||[];if(r.length>0){t[n]={};for(let e of r)t[n][e]=S7[n]?.[e]||e}}let n={name:e.name,provider:e.provider,api_base:e.apiBase,api_key:e.apiKey,model_name:e.modelName,supported_models:JSON.stringify(e.supportedModels||[]),supported_sizes:JSON.stringify(t),default_size:e.defaultSize||`2K`,generate_url:e.generateUrl||``,is_active:e.isActive??!0,priority:e.priority??0};i.engine?(await A8({id:i.engine.id,...n}),BG.success(`已更新`)):(await A8(n),BG.success(`已添加`)),a({open:!1,engine:null}),o.resetFields(),s()}catch(e){if(e?.errorFields)return;BG.error(e?.message||`保存失败`)}},l=async e=>{try{await j8(e),BG.success(`已删除`),s()}catch{BG.error(`删除失败`)}},u=e=>{if(a({open:!0,engine:e||null}),e){let t={};for(let n of[`2K`,`4K`])t[`size_${n}`]=Object.keys(e.supportedSizes?.[n]||{});o.setFieldsValue({...e,...t})}else o.resetFields(),o.setFieldsValue({isActive:!0,priority:0,supportedModels:[`doubao-seedream-5-0-260128`],defaultSize:`2K`,size_2K:C7,size_4K:C7})};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(H4,{style:{fontSize:18,color:`#10b981`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`图片引擎配置`}),(0,Q.jsxs)(IQ,{color:`green`,children:[e.length,` 个引擎`]})]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>u(),style:{borderRadius:8},children:`添加引擎`})]}),(0,Q.jsx)(CQ,{columns:[{title:`引擎名称`,key:`name`,width:180,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,Q.jsx)(`div`,{style:{width:36,height:36,borderRadius:8,background:t.isActive?`linear-gradient(135deg, #10b981, #059669)`:`linear-gradient(135deg, #94a3b8, #cbd5e1)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#fff`,fontSize:16},children:(0,Q.jsx)(H4,{})}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,children:t.name}),(0,Q.jsx)(`div`,{style:{color:`#94a3b8`,fontSize:12},children:t.modelName})]})]})},{title:`2K 支持比例`,key:`sizes_2k`,width:260,render:(e,t)=>{let n=Object.keys(t.supportedSizes?.[`2K`]||{});return n.length===0?(0,Q.jsx)(`span`,{style:{color:`#bfbfbf`},children:`-`}):(0,Q.jsx)(WV,{size:2,wrap:!0,children:n.map(e=>(0,Q.jsxs)(IQ,{color:`blue`,children:[e,` `,t.supportedSizes[`2K`][e]]},e))})}},{title:`4K 支持比例`,key:`sizes_4k`,width:260,render:(e,t)=>{let n=Object.keys(t.supportedSizes?.[`4K`]||{});return n.length===0?(0,Q.jsx)(`span`,{style:{color:`#bfbfbf`},children:`-`}):(0,Q.jsx)(WV,{size:2,wrap:!0,children:n.map(e=>(0,Q.jsxs)(IQ,{color:`purple`,children:[e,` `,t.supportedSizes[`4K`][e]]},e))})}},{title:`状态`,dataIndex:`isActive`,width:80,render:e=>(0,Q.jsx)(IQ,{color:e?`green`:`default`,children:e?`启用`:`停用`})},{title:`操作`,key:`action`,width:150,fixed:`right`,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,children:[(0,Q.jsx)(YE,{type:`link`,size:`small`,icon:(0,Q.jsx)(HQ,{}),onClick:()=>u(t),children:`编辑`}),(0,Q.jsx)(qG,{title:`确定删除?`,onConfirm:()=>l(t.id),children:(0,Q.jsx)(YE,{type:`link`,size:`small`,danger:!0,icon:(0,Q.jsx)(zQ,{}),children:`删除`})})]})}],dataSource:e,rowKey:`id`,loading:n,pagination:!1,scroll:{x:1e3}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(H4,{}),i.engine?`编辑引擎`:`添加引擎`]}),open:i.open,onOk:c,onCancel:()=>{a({open:!1,engine:null}),o.resetFields()},okText:`保存`,cancelText:`取消`,width:680,children:(0,Q.jsxs)(X,{form:o,layout:`vertical`,style:{marginTop:16},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`name`,label:`引擎名称`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(vW,{placeholder:`豆包文生图`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`provider`,label:`提供商`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`ark`,label:`火山引擎 (Ark)`}]})})]}),(0,Q.jsx)(X.Item,{name:`apiBase`,label:`API基础地址`,rules:[{required:!0}],children:(0,Q.jsx)(vW,{placeholder:`https://ark.cn-beijing.volces.com/api/v3`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`apiKey`,label:`API Key`,children:(0,Q.jsx)(vW.Password,{placeholder:`sk-****`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`modelName`,label:`默认模型`,children:(0,Q.jsx)(vW,{placeholder:`doubao-seedream-5-0-260128`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`supportedModels`,label:`支持模型列表`,children:(0,Q.jsx)(BC,{mode:`tags`,size:`large`,placeholder:`输入模型ID后回车添加`,tokenSeparators:[`,`,`,`],options:[{value:`doubao-seedream-5-0-260128`}]})}),(0,Q.jsxs)(`div`,{style:{background:`#f8f9fc`,borderRadius:10,padding:16,marginBottom:8},children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:14},children:`尺寸配置`}),(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,marginLeft:8},children:`勾选每个档位支持的比例,前台选择后传对应像素值给SDK`})]}),[`2K`,`4K`].map(e=>(0,Q.jsxs)(`div`,{style:{background:`#fafbfc`,borderRadius:10,padding:`12px 16px`,marginBottom:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:13,color:e===`2K`?`#3b82f6`:`#8b5cf6`},children:e}),(0,Q.jsx)(X.Item,{name:`size_${e}`,style:{marginTop:8,marginBottom:0},children:(0,Q.jsx)(lz.Group,{style:{width:`100%`},children:(0,Q.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(4, 1fr)`,gap:`6px 0`},children:C7.map(t=>(0,Q.jsxs)(lz,{value:t,style:{fontSize:12},children:[t,` `,(0,Q.jsx)(`span`,{style:{color:`#94a3b8`,fontSize:11},children:S7[e]?.[t]})]},t))})})})]},e)),(0,Q.jsx)(X.Item,{name:`defaultSize`,label:`默认尺寸档位`,children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`2K`,label:`2K`},{value:`4K`,label:`4K`}]})}),(0,Q.jsx)(X.Item,{name:`generateUrl`,label:`生成接口地址`,children:(0,Q.jsx)(vW,{placeholder:`https://ark.cn-beijing.volces.com/api/v3/images/generations`,size:`large`})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`priority`,label:`优先级`,children:(0,Q.jsx)(BC,{size:`large`,options:[{value:0,label:`0 (默认)`},{value:1,label:`1`},{value:2,label:`2`},{value:3,label:`3`},{value:5,label:`5`},{value:10,label:`10 (最高)`}]})}),(0,Q.jsx)(X.Item,{name:`isActive`,label:`启用状态`,valuePropName:`checked`,style:{paddingTop:30},children:(0,Q.jsx)(Fq,{})})]})]})})]})},Tne=[`2K`,`4K`],Ene=[`480p`,`720p`,`1080p`],Dne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)([]),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)({open:!1,ratio:null}),[c]=X.useForm(),[l,u]=(0,S.useState)(10),[d,f]=(0,S.useState)(null),[p,m]=(0,S.useState)(!1),h=X.useWatch(`genType`,c)||`video`,g=X.useWatch(`modelConfigId`,c),_=async()=>{a(!0);try{let[e,n,i]=await Promise.all([M8(),_8(),h5()]),a=(i?.engine?.image||[]).map(e=>({...e,genType:`image`})),o=(i?.engine?.video||[]).map(e=>({...e,genType:`video`}));t(e),r([...o,...a]);let s=n.find(e=>e.key===`text_credits_per_1000_tokens`);s&&(u(Number(s.value)||10),f({id:s.id}))}catch{BG.error(`加载积分比例失败`)}finally{a(!1)}};(0,S.useEffect)(()=>{_()},[]);let v=(0,S.useMemo)(()=>n.filter(e=>e.genType===h).map(e=>({value:e.id,label:`${e.name}${e.modelName?`(${e.modelName})`:``}`})),[n,h]),y=(0,S.useMemo)(()=>n.find(e=>e.id===g&&e.genType===h),[n,h,g]),b=(0,S.useMemo)(()=>{if(h===`image`){let e=y?.supportedSizes?Object.keys(y.supportedSizes):[];return(e.length?e:Tne).map(e=>({value:e,label:e}))}let e=y?.supportedResolutions||[];return(e.length?e:Ene).map(e=>({value:e,label:e}))},[h,y]),x=(e,t)=>n.find(n=>n.id===e&&(!t||n.genType===t))?.name||e,C=async()=>{try{let e=await c.validateFields(),t={model_config_id:e.modelConfigId,gen_type:e.genType,resolution:e.resolution,ratio:e.ratio,base_credits:e.baseCredits,per_second_credits:e.genType===`image`?0:e.perSecondCredits||0};o.ratio?(await N8({id:o.ratio.id,...t}),BG.success(`已更新`)):(await N8(t),BG.success(`已添加`)),s({open:!1,ratio:null}),c.resetFields(),_()}catch(e){if(e?.errorFields)return;BG.error(e?.message||`保存失败`)}},w=async e=>{try{await P8(e),BG.success(`已删除`),_()}catch{BG.error(`删除失败`)}},T=async()=>{if(d){m(!0);try{await v8(d.id,String(l)),BG.success(`文字积分费率已更新`)}catch(e){BG.error(e?.message||`保存失败`)}finally{m(!1)}}},E=e=>{s({open:!0,ratio:e||null}),e?c.setFieldsValue({modelConfigId:e.modelConfigId,genType:e.genType===`image`?`image`:`video`,resolution:e.resolution,ratio:e.ratio,baseCredits:e.baseCredits,perSecondCredits:e.perSecondCredits}):(c.resetFields(),c.setFieldsValue({genType:`video`,ratio:1,baseCredits:60,perSecondCredits:2}))};return(0,Q.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:16},children:[(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(N2,{style:{fontSize:18,color:`#f59e0b`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`文字积分费率`})]}),(0,Q.jsx)(YE,{type:`primary`,loading:p,onClick:T,style:{borderRadius:8},children:`保存`})]}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{display:`block`,marginBottom:16,fontSize:13},children:`文字积分计算公式:ceil(总token数 x 费率 / 1000),最低1积分`}),(0,Q.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:16},children:[(0,Q.jsx)(Z.Text,{children:`每1000 token消耗积分:`}),(0,Q.jsx)(lB,{min:0,max:1e3,step:.01,value:l,onChange:e=>u(e||0),size:`large`,style:{width:160},addonAfter:`积分`}),(0,Q.jsxs)(Z.Text,{type:`secondary`,style:{fontSize:12},children:[`示例:1000 token = `,l,` 积分,500 token = `,(500*l/1e3).toFixed(4),` 积分`]})]})]}),(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(D0,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`积分比例配置`}),(0,Q.jsxs)(IQ,{color:`purple`,children:[e.length,` 条规则`]})]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>E(),style:{borderRadius:8},children:`添加比例`})]}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{display:`block`,marginBottom:16,fontSize:13},children:`视频积分公式:(基础积分 + 每秒积分 x 视频时长) x 模型倍率;图片积分公式:基础积分 x 模型倍率`}),(0,Q.jsx)(CQ,{columns:[{title:`类型`,dataIndex:`genType`,width:80,render:e=>(0,Q.jsx)(IQ,{color:e===`image`?`cyan`:`orange`,children:e===`image`?`图片`:`视频`})},{title:`引擎`,dataIndex:`modelConfigId`,width:180,render:(e,t)=>(0,Q.jsx)(IQ,{color:t.genType===`image`?`cyan`:`purple`,children:x(e,t.genType)})},{title:`分辨率/尺寸`,dataIndex:`resolution`,width:110,render:e=>(0,Q.jsx)(IQ,{color:{"480p":`blue`,"720p":`blue`,"1080p":`blue`,"4K":`green`,"2K":`green`}[e]||`default`,children:e})},{title:`倍率`,dataIndex:`ratio`,width:100,sorter:(e,t)=>e.ratio-t.ratio,render:e=>(0,Q.jsxs)(Z.Text,{strong:!0,style:{color:e>=2?`#ef4444`:e>=1.5?`#f59e0b`:`#10b981`},children:[`x`,e]})},{title:`基础积分`,dataIndex:`baseCredits`,width:100,render:e=>(0,Q.jsxs)(Z.Text,{children:[e,` 积分`]})},{title:`每秒积分`,dataIndex:`perSecondCredits`,width:100,render:(e,t)=>(0,Q.jsx)(Z.Text,{children:t.genType===`image`?`-`:`${e} 积分/秒`})},{title:`示例计算`,key:`example`,width:120,render:(e,t)=>{let n;return n=t.genType===`image`?Math.round(t.baseCredits*t.ratio):Math.round((t.baseCredits+t.perSecondCredits*15)*t.ratio),(0,Q.jsxs)(Z.Text,{strong:!0,style:{color:`#6366f1`},children:[n,` 积分`]})}},{title:`操作`,key:`action`,width:150,fixed:`right`,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,children:[(0,Q.jsx)(YE,{type:`link`,size:`small`,icon:(0,Q.jsx)(HQ,{}),onClick:()=>E(t),children:`编辑`}),(0,Q.jsx)(qG,{title:`确定删除?`,onConfirm:()=>w(t.id),children:(0,Q.jsx)(YE,{type:`link`,size:`small`,danger:!0,icon:(0,Q.jsx)(zQ,{}),children:`删除`})})]})}],dataSource:e,rowKey:`id`,loading:i,pagination:!1,scroll:{x:860}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(D0,{}),o.ratio?`编辑比例`:`添加比例`]}),open:o.open,onOk:C,onCancel:()=>{s({open:!1,ratio:null}),c.resetFields()},okText:`保存`,cancelText:`取消`,width:520,children:(0,Q.jsxs)(X,{form:c,layout:`vertical`,style:{marginTop:16},children:[(0,Q.jsx)(X.Item,{name:`genType`,label:`生成类型`,rules:[{required:!0,message:`请选择生成类型`}],children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`video`,label:`视频`},{value:`image`,label:`图片`}],onChange:()=>{c.setFieldsValue({modelConfigId:void 0,resolution:void 0})}})}),(0,Q.jsx)(X.Item,{name:`modelConfigId`,label:`引擎`,rules:[{required:!0,message:`请选择引擎`}],children:(0,Q.jsx)(BC,{size:`large`,placeholder:`请选择引擎`,options:v,showSearch:!0,optionFilterProp:`label`,onChange:()=>c.setFieldsValue({resolution:void 0})})}),(0,Q.jsx)(X.Item,{name:`resolution`,label:h===`image`?`图片尺寸`:`分辨率`,rules:[{required:!0,message:h===`image`?`请选择图片尺寸`:`请选择分辨率`}],children:(0,Q.jsx)(BC,{size:`large`,placeholder:h===`image`?`请选择图片尺寸`:`请选择分辨率`,options:b})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`ratio`,label:`倍率`,style:{flex:1},rules:[{required:!0,message:`请输入倍率`}],children:(0,Q.jsx)(lB,{min:.1,max:10,step:.1,style:{width:`100%`},size:`large`})}),(0,Q.jsx)(X.Item,{name:`baseCredits`,label:`基础积分`,style:{flex:1},rules:[{required:!0,message:`请输入基础积分`}],children:(0,Q.jsx)(lB,{min:0,max:1e3,style:{width:`100%`},size:`large`})}),h!==`image`&&(0,Q.jsx)(X.Item,{name:`perSecondCredits`,label:`每秒积分`,style:{flex:1},rules:[{required:!0,message:`请输入每秒积分`}],children:(0,Q.jsx)(lB,{min:0,max:100,style:{width:`100%`},size:`large`})})]})]})})]})},w7={HomeOutlined:(0,Q.jsx)(Z2,{}),PlayCircleOutlined:(0,Q.jsx)(J4,{}),WalletOutlined:(0,Q.jsx)(N6,{}),RobotOutlined:(0,Q.jsx)(o3,{}),SettingOutlined:(0,Q.jsx)(D3,{}),BellOutlined:(0,Q.jsx)(h0,{}),UserOutlined:(0,Q.jsx)(D6,{}),AppstoreOutlined:(0,Q.jsx)(J1,{}),FileTextOutlined:(0,Q.jsx)(YV,{}),StarOutlined:(0,Q.jsx)(Z3,{}),HeartOutlined:(0,Q.jsx)(H2,{}),CameraOutlined:(0,Q.jsx)(A0,{}),DashboardOutlined:(0,Q.jsx)(o2,{}),CalculatorOutlined:(0,Q.jsx)(D0,{}),DollarOutlined:(0,Q.jsx)(f2,{}),GiftOutlined:(0,Q.jsx)(I2,{}),ThunderboltOutlined:(0,Q.jsx)(l6,{}),FireOutlined:(0,Q.jsx)(D2,{}),CloudOutlined:(0,Q.jsx)(H0,{}),SmileOutlined:(0,Q.jsx)(H3,{}),TrophyOutlined:(0,Q.jsx)(h6,{}),RocketOutlined:(0,Q.jsx)(l3,{}),BulbOutlined:(0,Q.jsx)(w0,{}),CodeOutlined:(0,Q.jsx)(J0,{}),PictureOutlined:(0,Q.jsx)(H4,{}),VideoCameraOutlined:(0,Q.jsx)(A6,{}),AudioOutlined:(0,Q.jsx)(o0,{}),MailOutlined:(0,Q.jsx)(v4,{}),PhoneOutlined:(0,Q.jsx)(z4,{}),GlobalOutlined:(0,Q.jsx)(z2,{}),ShoppingCartOutlined:(0,Q.jsx)(A3,{}),TeamOutlined:(0,Q.jsx)(o6,{}),BarChartOutlined:(0,Q.jsx)(f0,{}),PieChartOutlined:(0,Q.jsx)(G4,{}),LineChartOutlined:(0,Q.jsx)(o4,{}),SecurityScanOutlined:(0,Q.jsx)(x3,{}),ApiOutlined:(0,Q.jsx)(G1,{}),DatabaseOutlined:(0,Q.jsx)(l2,{}),CloudServerOutlined:(0,Q.jsx)(G0,{}),MenuOutlined:(0,Q.jsx)(w4,{})},One=Object.keys(w7).map(e=>({value:e,label:(0,Q.jsxs)(`span`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[w7[e],` `,e.replace(`Outlined`,``)]})})),kne={page:`blue`,group:`purple`},Ane={page:`页面`,group:`分组`},jne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(!0),[i,a]=(0,S.useState)(`frontend`),[o,s]=(0,S.useState)({open:!1,menu:null}),[c]=X.useForm(),l=async()=>{r(!0);try{t(await W8())}catch{}r(!1)};(0,S.useEffect)(()=>{l()},[]);let u=async()=>{try{let e=await c.validateFields(),t={label:e.label,path:e.path||``,icon:e.icon||``,sort_order:e.sortOrder??0,is_active:e.isActive??!0,parent_id:e.parentId||null,menu_type:e.menuType||`page`,menu_target:e.menuTarget||`frontend`,is_default:e.isDefault??!1};o.menu?.id?await G8({...t,id:o.menu.id}):await G8(t),BG.success(o.menu?.id?`菜单已更新`:`菜单已添加`),s({open:!1,menu:null}),c.resetFields(),l()}catch{}},d=async e=>{try{await K8(e),BG.success(`菜单已删除`),l()}catch(e){BG.error(e?.message||`删除失败`)}},f=t=>{s({open:!0,menu:t||null}),t?c.setFieldsValue({label:t.label,path:t.path,icon:t.icon,sortOrder:t.sortOrder??0,isActive:t.isActive??!0,parentId:t.parentId??``,menuType:t.menuType??`page`,menuTarget:t.menuTarget??`frontend`,isDefault:t.isDefault??!1}):(c.resetFields(),c.setFieldsValue({icon:`HomeOutlined`,sortOrder:e.length,isActive:!0,menuType:`page`,menuTarget:i,isDefault:!1}))},p=e.filter(e=>{let t=e.menuTarget??`frontend`;return t===i||t===`both`}),m=[{value:``,label:`顶级菜单`},...p.filter(e=>e.menuType===`group`).map(e=>({value:e.id,label:e.label}))],h=[],g=p.filter(e=>!e.parentId),_={};p.filter(e=>e.parentId).forEach(e=>{let t=e.parentId;_[t]||(_[t]=[]),_[t].push(e)}),g.sort((e,t)=>(e.sortOrder??0)-(t.sortOrder??0)).forEach(e=>{h.push({...e,_depth:0}),(_[e.id]||[]).sort((e,t)=>(e.sortOrder??0)-(t.sortOrder??0)).forEach(e=>{h.push({...e,_depth:1})})});let v=[{title:`排序`,dataIndex:`sortOrder`,width:60},{title:`菜单名称`,key:`label`,width:180,render:(e,t)=>(0,Q.jsxs)(`span`,{style:{paddingLeft:t._depth*20,fontWeight:t._depth===0?600:400},children:[t._depth===1&&(0,Q.jsx)(`span`,{style:{color:`#cbd5e1`,marginRight:4},children:`└`}),t.label]})},{title:`路由路径`,dataIndex:`path`,width:160,render:e=>e||(0,Q.jsx)(Z.Text,{type:`secondary`,children:`-`})},{title:`图标`,dataIndex:`icon`,width:100,render:e=>e&&w7[e]?(0,Q.jsx)(`span`,{style:{fontSize:16,color:`#6366f1`},children:w7[e]}):`-`},{title:`类型`,dataIndex:`menuType`,width:80,render:e=>(0,Q.jsx)(IQ,{color:kne[e]||`default`,children:Ane[e]||e})},{title:`状态`,dataIndex:`isActive`,width:70,render:e=>(0,Q.jsx)(`span`,{style:{color:e?`#22c55e`:`#94a3b8`},children:e?`启用`:`停用`})},...i===`frontend`?[{title:`默认显示`,dataIndex:`isDefault`,width:80,render:e=>e?(0,Q.jsx)(IQ,{color:`green`,children:`默认`}):(0,Q.jsx)(Z.Text,{type:`secondary`,children:`-`})}]:[],{title:`操作`,key:`action`,width:150,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,children:[(0,Q.jsx)(YE,{type:`link`,size:`small`,icon:(0,Q.jsx)(HQ,{}),onClick:()=>f(t),children:`编辑`}),(0,Q.jsx)(qG,{title:`确定删除该菜单?`,onConfirm:()=>d(t.id),children:(0,Q.jsx)(YE,{type:`link`,size:`small`,danger:!0,icon:(0,Q.jsx)(zQ,{}),children:`删除`})})]})}];return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(w4,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`菜单配置`})]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>f(),style:{borderRadius:8},children:`添加菜单`})]}),(0,Q.jsx)(CR,{activeKey:i,onChange:a,items:[{key:`frontend`,label:`前台菜单`},{key:`admin`,label:`后台菜单`}]}),(0,Q.jsx)(CQ,{columns:v,dataSource:h,rowKey:`id`,loading:n,pagination:!1,scroll:{x:900}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(w4,{}),o.menu?.id?`编辑菜单`:`添加菜单`]}),open:o.open,onOk:u,onCancel:()=>{s({open:!1,menu:null}),c.resetFields()},okText:`确认`,cancelText:`取消`,width:520,children:(0,Q.jsxs)(X,{form:c,layout:`vertical`,children:[(0,Q.jsx)(X.Item,{name:`label`,label:`菜单名称`,rules:[{required:!0,message:`请输入菜单名称`}],children:(0,Q.jsx)(vW,{placeholder:`例如:我的项目`,size:`large`})}),(0,Q.jsx)(X.Item,{name:`path`,label:`路由路径`,tooltip:`分组类型可留空`,children:(0,Q.jsx)(vW,{placeholder:`例如:/projects(分组可留空)`,size:`large`})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`menuType`,label:`菜单类型`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`page`,label:`页面`},{value:`group`,label:`分组`}]})}),(0,Q.jsx)(X.Item,{name:`menuTarget`,label:`适用端`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`frontend`,label:`前台`},{value:`admin`,label:`后台`},{value:`both`,label:`两者`}]})})]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`icon`,label:`图标`,style:{flex:1},rules:[{required:!0}],children:(0,Q.jsx)(BC,{size:`large`,options:One})}),(0,Q.jsx)(X.Item,{name:`sortOrder`,label:`排序`,style:{flex:1},children:(0,Q.jsx)(lB,{min:0,max:100,style:{width:`100%`},size:`large`,placeholder:`默认0`})})]}),(0,Q.jsx)(X.Item,{name:`parentId`,label:`上级菜单`,children:(0,Q.jsx)(BC,{size:`large`,options:m,allowClear:!0,placeholder:`顶级菜单`})}),(0,Q.jsx)(X.Item,{name:`isActive`,label:`启用`,valuePropName:`checked`,children:(0,Q.jsx)(Fq,{})}),(0,Q.jsx)(X.Item,{noStyle:!0,shouldUpdate:(e,t)=>e.menuTarget!==t.menuTarget,children:({getFieldValue:e})=>e(`menuTarget`)===`admin`?null:(0,Q.jsx)(X.Item,{name:`isDefault`,label:`新用户默认显示`,valuePropName:`checked`,tooltip:`开启后,新注册用户默认显示此菜单`,children:(0,Q.jsx)(Fq,{})})})]})})]})},Mne={normal:`blue`,gift:`green`,promo:`purple`},Nne={normal:`常规`,gift:`赠送`,promo:`促销`},Pne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)({open:!1,item:null}),[o]=X.useForm(),s=async()=>{r(!0);try{t((await Q8()).map(e=>({id:e.id,name:e.name,credits:e.credits,price:e.price,bonusCredits:e.bonus_credits??e.bonusCredits??0,totalCredits:e.total_credits??e.totalCredits??e.credits,description:e.description,packageType:e.package_type??e.packageType??`normal`,isGift:e.is_gift??e.isGift??!1,isActive:e.is_active??e.isActive??!0,sortOrder:e.sort_order??e.sortOrder??0})))}catch{BG.error(`加载充值套餐失败`)}finally{r(!1)}};(0,S.useEffect)(()=>{s()},[]);let c=async()=>{try{let e=await o.validateFields(),t={name:e.name,credits:e.credits,price:e.price,bonus_credits:e.bonusCredits||0,description:e.description||null,package_type:e.packageType||`normal`,is_gift:e.isGift||!1,is_active:e.isActive??!0,sort_order:e.sortOrder??0};i.item?.id?(await $8({id:i.item.id,...t}),BG.success(`已更新`)):(await $8(t),BG.success(`已添加`)),a({open:!1,item:null}),o.resetFields(),s()}catch{}},l=async e=>{try{await e5(e),BG.success(`已删除`),s()}catch(e){BG.error(e?.message||`删除失败`)}},u=e=>{a({open:!0,item:e||null}),e?o.setFieldsValue({name:e.name,credits:e.credits,price:e.price,bonusCredits:e.bonusCredits,description:e.description,packageType:e.packageType,isGift:e.isGift,isActive:e.isActive,sortOrder:e.sortOrder}):(o.resetFields(),o.setFieldsValue({isActive:!0,sortOrder:0,packageType:`normal`,bonusCredits:0,isGift:!1}))};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(I2,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`充值套餐管理`}),(0,Q.jsxs)(IQ,{color:`purple`,children:[e.length,` 个套餐`]})]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>u(),style:{borderRadius:8},children:`添加套餐`})]}),(0,Q.jsx)(CQ,{columns:[{title:`套餐名称`,key:`name`,width:160,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,children:t.name}),t.description&&(0,Q.jsx)(`div`,{style:{color:`#94a3b8`,fontSize:12},children:t.description})]})},{title:`基础积分`,dataIndex:`credits`,width:100,render:e=>(0,Q.jsx)(Z.Text,{children:e.toLocaleString()})},{title:`赠送积分`,dataIndex:`bonusCredits`,width:100,render:e=>e>0?(0,Q.jsxs)(IQ,{color:`green`,children:[`+`,e.toLocaleString()]}):(0,Q.jsx)(Z.Text,{type:`secondary`,children:`-`})},{title:`总积分`,key:`total`,width:100,render:(e,t)=>(0,Q.jsx)(Z.Text,{strong:!0,style:{color:`#6366f1`},children:(t.credits+t.bonusCredits).toLocaleString()})},{title:`价格(元)`,dataIndex:`price`,width:100,render:e=>(0,Q.jsxs)(Z.Text,{strong:!0,children:[`¥`,e]})},{title:`类型`,dataIndex:`packageType`,width:80,render:e=>(0,Q.jsx)(IQ,{color:Mne[e]||`default`,children:Nne[e]||e})},{title:`状态`,dataIndex:`isActive`,width:80,render:e=>(0,Q.jsx)(IQ,{color:e?`green`:`default`,children:e?`启用`:`停用`})},{title:`操作`,key:`action`,width:150,fixed:`right`,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,children:[(0,Q.jsx)(YE,{type:`link`,size:`small`,icon:(0,Q.jsx)(HQ,{}),onClick:()=>u(t),children:`编辑`}),(0,Q.jsx)(qG,{title:`确定删除?`,onConfirm:()=>l(t.id),children:(0,Q.jsx)(YE,{type:`link`,size:`small`,danger:!0,icon:(0,Q.jsx)(zQ,{}),children:`删除`})})]})}],dataSource:e,rowKey:`id`,loading:n,pagination:!1,scroll:{x:900}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(I2,{}),i.item?`编辑套餐`:`添加套餐`]}),open:i.open,onOk:c,onCancel:()=>{a({open:!1,item:null}),o.resetFields()},okText:`保存`,cancelText:`取消`,width:520,children:(0,Q.jsxs)(X,{form:o,layout:`vertical`,style:{marginTop:16},children:[(0,Q.jsx)(X.Item,{name:`name`,label:`套餐名称`,rules:[{required:!0,message:`请输入套餐名称`}],children:(0,Q.jsx)(vW,{placeholder:`例如:进阶包`,size:`large`})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`credits`,label:`基础积分`,rules:[{required:!0,message:`请输入积分`}],style:{flex:1},children:(0,Q.jsx)(lB,{min:1,placeholder:`2000`,size:`large`,style:{width:`100%`}})}),(0,Q.jsx)(X.Item,{name:`price`,label:`价格(元)`,rules:[{required:!0,message:`请输入价格`}],style:{flex:1},children:(0,Q.jsx)(lB,{min:.01,step:1,placeholder:`168`,size:`large`,style:{width:`100%`}})})]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`bonusCredits`,label:`赠送积分`,initialValue:0,style:{flex:1},children:(0,Q.jsx)(lB,{min:0,placeholder:`0`,size:`large`,style:{width:`100%`}})}),(0,Q.jsx)(X.Item,{name:`packageType`,label:`套餐类型`,initialValue:`normal`,style:{flex:1},children:(0,Q.jsx)(BC,{size:`large`,options:[{value:`normal`,label:`常规`},{value:`gift`,label:`赠送`},{value:`promo`,label:`促销`}]})})]}),(0,Q.jsx)(X.Item,{name:`description`,label:`描述`,children:(0,Q.jsx)(vW,{placeholder:`套餐描述(可选)`,size:`large`})}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16},children:[(0,Q.jsx)(X.Item,{name:`isActive`,label:`启用状态`,valuePropName:`checked`,initialValue:!0,style:{flex:1},children:(0,Q.jsx)(Fq,{})}),(0,Q.jsx)(X.Item,{name:`isGift`,label:`是否赠送`,valuePropName:`checked`,initialValue:!1,style:{flex:1},children:(0,Q.jsx)(Fq,{})}),(0,Q.jsx)(X.Item,{name:`sortOrder`,label:`排序`,initialValue:0,style:{flex:1},children:(0,Q.jsx)(lB,{size:`large`,style:{width:`100%`}})})]})]})})]})},Fne={POST:`green`,PUT:`blue`,DELETE:`red`},Ine=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(0),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(1),c=async e=>{a(!0);try{let n=await t5(e||o);t(n.items||[]),r(n.total||0)}catch{BG.error(`加载操作日志失败`)}finally{a(!1)}};return(0,S.useEffect)(()=>{c()},[]),(0,Q.jsx)(`div`,{children:(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J2,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`操作日志`})]}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:()=>c(),children:`刷新`})]}),(0,Q.jsx)(CQ,{columns:[{title:`操作人`,dataIndex:`username`,width:120,render:e=>(0,Q.jsx)(Z.Text,{strong:!0,children:e})},{title:`操作`,dataIndex:`action`,width:160,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`方法`,dataIndex:`method`,width:80,render:e=>(0,Q.jsx)(IQ,{color:Fne[e]||`default`,children:e})},{title:`路径`,dataIndex:`path`,width:220,ellipsis:!0,render:e=>(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:e})},{title:`时间`,dataIndex:`createdAt`,width:160,render:e=>(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:Z5(e)})}],dataSource:e,rowKey:`id`,loading:i,pagination:{current:o,pageSize:20,total:n,showTotal:e=>`共 ${e} 条记录`,onChange:e=>{s(e),c(e)}},scroll:{x:800}})]})})},Lne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(0),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(1),[c,l]=(0,S.useState)(!1),[u,d]=(0,S.useState)(!1),[f,p]=(0,S.useState)(!1),[m,h]=(0,S.useState)(null),[g]=X.useForm(),[_]=X.useForm(),v=async e=>{a(!0);try{let n=await n5(e||o);t(n.items||[]),r(n.total||0)}catch{BG.error(`加载应用管理列表失败`)}finally{a(!1)}},y=async()=>{try{let e=await g.validateFields();await r5({app_id:e.app_id,secret:e.secret,open_type:e.open_type,count:e.count,auth_url:e.auth_url,company:e.company}),BG.success(`创建成功`),l(!1),g.resetFields(),v()}catch(e){BG.error(e?.message||`创建失败`)}},b=async e=>{try{h(await i5(e)),d(!0)}catch(e){BG.error(e?.message||`获取详情失败`)}},x=async e=>{try{let t=await i5(e);h(t),_.setFieldsValue({app_id:t.appId,secret:t.secret,open_type:t.openType,count:t.count,auth_url:t.authUrl,company:t.company}),p(!0)}catch(e){BG.error(e?.message||`获取详情失败`)}},C=async()=>{if(m)try{let e=await _.validateFields();await a5(m.id,{app_id:e.app_id,secret:e.secret,open_type:e.open_type,count:e.count,auth_url:e.auth_url,company:e.company}),BG.success(`更新成功`),p(!1),_.resetFields(),v()}catch(e){BG.error(e?.message||`更新失败`)}},w=e=>{UG.confirm({title:`确认删除`,content:`确定要删除这个应用管理吗?`,okText:`删除`,okType:`danger`,cancelText:`取消`,onOk:async()=>{try{await o5(e),BG.success(`删除成功`),v()}catch(e){BG.error(e?.message||`删除失败`)}}})};return(0,S.useEffect)(()=>{v()},[]),(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{variant:`outlined`,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(w4,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`应用管理列表`})]}),(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:()=>v(),children:`刷新`}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(DL,{}),onClick:()=>l(!0),children:`创建`})]})]}),(0,Q.jsx)(CQ,{columns:[{title:`ID`,dataIndex:`id`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`应用ID`,dataIndex:`appId`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`应用密钥`,dataIndex:`secret`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`开户方式`,dataIndex:`openType`,render:e=>(0,Q.jsx)(Z.Text,{children:{1:`千川`,2:`广告`,3:`本地推`,4:`星图`,5:`快手代理商`,6:`巨量星图`,7:`巨量服务单`,8:`腾讯服务单`,9:`腾讯营销K2`,10:`腾讯营销K3`}[e]||e})},{title:`归属公司`,dataIndex:`company`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`授权次数`,dataIndex:`count`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`状态`,dataIndex:`status`,render:e=>(0,Q.jsx)(IQ,{color:e===1?`green`:`red`,children:e===1?`正常`:`禁用`})},{title:`授权URL`,dataIndex:`authUrl`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`创建人`,dataIndex:`createBy`,render:e=>(0,Q.jsx)(Z.Text,{children:e})},{title:`创建时间`,dataIndex:`createdAt`,render:e=>(0,Q.jsx)(Z.Text,{children:Z5(e)})},{title:`更新时间`,dataIndex:`updatedAt`,render:e=>(0,Q.jsx)(Z.Text,{children:Z5(e)})},{title:`操作`,render:(e,t)=>(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(YE,{icon:(0,Q.jsx)(XU,{}),size:`small`,onClick:()=>b(t.id),children:`详情`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(HQ,{}),size:`small`,onClick:()=>x(t.id),children:`更新`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(zQ,{}),size:`small`,danger:!0,onClick:()=>w(t.id),children:`删除`})]})}],dataSource:e,rowKey:`id`,loading:i,pagination:{current:o,pageSize:20,total:n,showTotal:e=>`共 ${e} 条记录`,onChange:e=>{s(e),v(e)}},scroll:{x:800}})]}),(0,Q.jsx)(UG,{title:`创建应用管理`,open:c,onOk:y,onCancel:()=>{l(!1),g.resetFields()},okText:`创建`,cancelText:`取消`,width:600,children:(0,Q.jsxs)(X,{form:g,layout:`vertical`,children:[(0,Q.jsx)(X.Item,{name:`app_id`,label:`应用ID`,rules:[{required:!0,message:`请输入应用ID`},{max:64,message:`应用ID不能超过64个字符`}],children:(0,Q.jsx)(vW,{placeholder:`请输入应用ID`})}),(0,Q.jsx)(X.Item,{name:`secret`,label:`应用密钥`,rules:[{required:!0,message:`请输入应用密钥`},{max:256,message:`应用密钥不能超过256个字符`}],children:(0,Q.jsx)(vW,{placeholder:`请输入应用密钥`})}),(0,Q.jsx)(X.Item,{name:`open_type`,label:`开户方式`,rules:[{required:!0,message:`请选择开户方式`}],children:(0,Q.jsxs)(BC,{placeholder:`请选择开户方式`,children:[(0,Q.jsx)(BC.Option,{value:1,children:`千川`}),(0,Q.jsx)(BC.Option,{value:2,children:`广告`}),(0,Q.jsx)(BC.Option,{value:3,children:`本地推`}),(0,Q.jsx)(BC.Option,{value:4,children:`星图`}),(0,Q.jsx)(BC.Option,{value:5,children:`快手代理商`}),(0,Q.jsx)(BC.Option,{value:6,children:`巨量星图`}),(0,Q.jsx)(BC.Option,{value:7,children:`巨量服务单`}),(0,Q.jsx)(BC.Option,{value:8,children:`腾讯服务单`}),(0,Q.jsx)(BC.Option,{value:9,children:`腾讯营销K2`}),(0,Q.jsx)(BC.Option,{value:10,children:`腾讯营销K3`})]})}),(0,Q.jsx)(X.Item,{name:`count`,label:`最大授权用户数`,initialValue:100,children:(0,Q.jsx)(lB,{min:1,placeholder:`应用最大可以授权多少个用户`})}),(0,Q.jsx)(X.Item,{name:`auth_url`,label:`应用授权链接`,children:(0,Q.jsx)(vW,{placeholder:`请输入应用授权链接`})}),(0,Q.jsx)(X.Item,{name:`company`,label:`应用归属公司名称`,rules:[{max:256,message:`公司名称不能超过256个字符`}],children:(0,Q.jsx)(vW,{placeholder:`请输入应用归属公司名称`})})]})}),(0,Q.jsx)(UG,{title:`应用管理详情`,open:u,onCancel:()=>{d(!1),h(null)},okText:`关闭`,cancelText:`取消`,width:600,children:m&&(0,Q.jsxs)(`div`,{style:{lineHeight:`2`},children:[(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`ID:`}),` `,m.id]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`应用ID:`}),` `,m.appId]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`应用密钥:`}),` `,m.secret]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`开户方式:`}),` `,{1:`千川`,2:`广告`,3:`本地推`,4:`星图`,5:`快手代理商`,6:`巨量星图`,7:`巨量服务单`,8:`腾讯服务单`,9:`腾讯营销K2`,10:`腾讯营销K3`}[m.openType]||m.openType]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`归属公司:`}),` `,m.company||`-`]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`授权次数:`}),` `,m.count]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`状态:`}),` `,m.status===1?`正常`:`禁用`]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`授权URL:`}),` `,m.authUrl||`-`]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`创建人:`}),` `,m.createBy]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`创建时间:`}),` `,Z5(m.createdAt)]}),(0,Q.jsxs)(`p`,{children:[(0,Q.jsx)(`strong`,{children:`更新时间:`}),` `,Z5(m.updatedAt)]})]})}),(0,Q.jsx)(UG,{title:`更新应用管理`,open:f,onOk:C,onCancel:()=>{p(!1),_.resetFields(),h(null)},okText:`更新`,cancelText:`取消`,width:600,children:(0,Q.jsxs)(X,{form:_,layout:`vertical`,children:[(0,Q.jsx)(X.Item,{name:`app_id`,label:`应用ID`,rules:[{required:!0,message:`请输入应用ID`},{max:64,message:`应用ID不能超过64个字符`}],children:(0,Q.jsx)(vW,{placeholder:`请输入应用ID`})}),(0,Q.jsx)(X.Item,{name:`secret`,label:`应用密钥`,rules:[{required:!0,message:`请输入应用密钥`},{max:256,message:`应用密钥不能超过256个字符`}],children:(0,Q.jsx)(vW,{placeholder:`请输入应用密钥`})}),(0,Q.jsx)(X.Item,{name:`open_type`,label:`开户方式`,rules:[{required:!0,message:`请选择开户方式`}],children:(0,Q.jsxs)(BC,{placeholder:`请选择开户方式`,children:[(0,Q.jsx)(BC.Option,{value:1,children:`千川`}),(0,Q.jsx)(BC.Option,{value:2,children:`广告`}),(0,Q.jsx)(BC.Option,{value:3,children:`本地推`}),(0,Q.jsx)(BC.Option,{value:4,children:`星图`}),(0,Q.jsx)(BC.Option,{value:5,children:`快手代理商`}),(0,Q.jsx)(BC.Option,{value:6,children:`巨量星图`}),(0,Q.jsx)(BC.Option,{value:7,children:`巨量服务单`}),(0,Q.jsx)(BC.Option,{value:8,children:`腾讯服务单`}),(0,Q.jsx)(BC.Option,{value:9,children:`腾讯营销K2`}),(0,Q.jsx)(BC.Option,{value:10,children:`腾讯营销K3`})]})}),(0,Q.jsx)(X.Item,{name:`count`,label:`最大授权用户数`,children:(0,Q.jsx)(lB,{min:1,placeholder:`应用最大可以授权多少个用户`})}),(0,Q.jsx)(X.Item,{name:`auth_url`,label:`应用授权链接`,children:(0,Q.jsx)(vW,{placeholder:`请输入应用授权链接`})}),(0,Q.jsx)(X.Item,{name:`company`,label:`应用归属公司名称`,rules:[{max:256,message:`公司名称不能超过256个字符`}],children:(0,Q.jsx)(vW,{placeholder:`请输入应用归属公司名称`})})]})})]})},T7=`http://ceshi.apiforeign.minzhong.cn`.replace(/\/api\/?$/i,``).replace(/\/$/,``),E7={image:`empty`,video:`empty`,videoCover:`empty`,references:{}},D7={optimizing:{color:`processing`,text:`优化中`,icon:(0,Q.jsx)(xm,{spin:!0})},prompt_optimized:{color:`processing`,text:`待生成`,icon:(0,Q.jsx)(GB,{})},generating:{color:`warning`,text:`生成中`,icon:(0,Q.jsx)(xm,{spin:!0})},completed:{color:`success`,text:`已完成`,icon:(0,Q.jsx)(I0,{})},failed:{color:`error`,text:`失败`,icon:(0,Q.jsx)(z0,{})}},O7={image:{text:`图片`,color:`purple`,icon:(0,Q.jsx)(x2,{})},video:{text:`视频`,color:`geekblue`,icon:(0,Q.jsx)(A6,{})}},Rne=e=>/^(https?:)?\/\//i.test(e)||/^(blob|data):/i.test(e),k7=e=>!!e&&/^blob:/i.test(e.trim()),A7=e=>{if(!e)return``;let t=String(e).trim();return t?Rne(t)?t:T7?`${T7}${t.startsWith(`/`)?t:`/${t}`}`:t.startsWith(`/`)?t:`/${t}`:``},zne=e=>e?e.length>12?`${e.slice(0,8)}...`:e:`-`,j7=e=>e?Z5(e):`-`,Bne=e=>e==null||e===``,M7=e=>{if(!e||k7(e))return!1;try{let t=new URL(A7(e),window.location.origin),n=t.searchParams.get(`exp`)||t.searchParams.get(`expires`)||t.searchParams.get(`expire`)||t.searchParams.get(`expires_at`)||t.searchParams.get(`x-expires`);if(!n)return!1;let r=Number(n);if(!Number.isFinite(r))return!1;let i=r>1e10?r:r*1e3;return Date.now()>=i}catch{return!1}},N7=e=>e?k7(e)||M7(e)?`invalid`:`checking`:`empty`,P7=e=>{let t=e.url||e.mediaUrl||e.fileUrl;return typeof t==`string`&&t.trim()?t.trim():void 0},Vne=e=>{let t=String(e.type||e.mediaType||e.mimeType||``).toLowerCase(),n=P7(e)?.toLowerCase()||``;return t.includes(`video`)||/\.(mp4|mov|webm|m4v)(\?|$)/i.test(n)?`video`:t.includes(`image`)||/\.(png|jpe?g|webp|gif|bmp|svg)(\?|$)/i.test(n)?`image`:t||`unknown`},F7=(e,t)=>`${t}-${P7(e)||`empty`}`,I7=(e,t=`资源`)=>k7(e)?`本地临时素材已失效`:M7(e)?`${t}链接已超时,请刷新列表或重新搜索后再查看`:`${t}加载失败,请刷新列表或重新搜索后再查看`,L7=({text:e,minHeight:t=240,compact:n=!1,action:r})=>(0,Q.jsxs)(`div`,{style:{width:`100%`,minHeight:n?void 0:t,height:n?`100%`:void 0,borderRadius:n?10:12,background:`#f8f9fc`,border:`1px dashed #cbd5e1`,color:`#64748b`,display:`flex`,alignItems:`center`,justifyContent:`center`,flexDirection:`column`,gap:n?4:10,textAlign:`center`},children:[(0,Q.jsx)(Z.Text,{style:{color:`#64748b`,fontSize:n?11:13},children:e}),r]}),R7=({label:e,value:t})=>(0,Q.jsxs)(`div`,{style:{flex:1,minWidth:120},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:e}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:14},children:Bne(t)?`-`:t})]}),Hne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(0),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(1),[c]=(0,S.useState)(20),[l,u]=(0,S.useState)(``),[d,f]=(0,S.useState)(``),[p,m]=(0,S.useState)(0),[h,g]=(0,S.useState)(null),[_,v]=(0,S.useState)(E7),[y,b]=(0,S.useState)(!1),x=(0,S.useRef)(null),[C,w]=(0,S.useState)(null),[T,E]=(0,S.useState)(null),D=(0,S.useCallback)(async()=>{a(!0);try{let e=await f5({userId:d.trim()||void 0,status:l||void 0,page:o,pageSize:c});t((e.items||[]).map(e=>({id:e.id,userId:e.userId,username:e.username,projectId:e.projectId,projectName:e.projectName,originalPrompt:e.originalPrompt,optimizedPrompt:e.optimizedPrompt,duration:e.duration,aspectRatio:e.aspectRatio,resolution:e.resolution,status:e.status,videoUrl:e.videoUrl,videoCoverUrl:e.videoCoverUrl,references:e.references,creditsCost:e.creditsCost||0,textCreditsCost:e.textCreditsCost||0,textTokensUsed:e.textTokensUsed||0,videoTokensUsed:e.videoTokensUsed||0,errorMessage:e.errorMessage,createdAt:e.createdAt,generatedAt:e.generatedAt,genType:e.genType,imageSize:e.imageSize,imageUrl:e.imageUrl,imageTokensUsed:e.imageTokensUsed||0,imageProportion:e.imageProportion,imagePx:e.imagePx}))),r(e.total||0)}catch{BG.error(`加载记录失败`)}finally{a(!1)}},[l,d,o,c]);(0,S.useEffect)(()=>{D()},[D,p]),(0,S.useEffect)(()=>{if(!h){v(E7);return}let e=(h.references||[]).reduce((e,t,n)=>{let r=P7(t);return e[F7(t,n)]=N7(r),e},{});x.current&&(x.current.pause(),x.current.currentTime=0),b(!1),v({image:N7(h.imageUrl),video:N7(h.videoUrl),videoCover:N7(h.videoCoverUrl),references:e})},[h]);let O=()=>{s(1),m(e=>e+1)},k=(0,S.useCallback)(e=>{g(e)},[]),A=()=>{x.current&&x.current.pause(),b(!1),g(null)},j=e=>{v(t=>({...t,...e}))},M=(e,t)=>{v(n=>({...n,references:{...n.references,[e]:t}}))},N=(e,t=`素材`)=>{if(!e){BG.warning(`${t}链接为空,暂无法查看`);return}if(k7(e)){BG.warning(`本地临时素材已失效,暂无法查看`);return}if(M7(e)){BG.warning(`${t}链接已超时,请刷新列表或重新搜索后再查看`);return}window.open(A7(e),`_blank`,`noopener,noreferrer`)},P=()=>{if(h?.videoUrl){if(M7(h.videoUrl)){j({video:`invalid`}),BG.warning(`视频链接已超时,请刷新列表或重新搜索后再查看`);return}b(!0),window.setTimeout(()=>{x.current?.play().catch(()=>{b(!1),j({video:`invalid`}),BG.warning(`视频播放失败,请确认资源链接是否仍然有效`)})},0)}},F=async(e,t,n)=>{w(e);try{await p5(e,t,n),BG.success(`状态已更新`),D()}catch(e){BG.error(e?.message||`更新失败`)}finally{w(null)}},I=async()=>{if(T){w(T.record.id);try{await m5(T.record.id,T.ratio,T.resolution,T.image_size),BG.success(`已提交${T.record.genType===`video`?`视频`:`图片`}生成`),E(null),D()}catch(e){BG.error(e?.message||`生成失败`)}finally{w(null)}}},L=(0,S.useMemo)(()=>[{title:`用户`,key:`user`,width:120,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:13},children:t.username||`未知用户`}),(0,Q.jsx)(`div`,{style:{fontSize:11,color:`#94a3b8`},children:zne(t.userId)})]})},{title:`项目`,dataIndex:`projectName`,width:120,ellipsis:!0,render:e=>(0,Q.jsx)(Z.Text,{style:{fontSize:13},children:e||`-`})},{title:`类型`,dataIndex:`genType`,width:90,ellipsis:!0,render:e=>{let t=O7[e]||{text:e||`-`,color:`default`,icon:null};return(0,Q.jsx)(IQ,{color:t.color,icon:t.icon,children:t.text})}},{title:`提示词`,key:`prompt`,ellipsis:!0,render:(e,t)=>(0,Q.jsx)(Aw,{title:t.originalPrompt,placement:`topLeft`,children:(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#475569`},ellipsis:!0,children:t.originalPrompt||`-`})})},{title:`参数`,key:`params`,width:160,render:(e,t)=>t.genType===`video`?t.duration||t.aspectRatio||t.resolution?(0,Q.jsxs)(WV,{size:4,wrap:!0,children:[t.duration?(0,Q.jsxs)(IQ,{children:[t.duration,`s`]}):null,t.aspectRatio?(0,Q.jsx)(IQ,{children:t.aspectRatio}):null,t.resolution?(0,Q.jsx)(IQ,{children:t.resolution}):null]}):(0,Q.jsx)(IQ,{color:`default`,children:`待配置`}):t.imageSize||t.imageProportion||t.imagePx?(0,Q.jsxs)(WV,{size:4,wrap:!0,children:[t.imageSize?(0,Q.jsx)(IQ,{children:t.imageSize}):null,t.imageProportion?(0,Q.jsx)(IQ,{children:t.imageProportion}):null,t.imagePx?(0,Q.jsx)(IQ,{children:t.imagePx}):null]}):(0,Q.jsx)(IQ,{color:`default`,children:`待配置`})},{title:`积分`,key:`credits`,width:120,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{fontSize:12},children:[t.textCreditsCost>0?(0,Q.jsxs)(`div`,{style:{color:`#f59e0b`},children:[`文字: `,t.textCreditsCost]}):null,t.creditsCost>0?(0,Q.jsxs)(`div`,{style:{color:`#6366f1`},children:[t.genType===`video`?`视频`:`图片`,`: `,t.creditsCost]}):null,t.textCreditsCost===0&&t.creditsCost===0?(0,Q.jsx)(Z.Text,{style:{color:`#94a3b8`},children:`0`}):null]})},{title:`状态`,dataIndex:`status`,width:90,render:e=>{let t=D7[e]||{color:`default`,text:e||`-`,icon:null};return(0,Q.jsx)(IQ,{color:t.color,icon:t.icon,children:t.text})}},{title:`时间`,key:`time`,width:150,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{fontSize:12,color:`#94a3b8`},children:[(0,Q.jsx)(`div`,{children:j7(t.createdAt)}),t.generatedAt?(0,Q.jsxs)(`div`,{style:{color:`#10b981`},children:[`生成: `,j7(t.generatedAt)]}):null]})},{title:`操作`,key:`action`,width:150,fixed:`right`,render:(e,t)=>(0,Q.jsxs)(WV,{size:4,wrap:!0,children:[(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(XU,{}),onClick:()=>k(t),children:`详情`}),t.status===`generating`?(0,Q.jsx)(YE,{size:`small`,danger:!0,loading:C===t.id,onClick:()=>{UG.confirm({title:`确认操作`,icon:(0,Q.jsx)(h2,{}),content:`确定将此记录标记为失败?`,onOk:()=>F(t.id,`failed`)})},children:`标记失败`}):null,t.status===`failed`?(0,Q.jsx)(YE,{size:`small`,type:`primary`,danger:!0,loading:C===t.id,onClick:()=>E({record:t,ratio:t.aspectRatio||`16:9`,resolution:t.resolution||`720p`,image_size:t.imageSize||`2K`}),children:`重试生成`}):null,t.status===`prompt_optimized`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(YE,{size:`small`,type:`primary`,loading:C===t.id,onClick:()=>E({record:t,ratio:t.aspectRatio||`16:9`,resolution:t.resolution||`720p`,image_size:t.imageSize||`2K`}),style:{background:`#6366f1`,border:`none`},children:[`生成`,t.genType===`video`?`视频`:`图片`]}),(0,Q.jsx)(YE,{size:`small`,danger:!0,loading:C===t.id,onClick:()=>{UG.confirm({title:`确认操作`,icon:(0,Q.jsx)(h2,{}),content:`确定将此记录标记为失败?`,onOk:()=>F(t.id,`failed`)})},children:`标记失败`})]}):null]})}],[k,C]),R=h?O7[h.genType||``]||{text:h.genType||`-`,color:`default`,icon:null}:null,z=h?D7[h.status]||{color:`default`,text:h.status||`-`,icon:null}:null,B=()=>{if(!h||h.genType!==`image`||h.status!==`completed`)return null;if(!h.imageUrl)return(0,Q.jsx)(L7,{text:`此图片任务暂无结果图片`,minHeight:260});if(_.image===`invalid`)return(0,Q.jsx)(L7,{text:I7(h.imageUrl,`图片`),minHeight:260});let e=A7(h.imageUrl);return(0,Q.jsxs)(`div`,{title:`点击新页面查看图片`,onClick:()=>N(h.imageUrl,`生成图片`),style:{position:`relative`,width:`100%`,minHeight:260,borderRadius:12,background:`#f8f9fc`,border:`1px solid #e2e8f0`,overflow:`hidden`,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`},children:[(0,Q.jsx)(`img`,{src:e,alt:`生成图片`,onLoad:()=>j({image:`valid`}),onError:()=>j({image:`invalid`}),style:{display:_.image===`valid`?`block`:`none`,width:`100%`,maxHeight:560,objectFit:`contain`,background:`#fff`}},`${h.id}-${e}`),_.image===`checking`?(0,Q.jsx)(L7,{text:`图片加载检测中...`,minHeight:260}):null]})},V=()=>{if(!h||y||_.video===`invalid`)return null;let e=h.videoUrl?(0,Q.jsx)(YE,{type:`primary`,shape:`circle`,size:`large`,icon:(0,Q.jsx)(J4,{}),onClick:P,style:{boxShadow:`0 8px 20px rgba(15,23,42,0.25)`}}):null;if(!h.videoCoverUrl)return(0,Q.jsx)(`div`,{style:{position:`absolute`,inset:0,borderRadius:12,overflow:`hidden`,background:`#f8f9fc`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,Q.jsx)(L7,{text:`此视频无封面`,minHeight:340,action:e})});if(_.videoCover===`invalid`)return(0,Q.jsx)(L7,{text:I7(h.videoCoverUrl,`视频封面`),minHeight:340,action:e});let t=A7(h.videoCoverUrl);return(0,Q.jsxs)(`div`,{style:{position:`absolute`,inset:0,borderRadius:12,overflow:`hidden`,background:`#f8f9fc`,border:`1px solid #e2e8f0`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:[(0,Q.jsx)(`img`,{src:t,alt:`视频封面`,onLoad:()=>j({videoCover:`valid`}),onError:()=>j({videoCover:`invalid`}),style:{display:_.videoCover===`valid`?`block`:`none`,width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`}},`${h.id}-cover-${t}`),_.videoCover===`checking`?(0,Q.jsx)(L7,{text:`视频封面加载检测中...`,minHeight:340,action:e}):null,_.videoCover===`valid`?(0,Q.jsx)(`div`,{style:{position:`absolute`,inset:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`rgba(15,23,42,0.18)`},children:e}):null]})},H=()=>{if(!h||h.genType!==`video`||h.status!==`completed`)return null;if(!h.videoUrl)return(0,Q.jsx)(L7,{text:`此视频任务暂无结果视频`,minHeight:340});if(_.video===`invalid`)return(0,Q.jsx)(L7,{text:I7(h.videoUrl,`视频`),minHeight:340});let e=A7(h.videoUrl);return(0,Q.jsxs)(`div`,{style:{position:`relative`,width:`100%`,height:340,borderRadius:12,background:`#000`,overflow:`hidden`,border:`1px solid #e2e8f0`},children:[(0,Q.jsx)(`video`,{ref:x,src:e,preload:`metadata`,controls:y,onLoadedMetadata:()=>j({video:`valid`}),onCanPlay:()=>j({video:`valid`}),onPlaying:()=>{b(!0),j({video:`valid`})},onPause:()=>b(!1),onEnded:()=>b(!1),onError:()=>{b(!1),j({video:`invalid`})},style:{width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`,opacity:+!!y,pointerEvents:y?`auto`:`none`}},`${h.id}-${e}`),V()]})},U=(e,t)=>{let n=P7(e),r=Vne(e),i=F7(e,t),a=_.references[i]||N7(n),o=r===`image`,s=r===`video`,c=typeof e.name==`string`&&e.name?e.name:`参考素材 ${t+1}`;if(!n)return(0,Q.jsxs)(`div`,{style:{width:94},children:[(0,Q.jsx)(`div`,{style:{width:94,height:94},children:(0,Q.jsx)(L7,{text:`无链接`,compact:!0})}),(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{display:`block`,marginTop:4,fontSize:11,color:`#94a3b8`},children:c})]},i);if(a===`invalid`)return(0,Q.jsxs)(`div`,{style:{width:94},children:[(0,Q.jsx)(`div`,{style:{width:94,height:94},children:(0,Q.jsx)(L7,{text:k7(n)?`本地临时素材已失效`:`素材不可访问`,compact:!0})}),(0,Q.jsx)(Aw,{title:c,children:(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{display:`block`,marginTop:4,fontSize:11,color:`#94a3b8`},children:c})})]},i);let l=A7(n);return(0,Q.jsxs)(`div`,{style:{width:94},children:[(0,Q.jsxs)(`div`,{role:`button`,tabIndex:0,title:`点击新页面查看素材`,onClick:()=>N(n,s?`视频素材`:o?`图片素材`:`素材`),onKeyDown:e=>{e.key===`Enter`&&N(n,s?`视频素材`:o?`图片素材`:`素材`)},style:{width:94,height:94,borderRadius:10,overflow:`hidden`,border:`1px solid #e2e8f0`,background:`#f8f9fc`,position:`relative`,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`},children:[o?(0,Q.jsx)(`img`,{src:l,alt:c,onLoad:()=>M(i,`valid`),onError:()=>M(i,`invalid`),style:{display:a===`valid`?`block`:`none`,width:`100%`,height:`100%`,objectFit:`cover`}}):null,s?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`video`,{src:l,preload:`metadata`,onLoadedMetadata:()=>M(i,`valid`),onError:()=>M(i,`invalid`),style:{display:`none`}}),(0,Q.jsxs)(`div`,{style:{color:`#64748b`,fontSize:12,textAlign:`center`},children:[(0,Q.jsx)(J4,{style:{fontSize:18}}),(0,Q.jsx)(`div`,{children:`视频素材`}),(0,Q.jsx)(`div`,{style:{fontSize:10,color:`#94a3b8`,marginTop:2},children:`点击查看`})]})]}):null,!o&&!s?(0,Q.jsxs)(`div`,{style:{color:`#64748b`,fontSize:12,textAlign:`center`},children:[`文件素材`,(0,Q.jsx)(`div`,{style:{fontSize:10,color:`#94a3b8`,marginTop:2},children:`点击查看`})]}):null,a===`checking`&&o?(0,Q.jsx)(`div`,{style:{position:`absolute`,inset:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`#f8f9fc`},children:(0,Q.jsx)(xm,{style:{color:`#6366f1`}})}):null]}),(0,Q.jsx)(Aw,{title:c,children:(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{display:`block`,marginTop:4,fontSize:11,color:`#94a3b8`},children:c})})]},i)};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16,flexWrap:`wrap`,gap:12},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(A6,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`生成记录管理`}),(0,Q.jsxs)(IQ,{color:`purple`,children:[n,` 条记录`]})]}),(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(BC,{placeholder:`状态筛选`,allowClear:!0,style:{width:120},value:l||void 0,onChange:e=>{u(e||``),s(1)},options:[{value:`optimizing`,label:`优化中`},{value:`prompt_optimized`,label:`待生成`},{value:`generating`,label:`生成中`},{value:`completed`,label:`已完成`},{value:`failed`,label:`失败`}]}),(0,Q.jsx)(vW,{placeholder:`用户ID搜索`,prefix:(0,Q.jsx)(FC,{style:{color:`#94a3b8`}}),style:{width:200},value:d,onChange:e=>f(e.target.value),onPressEnter:O,allowClear:!0}),(0,Q.jsx)(YE,{type:`primary`,onClick:O,style:{borderRadius:8},children:`搜索`})]})]}),(0,Q.jsx)(CQ,{columns:L,dataSource:e,rowKey:`id`,loading:i,scroll:{x:1120},pagination:{current:o,pageSize:c,total:n,onChange:s,showSizeChanger:!1,showTotal:e=>`共 ${e} 条`}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[h?.genType===`video`?(0,Q.jsx)(A6,{}):(0,Q.jsx)(x2,{}),(0,Q.jsx)(`span`,{children:`生成记录详情`})]}),open:!!h,onCancel:A,footer:null,width:900,destroyOnClose:!0,children:h?(0,Q.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:16,marginTop:16},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,flexWrap:`wrap`},children:[(0,Q.jsxs)(`div`,{style:{flex:1,minWidth:150,padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:`用户`}),(0,Q.jsx)(Z.Text,{strong:!0,children:h.username||`-`})]}),(0,Q.jsxs)(`div`,{style:{flex:1,minWidth:150,padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:`项目`}),(0,Q.jsx)(Z.Text,{strong:!0,children:h.projectName||`-`})]}),(0,Q.jsxs)(`div`,{style:{flex:1,minWidth:150,padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:`类型 / 状态`}),(0,Q.jsxs)(WV,{size:4,wrap:!0,children:[R?(0,Q.jsx)(IQ,{color:R.color,icon:R.icon,children:R.text}):null,z?(0,Q.jsx)(IQ,{color:z.color,icon:z.icon,children:z.text}):null]})]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:`原始提示词`}),(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`,border:`1px solid #f0f0f5`},children:(0,Q.jsx)(Z.Text,{style:{fontSize:13,color:`#475569`,lineHeight:1.7},children:h.originalPrompt||`-`})})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:`优化后提示词`}),(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`rgba(99,102,241,0.02)`,border:`1px solid rgba(99,102,241,0.1)`},children:(0,Q.jsx)(Z.Text,{style:{fontSize:13,color:`#1a1a2e`,lineHeight:1.7},children:h.optimizedPrompt||`-`})})]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(R7,{label:`文字积分`,value:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{color:`#f59e0b`},children:h.textCreditsCost||0}),(0,Q.jsxs)(Z.Text,{style:{fontSize:11,color:`#94a3b8`},children:[` (`,h.textTokensUsed||0,` tokens)`]})]})}),(0,Q.jsx)(R7,{label:`${h.genType===`image`?`图片`:`视频`}积分`,value:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{color:`#6366f1`},children:h.creditsCost||0}),h.genType===`video`&&h.videoTokensUsed?(0,Q.jsxs)(Z.Text,{style:{fontSize:11,color:`#94a3b8`},children:[` (`,h.videoTokensUsed,` tokens)`]}):null,h.genType===`image`&&h.imageTokensUsed?(0,Q.jsxs)(Z.Text,{style:{fontSize:11,color:`#94a3b8`},children:[` (`,h.imageTokensUsed,` tokens)`]}):null]})}),(0,Q.jsx)(R7,{label:`总积分`,value:(h.textCreditsCost||0)+(h.creditsCost||0)})]}),h.genType===`video`?h.duration||h.aspectRatio||h.resolution?(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(R7,{label:`时长`,value:h.duration?`${h.duration}秒`:`-`}),(0,Q.jsx)(R7,{label:`比例`,value:h.aspectRatio||`-`}),(0,Q.jsx)(R7,{label:`分辨率`,value:h.resolution||`-`})]}):(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`,textAlign:`center`},children:(0,Q.jsx)(IQ,{color:`default`,children:`视频参数待用户配置`})}):null,h.genType===`image`?h.imageSize||h.imageProportion||h.imagePx?(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(R7,{label:`尺寸`,value:h.imagePx||`-`}),(0,Q.jsx)(R7,{label:`比例`,value:h.imageProportion||`-`}),(0,Q.jsx)(R7,{label:`分辨率`,value:h.imageSize||`-`})]}):(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`,textAlign:`center`},children:(0,Q.jsx)(IQ,{color:`default`,children:`图片参数待用户配置`})}):null,!h?.references||h.references.length===0?null:(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:`参考内容`}),(0,Q.jsx)(`div`,{style:{display:`flex`,gap:10,flexWrap:`wrap`},children:h.references.map((e,t)=>U(e,t))})]}),h.status===`completed`?(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:h.genType===`video`?`生成视频`:`生成图片`}),h.genType===`video`?H():B()]}):null,h.status===`failed`&&h.errorMessage?(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`rgba(239,68,68,0.04)`,border:`1px solid rgba(239,68,68,0.15)`},children:(0,Q.jsxs)(Z.Text,{style:{fontSize:12,color:`#ef4444`},children:[`错误信息: `,h.errorMessage]})}):null,(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,fontSize:12,color:`#94a3b8`,flexWrap:`wrap`},children:[(0,Q.jsxs)(`span`,{children:[`创建: `,j7(h.createdAt)]}),(0,Q.jsxs)(`span`,{children:[`生成: `,j7(h.generatedAt)]})]})]}):(0,Q.jsx)(hC,{description:`暂无详情`})}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[T&&(T.record.genType===`video`?(0,Q.jsx)(J4,{}):(0,Q.jsx)(x2,{})),T&&(T.record.genType===`video`?`生成视频`:`生成图片`)]}),open:!!T,onCancel:()=>E(null),onOk:I,okText:`提交生成`,cancelText:`取消`,confirmLoading:T?C===T.record.id:!1,width:420,children:T?(0,Q.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:16,marginTop:16},children:T.record.genType===`video`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:`时长`}),(0,Q.jsxs)(Z.Text,{strong:!0,children:[T.record.duration||5,`s`]})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#64748b`,display:`block`,marginBottom:6},children:`画面比例`}),(0,Q.jsx)(BC,{value:T.ratio,onChange:e=>E(t=>t?{...t,ratio:e}:null),style:{width:`100%`},options:[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`].map(e=>({value:e,label:e}))})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#64748b`,display:`block`,marginBottom:6},children:`分辨率`}),(0,Q.jsx)(BC,{value:T.resolution,onChange:e=>E(t=>t?{...t,resolution:e}:null),style:{width:`100%`},options:[`480p`,`720p`,`1080p`].map(e=>({value:e,label:e}))})]})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:`尺寸`}),(0,Q.jsx)(Z.Text,{strong:!0,children:T.record.imagePx||`-`})]}),(0,Q.jsxs)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:`比例`}),(0,Q.jsx)(Z.Text,{strong:!0,children:T.record.imageProportion||`-`})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#64748b`,display:`block`,marginBottom:6},children:`分辨率`}),(0,Q.jsx)(BC,{value:T.image_size,onChange:e=>E(t=>t?{...t,image_size:e}:null),style:{width:`100%`},options:[`2K`,`4K`].map(e=>({value:e,label:e}))})]})]})}):null})]})},z7=`http://ceshi.apiforeign.minzhong.cn`.replace(/\/api\/?$/i,``).replace(/\/$/,``),B7=20,V7={image:`empty`,video:`empty`,videoCover:`empty`,references:{}},H7={pending:{color:`default`,text:`待处理`,icon:(0,Q.jsx)(GB,{})},generating:{color:`warning`,text:`生成中`,icon:(0,Q.jsx)(xm,{spin:!0})},completed:{color:`success`,text:`已完成`,icon:(0,Q.jsx)(I0,{})},failed:{color:`error`,text:`失败`,icon:(0,Q.jsx)(z0,{})}},U7={timeout:`任务超时`,queued:`已入队`,preparing:`准备中`,creating_provider_task:`创建任务中`,waiting_remote:`等待生成`,result_ready:`结果就绪`,downloading:`下载中`,done:`完成`,download_failed:`下载失败`,polling:`轮询中`,failed:`失败`},W7={image:{text:`图片`,color:`purple`,icon:(0,Q.jsx)(x2,{})},video:{text:`视频`,color:`geekblue`,icon:(0,Q.jsx)(A6,{})}},Une=e=>/^(https?:)?\/\//i.test(e)||/^(blob|data):/i.test(e),G7=e=>!!e&&/^blob:/i.test(e.trim()),K7=e=>{if(!e)return``;let t=String(e).trim();return t?Une(t)?t:z7?`${z7}${t.startsWith(`/`)?t:`/${t}`}`:t.startsWith(`/`)?t:`/${t}`:``},Wne=e=>e?e.length>12?`${e.slice(0,8)}...`:e:`-`,q7=e=>e?Z5(e):`-`,Gne=e=>e==null||e===``,J7=e=>{if(!e||G7(e))return!1;try{let t=new URL(K7(e),window.location.origin),n=t.searchParams.get(`exp`)||t.searchParams.get(`expires`)||t.searchParams.get(`expire`)||t.searchParams.get(`expires_at`)||t.searchParams.get(`x-expires`);if(!n)return!1;let r=Number(n);if(!Number.isFinite(r))return!1;let i=r>1e10?r:r*1e3;return Date.now()>=i}catch{return!1}},Y7=e=>e?G7(e)||J7(e)?`invalid`:`checking`:`empty`,X7=e=>{let t=e.url||e.mediaUrl||e.fileUrl;return typeof t==`string`&&t.trim()?t.trim():void 0},Kne=e=>{let t=String(e.type||e.mediaType||e.mimeType||``).toLowerCase(),n=X7(e)?.toLowerCase()||``;return t.includes(`video`)||/\.(mp4|mov|webm|m4v)(\?|$)/i.test(n)?`video`:t.includes(`image`)||/\.(png|jpe?g|webp|gif|bmp|svg)(\?|$)/i.test(n)?`image`:t||`unknown`},Z7=(e,t)=>`${t}-${X7(e)||`empty`}`,Q7=(e,t=`资源`)=>G7(e)?`本地临时素材已失效`:J7(e)?`${t}链接已超时,请刷新列表或重新搜索后再查看`:`${t}加载失败,请刷新列表或重新搜索后再查看`,$7=({text:e,minHeight:t=240,compact:n=!1,action:r})=>(0,Q.jsxs)(`div`,{style:{width:`100%`,minHeight:n?void 0:t,height:n?`100%`:void 0,borderRadius:n?10:12,background:`#f8f9fc`,border:`1px dashed #cbd5e1`,color:`#64748b`,display:`flex`,alignItems:`center`,justifyContent:`center`,flexDirection:`column`,gap:n?4:10,textAlign:`center`},children:[(0,Q.jsx)(Z.Text,{style:{color:`#64748b`,fontSize:n?11:13},children:e}),r]}),e9=({label:e,value:t})=>(0,Q.jsxs)(`div`,{style:{flex:1,minWidth:120},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:11,color:`#94a3b8`,display:`block`},children:e}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:14},children:Gne(t)?`-`:t})]}),qne=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)(0),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(1),[c,l]=(0,S.useState)(``),[u,d]=(0,S.useState)(``),[f,p]=(0,S.useState)(``),[m,h]=(0,S.useState)(``),[g,_]=(0,S.useState)(``),[v,y]=(0,S.useState)(``),[b,x]=(0,S.useState)(0),[C,w]=(0,S.useState)(null),[T,E]=(0,S.useState)(V7),[D,O]=(0,S.useState)(!1),k=(0,S.useRef)(null),A=(0,S.useCallback)(async()=>{a(!0);try{let e=await g5({genType:u||void 0,status:c||void 0,userId:g||void 0,userName:v||void 0,page:o,pageSize:B7});t(e.items||[]),r(e.total||0)}catch(e){BG.error(e?.message||`加载创作记录失败`)}finally{a(!1)}},[u,c,o,g,v]);(0,S.useEffect)(()=>{A()},[A,b]),(0,S.useEffect)(()=>{if(!C){E(V7);return}let e=(C.mediaReferences||[]).reduce((e,t,n)=>{let r=X7(t);return e[Z7(t,n)]=Y7(r),e},{});k.current&&(k.current.pause(),k.current.currentTime=0),O(!1),E({image:Y7(C.imageUrl),video:Y7(C.videoUrl),videoCover:Y7(C.videoCoverUrl),references:e})},[C]);let j=()=>{s(1),_(f.trim()),y(m.trim()),x(e=>e+1)},M=(0,S.useCallback)(e=>{w(e)},[]),N=()=>{k.current&&k.current.pause(),O(!1),w(null)},P=e=>{E(t=>({...t,...e}))},F=(e,t)=>{E(n=>({...n,references:{...n.references,[e]:t}}))},I=()=>{if(C?.videoUrl){if(J7(C.videoUrl)){P({video:`invalid`}),BG.warning(`视频链接已超时,请刷新列表或重新搜索后再查看`);return}O(!0),window.setTimeout(()=>{k.current?.play().catch(()=>{O(!1),P({video:`invalid`}),BG.warning(`视频播放失败,请确认资源链接是否仍然有效`)})},0)}},L=(e,t=`素材`)=>{if(!e){BG.warning(`${t}链接为空,暂无法查看`);return}if(G7(e)){BG.warning(`本地临时素材已失效,暂无法查看`);return}if(J7(e)){BG.warning(`${t}链接已超时,请刷新列表或重新搜索后再查看`);return}window.open(K7(e),`_blank`,`noopener,noreferrer`)},R=(0,S.useMemo)(()=>[{title:`用户`,key:`user`,width:150,render:(e,t)=>(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:13},children:t.userName||`未知用户`}),(0,Q.jsx)(`div`,{style:{fontSize:11,color:`#94a3b8`},children:Wne(t.userId)})]})},{title:`类型`,dataIndex:`genType`,width:90,render:e=>{let t=W7[e]||{text:e||`-`,color:`default`,icon:null};return(0,Q.jsx)(IQ,{color:t.color,icon:t.icon,children:t.text})}},{title:`提示词`,key:`prompt`,ellipsis:!0,render:(e,t)=>(0,Q.jsx)(Aw,{title:t.originalPrompt,placement:`topLeft`,children:(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#475569`},ellipsis:!0,children:t.originalPrompt||`-`})})},{title:`参数`,key:`params`,width:180,render:(e,t)=>t.genType===`video`?t.duration||t.aspectRatio||t.resolution?(0,Q.jsxs)(WV,{size:4,wrap:!0,children:[t.duration?(0,Q.jsxs)(IQ,{children:[t.duration,`s`]}):null,t.aspectRatio?(0,Q.jsx)(IQ,{children:t.aspectRatio}):null,t.resolution?(0,Q.jsx)(IQ,{children:t.resolution}):null]}):(0,Q.jsx)(IQ,{color:`default`,children:`无参数`}):t.imageSize||t.imageProportion||t.imagePx?(0,Q.jsxs)(WV,{size:4,wrap:!0,children:[t.imageSize?(0,Q.jsx)(IQ,{children:t.imageSize}):null,t.imageProportion?(0,Q.jsx)(IQ,{children:t.imageProportion}):null,t.imagePx?(0,Q.jsx)(IQ,{children:t.imagePx}):null]}):(0,Q.jsx)(IQ,{color:`default`,children:`无参数`})},{title:`积分`,key:`credits`,width:130,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{fontSize:12},children:[(0,Q.jsxs)(`div`,{style:{color:`#6366f1`},children:[`总: `,t.creditsCost||0]}),t.textCreditsCost>0?(0,Q.jsxs)(`div`,{style:{color:`#f59e0b`},children:[`文字: `,t.textCreditsCost]}):null]})},{title:`状态`,dataIndex:`status`,width:100,render:e=>{let t=H7[e]||{color:`default`,text:e||`-`,icon:null};return(0,Q.jsx)(IQ,{color:t.color,icon:t.icon,children:t.text})}},{title:`阶段`,dataIndex:`pipelineStage`,width:120,render:e=>(0,Q.jsx)(IQ,{color:`blue`,children:U7[e]||e||`-`})},{title:`时间`,key:`time`,width:170,render:(e,t)=>(0,Q.jsxs)(`div`,{style:{fontSize:12,color:`#94a3b8`},children:[(0,Q.jsx)(`div`,{children:q7(t.createdAt)}),t.generatedAt?(0,Q.jsxs)(`div`,{style:{color:`#10b981`},children:[`生成: `,q7(t.generatedAt)]}):null]})},{title:`操作`,key:`action`,width:90,fixed:`right`,render:(e,t)=>(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(XU,{}),onClick:()=>M(t),children:`详情`})}],[M]),z=C?W7[C.genType]||{text:C.genType||`-`,color:`default`,icon:null}:null,B=C?H7[C.status]||{color:`default`,text:C.status||`-`,icon:null}:null,V=()=>{if(!C||C.genType!==`image`||C.status!==`completed`)return null;if(!C.imageUrl)return(0,Q.jsx)($7,{text:`此图片任务暂无结果图片`,minHeight:260});if(T.image===`invalid`)return(0,Q.jsx)($7,{text:Q7(C.imageUrl,`图片`),minHeight:260});let e=K7(C.imageUrl);return(0,Q.jsxs)(`div`,{style:{position:`relative`,width:`100%`,minHeight:260,borderRadius:12,background:`#f8f9fc`,border:`1px solid #e2e8f0`,overflow:`hidden`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:[(0,Q.jsx)(`img`,{src:e,alt:`生成图片`,onLoad:()=>P({image:`valid`}),onError:()=>P({image:`invalid`}),style:{display:T.image===`valid`?`block`:`none`,width:`100%`,maxHeight:560,objectFit:`contain`,background:`#fff`}},`${C.id}-${e}`),T.image===`checking`?(0,Q.jsx)($7,{text:`图片加载检测中...`,minHeight:260}):null]})},H=()=>{if(!C||D||T.video===`invalid`)return null;let e=C.videoUrl?(0,Q.jsx)(YE,{type:`primary`,shape:`circle`,size:`large`,icon:(0,Q.jsx)(J4,{}),onClick:I,style:{boxShadow:`0 8px 20px rgba(15,23,42,0.25)`}}):null;if(!C.videoCoverUrl)return(0,Q.jsx)(`div`,{style:{position:`absolute`,inset:0,borderRadius:12,overflow:`hidden`,background:`#f8f9fc`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,Q.jsx)($7,{text:`此视频无封面`,minHeight:340,action:e})});if(T.videoCover===`invalid`)return(0,Q.jsx)($7,{text:Q7(C.videoCoverUrl,`视频封面`),minHeight:340,action:e});let t=K7(C.videoCoverUrl);return(0,Q.jsxs)(`div`,{style:{position:`absolute`,inset:0,borderRadius:12,overflow:`hidden`,background:`#f8f9fc`,border:`1px solid #e2e8f0`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:[(0,Q.jsx)(`img`,{src:t,alt:`视频封面`,onLoad:()=>P({videoCover:`valid`}),onError:()=>P({videoCover:`invalid`}),style:{display:T.videoCover===`valid`?`block`:`none`,width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`}},`${C.id}-cover-${t}`),T.videoCover===`checking`?(0,Q.jsx)($7,{text:`视频封面加载检测中...`,minHeight:340,action:e}):null,T.videoCover===`valid`?(0,Q.jsx)(`div`,{style:{position:`absolute`,inset:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`rgba(15,23,42,0.18)`},children:e}):null]})},U=()=>{if(!C||C.genType!==`video`||C.status!==`completed`)return null;if(!C.videoUrl)return(0,Q.jsx)($7,{text:`此视频任务暂无结果视频`,minHeight:340});if(T.video===`invalid`)return(0,Q.jsx)($7,{text:Q7(C.videoUrl,`视频`),minHeight:340});let e=K7(C.videoUrl);return(0,Q.jsxs)(`div`,{style:{position:`relative`,width:`100%`,height:340,borderRadius:12,background:`#000`,overflow:`hidden`,border:`1px solid #e2e8f0`},children:[(0,Q.jsx)(`video`,{ref:k,src:e,preload:`metadata`,controls:D,onLoadedMetadata:()=>P({video:`valid`}),onCanPlay:()=>P({video:`valid`}),onPlaying:()=>{O(!0),P({video:`valid`})},onPause:()=>O(!1),onEnded:()=>O(!1),onError:()=>{O(!1),P({video:`invalid`})},style:{width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`,opacity:+!!D,pointerEvents:D?`auto`:`none`}},`${C.id}-${e}`),H()]})},W=(e,t)=>{let n=X7(e),r=Kne(e),i=Z7(e,t),a=T.references[i]||Y7(n),o=r===`image`,s=r===`video`,c=typeof e.name==`string`&&e.name?e.name:`参考素材 ${t+1}`;if(!n)return(0,Q.jsxs)(`div`,{style:{width:94},children:[(0,Q.jsx)(`div`,{style:{width:94,height:94},children:(0,Q.jsx)($7,{text:`无链接`,compact:!0})}),(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{display:`block`,marginTop:4,fontSize:11,color:`#94a3b8`},children:c})]},i);if(a===`invalid`)return(0,Q.jsxs)(`div`,{style:{width:94},children:[(0,Q.jsx)(`div`,{style:{width:94,height:94},children:(0,Q.jsx)($7,{text:G7(n)?`本地临时素材已失效`:`素材不可访问`,compact:!0})}),(0,Q.jsx)(Aw,{title:c,children:(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{display:`block`,marginTop:4,fontSize:11,color:`#94a3b8`},children:c})})]},i);let l=K7(n);return(0,Q.jsxs)(`div`,{style:{width:94},children:[(0,Q.jsxs)(`div`,{role:`button`,tabIndex:0,title:`点击新页面查看素材`,onClick:()=>L(n,s?`视频素材`:o?`图片素材`:`素材`),onKeyDown:e=>{e.key===`Enter`&&L(n,s?`视频素材`:o?`图片素材`:`素材`)},style:{width:94,height:94,borderRadius:10,overflow:`hidden`,border:`1px solid #e2e8f0`,background:`#f8f9fc`,position:`relative`,display:`flex`,alignItems:`center`,justifyContent:`center`,cursor:`pointer`},children:[o?(0,Q.jsx)(`img`,{src:l,alt:c,onLoad:()=>F(i,`valid`),onError:()=>F(i,`invalid`),style:{display:a===`valid`?`block`:`none`,width:`100%`,height:`100%`,objectFit:`cover`}}):null,s?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`video`,{src:l,preload:`metadata`,onLoadedMetadata:()=>F(i,`valid`),onError:()=>F(i,`invalid`),style:{display:`none`}}),(0,Q.jsxs)(`div`,{style:{color:`#64748b`,fontSize:12,textAlign:`center`},children:[(0,Q.jsx)(J4,{style:{fontSize:18}}),(0,Q.jsx)(`div`,{children:`视频素材`}),(0,Q.jsx)(`div`,{style:{fontSize:10,color:`#94a3b8`,marginTop:2},children:`点击查看`})]})]}):null,!o&&!s?(0,Q.jsxs)(`div`,{style:{color:`#64748b`,fontSize:12,textAlign:`center`},children:[`文件素材`,(0,Q.jsx)(`div`,{style:{fontSize:10,color:`#94a3b8`,marginTop:2},children:`点击查看`})]}):null,a===`checking`&&o?(0,Q.jsx)(`div`,{style:{position:`absolute`,inset:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`#f8f9fc`},children:(0,Q.jsx)(xm,{style:{color:`#6366f1`}})}):null]}),(0,Q.jsx)(Aw,{title:c,children:(0,Q.jsx)(Z.Text,{ellipsis:!0,style:{display:`block`,marginTop:4,fontSize:11,color:`#94a3b8`},children:c})})]},i)};return(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(LR,{bordered:!1,style:{borderRadius:12,border:`1px solid #f0f0f5`},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,marginBottom:16,flexWrap:`wrap`,gap:12},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J4,{style:{fontSize:18,color:`#6366f1`}}),(0,Q.jsx)(Z.Text,{strong:!0,style:{fontSize:16},children:`创作记录管理`}),(0,Q.jsxs)(IQ,{color:`purple`,children:[n,` 条记录`]})]}),(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(BC,{allowClear:!0,placeholder:`状态筛选`,value:c||void 0,style:{width:140},onChange:e=>{l(e||``),s(1)},options:[{value:`generating`,label:`生成中`},{value:`completed`,label:`已完成`},{value:`failed`,label:`失败`}]}),(0,Q.jsx)(BC,{allowClear:!0,placeholder:`类型筛选`,value:u||void 0,style:{width:120},onChange:e=>{d(e||``),s(1)},options:[{value:`image`,label:`图片`},{value:`video`,label:`视频`}]}),(0,Q.jsx)(vW,{placeholder:`用户ID搜索`,prefix:(0,Q.jsx)(FC,{style:{color:`#94a3b8`}}),style:{width:180},value:f,onChange:e=>p(e.target.value),onPressEnter:j,allowClear:!0}),(0,Q.jsx)(vW,{placeholder:`用户名搜索`,prefix:(0,Q.jsx)(FC,{style:{color:`#94a3b8`}}),style:{width:160},value:m,onChange:e=>h(e.target.value),onPressEnter:j,allowClear:!0}),(0,Q.jsx)(YE,{type:`primary`,onClick:j,style:{borderRadius:8},children:`搜索`})]})]}),(0,Q.jsx)(CQ,{rowKey:`id`,loading:i,columns:R,dataSource:e,scroll:{x:1180},pagination:{current:o,pageSize:B7,total:n,showSizeChanger:!1,showTotal:e=>`共 ${e} 条`,onChange:e=>s(e)}})]}),(0,Q.jsx)(UG,{title:(0,Q.jsxs)(WV,{children:[C?.genType===`video`?(0,Q.jsx)(A6,{}):(0,Q.jsx)(x2,{}),(0,Q.jsx)(`span`,{children:`创作记录详情`})]}),open:!!C,onCancel:N,footer:null,width:900,destroyOnClose:!0,children:C?(0,Q.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:16,marginTop:12},children:[(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:12,flexWrap:`wrap`},children:[z?(0,Q.jsx)(IQ,{color:z.color,icon:z.icon,children:z.text}):null,B?(0,Q.jsx)(IQ,{color:B.color,icon:B.icon,children:B.text}):null,C.pipelineStage?(0,Q.jsx)(IQ,{color:`blue`,children:U7[C.pipelineStage]||C.pipelineStage}):null]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(e9,{label:`用户名称`,value:C.userName||`未知用户`}),(0,Q.jsx)(e9,{label:`用户ID`,value:C.userId||`-`}),(0,Q.jsx)(e9,{label:`任务ID`,value:C.id})]}),(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:`原始提示词`}),(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`,lineHeight:1.6},children:C.originalPrompt||`-`})]}),C.genType===`video`?(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(e9,{label:`时长`,value:C.duration?`${C.duration}秒`:`-`}),(0,Q.jsx)(e9,{label:`画面比例`,value:C.aspectRatio||`-`}),(0,Q.jsx)(e9,{label:`分辨率`,value:C.resolution||`-`})]}):(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(e9,{label:`图片档位`,value:C.imageSize||`-`}),(0,Q.jsx)(e9,{label:`图片比例`,value:C.imageProportion||`-`}),(0,Q.jsx)(e9,{label:`像素尺寸`,value:C.imagePx||`-`})]}),C.engineSnapshot?(0,Q.jsxs)(`div`,{style:{padding:12,borderRadius:10,background:`#f8f9fc`},children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:8},children:`引擎快照`}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,flexWrap:`wrap`},children:[(0,Q.jsx)(e9,{label:`引擎名称`,value:C.engineSnapshot.name||`-`}),(0,Q.jsx)(e9,{label:`服务商`,value:C.engineSnapshot.provider||`-`}),(0,Q.jsx)(e9,{label:`模型`,value:C.engineSnapshot.modelName||`-`}),(0,Q.jsx)(e9,{label:`引擎ID`,value:C.engineSnapshot.id||C.engineId||`-`})]})]}):null,(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(e9,{label:`总积分`,value:(0,Q.jsx)(Z.Text,{strong:!0,style:{color:`#6366f1`},children:C.creditsCost||0})}),(0,Q.jsx)(e9,{label:`文字积分`,value:`${C.textCreditsCost||0} (${C.textTokensUsed||0} tokens)`}),(0,Q.jsx)(e9,{label:`图片 tokens`,value:C.imageTokensUsed??0}),(0,Q.jsx)(e9,{label:`视频 tokens`,value:C.videoTokensUsed??0})]}),(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,padding:12,borderRadius:10,background:`#f8f9fc`,flexWrap:`wrap`},children:[(0,Q.jsx)(e9,{label:`第三方任务ID`,value:C.providerTaskId||C.seedanceTaskId||`-`}),(0,Q.jsx)(e9,{label:`轮询次数`,value:C.pollCount??0}),(0,Q.jsx)(e9,{label:`重试次数`,value:C.retryCount??0})]}),!C?.mediaReferences||C.mediaReferences.length===0?null:(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:`参考内容`}),(0,Q.jsx)(`div`,{style:{display:`flex`,gap:10,flexWrap:`wrap`},children:C.mediaReferences.map((e,t)=>W(e,t))})]}),C.status===`completed`?(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Text,{style:{fontSize:12,color:`#94a3b8`,display:`block`,marginBottom:6},children:C.genType===`video`?`生成视频`:`生成图片`}),C.genType===`video`?U():V()]}):null,C.status===`failed`&&C.errorMessage?(0,Q.jsx)(`div`,{style:{padding:12,borderRadius:10,background:`rgba(239,68,68,0.04)`,border:`1px solid rgba(239,68,68,0.15)`},children:(0,Q.jsxs)(Z.Text,{style:{fontSize:12,color:`#ef4444`},children:[`错误信息: `,C.errorMessage]})}):null,(0,Q.jsxs)(`div`,{style:{display:`flex`,gap:16,fontSize:12,color:`#94a3b8`,flexWrap:`wrap`},children:[(0,Q.jsxs)(`span`,{children:[`创建: `,q7(C.createdAt)]}),(0,Q.jsxs)(`span`,{children:[`生成: `,q7(C.generatedAt)]})]})]}):(0,Q.jsx)(hC,{description:`暂无详情`})})]})},t9=20,Jne=[{value:`pending`,label:`已创建`},{value:`waiting_user`,label:`等待用户操作`},{value:`processing`,label:`处理中`},{value:`completed`,label:`已完成`},{value:`failed`,label:`失败`},{value:`cancelled`,label:`已取消`}],Yne={pending:{color:`default`,text:`已创建`},waiting_user:{color:`processing`,text:`等待用户操作`},processing:{color:`warning`,text:`处理中`},completed:{color:`success`,text:`已完成`},failed:{color:`error`,text:`失败`},cancelled:{color:`default`,text:`已取消`}},Xne={material_input:`素材输入`,image_prompt_optimize:`图片 AI 提词`,image_generate:`图片生成`,video_prompt_optimize:`视频 AI 提词`,video_generate:`视频生成`},n9=e=>e?Z5(e):`-`,r9=e=>e?e.length>16?`${e.slice(0,10)}...`:e:`-`,Zne=({status:e})=>{if(!e)return(0,Q.jsx)(IQ,{children:`-`});let t=Yne[e]||{color:`blue`,text:e};return(0,Q.jsx)(IQ,{color:t.color,children:t.text})},Qne=()=>{let e=Ye(),[t,n]=(0,S.useState)([]),[r,i]=(0,S.useState)(0),[a,o]=(0,S.useState)(!1),[s,c]=(0,S.useState)(1),[l,u]=(0,S.useState)(``),[d,f]=(0,S.useState)(``),[p,m]=(0,S.useState)(``),[h,g]=(0,S.useState)(``),[_,v]=(0,S.useState)(null),[y,b]=(0,S.useState)(``),[x,C]=(0,S.useState)(``),[w,T]=(0,S.useState)(``),[E,D]=(0,S.useState)(null),[O,k]=(0,S.useState)(0),A=(0,S.useCallback)(async()=>{o(!0);try{let e=await v5({status:l||void 0,keyword:y||void 0,userId:x||void 0,userName:w||void 0,createdStart:E?.[0]?.toISOString?.(),createdEnd:E?.[1]?.toISOString?.(),page:s,pageSize:t9});n(e.items||[]),i(e.total||0)}catch(e){BG.error(e?.message||`加载爆款开头复刻任务失败`)}finally{o(!1)}},[s,E,y,x,w,l]);(0,S.useEffect)(()=>{A()},[A,O]);let j=()=>{b(d.trim()),C(p.trim()),T(h.trim()),D(_),c(1)};return(0,Q.jsx)(`div`,{style:{padding:24},children:(0,Q.jsx)(LR,{children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(WV,{align:`center`,style:{justifyContent:`space-between`,width:`100%`},children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Title,{level:3,style:{marginBottom:4},children:`爆款开头复刻`}),(0,Q.jsx)(Z.Text,{type:`secondary`,children:`只读排查页面:查看任务列表、素材、步骤详情和生成结果。`})]}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:()=>k(e=>e+1),children:`刷新`})]}),(0,Q.jsxs)(WV,{wrap:!0,children:[(0,Q.jsx)(BC,{allowClear:!0,placeholder:`任务状态`,style:{width:160},value:l||void 0,onChange:e=>{u(e||``),c(1)},options:Jne}),(0,Q.jsx)(vW,{allowClear:!0,prefix:(0,Q.jsx)(FC,{}),placeholder:`关键词:标题/项目名/核心点`,style:{width:260},value:d,onChange:e=>f(e.target.value),onPressEnter:j}),(0,Q.jsx)(vW,{allowClear:!0,placeholder:`用户ID(管理员)`,style:{width:190},value:p,onChange:e=>m(e.target.value),onPressEnter:j}),(0,Q.jsx)(vW,{allowClear:!0,placeholder:`用户名(管理员)`,style:{width:230},value:h,onChange:e=>g(e.target.value),onPressEnter:j}),(0,Q.jsx)(QB.RangePicker,{showTime:!0,value:_,onChange:v,placeholder:[`创建开始`,`创建结束`]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(FC,{}),onClick:j,children:`搜索`}),(0,Q.jsx)(YE,{onClick:()=>{u(``),f(``),m(``),g(``),v(null),b(``),C(``),T(``),D(null),c(1),k(e=>e+1)},children:`重置`})]}),(0,Q.jsx)(CQ,{rowKey:`id`,loading:a,dataSource:t,pagination:{current:s,pageSize:t9,total:r,showSizeChanger:!1,showTotal:e=>`共 ${e} 条`,onChange:c},scroll:{x:1380},columns:[{title:`项目ID`,dataIndex:`id`,width:150,render:e=>(0,Q.jsx)(Aw,{title:e,children:r9(e)})},{title:`用户`,width:180,render:(e,t)=>(0,Q.jsxs)(WV,{direction:`vertical`,size:0,children:[(0,Q.jsx)(Z.Text,{children:t.userName||`-`}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:r9(t.userId)})]})},{title:`项目信息`,width:260,render:(e,t)=>(0,Q.jsxs)(WV,{direction:`vertical`,size:2,children:[(0,Q.jsx)(Z.Text,{strong:!0,children:t.title||t.targetProjectName||`-`}),(0,Q.jsxs)(Z.Text,{type:`secondary`,ellipsis:!0,style:{maxWidth:240},children:[`素材:`,t.sourceProjectName||`-`]}),(0,Q.jsxs)(Z.Text,{type:`secondary`,ellipsis:!0,style:{maxWidth:240},children:[`核心:`,t.coreContentPoint||`-`]})]})},{title:`状态`,dataIndex:`status`,width:130,render:e=>(0,Q.jsx)(Zne,{status:e})},{title:`当前步骤`,dataIndex:`currentStepCode`,width:140,render:e=>Xne[e]||e||`-`},{title:`图片结果`,dataIndex:`finalImageUrl`,width:90,render:e=>e?(0,Q.jsx)(IQ,{color:`success`,children:`有`}):(0,Q.jsx)(IQ,{children:`无`})},{title:`视频结果`,dataIndex:`finalVideoUrl`,width:90,render:e=>e?(0,Q.jsx)(IQ,{color:`success`,children:`有`}):(0,Q.jsx)(IQ,{children:`无`})},{title:`错误信息`,dataIndex:`errorMessage`,width:220,ellipsis:!0,render:e=>e||`-`},{title:`创建时间`,dataIndex:`createdAt`,width:170,render:n9},{title:`更新时间`,dataIndex:`updatedAt`,width:170,render:n9},{title:`操作`,fixed:`right`,width:110,render:(t,n)=>(0,Q.jsx)(YE,{type:`link`,icon:(0,Q.jsx)(XU,{}),onClick:()=>e(`/hot-opening-replications/${n.id}`),children:`详情`})}]})]})})})},i9=({value:e,maxHeight:t=420})=>e==null||e===``?(0,Q.jsx)(hC,{image:hC.PRESENTED_IMAGE_SIMPLE,description:`暂无 JSON 数据`}):(0,Q.jsx)(`pre`,{style:{margin:0,padding:12,maxHeight:t,overflow:`auto`,background:`#0f172a`,color:`#e2e8f0`,borderRadius:8,fontSize:12,lineHeight:1.6},children:JSON.stringify(e,null,2)}),$ne=({input:e,output:t,raw:n,inputLabel:r=`查看 input_json`,outputLabel:i=`查看 output_json`,rawLabel:a=`查看原始 JSON`})=>{let o=[];return e!==void 0&&o.push({key:`input`,label:r,children:(0,Q.jsx)(i9,{value:e})}),t!==void 0&&o.push({key:`output`,label:i,children:(0,Q.jsx)(i9,{value:t})}),n!==void 0&&o.push({key:`raw`,label:a,children:(0,Q.jsx)(i9,{value:n})}),o.length?(0,Q.jsx)(Ng,{size:`small`,style:{marginTop:12},items:o}):null},ere=`http://ceshi.apiforeign.minzhong.cn`.replace(/\/api\/?$/i,``).replace(/\/$/,``);function tre(e){if(!e)return``;let t=String(e).trim();return t?/^(https?:)?\/\//i.test(t)||/^(blob|data):/i.test(t)?t:`${ere}${t.startsWith(`/`)?t:`/${t}`}`:``}var a9=({url:e,type:t,height:n=260,emptyDescription:r=`暂无资源`,errorDescription:i=`资源加载失败,可能文件不存在、签名过期或访问权限受限。`})=>{let a=(0,S.useMemo)(()=>tre(e),[e]),[o,s]=(0,S.useState)(!1);(0,S.useEffect)(()=>{s(!1)},[a]);let c=a?(0,Q.jsxs)(WV,{wrap:!0,style:{marginTop:8},children:[(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(d$,{}),onClick:async()=>{if(a)try{await navigator.clipboard.writeText(a),BG.success(`资源地址已复制`)}catch{BG.error(`复制失败,请手动复制`)}},children:`复制地址`}),(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(l4,{}),onClick:()=>window.open(a,`_blank`,`noopener,noreferrer`),children:`新窗口打开`}),(0,Q.jsx)(Z.Text,{copyable:{text:a},type:`secondary`,style:{maxWidth:460},ellipsis:!0,children:a})]}):null;return a?(0,Q.jsxs)(`div`,{children:[o?(0,Q.jsx)(sf,{type:`warning`,showIcon:!0,message:`资源预览失败`,description:i,style:{marginBottom:8}}):null,t===`image`?(0,Q.jsx)(LU,{src:a,onError:()=>s(!0),style:{width:`100%`,maxHeight:n,objectFit:`contain`,borderRadius:12,background:`#f8fafc`,border:`1px solid #f1f5f9`},fallback:``,preview:!o}):(0,Q.jsx)(`video`,{src:a,controls:!0,preload:`metadata`,onError:()=>s(!0),style:{width:`100%`,maxHeight:n,borderRadius:12,background:`#0f172a`,border:`1px solid #f1f5f9`}}),c]}):(0,Q.jsx)(`div`,{children:(0,Q.jsx)(`div`,{style:{height:n,borderRadius:12,border:`1px dashed #cbd5e1`,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`#f8fafc`},children:(0,Q.jsx)(hC,{image:hC.PRESENTED_IMAGE_SIMPLE,description:r})})})},o9={pending:{text:`待处理`,color:`default`},waiting_user:{text:`等待用户操作`,color:`processing`},processing:{text:`处理中`,color:`warning`},completed:{text:`已完成`,color:`success`},failed:{text:`失败`,color:`error`},cancelled:{text:`已取消`,color:`default`},canceled:{text:`已取消`,color:`default`},timeout:{text:`已超时`,color:`error`},queued:{text:`已入队`,color:`processing`},preparing:{text:`准备中`,color:`processing`},creating_provider_task:{text:`创建远端任务`,color:`processing`},waiting_remote:{text:`等待远端结果`,color:`processing`},polling:{text:`轮询远端结果`,color:`processing`},result_ready:{text:`结果已就绪`,color:`success`},downloading:{text:`下载中`,color:`processing`},done:{text:`已完成`,color:`success`},download_failed:{text:`下载失败`,color:`error`},retry_waiting:{text:`等待重试`,color:`orange`},pending_analysis:{text:`等待分析`,color:`default`},analyzing:{text:`分析中`,color:`processing`},analysis_completed:{text:`分析完成`,color:`success`},analysis_failed:{text:`分析失败`,color:`error`},splitting:{text:`拆镜中`,color:`warning`},split_completed:{text:`拆镜完成`,color:`success`},partial_failed:{text:`部分失败`,color:`orange`},none:{text:`未拆镜`,color:`default`},not_required:{text:`无需处理`,color:`default`},not_started:{text:`未开始`,color:`default`},project_created:{text:`已创建项目`,color:`processing`},true:{text:`是`,color:`success`},false:{text:`否`,color:`default`}},s9={material_input:`素材输入`,image_prompt_optimize:`图片 AI 提词`,image_generate:`图片生成`,video_prompt_optimize:`视频 AI 提词`,video_generate:`视频生成`},c9={hot_opening_replicate:`爆款开头复刻`,shot_replicate:`拆镜复刻`},l9={ai_suggestion:{text:`AI 建议`,color:`purple`},custom:{text:`自定义`,color:`cyan`},original:{text:`原视频`,color:`blue`}};function u9(e){return e?c9[e]||e:`-`}function d9(e){return e?s9[e]||e:`-`}function nre(e){return e?o9[e]?.text||s9[e]||c9[e]||l9[e]?.text||e:`-`}function rre(e){return e?o9[e]?.color||l9[e]?.color||`blue`:`default`}var f9=({status:e,tooltipRaw:t=!0})=>{if(e==null||e===``)return(0,Q.jsx)(IQ,{children:`-`});let n=String(e),r=nre(n),i=(0,Q.jsx)(IQ,{color:rre(n),children:r});return!t||r===n?i:(0,Q.jsx)(Aw,{title:n,children:i})};function p9(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function m9(e,...t){for(let n of t){let t=e[n];if(t!=null&&String(t).trim()!==``)return String(t)}return``}function h9(e,t,...n){for(let t of n){let n=e[t];if(n===!0||n===!1)return n;if(n===`true`)return!0;if(n===`false`)return!1}return t}function ire(e,...t){for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t)&&t>0)return t;if(typeof t==`string`&&t.trim()){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}}}function g9(e){if(!p9(e))return null;let t=m9(e,`key`);return t?{key:t,label:m9(e,`label`)||t,type:m9(e,`type`)||void 0,enabled:h9(e,!0,`enabled`),editable:h9(e,!0,`editable`),maxLength:ire(e,`maxLength`,`max_length`)}:null}function _9(e){if(!p9(e))return null;let t=e.data;return p9(t)?t:Array.isArray(e.sections)?e:null}function are(e){return!!_9(e)}function ore(e){let t=_9(e);return(Array.isArray(t?.sections)?t.sections:[]).map(e=>{let t=g9(e);if(!t||!p9(e))return null;let n=Array.isArray(e.children)?e.children.map(g9).filter(Boolean):[],r=Array.isArray(e.itemFields)?e.itemFields.map(g9).filter(Boolean):Array.isArray(e.item_fields)?e.item_fields.map(g9).filter(Boolean):[];return{...t,contentKey:m9(e,`contentKey`,`content_key`)||void 0,children:n,itemFields:r}}).filter(e=>!!e&&e.enabled)}function sre(e){return p9(e)?Object.entries(e).filter(([e])=>![`schemaVersion`,`schemaUsage`,`schema_version`,`schema_usage`].includes(e)).map(([e,t])=>Array.isArray(t)&&t.every(p9)?{key:e,label:e,type:`flow`,enabled:!0,editable:!1,itemFields:Array.from(new Set(t.flatMap(e=>Object.keys(e)))).filter(e=>e!==`时间段`).map(e=>({key:e,label:e,enabled:!0,editable:!1})),children:[]}:p9(t)?{key:e,label:e,type:`object`,enabled:!0,editable:!1,children:Object.keys(t).map(e=>({key:e,label:e,enabled:!0,editable:!1})),itemFields:[]}:{key:e,label:e,type:`text`,enabled:!0,editable:!1,children:[],itemFields:[]}):[]}var v9=e=>!!e&&typeof e==`object`&&!Array.isArray(e),y9=e=>typeof e==`string`&&e.length>80,b9=e=>e==null||e===``?(0,Q.jsx)(Z.Text,{type:`secondary`,children:`-`}):typeof e==`boolean`?e?`是`:`否`:typeof e==`number`?e:typeof e==`string`?(0,Q.jsx)(Z.Paragraph,{style:{marginBottom:0,whiteSpace:`pre-wrap`},children:e}):(0,Q.jsx)(i9,{value:e,maxHeight:220}),x9=e=>e?(0,Q.jsx)(IQ,{color:`processing`,children:`可编辑`}):(0,Q.jsx)(IQ,{color:`default`,children:`只读`}),S9=(e,t)=>e[t],cre=(e,t)=>{let n=S9(e,t.key);if(!v9(n))return(0,Q.jsx)(i9,{value:n??{},maxHeight:220});let r=t.children.filter(e=>e.enabled);return r.length?(0,Q.jsx)(fV,{size:`small`,column:2,bordered:!0,children:r.map(e=>(0,Q.jsx)(fV.Item,{label:(0,Q.jsxs)(WV,{size:4,children:[e.label,x9(e.editable)]}),span:y9(n[e.key])||v9(n[e.key])||Array.isArray(n[e.key])?2:1,children:b9(n[e.key])},e.key))}):(0,Q.jsx)(i9,{value:n,maxHeight:220})},lre=(e,t)=>{let n=e.itemFields.filter(e=>e.enabled);return n.length?[{key:`时间段`,label:`时间段`,enabled:!0,editable:!1},...n]:Array.from(new Set(t.flatMap(e=>Object.keys(e)))).map(e=>({key:e,label:e,enabled:!0,editable:!1}))},ure=(e,t)=>{let n=S9(e,t.key);if(!Array.isArray(n)||!n.every(v9))return(0,Q.jsx)(i9,{value:n??[],maxHeight:260});let r=n,i=lre(t,r);return(0,Q.jsx)(CQ,{size:`small`,rowKey:(e,n)=>`${t.key}-${n}`,columns:i.map(e=>({title:(0,Q.jsxs)(WV,{size:4,children:[e.label,x9(e.editable)]}),dataIndex:e.key,key:e.key,width:y9(r.find(t=>t[e.key])?.[e.key])?320:160,render:e=>b9(e)})),dataSource:r,pagination:!1,scroll:{x:Math.max(900,i.length*180)},tableLayout:`fixed`})},dre=(e,t)=>b9(S9(e,t.key)),fre=({schema:e,finalPrompt:t,schemaConfigSnapshot:n,schemaConfigSource:r,schemaConfigVersion:i,schemaConfigIsFallback:a})=>{let o=!!e&&Object.keys(e).length>0;if(!o&&!t)return(0,Q.jsx)(hC,{description:`暂无视频提词 schema`});let s=o?e:{},c=are(n),l=(c?ore(n):sre(s)).filter(e=>e.key in s).map(e=>({key:e.key,label:(0,Q.jsxs)(WV,{size:8,wrap:!0,children:[(0,Q.jsx)(`span`,{children:e.label}),x9(e.editable),c?null:(0,Q.jsx)(IQ,{color:`warning`,children:`管理后台兜底展示`})]}),children:e.type===`object`?cre(s,e):e.type===`flow`?ure(s,e):dre(s,e)}));return(0,Q.jsxs)(WV,{direction:`vertical`,size:12,style:{width:`100%`},children:[(0,Q.jsx)(LR,{size:`small`,title:`Schema 配置来源`,children:(0,Q.jsxs)(fV,{size:`small`,column:3,bordered:!0,children:[(0,Q.jsx)(fV.Item,{label:`来源`,children:r||n?.source||(c?`-`:`viewer_fallback`)}),(0,Q.jsx)(fV.Item,{label:`版本`,children:i||n?.version||`-`}),(0,Q.jsx)(fV.Item,{label:`历史兜底`,children:a||!c?(0,Q.jsx)(IQ,{color:`warning`,children:`是`}):(0,Q.jsx)(IQ,{color:`success`,children:`否`})})]})}),t?(0,Q.jsx)(LR,{size:`small`,title:`最终视频提示词`,children:(0,Q.jsx)(Z.Paragraph,{style:{whiteSpace:`pre-wrap`,marginBottom:0},children:t})}):null,l.length?(0,Q.jsx)(Ng,{size:`small`,items:l}):o?(0,Q.jsx)(LR,{size:`small`,title:`视频提词 Schema`,children:(0,Q.jsx)(i9,{value:s,maxHeight:360})}):null,o?(0,Q.jsx)(Ng,{size:`small`,items:[{key:`raw_schema`,label:`原始 JSON / 历史脏字段排查`,children:(0,Q.jsx)(i9,{value:s,maxHeight:420})}]}):null]})},pre=[`material_input`,`image_prompt_optimize`,`image_generate`,`video_prompt_optimize`,`video_generate`],mre={material_input:`参考素材、项目名称和核心内容点`,image_prompt_optimize:`图片 AI 提词优化结果`,image_generate:`图片引擎、生成参数和结果图`,video_prompt_optimize:`视频 JSON schema、动作流程和最终提词`,video_generate:`视频引擎、生成参数、封面和结果视频`},C9=e=>e?Z5(e):`-`,w9=e=>e?e.length>18?`${e.slice(0,10)}...${e.slice(-4)}`:e:`-`,hre=({text:e=`-`})=>(0,Q.jsx)(Z.Text,{type:`secondary`,children:e}),T9=({step:e})=>e?(0,Q.jsx)($ne,{input:e.input,output:e.output}):null,E9=({index:e,stepCode:t,step:n,current:r})=>(0,Q.jsxs)(WV,{wrap:!0,size:8,children:[(0,Q.jsx)(Z.Text,{strong:!0,children:`第${e}步:${d9(t)}`}),(0,Q.jsx)(f9,{status:n?.status||`not_started`}),r?(0,Q.jsx)(IQ,{color:`blue`,children:`当前步骤`}):null,(0,Q.jsx)(Z.Text,{type:`secondary`,children:mre[t]||t}),n?.updatedAt?(0,Q.jsxs)(Z.Text,{type:`secondary`,children:[`更新时间:`,C9(n.updatedAt)]}):null,n?.chatTaskId?(0,Q.jsx)(Aw,{title:n.chatTaskId,children:(0,Q.jsxs)(IQ,{children:[`Chat:`,w9(n.chatTaskId)]})}):null]}),gre=(e,t)=>{if(!e)return[];let n=new Set;return n.add(`material_input`),e.currentStepCode&&n.add(e.currentStepCode),Object.values(t).forEach(e=>{(e.status===`failed`||e.errorMessage)&&n.add(e.stepCode)}),e.errorMessage&&n.add(e.currentStepCode||`material_input`),Array.from(n)},D9=(e,t=`错误信息`)=>e?(0,Q.jsx)(sf,{type:`error`,showIcon:!0,message:t,description:e,style:{marginTop:12,marginBottom:12}}):null,_re=(e,t=`暂无提词`)=>e?(0,Q.jsx)(Z.Paragraph,{style:{whiteSpace:`pre-wrap`,marginBottom:0},children:e}):(0,Q.jsx)(hre,{text:t}),O9=({moduleType:e=`shot_replicate`})=>{let{projectId:t}=$e(),n=Ye(),[r,i]=(0,S.useState)(null),[a,o]=(0,S.useState)(!1),s=(0,S.useCallback)(async()=>{if(t){o(!0);try{i(e===`hot_opening_replicate`?await y5(t):await w5(t))}catch(e){BG.error(e?.message||`加载复刻项目详情失败`)}finally{o(!1)}}},[e,t]);(0,S.useEffect)(()=>{s()},[s]);let c=(0,S.useMemo)(()=>{let e={};return(r?.steps||[]).forEach(t=>{e[t.stepCode]=t}),e},[r]),l=r?.module||e,u=u9(l),d=(0,S.useMemo)(()=>pre.map(e=>{let t=c[e],n=`wait`;return t?.status===`completed`?n=`finish`:t?.status===`processing`?n=`process`:t?.status===`failed`&&(n=`error`),{title:d9(e),description:t?(0,Q.jsx)(f9,{status:t.status}):`未创建`,status:n}}),[c]),f=(0,S.useMemo)(()=>gre(r,c),[r,c]);if(a&&!r)return(0,Q.jsx)(`div`,{style:{padding:64,textAlign:`center`},children:(0,Q.jsx)(TG,{size:`large`})});if(!r)return(0,Q.jsx)(LR,{style:{margin:24},children:(0,Q.jsx)(hC,{description:`未找到复刻项目详情`})});let p=c.material_input,m=c.image_prompt_optimize,h=c.image_generate,g=c.video_prompt_optimize,_=c.video_generate,v=r.imageGeneration?.resultImageUrl||r.finalImageUrl,y=r.videoGeneration?.resultVideoCoverUrl||r.finalVideoCoverUrl,b=r.videoGeneration?.resultVideoUrl||r.finalVideoUrl,x=[{key:`material_input`,label:(0,Q.jsx)(E9,{index:1,stepCode:`material_input`,step:p,current:r.currentStepCode===`material_input`}),children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(fV,{column:2,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`模块类型`,children:(0,Q.jsx)(f9,{status:l})}),(0,Q.jsx)(fV.Item,{label:`素材步骤ID`,children:r.material?.materialStepId||`-`}),(0,Q.jsx)(fV.Item,{label:`参考素材项目名`,children:r.material?.sourceProjectName||`-`}),(0,Q.jsx)(fV.Item,{label:`生成项目名称`,children:r.material?.targetProjectName||`-`}),(0,Q.jsx)(fV.Item,{label:`核心内容点`,span:2,children:r.material?.coreContentPoint||`-`})]}),(0,Q.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(320px, 1fr))`,gap:16},children:[(0,Q.jsx)(LR,{size:`small`,title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J4,{}),`素材视频`]}),children:(0,Q.jsx)(a9,{type:`video`,url:r.material?.materialVideoUrl,emptyDescription:`暂无素材视频`})}),(0,Q.jsx)(LR,{size:`small`,title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(x2,{}),`素材图片`]}),children:(0,Q.jsx)(a9,{type:`image`,url:r.material?.materialImageUrl,emptyDescription:`暂无素材图片`})})]}),D9(p?.errorMessage),(0,Q.jsx)(T9,{step:p})]})},{key:`image_prompt_optimize`,label:(0,Q.jsx)(E9,{index:2,stepCode:`image_prompt_optimize`,step:m,current:r.currentStepCode===`image_prompt_optimize`}),children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(fV,{column:2,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`提词步骤ID`,children:r.imageGeneration?.promptStepId||`-`}),(0,Q.jsx)(fV.Item,{label:`步骤状态`,children:(0,Q.jsx)(f9,{status:m?.status||r.imageGeneration?.status})}),(0,Q.jsx)(fV.Item,{label:`图片提示词`,span:2,children:_re(r.imageGeneration?.prompt,`暂无图片提示词`)})]}),D9(m?.errorMessage||r.imageGeneration?.errorMessage),(0,Q.jsx)(T9,{step:m})]})},{key:`image_generate`,label:(0,Q.jsx)(E9,{index:3,stepCode:`image_generate`,step:h,current:r.currentStepCode===`image_generate`}),children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(fV,{column:3,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`生成步骤ID`,children:r.imageGeneration?.generateStepId||`-`}),(0,Q.jsx)(fV.Item,{label:`Chat任务ID`,children:r.imageGeneration?.chatTaskId||`-`}),(0,Q.jsx)(fV.Item,{label:`状态`,children:(0,Q.jsx)(f9,{status:r.imageGeneration?.status||h?.status})}),(0,Q.jsx)(fV.Item,{label:`图片引擎ID`,children:r.imageGeneration?.engineId||`-`}),(0,Q.jsx)(fV.Item,{label:`图片引擎名称`,children:r.imageGeneration?.engineName||`-`}),(0,Q.jsx)(fV.Item,{label:`生成参数`,span:3,children:(0,Q.jsx)(i9,{value:r.imageGeneration?.params||{},maxHeight:160})})]}),D9(r.imageGeneration?.errorMessage||h?.errorMessage),(0,Q.jsx)(LR,{size:`small`,title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(x2,{}),`图片结果`]}),children:(0,Q.jsx)(a9,{type:`image`,url:v,height:360,emptyDescription:h?.status===`failed`||r.imageGeneration?.errorMessage?`图片生成失败,未返回图片地址`:`暂无图片结果`,errorDescription:`图片资源加载失败,可能图片文件不存在、签名过期或访问权限受限。`})}),(0,Q.jsx)(T9,{step:h})]})},{key:`video_prompt_optimize`,label:(0,Q.jsx)(E9,{index:4,stepCode:`video_prompt_optimize`,step:g,current:r.currentStepCode===`video_prompt_optimize`}),children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(fV,{column:3,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`提词步骤ID`,children:r.videoGeneration?.promptStepId||`-`}),(0,Q.jsx)(fV.Item,{label:`步骤状态`,children:(0,Q.jsx)(f9,{status:g?.status})}),(0,Q.jsx)(fV.Item,{label:`提词参数`,span:3,children:(0,Q.jsx)(i9,{value:r.videoGeneration?.promptParams||{},maxHeight:160})})]}),D9(g?.errorMessage||r.videoGeneration?.errorMessage),(0,Q.jsx)(fre,{schema:r.videoGeneration?.promptSchema,finalPrompt:r.videoGeneration?.finalPrompt,schemaConfigSnapshot:r.videoGeneration?.schemaConfigSnapshot,schemaConfigSource:r.videoGeneration?.schemaConfigSource,schemaConfigVersion:r.videoGeneration?.schemaConfigVersion,schemaConfigIsFallback:r.videoGeneration?.schemaConfigIsFallback}),(0,Q.jsx)(T9,{step:g})]})},{key:`video_generate`,label:(0,Q.jsx)(E9,{index:5,stepCode:`video_generate`,step:_,current:r.currentStepCode===`video_generate`}),children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(fV,{column:3,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`生成步骤ID`,children:r.videoGeneration?.generateStepId||`-`}),(0,Q.jsx)(fV.Item,{label:`Chat任务ID`,children:r.videoGeneration?.chatTaskId||`-`}),(0,Q.jsx)(fV.Item,{label:`状态`,children:(0,Q.jsx)(f9,{status:r.videoGeneration?.status||_?.status})}),(0,Q.jsx)(fV.Item,{label:`视频引擎ID`,children:r.videoGeneration?.engineId||`-`}),(0,Q.jsx)(fV.Item,{label:`视频引擎名称`,children:r.videoGeneration?.engineName||`-`}),(0,Q.jsx)(fV.Item,{label:`生成参数`,span:3,children:(0,Q.jsx)(i9,{value:r.videoGeneration?.params||{},maxHeight:160})})]}),D9(r.videoGeneration?.errorMessage||_?.errorMessage),(0,Q.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(320px, 1fr))`,gap:16},children:[(0,Q.jsx)(LR,{size:`small`,title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(x2,{}),`视频封面`]}),children:(0,Q.jsx)(a9,{type:`image`,url:y,emptyDescription:_?.status===`failed`||r.videoGeneration?.errorMessage?`视频生成失败,未返回封面`:`暂无视频封面`,errorDescription:`视频封面加载失败,可能文件不存在、签名过期或访问权限受限。`})}),(0,Q.jsx)(LR,{size:`small`,title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(A6,{}),`最终视频`]}),children:(0,Q.jsx)(a9,{type:`video`,url:b,emptyDescription:_?.status===`failed`||r.videoGeneration?.errorMessage?`视频生成失败,未返回视频地址`:`暂无最终视频`,errorDescription:`视频资源加载失败,可能文件不存在、签名过期或访问权限受限。`})})]}),(0,Q.jsx)(T9,{step:_})]})}];return(0,Q.jsx)(`div`,{style:{padding:24},children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(WV,{wrap:!0,style:{justifyContent:`space-between`,width:`100%`},children:[(0,Q.jsxs)(WV,{wrap:!0,children:[(0,Q.jsx)(YE,{icon:(0,Q.jsx)(e0,{}),onClick:()=>n(-1),children:`返回`}),(0,Q.jsxs)(Z.Title,{level:3,style:{margin:0},children:[u,`项目详情`]}),(0,Q.jsx)(f9,{status:r.status}),r.module&&r.module!==e?(0,Q.jsxs)(IQ,{color:`gold`,children:[`接口模块:`,u9(r.module)]}):null]}),(0,Q.jsx)(YE,{onClick:s,loading:a,children:`刷新`})]}),(0,Q.jsx)(LR,{children:(0,Q.jsxs)(fV,{title:`基础信息`,column:3,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`项目ID`,children:r.id}),(0,Q.jsx)(fV.Item,{label:`模块类型`,children:(0,Q.jsx)(f9,{status:l})}),(0,Q.jsx)(fV.Item,{label:`用户ID`,children:r.userId||`-`}),(0,Q.jsx)(fV.Item,{label:`用户名`,children:r.userName||`-`}),(0,Q.jsx)(fV.Item,{label:`标题`,children:r.title||`-`}),(0,Q.jsx)(fV.Item,{label:`当前步骤`,children:(0,Q.jsx)(Aw,{title:r.currentStepCode||``,children:d9(r.currentStepCode)})}),(0,Q.jsx)(fV.Item,{label:`状态`,children:(0,Q.jsx)(f9,{status:r.status})}),(0,Q.jsx)(fV.Item,{label:`创建时间`,children:C9(r.createdAt)}),(0,Q.jsx)(fV.Item,{label:`更新时间`,children:C9(r.updatedAt)}),(0,Q.jsx)(fV.Item,{label:`完成时间`,children:C9(r.completedAt)}),r.errorMessage?(0,Q.jsx)(fV.Item,{label:`错误信息`,span:3,children:(0,Q.jsx)(sf,{type:`error`,showIcon:!0,message:r.errorMessage})}):null]})}),(0,Q.jsx)(LR,{title:`步骤进度`,children:(0,Q.jsx)(Eq,{items:d})}),(0,Q.jsx)(LR,{title:`最终结果预览`,children:(0,Q.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(280px, 1fr))`,gap:16},children:[(0,Q.jsx)(LR,{size:`small`,title:`最终图片`,children:(0,Q.jsx)(a9,{type:`image`,url:r.finalImageUrl||r.imageGeneration?.resultImageUrl,height:220,emptyDescription:`暂无最终图片`})}),(0,Q.jsx)(LR,{size:`small`,title:`最终视频封面`,children:(0,Q.jsx)(a9,{type:`image`,url:r.finalVideoCoverUrl||r.videoGeneration?.resultVideoCoverUrl,height:220,emptyDescription:`暂无最终视频封面`})}),(0,Q.jsx)(LR,{size:`small`,title:`最终视频`,children:(0,Q.jsx)(a9,{type:`video`,url:r.finalVideoUrl||r.videoGeneration?.resultVideoUrl,height:220,emptyDescription:`暂无最终视频`})})]})}),(0,Q.jsx)(Ng,{defaultActiveKey:f,items:x}),(0,Q.jsx)(Ng,{items:[{key:`steps-table`,label:`完整步骤列表`,children:(0,Q.jsx)(CQ,{rowKey:`id`,size:`small`,pagination:!1,dataSource:r.steps||[],scroll:{x:1100},columns:[{title:`序号`,dataIndex:`stepIndex`,width:70},{title:`步骤`,dataIndex:`stepCode`,width:160,render:e=>(0,Q.jsx)(Aw,{title:e,children:d9(e)})},{title:`状态`,dataIndex:`status`,width:120,render:e=>(0,Q.jsx)(f9,{status:e})},{title:`版本`,dataIndex:`version`,width:70},{title:`当前有效`,dataIndex:`isCurrent`,width:90,render:e=>e?(0,Q.jsx)(IQ,{color:`success`,children:`是`}):(0,Q.jsx)(IQ,{children:`否`})},{title:`Chat任务`,dataIndex:`chatTaskId`,width:160,render:e=>(0,Q.jsx)(Aw,{title:e||``,children:w9(e)})},{title:`创建时间`,dataIndex:`createdAt`,width:170,render:C9},{title:`完成时间`,dataIndex:`completedAt`,width:170,render:C9},{title:`错误`,dataIndex:`errorMessage`,ellipsis:!0,render:e=>e||`-`}]})},{key:`raw-detail`,label:`完整详情原始 JSON`,children:(0,Q.jsx)(i9,{value:r,maxHeight:520})}]})]})})},vre=()=>(0,Q.jsx)(O9,{moduleType:`hot_opening_replicate`}),k9=20,yre=[{value:`pending_analysis`,label:`等待分析`},{value:`analyzing`,label:`分析中`},{value:`analysis_completed`,label:`分析完成`},{value:`analysis_failed`,label:`分析失败`},{value:`splitting`,label:`拆镜中`},{value:`split_completed`,label:`拆镜完成`},{value:`partial_failed`,label:`部分失败`},{value:`failed`,label:`失败`}],bre=[{value:`pending`,label:`待分析`},{value:`processing`,label:`分析中`},{value:`completed`,label:`分析完成`},{value:`failed`,label:`分析失败`}],xre=[{value:`none`,label:`未拆镜`},{value:`pending`,label:`待拆镜`},{value:`processing`,label:`拆镜中`},{value:`completed`,label:`拆镜完成`},{value:`failed`,label:`拆镜失败`},{value:`retry_waiting`,label:`等待重试`}],Sre={pending_analysis:{color:`default`,text:`等待分析`},analyzing:{color:`processing`,text:`分析中`},analysis_completed:{color:`success`,text:`分析完成`},analysis_failed:{color:`error`,text:`分析失败`},splitting:{color:`warning`,text:`拆镜中`},split_completed:{color:`success`,text:`拆镜完成`},partial_failed:{color:`orange`,text:`部分失败`},failed:{color:`error`,text:`失败`},none:{color:`default`,text:`未拆镜`},pending:{color:`default`,text:`待处理`},processing:{color:`warning`,text:`处理中`},completed:{color:`success`,text:`完成`},retry_waiting:{color:`orange`,text:`等待重试`}},A9=e=>e?Z5(e):`-`,j9=e=>e?e.length>16?`${e.slice(0,10)}...`:e:`-`,M9=({status:e})=>{if(!e)return(0,Q.jsx)(IQ,{children:`-`});let t=Sre[e]||{color:`blue`,text:e};return(0,Q.jsx)(IQ,{color:t.color,children:t.text})},Cre=()=>{let e=Ye(),[t,n]=(0,S.useState)([]),[r,i]=(0,S.useState)(0),[a,o]=(0,S.useState)(!1),[s,c]=(0,S.useState)(1),[l,u]=(0,S.useState)(``),[d,f]=(0,S.useState)(``),[p,m]=(0,S.useState)(``),[h,g]=(0,S.useState)(``),[_,v]=(0,S.useState)(``),[y,b]=(0,S.useState)(``),[x,C]=(0,S.useState)(null),[w,T]=(0,S.useState)(``),[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)(``),[A,j]=(0,S.useState)(null),[M,N]=(0,S.useState)(0),P=(0,S.useCallback)(async()=>{o(!0);try{let e=await b5({status:l||void 0,analysisStatus:d||void 0,splitStatus:p||void 0,keyword:w||void 0,userId:E||void 0,userName:O||void 0,createdStart:A?.[0]?.toISOString?.(),createdEnd:A?.[1]?.toISOString?.(),page:s,pageSize:k9});n(e.items||[]),i(e.total||0)}catch(e){BG.error(e?.message||`加载拆镜复刻任务失败`)}finally{o(!1)}},[d,s,A,w,E,O,p,l]);(0,S.useEffect)(()=>{P()},[P,M]);let F=()=>{T(h.trim()),D(_.trim()),k(y.trim()),j(x),c(1)};return(0,Q.jsx)(`div`,{style:{padding:24},children:(0,Q.jsx)(LR,{children:(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(WV,{align:`center`,style:{justifyContent:`space-between`,width:`100%`},children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsx)(Z.Title,{level:3,style:{marginBottom:4},children:`拆镜复刻`}),(0,Q.jsx)(Z.Text,{type:`secondary`,children:`只读排查页面:查看拆镜总任务、AI 分析结果、切片列表和关联复刻项目。`})]}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:()=>N(e=>e+1),children:`刷新`})]}),(0,Q.jsxs)(WV,{wrap:!0,children:[(0,Q.jsx)(BC,{allowClear:!0,placeholder:`总任务状态`,style:{width:150},value:l||void 0,onChange:e=>{u(e||``),c(1)},options:yre}),(0,Q.jsx)(BC,{allowClear:!0,placeholder:`分析状态`,style:{width:140},value:d||void 0,onChange:e=>{f(e||``),c(1)},options:bre}),(0,Q.jsx)(BC,{allowClear:!0,placeholder:`拆镜状态`,style:{width:140},value:p||void 0,onChange:e=>{m(e||``),c(1)},options:xre}),(0,Q.jsx)(vW,{allowClear:!0,prefix:(0,Q.jsx)(FC,{}),placeholder:`关键词:标题/内容/分类/受众`,style:{width:260},value:h,onChange:e=>g(e.target.value),onPressEnter:F}),(0,Q.jsx)(vW,{allowClear:!0,placeholder:`用户ID(管理员)`,style:{width:190},value:_,onChange:e=>v(e.target.value),onPressEnter:F}),(0,Q.jsx)(vW,{allowClear:!0,placeholder:`用户名(管理员)`,style:{width:230},value:y,onChange:e=>b(e.target.value),onPressEnter:F}),(0,Q.jsx)(QB.RangePicker,{showTime:!0,value:x,onChange:C,placeholder:[`创建开始`,`创建结束`]}),(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(FC,{}),onClick:F,children:`搜索`}),(0,Q.jsx)(YE,{onClick:()=>{u(``),f(``),m(``),g(``),v(``),b(``),C(null),T(``),D(``),k(``),j(null),c(1),N(e=>e+1)},children:`重置`})]}),(0,Q.jsx)(CQ,{rowKey:`id`,loading:a,dataSource:t,pagination:{current:s,pageSize:k9,total:r,showSizeChanger:!1,showTotal:e=>`共 ${e} 条`,onChange:c},scroll:{x:1500},columns:[{title:`任务集ID`,dataIndex:`id`,width:150,render:e=>(0,Q.jsx)(Aw,{title:e,children:j9(e)})},{title:`用户`,width:180,render:(e,t)=>(0,Q.jsxs)(WV,{direction:`vertical`,size:0,children:[(0,Q.jsx)(Z.Text,{children:t.userName||`-`}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:j9(t.userId)})]})},{title:`任务信息`,width:300,render:(e,t)=>(0,Q.jsxs)(WV,{direction:`vertical`,size:2,children:[(0,Q.jsx)(Z.Text,{strong:!0,children:t.title||`-`}),(0,Q.jsxs)(Z.Text,{type:`secondary`,ellipsis:!0,style:{maxWidth:280},children:[`分类:`,t.originalVideoCategory||`-`]}),(0,Q.jsxs)(Z.Text,{type:`secondary`,ellipsis:!0,style:{maxWidth:280},children:[`受众:`,t.originalVideoAudience||`-`]})]})},{title:`总状态`,dataIndex:`status`,width:120,render:e=>(0,Q.jsx)(M9,{status:e})},{title:`分析状态`,dataIndex:`analysisStatus`,width:110,render:e=>(0,Q.jsx)(M9,{status:e})},{title:`拆镜状态`,dataIndex:`splitStatus`,width:110,render:e=>(0,Q.jsx)(M9,{status:e})},{title:`切片进度`,width:180,render:(e,t)=>{let n=t.segmentCount||0,r=t.completedSegmentCount||0;return(0,Q.jsx)(EK,{size:`small`,percent:n?Math.round(r/n*100):0,format:()=>`${r}/${n}`})}},{title:`失败片段`,dataIndex:`failedSegmentCount`,width:90,render:e=>e?(0,Q.jsx)(IQ,{color:`error`,children:e}):(0,Q.jsx)(IQ,{children:`0`})},{title:`视频时长`,dataIndex:`videoDurationSeconds`,width:100,render:e=>`${Number(e||0).toFixed(1)}s`},{title:`创建时间`,dataIndex:`createdAt`,width:170,render:A9},{title:`更新时间`,dataIndex:`updatedAt`,width:170,render:A9},{title:`操作`,fixed:`right`,width:120,render:(t,n)=>(0,Q.jsx)(YE,{type:`link`,icon:(0,Q.jsx)(XU,{}),onClick:()=>e(`/shot-replications/task-sets/${n.id}`),children:`查看切片`})}]})]})})})},wre=`http://ceshi.apiforeign.minzhong.cn`.replace(/\/api\/?$/i,``).replace(/\/$/,``),N9=20,Tre=[{value:`ai_suggestion`,label:`AI 建议`},{value:`custom`,label:`自定义`}],Ere=[{value:`none`,label:`未拆镜`},{value:`pending`,label:`待拆镜`},{value:`processing`,label:`拆镜中`},{value:`completed`,label:`拆镜完成`},{value:`failed`,label:`拆镜失败`},{value:`retry_waiting`,label:`等待重试`}],Dre=[{value:`not_required`,label:`无需分析`},{value:`pending`,label:`待分析`},{value:`processing`,label:`分析中`},{value:`completed`,label:`分析完成`},{value:`failed`,label:`分析失败`}],Ore=[{value:`not_started`,label:`未复刻`},{value:`project_created`,label:`已创建项目`},{value:`processing`,label:`复刻中`},{value:`completed`,label:`复刻完成`},{value:`failed`,label:`复刻失败`}],P9={pending_analysis:{color:`default`,text:`等待分析`},analyzing:{color:`processing`,text:`分析中`},analysis_completed:{color:`success`,text:`分析完成`},analysis_failed:{color:`error`,text:`分析失败`},splitting:{color:`warning`,text:`拆镜中`},split_completed:{color:`success`,text:`拆镜完成`},partial_failed:{color:`orange`,text:`部分失败`},failed:{color:`error`,text:`失败`},none:{color:`default`,text:`未拆镜`},pending:{color:`default`,text:`待处理`},processing:{color:`warning`,text:`处理中`},completed:{color:`success`,text:`完成`},retry_waiting:{color:`orange`,text:`等待重试`},not_required:{color:`default`,text:`无需分析`},not_started:{color:`default`,text:`未复刻`},project_created:{color:`processing`,text:`已创建项目`}},kre=e=>{if(!e)return``;let t=String(e).trim();return t?/^(https?:)?\/\//i.test(t)||/^(blob|data):/i.test(t)?t:`${wre}${t.startsWith(`/`)?t:`/${t}`}`:``},F9=e=>e?Z5(e):`-`,I9=e=>e?e.length>16?`${e.slice(0,10)}...`:e:`-`,L9=({status:e})=>{if(!e)return(0,Q.jsx)(IQ,{children:`-`});let t=P9[e]||{color:`blue`,text:e};return(0,Q.jsx)(IQ,{color:t.color,children:t.text})},R9=({value:e,maxHeight:t=420})=>(0,Q.jsx)(`pre`,{style:{margin:0,padding:12,maxHeight:t,overflow:`auto`,background:`#0f172a`,color:`#e2e8f0`,borderRadius:8,fontSize:12,lineHeight:1.6},children:JSON.stringify(e??{},null,2)}),z9=({url:e,height:t=280})=>e?(0,Q.jsx)(`video`,{src:kre(e),controls:!0,preload:`metadata`,style:{width:`100%`,maxHeight:t,borderRadius:12,background:`#0f172a`}}):(0,Q.jsx)(hC,{description:`暂无视频`,image:hC.PRESENTED_IMAGE_SIMPLE}),Are=({items:e=[]})=>(0,Q.jsx)(CQ,{rowKey:`index`,size:`small`,pagination:!1,dataSource:e,scroll:{x:!0},columns:[{title:`序号`,dataIndex:`index`,width:70},{title:`时间节点`,dataIndex:`timeNode`,width:120},{title:`开始`,dataIndex:`startSecond`,width:80,render:e=>`${Number(e||0).toFixed(2)}s`},{title:`结束`,dataIndex:`endSecond`,width:80,render:e=>`${Number(e||0).toFixed(2)}s`},{title:`内容`,dataIndex:`content`,ellipsis:!0},{title:`分类`,dataIndex:`category`,width:140},{title:`受众`,dataIndex:`audience`,ellipsis:!0}]}),jre=()=>{let{taskSetId:e}=$e(),t=Ye(),[n,r]=(0,S.useState)(null),[i,a]=(0,S.useState)([]),[o,s]=(0,S.useState)(0),[c,l]=(0,S.useState)(1),[u,d]=(0,S.useState)(!1),[f,p]=(0,S.useState)(!1),[m,h]=(0,S.useState)(0),[g,_]=(0,S.useState)(``),[v,y]=(0,S.useState)(``),[b,x]=(0,S.useState)(``),[C,w]=(0,S.useState)(``),[T,E]=(0,S.useState)(!1),[D,O]=(0,S.useState)(null),k=(0,S.useCallback)(async()=>{if(e){d(!0);try{r(await x5(e))}catch(e){BG.error(e?.message||`加载拆镜任务详情失败`)}finally{d(!1)}}},[e]),A=(0,S.useCallback)(async()=>{if(e){p(!0);try{let t=await S5(e,{sourceMode:g||void 0,splitStatus:v||void 0,analysisStatus:b||void 0,replicateStatus:C||void 0,page:c,pageSize:N9});a(t.items||[]),s(t.total||0)}catch(e){BG.error(e?.message||`加载拆镜片段失败`)}finally{p(!1)}}},[b,c,C,g,v,e]);(0,S.useEffect)(()=>{k()},[k,m]),(0,S.useEffect)(()=>{A()},[A,m]);let j=async e=>{E(!0),O(null);try{O(await C5(e))}catch(e){BG.error(e?.message||`加载片段详情失败`)}};return u&&!n?(0,Q.jsx)(`div`,{style:{padding:64,textAlign:`center`},children:(0,Q.jsx)(TG,{size:`large`})}):n?(0,Q.jsxs)(`div`,{style:{padding:24},children:[(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(WV,{style:{justifyContent:`space-between`,width:`100%`},children:[(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(YE,{icon:(0,Q.jsx)(e0,{}),onClick:()=>t(`/shot-replications`),children:`返回列表`}),(0,Q.jsx)(Z.Title,{level:3,style:{margin:0},children:`拆镜任务详情`}),(0,Q.jsx)(L9,{status:n.status})]}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),onClick:()=>h(e=>e+1),children:`刷新`})]}),(0,Q.jsx)(LR,{children:(0,Q.jsxs)(fV,{title:`总任务信息`,column:3,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`任务集ID`,children:n.id}),(0,Q.jsx)(fV.Item,{label:`用户ID`,children:n.userId||`-`}),(0,Q.jsx)(fV.Item,{label:`用户名`,children:n.userName||`-`}),(0,Q.jsx)(fV.Item,{label:`标题`,children:n.title||`-`}),(0,Q.jsxs)(fV.Item,{label:`视频时长`,children:[Number(n.videoDurationSeconds||0).toFixed(2),`s`]}),(0,Q.jsx)(fV.Item,{label:`总状态`,children:(0,Q.jsx)(L9,{status:n.status})}),(0,Q.jsx)(fV.Item,{label:`分析状态`,children:(0,Q.jsx)(L9,{status:n.analysisStatus})}),(0,Q.jsx)(fV.Item,{label:`拆镜状态`,children:(0,Q.jsx)(L9,{status:n.splitStatus})}),(0,Q.jsxs)(fV.Item,{label:`片段数量`,children:[n.completedSegmentCount,`/`,n.segmentCount,`,失败 `,n.failedSegmentCount]}),(0,Q.jsx)(fV.Item,{label:`原视频分类`,children:n.originalVideoCategory||`-`}),(0,Q.jsx)(fV.Item,{label:`创建时间`,children:F9(n.createdAt)}),(0,Q.jsx)(fV.Item,{label:`更新时间`,children:F9(n.updatedAt)}),(0,Q.jsx)(fV.Item,{label:`原视频内容`,span:3,children:n.originalVideoContent||`-`}),(0,Q.jsx)(fV.Item,{label:`原视频受众`,span:3,children:n.originalVideoAudience||`-`}),n.analysisErrorMessage?(0,Q.jsx)(fV.Item,{label:`分析错误`,span:3,children:(0,Q.jsx)(sf,{type:`error`,message:n.analysisErrorMessage})}):null,n.splitErrorMessage?(0,Q.jsx)(fV.Item,{label:`拆镜错误`,span:3,children:(0,Q.jsx)(sf,{type:`error`,message:n.splitErrorMessage})}):null]})}),(0,Q.jsx)(LR,{title:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(J4,{}),`原视频预览`]}),children:(0,Q.jsx)(z9,{url:n.videoUrl,height:360})}),(0,Q.jsxs)(LR,{title:`AI 建议拆镜列表`,children:[n.aiSuggestions?.length?(0,Q.jsx)(Are,{items:n.aiSuggestions}):(0,Q.jsx)(hC,{description:`暂无 AI 建议拆镜`}),(0,Q.jsx)(Ng,{size:`small`,ghost:!0,style:{marginTop:12},items:[{key:`raw`,label:`查看原视频分析完整 JSON`,children:(0,Q.jsx)(R9,{value:n.analysisResultJson})}]})]}),(0,Q.jsxs)(LR,{title:`片段列表`,children:[(0,Q.jsxs)(WV,{wrap:!0,style:{marginBottom:16},children:[(0,Q.jsx)(BC,{allowClear:!0,placeholder:`片段来源`,style:{width:140},value:g||void 0,options:Tre,onChange:e=>{_(e||``),l(1)}}),(0,Q.jsx)(BC,{allowClear:!0,placeholder:`切割状态`,style:{width:140},value:v||void 0,options:Ere,onChange:e=>{y(e||``),l(1)}}),(0,Q.jsx)(BC,{allowClear:!0,placeholder:`分析状态`,style:{width:140},value:b||void 0,options:Dre,onChange:e=>{x(e||``),l(1)}}),(0,Q.jsx)(BC,{allowClear:!0,placeholder:`复刻状态`,style:{width:150},value:C||void 0,options:Ore,onChange:e=>{w(e||``),l(1)}}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(FC,{}),onClick:()=>h(e=>e+1),children:`筛选`}),(0,Q.jsx)(YE,{onClick:()=>{_(``),y(``),x(``),w(``),l(1),h(e=>e+1)},children:`重置`})]}),(0,Q.jsx)(CQ,{rowKey:`id`,loading:f,dataSource:i,pagination:{current:c,pageSize:N9,total:o,showSizeChanger:!1,showTotal:e=>`共 ${e} 条`,onChange:l},scroll:{x:1550},columns:[{title:`片段ID`,dataIndex:`id`,width:150,render:e=>(0,Q.jsx)(Aw,{title:e,children:I9(e)})},{title:`序号`,dataIndex:`segmentIndex`,width:70},{title:`来源`,dataIndex:`sourceMode`,width:100,render:e=>e===`ai_suggestion`?(0,Q.jsx)(IQ,{color:`purple`,children:`AI建议`}):(0,Q.jsx)(IQ,{color:`cyan`,children:`自定义`})},{title:`时间节点`,dataIndex:`timeNode`,width:130},{title:`时长`,dataIndex:`durationSeconds`,width:90,render:e=>`${Number(e||0).toFixed(2)}s`},{title:`切割`,dataIndex:`splitStatus`,width:100,render:e=>(0,Q.jsx)(L9,{status:e})},{title:`分析`,dataIndex:`analysisStatus`,width:100,render:e=>(0,Q.jsx)(L9,{status:e})},{title:`复刻`,dataIndex:`replicateStatus`,width:110,render:e=>(0,Q.jsx)(L9,{status:e})},{title:`片段内容`,dataIndex:`segmentContent`,width:260,ellipsis:!0,render:e=>e||`-`},{title:`分类`,dataIndex:`segmentCategory`,width:120,render:e=>e||`-`},{title:`关联项目`,width:220,render:(e,n)=>n.moduleProjectId?(0,Q.jsxs)(WV,{direction:`vertical`,size:0,children:[(0,Q.jsx)(YE,{type:`link`,style:{padding:0},onClick:()=>t(`/shot-replications/projects/${n.moduleProjectId}`),children:I9(n.moduleProjectId)}),(0,Q.jsx)(Z.Text,{type:`secondary`,style:{fontSize:12},children:n.moduleProjectTitle||d9(n.moduleProjectCurrentStepCode)}),(0,Q.jsx)(L9,{status:n.moduleProjectStatus})]}):(0,Q.jsx)(IQ,{children:`未创建`})},{title:`错误`,dataIndex:`splitLastError`,width:220,ellipsis:!0,render:(e,t)=>e||t.analysisErrorMessage||`-`},{title:`创建时间`,dataIndex:`createdAt`,width:170,render:F9},{title:`操作`,fixed:`right`,width:100,render:(e,t)=>(0,Q.jsx)(YE,{type:`link`,icon:(0,Q.jsx)(XU,{}),onClick:()=>j(t.id),children:`详情`})}]})]})]}),(0,Q.jsx)(FV,{title:`片段详情`,width:720,open:T,onClose:()=>E(!1),destroyOnClose:!0,children:D?(0,Q.jsxs)(WV,{direction:`vertical`,size:16,style:{width:`100%`},children:[(0,Q.jsxs)(fV,{column:2,bordered:!0,size:`small`,children:[(0,Q.jsx)(fV.Item,{label:`片段ID`,span:2,children:D.id}),(0,Q.jsx)(fV.Item,{label:`时间节点`,children:D.timeNode}),(0,Q.jsxs)(fV.Item,{label:`时长`,children:[Number(D.durationSeconds||0).toFixed(2),`s`]}),(0,Q.jsx)(fV.Item,{label:`切割状态`,children:(0,Q.jsx)(L9,{status:D.splitStatus})}),(0,Q.jsx)(fV.Item,{label:`分析状态`,children:(0,Q.jsx)(L9,{status:D.analysisStatus})}),(0,Q.jsx)(fV.Item,{label:`复刻状态`,children:(0,Q.jsx)(L9,{status:D.replicateStatus})}),(0,Q.jsx)(fV.Item,{label:`关联项目`,children:D.moduleProjectId?(0,Q.jsx)(YE,{type:`link`,onClick:()=>t(`/shot-replications/projects/${D.moduleProjectId}`),children:D.moduleProjectId}):`-`}),(0,Q.jsx)(fV.Item,{label:`片段内容`,span:2,children:D.segmentContent||`-`}),(0,Q.jsx)(fV.Item,{label:`片段分类`,children:D.segmentCategory||`-`}),(0,Q.jsx)(fV.Item,{label:`片段受众`,children:D.segmentAudience||`-`})]}),(0,Q.jsx)(LR,{size:`small`,title:`片段视频`,children:(0,Q.jsx)(z9,{url:D.segmentVideoUrl,height:300})}),D.splitLastError?(0,Q.jsx)(sf,{type:`error`,message:`切割错误`,description:D.splitLastError}):null,D.analysisErrorMessage?(0,Q.jsx)(sf,{type:`error`,message:`分析错误`,description:D.analysisErrorMessage}):null,(0,Q.jsx)(Ng,{size:`small`,items:[{key:`analysis`,label:`片段分析 JSON`,children:(0,Q.jsx)(R9,{value:D.analysisJson})},{key:`suggestion`,label:`AI 建议原始 JSON`,children:(0,Q.jsx)(R9,{value:D.aiSuggestionJson})}]})]}):(0,Q.jsx)(TG,{})})]}):(0,Q.jsx)(LR,{style:{margin:24},children:(0,Q.jsx)(hC,{description:`未找到拆镜任务详情`})})},{Title:Mre,Text:B9,Paragraph:Nre}=Z,{TextArea:V9}=vW,H9=[{label:`对象`,value:`object`},{label:`数组`,value:`array`},{label:`字符串`,value:`string`},{label:`数字`,value:`number`},{label:`布尔`,value:`boolean`},{label:`流程数组`,value:`flow`}],U9=`画面属性`,Pre=new Set([`视频时长`,`视频比例`,`清晰度`,`帧率`,`推荐分辨率`]);function W9(e,t){return e===U9&&!!t&&Pre.has(t)}function G9(e){return e===U9}function Fre(e){return JSON.parse(JSON.stringify(e??null))}function K9(e,t,n,r){return!e||typeof e!=`object`?r:e[t]===void 0?e[n]===void 0?r:e[n]:e[t]}function Ire(e){return{key:String(e?.key||e?.label||`新流程字段`),label:String(e?.label||e?.key||`新流程字段`),enabled:e?.enabled??!0,editable:e?.editable??!0,maxLength:Number(K9(e,`maxLength`,`max_length`,800)||800),value:e?.value??``}}function q9(e){let t=String(e?.type||`string`),n={key:String(e?.key||e?.label||`新字段`),label:String(e?.label||e?.key||`新字段`),type:t,enabled:e?.enabled??!0,editable:e?.editable??!0,maxLength:Number(K9(e,`maxLength`,`max_length`,t===`flow`?800:1e3)||(t===`flow`?800:1e3))};if(t===`object`)n.children=Array.isArray(e?.children)?e.children.map(q9):[];else if(t===`flow`){n.contentKey=String(K9(e,`contentKey`,`content_key`,e?.key===`镜头流程`?`镜头内容`:`动作内容`));let t=K9(e,`contentAliases`,`content_aliases`,[]);n.contentAliases=Array.isArray(t)?t.map(e=>String(e)).filter(Boolean):[];let r=K9(e,`itemFields`,`item_fields`,[]);n.itemFields=Array.isArray(r)&&r.length>0?r.map(Ire):[{key:n.contentKey,label:n.contentKey,enabled:!0,editable:!0,maxLength:n.maxLength||800,value:``}]}else n.value=e?.value??(t===`array`?[]:t===`boolean`?!1:t===`number`?0:`无`);return n}function Lre(e){let t=Array.isArray(e?.segments)?e.segments:[],n=Array.isArray(e?.ratios)?e.ratios:[];return{minDuration:Number(K9(e,`minDuration`,`min_duration`,1)||1),maxDuration:Number(K9(e,`maxDuration`,`max_duration`,5)||5),ratios:n.map(e=>Number(e||0)),segments:t.map(e=>({stage:String(e?.stage||`新阶段`),description:String(e?.description||e?.desc||`阶段说明`)}))}}function J9(e){let t=Array.isArray(e?.sections)?e.sections:[],n=Array.isArray(e?.timePlanRules)?e.timePlanRules:Array.isArray(e?.time_plan_rules)?e.time_plan_rules:[];return{version:e?.version||`video_prompt_schema_config_v1`,enabled:e?.enabled??!0,sections:t.map(q9),timePlanRules:n.map(Lre)}}function Y9(e,t){let n=G9(e.key),r=W9(t,e.key),i={key:e.key,label:e.label,type:r?`string`:e.type,enabled:n||r?!0:!!e.enabled,editable:r?!1:!!e.editable,max_length:e.maxLength};return e.type===`object`?i.children=(e.children||[]).map(t=>Y9(t,e.key)):e.type===`flow`?(i.content_key=e.contentKey,i.content_aliases=e.contentAliases||[],i.item_fields=(e.itemFields||[]).map(e=>({key:e.key,label:e.label,enabled:!!e.enabled,editable:!!e.editable,max_length:e.maxLength,value:e.value??``}))):i.value=e.value,i}function X9(e,t){return{version:e.version,enabled:t,sections:(e.sections||[]).map(e=>Y9(e)),time_plan_rules:(e.timePlanRules||[]).map(e=>({min_duration:e.minDuration,max_duration:e.maxDuration,ratios:e.ratios||[],segments:(e.segments||[]).map(e=>({stage:e.stage,description:e.description}))}))}}function Z9(e){return e?.runtimeSchema||e?.runtime_schema||{}}function Q9(e){let t=e?.timePlan||e?.time_plan||Z9(e)?.动态时间规划||[];return Array.isArray(t)?t:[]}function Rre(e){return e?.schemaConfigSnapshot||e?.schema_config_snapshot||{}}function zre(e,t){let n=new Blob([JSON.stringify(t,null,2)],{type:`application/json;charset=utf-8`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}var $9=(e=`string`)=>({key:`新字段`,label:`新字段`,type:e,enabled:!0,editable:!0,maxLength:e===`flow`?800:1e3,value:e===`array`?[]:e===`boolean`?!1:e===`number`?0:`无`,children:e===`object`?[]:void 0,contentKey:e===`flow`?`动作内容`:void 0,contentAliases:e===`flow`?[`动作内容`,`动作`,`动作说明`,`内容`,`说明`]:void 0,itemFields:e===`flow`?[{key:`动作内容`,label:`动作内容`,enabled:!0,editable:!0,maxLength:800,value:``}]:void 0}),Bre=()=>({minDuration:1,maxDuration:5,ratios:[.2,.4,.4],segments:[{stage:`开场吸引`,description:`快速吸引注意力`},{stage:`核心展示`,description:`展示主体动作、核心卖点或主要视觉内容`},{stage:`收尾引导`,description:`给出行动引导并稳定落版`}]}),Vre=()=>{let[e,t]=(0,S.useState)(!1),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(!0),[o,s]=(0,S.useState)(!1),[c,l]=(0,S.useState)(null),[u,d]=(0,S.useState)(null),[f,p]=(0,S.useState)(!1),[m,h]=(0,S.useState)(null),[g]=X.useForm(),_=(0,S.useRef)(null),v=c?.sections||[],y=c?.timePlanRules||[],b=async()=>{t(!0);try{let e=await T5();a(!!(e.isEnabled??e.is_enabled??e.data?.enabled??!1)),s(!!(e.usingDefault??e.using_default??!1)),l(J9(e.data)),d(J9(e.defaultData??e.default_data))}catch(e){BG.error(e?.message||`加载失败`)}finally{t(!1)}};(0,S.useEffect)(()=>{b()},[]);let x=e=>{l(t=>{let n=J9(Fre(t));return e(n),n})},C=async()=>{if(c){r(!0);try{let e=await E5({is_enabled:i,data:X9(c,i)});l(J9(e.data)),a(!!(e.isEnabled??e.is_enabled??e.data?.enabled??!1)),s(!!(e.usingDefault??e.using_default??!1)),BG.success(`保存成功`)}catch(e){BG.error(e?.message||`保存失败`)}finally{r(!1)}}},w=async()=>{r(!0);try{let e=await D5();l(J9(e.data)),d(J9(e.defaultData??e.default_data)),a(!!(e.isEnabled??e.is_enabled??e.data?.enabled??!1)),s(!!(e.usingDefault??e.using_default??!1)),BG.success(`已恢复默认配置`)}catch(e){BG.error(e?.message||`恢复默认失败`)}finally{r(!1)}},T=async()=>{try{zre(`video_prompt_schema_config.json`,await O5())}catch(e){BG.error(e?.message||`导出失败`)}},E=async e=>{let t=e.target.files?.[0];if(e.target.value=``,t)try{let e=await t.text(),n=JSON.parse(e),r=n.data||n,o=await k5({is_enabled:!!(n.isEnabled??n.is_enabled??i),data:r});l(J9(o.data)),a(!!(o.isEnabled??o.is_enabled??o.data?.enabled??!1)),s(!!(o.usingDefault??o.using_default??!1)),BG.success(`导入成功`)}catch(e){BG.error(e?.message||`导入失败,请检查 JSON 格式`)}},D=()=>{g.setFieldsValue({duration:8,aspectRatio:`9:16`,resolution:`1080p`,frameRate:`30fps`}),h(null),p(!0)},O=async()=>{if(!c)return;let e=await g.validateFields();try{h(await A5({is_enabled:i,data:X9(c,i),duration:Number(e.duration||8),aspect_ratio:e.aspectRatio,resolution:e.resolution,frame_rate:e.frameRate}))}catch(e){BG.error(e?.message||`预览失败`)}},k=()=>{x(e=>{e.sections.push($9(`object`))})},A=(e,t)=>{x(n=>{let r=n.sections[e];G9(r?.key)&&(delete t.key,delete t.type,delete t.enabled),n.sections[e]={...n.sections[e],...t},t.type===`object`&&(n.sections[e].children=n.sections[e].children||[]),t.type===`flow`&&(n.sections[e].contentKey=n.sections[e].contentKey||`动作内容`,n.sections[e].contentAliases=n.sections[e].contentAliases||[`动作内容`,`动作`,`动作说明`,`内容`,`说明`],n.sections[e].itemFields=n.sections[e].itemFields||[{key:`动作内容`,label:`动作内容`,enabled:!0,editable:!0,maxLength:800,value:``}])})},j=e=>{x(t=>{t.sections.splice(e,1)})},M=e=>{x(t=>{let n=t.sections[e];n.children=n.children||[],n.children.push($9(`string`))})},N=(e,t,n)=>{x(r=>{let i=r.sections[e],a=i.children||[],o=a[t];W9(i?.key,o?.key)&&(delete n.key,delete n.type,delete n.enabled,n.editable=!1),a[t]={...a[t],...n},r.sections[e].children=a})},P=(e,t)=>{x(n=>{n.sections[e].children?.splice(t,1)})},F=e=>{x(t=>{let n=t.sections[e];n.itemFields=n.itemFields||[],n.itemFields.push({key:`新流程字段`,label:`新流程字段`,enabled:!0,editable:!0,maxLength:800,value:``})})},I=(e,t,n)=>{x(r=>{let i=r.sections[e].itemFields||[];i[t]={...i[t],...n},r.sections[e].itemFields=i})},L=(e,t)=>{x(n=>{n.sections[e].itemFields?.splice(t,1)})},R=()=>{x(e=>{e.timePlanRules.push(Bre())})},z=(e,t)=>{x(n=>{n.timePlanRules[e]={...n.timePlanRules[e],...t}})},B=e=>{x(t=>{t.timePlanRules.splice(e,1)})},V=(e,t,n)=>{x(r=>{let i=r.timePlanRules[e];n.ratio!==void 0&&(i.ratios[t]=Number(n.ratio||0)),n.stage!==void 0&&(i.segments[t].stage=n.stage),n.description!==void 0&&(i.segments[t].description=n.description)})},H=e=>{x(t=>{let n=t.timePlanRules[e];n.ratios.push(1),n.segments.push({stage:`新阶段`,description:`阶段说明`})})},U=(e,t)=>{x(n=>{let r=n.timePlanRules[e];r.ratios.splice(t,1),r.segments.splice(t,1)})},W=(0,S.useMemo)(()=>v.map((e,t)=>({key:`section-${t}`,label:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(B9,{strong:!0,children:e.label||e.key||`未命名分组`}),e.key&&e.key!==e.label&&(0,Q.jsxs)(IQ,{color:`blue`,children:[`key: `,e.key]}),(0,Q.jsx)(IQ,{children:e.type}),G9(e.key)&&(0,Q.jsx)(IQ,{color:`red`,children:`系统锁定`}),!e.enabled&&!G9(e.key)&&(0,Q.jsx)(IQ,{color:`default`,children:`已禁用`})]}),children:(0,Q.jsxs)(WV,{direction:`vertical`,style:{width:`100%`},size:`middle`,children:[(0,Q.jsxs)(AK,{gutter:12,align:`middle`,children:[(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(vW,{addonBefore:`key`,value:e.key,maxLength:64,placeholder:`传给 AI 的字段名`,disabled:G9(e.key),onChange:e=>A(t,{key:e.target.value})})}),(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(vW,{addonBefore:`label`,value:e.label,maxLength:64,placeholder:`后台显示名称`,onChange:e=>A(t,{label:e.target.value})})}),(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(BC,{value:e.type,options:H9,style:{width:`100%`},disabled:G9(e.key),onChange:e=>A(t,{type:e})})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsxs)(WV,{children:[`启用`,(0,Q.jsx)(Fq,{checked:G9(e.key)?!0:e.enabled,disabled:G9(e.key),onChange:e=>A(t,{enabled:e})})]})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsxs)(WV,{children:[`可编辑`,(0,Q.jsx)(Fq,{checked:e.editable,onChange:e=>A(t,{editable:e})})]})}),(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(lB,{min:1,max:2e4,value:e.maxLength,addonBefore:`长度`,style:{width:`100%`},onChange:e=>A(t,{maxLength:Number(e||1e3)})})}),(0,Q.jsx)(gz,{span:2,style:{textAlign:`right`},children:(0,Q.jsx)(qG,{title:`确认删除该分组?`,disabled:G9(e.key),onConfirm:()=>j(t),children:(0,Q.jsx)(YE,{danger:!0,icon:(0,Q.jsx)(zQ,{}),disabled:G9(e.key)})})})]}),e.type===`object`&&(0,Q.jsx)(LR,{size:`small`,title:`对象字段`,extra:(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(DL,{}),onClick:()=>M(t),children:`新增字段`}),children:(0,Q.jsx)(WV,{direction:`vertical`,style:{width:`100%`},children:(e.children||[]).map((n,r)=>(0,Q.jsxs)(AK,{gutter:8,align:`middle`,children:[(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(vW,{addonBefore:`key`,value:n.key,maxLength:64,placeholder:`传给 AI 的字段名`,disabled:W9(e.key,n.key),onChange:e=>N(t,r,{key:e.target.value})})}),(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(vW,{addonBefore:`label`,value:n.label,maxLength:64,placeholder:`后台显示名称`,onChange:e=>N(t,r,{label:e.target.value})})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsx)(BC,{value:n.type,options:H9.filter(e=>e.value!==`object`&&e.value!==`flow`),style:{width:`100%`},disabled:W9(e.key,n.key),onChange:e=>N(t,r,{type:e})})}),(0,Q.jsx)(gz,{span:2,children:(0,Q.jsxs)(WV,{children:[`启用`,(0,Q.jsx)(Fq,{checked:W9(e.key,n.key)?!0:n.enabled,disabled:W9(e.key,n.key),onChange:e=>N(t,r,{enabled:e})})]})}),(0,Q.jsx)(gz,{span:2,children:(0,Q.jsxs)(WV,{children:[`编辑`,(0,Q.jsx)(Fq,{checked:W9(e.key,n.key)?!1:n.editable,disabled:W9(e.key,n.key),onChange:e=>N(t,r,{editable:e})})]})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsx)(lB,{min:1,max:2e4,value:n.maxLength,addonBefore:`长度`,style:{width:`100%`},onChange:e=>N(t,r,{maxLength:Number(e||1e3)})})}),(0,Q.jsx)(gz,{span:5,children:(0,Q.jsx)(vW,{value:Array.isArray(n.value)?n.value.join(`/`):String(n.value??``),maxLength:n.maxLength||1e3,placeholder:`默认值`,onChange:e=>N(t,r,{value:n.type===`array`?e.target.value.split(`/`).filter(Boolean):e.target.value})})}),(0,Q.jsx)(gz,{span:1,style:{textAlign:`right`},children:(0,Q.jsx)(YE,{danger:!0,size:`small`,icon:(0,Q.jsx)(zQ,{}),disabled:W9(e.key,n.key),onClick:()=>P(t,r)})})]},`child-${t}-${r}`))})}),e.type===`flow`&&(0,Q.jsxs)(LR,{size:`small`,title:`流程数组对象字段`,extra:(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(DL,{}),onClick:()=>F(t),children:`新增流程字段`}),children:[(0,Q.jsxs)(AK,{gutter:12,style:{marginBottom:12},children:[(0,Q.jsx)(gz,{span:6,children:(0,Q.jsx)(vW,{addonBefore:`内容字段`,value:e.contentKey,maxLength:64,onChange:e=>A(t,{contentKey:e.target.value})})}),(0,Q.jsx)(gz,{span:18,children:(0,Q.jsx)(vW,{addonBefore:`别名 / 分隔`,value:(e.contentAliases||[]).join(`/`),onChange:e=>A(t,{contentAliases:e.target.value.split(`/`).map(e=>e.trim()).filter(Boolean)})})})]}),(0,Q.jsx)(WV,{direction:`vertical`,style:{width:`100%`},children:(e.itemFields||[]).map((e,n)=>(0,Q.jsxs)(AK,{gutter:8,align:`middle`,children:[(0,Q.jsx)(gz,{span:5,children:(0,Q.jsx)(vW,{addonBefore:`key`,value:e.key,maxLength:64,placeholder:`流程对象字段名`,onChange:e=>I(t,n,{key:e.target.value})})}),(0,Q.jsx)(gz,{span:5,children:(0,Q.jsx)(vW,{addonBefore:`label`,value:e.label,maxLength:64,placeholder:`后台显示名称`,onChange:e=>I(t,n,{label:e.target.value})})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsxs)(WV,{children:[`启用`,(0,Q.jsx)(Fq,{checked:e.enabled,onChange:e=>I(t,n,{enabled:e})})]})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsxs)(WV,{children:[`编辑`,(0,Q.jsx)(Fq,{checked:e.editable,onChange:e=>I(t,n,{editable:e})})]})}),(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(lB,{min:1,max:2e4,value:e.maxLength,addonBefore:`长度`,style:{width:`100%`},onChange:e=>I(t,n,{maxLength:Number(e||800)})})}),(0,Q.jsx)(gz,{span:3,children:(0,Q.jsx)(vW,{value:String(e.value??``),maxLength:e.maxLength||800,placeholder:`默认值`,onChange:e=>I(t,n,{value:e.target.value})})}),(0,Q.jsx)(gz,{span:1,style:{textAlign:`right`},children:(0,Q.jsx)(YE,{danger:!0,size:`small`,icon:(0,Q.jsx)(zQ,{}),onClick:()=>L(t,n)})})]},`flow-${t}-${n}`))})]}),e.type!==`object`&&e.type!==`flow`&&(0,Q.jsx)(LR,{size:`small`,title:`默认值`,children:(0,Q.jsx)(V9,{rows:3,value:Array.isArray(e.value)?e.value.join(` +`):String(e.value??``),maxLength:e.maxLength||1e3,showCount:!0,onChange:n=>A(t,{value:e.type===`array`?n.target.value.split(` +`).filter(Boolean):n.target.value})})})]})})),[v]);return e||!c?(0,Q.jsx)(TG,{}):(0,Q.jsxs)(`div`,{style:{padding:24},children:[(0,Q.jsx)(LR,{children:(0,Q.jsxs)(WV,{direction:`vertical`,style:{width:`100%`},size:`large`,children:[(0,Q.jsxs)(AK,{justify:`space-between`,align:`middle`,children:[(0,Q.jsxs)(gz,{children:[(0,Q.jsx)(Mre,{level:3,style:{margin:0},children:`视频提词 Schema 配置`}),(0,Q.jsx)(Nre,{type:`secondary`,style:{marginBottom:0},children:`配置会被爆款开头复刻和拆镜复刻第 4 步视频 AI 提词共同复用。传给 AI 时只保留纯键值 schema,不携带显示名、启用、可编辑等管理字段。`})]}),(0,Q.jsx)(gz,{children:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(B9,{children:`启用自定义配置`}),(0,Q.jsx)(Fq,{checked:i,onChange:a}),o&&(0,Q.jsx)(IQ,{color:`orange`,children:`当前使用默认配置兜底`}),u&&(0,Q.jsxs)(IQ,{children:[`默认分组 `,u.sections.length]})]})})]}),(0,Q.jsx)(sf,{type:`info`,showIcon:!0,message:`长度限制策略`,description:`只对管理后台字段和用户可编辑字段做长度校验,不会自动裁剪 AI 生成结果或第 5 步最终视频 prompt。若供应商因为 prompt 过长拒绝,会按真实失败进入现有日志/退款/重试流程。`}),(0,Q.jsx)(sf,{type:`warning`,showIcon:!0,message:`预览说明`,description:`预览会跟随右上角「启用自定义配置」开关。关闭时会按默认 CLIENT_SCHEMA_V1 兜底预览;打开后才会按当前页面编辑的 sections 和秒数切片规则预览。`}),(0,Q.jsxs)(WV,{wrap:!0,children:[(0,Q.jsx)(YE,{type:`primary`,icon:(0,Q.jsx)(v3,{}),loading:n,onClick:C,children:`保存配置`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(XU,{}),onClick:D,children:`预览运行时 Schema`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(w1,{}),onClick:T,children:`导出 JSON`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(w6,{}),onClick:()=>_.current?.click(),children:`导入 JSON`}),(0,Q.jsx)(qG,{title:`确认恢复默认配置?`,description:`会用 CLIENT_SCHEMA_V1 生成的默认配置覆盖当前配置。`,onConfirm:w,children:(0,Q.jsx)(YE,{icon:(0,Q.jsx)(kK,{}),children:`恢复默认`})}),(0,Q.jsx)(`input`,{ref:_,type:`file`,accept:`application/json,.json`,style:{display:`none`},onChange:E})]}),(0,Q.jsx)(CR,{items:[{key:`fields`,label:`Schema 字段配置`,children:(0,Q.jsxs)(WV,{direction:`vertical`,style:{width:`100%`},size:`middle`,children:[(0,Q.jsx)(sf,{type:`warning`,showIcon:!0,message:`字段说明`,description:`key 是最终传给 AI 和保存到 prompt_schema 的真实字段名,例如「素材理解」「动作流程」;label 只用于管理后台显示,帮助运营/管理员理解这个字段,不会传给 AI;启用关闭后该字段不会进入运行时 schema;可编辑关闭后用户在第 4 步修改时不能改这个字段。「画面属性」里的视频时长、视频比例、清晰度、帧率、推荐分辨率属于系统锁定参数,不能改 key、不能禁用、不能开放用户编辑。`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(DL,{}),onClick:k,children:`新增一级分组`}),(0,Q.jsx)(Ng,{items:W})]})},{key:`time`,label:`秒数切片规则`,children:(0,Q.jsxs)(WV,{direction:`vertical`,style:{width:`100%`},size:`middle`,children:[(0,Q.jsx)(sf,{type:`info`,showIcon:!0,message:`切片规则说明`,description:`这里决定指定视频时长会被拆成几段,以及每段的阶段名称和说明。运行时会同步生成「动态时间规划」「动作流程」「镜头流程」三个数组,三者时间段保持一致。`}),(0,Q.jsx)(YE,{icon:(0,Q.jsx)(DL,{}),onClick:R,children:`新增秒数规则`}),y.map((e,t)=>(0,Q.jsxs)(LR,{size:`small`,title:`${e.minDuration}-${e.maxDuration} 秒:${e.segments.length} 段`,extra:(0,Q.jsx)(YE,{danger:!0,size:`small`,icon:(0,Q.jsx)(zQ,{}),onClick:()=>B(t),children:`删除规则`}),children:[(0,Q.jsxs)(AK,{gutter:12,style:{marginBottom:12},children:[(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(lB,{min:1,value:e.minDuration,addonBefore:`最小秒`,style:{width:`100%`},onChange:e=>z(t,{minDuration:Number(e||1)})})}),(0,Q.jsx)(gz,{span:4,children:(0,Q.jsx)(lB,{min:1,value:e.maxDuration,addonBefore:`最大秒`,style:{width:`100%`},onChange:e=>z(t,{maxDuration:Number(e||1)})})}),(0,Q.jsx)(gz,{span:16,children:(0,Q.jsx)(YE,{size:`small`,icon:(0,Q.jsx)(DL,{}),onClick:()=>H(t),children:`新增片段`})})]}),(0,Q.jsx)(WV,{direction:`vertical`,style:{width:`100%`},children:e.segments.map((n,r)=>(0,Q.jsxs)(AK,{gutter:8,align:`middle`,children:[(0,Q.jsx)(gz,{span:3,children:(0,Q.jsx)(lB,{min:.01,step:.01,value:e.ratios[r],addonBefore:`比例`,style:{width:`100%`},onChange:e=>V(t,r,{ratio:Number(e||.01)})})}),(0,Q.jsx)(gz,{span:5,children:(0,Q.jsx)(vW,{value:n.stage,maxLength:64,placeholder:`阶段`,onChange:e=>V(t,r,{stage:e.target.value})})}),(0,Q.jsx)(gz,{span:15,children:(0,Q.jsx)(vW,{value:n.description,maxLength:300,placeholder:`说明`,onChange:e=>V(t,r,{description:e.target.value})})}),(0,Q.jsx)(gz,{span:1,children:(0,Q.jsx)(YE,{danger:!0,size:`small`,icon:(0,Q.jsx)(zQ,{}),onClick:()=>U(t,r)})})]},r))})]},t))]})},{key:`json`,label:`JSON 高级查看`,children:(0,Q.jsx)(V9,{rows:24,value:JSON.stringify(X9(c,i),null,2),readOnly:!0})}]})]})}),(0,Q.jsxs)(UG,{title:`预览运行时 Schema`,open:f,onCancel:()=>p(!1),width:980,footer:(0,Q.jsxs)(WV,{children:[(0,Q.jsx)(YE,{onClick:()=>p(!1),children:`关闭`}),(0,Q.jsx)(YE,{type:`primary`,onClick:O,children:`生成预览`})]}),children:[(0,Q.jsxs)(X,{form:g,layout:`inline`,style:{marginBottom:16},children:[(0,Q.jsx)(X.Item,{name:`duration`,label:`时长`,rules:[{required:!0}],children:(0,Q.jsx)(lB,{min:1,max:3600})}),(0,Q.jsx)(X.Item,{name:`aspectRatio`,label:`比例`,rules:[{required:!0}],children:(0,Q.jsx)(vW,{})}),(0,Q.jsx)(X.Item,{name:`resolution`,label:`清晰度`,rules:[{required:!0}],children:(0,Q.jsx)(vW,{})}),(0,Q.jsx)(X.Item,{name:`frameRate`,label:`帧率`,rules:[{required:!0}],children:(0,Q.jsx)(vW,{})})]}),(0,Q.jsx)(xz,{}),m?(0,Q.jsx)(CR,{items:[{key:`runtime`,label:`运行时 Schema`,children:(0,Q.jsx)(V9,{rows:24,value:JSON.stringify(Z9(m),null,2),readOnly:!0})},{key:`timePlan`,label:`动态时间规划(${Q9(m).length} 段)`,children:(0,Q.jsx)(V9,{rows:24,value:JSON.stringify(Q9(m),null,2),readOnly:!0})},{key:`snapshot`,label:`配置快照`,children:(0,Q.jsx)(V9,{rows:24,value:JSON.stringify(Rre(m),null,2),readOnly:!0})}]}):(0,Q.jsx)(sf,{type:`info`,showIcon:!0,message:`点击生成预览后,可以看到传给 AI 的纯 schema、动态时间规划和本次配置快照。`})]})]})},Hre=({children:e})=>{let{user:t,loading:n,checkAuth:r}=I5();return(0,S.useEffect)(()=>{!localStorage.getItem(`auth_token`)&&!n&&!t&&(window.location.href=`/login`)},[t,n]),n?(0,Q.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,alignItems:`center`,height:`100vh`},children:(0,Q.jsx)(TG,{size:`large`})}):t?(0,Q.jsx)(Q.Fragment,{children:e}):(window.location.href=`/login`,null)};(0,_.createRoot)(document.getElementById(`root`)).render((0,Q.jsx)(()=>{let{checkAuth:e}=I5();return(0,S.useEffect)(()=>{e()},[]),(0,Q.jsx)(am,{locale:U6.default,theme:{token:{colorPrimary:`#6366f1`,borderRadius:8},components:{Button:{controlHeight:36,controlHeightLG:44},Card:{boxShadow:`0 1px 3px rgba(0,0,0,0.04)`},Table:{headerBg:`#fafbfc`}}},children:(0,Q.jsx)(cx,{children:(0,Q.jsx)(hn,{children:(0,Q.jsxs)(Dt,{children:[(0,Q.jsx)(Tt,{path:`/login`,element:(0,Q.jsx)(Y5,{})}),(0,Q.jsxs)(Tt,{path:`/`,element:(0,Q.jsx)(Hre,{children:(0,Q.jsx)(V5,{})}),children:[(0,Q.jsx)(Tt,{index:!0,element:(0,Q.jsx)(X5,{})}),(0,Q.jsx)(Tt,{path:`users`,element:(0,Q.jsx)(t7,{})}),(0,Q.jsx)(Tt,{path:`credit-records`,element:(0,Q.jsx)(pne,{})}),(0,Q.jsx)(Tt,{path:`models`,element:(0,Q.jsx)(n7,{})}),(0,Q.jsx)(Tt,{path:`credit-ratios`,element:(0,Q.jsx)(Dne,{})}),(0,Q.jsx)(Tt,{path:`video-engines`,element:(0,Q.jsx)(xne,{})}),(0,Q.jsx)(Tt,{path:`image-engines`,element:(0,Q.jsx)(wne,{})}),(0,Q.jsx)(Tt,{path:`industries`,element:(0,Q.jsx)(bne,{})}),(0,Q.jsx)(Tt,{path:`menu-configs`,element:(0,Q.jsx)(jne,{})}),(0,Q.jsx)(Tt,{path:`recharge-packages`,element:(0,Q.jsx)(Pne,{})}),(0,Q.jsx)(Tt,{path:`payment`,element:(0,Q.jsx)(mne,{})}),(0,Q.jsx)(Tt,{path:`payment-stats`,element:(0,Q.jsx)(gne,{})}),(0,Q.jsx)(Tt,{path:`settings`,element:(0,Q.jsx)(r7,{})}),(0,Q.jsx)(Tt,{path:`video-prompt-schema-config`,element:(0,Q.jsx)(Vre,{})}),(0,Q.jsx)(Tt,{path:`notifications`,element:(0,Q.jsx)(i7,{})}),(0,Q.jsx)(Tt,{path:`oauthapp-list`,element:(0,Q.jsx)(Lne,{})}),(0,Q.jsx)(Tt,{path:`operation-logs`,element:(0,Q.jsx)(Ine,{})}),(0,Q.jsx)(Tt,{path:`generation-records`,element:(0,Q.jsx)(Hne,{})}),(0,Q.jsx)(Tt,{path:`generation-ai`,element:(0,Q.jsx)(qne,{})}),(0,Q.jsx)(Tt,{path:`hot-opening-replications`,element:(0,Q.jsx)(Qne,{})}),(0,Q.jsx)(Tt,{path:`hot-opening-replications/:projectId`,element:(0,Q.jsx)(vre,{})}),(0,Q.jsx)(Tt,{path:`shot-replications`,element:(0,Q.jsx)(Cre,{})}),(0,Q.jsx)(Tt,{path:`shot-replications/task-sets/:taskSetId`,element:(0,Q.jsx)(jre,{})}),(0,Q.jsx)(Tt,{path:`shot-replications/projects/:projectId`,element:(0,Q.jsx)(O9,{moduleType:`shot_replicate`})}),(0,Q.jsx)(Tt,{path:`authoriza`,element:(0,Q.jsx)(G5,{})}),(0,Q.jsx)(Tt,{path:`consume`,element:(0,Q.jsx)(J5,{})}),(0,Q.jsx)(Tt,{path:`platform`,element:(0,Q.jsx)(e7,{})})]}),(0,Q.jsx)(Tt,{path:`*`,element:(0,Q.jsx)(Ct,{to:`/`,replace:!0})})]})})})})},{})); \ No newline at end of file diff --git a/video-gen-admin/dist/assets/index-wN5bY_f7.js b/video-gen-admin/dist/assets/index-wN5bY_f7.js deleted file mode 100644 index 1b97fe3f..00000000 --- a/video-gen-admin/dist/assets/index-wN5bY_f7.js +++ /dev/null @@ -1,407 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&j(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&j(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,A=k.port2;k.port1.onmessage=D,O=function(){A.postMessage(null)}}else O=function(){_(D,0)};function j(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,j(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),u=o(((e,t)=>{t.exports=l()})),d=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=d()})),p=o((e=>{var t=f();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=u(),n=f(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1B||(e.current=z[B],z[B]=null,B--)}function U(e,t){B++,z[B]=e.current,e.current=t}var W=V(null),ee=V(null),te=V(null),G=V(null);function ne(e,t){switch(U(te,t),U(ee,e),U(W,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Wd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Wd(t),e=Gd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}H(W),U(W,e)}function K(){H(W),H(ee),H(te)}function re(e){e.memoizedState!==null&&U(G,e);var t=W.current,n=Gd(t,e.type);t!==n&&(U(ee,e),U(W,n))}function ie(e){ee.current===e&&(H(W),H(ee)),G.current===e&&(H(G),tp._currentValue=R)}var ae,q;function oe(e){if(ae===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);ae=t&&t[1]||``,q=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{se=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?oe(n):``}function le(e,t){switch(e.tag){case 26:case 27:case 5:return oe(e.type);case 16:return oe(`Lazy`);case 13:return e.child!==t&&t!==null?oe(`Suspense Fallback`):oe(`Suspense`);case 19:return oe(`SuspenseList`);case 0:case 15:return ce(e.type,!1);case 11:return ce(e.type.render,!1);case 1:return ce(e.type,!0);case 31:return oe(`Activity`);default:return``}}function ue(e){try{var t=``,n=null;do t+=le(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var de=Object.prototype.hasOwnProperty,fe=t.unstable_scheduleCallback,pe=t.unstable_cancelCallback,me=t.unstable_shouldYield,he=t.unstable_requestPaint,ge=t.unstable_now,_e=t.unstable_getCurrentPriorityLevel,ve=t.unstable_ImmediatePriority,ye=t.unstable_UserBlockingPriority,be=t.unstable_NormalPriority,xe=t.unstable_LowPriority,Se=t.unstable_IdlePriority,Ce=t.log,we=t.unstable_setDisableYieldValue,Te=null,Ee=null;function De(e){if(typeof Ce==`function`&&we(e),Ee&&typeof Ee.setStrictMode==`function`)try{Ee.setStrictMode(Te,e)}catch{}}var Oe=Math.clz32?Math.clz32:je,ke=Math.log,Ae=Math.LN2;function je(e){return e>>>=0,e===0?32:31-(ke(e)/Ae|0)|0}var Me=256,Ne=262144,Pe=4194304;function Fe(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ie(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Fe(n))):i=Fe(o):i=Fe(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Fe(n))):i=Fe(o)):i=Fe(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Le(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Re(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ze(){var e=Pe;return Pe<<=1,!(Pe&62914560)&&(Pe=4194304),e}function Be(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ve(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function He(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),en=!1;if($t)try{var tn={};Object.defineProperty(tn,`passive`,{get:function(){en=!0}}),window.addEventListener(`test`,tn,tn),window.removeEventListener(`test`,tn,tn)}catch{en=!1}var nn=null,rn=null,an=null;function on(){if(an)return an;var e,t=rn,n=t.length,r,i=`value`in nn?nn.value:nn.textContent,a=i.length;for(e=0;e=Rn),Vn=` `,Hn=!1;function Un(e,t){switch(e){case`keyup`:return In.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Wn(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Gn=!1;function Kn(e,t){switch(e){case`compositionend`:return Wn(t);case`keypress`:return t.which===32?(Hn=!0,Vn):null;case`textInput`:return e=t.data,e===Vn&&Hn?null:e;default:return null}}function qn(e,t){if(Gn)return e===`compositionend`||!Ln&&Un(e,t)?(e=on(),an=rn=nn=null,Gn=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=hr(n)}}function _r(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?_r(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function vr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Dt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Dt(e.document)}return t}function yr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var br=$t&&`documentMode`in document&&11>=document.documentMode,xr=null,Sr=null,Cr=null,wr=!1;function Tr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;wr||xr==null||xr!==Dt(r)||(r=xr,`selectionStart`in r&&yr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Cr&&mr(Cr,r)||(Cr=r,r=Od(Sr,`onSelect`),0>=o,i-=o,gi=1<<32-Oe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),Ti&&vi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),Ti&&vi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return Ti&&vi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),Ti&&vi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&va(l)===r.type){n(e,r.sibling),c=a(r,o.props),Ta(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=ri(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=ni(o.type,o.key,o.props,null,e.mode,c),Ta(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=oi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=va(o),b(e,r,o,c)}if(F(o))return h(e,r,o,c);if(M(o)){if(l=M(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,wa(o),c);if(o.$$typeof===C)return b(e,r,Y(e,o),c);Ea(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=ii(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Ca=0;var i=b(e,t,n,r);return Sa=null,i}catch(t){if(t===fa||t===ma)throw t;var a=Qr(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Oa=Da(!0),ka=Da(!1),Aa=!1;function ja(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ma(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Na(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Pa(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,Pl&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Yr(e),Jr(e,null,n),t}return Gr(e,r,t,n),Yr(e)}function Fa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,We(e,n)}}function Ia(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var La=!1;function Ra(){if(La){var e=ra;if(e!==null)throw e}}function za(e,t,n,r){La=!1;var i=e.updateQueue;Aa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(Ll&f)===f:(r&f)===f){f!==0&&f===na&&(La=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Aa=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Ba(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Va(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=I.T,s={};I.T=s,Os(e,!1,t,n);try{var c=i(),l=I.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ds(e,t,oa(c,r),pu(e)):Ds(e,t,r,pu(e))}catch(n){Ds(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{L.p=a,o!==null&&s.types!==null&&(o.types=s.types),I.T=o}}function _s(){}function vs(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=ys(e).queue;gs(e,a,t,R,n===null?_s:function(){return bs(e),n(r)})}function ys(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:R,baseState:R,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ko,lastRenderedState:R},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ko,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function bs(e){var t=ys(e);t.next===null&&(t=e.alternate.memoizedState),Ds(e,t.next.queue,{},pu())}function xs(){return Ki(tp)}function Ss(){return wo().memoizedState}function Cs(){return wo().memoizedState}function ws(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Na(n);var r=Pa(t,e,n);r!==null&&(hu(r,t,n),Fa(r,t,n)),t={cache:Qi()},e.payload=t;return}t=t.return}}function Ts(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},ks(e)?As(t,n):(n=Kr(e,t,n,r),n!==null&&(hu(n,e,r),js(n,t,r)))}function Es(e,t,n){Ds(e,t,n,pu())}function Ds(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(ks(e))As(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,pr(s,o))return Gr(e,t,i,0),Fl===null&&J(),!1}catch{}if(n=Kr(e,t,i,r),n!==null)return hu(n,e,r),js(n,t,r),!0}return!1}function Os(e,t,n,r){if(r={lane:2,revertLane:fd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},ks(e)){if(t)throw Error(i(479))}else t=Kr(e,n,r,2),t!==null&&hu(t,e,2)}function ks(e){var t=e.alternate;return e===ro||t!==null&&t===ro}function As(e,t){so=oo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function js(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,We(e,n)}}var Ms={readContext:Ki,use:Do,useCallback:mo,useContext:mo,useEffect:mo,useImperativeHandle:mo,useLayoutEffect:mo,useInsertionEffect:mo,useMemo:mo,useReducer:mo,useRef:mo,useState:mo,useDebugValue:mo,useDeferredValue:mo,useTransition:mo,useSyncExternalStore:mo,useId:mo,useHostTransitionStatus:mo,useFormState:mo,useActionState:mo,useOptimistic:mo,useMemoCache:mo,useCacheRefresh:mo};Ms.useEffectEvent=mo;var Ns={readContext:Ki,use:Do,useCallback:function(e,t){return Co().memoizedState=[e,t===void 0?null:t],e},useContext:Ki,useEffect:rs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ts(4194308,4,ls.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ts(4194308,4,e,t)},useInsertionEffect:function(e,t){ts(4,2,e,t)},useMemo:function(e,t){var n=Co();t=t===void 0?null:t;var r=e();if(co){De(!0);try{e()}finally{De(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Co();if(n!==void 0){var i=n(t);if(co){De(!0);try{n(t)}finally{De(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ts.bind(null,ro,e),[r.memoizedState,e]},useRef:function(e){var t=Co();return e={current:e},t.memoizedState=e},useState:function(e){e=zo(e);var t=e.queue,n=Es.bind(null,ro,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ds,useDeferredValue:function(e,t){return ms(Co(),e,t)},useTransition:function(){var e=zo(!1);return e=gs.bind(null,ro,e.queue,!0,!1),Co().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=ro,a=Co();if(Ti){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Fl===null)throw Error(i(349));Ll&127||Po(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,rs(Io.bind(null,r,o,e),[e]),r.flags|=2048,$o(9,{destroy:void 0},Fo.bind(null,r,o,n,t),null),n},useId:function(){var e=Co(),t=Fl.identifierPrefix;if(Ti){var n=_i,r=gi;n=(r&~(1<<32-Oe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=lo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[Ze]=t,o[Qe]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Ld(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Dc(t)}}return Mc(t),Oc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Dc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=te.current,Mi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ci,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[Ze]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Pd(e.nodeValue,n)),e||ki(t,!0)}else e=Ud(e).createTextNode(r),e[Ze]=t,t.stateNode=e}return Mc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Mi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[Ze]=t}else Ni(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Mc(t),e=!1}else n=Pi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?($a(t),t):($a(t),null);if(t.flags&128)throw Error(i(558))}return Mc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Mi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[Ze]=t}else Ni(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Mc(t),a=!1}else a=Pi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?($a(t),t):($a(t),null)}return $a(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Ac(t,t.updateQueue),Mc(t),null);case 4:return K(),e===null&&wd(t.stateNode.containerInfo),Mc(t),null;case 10:return Bi(t.type),Mc(t),null;case 19:if(H(eo),r=t.memoizedState,r===null)return Mc(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)jc(r,!1);else{if(Wl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=to(e),o!==null){for(t.flags|=128,jc(r,!1),e=o.updateQueue,t.updateQueue=e,Ac(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)ti(n,e),n=n.sibling;return U(eo,eo.current&1|2),Ti&&vi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&ge()>tu&&(t.flags|=128,a=!0,jc(r,!1),t.lanes=4194304)}else{if(!a)if(e=to(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Ac(t,e),jc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!Ti)return Mc(t),null}else 2*ge()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,jc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Mc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ge(),e.sibling=null,n=eo.current,U(eo,a?n&1|2:n&1),Ti&&vi(t,r.treeForkCount),e);case 22:case 23:return $a(t),Ka(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Mc(t),t.subtreeFlags&6&&(t.flags|=8192)):Mc(t),n=t.updateQueue,n!==null&&Ac(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&H(ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Bi(Zi),Mc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Pc(e,t){switch(xi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Bi(Zi),K(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ie(t),null;case 31:if(t.memoizedState!==null){if($a(t),t.alternate===null)throw Error(i(340));Ni()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if($a(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Ni()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return H(eo),null;case 4:return K(),null;case 10:return Bi(t.type),null;case 22:case 23:return $a(t),Ka(),e!==null&&H(ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Bi(Zi),null;case 25:return null;default:return null}}function Fc(e,t){switch(xi(t),t.tag){case 3:Bi(Zi),K();break;case 26:case 27:case 5:ie(t);break;case 4:K();break;case 31:t.memoizedState!==null&&$a(t);break;case 13:$a(t);break;case 19:H(eo);break;case 10:Bi(t.type);break;case 22:case 23:$a(t),Ka(),e!==null&&H(ca);break;case 24:Bi(Zi)}}function Ic(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Gu(t,t.return,e)}}function Lc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Gu(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Gu(t,t.return,e)}}function Rc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Va(t,n)}catch(t){Gu(e,e.return,t)}}}function zc(e,t,n){n.props=Bs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Gu(e,t,n)}}function Bc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Gu(e,t,n)}}function Vc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Gu(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Gu(e,t,n)}else n.current=null}function Hc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Gu(e,e.return,t)}}function Uc(e,t,n){try{var r=e.stateNode;Rd(r,e.type,n,t),r[Qe]=t}catch(t){Gu(e,e.return,t)}}function Wc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&ef(e.type)||e.tag===4}function Gc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Wc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&ef(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Kc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Wt));else if(r!==4&&(r===27&&ef(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Kc(e,t,n),e=e.sibling;e!==null;)Kc(e,t,n),e=e.sibling}function qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&ef(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(qc(e,t,n),e=e.sibling;e!==null;)qc(e,t,n),e=e.sibling}function Jc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Ld(t,r,n),t[Ze]=e,t[Qe]=n}catch(t){Gu(e,e.return,t)}}var Yc=!1,Xc=!1,Zc=!1,Qc=typeof WeakSet==`function`?WeakSet:Set,$c=null;function el(e,t){if(e=e.containerInfo,Vd=up,e=vr(e),yr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Hd={focusedElem:e,selectionRange:n},up=!1,$c=t;$c!==null;)if(t=$c,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,$c=e;else for(;$c!==null;){switch(t=$c,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Ld(o,r,n),o[Ze]=e,ut(o),r=o;break a;case`link`:var s=Wf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=gr(s,h),v=gr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,I.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,Pl&6)throw Error(i(331));var c=Pl;if(Pl|=4,kl(o.current),Sl(o,o.current,s,n),Pl=c,ad(0,!1),Ee&&typeof Ee.onPostCommitFiberRoot==`function`)try{Ee.onPostCommitFiberRoot(Te,o)}catch{}return!0}finally{L.p=a,I.T=r,Vu(e,t)}}function Wu(e,t,n){t=ci(n,t),t=Ks(e.stateNode,t,2),e=Pa(e,t,2),e!==null&&(Ve(e,2),id(e))}function Gu(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=ci(n,e),n=qs(2),r=Pa(t,n,2),r!==null&&(Js(n,r,t,e),Ve(r,2),id(r));break}}t=t.return}}function Ku(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Nl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Hl=!0,i.add(n),e=qu.bind(null,e,t,n),t.then(e,e))}function qu(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Fl===e&&(Ll&n)===n&&(Wl===4||Wl===3&&(Ll&62914560)===Ll&&300>ge()-$l?!(Pl&2)&&Su(e,0):ql|=n,Yl===Ll&&(Yl=0)),id(e)}function Ju(e,t){t===0&&(t=ze()),e=qr(e,t),e!==null&&(Ve(e,t),id(e))}function Yu(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Ju(e,n)}function Xu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),Ju(e,n)}function Zu(e,t){return fe(e,t)}var Qu=null,$u=null,ed=!1,td=!1,nd=!1,rd=0;function id(e){e!==$u&&e.next===null&&($u===null?Qu=$u=e:$u=$u.next=e),td=!0,ed||(ed=!0,dd())}function ad(e,t){if(!nd&&td){nd=!0;do for(var n=!1,r=Qu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Oe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ud(r,a))}else a=Ll,a=Ie(r,r===Fl?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Le(r,a)||(n=!0,ud(r,a));r=r.next}while(n);nd=!1}}function od(){sd()}function sd(){td=ed=!1;var e=0;rd!==0&&Jd()&&(e=rd);for(var t=ge(),n=null,r=Qu;r!==null;){var i=r.next,a=cd(r,t);a===0?(r.next=null,n===null?Qu=i:n.next=i,i===null&&($u=n)):(n=r,(e!==0||a&3)&&(td=!0)),r=i}iu!==0&&iu!==5||ad(e,!1),rd!==0&&(rd=0)}function cd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&zd(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function wf(e,t,n){var r=Cf;if(r&&typeof t==`string`&&t){var i=kt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),vf.has(i)||(vf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Ld(t,`link`,e),ut(t),r.head.appendChild(t)))}}function Tf(e){bf.D(e),wf(`dns-prefetch`,e,null)}function Ef(e,t){bf.C(e,t),wf(`preconnect`,e,t)}function Df(e,t,n){bf.L(e,t,n);var r=Cf;if(r&&e&&t){var i=`link[rel="preload"][as="`+kt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+kt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+kt(n.imageSizes)+`"]`)):i+=`[href="`+kt(e)+`"]`;var a=i;switch(t){case`style`:a=Nf(e);break;case`script`:a=Lf(e)}_f.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),_f.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Pf(a))||t===`script`&&r.querySelector(Rf(a))||(t=r.createElement(`link`),Ld(t,`link`,e),ut(t),r.head.appendChild(t)))}}function Of(e,t){bf.m(e,t);var n=Cf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+kt(r)+`"][href="`+kt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Lf(e)}if(!_f.has(a)&&(e=h({rel:`modulepreload`,href:e},t),_f.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Rf(a)))return}r=n.createElement(`link`),Ld(r,`link`,e),ut(r),n.head.appendChild(r)}}}function kf(e,t,n){bf.S(e,t,n);var r=Cf;if(r&&e){var i=lt(r).hoistableStyles,a=Nf(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Pf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=_f.get(a))&&Vf(e,n);var c=o=r.createElement(`link`);ut(c),Ld(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Bf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Af(e,t){bf.X(e,t);var n=Cf;if(n&&e){var r=lt(n).hoistableScripts,i=Lf(e),a=r.get(i);a||(a=n.querySelector(Rf(i)),a||(e=h({src:e,async:!0},t),(t=_f.get(i))&&Hf(e,t),a=n.createElement(`script`),ut(a),Ld(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function jf(e,t){bf.M(e,t);var n=Cf;if(n&&e){var r=lt(n).hoistableScripts,i=Lf(e),a=r.get(i);a||(a=n.querySelector(Rf(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=_f.get(i))&&Hf(e,t),a=n.createElement(`script`),ut(a),Ld(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mf(e,t,n,r){var a=(a=te.current)?yf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Nf(n.href),n=lt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Nf(n.href);var o=lt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Pf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),_f.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},_f.set(e,n),o||If(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Lf(n),n=lt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Nf(e){return`href="`+kt(e)+`"`}function Pf(e){return`link[rel="stylesheet"][`+e+`]`}function Ff(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function If(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Ld(t,`link`,n),ut(t),e.head.appendChild(t))}function Lf(e){return`[src="`+kt(e)+`"]`}function Rf(e){return`script[async]`+e}function zf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+kt(n.href)+`"]`);if(r)return t.instance=r,ut(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),ut(r),Ld(r,`style`,a),Bf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Nf(n.href);var o=e.querySelector(Pf(a));if(o)return t.state.loading|=4,t.instance=o,ut(o),o;r=Ff(n),(a=_f.get(a))&&Vf(r,a),o=(e.ownerDocument||e).createElement(`link`),ut(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Ld(o,`link`,r),t.state.loading|=4,Bf(o,n.precedence,e),t.instance=o;case`script`:return o=Lf(n.src),(a=e.querySelector(Rf(o)))?(t.instance=a,ut(a),a):(r=n,(a=_f.get(o))&&(r=h({},n),Hf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),ut(a),Ld(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Bf(r,n.precedence,e));return t.instance}function Bf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Kf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function qf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Jf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Nf(r.href),a=t.querySelector(Pf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Zf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,ut(a);return}a=t.ownerDocument||t,r=Ff(r),(i=_f.get(i))&&Vf(r,i),a=a.createElement(`link`),ut(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Ld(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Zf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Yf=0;function Xf(e,t){return e.stylesheets&&e.count===0&&$f(e,e.stylesheets),0Yf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Zf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)$f(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Qf=null;function $f(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Qf=new Map,t.forEach(ep,e),Qf=null,Zf.call(e))}function ep(e,t){if(!(t.state.loading&4)){var n=Qf.get(e);if(n)var r=n.get(null);else{n=new Map,Qf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()}))(),_=`modulepreload`,v=function(e){return`/`+e},y={},b=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=v(t,n),t in y)return;y[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:_,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},x=c(f(),1),S=`popstate`;function C(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function w(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return k(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:A(t)}return M(t,n,null,e)}function T(e,t){if(e===!1||e==null)throw Error(t)}function E(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function D(){return Math.random().toString(36).substring(2,10)}function O(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function k(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?j(t):t,state:n,key:t&&t.key||r||D(),mask:i}}function A({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function j(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function M(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=C(e)?e:k(h.location,e,t);n&&n(r,e),l=u()+1;let d=O(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=C(e)?e:k(h.location,e,t);n&&n(r,e),l=u();let i=O(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return N(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(S,d),c=e,()=>{i.removeEventListener(S,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function N(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),T(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:A(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function P(e,t,n=`/`){return F(e,t,n,!1)}function F(e,t,n,r,i){let a=oe((typeof t==`string`?j(t):t).pathname||`/`,n);if(a==null)return null;let o=i??L(e),s=null,c=q(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;T(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=he([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(T(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),R(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:ne(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of z(e.path))a(e,t,!0,n)}),t}function z(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=z(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function B(e){e.sort((e,t)=>e.score===t.score?K(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var V=/^:[\w-]+$/,H=3,U=2,W=1,ee=10,te=-2,G=e=>e===`*`;function ne(e,t){let n=e.split(`/`),r=n.length;return n.some(G)&&(r+=te),t&&(r+=U),n.filter(e=>!G(e)).reduce((e,t)=>e+(V.test(t)?H:t===``?W:ee),r)}function K(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function re(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function ae(e,t=!1,n=!0){E(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function q(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return E(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function oe(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var se=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function ce(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?j(e):e,a;return n?(n=me(n),a=n.startsWith(`/`)?le(n.substring(1),`/`):le(n,t)):a=t,{pathname:a,search:ve(r),hash:ye(i)}}function le(e,t){let n=ge(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function ue(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function de(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function fe(e){let t=de(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function pe(e,t,n,r=!1){let i;typeof e==`string`?i=j(e):(i={...e},T(!i.pathname||!i.pathname.includes(`?`),ue(`?`,`pathname`,`search`,i)),T(!i.pathname||!i.pathname.includes(`#`),ue(`#`,`pathname`,`hash`,i)),T(!i.search||!i.search.includes(`#`),ue(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=ce(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var me=e=>e.replace(/\/\/+/g,`/`),he=e=>me(e.join(`/`)),ge=e=>e.replace(/\/+$/,``),_e=e=>ge(e).replace(/^\/*/,`/`),ve=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,ye=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,be=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function xe(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Se(e){return he(e.map(e=>e.route.path).filter(Boolean))||`/`}var Ce=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function we(e,t){let n=e;if(typeof n!=`string`||!se.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Ce)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=oe(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{E(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Te=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(Te);var Ee=[`GET`,...Te];new Set(Ee);var De=x.createContext(null);De.displayName=`DataRouter`;var Oe=x.createContext(null);Oe.displayName=`DataRouterState`;var ke=x.createContext(!1);function Ae(){return x.useContext(ke)}var je=x.createContext({isTransitioning:!1});je.displayName=`ViewTransition`;var Me=x.createContext(new Map);Me.displayName=`Fetchers`;var Ne=x.createContext(null);Ne.displayName=`Await`;var Pe=x.createContext(null);Pe.displayName=`Navigation`;var Fe=x.createContext(null);Fe.displayName=`Location`;var Ie=x.createContext({outlet:null,matches:[],isDataRoute:!1});Ie.displayName=`Route`;var Le=x.createContext(null);Le.displayName=`RouteError`;var Re=`REACT_ROUTER_ERROR`,ze=`REDIRECT`,Be=`ROUTE_ERROR_RESPONSE`;function Ve(e){if(e.startsWith(`${Re}:${ze}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function He(e){if(e.startsWith(`${Re}:${Be}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new be(t.status,t.statusText,t.data)}catch{}}function Ue(e,{relative:t}={}){T(We(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=x.useContext(Pe),{hash:i,pathname:a,search:o}=$e(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:he([n,a])),r.createHref({pathname:s,search:o,hash:i})}function We(){return x.useContext(Fe)!=null}function Ge(){return T(We(),`useLocation() may be used only in the context of a component.`),x.useContext(Fe).location}var Ke=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function qe(e){x.useContext(Pe).static||x.useLayoutEffect(e)}function Je(){let{isDataRoute:e}=x.useContext(Ie);return e?vt():Ye()}function Ye(){T(We(),`useNavigate() may be used only in the context of a component.`);let e=x.useContext(De),{basename:t,navigator:n}=x.useContext(Pe),{matches:r}=x.useContext(Ie),{pathname:i}=Ge(),a=JSON.stringify(fe(r)),o=x.useRef(!1);return qe(()=>{o.current=!0}),x.useCallback((r,s={})=>{if(E(o.current,Ke),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=pe(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:he([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}var Xe=x.createContext(null);function Ze(e){let t=x.useContext(Ie).outlet;return x.useMemo(()=>t&&x.createElement(Xe.Provider,{value:e},t),[t,e])}function Qe(){let{matches:e}=x.useContext(Ie);return e[e.length-1]?.params??{}}function $e(e,{relative:t}={}){let{matches:n}=x.useContext(Ie),{pathname:r}=Ge(),i=JSON.stringify(fe(n));return x.useMemo(()=>pe(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function et(e,t){return tt(e,t)}function tt(e,t,n){T(We(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=x.useContext(Pe),{matches:i}=x.useContext(Ie),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;bt(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let u=Ge(),d;if(t){let e=typeof t==`string`?j(t):t;T(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):P(e,{pathname:p});E(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),E(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let h=ct(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:he([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:he([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?x.createElement(Fe.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function nt(){let e=_t(),t=xe(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=x.createElement(x.Fragment,null,x.createElement(`p`,null,`💿 Hey developer 👋`),x.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,x.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,x.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),x.createElement(x.Fragment,null,x.createElement(`h2`,null,`Unexpected Application Error!`),x.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?x.createElement(`pre`,{style:i},n):null,o)}var rt=x.createElement(nt,null),it=class extends x.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=He(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:x.createElement(Ie.Provider,{value:this.props.routeContext},x.createElement(Le.Provider,{value:e,children:this.props.component}));return this.context?x.createElement(ot,{error:e},t):t}};it.contextType=ke;var at=new WeakMap;function ot({children:e,error:t}){let{basename:n}=x.useContext(Pe);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=Ve(t.digest);if(e){let r=at.get(t);if(r)throw r;let i=we(e.location,n);if(Ce&&!at.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw at.set(t,n),n}return x.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function st({routeContext:e,match:t,children:n}){let r=x.useContext(De);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),x.createElement(Ie.Provider,{value:e},n)}function ct(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);T(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:Se(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||rt,o&&(s<0&&c===0?(bt(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?x.createElement(n.route.Component,null):n.route.element?n.route.element:e,x.createElement(st,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?x.createElement(it,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function lt(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function ut(e){let t=x.useContext(De);return T(t,lt(e)),t}function dt(e){let t=x.useContext(Oe);return T(t,lt(e)),t}function ft(e){let t=x.useContext(Ie);return T(t,lt(e)),t}function pt(e){let t=ft(e),n=t.matches[t.matches.length-1];return T(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function mt(){return pt(`useRouteId`)}function ht(){return dt(`useNavigation`).navigation}function gt(){let{matches:e,loaderData:t}=dt(`useMatches`);return x.useMemo(()=>e.map(e=>I(e,t)),[e,t])}function _t(){let e=x.useContext(Le),t=dt(`useRouteError`),n=pt(`useRouteError`);return e===void 0?t.errors?.[n]:e}function vt(){let{router:e}=ut(`useNavigate`),t=pt(`useNavigate`),n=x.useRef(!1);return qe(()=>{n.current=!0}),x.useCallback(async(r,i={})=>{E(n.current,Ke),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var yt={};function bt(e,t,n){!t&&!yt[e]&&(yt[e]=!0,E(!1,n))}x.memo(xt);function xt({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return tt(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function St({to:e,replace:t,state:n,relative:r}){T(We(),` may be used only in the context of a component.`);let{static:i}=x.useContext(Pe);E(!i,` must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.`);let{matches:a}=x.useContext(Ie),{pathname:o}=Ge(),s=Je(),c=pe(e,fe(a),o,r===`path`),l=JSON.stringify(c);return x.useEffect(()=>{s(JSON.parse(l),{replace:t,state:n,relative:r})},[s,l,r,t,n]),null}function Ct(e){return Ze(e.context)}function wt(e){T(!1,`A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .`)}function Tt({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){T(!We(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=x.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=j(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=x.useMemo(()=>{let e=oe(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return E(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:x.createElement(Pe.Provider,{value:c},x.createElement(Fe.Provider,{children:t,value:h}))}function Et({children:e,location:t}){return et(Dt(e),t)}x.Component;function Dt(e,t=[]){let n=[];return x.Children.forEach(e,(e,r)=>{if(!x.isValidElement(e))return;let i=[...t,r];if(e.type===x.Fragment){n.push.apply(n,Dt(e.props.children,i));return}T(e.type===wt,`[${typeof e.type==`string`?e.type:e.type.name}] is not a component. All component children of must be a or `),T(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=Dt(e.props.children,i)),n.push(a)}),n}var Ot=`get`,kt=`application/x-www-form-urlencoded`;function At(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function jt(e){return At(e)&&e.tagName.toLowerCase()===`button`}function Mt(e){return At(e)&&e.tagName.toLowerCase()===`form`}function Nt(e){return At(e)&&e.tagName.toLowerCase()===`input`}function Pt(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Ft(e,t){return e.button===0&&(!t||t===`_self`)&&!Pt(e)}var It=null;function Lt(){if(It===null)try{new FormData(document.createElement(`form`),0),It=!1}catch{It=!0}return It}var Rt=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function zt(e){return e!=null&&!Rt.has(e)?(E(!1,`"${e}" is not a valid \`encType\` for \`\`/\`\` and will default to "${kt}"`),null):e}function Bt(e,t){let n,r,i,a,o;if(Mt(e)){let o=e.getAttribute(`action`);r=o?oe(o,t):null,n=e.getAttribute(`method`)||Ot,i=zt(e.getAttribute(`enctype`))||kt,a=new FormData(e)}else if(jt(e)||Nt(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a + > + 详情 + + > + 更新 + + > + 删除 + ), }, @@ -198,8 +256,12 @@ const AdminPlatform: React.FC = () => { 平台开户方式管理 - - + +
{ pageSize, total, showTotal: (t) => `共 ${t} 条记录`, - onChange: (p, ps) => { setPage(p); setPageSize(ps); load(p, ps); }, + onChange: (p, ps) => { + setPage(p); + setPageSize(ps); + load(p, ps); + }, }} scroll={{ x: 1000 }} /> @@ -231,7 +297,6 @@ const AdminPlatform: React.FC = () => { width={600} > -
{ name="type_name" label="类型名称" style={{ flex: 1 }} - rules={[{ required: true, message: '请输入类型名称' }, { max: 100, message: '类型名称不能超过100个字符' }]} + rules={[ + { required: true, message: '请输入类型名称' }, + { max: 100, message: '类型名称不能超过100个字符' }, + ]} >
- + { listType="picture-card" customRequest={async ({ file, onSuccess, onError }) => { try { - const res = await uploadImage(file as File); + const uploadFile = assertUploadFile(file); + const res = await uploadImage(uploadFile); console.log(res); createForm.setFieldsValue({ thumb: res.url }); - onSuccess(res); - } catch (e: any) { - onError(e); + onSuccess?.(res); + } catch (e) { + onError?.(normalizeUploadError(e)); } }} > @@ -301,7 +370,16 @@ const AdminPlatform: React.FC = () => {

开户类型: {currentOpenType.open_type}

类型名称: {currentOpenType.type_name}

描述: {currentOpenType.description}

-

缩略图: {currentOpenType.thumb ? thumb : '-'}

+

+ 缩略图:{' '} + {currentOpenType.thumb ? ( + thumb + ) : '-'} +

创建时间: {formatDate(currentOpenType.createdAt)}

更新时间: {formatDate(currentOpenType.updatedAt)}

@@ -332,7 +410,10 @@ const AdminPlatform: React.FC = () => { @@ -349,14 +430,19 @@ const AdminPlatform: React.FC = () => { > { try { - const res = await uploadImage(file); + const uploadFile = assertUploadFile(file); + const res = await uploadImage(uploadFile); updateForm.setFieldsValue({ thumb: res.url }); - onSuccess(res); - } catch (e: any) { - onError(e); + onSuccess?.(res); + } catch (e) { + onError?.(normalizeUploadError(e)); } }} > @@ -374,4 +460,4 @@ const AdminPlatform: React.FC = () => { ); }; -export default AdminPlatform; +export default AdminPlatform; \ No newline at end of file diff --git a/video-gen-admin/src/types/index.ts b/video-gen-admin/src/types/index.ts index 3646e275..4704d445 100644 --- a/video-gen-admin/src/types/index.ts +++ b/video-gen-admin/src/types/index.ts @@ -278,6 +278,8 @@ export interface GenerationAIEngineSnapshot { id?: string; name?: string; provider?: string; + modelName?: string; + model?: string; supportedModels?: string[]; defaultSize?: string; selectedSize?: string; diff --git a/video-gen-admin/src/utils/excelExport.ts b/video-gen-admin/src/utils/excelExport.ts index 1fc46324..14af7f9a 100644 --- a/video-gen-admin/src/utils/excelExport.ts +++ b/video-gen-admin/src/utils/excelExport.ts @@ -92,7 +92,7 @@ function estimateColumnWidths(rows: ExcelCellValue[][], columns: StyledExcelColu const config = columns[index]; if (config?.width) return { wch: config.width }; - const maxLength = rows.reduce((max, row) => Math.max(max, visualLength(row[index])), visualLength(config?.title)); + const maxLength = rows.reduce((max, row) => Math.max(max, visualLength(row[index])), visualLength(config?.title)); const minWidth = config?.minWidth ?? 10; const maxWidth = config?.maxWidth ?? 42; return { wch: clamp(Math.ceil(maxLength * 1.15) + 2, minWidth, maxWidth) }; @@ -100,7 +100,7 @@ function estimateColumnWidths(rows: ExcelCellValue[][], columns: StyledExcelColu } function estimateRowHeight(row: ExcelCellValue[], colWidths: { wch: number }[], baseHeight = 20): number { - const maxLines = row.reduce((max, cell, index) => { + const maxLines = row.reduce((max, cell, index) => { const width = Math.max(8, colWidths[index]?.wch || 12); const text = cell === null || cell === undefined ? '' : String(cell); const explicitLines = text.split(/\r?\n/); diff --git a/video-gen-admin/tsconfig.tsbuildinfo b/video-gen-admin/tsconfig.tsbuildinfo index e40c53cc..db3fab0b 100644 --- a/video-gen-admin/tsconfig.tsbuildinfo +++ b/video-gen-admin/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/env.d.ts","./src/main.tsx","./src/api/client.ts","./src/api/crypto.ts","./src/api/index.ts","./src/pages/admincreditratios.tsx","./src/pages/admincreditrecords.tsx","./src/pages/admindashboard.tsx","./src/pages/admingenerationairecords.tsx","./src/pages/admingenerationrecords.tsx","./src/pages/adminhotopeningreplicationdetail.tsx","./src/pages/adminhotopeningreplications.tsx","./src/pages/adminimageengines.tsx","./src/pages/adminindustries.tsx","./src/pages/adminlayout.tsx","./src/pages/adminloginpage.tsx","./src/pages/adminmenuconfig.tsx","./src/pages/adminmodels.tsx","./src/pages/adminnotificationmanager.tsx","./src/pages/adminoauthapplist.tsx","./src/pages/adminoperationlogs.tsx","./src/pages/adminpaymentconfig.tsx","./src/pages/adminpaymentstats.tsx","./src/pages/adminrechargepackages.tsx","./src/pages/adminreplicationprojectdetail.tsx","./src/pages/adminsettings.tsx","./src/pages/adminshotreplications.tsx","./src/pages/adminshottasksetdetail.tsx","./src/pages/adminusers.tsx","./src/pages/adminvideoengines.tsx","./src/pages/adminvideopromptschemaconfig.tsx","./src/pages/adminreplication/components/jsoncollapse.tsx","./src/pages/adminreplication/components/mediapreview.tsx","./src/pages/adminreplication/components/statustag.tsx","./src/pages/adminreplication/components/videopromptschemaviewer.tsx","./src/store/index.ts","./src/types/index.ts","./src/utils/formatdate.ts","./src/utils/videopromptschema.ts"],"version":"6.0.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/env.d.ts","./src/main.tsx","./src/api/client.ts","./src/api/crypto.ts","./src/api/index.ts","./src/pages/adminauthoriz.tsx","./src/pages/adminconsume.tsx","./src/pages/admincreditratios.tsx","./src/pages/admincreditrecords.tsx","./src/pages/admindashboard.tsx","./src/pages/admingenerationairecords.tsx","./src/pages/admingenerationrecords.tsx","./src/pages/adminhotopeningreplicationdetail.tsx","./src/pages/adminhotopeningreplications.tsx","./src/pages/adminimageengines.tsx","./src/pages/adminindustries.tsx","./src/pages/adminlayout.tsx","./src/pages/adminloginpage.tsx","./src/pages/adminmenuconfig.tsx","./src/pages/adminmodels.tsx","./src/pages/adminnotificationmanager.tsx","./src/pages/adminoauthapplist.tsx","./src/pages/adminoperationlogs.tsx","./src/pages/adminpaymentconfig.tsx","./src/pages/adminpaymentstats.tsx","./src/pages/adminrechargepackages.tsx","./src/pages/adminreplicationprojectdetail.tsx","./src/pages/adminsettings.tsx","./src/pages/adminshotreplications.tsx","./src/pages/adminshottasksetdetail.tsx","./src/pages/adminusers.tsx","./src/pages/adminvideoengines.tsx","./src/pages/adminvideopromptschemaconfig.tsx","./src/pages/adminplatform.tsx","./src/pages/adminreplication/components/jsoncollapse.tsx","./src/pages/adminreplication/components/mediapreview.tsx","./src/pages/adminreplication/components/statustag.tsx","./src/pages/adminreplication/components/videopromptschemaviewer.tsx","./src/store/index.ts","./src/types/index.ts","./src/types/xlsx-js-style.d.ts","./src/utils/excelexport.ts","./src/utils/formatdate.ts","./src/utils/videopromptschema.ts"],"version":"6.0.3"} \ No newline at end of file diff --git a/video-gen-api/alembic/versions/0a8da2d3c091_add_credit_record_billing_snapshots_and_.py b/video-gen-api/alembic/versions/0a8da2d3c091_add_credit_record_billing_snapshots_and_.py new file mode 100644 index 00000000..57391279 --- /dev/null +++ b/video-gen-api/alembic/versions/0a8da2d3c091_add_credit_record_billing_snapshots_and_.py @@ -0,0 +1,935 @@ +"""add credit record billing snapshots and frontend user kind + +Revision ID: 0a8da2d3c091 +Revises: 5e2c124e5484 +Create Date: 2026-06-25 13:25:21.246025 +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = "0a8da2d3c091" +down_revision: Union[str, None] = "5e2c124e5484" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # 1) 表结构变更。 + # 注意:autogenerate 生成的 upload_task.other_info 删除语句与本次需求无关,已移除。 + op.add_column("users", sa.Column("frontend_user_kind", sa.String(length=16), server_default="external", nullable=False)) + + op.add_column("credit_records", sa.Column("owner_type", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("owner_id", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("attempt_no", sa.Integer(), nullable=True)) + op.add_column("credit_records", sa.Column("charge_kind", sa.String(length=32), nullable=True)) + op.add_column("credit_records", sa.Column("charge_action", sa.String(length=16), nullable=True)) + op.add_column("credit_records", sa.Column("credit_subject", sa.String(length=32), nullable=True)) + op.add_column("credit_records", sa.Column("media_type", sa.String(length=16), nullable=True)) + op.add_column("credit_records", sa.Column("billing_scene", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("source_module", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("source_project_id", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("source_step_id", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("source_step_code", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("token_usage_id", sa.String(length=32), nullable=True)) + op.add_column("credit_records", sa.Column("input_tokens", sa.Integer(), nullable=True)) + op.add_column("credit_records", sa.Column("output_tokens", sa.Integer(), nullable=True)) + op.add_column("credit_records", sa.Column("total_tokens", sa.Integer(), nullable=True)) + op.add_column("credit_records", sa.Column("engine_type", sa.String(length=16), nullable=True)) + op.add_column("credit_records", sa.Column("engine_id", sa.String(length=32), nullable=True)) + op.add_column("credit_records", sa.Column("engine_name", sa.String(length=128), nullable=True)) + op.add_column("credit_records", sa.Column("engine_provider", sa.String(length=64), nullable=True)) + op.add_column("credit_records", sa.Column("engine_model_name", sa.String(length=128), nullable=True)) + op.add_column("credit_records", sa.Column("user_type_snapshot", sa.String(length=16), nullable=True)) + op.add_column("credit_records", sa.Column("frontend_user_kind_snapshot", sa.String(length=16), nullable=True)) + + op.add_column("module_generation_steps", sa.Column("token_usage_id", sa.String(length=32), nullable=True)) + op.add_column("module_generation_steps", sa.Column("model_config_id", sa.String(length=32), nullable=True)) + op.add_column("module_generation_steps", sa.Column("input_tokens", sa.Integer(), nullable=True)) + op.add_column("module_generation_steps", sa.Column("output_tokens", sa.Integer(), nullable=True)) + op.add_column("module_generation_steps", sa.Column("total_tokens", sa.Integer(), nullable=True)) + op.add_column("module_generation_steps", sa.Column("text_credits_cost", sa.Float(), nullable=True)) + + op.add_column("token_usage", sa.Column("owner_type", sa.String(length=64), nullable=True)) + op.add_column("token_usage", sa.Column("owner_id", sa.String(length=64), nullable=True)) + op.add_column("token_usage", sa.Column("biz_key", sa.String(length=160), nullable=True)) + op.add_column("token_usage", sa.Column("source_module", sa.String(length=64), nullable=True)) + op.add_column("token_usage", sa.Column("source_step_code", sa.String(length=64), nullable=True)) + + # 2) 历史数据补齐。 + _backfill_legacy_data() + + # 3) 索引。放在历史补齐之后,避免大批量 UPDATE 时维护过多新索引。 + op.create_index(op.f("ix_users_frontend_user_kind"), "users", ["frontend_user_kind"], unique=False) + op.create_index(op.f("ix_users_user_type"), "users", ["user_type"], unique=False) + + op.create_index(op.f("ix_credit_records_billing_scene"), "credit_records", ["billing_scene"], unique=False) + op.create_index(op.f("ix_credit_records_charge_kind"), "credit_records", ["charge_kind"], unique=False) + op.create_index(op.f("ix_credit_records_credit_subject"), "credit_records", ["credit_subject"], unique=False) + op.create_index(op.f("ix_credit_records_engine_id"), "credit_records", ["engine_id"], unique=False) + op.create_index(op.f("ix_credit_records_engine_type"), "credit_records", ["engine_type"], unique=False) + op.create_index(op.f("ix_credit_records_frontend_user_kind_snapshot"), "credit_records", ["frontend_user_kind_snapshot"], unique=False) + op.create_index(op.f("ix_credit_records_media_type"), "credit_records", ["media_type"], unique=False) + op.create_index("ix_credit_records_owner", "credit_records", ["owner_type", "owner_id"], unique=False) + op.create_index(op.f("ix_credit_records_owner_id"), "credit_records", ["owner_id"], unique=False) + op.create_index(op.f("ix_credit_records_owner_type"), "credit_records", ["owner_type"], unique=False) + op.create_index(op.f("ix_credit_records_source_module"), "credit_records", ["source_module"], unique=False) + op.create_index("ix_credit_records_source_module_scene", "credit_records", ["source_module", "billing_scene"], unique=False) + op.create_index(op.f("ix_credit_records_source_project_id"), "credit_records", ["source_project_id"], unique=False) + op.create_index(op.f("ix_credit_records_source_step_code"), "credit_records", ["source_step_code"], unique=False) + op.create_index(op.f("ix_credit_records_source_step_id"), "credit_records", ["source_step_id"], unique=False) + op.create_index("ix_credit_records_subject_media", "credit_records", ["credit_subject", "media_type"], unique=False) + op.create_index(op.f("ix_credit_records_token_usage_id"), "credit_records", ["token_usage_id"], unique=False) + op.create_index(op.f("ix_credit_records_type"), "credit_records", ["type"], unique=False) + op.create_index("ix_credit_records_user_kind_time", "credit_records", ["user_type_snapshot", "frontend_user_kind_snapshot", "created_at"], unique=False) + op.create_index(op.f("ix_credit_records_user_type_snapshot"), "credit_records", ["user_type_snapshot"], unique=False) + + op.create_index(op.f("ix_module_generation_steps_model_config_id"), "module_generation_steps", ["model_config_id"], unique=False) + op.create_index(op.f("ix_module_generation_steps_token_usage_id"), "module_generation_steps", ["token_usage_id"], unique=False) + + op.create_index("ix_token_usage_biz_key", "token_usage", ["biz_key"], unique=False) + op.create_index("ix_token_usage_owner", "token_usage", ["owner_type", "owner_id"], unique=False) + op.create_index(op.f("ix_token_usage_owner_id"), "token_usage", ["owner_id"], unique=False) + op.create_index(op.f("ix_token_usage_owner_type"), "token_usage", ["owner_type"], unique=False) + op.create_index(op.f("ix_token_usage_source_module"), "token_usage", ["source_module"], unique=False) + op.create_index(op.f("ix_token_usage_source_step_code"), "token_usage", ["source_step_code"], unique=False) + + +def _backfill_legacy_data() -> None: + """修复历史账务流水的归类、模块、步骤、token、模型和引擎快照。 + + 设计原则: + - 只补能确定的数据,不用“同用户 + 时间接近 + token 相等”这类不可靠方式强行匹配。 + - ModuleGenerationStep 包含 deleted_at 不为空的软删数据,保证历史流水仍可展示来源。 + - CreditRecord 是账务事实表,历史业务数据软删不影响流水展示。 + - CreditRecord 统一使用 engine_* 承载执行配置快照:model/image/video。 + """ + + # users.frontend_user_kind 默认外部用户。 + op.execute( + """ + UPDATE users + SET frontend_user_kind = 'external' + WHERE frontend_user_kind IS NULL OR frontend_user_kind NOT IN ('internal', 'external') + """ + ) + + # 用户类型快照:按迁移时 users 当前值兜底。 + op.execute( + """ + UPDATE credit_records cr + SET + user_type_snapshot = COALESCE(NULLIF(u.user_type, ''), CASE WHEN COALESCE(u.is_admin, false) THEN 'admin' ELSE 'frontend' END), + frontend_user_kind_snapshot = CASE + WHEN COALESCE(NULLIF(u.user_type, ''), CASE WHEN COALESCE(u.is_admin, false) THEN 'admin' ELSE 'frontend' END) = 'frontend' + THEN COALESCE(NULLIF(u.frontend_user_kind, ''), 'external') + ELSE COALESCE(NULLIF(u.frontend_user_kind, ''), 'external') + END + FROM users u + WHERE cr.user_id = u.id + """ + ) + + # 解析标准 biz_key:owner_type:owner_id:attempt:{n}:charge_kind:charge/refund。 + op.execute( + """ + UPDATE credit_records + SET + owner_type = split_part(biz_key, ':', 1), + owner_id = split_part(biz_key, ':', 2), + attempt_no = split_part(biz_key, ':', 4)::integer, + charge_kind = split_part(biz_key, ':', 5), + charge_action = split_part(biz_key, ':', 6) + WHERE biz_key IS NOT NULL + AND biz_key ~ '^[^:]+:[^:]+:attempt:[0-9]+:[^:]+:(charge|refund)$' + """ + ) + + # 少数退款记录如果自身 biz_key 不完整,用 refund_for_biz_key 兜底解析业务归属。 + op.execute( + """ + UPDATE credit_records + SET + owner_type = split_part(refund_for_biz_key, ':', 1), + owner_id = split_part(refund_for_biz_key, ':', 2), + attempt_no = split_part(refund_for_biz_key, ':', 4)::integer, + charge_kind = split_part(refund_for_biz_key, ':', 5), + charge_action = 'refund' + WHERE type = 'refund' + AND (owner_type IS NULL OR owner_type = 'unknown' OR owner_id IS NULL) + AND refund_for_biz_key IS NOT NULL + AND refund_for_biz_key ~ '^[^:]+:[^:]+:attempt:[0-9]+:[^:]+:(charge|refund)$' + """ + ) + + # 支付充值流水。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'payment_order'), + owner_id = COALESCE(cr.owner_id, po.id), + charge_kind = COALESCE(NULLIF(cr.charge_kind, 'unknown'), 'recharge'), + charge_action = COALESCE(cr.charge_action, 'charge'), + credit_subject = COALESCE(NULLIF(cr.credit_subject, 'unknown'), 'recharge'), + billing_scene = COALESCE(NULLIF(cr.billing_scene, 'unknown'), 'recharge'), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), 'payment') + FROM payment_orders po + WHERE cr.related_id = po.id + AND cr.type = 'recharge' + AND (cr.description IS NULL OR cr.description NOT LIKE '管理员调整:%') + """ + ) + + # 支付退款扣回积分。历史上它通常是 type=consume,但属于支付退款,不应该混入生成消费。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'payment_order'), + owner_id = COALESCE(cr.owner_id, po.id), + charge_kind = COALESCE(NULLIF(cr.charge_kind, 'unknown'), 'refund'), + charge_action = COALESCE(cr.charge_action, 'refund'), + credit_subject = COALESCE(NULLIF(cr.credit_subject, 'unknown'), 'refund'), + billing_scene = COALESCE(NULLIF(cr.billing_scene, 'unknown'), 'refund'), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), 'payment') + FROM payment_orders po + WHERE cr.related_id = po.id + AND cr.type = 'consume' + AND (cr.description ILIKE '%退款%' OR po.status = 'refunded') + """ + ) + + # 管理员手动调整,不混入普通充值/消费。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'admin_adjust'), + owner_id = COALESCE(cr.owner_id, cr.related_id), + charge_kind = 'admin_adjust', + charge_action = CASE WHEN cr.type = 'refund' THEN 'refund' ELSE 'charge' END, + credit_subject = 'admin_adjust', + billing_scene = 'admin_adjust', + source_module = 'admin' + WHERE cr.description LIKE '管理员调整:%' + """ + ) + + # GenerationRecord 旧版提示词优化裸扣费:generation.py /optimize 历史上未传 related_id / biz_key / record_meta。 + # 只做严格唯一匹配:同用户、同项目名称描述、同扣费金额,并且 credit_record 与 generation_record 均唯一时才回填。 + op.execute( + """ + WITH candidates AS ( + SELECT + cr.id AS credit_record_id, + gr.id AS generation_record_id, + gr.text_tokens_used, + gr.text_credits_cost + FROM credit_records cr + JOIN generation_records gr + ON gr.user_id = cr.user_id + JOIN projects p + ON p.id = gr.project_id + WHERE cr.type = 'consume' + AND cr.biz_key IS NULL + AND cr.refund_for_biz_key IS NULL + AND cr.related_id IS NULL + AND (cr.owner_type IS NULL OR cr.owner_type = 'unknown') + AND (cr.source_module IS NULL OR cr.source_module = 'unknown') + AND (cr.billing_scene IS NULL OR cr.billing_scene = 'unknown') + AND COALESCE(gr.text_credits_cost, 0) > 0 + AND COALESCE(gr.text_tokens_used, 0) > 0 + AND cr.description = '提示词优化 - ' || p.name + AND ABS(ABS(cr.amount)::numeric - ROUND(COALESCE(gr.text_credits_cost, 0)::numeric, 2)) < 0.01 + ), + unique_credit AS ( + SELECT credit_record_id + FROM candidates + GROUP BY credit_record_id + HAVING COUNT(*) = 1 + ), + unique_generation AS ( + SELECT generation_record_id + FROM candidates + GROUP BY generation_record_id + HAVING COUNT(*) = 1 + ), + matched AS ( + SELECT c.* + FROM candidates c + JOIN unique_credit uc ON uc.credit_record_id = c.credit_record_id + JOIN unique_generation ug ON ug.generation_record_id = c.generation_record_id + ) + UPDATE credit_records cr + SET + related_id = COALESCE(cr.related_id, matched.generation_record_id), + owner_type = 'generation_record', + owner_id = matched.generation_record_id, + attempt_no = COALESCE(cr.attempt_no, 1), + charge_kind = 'text_prompt', + charge_action = 'charge', + credit_subject = 'text', + billing_scene = 'generation_record_text_prompt_optimize', + source_module = 'generation_record', + total_tokens = COALESCE(cr.total_tokens, NULLIF(matched.text_tokens_used, 0)), + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model') + FROM matched + WHERE cr.id = matched.credit_record_id + """ + ) + + # GenerationRecord:项目记录提词/文件解析/图片理解/图片生成/视频生成。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'generation_record'), + owner_id = COALESCE(cr.owner_id, gr.id), + related_id = COALESCE(cr.related_id, gr.id), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), 'generation_record'), + media_type = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(gr.gen_type, '')) IN ('image', 'video') THEN lower(gr.gen_type) + ELSE cr.media_type + END, + total_tokens = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'text_prompt' THEN COALESCE(cr.total_tokens, NULLIF(gr.text_tokens_used, 0)) + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(gr.gen_type, '')) = 'image' THEN COALESCE(cr.total_tokens, NULLIF(gr.image_tokens_used, 0)) + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(gr.gen_type, '')) = 'video' THEN COALESCE(cr.total_tokens, NULLIF(gr.video_tokens_used, 0)) + ELSE cr.total_tokens + END, + credit_subject = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' THEN 'media' + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') IN ('text_prompt', 'file_parse', 'vision_input') THEN 'text' + ELSE cr.credit_subject + END, + billing_scene = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'text_prompt' THEN 'generation_record_text_prompt_optimize' + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'file_parse' THEN 'generation_record_file_parse' + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'vision_input' THEN 'generation_record_vision_input' + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(gr.gen_type, '')) = 'image' THEN 'generation_record_image_generate' + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(gr.gen_type, '')) = 'video' THEN 'generation_record_video_generate' + ELSE cr.billing_scene + END, + engine_type = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') IN ('text_prompt', 'file_parse', 'vision_input') THEN COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model') + ELSE cr.engine_type + END + FROM generation_records gr + WHERE (cr.owner_type = 'generation_record' AND cr.owner_id = gr.id) + OR ((cr.owner_type IS NULL OR cr.owner_type = 'unknown') AND cr.related_id = gr.id) + """ + ) + + # ModuleGenerationStep 提词优化:从 output_json.usage.credit_biz_key 精准匹配 CreditRecord.biz_key。 + # 包含软删步骤,不加 deleted_at 过滤。 + op.execute( + """ + WITH step_usage AS ( + SELECT + s.id AS step_id, + s.project_id, + s.module, + s.step_code, + (s.output_json::jsonb -> 'usage') AS usage, + COALESCE( + NULLIF(s.output_json::jsonb -> 'usage' ->> 'token_usage_id', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'tokenUsageId', ''), + NULLIF(s.output_json::jsonb ->> 'token_usage_id', ''), + NULLIF(s.output_json::jsonb ->> 'tokenUsageId', '') + ) AS token_usage_id, + COALESCE( + NULLIF(s.output_json::jsonb -> 'usage' ->> 'model_config_id', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'modelConfigId', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'modelConfig' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config_snapshot' ->> 'id', ''), + NULLIF(s.output_json::jsonb ->> 'model_config_id', ''), + NULLIF(s.output_json::jsonb ->> 'modelConfigId', ''), + NULLIF(s.output_json::jsonb -> 'model_config' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'modelConfig' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'model_config_snapshot' ->> 'id', '') + ) AS model_config_id + FROM module_generation_steps s + WHERE s.output_json IS NOT NULL + AND jsonb_typeof(s.output_json::jsonb) = 'object' + AND jsonb_typeof(s.output_json::jsonb -> 'usage') = 'object' + ) + UPDATE module_generation_steps s + SET + token_usage_id = COALESCE(s.token_usage_id, step_usage.token_usage_id), + model_config_id = COALESCE(s.model_config_id, step_usage.model_config_id), + input_tokens = COALESCE( + s.input_tokens, + CASE WHEN COALESCE(step_usage.usage ->> 'input_tokens', '') ~ '^[0-9]+$' THEN (step_usage.usage ->> 'input_tokens')::integer ELSE NULL END + ), + output_tokens = COALESCE( + s.output_tokens, + CASE WHEN COALESCE(step_usage.usage ->> 'output_tokens', '') ~ '^[0-9]+$' THEN (step_usage.usage ->> 'output_tokens')::integer ELSE NULL END + ), + total_tokens = COALESCE( + s.total_tokens, + CASE WHEN COALESCE(step_usage.usage ->> 'total_tokens', '') ~ '^[0-9]+$' THEN (step_usage.usage ->> 'total_tokens')::integer ELSE NULL END, + CASE + WHEN COALESCE(step_usage.usage ->> 'input_tokens', '') ~ '^[0-9]+$' + AND COALESCE(step_usage.usage ->> 'output_tokens', '') ~ '^[0-9]+$' + THEN (step_usage.usage ->> 'input_tokens')::integer + (step_usage.usage ->> 'output_tokens')::integer + ELSE NULL + END + ), + text_credits_cost = COALESCE( + s.text_credits_cost, + CASE WHEN COALESCE(step_usage.usage ->> 'text_credits_cost', '') ~ '^[0-9]+(\\.[0-9]+)?$' THEN (step_usage.usage ->> 'text_credits_cost')::double precision ELSE NULL END + ) + FROM step_usage + WHERE s.id = step_usage.step_id + """ + ) + + op.execute( + """ + WITH step_usage AS ( + SELECT + s.id AS step_id, + s.project_id, + s.module, + s.step_code, + (s.output_json::jsonb -> 'usage') AS usage, + COALESCE( + NULLIF(s.token_usage_id, ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'token_usage_id', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'tokenUsageId', ''), + NULLIF(s.output_json::jsonb ->> 'token_usage_id', ''), + NULLIF(s.output_json::jsonb ->> 'tokenUsageId', '') + ) AS step_token_usage_id, + COALESCE( + NULLIF(s.model_config_id, ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'model_config_id', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'modelConfigId', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'modelConfig' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config_snapshot' ->> 'id', ''), + NULLIF(s.output_json::jsonb ->> 'model_config_id', ''), + NULLIF(s.output_json::jsonb ->> 'modelConfigId', ''), + NULLIF(s.output_json::jsonb -> 'model_config' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'modelConfig' ->> 'id', ''), + NULLIF(s.output_json::jsonb -> 'model_config_snapshot' ->> 'id', '') + ) AS step_model_config_id, + COALESCE( + NULLIF(s.output_json::jsonb -> 'usage' ->> 'model_config_name', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'modelConfigName', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config' ->> 'name', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'modelConfig' ->> 'name', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config_snapshot' ->> 'name', ''), + NULLIF(s.output_json::jsonb ->> 'model_config_name', ''), + NULLIF(s.output_json::jsonb ->> 'modelConfigName', ''), + NULLIF(s.output_json::jsonb -> 'model_config' ->> 'name', ''), + NULLIF(s.output_json::jsonb -> 'modelConfig' ->> 'name', ''), + NULLIF(s.output_json::jsonb -> 'model_config_snapshot' ->> 'name', '') + ) AS step_model_config_name, + COALESCE( + NULLIF(s.output_json::jsonb -> 'usage' ->> 'model_provider', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'modelProvider', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'provider', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config' ->> 'provider', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'modelConfig' ->> 'provider', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config_snapshot' ->> 'provider', ''), + NULLIF(s.output_json::jsonb ->> 'model_provider', ''), + NULLIF(s.output_json::jsonb ->> 'modelProvider', ''), + NULLIF(s.output_json::jsonb ->> 'provider', ''), + NULLIF(s.output_json::jsonb -> 'model_config' ->> 'provider', ''), + NULLIF(s.output_json::jsonb -> 'modelConfig' ->> 'provider', ''), + NULLIF(s.output_json::jsonb -> 'model_config_snapshot' ->> 'provider', '') + ) AS step_model_provider, + COALESCE( + NULLIF(s.output_json::jsonb -> 'usage' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'usage' ->> 'modelName', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'modelConfig' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config_snapshot' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config' ->> 'modelName', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'modelConfig' ->> 'modelName', ''), + NULLIF(s.output_json::jsonb -> 'usage' -> 'model_config_snapshot' ->> 'modelName', ''), + NULLIF(s.output_json::jsonb ->> 'model_name', ''), + NULLIF(s.output_json::jsonb ->> 'modelName', ''), + NULLIF(s.output_json::jsonb -> 'model_config' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'modelConfig' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'model_config_snapshot' ->> 'model_name', ''), + NULLIF(s.output_json::jsonb -> 'model_config' ->> 'modelName', ''), + NULLIF(s.output_json::jsonb -> 'modelConfig' ->> 'modelName', ''), + NULLIF(s.output_json::jsonb -> 'model_config_snapshot' ->> 'modelName', '') + ) AS step_model_name + FROM module_generation_steps s + WHERE s.output_json IS NOT NULL + AND jsonb_typeof(s.output_json::jsonb) = 'object' + AND jsonb_typeof(s.output_json::jsonb -> 'usage') = 'object' + ) + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'module_generation_step'), + owner_id = COALESCE(cr.owner_id, step_usage.step_id), + charge_kind = COALESCE(NULLIF(cr.charge_kind, 'unknown'), 'text_prompt'), + charge_action = COALESCE(cr.charge_action, 'charge'), + credit_subject = COALESCE(NULLIF(cr.credit_subject, 'unknown'), 'text'), + billing_scene = COALESCE( + NULLIF(cr.billing_scene, 'unknown'), + CASE + WHEN step_usage.module = 'hot_opening_replicate' AND step_usage.step_code = 'image_prompt_optimize' THEN 'hot_opening_image_prompt_optimize' + WHEN step_usage.module = 'hot_opening_replicate' AND step_usage.step_code = 'video_prompt_optimize' THEN 'hot_opening_video_prompt_optimize' + WHEN step_usage.module = 'shot_replicate' AND step_usage.step_code = 'image_prompt_optimize' THEN 'shot_image_prompt_optimize' + WHEN step_usage.module = 'shot_replicate' AND step_usage.step_code = 'video_prompt_optimize' THEN 'shot_video_prompt_optimize' + ELSE 'unknown' + END + ), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), step_usage.module), + source_project_id = COALESCE(cr.source_project_id, step_usage.project_id), + source_step_id = COALESCE(cr.source_step_id, step_usage.step_id), + source_step_code = COALESCE(cr.source_step_code, step_usage.step_code), + token_usage_id = COALESCE(cr.token_usage_id, step_usage.step_token_usage_id), + input_tokens = COALESCE( + cr.input_tokens, + CASE WHEN COALESCE(step_usage.usage ->> 'input_tokens', '') ~ '^[0-9]+$' THEN (step_usage.usage ->> 'input_tokens')::integer ELSE NULL END + ), + output_tokens = COALESCE( + cr.output_tokens, + CASE WHEN COALESCE(step_usage.usage ->> 'output_tokens', '') ~ '^[0-9]+$' THEN (step_usage.usage ->> 'output_tokens')::integer ELSE NULL END + ), + total_tokens = COALESCE( + cr.total_tokens, + CASE WHEN COALESCE(step_usage.usage ->> 'total_tokens', '') ~ '^[0-9]+$' THEN (step_usage.usage ->> 'total_tokens')::integer ELSE NULL END, + CASE + WHEN COALESCE(step_usage.usage ->> 'input_tokens', '') ~ '^[0-9]+$' + AND COALESCE(step_usage.usage ->> 'output_tokens', '') ~ '^[0-9]+$' + THEN (step_usage.usage ->> 'input_tokens')::integer + (step_usage.usage ->> 'output_tokens')::integer + ELSE NULL + END + ), + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model'), + engine_id = COALESCE(cr.engine_id, step_usage.step_model_config_id), + engine_name = COALESCE(cr.engine_name, step_usage.step_model_config_name), + engine_provider = COALESCE(cr.engine_provider, step_usage.step_model_provider), + engine_model_name = COALESCE(cr.engine_model_name, step_usage.step_model_name) + FROM step_usage + WHERE cr.biz_key = step_usage.usage ->> 'credit_biz_key' + """ + ) + + # TokenUsage 如果 usage 中已经记录 token_usage_id,则可以安全补 owner;否则不强行按时间/token 猜。 + op.execute( + """ + WITH step_usage AS ( + SELECT + s.id AS step_id, + s.module, + s.step_code, + (s.output_json::jsonb -> 'usage') AS usage + FROM module_generation_steps s + WHERE s.output_json IS NOT NULL + AND jsonb_typeof(s.output_json::jsonb) = 'object' + AND jsonb_typeof(s.output_json::jsonb -> 'usage') = 'object' + AND NULLIF(s.output_json::jsonb -> 'usage' ->> 'token_usage_id', '') IS NOT NULL + ) + UPDATE token_usage tu + SET + owner_type = COALESCE(NULLIF(tu.owner_type, 'unknown'), 'module_generation_step'), + owner_id = COALESCE(tu.owner_id, step_usage.step_id), + biz_key = COALESCE(tu.biz_key, NULLIF(step_usage.usage ->> 'credit_biz_key', '')), + source_module = COALESCE(NULLIF(tu.source_module, 'unknown'), step_usage.module), + source_step_code = COALESCE(tu.source_step_code, step_usage.step_code) + FROM step_usage + WHERE tu.id = step_usage.usage ->> 'token_usage_id' + """ + ) + + # 拆镜复刻原视频整体分析流水:归属到任务集。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'shot_replicate_task_set'), + owner_id = COALESCE(cr.owner_id, ts.id), + attempt_no = COALESCE(cr.attempt_no, 1), + charge_kind = COALESCE(NULLIF(cr.charge_kind, 'unknown'), 'video_analysis'), + charge_action = COALESCE(cr.charge_action, CASE WHEN cr.type = 'refund' THEN 'refund' ELSE 'charge' END), + credit_subject = COALESCE(NULLIF(cr.credit_subject, 'unknown'), 'analysis'), + media_type = COALESCE(cr.media_type, 'video'), + billing_scene = COALESCE(NULLIF(cr.billing_scene, 'unknown'), 'shot_original_video_analysis'), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), 'shot_replicate'), + source_project_id = COALESCE(cr.source_project_id, ts.id), + source_step_code = COALESCE(cr.source_step_code, 'video_analysis'), + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model') + FROM shot_replicate_task_sets ts + WHERE ( + (cr.owner_type = 'shot_replicate_task_set' AND cr.owner_id = ts.id) + OR ((cr.owner_type IS NULL OR cr.owner_type = 'unknown') AND cr.related_id = ts.id) + ) + AND cr.type IN ('consume', 'refund') + AND ( + cr.charge_kind = 'video_analysis' + OR cr.billing_scene IN ('shot_video_analysis', 'shot_original_video_analysis') + OR cr.description ILIKE '%视频分析%' + OR cr.description ILIKE '%原视频分析%' + ) + """ + ) + + # 拆镜复刻手动片段分析流水:归属到片段。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'shot_replicate_segment'), + owner_id = COALESCE(cr.owner_id, sg.id), + attempt_no = COALESCE(cr.attempt_no, 1), + charge_kind = COALESCE(NULLIF(cr.charge_kind, 'unknown'), 'video_analysis'), + charge_action = COALESCE(cr.charge_action, CASE WHEN cr.type = 'refund' THEN 'refund' ELSE 'charge' END), + credit_subject = COALESCE(NULLIF(cr.credit_subject, 'unknown'), 'analysis'), + media_type = COALESCE(cr.media_type, 'video'), + billing_scene = COALESCE(NULLIF(cr.billing_scene, 'unknown'), 'shot_segment_video_analysis'), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), 'shot_replicate'), + source_project_id = COALESCE(cr.source_project_id, sg.task_set_id), + source_step_id = COALESCE(cr.source_step_id, sg.id), + source_step_code = COALESCE(cr.source_step_code, 'video_analysis'), + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model') + FROM shot_replicate_segments sg + WHERE ( + (cr.owner_type = 'shot_replicate_segment' AND cr.owner_id = sg.id) + OR ((cr.owner_type IS NULL OR cr.owner_type = 'unknown') AND cr.related_id = sg.id) + ) + AND cr.type IN ('consume', 'refund') + AND ( + cr.charge_kind = 'video_analysis' + OR cr.billing_scene IN ('shot_video_analysis', 'shot_segment_video_analysis') + OR cr.description ILIKE '%片段分析%' + OR cr.description ILIKE '%手动%分析%' + ) + """ + ) + + # Module media generation:ChatGenerationTask 被模块步骤引用时,优先归到具体模块/步骤,而不是 AI 创作。 + op.execute( + """ + WITH step_task AS ( + SELECT DISTINCT ON (s.chat_task_id) + s.chat_task_id, + s.id AS step_id, + s.project_id, + s.module, + s.step_code + FROM module_generation_steps s + WHERE s.chat_task_id IS NOT NULL + ORDER BY s.chat_task_id, s.is_current DESC, s.updated_at DESC + ) + UPDATE credit_records cr + SET + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), step_task.module), + source_project_id = COALESCE(cr.source_project_id, step_task.project_id), + source_step_id = COALESCE(cr.source_step_id, step_task.step_id), + source_step_code = COALESCE(cr.source_step_code, step_task.step_code), + billing_scene = COALESCE( + NULLIF(cr.billing_scene, 'unknown'), + CASE + WHEN step_task.module = 'hot_opening_replicate' AND step_task.step_code = 'image_generate' THEN 'hot_opening_image_generate' + WHEN step_task.module = 'hot_opening_replicate' AND step_task.step_code = 'video_generate' THEN 'hot_opening_video_generate' + WHEN step_task.module = 'shot_replicate' AND step_task.step_code = 'image_generate' THEN 'shot_image_generate' + WHEN step_task.module = 'shot_replicate' AND step_task.step_code = 'video_generate' THEN 'shot_video_generate' + ELSE cr.billing_scene + END + ) + FROM step_task + WHERE cr.owner_type = 'chat_generation_task' + AND cr.owner_id = step_task.chat_task_id + """ + ) + + # ChatGenerationTask:AI 创作图片/视频生成,以及媒体 token/引擎快照。 + op.execute( + """ + UPDATE credit_records cr + SET + owner_type = COALESCE(NULLIF(cr.owner_type, 'unknown'), 'chat_generation_task'), + owner_id = COALESCE(cr.owner_id, t.id), + source_module = COALESCE(NULLIF(cr.source_module, 'unknown'), 'ai_creation'), + credit_subject = CASE WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' THEN 'media' ELSE cr.credit_subject END, + media_type = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(t.gen_type, '')) IN ('image', 'video') THEN lower(t.gen_type) + ELSE cr.media_type + END, + billing_scene = COALESCE( + NULLIF(cr.billing_scene, 'unknown'), + CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(t.gen_type, '')) = 'image' THEN 'ai_creation_image_generate' + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(t.gen_type, '')) = 'video' THEN 'ai_creation_video_generate' + ELSE cr.billing_scene + END + ), + engine_type = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(t.gen_type, '')) IN ('image', 'video') THEN lower(t.gen_type) + ELSE cr.engine_type + END, + engine_id = COALESCE(cr.engine_id, t.engine_id), + total_tokens = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(t.gen_type, '')) = 'image' THEN COALESCE(cr.total_tokens, NULLIF(t.image_tokens_used, 0)) + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') = 'media' AND lower(COALESCE(t.gen_type, '')) = 'video' THEN COALESCE(cr.total_tokens, NULLIF(t.video_tokens_used, 0)) + ELSE cr.total_tokens + END + FROM chat_generation_tasks t + WHERE (cr.owner_type = 'chat_generation_task' AND cr.owner_id = t.id) + OR ((cr.owner_type IS NULL OR cr.owner_type = 'unknown') AND cr.related_id = t.id) + """ + ) + + # 从 TokenUsage 补 CreditRecord 的 token 和 ModelConfig 执行快照,前提是已经能安全匹配 token_usage_id。 + op.execute( + """ + UPDATE credit_records cr + SET + input_tokens = COALESCE(cr.input_tokens, NULLIF(tu.input_tokens, 0)), + output_tokens = COALESCE(cr.output_tokens, NULLIF(tu.output_tokens, 0)), + total_tokens = COALESCE(cr.total_tokens, NULLIF(tu.total_tokens, 0)), + engine_type = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') IN ('text_prompt', 'file_parse', 'vision_input', 'video_analysis') + OR COALESCE(NULLIF(cr.credit_subject, 'unknown'), '') IN ('text', 'analysis') + THEN COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model') + ELSE cr.engine_type + END, + engine_id = CASE + WHEN COALESCE(NULLIF(cr.charge_kind, 'unknown'), '') IN ('text_prompt', 'file_parse', 'vision_input', 'video_analysis') + OR COALESCE(NULLIF(cr.credit_subject, 'unknown'), '') IN ('text', 'analysis') + THEN COALESCE(cr.engine_id, tu.model_config_id) + ELSE cr.engine_id + END + FROM token_usage tu + WHERE cr.token_usage_id = tu.id + """ + ) + + # ModelConfig 快照统一冷备到 engine_*,engine_type=model。 + op.execute( + """ + UPDATE credit_records cr + SET + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'model'), + engine_name = COALESCE(cr.engine_name, mc.name), + engine_provider = COALESCE(cr.engine_provider, mc.provider), + engine_model_name = COALESCE(cr.engine_model_name, mc.model_name) + FROM model_configs mc + WHERE cr.engine_id = mc.id + AND ( + cr.engine_type = 'model' + OR cr.charge_kind IN ('text_prompt', 'file_parse', 'vision_input', 'video_analysis') + OR cr.credit_subject IN ('text', 'analysis') + ) + """ + ) + + # 图片引擎快照。 + op.execute( + """ + UPDATE credit_records cr + SET + engine_name = COALESCE(cr.engine_name, ie.name), + engine_provider = COALESCE(cr.engine_provider, ie.provider), + engine_model_name = COALESCE(cr.engine_model_name, ie.model_name), + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'image') + FROM image_engines ie + WHERE cr.engine_id = ie.id + AND (cr.engine_type = 'image' OR cr.media_type = 'image' OR cr.engine_type IS NULL OR cr.engine_type = 'unknown') + """ + ) + + # 视频引擎快照。 + op.execute( + """ + UPDATE credit_records cr + SET + engine_name = COALESCE(cr.engine_name, ve.name), + engine_provider = COALESCE(cr.engine_provider, ve.provider), + engine_model_name = COALESCE(cr.engine_model_name, ve.model_name), + engine_type = COALESCE(NULLIF(cr.engine_type, 'unknown'), 'video') + FROM video_engines ve + WHERE cr.engine_id = ve.id + AND (cr.engine_type = 'video' OR cr.media_type = 'video' OR cr.engine_type IS NULL OR cr.engine_type = 'unknown') + """ + ) + + # 退款流水复制原消费流水快照,但 billing_scene 固定为 refund,方便筛选回退流水。 + op.execute( + """ + UPDATE credit_records r + SET + owner_type = COALESCE(NULLIF(r.owner_type, 'unknown'), c.owner_type), + owner_id = COALESCE(r.owner_id, c.owner_id), + attempt_no = COALESCE(r.attempt_no, c.attempt_no), + charge_kind = COALESCE(NULLIF(r.charge_kind, 'unknown'), c.charge_kind), + charge_action = 'refund', + credit_subject = COALESCE(NULLIF(r.credit_subject, 'unknown'), c.credit_subject, 'refund'), + media_type = COALESCE(r.media_type, c.media_type), + billing_scene = 'refund', + source_module = COALESCE(NULLIF(r.source_module, 'unknown'), c.source_module), + source_project_id = COALESCE(r.source_project_id, c.source_project_id), + source_step_id = COALESCE(r.source_step_id, c.source_step_id), + source_step_code = COALESCE(r.source_step_code, c.source_step_code), + token_usage_id = COALESCE(r.token_usage_id, c.token_usage_id), + input_tokens = COALESCE(r.input_tokens, c.input_tokens), + output_tokens = COALESCE(r.output_tokens, c.output_tokens), + total_tokens = COALESCE(r.total_tokens, c.total_tokens), + engine_type = COALESCE(NULLIF(r.engine_type, 'unknown'), c.engine_type), + engine_id = COALESCE(r.engine_id, c.engine_id), + engine_name = COALESCE(r.engine_name, c.engine_name), + engine_provider = COALESCE(r.engine_provider, c.engine_provider), + engine_model_name = COALESCE(r.engine_model_name, c.engine_model_name), + user_type_snapshot = COALESCE(r.user_type_snapshot, c.user_type_snapshot), + frontend_user_kind_snapshot = COALESCE(r.frontend_user_kind_snapshot, c.frontend_user_kind_snapshot) + FROM credit_records c + WHERE r.type = 'refund' + AND r.refund_for_biz_key = c.biz_key + """ + ) + + # 基础分类兜底。 + op.execute( + """ + UPDATE credit_records + SET + charge_action = COALESCE(charge_action, CASE WHEN type = 'refund' THEN 'refund' ELSE 'charge' END), + charge_kind = COALESCE( + NULLIF(charge_kind, 'unknown'), + CASE + WHEN type = 'recharge' THEN 'recharge' + WHEN type = 'refund' THEN 'refund' + ELSE 'unknown' + END + ), + credit_subject = COALESCE( + NULLIF(credit_subject, 'unknown'), + CASE + WHEN type = 'recharge' THEN 'recharge' + WHEN type = 'refund' THEN 'refund' + WHEN charge_kind = 'media' THEN 'media' + WHEN charge_kind IN ('text_prompt', 'file_parse', 'vision_input') THEN 'text' + WHEN charge_kind = 'module_create' THEN 'module' + WHEN charge_kind = 'video_analysis' THEN 'analysis' + WHEN charge_kind = 'video_split' THEN 'split' + WHEN charge_kind = 'admin_adjust' THEN 'admin_adjust' + ELSE 'unknown' + END + ), + source_module = COALESCE(NULLIF(source_module, 'unknown'), CASE WHEN type = 'recharge' THEN 'payment' ELSE 'unknown' END), + billing_scene = COALESCE( + NULLIF(billing_scene, 'unknown'), + CASE + WHEN type = 'recharge' THEN 'recharge' + WHEN type = 'refund' THEN 'refund' + ELSE 'unknown' + END + ), + owner_type = COALESCE(NULLIF(owner_type, 'unknown'), 'unknown'), + engine_type = CASE + WHEN charge_kind IN ('text_prompt', 'file_parse', 'vision_input', 'video_analysis') + OR credit_subject IN ('text', 'analysis') + THEN COALESCE(NULLIF(engine_type, 'unknown'), 'model') + ELSE engine_type + END + WHERE charge_kind IS NULL + OR charge_kind = 'unknown' + OR charge_action IS NULL + OR credit_subject IS NULL + OR credit_subject = 'unknown' + OR source_module IS NULL + OR source_module = 'unknown' + OR billing_scene IS NULL + OR billing_scene = 'unknown' + OR owner_type IS NULL + OR owner_type = 'unknown' + """ + ) + + # 用户快照兜底,避免后台筛选 NULL。 + op.execute( + """ + UPDATE credit_records + SET + user_type_snapshot = COALESCE(user_type_snapshot, 'frontend'), + frontend_user_kind_snapshot = COALESCE(frontend_user_kind_snapshot, 'external') + WHERE user_type_snapshot IS NULL OR frontend_user_kind_snapshot IS NULL + """ + ) + + +def downgrade() -> None: + op.drop_index(op.f("ix_users_user_type"), table_name="users") + op.drop_index(op.f("ix_users_frontend_user_kind"), table_name="users") + + op.drop_index(op.f("ix_token_usage_source_step_code"), table_name="token_usage") + op.drop_index(op.f("ix_token_usage_source_module"), table_name="token_usage") + op.drop_index(op.f("ix_token_usage_owner_type"), table_name="token_usage") + op.drop_index(op.f("ix_token_usage_owner_id"), table_name="token_usage") + op.drop_index("ix_token_usage_owner", table_name="token_usage") + op.drop_index("ix_token_usage_biz_key", table_name="token_usage") + + op.drop_index(op.f("ix_module_generation_steps_token_usage_id"), table_name="module_generation_steps") + op.drop_index(op.f("ix_module_generation_steps_model_config_id"), table_name="module_generation_steps") + + op.drop_index(op.f("ix_credit_records_user_type_snapshot"), table_name="credit_records") + op.drop_index("ix_credit_records_user_kind_time", table_name="credit_records") + op.drop_index(op.f("ix_credit_records_type"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_token_usage_id"), table_name="credit_records") + op.drop_index("ix_credit_records_subject_media", table_name="credit_records") + op.drop_index(op.f("ix_credit_records_source_step_id"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_source_step_code"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_source_project_id"), table_name="credit_records") + op.drop_index("ix_credit_records_source_module_scene", table_name="credit_records") + op.drop_index(op.f("ix_credit_records_source_module"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_owner_type"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_owner_id"), table_name="credit_records") + op.drop_index("ix_credit_records_owner", table_name="credit_records") + op.drop_index(op.f("ix_credit_records_media_type"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_frontend_user_kind_snapshot"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_engine_type"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_engine_id"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_credit_subject"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_charge_kind"), table_name="credit_records") + op.drop_index(op.f("ix_credit_records_billing_scene"), table_name="credit_records") + + op.drop_column("token_usage", "source_step_code") + op.drop_column("token_usage", "source_module") + op.drop_column("token_usage", "biz_key") + op.drop_column("token_usage", "owner_id") + op.drop_column("token_usage", "owner_type") + + op.drop_column("module_generation_steps", "text_credits_cost") + op.drop_column("module_generation_steps", "total_tokens") + op.drop_column("module_generation_steps", "output_tokens") + op.drop_column("module_generation_steps", "input_tokens") + op.drop_column("module_generation_steps", "model_config_id") + op.drop_column("module_generation_steps", "token_usage_id") + + op.drop_column("credit_records", "frontend_user_kind_snapshot") + op.drop_column("credit_records", "user_type_snapshot") + op.drop_column("credit_records", "engine_model_name") + op.drop_column("credit_records", "engine_provider") + op.drop_column("credit_records", "engine_name") + op.drop_column("credit_records", "engine_id") + op.drop_column("credit_records", "engine_type") + op.drop_column("credit_records", "total_tokens") + op.drop_column("credit_records", "output_tokens") + op.drop_column("credit_records", "input_tokens") + op.drop_column("credit_records", "token_usage_id") + op.drop_column("credit_records", "source_step_code") + op.drop_column("credit_records", "source_step_id") + op.drop_column("credit_records", "source_project_id") + op.drop_column("credit_records", "source_module") + op.drop_column("credit_records", "billing_scene") + op.drop_column("credit_records", "media_type") + op.drop_column("credit_records", "credit_subject") + op.drop_column("credit_records", "charge_action") + op.drop_column("credit_records", "charge_kind") + op.drop_column("credit_records", "attempt_no") + op.drop_column("credit_records", "owner_id") + op.drop_column("credit_records", "owner_type") + + op.drop_column("users", "frontend_user_kind") diff --git a/video-gen-api/alembic/versions/c72a6f69e641_merge_changes_from_remote_add_credit_.py b/video-gen-api/alembic/versions/c72a6f69e641_merge_changes_from_remote_add_credit_.py new file mode 100644 index 00000000..a56353bb --- /dev/null +++ b/video-gen-api/alembic/versions/c72a6f69e641_merge_changes_from_remote_add_credit_.py @@ -0,0 +1,25 @@ +"""merge changes from remote add credit record and upload_task add other_info + +Revision ID: c72a6f69e641 +Revises: 0a8da2d3c091, a65cf38abbb8 +Create Date: 2026-06-25 17:02:01.095460 +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'c72a6f69e641' +down_revision: Union[str, None] = ('0a8da2d3c091', 'a65cf38abbb8') +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass From 3c3797a734b6ab5bcfa545ed76074a69782d0b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E4=BD=B3=E8=89=BA?= Date: Thu, 25 Jun 2026 17:29:17 +0800 Subject: [PATCH 3/3] dist --- .../dist/assets/{index-DH3LzPJl.js => index-COTSz9Xd.js} | 2 +- video-gen-app/dist/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename video-gen-app/dist/assets/{index-DH3LzPJl.js => index-COTSz9Xd.js} (97%) diff --git a/video-gen-app/dist/assets/index-DH3LzPJl.js b/video-gen-app/dist/assets/index-COTSz9Xd.js similarity index 97% rename from video-gen-app/dist/assets/index-DH3LzPJl.js rename to video-gen-app/dist/assets/index-COTSz9Xd.js index 6383ed5a..9b8cfe0b 100644 --- a/video-gen-app/dist/assets/index-DH3LzPJl.js +++ b/video-gen-app/dist/assets/index-COTSz9Xd.js @@ -439,4 +439,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho div::-webkit-scrollbar { display: none; } - `}),(0,$.jsx)(`div`,{style:{margin:`auto`,display:`flex`,flexDirection:`column`,width:y.length>0?`${y.length*80+Math.max(0,y.length-1)*1}px`:`100%`},children:(0,$.jsxs)(`div`,{style:{display:`flex`,height:86,borderRadius:12,background:`#fff`,gap:1,position:`relative`},children:[x&&y.length===0?(0,$.jsxs)(`div`,{style:{flex:`1 1 auto`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:[(0,$.jsx)(uq,{size:`small`}),(0,$.jsx)(_te,{style:{marginLeft:8,color:`#64748b`},children:`正在抽取每秒帧...`})]}):y.length>0?y.map(e=>{let t=e.second>=_[0]&&e.second<_[1];return(0,$.jsxs)(`button`,{type:`button`,onClick:()=>I(e.second),title:`${e.second}s${e.fallback?`,实际取帧 ${e.captureSecond?.toFixed(1)}s`:``}`,style:{minWidth:80,flex:`0 0 80px`,height:86,borderTop:t?`5px solid #6366f1`:`none`,borderBottom:t?`5px solid #6366f1`:`none`,padding:0,background:`transparent`,overflow:`hidden`,cursor:A?`not-allowed`:`pointer`,position:`relative`},children:[e.status===`success`&&e.image?(0,$.jsx)(`img`,{src:e.image,alt:`${e.second}s`,style:{width:`100%`,height:`100%`,objectFit:`cover`,display:`block`}}):e.status===`loading`?(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(uq,{size:`small`})}):(0,$.jsxs)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,color:`#64748b`,fontSize:12,background:`#fff`},children:[(0,$.jsxs)(`span`,{children:[e.second,`s`]}),(0,$.jsx)(`span`,{style:{fontSize:11},children:`无有效帧`})]}),(0,$.jsxs)(`span`,{style:{position:`absolute`,left:0,bottom:3,color:`#ffffffff`,fontSize:16,textShadow:`0 1px 3px rgba(0,0,0,.7)`},children:[e.second,`s`]})]},e.second)}):(0,$.jsx)(`div`,{style:{flex:`1 1 auto`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#64748b`},children:`暂无帧预览,请确认视频是否加载完成`}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:-10,left:0,right:0,bottom:0},children:(0,$.jsx)(bH,{range:!0,min:0,max:O||a,step:1,value:_,onChange:P,onChangeComplete:F,tooltip:{formatter:e=>`${W9(Number(e||0))}s`},disabled:!O||A,styles:{track:{background:`#6969dd63`,height:86,borderRadius:12,margin:`0 `},rail:{height:86,borderRadius:12},handle:{width:20,height:86,marginTop:0,borderRadius:`50%`}}})})]})})]}),(0,$.jsxs)(`div`,{style:{marginTop:16,textAlign:`center`,color:`#64748b`,fontSize:14},children:[`已选取 `,k,`s`]}),E&&(0,$.jsx)(`div`,{style:{marginTop:12,padding:`10px 14px`,borderRadius:8,background:`rgba(239, 68, 68, 0.08)`,border:`1px solid rgba(239, 68, 68, 0.15)`,color:`#ef4444`,fontSize:13,textAlign:`center`},children:E})]})]})})},{TextArea:Ete}=rK,Dte=`http://ceshi.apiforeign.minzhong.cn`,Y9=2,X9=15;function Z9(e){return e?/^https?:\/\//i.test(e)?e:`${Dte}${e}`:``}function Ote(){let{creatID:e}=Ze(),t=qe(),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(null),[c,l]=(0,S.useState)(null),[u,d]=(0,S.useState)(null),[f,p]=(0,S.useState)(!1),m=(0,S.useRef)(null),[h,g]=(0,S.useState)(``),[_,v]=(0,S.useState)(``),[y,b]=(0,S.useState)(``),[x,C]=(0,S.useState)(null),[w,T]=(0,S.useState)([]),[E,D]=(0,S.useState)(!1),[O,k]=(0,S.useState)(!1),[A,j]=(0,S.useState)(!1),M=(0,S.useRef)(null),N=(0,S.useRef)(null),P=(0,S.useMemo)(()=>Z9(x?.videoUrl),[x?.videoUrl]),F=(0,S.useMemo)(()=>w.length===0?`AI自动拆分`:w.some(e=>e.sourceMode===`ai_suggestion`)?`AI重拆`:`AI自动拆分`,[w]),I=(0,S.useCallback)(async()=>{if(e)try{C(await g7(e))}catch{Q.error(`获取任务详情失败`)}},[e]),L=(0,S.useCallback)(async()=>{if(e)try{let t=(await y7(e)).items||[];T(t),t.some(e=>e.moduleProjectCurrentStepCode!==`video_generate`&&e.moduleProjectStatus!==`completed`&&e.moduleProjectStatus!==`failed`)?M.current||=window.setInterval(async()=>{try{let t=(await y7(e)).items||[];T(e=>e.map(e=>{let n=t.find(t=>t.id===e.id);return n&&(e.moduleProjectCurrentStepCode!==`video_generate`||e.moduleProjectStatus!==`completed`&&e.moduleProjectStatus!==`failed`)?n:e})),t.every(e=>e.moduleProjectCurrentStepCode===`video_generate`||e.moduleProjectStatus===`completed`||e.moduleProjectStatus===`failed`)&&(M.current&&=(clearInterval(M.current),null))}catch(e){console.error(`轮询获取拆镜列表失败:`,e)}},3e4):M.current&&=(clearInterval(M.current),null)}catch{Q.error(`获取拆镜列表失败`)}},[e]),R=(0,S.useCallback)(async()=>{await Promise.all([I(),L()])},[I,L]);(0,S.useEffect)(()=>(R(),()=>{M.current&&=(clearInterval(M.current),null),N.current&&=(clearInterval(N.current),null)}),[R]),(0,S.useEffect)(()=>{if(x)return x.analysisStatus===`processing`?(console.log(`开始轮询`),N.current=window.setInterval(async()=>{try{C(await g7(e))}catch{}},3e3)):N.current&&=(clearInterval(N.current),null),()=>{N.current&&=(clearInterval(N.current),null)}},[x?.analysisStatus,e]);let z=(e,t)=>{s(e),l(t),r(!0)},B=()=>{r(!1),s(null),g(``),l(``),v(``),b(``)},V=e=>{e.fileList.length===0&&b(``)},H=async e=>{try{b((await E5(e)).url),Q.success(`图片上传成功`)}catch{Q.error(`图片上传失败,请重试`)}return!1},U=async()=>{if(!o){Q.warning(`请先选择拆镜片段`);return}if(!y){Q.warning(`请上传产品图`);return}if(!h.trim()){Q.warning(`请输入产品名称`);return}if(!_.trim()){Q.warning(`请输入产品卖点`);return}let n={target_project_name:h.trim(),core_content_point:_.trim(),material_image_url:Z9(y),idempotency_key:`replication_${Date.now()}`};console.log(o,n),D(!0);try{await b7(o,n),Q.success(`视频生成任务创建成功`),B(),y7(e).then(e=>{console.log(`123123123123`,e);let n=e.items.find(e=>e.id===o);console.log(n),Q.loading(`创建中...`,3),setTimeout(()=>{t(`/removelens/${n.moduleProjectId}/removefenbu`)},3e3)})}catch(e){Q.error(e?.message||`创建失败,请重试`)}finally{D(!1)}},W=async()=>{if(e){j(!0);try{let t=w.some(e=>e.sourceMode===`ai_suggestion`);await _7(e,{selected_indices:[],replace_existing:t}),Q.success(t?`AI 重拆任务已提交`:`AI 拆镜任务已提交`),await R()}catch(e){Q.error(e?.message||`拆镜失败`)}finally{j(!1)}}},ee=()=>{if(!P){Q.warning(`原视频地址不存在`);return}a(!0)},te=async t=>{if(e){if(t.durationSecondX9){Q.warning(`拆镜片段不能超过 ${X9} 秒`);return}k(!0);try{await v7(e,{start_second:t.startSecond,end_second:t.endSecond}),Q.success(`手动拆镜任务已提交`),a(!1),await R()}catch(e){Q.error(e?.message||`手动拆镜失败`)}finally{k(!1)}}},G=e=>e?.splitStatus===`completed`&&!!e?.segmentVideoUrl;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{margin:`-24px -32px -32px`,borderRadius:20,minHeight:`calc(100vh - 34px)`,display:`flex`,flexDirection:`column`,overflow:`hidden`,background:`linear-gradient(135deg, #f8fafc 0%, #eef2ff 50%, #f0f9ff 100%)`,position:`relative`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:-100,right:-100,width:300,height:300,background:`radial-gradient(circle, rgba(99,102,241,0.08) 0%, transparent 70%)`,borderRadius:`50%`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,bottom:-100,left:-100,width:300,height:300,background:`radial-gradient(circle, rgba(167,139,250,0.08) 0%, transparent 70%)`,borderRadius:`50%`}}),(0,$.jsxs)(`div`,{style:{padding:`20px 32px`,display:`flex`,alignItems:`center`,gap:16,position:`relative`,zIndex:10},children:[(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(s2,{}),onClick:()=>t(-1),style:{fontSize:16,color:`#6366f1`,background:`rgba(99, 102, 241, 0.1)`,borderRadius:12,padding:`8px 16px`,transition:`all 0.2s ease`},onMouseEnter:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.15)`},onMouseLeave:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.1)`}}),(0,$.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:16},children:[(0,$.jsx)(`div`,{style:{width:40,height:2,background:`linear-gradient(90deg, transparent, #6366f1, #8b5cf6, transparent)`,borderRadius:1}}),(0,$.jsx)(`h1`,{style:{fontSize:22,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,margin:0},children:`AI视频拆镜工作台`}),(0,$.jsx)(`div`,{style:{width:40,height:2,background:`linear-gradient(90deg, transparent, #8b5cf6, #6366f1, transparent)`,borderRadius:1}})]})})]}),x?(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,overflow:`hidden`,padding:`0 32px 32px`},children:[(0,$.jsxs)(`div`,{style:{flex:1,background:`linear-gradient(135deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.6) 100%)`,backdropFilter:`blur(20px)`,borderRadius:20,display:`flex`,alignItems:`center`,gap:30,padding:24,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8)`,position:`relative`,overflow:`hidden`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:-50,right:-50,width:200,height:200,background:`radial-gradient(circle, rgba(99,102,241,0.05) 0%, transparent 70%)`,borderRadius:`50%`}}),(0,$.jsx)(`div`,{style:{position:`relative`,width:280,height:160,borderRadius:12,overflow:`hidden`,flexShrink:0,boxShadow:`0 4px 16px rgba(0,0,0,0.1)`},children:(0,$.jsx)(`video`,{controls:!0,src:P,style:{width:`100%`,height:`100%`,objectFit:`cover`}})}),(0,$.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,position:`relative`,zIndex:1},children:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`},children:[(0,$.jsx)(`h2`,{style:{fontSize:20,fontWeight:600,marginBottom:16,background:`linear-gradient(135deg, #1e293b 0%, #334155 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`视频总结`}),(0,$.jsx)(`div`,{style:{textAlign:`right`},children:(0,$.jsxs)(`span`,{style:{color:`#94a3b8`,fontSize:12},children:[`上传时间: `,x.createdAt?new Date(x.createdAt).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}):`-`]})})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,marginBottom:12},children:[(0,$.jsx)(`span`,{style:{color:`#64748b`,fontSize:14,marginRight:12,width:80,flexShrink:0},children:`产品名称:`}),(0,$.jsx)(`span`,{style:{color:`#1e293b`,fontWeight:500},children:x.title})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,marginBottom:12},children:[(0,$.jsx)(`span`,{style:{color:`#64748b`,fontSize:14,marginRight:12,width:80,flexShrink:0},children:`受众群体:`}),x.analysisStatus===`processing`?(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(uq,{size:`small`,style:{color:`#f59e0b`}}),(0,$.jsx)(`span`,{style:{fontSize:14,color:`#f59e0b`},children:`分析中`})]}):x.analysisStatus===`completed`?(0,$.jsx)(`div`,{style:{display:`flex`,gap:8,flexWrap:`wrap`},children:(x.originalVideoAudience?.split(`、`)||[]).map((e,t)=>(0,$.jsx)(h$,{style:{fontSize:12,background:`rgba(99, 102, 241, 0.1)`,color:`#6366f1`,border:`none`,borderRadius:20},children:e},t))}):null]}),(0,$.jsxs)(`div`,{style:{display:`flex`},children:[(0,$.jsx)(`span`,{style:{color:`#64748b`,fontSize:14,marginRight:12,width:80,flexShrink:0},children:`视频内容:`}),x.analysisStatus===`processing`?(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(uq,{size:`small`,style:{color:`#f59e0b`}}),(0,$.jsx)(`span`,{style:{fontSize:14,color:`#f59e0b`},children:`分析中`})]}):x.analysisStatus===`completed`?(0,$.jsx)(`span`,{style:{color:`#475569`,lineHeight:1.6,height:100,overflowY:`auto`},children:x.originalVideoContent}):null]})]})})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:16,marginBottom:20,marginTop:20},children:[(0,$.jsx)(jD,{type:`default`,onClick:ee,disabled:!P||O,style:{flex:1,height:52,borderRadius:12,border:`2px solid rgba(99, 102, 241, 0.3)`,color:`#6366f1`,fontWeight:600,fontSize:15,background:`rgba(255, 255, 255, 0.9)`,backdropFilter:`blur(10px)`,transition:`all 0.3s cubic-bezier(0.4, 0, 0.2, 1)`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`#6366f1`,e.currentTarget.style.boxShadow=`0 4px 20px rgba(99, 102, 241, 0.2)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`rgba(99, 102, 241, 0.3)`,e.currentTarget.style.boxShadow=`none`},children:`手动`}),(0,$.jsx)(jq,{title:F===`AI重拆`?`确定要AI重拆吗?`:`确定要AI拆分吗?`,okText:`确定`,cancelText:`取消`,onConfirm:W,children:(0,$.jsxs)(jD,{type:`primary`,loading:A,disabled:A,style:{flex:1,height:52,borderRadius:12,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a855f7 100%)`,fontWeight:600,fontSize:15,border:`none`,boxShadow:`0 4px 20px rgba(99, 102, 241, 0.3)`,transition:`all 0.3s cubic-bezier(0.4, 0, 0.2, 1)`,position:`relative`,overflow:`hidden`},onMouseEnter:e=>{e.currentTarget.style.transform=`translateY(-2px)`,e.currentTarget.style.boxShadow=`0 6px 25px rgba(99, 102, 241, 0.4)`},onMouseLeave:e=>{e.currentTarget.style.transform=`translateY(0)`,e.currentTarget.style.boxShadow=`0 4px 20px rgba(99, 102, 241, 0.3)`},children:[(0,$.jsx)(`span`,{style:{position:`relative`,zIndex:1},children:F}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:0,left:`-100%`,width:`100%`,height:`100%`,background:`linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent)`,transition:`left 0.5s ease`},onMouseEnter:e=>{e.currentTarget.style.left=`100%`}}),x?.aiSuggestions&&x.aiSuggestions.length>0&&(0,$.jsx)(cT,{title:(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`div`,{style:{fontWeight:600,marginBottom:8,color:`#6366f1`},children:`AI拆分方案`}),(x?.ai_suggestions||x?.aiSuggestions||[]).map(e=>(0,$.jsxs)(`div`,{style:{marginBottom:8,fontSize:13,lineHeight:1.5},children:[(0,$.jsxs)(`span`,{style:{fontWeight:500,color:`#6366f1`},children:[e.index,`.`]}),(0,$.jsx)(`span`,{style:{marginLeft:4,color:`#000000ff`},children:e.timeNode}),(0,$.jsx)(`br`,{}),(0,$.jsx)(`span`,{style:{color:`#666`},children:e.content})]},e.index))]}),placement:`top`,trigger:`hover`,overlayInnerStyle:{backgroundColor:`#fff`,height:300,overflowY:`auto`,border:`1px solid rgba(99, 102, 241, 0.1)`,borderRadius:12,boxShadow:`0 8px 24px rgba(99, 102, 241, 0.12)`},children:(0,$.jsx)(`span`,{style:{marginLeft:8,fontSize:13,opacity:.9},children:`(AI 镜头拆分方案)`})})]})})]}),(0,$.jsxs)(`div`,{style:{flex:2,background:`linear-gradient(135deg, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0.7) 100%)`,backdropFilter:`blur(20px)`,borderRadius:20,overflow:`hidden`,display:`flex`,flexDirection:`column`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`},children:[(0,$.jsxs)(`div`,{style:{padding:`16px 24px`,borderBottom:`1px solid rgba(99, 102, 241, 0.1)`,background:`linear-gradient(135deg, rgba(99,102,241,0.02) 0%, transparent 100%)`},children:[(0,$.jsx)(`h3`,{style:{fontSize:16,fontWeight:600,color:`#1e293b`,margin:0},children:`拆镜片段列表`}),(0,$.jsxs)(`span`,{style:{fontSize:12,color:`#64748b`,marginLeft:12},children:[`共 `,w.length,` 个片段`]})]}),(0,$.jsx)(n$,{columns:[{title:`片段`,width:100,fixed:`left`,align:`center`,render:(e,t)=>(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`div`,{style:{fontSize:16,fontWeight:600,color:`#333`},children:t.segmentName||`片段${t.segmentIndex||``}`}),(0,$.jsx)(`div`,{style:{fontSize:12,color:`#999`},children:t.timeNode}),t.sourceMode===`custom`&&(0,$.jsx)(h$,{color:`blue`,style:{marginTop:6},children:`手动`}),t.sourceMode===`ai_suggestion`&&(0,$.jsx)(h$,{color:`orange`,style:{marginTop:6},children:`自动`})]})},{title:`片段视频`,width:150,align:`center`,render:(e,t)=>(0,$.jsx)(`div`,{style:{position:`relative`,width:120,height:80,borderRadius:6,overflow:`hidden`,background:`#f1f5f9`,cursor:`pointer`},onClick:()=>{console.log(`video clicked:`,t.segmentVideoUrl),t.segmentVideoUrl&&(d(Z9(t.segmentVideoUrl)),p(!0))},children:t.segmentVideoUrl?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`video`,{src:Z9(t.segmentVideoUrl),style:{width:`100%`,height:`100%`,objectFit:`cover`,pointerEvents:`none`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,bottom:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`rgba(0,0,0,0.3)`},children:(0,$.jsx)(`div`,{style:{width:32,height:32,borderRadius:`50%`,background:`rgba(255,255,255,0.9)`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(`div`,{style:{width:0,height:0,borderTop:`8px solid transparent`,borderBottom:`8px solid transparent`,borderLeft:`14px solid #6366f1`,marginLeft:2}})})})]}):(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:12},children:t.splitStatus===`failed`?`切割失败`:`切割中`})})},{title:`视频内容`,width:500,align:`left`,render:(e,t)=>{if(t.source_mode===`ai_suggestion`||t.sourceMode===`ai_suggestion`)return(0,$.jsx)(`div`,{style:{fontSize:14,color:`#333`,lineHeight:1.6},children:t.segmentContent||t.lastError||`-`});let n=t.analysis_status||t.analysisStatus,r={not_required:`无需单独分析`,pending:`等待分析`,processing:`分析中`,failed:`分析失败`};return n===`processing`?(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(uq,{size:`small`}),(0,$.jsx)(`span`,{style:{fontSize:14,color:`#f59e0b`},children:`分析中`})]}):n===`failed`?(0,$.jsx)(`div`,{style:{fontSize:14,color:`#ef4444`,lineHeight:1.6},children:`分析失败`}):(0,$.jsx)(`div`,{style:{fontSize:14,color:`#333`,lineHeight:1.6},children:n&&r[n]?r[n]:t.segmentContent||t.lastError||`-`})}},{title:`视频类型`,width:120,align:`center`,render:(e,t)=>(0,$.jsx)(`div`,{style:{fontSize:14,color:`#333`,fontWeight:500},children:t.segmentCategory||`-`})},{title:`状态`,width:120,align:`center`,dataIndex:`moduleProjectStatus`,render:(e,t)=>{let n=e,r=t.moduleProjectCurrentStepCode||t.currentStepCode,i=(()=>{if(r===`image_prompt_optimize`)switch(n){case`waiting_user`:return{text:`等待融合图生成`,color:`#f59e0b`};case`processing`:return{text:`图片提示词生成中`,color:`#f59e0b`};case`completed`:return{text:`图片提示词生成成功`,color:`#10b981`};case`failed`:return{text:`图片提示词生成失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else if(r===`image_generate`)switch(n){case`waiting_user`:return{text:`等待生成视频提示词`,color:`#f59e0b`};case`processing`:return{text:`融合图生成中`,color:`#f59e0b`};case`completed`:return{text:`融合图生成成功`,color:`#10b981`};case`failed`:return{text:`融合图生成失败`,color:`#ef4444`};default:return n||`-`}else if(r===`video_prompt_optimize`)switch(n){case`waiting_user`:return{text:`等待最终视频生成`,color:`#f59e0b`};case`processing`:return{text:`视频提示词生成中`,color:`#f59e0b`};case`completed`:return{text:`视频提示词生成成功`,color:`#10b981`};case`failed`:return{text:`视频提示词生成失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else if(r===`video_generate`)switch(n){case`waiting_user`:return{text:``,color:`#666`};case`processing`:return{text:`最终视频生成中`,color:`#f59e0b`};case`completed`:return{text:`任务完成`,color:`#10b981`};case`failed`:return{text:`最终视频生成失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else if(r===`material_input`)switch(n){case`waiting_user`:return{text:`等待生成图片提示词`,color:`#f59e0b`};case`processing`:return{text:`素材处理中`,color:`#f59e0b`};case`completed`:return{text:`素材上传成功`,color:`#10b981`};case`failed`:return{text:`素材上传失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else return t.moduleProjectId?{pending:{text:`子任务待处理`,color:`#f59e0b`},waiting_user:{text:`等待用户确认或触发`,color:`#f59e0b`},processing:{text:`子任务处理中`,color:`#f59e0b`},completed:{text:`子任务完成`,color:`#10b981`},failed:{text:`子任务失败`,color:`#ef4444`},cancelled:{text:`子任务取消`,color:`#94a3b8`}}[n]||{text:n||`-`,color:`#666`}:{text:`待生成任务`,color:`#94a3b8`}})();return typeof i==`string`?(0,$.jsx)(`span`,{style:{fontSize:12,color:`#666`,fontWeight:500},children:i}):(0,$.jsx)(`span`,{style:{fontSize:12,color:i.color,fontWeight:500},children:i.text})}},{title:`操作`,width:140,fixed:`right`,align:`center`,render:(e,n)=>(0,$.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,gap:8},children:n.moduleProjectId?(0,$.jsx)(jD,{type:`text`,onClick:()=>t(`/removelens/${n.moduleProjectId}/removefenbu`),style:{color:`#10b981`,fontSize:12,padding:0,display:`flex`,alignItems:`center`,gap:4},children:`详情任务`}):(0,$.jsx)(jD,{type:`text`,onClick:()=>z(String(n.id),n.segmentName),disabled:!G(n),style:{color:G(n)?`#f59e0b`:`#94a3b8`,fontSize:12,padding:0,display:`flex`,alignItems:`center`,gap:4},children:G(n)?`视频生成`:`待切割完成`})})}],dataSource:w,pagination:!1,bordered:!1,rowKey:`id`,scroll:{y:300},style:{flex:1},components:{body:{row:({className:e,style:t,...n})=>(0,$.jsx)(`tr`,{...n,className:e,style:{...t,transition:`all 0.2s ease`,borderBottom:`1px solid rgba(99, 102, 241, 0.05)`,height:80}}),cell:({className:e,style:t,...n})=>(0,$.jsx)(`td`,{...n,className:e,style:{...t,padding:`16px 24px`}})},header:{cell:({className:e,style:t,...n})=>(0,$.jsx)(`th`,{...n,className:e,style:{...t,background:`rgba(255, 255, 255, 1)`,color:`#64748b`,fontWeight:500,fontSize:13,padding:`16px 24px`,borderBottom:`none`}})}}})]})]}):(0,$.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(`span`,{style:{fontSize:16,color:`#999`},children:`加载中...`})})]}),(0,$.jsx)(Tte,{open:i,videoUrl:P,title:`手动视频切片`,loading:O,minDuration:Y9,maxDuration:X9,onCancel:()=>a(!1),onConfirm:te}),(0,$.jsx)(yU,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,width:`100%`},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsx)(`div`,{style:{width:4,height:20,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:18,fontWeight:600,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`智能视频复刻`}),c&&(0,$.jsxs)(`span`,{style:{fontSize:14,color:`#64748b`},children:[`- `,c]})]}),(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(K8,{}),onClick:B,style:{padding:0,color:`#64748b`,fontSize:14}})]}),placement:`right`,closable:!1,onClose:B,open:n,size:480,styles:{body:{padding:`24px`,background:`linear-gradient(180deg, #f8fafc 0%, #eef2ff 100%)`},header:{background:`#fff`,borderBottom:`1px solid rgba(99, 102, 241, 0.1)`,padding:`20px 24px`},section:{borderRadius:`20px 0 0 20px`,overflow:`hidden`}},children:(0,$.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:20},children:[(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,padding:16,border:`1px solid rgba(99, 102, 241, 0.1)`},children:[(0,$.jsxs)(`label`,{style:{fontWeight:500,color:`#334155`,marginBottom:8,display:`block`,fontSize:14},children:[`产品白底图 `,(0,$.jsx)(`span`,{style:{color:`#ef4444`},children:`*`})]}),(0,$.jsx)(`div`,{style:{display:`flex`,gap:12},children:(0,$.jsx)(u0,{listType:`picture-card`,onChange:V,beforeUpload:H,maxCount:1,accept:`image/*`,style:{width:120,height:120,borderRadius:8,border:`2px dashed rgba(99, 102, 241, 0.3)`,background:`rgba(99, 102, 241, 0.02)`},children:!y&&(0,$.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,gap:6},children:[(0,$.jsx)(jR,{style:{fontSize:20,color:`#6366f1`}}),(0,$.jsx)(`span`,{style:{fontSize:12,color:`#64748b`},children:`上传产品图`})]})})})]}),(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,padding:16,border:`1px solid rgba(99, 102, 241, 0.1)`},children:[(0,$.jsxs)(`label`,{style:{fontWeight:500,color:`#334155`,marginBottom:8,display:`block`,fontSize:14},children:[`产品名称 `,(0,$.jsx)(`span`,{style:{color:`#ef4444`},children:`*`})]}),(0,$.jsx)(rK,{value:h,onChange:e=>g(e.target.value),placeholder:`请输入产品名称`,style:{height:44,borderRadius:8,border:`1px solid rgba(99, 102, 241, 0.2)`},maxLength:10,showCount:!0})]}),(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,padding:16,border:`1px solid rgba(99, 102, 241, 0.1)`},children:[(0,$.jsxs)(`label`,{style:{fontWeight:500,color:`#334155`,marginBottom:8,display:`block`,fontSize:14},children:[`产品卖点 `,(0,$.jsx)(`span`,{style:{color:`#ef4444`},children:`*`})]}),(0,$.jsx)(Ete,{value:_,onChange:e=>v(e.target.value),placeholder:`请输入产品卖点`,style:{borderRadius:8,border:`1px solid rgba(99, 102, 241, 0.2)`},maxLength:100,showCount:!0,rows:3})]}),(0,$.jsx)(`div`,{style:{display:`flex`,gap:12,marginTop:8},children:(0,$.jsx)(jD,{type:`primary`,onClick:U,loading:E,disabled:E,style:{flex:1,height:48,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,fontWeight:600,fontSize:15,border:`none`,boxShadow:`0 4px 15px rgba(99, 102, 241, 0.3)`,transition:`all 0.2s ease`},onMouseEnter:e=>{e.currentTarget.style.boxShadow=`0 6px 20px rgba(99, 102, 241, 0.4)`,e.currentTarget.style.transform=`translateY(-1px)`},onMouseLeave:e=>{e.currentTarget.style.boxShadow=`0 4px 15px rgba(99, 102, 241, 0.3)`,e.currentTarget.style.transform=`translateY(0)`},children:E?`生成中...`:`手动生成`})})]})}),(0,$.jsx)(Dq,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsx)(`div`,{style:{width:4,height:20,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:16,fontWeight:600,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`视频预览`})]}),open:f,onCancel:()=>p(!1),afterClose:()=>{m.current&&(m.current.pause(),m.current.currentTime=0)},footer:null,width:640,centered:!0,styles:{body:{padding:24},header:{borderBottom:`1px solid #e0e0e0`,padding:`20px 24px`}},children:(0,$.jsx)(`div`,{style:{borderRadius:12,overflow:`hidden`},children:(0,$.jsx)(`video`,{ref:m,controls:!0,src:u||``,style:{width:`100%`,maxHeight:420,objectFit:`contain`,backgroundColor:`#000`},playsInline:!0,"webkit-playsinline":!0,autoPlay:!0})})})]})}var{Title:kte,Text:Q9}=g1,{TextArea:Ate}=rK;function jte(e){return e===void 0?e:JSON.parse(JSON.stringify(e))}function Mte(){let e=qe(),{creatID:t}=Ze(),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(``),[o,s]=(0,S.useState)(!1),[c,l]=(0,S.useState)(`image`),[u,d]=(0,S.useState)({}),[f,p]=(0,S.useState)(null),[m,h]=(0,S.useState)(null),[g,_]=(0,S.useState)(``),[v,y]=(0,S.useState)(!1),[b,x]=(0,S.useState)({}),[C,w]=(0,S.useState)(``),[T,E]=(0,S.useState)(!1),[D,O]=(0,S.useState)(!1),[k,A]=(0,S.useState)(5),[j,M]=(0,S.useState)(`16:9`),[N,P]=(0,S.useState)(`480p`),[F,I]=(0,S.useState)({ratios:[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],resolutions:[`480p`,`720p`,`1080p`],durations:[5,8,10,12,15]}),[L,R]=(0,S.useState)([]),[z,B]=(0,S.useState)(1),[V,H]=(0,S.useState)(20),[U,W]=(0,S.useState)(0),[ee,te]=(0,S.useState)(``),[G,ne]=(0,S.useState)({}),[K,q]=(0,S.useState)([]),[J,re]=(0,S.useState)([]),Y=[{id:1,title:`原始素材`,description:`上传原始视频素材`,childId:1},{id:2,title:`生成提示词`,description:`根据素材生成描述词`,childId:2},{id:3,title:`生成产品融合图`,description:`生成产品与场景融合图`,childId:3},{id:4,title:`生成视频提示词`,description:`生成视频生成提示词`,childId:4},{id:5,title:`生成最终视频`,description:`合成最终视频`,childId:5}].map((e,t)=>({...e,status:K[t]?.status||``,id:K[t]?.id||t,output:K[t]?.output||``,engineId:K[t]?.input?.payload?.videoConfig?.engineId||``}));(0,S.useEffect)(()=>{let e=new Set;J.forEach(t=>{let n=Y.find(e=>String(e.childId)===t);n&&(n.status===`completed`||n.status===`failed`)&&e.add(t)});for(let t=Y.length-1;t>=0;t--)if(Y[t].status===`completed`||Y[t].status===`failed`){e.add(String(Y[t].childId));break}e.size>0?re(Array.from(e)):re([])},[K]);let ie=(e,t,n)=>{h7(e,t,n).then(e=>{e.items&&R(e.items),e.total!==void 0&&W(e.total)}).catch(e=>{})},ae=(e,t)=>{B(e),H(t),ie(e,t,ee)},oe=()=>{ie(1,20,ee)};(0,S.useEffect)(()=>{ie(z,V,ee)},[]),(0,S.useEffect)(()=>{J5().then(e=>{if(x(e.engine||{}),e.engine?.video&&e.engine.video.length>0){w(e.engine.video[0].id);let t=e.engine.video[0];I({ratios:t.supportedRatios||[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],resolutions:t.supportedResolutions||[`480p`,`720p`,`1080p`],durations:t.supportedDurations||[5,8,10,12,15]})}}).catch(e=>{})},[]),(0,S.useEffect)(()=>()=>{m&&(clearInterval(m),h(null))},[m]),(0,S.useEffect)(()=>{let e=e=>{let t=e.target;!t.closest(`.image-settings-trigger`)&&!t.closest(`.image-settings-popover`)&&(E(!1),O(!1))};return document.addEventListener(`mousedown`,e),()=>{document.removeEventListener(`mousedown`,e)}},[]),(0,S.useEffect)(()=>{console.log(`creatID`,t),t&&x7(t).then(e=>{ne(e),e.steps&&q(e.steps)}).catch(e=>{})},[t]),(0,S.useEffect)(()=>{let e=Y[4];e&&e.status!==`completed`&&e.status!==`failed`?m||h(setInterval(le,3e4)):e&&m&&(clearInterval(m),h(null))},[Y]);let se=(e,t,n,i)=>{l(t||`image`),_(n?String(n):``),t===`video`?(p(i||null),d(e&&typeof e==`object`?jte(e):{}),a(``)):(p(null),a(e||``),d({})),r(!0)},ce=async()=>{if(c===`image`){if(!G?.id||!g){Q.warning(`缺少任务或步骤 ID,无法保存图片提示词`);return}if(!i||!i.trim()){Q.warning(`图片提示词不能为空`);return}y(!0);try{await C7(G.id,g,{prompt:i.trim()}),Q.success(`图片提示词已保存`),ue(),r(!1),_(``)}catch(e){Q.error(e?.message||`保存图片提示词失败`)}finally{y(!1)}return}if(!G?.id||!g){Q.warning(`缺少任务或步骤 ID,无法保存视频提示词`);return}if(!u||typeof u!=`object`||Object.keys(u).length===0){Q.warning(`视频提示词不能为空`);return}if(!f){Q.warning(`视频提词配置缺失,暂不能保存`);return}let e=D9(u,f);if(e){Q.warning(e);return}y(!0);try{await w7(G.id,g,{prompt_schema:u}),Q.success(`视频提示词已保存`),ue(),r(!1),_(``)}catch(e){Q.error(e?.message||`保存视频提示词失败`)}finally{y(!1)}},le=()=>{t&&x7(t).then(e=>{ne(e),e.steps&&q(e.steps)}).catch(e=>{})},ue=()=>{t&&x7(t).then(e=>{ne(e),e.steps&&q(e.steps)}).catch(e=>{})},de=e=>{S7(G.id,e.toString()).then(e=>{ue()}).catch(e=>{})},fe=e=>{T7(G.id,e.toString(),{engine_id:`0019e3dac0b795b925b`,image_proportion:`1:1`,image_px:`2048x2048`,image_size:`2K`}).then(e=>{ue()}).catch(e=>{})},pe=()=>{T7(G.id,Y[1].id.toString(),{engine_id:`0019e3dac0b795b925b`,image_proportion:`1:1`,image_px:`2048x2048`,image_size:`2K`}).then(e=>{ue()}).catch(e=>{})},me=e=>{let t={engine_id:C,duration:k,aspect_ratio:j,resolution:N,target_platform:`抖音`};E7(G.id,e.toString(),t).then(e=>{ue()}).catch(e=>{})},he=(e,t)=>{let n={engine_id:t};D7(G.id,e.toString(),n).then(e=>{ue()}).catch(e=>{})},ge=()=>{let e={engine_id:Y[3].engineId};D7(G.id,Y[2].id.toString(),e).then(e=>{ue()}).catch(e=>{})};return(0,$.jsxs)(S.Fragment,{children:[(0,$.jsxs)(`div`,{className:`initialinfo-container`,style:{margin:`-24px -32px -32px`,height:`calc(100vh - 34px)`,position:`relative`,boxSizing:`border-box`,overflow:`hidden`,display:`flex`,flexDirection:`column`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:-100,right:-100,width:300,height:300,background:`radial-gradient(circle, rgba(99,102,241,0.08) 0%, transparent 70%)`,borderRadius:`50%`,pointerEvents:`none`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,bottom:-100,left:-100,width:300,height:300,background:`radial-gradient(circle, rgba(167,139,250,0.08) 0%, transparent 70%)`,borderRadius:`50%`,pointerEvents:`none`}}),(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,justifyContent:`space-between`,alignItems:`stretch`,gap:`2%`,position:`relative`,zIndex:1,minHeight:0},children:[(0,$.jsxs)(`div`,{className:`replication-preview`,style:{flex:4,background:`rgba(255,255,255,0.85)`,backdropFilter:`blur(20px)`,borderRadius:20,overflow:`hidden`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`,display:`flex`,flexDirection:`column`,minHeight:0},children:[(0,$.jsxs)(`div`,{style:{borderBottom:`1px solid rgba(99, 102, 241, 0.08)`,width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`16px 24px`,background:`rgba(255,255,255,0.6)`,backdropFilter:`blur(10px)`,boxSizing:`border-box`},children:[(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(s2,{}),onClick:()=>window.history.back(),style:{color:`#64748b`,borderRadius:10,fontSize:13,height:32,transition:`all 0.25s cubic-bezier(0.4, 0, 0.2, 1)`},children:`返回`}),(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,$.jsx)(`div`,{style:{width:32,height:2,background:`linear-gradient(90deg, transparent, #6366f1, #8b5cf6, transparent)`,borderRadius:1}}),(0,$.jsx)(`h3`,{style:{margin:0,fontSize:16,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:`拆镜复刻 - 任务详情`}),(0,$.jsx)(`div`,{style:{width:32,height:2,background:`linear-gradient(90deg, transparent, #8b5cf6, #6366f1, transparent)`,borderRadius:1}})]}),(0,$.jsx)(jD,{type:`primary`,ghost:!0,style:{borderRadius:10,padding:`4px 16px`,fontSize:13,background:`rgba(99, 102, 241, 0.1)`,borderColor:`rgba(99, 102, 241, 0.2)`,color:`#6366f1`},onClick:()=>s(!0),children:`创作记录`})]}),(0,$.jsx)(`div`,{style:{flex:1,overflowY:`auto`},children:(0,$.jsxs)(`div`,{className:`material_box`,children:[(0,$.jsxs)(`div`,{style:{display:`flex`,gap:24,flexWrap:`wrap`,alignItems:`flex-start`},children:[(0,$.jsxs)(`div`,{style:{flex:1,minWidth:250},children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`视频`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`16/9`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:G?.material?.materialVideoUrl?(0,$.jsx)(`video`,{controls:!0,src:`http://ceshi.apiforeign.minzhong.cn${G.material.materialVideoUrl}`,style:{width:`100%`,height:`100%`,objectFit:`contain`}}):(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:13},children:`暂无视频`})})]}),(0,$.jsxs)(`div`,{className:`product_img`,style:{flex:1,minWidth:250},children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`产品图片`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`1/1`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:G?.material?.materialImageUrl?(0,$.jsx)(`img`,{src:G.material.materialImageUrl,alt:``,style:{width:`100%`,height:`100%`,objectFit:`contain`}}):(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:13},children:`暂无图片`})})]})]}),G?.finalImageUrl&&(0,$.jsx)(`div`,{style:{marginTop:24},children:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`生成图片`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`1/1`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:(0,$.jsx)(`img`,{src:`http://ceshi.apiforeign.minzhong.cn${G.finalImageUrl}`,alt:``,style:{width:`100%`,height:`100%`,objectFit:`contain`}})})]})}),G?.finalVideoUrl&&(0,$.jsx)(`div`,{style:{marginTop:24},children:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`生成视频`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`16/9`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:(0,$.jsx)(`video`,{controls:!0,src:`http://ceshi.apiforeign.minzhong.cn${G.finalVideoUrl}`,style:{width:`100%`,height:`100%`,objectFit:`contain`}})})]})})]})})]}),(0,$.jsxs)(`div`,{className:`replication-form`,style:{flex:1,minWidth:`450px`,background:`rgba(255,255,255,0.85)`,backdropFilter:`blur(20px)`,borderRadius:20,overflow:`hidden`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`,display:`flex`,flexDirection:`column`,minHeight:0},children:[(0,$.jsxs)(`div`,{style:{padding:`16px 24px`,borderBottom:`1px solid rgba(99, 102, 241, 0.08)`,display:`flex`,alignItems:`center`,gap:10,background:`rgba(255,255,255,0.6)`,backdropFilter:`blur(10px)`},children:[(0,$.jsx)(`div`,{style:{width:4,height:18,background:`linear-gradient(180deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:15,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:`生成步骤`})]}),(0,$.jsx)(`div`,{style:{flex:1,overflowY:`auto`,padding:`8px 16px 16px`},children:(0,$.jsx)(Qg,{activeKey:J,onChange:re,ghost:!0,bordered:!1,style:{background:`transparent`},expandIconPlacement:`end`,items:Y.map(e=>({key:String(e.childId),label:(0,$.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,width:`100%`,justifyContent:`space-between`},children:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[(0,$.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,width:16,height:16},children:e.status===`completed`?(0,$.jsx)(Y2,{style:{fontSize:16,color:`#22c55e`}}):e.status===`processing`?(0,$.jsx)(`div`,{style:{width:16,height:16,borderRadius:`50%`,border:`2px solid #e2e8f0`,borderTopColor:`#6366f1`,animation:`spinSlow 1s linear infinite`}}):e.status===`failed`?(0,$.jsx)(`div`,{style:{width:16,height:16,borderRadius:`50%`,background:`#ef4444`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(`span`,{style:{color:`#fff`,fontSize:10},children:`×`})}):(0,$.jsx)(`div`,{style:{width:8,height:8,borderRadius:`50%`,background:`#cbd5e1`}})}),(0,$.jsx)(`span`,{style:{fontSize:14,color:e.status===`processing`||e.status===`waiting_user`?`#6366f1`:`#1e293b`,fontWeight:500},children:e.title}),(e.status===`processing`||e.status===`waiting_user`)&&(0,$.jsx)(`span`,{style:{fontSize:12,color:`#6366f1`,marginLeft:8},children:`生成中`}),e.status===`failed`&&(0,$.jsx)(`span`,{style:{fontSize:12,color:`#ef4444`,marginLeft:8},children:`失败`}),e.status===``&&(0,$.jsx)(`span`,{style:{fontSize:12,color:`#717d8b`,marginLeft:8},children:`待生成`})]})}),children:(0,$.jsxs)(`div`,{style:{padding:`16px`,background:`linear-gradient(135deg, rgba(248,250,252,0.6) 0%, rgba(238,242,255,0.4) 100%)`,borderRadius:12,marginTop:8,border:`1px solid rgba(99, 102, 241, 0.06)`},children:[e.childId===1&&(0,$.jsx)($.Fragment,{children:(0,$.jsxs)(`div`,{style:{display:`flex`,gap:20,marginBottom:20,alignItems:`flex-start`,flexWrap:`wrap`},children:[(0,$.jsxs)(`div`,{style:{flex:1,minWidth:200},children:[(0,$.jsx)(Q9,{style:{color:`#64748b`,fontSize:13,marginBottom:10,display:`block`,fontWeight:500},children:`原视频`}),(0,$.jsx)(`div`,{style:{height:180,borderRadius:12,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,display:`flex`,alignItems:`center`,justifyContent:`center`,border:`1px solid rgba(99, 102, 241, 0.06)`},children:G?.material?.materialVideoUrl?(0,$.jsx)(`video`,{src:`http://ceshi.apiforeign.minzhong.cn${G.material.materialVideoUrl}`,style:{maxWidth:`100%`,maxHeight:`100%`,objectFit:`contain`,borderRadius:10},controls:!0}):(0,$.jsxs)(`div`,{style:{textAlign:`center`,color:`#94a3b8`},children:[(0,$.jsxs)(`svg`,{width:`32`,height:`32`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,style:{marginBottom:8},children:[(0,$.jsx)(`rect`,{x:`2`,y:`2`,width:`20`,height:`16`,rx:`2`,ry:`2`}),(0,$.jsx)(`path`,{d:`M8 12l4 2 4-2`})]}),(0,$.jsx)(`div`,{style:{fontSize:13},children:`暂无视频`})]})})]}),(0,$.jsxs)(`div`,{style:{flex:1,minWidth:200},children:[(0,$.jsx)(Q9,{style:{color:`#64748b`,fontSize:13,marginBottom:10,display:`block`,fontWeight:500},children:`产品图片`}),(0,$.jsx)(`div`,{style:{height:180,borderRadius:12,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,display:`flex`,alignItems:`center`,justifyContent:`center`,border:`1px solid rgba(99, 102, 241, 0.06)`},children:G?.material?.materialImageUrl?(0,$.jsx)(`img`,{src:G.material.materialImageUrl,alt:`产品图片`,style:{maxWidth:`100%`,maxHeight:`100%`,objectFit:`contain`,borderRadius:10}}):(0,$.jsxs)(`div`,{style:{textAlign:`center`,color:`#94a3b8`},children:[(0,$.jsxs)(`svg`,{width:`32`,height:`32`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,style:{marginBottom:8},children:[(0,$.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,ry:`2`}),(0,$.jsx)(`circle`,{cx:`8.5`,cy:`8.5`,r:`1.5`,fill:`currentColor`}),(0,$.jsx)(`path`,{d:`M21 15l-5-5L5 21`})]}),(0,$.jsx)(`div`,{style:{fontSize:13},children:`暂无图片`})]})})]}),(0,$.jsx)(jD,{onClick:()=>{Q.info(`正在生成图片提示词,请稍候...`),de(e.id)},type:`primary`,style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,children:`下一步:生成图片提示词`})]})}),e.childId===2&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{style:{padding:`12px 14px`,background:`rgba(255,255,255,0.6)`,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.08)`,marginBottom:4},children:(0,$.jsx)(Q9,{style:{color:`#475569`,fontSize:13,lineHeight:1.8,whiteSpace:`pre-wrap`},children:e?.output?.payload?.prompt||`暂无提示词`})}),(0,$.jsxs)(OU,{style:{marginTop:16,gap:12,width:`100%`},children:[(0,$.jsx)(jD,{type:`default`,icon:(0,$.jsx)(x$,{}),onClick:()=>se(e?.output?.payload?.prompt,`image`,e.id),style:{flex:1,borderRadius:10,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:36,fontWeight:500,background:`rgba(99, 102, 241, 0.04)`},disabled:e.status!==`completed`,children:`修改提示词`}),(0,$.jsx)(jD,{onClick:()=>{Q.info(`正在生成图片,请稍候...`),fe(e.id)},type:`primary`,style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,children:`下一步:生成图片`})]})]}),e.childId===3&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{borderRadius:12,overflow:`hidden`,marginBottom:16,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,border:`1px solid rgba(99, 102, 241, 0.08)`,boxShadow:`0 2px 8px rgba(99, 102, 241, 0.04)`,position:`relative`},children:[G.finalImageUrl?(0,$.jsx)(`img`,{src:`http://ceshi.apiforeign.minzhong.cn${G.finalImageUrl}`,alt:`融合图`,style:{width:`100%`,height:180,objectFit:`cover`}}):(0,$.jsx)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:14},children:`暂无融合图`}),(0,$.jsx)(jD,{type:`default`,icon:(0,$.jsx)(x$,{}),onClick:()=>pe(),disabled:e.status!==`completed`,style:{position:`absolute`,bottom:8,left:8,borderRadius:8,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:30,fontWeight:500,background:`rgba(255,255,255,0.85)`,backdropFilter:`blur(4px)`,padding:`0 12px`,fontSize:12},children:`重新生成`})]}),(0,$.jsx)(`p`,{style:{marginBottom:6,fontSize:14,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:`视频参数选择:`}),(0,$.jsxs)(`div`,{style:{width:`100%`,display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,$.jsxs)(`div`,{style:{flex:1,position:`relative`,display:`inline-block`},children:[(0,$.jsxs)(`button`,{onClick:()=>{E(!T),O(!1)},className:`image-settings-trigger`,style:{width:`100%`,padding:`4px 12px`,height:34,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.15)`,backgroundColor:`rgba(255,255,255,0.7)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`,gap:6,transition:`all 0.2s`},children:[(0,$.jsx)(P6,{style:{fontSize:14,color:`#6366f1`}}),(0,$.jsx)(Q9,{style:{fontSize:14,fontWeight:500,color:`#64748b`},children:b.video?.find(e=>e.id===C)?.name||`选择引擎`})]}),T&&(0,$.jsx)(`div`,{className:`image-settings-popover`,style:{position:`absolute`,bottom:`calc(100% + 8px)`,left:-10,width:350,backgroundColor:`#fff`,borderRadius:16,boxShadow:`0 10px 40px rgba(0,0,0,0.15)`,padding:16,border:`none`,zIndex:9999},onClick:e=>e.stopPropagation(),children:(0,$.jsxs)(`div`,{style:{marginBottom:8},children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择引擎`}),(0,$.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:4},children:b.video?.map(e=>(0,$.jsxs)(`button`,{onClick:()=>{w(e.id),I({ratios:e.supportedRatios||[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],resolutions:e.supportedResolutions||[`480p`,`720p`,`1080p`],durations:e.supportedDurations||[5,8,10,12,15]}),e.supportedRatios?.includes(j)||M(e.supportedRatios?.[0]||`16:9`),e.supportedResolutions?.includes(N)||P(e.supportedResolutions?.[0]||`720p`),e.supportedDurations?.includes(k)||A(e.supportedDurations?.[0]||5),E(!1)},style:{flex:1,minHeight:48,borderRadius:8,border:C===e.id?`2px solid #6366f1`:`1px solid #e5e7eb`,backgroundColor:C===e.id?`#fff`:`#f9fafb`,cursor:`pointer`,display:`flex`,flexDirection:`column`,justifyContent:`center`,alignItems:`flex-start`,padding:`8px 12px`,transition:`all 0.2s`,textAlign:`left`},children:[(0,$.jsx)(`span`,{style:{fontSize:13,fontWeight:C===e.id?600:500,color:C===e.id?`#6366f1`:`#4b5563`,marginBottom:2},children:e.name}),(0,$.jsx)(`span`,{style:{fontSize:11,color:`#9ca3af`}})]},e.id))})]})})]}),(0,$.jsxs)(`div`,{style:{flex:1,position:`relative`,display:`inline-block`},children:[(0,$.jsxs)(`button`,{onClick:()=>{O(!D),E(!1)},className:`image-settings-trigger`,style:{width:`100%`,padding:`4px 12px`,height:34,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.15)`,backgroundColor:`rgba(255,255,255,0.7)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`,gap:6,transition:`all 0.2s`},children:[(0,$.jsx)(y3,{style:{fontSize:14,color:`#6366f1`}}),(0,$.jsxs)(Q9,{style:{fontSize:14,fontWeight:500,color:`#64748b`},children:[j,` · `,k,`s · `,N]})]}),D&&(0,$.jsxs)(`div`,{className:`image-settings-popover`,style:{position:`absolute`,bottom:`calc(100% + 8px)`,left:-160,width:350,backgroundColor:`#fff`,borderRadius:16,boxShadow:`0 10px 40px rgba(0,0,0,0.15)`,padding:16,border:`none`,zIndex:9999},onClick:e=>e.stopPropagation(),children:[(0,$.jsxs)(`div`,{style:{marginBottom:16},children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择比例`}),(0,$.jsx)(`div`,{style:{display:`flex`,flexWrap:`wrap`,gap:4},children:F.ratios.map(e=>(0,$.jsxs)(`button`,{onClick:()=>M(e),style:{flex:`0 0 calc(14.28% - 4px)`,minWidth:44,height:52,borderRadius:6,border:j===e?`2px solid #6366f1`:`1px solid #e5e7eb`,backgroundColor:j===e?`#fff`:`#f9fafb`,cursor:`pointer`,display:`flex`,flexDirection:`column`,justifyContent:`center`,alignItems:`center`,transition:`all 0.2s`},children:[(0,$.jsx)(`div`,{style:{width:18,height:18,border:`2px solid ${j===e?`#6366f1`:`#9ca3af`}`,borderRadius:2,marginBottom:2}}),(0,$.jsx)(`span`,{style:{fontSize:9,color:j===e?`#6366f1`:`#6b7280`,fontWeight:j===e?600:400},children:e})]},e))})]}),(0,$.jsxs)(`div`,{style:{marginBottom:16},children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择时长`}),(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsxs)(`div`,{style:{flex:1,position:`relative`,height:24,display:`flex`,alignItems:`center`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:`50%`,left:0,right:0,height:6,borderRadius:3,background:`#e5e7eb`,transform:`translateY(-50%)`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:`50%`,left:0,height:6,borderRadius:3,background:`#6366f1`,width:`${(k-Math.min(...F.durations))/(Math.max(...F.durations)-Math.min(...F.durations))*100}%`,transform:`translateY(-50%)`}}),(0,$.jsx)(`input`,{type:`range`,min:Math.min(...F.durations),max:Math.max(...F.durations),value:k,onChange:e=>A(Number(e.target.value)),style:{position:`relative`,width:`100%`,height:24,borderRadius:3,background:`transparent`,outline:`none`,appearance:`none`,cursor:`pointer`,zIndex:1}})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,padding:`4px 12px`,backgroundColor:`#f1f5f9`,borderRadius:6},children:[(0,$.jsx)(`span`,{style:{fontSize:14,fontWeight:600,color:`#64748b`},children:k}),(0,$.jsx)(`span`,{style:{fontSize:12,color:`#9ca3af`},children:`秒`})]})]})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择分辨率`}),(0,$.jsx)(`div`,{style:{display:`flex`,gap:6},children:F.resolutions.map(e=>(0,$.jsx)(`button`,{onClick:()=>P(e),style:{flex:1,height:42,borderRadius:6,border:N===e?`2px solid #6366f1`:`1px solid #e5e7eb`,backgroundColor:N===e?`#6366f1`:`#f9fafb`,cursor:`pointer`,display:`flex`,justifyContent:`center`,alignItems:`center`,transition:`all 0.2s`},children:(0,$.jsx)(`span`,{style:{fontSize:12,fontWeight:600,color:N===e?`#fff`:`#4b5563`},children:e})},e))})]})]})]})]}),(0,$.jsx)(jD,{type:`primary`,style:{width:`100%`,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},onClick:()=>{Q.info(`正在生成视频提示词,请稍候...`),me(e.id)},disabled:e.status!==`completed`,children:`下一步:生成视频提示词`})]}),e.childId===4&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{style:{padding:`12px 14px`,background:`rgba(255,255,255,0.6)`,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.08)`,marginBottom:4},children:(0,$.jsx)(Q9,{style:{color:`#64748b`,fontSize:13,lineHeight:1.8},children:`视频提词已生成,可点击按钮查看/修改`})}),(0,$.jsxs)(OU,{style:{marginTop:16,gap:12,width:`100%`},children:[(0,$.jsx)(jD,{type:`default`,icon:(0,$.jsx)(x$,{}),onClick:()=>se(G?.videoGeneration?.promptSchema,`video`,e.id,G?.videoGeneration?.schemaConfigSnapshot),style:{flex:1,borderRadius:10,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:36,fontWeight:500,background:`rgba(99, 102, 241, 0.04)`},disabled:e.status!==`completed`||!G?.videoGeneration?.promptSchema||!G?.videoGeneration?.schemaConfigSnapshot,children:`查看/修改视频提词`}),(0,$.jsx)(jD,{onClick:()=>{Q.info(`正在生成视频,请稍候...`),he(e.id,e.engineId)},type:`primary`,style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,children:`下一步:生成视频`})]})]}),e.childId===5&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{style:{borderRadius:12,overflow:`hidden`,marginBottom:16,position:`relative`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,border:`1px solid rgba(99, 102, 241, 0.08)`,boxShadow:`0 2px 8px rgba(99, 102, 241, 0.04)`},children:e.status===`completed`&&G?.finalVideoUrl?(0,$.jsx)(`video`,{src:`http://ceshi.apiforeign.minzhong.cn${G.finalVideoUrl}`,style:{width:`100%`,height:180,objectFit:`cover`},controls:!0}):e.status===`processing`?(0,$.jsxs)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,flexDirection:`column`,gap:8},children:[(0,$.jsx)(`div`,{style:{width:20,height:20,borderRadius:`50%`,border:`2px solid #e2e8f0`,borderTopColor:`#6366f1`,animation:`spinSlow 1s linear infinite`}}),(0,$.jsx)(`span`,{style:{color:`#6366f1`,fontSize:14},children:`视频生成中...`})]}):e.status===`failed`?(0,$.jsx)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#ef4444`,fontSize:14},children:`视频生成失败`}):(0,$.jsx)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:14},children:`暂无视频`})}),(0,$.jsxs)(OU,{style:{width:`100%`,gap:12},children:[(0,$.jsx)(jD,{onClick:()=>ge(),type:`default`,icon:(0,$.jsx)(x$,{}),style:{flex:1,borderRadius:10,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:36,fontWeight:500,background:`rgba(99, 102, 241, 0.04)`},disabled:e.status!==`completed`,children:`重新生成`}),(0,$.jsx)(jD,{type:`primary`,icon:(0,$.jsx)(i0,{}),style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,onClick:()=>{let e=`http://ceshi.apiforeign.minzhong.cn${G?.finalVideoUrl}&download=1`,t=document.createElement(`a`);t.href=e,t.download=`video_${Date.now()}.mp4`,document.body.appendChild(t),t.click(),document.body.removeChild(t)},children:`下载视频`})]})]})]})}))})})]})]})]}),(0,$.jsx)(Dq,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,$.jsx)(`div`,{style:{width:4,height:18,background:`linear-gradient(180deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:15,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:c===`video`?`查看/编辑视频提词`:`修改提示词`})]}),open:n,onCancel:()=>{v||r(!1)},footer:[(0,$.jsx)(jD,{onClick:()=>r(!1),disabled:v,style:{borderRadius:8},children:`取消`},`cancel`),(0,$.jsx)(jD,{type:`primary`,onClick:ce,loading:v,disabled:v,style:{borderRadius:8,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`},children:`确认`},`confirm`)],width:800,style:{borderRadius:16},styles:{header:{background:`rgba(255,255,255,0.6)`,backdropFilter:`blur(10px)`,borderBottom:`1px solid rgba(99, 102, 241, 0.08)`,padding:`16px 24px`},body:{background:`linear-gradient(135deg, #f8fafc 0%, #eef2ff 50%, #f0f9ff 100%)`,padding:`20px 24px`}},children:c===`image`?(0,$.jsx)(Ate,{value:i,onChange:e=>a(e.target.value),rows:8,style:{width:`100%`,height:300,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.15)`,background:`rgba(255,255,255,0.8)`},placeholder:`请输入提示词`}):(0,$.jsx)(`div`,{style:{maxHeight:500,overflowY:`auto`,paddingRight:10},children:(0,$.jsx)(P9,{value:u,schemaConfigSnapshot:f,onChange:d})})}),(0,$.jsxs)(Dq,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsx)(`div`,{style:{width:4,height:20,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:16,fontWeight:600,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`创作记录`})]}),open:o,onCancel:()=>s(!1),width:800,footer:null,styles:{body:{background:`linear-gradient(180deg, #f8fafc 0%, #eef2ff 100%)`},header:{background:`#fff`,borderBottom:`1px solid rgba(99, 102, 241, 0.1)`,padding:`20px 24px`}},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,marginBottom:16,gap:8},children:[(0,$.jsx)(rK,{placeholder:`搜索产品名称`,value:ee,onChange:e=>te(e.target.value),onPressEnter:oe,style:{width:200,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.2)`,height:40}}),(0,$.jsx)(jD,{type:`primary`,onClick:oe,style:{borderRadius:10,height:40,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`},children:`搜索`})]}),(0,$.jsx)(`div`,{style:{background:`linear-gradient(135deg, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0.7) 100%)`,backdropFilter:`blur(20px)`,borderRadius:16,overflow:`hidden`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`},children:(0,$.jsx)(n$,{columns:[{title:`产品名称`,dataIndex:`title`,key:`title`,render:e=>(0,$.jsx)(`span`,{style:{fontSize:14,color:`#1e293b`,fontWeight:500},children:e})},{title:`创建时间`,dataIndex:`createdAt`,key:`createdAt`,render:e=>{if(!e)return`-`;let t=new Date(e);return(0,$.jsx)(`span`,{style:{fontSize:13,color:`#64748b`},children:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}:${String(t.getSeconds()).padStart(2,`0`)}`})}},{title:`操作`,key:`action`,align:`center`,render:t=>(0,$.jsx)(jD,{type:`text`,onClick:()=>e(`/removelens/${t.id}/removeinfo`),style:{color:`#6366f1`,fontSize:13,padding:`4px 12px`,borderRadius:6,background:`rgba(99, 102, 241, 0.1)`},onMouseEnter:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.15)`},onMouseLeave:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.1)`},children:`查看详情`})}],dataSource:L,rowKey:`id`,pagination:{current:z,pageSize:V,total:U,showSizeChanger:!0,showQuickJumper:!0,showTotal:e=>`共 ${e} 条`,onChange:ae,style:{padding:`16px 24px`,borderTop:`1px solid rgba(99, 102, 241, 0.1)`}},style:{fontSize:13},scroll:{y:350},components:{body:{row:({className:e,style:t,...n})=>(0,$.jsx)(`tr`,{...n,className:e,style:{...t,transition:`all 0.2s ease`,borderBottom:`1px solid rgba(99, 102, 241, 0.05)`}}),cell:({className:e,style:t,...n})=>(0,$.jsx)(`td`,{...n,className:e,style:{...t,padding:`16px 24px`}})},header:{cell:({className:e,style:t,...n})=>(0,$.jsx)(`th`,{...n,className:e,style:{...t,background:`rgba(99, 102, 241, 0.03)`,color:`#64748b`,fontWeight:500,fontSize:13,padding:`16px 24px`,borderBottom:`none`}})}}})})]})]})}var{RangePicker:Nte}=XH,$9=e=>e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase()),Pte=()=>{let e=qe(),[t]=En(),{message:n}=Fx.useApp(),[r,i]=(0,S.useState)([]),[a,o]=(0,S.useState)(0),[s,c]=(0,S.useState)(!1),[l,u]=(0,S.useState)(!1),[d,f]=(0,S.useState)(!1),[p,m]=(0,S.useState)([]),[h,g]=(0,S.useState)([]),[_,v]=(0,S.useState)(``),[y,b]=(0,S.useState)(1),[x,C]=(0,S.useState)(10),[w,T]=(0,S.useState)(t.get(`accountId`)||``),[E,D]=(0,S.useState)(),[O,k]=(0,S.useState)((0,zD.default)().subtract(1,`day`).format(`YYYY-MM-DD`)),[A,j]=(0,S.useState)(``);(0,S.useEffect)(()=>{N(),M()},[]);let M=async(e=1,t=10)=>{c(!0);try{let n=await M7({advertiser_id:w||void 0,consume_date:E,page:e,page_size:t});i(n.data||[]),o(n.pagination?.total||0),b(n.pagination?.page||1),C(n.pagination?.pageSize||10)}catch{n.error(`加载数据失败`)}finally{c(!1)}},N=async()=>{try{let e=((await P7()).data||[]).map(e=>({name:$9(e.field),description:e.description}));m(e);let t=localStorage.getItem(`consumeColumns`);g(t?JSON.parse(t):e.map(e=>e.name))}catch{n.error(`加载表头字段失败`)}},P=r.map((e,t)=>({...e,index:t+1,key:e.id})),F=()=>{e(`/authorization`)},I=()=>{b(1),M(1,x)},L=()=>{T(``),D(void 0),b(1),M(1,x)},R=()=>{Dq.confirm({title:`拉取消耗数据`,content:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`div`,{style:{marginBottom:12},children:[(0,$.jsx)(g1.Text,{style:{display:`block`,marginBottom:8},children:`同步日期:`}),(0,$.jsx)(XH,{value:(0,zD.default)(O),onChange:e=>k(e?e.format(`YYYY-MM-DD`):(0,zD.default)().subtract(1,`day`).format(`YYYY-MM-DD`)),style:{width:`100%`}})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsx)(g1.Text,{style:{display:`block`,marginBottom:8},children:`广告主ID(可选):`}),(0,$.jsx)(rK,{placeholder:`不指定则同步所有授权的广告主`,value:A,onChange:e=>j(e.target.value)})]})]}),onOk:async()=>{u(!0);try{await N7({date:O,advertiser_id:A||void 0}),n.success(`拉取消耗数据成功`),M(y,x)}catch{n.error(`拉取消耗数据失败`)}finally{u(!1)}},okText:`开始拉取`,cancelText:`取消`})},z=h.map(e=>p.find(t=>t.name===e)).filter(e=>!!e).map(e=>({title:e.description,dataIndex:e.name,key:e.name,ellipsis:!0}));return(0,$.jsxs)(`div`,{style:{minHeight:`94vh`},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,marginBottom:12},children:[(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(s2,{}),onClick:F}),(0,$.jsx)(j4,{style:{color:`#6366f1`,fontSize:16}}),(0,$.jsx)(g1.Text,{strong:!0,style:{fontSize:16},children:`消耗记录`})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,gap:12,marginBottom:16},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,gap:12},children:[(0,$.jsx)(rK,{placeholder:`广告主ID`,value:w,onChange:e=>T(e.target.value),style:{width:180},onPressEnter:()=>{b(1),M(1,x)}}),(0,$.jsx)(Nte,{value:E?[(0,zD.default)(E[0]),(0,zD.default)(E[1])]:void 0,onChange:e=>{e&&e[0]&&e[1]?D([e[0].format(`YYYY-MM-DD`),e[1].format(`YYYY-MM-DD`)]):D(void 0)}}),(0,$.jsx)(jD,{type:`primary`,size:`medium`,onClick:I,children:`搜索`}),(0,$.jsx)(jD,{size:`medium`,onClick:L,children:`重置`})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:12},children:[(0,$.jsx)(jD,{icon:(0,$.jsx)(s8,{}),onClick:R,loading:l,style:{borderRadius:8},children:`拉取消耗`}),(0,$.jsx)(jD,{icon:(0,$.jsx)(P6,{}),onClick:()=>f(!0),style:{borderRadius:8},children:`自定义表头`})]})]}),(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,boxShadow:`0 1px 3px rgba(0,0,0,0.05)`},children:[(0,$.jsx)(n$,{dataSource:P,columns:z,loading:s,pagination:!1,rowKey:`id`,bordered:!1,scroll:{x:`max-content`}}),(0,$.jsx)(`div`,{style:{padding:`16px`,textAlign:`right`},children:(0,$.jsx)(UK,{current:y,pageSize:x,total:a,showSizeChanger:!0,showTotal:e=>`共 ${e} 条记录`,onChange:(e,t)=>{b(e),C(t),M(e,t)},size:`small`})})]}),(0,$.jsx)(Dq,{title:`自定义表头`,open:d,onOk:()=>{localStorage.setItem(`consumeColumns`,JSON.stringify(h)),n.success(`表头设置已保存`),f(!1)},onCancel:()=>{f(!1),v(``)},okText:`确定`,cancelText:`取消`,width:800,children:(0,$.jsxs)(`div`,{style:{display:`flex`,gap:20,height:400},children:[(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`},children:[(0,$.jsx)(rK,{placeholder:`搜索指标...`,value:_,allowClear:!0,onChange:e=>v(e.target.value),style:{marginBottom:8}}),(0,$.jsx)(g1.Text,{type:`secondary`,style:{fontSize:12,marginBottom:12,display:`block`},children:`输入指标名称进行搜索`}),(0,$.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,border:`1px solid #f0f0f5`,borderRadius:8,padding:12},children:[(0,$.jsx)(`div`,{style:{marginBottom:16},children:(0,$.jsx)(g1.Text,{strong:!0,style:{fontSize:14,color:`#1e293b`},children:`任务详情指标`})}),(0,$.jsx)(bV,{checked:h.length===p.length&&p.length>0,indeterminate:h.length>0&&h.length{e.target.checked?g(p.map(e=>e.name)):g([])},style:{marginBottom:12},children:`全选`}),(0,$.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`1fr 1fr`,gap:8},children:p.filter(e=>e.description.toLowerCase().includes(_.toLowerCase())||e.name.toLowerCase().includes(_.toLowerCase())).map(e=>(0,$.jsx)(bV,{checked:h.includes(e.name),onChange:t=>{t.target.checked?g(t=>[...t,e.name]):g(t=>t.filter(t=>t!==e.name))},children:e.description},e.name))})]})]}),(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:12},children:[(0,$.jsxs)(g1.Text,{strong:!0,style:{fontSize:14,color:`#1e293b`},children:[`已添加(`,h.length,`)`]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:8},children:[(0,$.jsx)(jD,{size:`small`,onClick:()=>g([]),disabled:h.length===0,children:`清空`}),(0,$.jsx)(jD,{size:`small`,onClick:async()=>{try{let e=((await P7()).data||[]).map(e=>({name:$9(e.field),description:e.description}));m(e),g(e.map(e=>e.name)),localStorage.removeItem(`consumeColumns`),n.success(`表头字段已更新`)}catch{n.error(`更新表头字段失败`)}},children:`更新表头字段`})]})]}),(0,$.jsx)(`div`,{style:{flex:1,overflowY:`auto`,border:`1px solid #f0f0f5`,borderRadius:8,padding:12},children:h.length===0?(0,$.jsx)(g1.Text,{type:`secondary`,style:{fontSize:14,textAlign:`center`,display:`block`,padding:`40px 0`},children:`暂无已选指标`}):(0,$.jsx)(`div`,{children:h.map((e,t)=>{let n=p.find(t=>t.name===e);return(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`8px 12px`,borderBottom:`1px solid #f0f0f5`,cursor:`move`,userSelect:`none`},draggable:!0,onDragStart:e=>{e.dataTransfer.setData(`index`,String(t))},onDragOver:e=>{e.preventDefault()},onDrop:e=>{let n=parseInt(e.dataTransfer.getData(`index`)),r=t;if(n!==r){let e=[...h],[t]=e.splice(n,1);e.splice(r,0,t),g(e)}},children:[(0,$.jsx)(g1.Text,{children:n?.description||e}),(0,$.jsx)(g1.Text,{type:`secondary`,style:{fontSize:12},children:t+1})]},e)})})})]})]})})]})},Fte=({children:e})=>{let{user:t,loading:n,checkAuth:r}=I7();return(0,S.useEffect)(()=>{!localStorage.getItem(`auth_token`)&&!n&&!t&&(window.location.href=`/login`)},[t,n]),n?(0,$.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,alignItems:`center`,height:`100vh`},children:(0,$.jsx)(uq,{size:`large`})}):t?(0,$.jsx)($.Fragment,{children:e}):(window.location.href=`/login`,null)};(0,_.createRoot)(document.getElementById(`root`)).render((0,$.jsx)(()=>{let{checkAuth:e}=I7();return(0,S.useEffect)(()=>{e()},[]),(0,$.jsx)(jm,{locale:y0.default,theme:{token:{colorPrimary:`#6366f1`,borderRadius:8,fontFamily:`'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif`},components:{Button:{controlHeight:36,controlHeightLG:44},Card:{boxShadow:`0 1px 3px rgba(0,0,0,0.04)`},Table:{headerBg:`#fafbfc`}}},children:(0,$.jsx)(Fx,{children:(0,$.jsx)(hn,{children:(0,$.jsxs)(Tt,{children:[(0,$.jsx)(Ct,{path:`/login`,element:(0,$.jsx)(G7,{})}),(0,$.jsxs)(Ct,{path:`/`,element:(0,$.jsx)(Fte,{children:(0,$.jsx)(U7,{})}),children:[(0,$.jsx)(Ct,{index:!0,element:(0,$.jsx)(xt,{to:`/projects`,replace:!0})}),(0,$.jsx)(Ct,{path:`projects`,element:(0,$.jsx)(Q7,{})}),(0,$.jsx)(Ct,{path:`projects/:projectId/generate`,element:(0,$.jsx)(t9,{})}),(0,$.jsx)(Ct,{path:`records`,element:(0,$.jsx)(r9,{})}),(0,$.jsx)(Ct,{path:`credits`,element:(0,$.jsx)(a9,{})}),(0,$.jsx)(Ct,{path:`credit-records`,element:(0,$.jsx)(l9,{})}),(0,$.jsx)(Ct,{path:`order-records`,element:(0,$.jsx)(l9,{})}),(0,$.jsx)(Ct,{path:`user-center`,element:(0,$.jsx)(l9,{})}),(0,$.jsx)(Ct,{path:`messages`,element:(0,$.jsx)(c9,{})}),(0,$.jsx)(Ct,{path:`conversation`,element:(0,$.jsx)(Kee,{})}),(0,$.jsx)(Ct,{path:`initial`,element:(0,$.jsx)(Xee,{})}),(0,$.jsx)(Ct,{path:`initial/:creatID/initialinfo`,element:(0,$.jsx)(nte,{})}),(0,$.jsx)(Ct,{path:`removelens`,element:(0,$.jsx)(rte,{})}),(0,$.jsx)(Ct,{path:`removelens/:creatID/removeinfo`,element:(0,$.jsx)(Ote,{})}),(0,$.jsx)(Ct,{path:`removelens/:creatID/removefenbu`,element:(0,$.jsx)(Mte,{})}),(0,$.jsx)(Ct,{path:`generated`,element:(0,$.jsx)(ste,{})}),(0,$.jsx)(Ct,{path:`pretest`,element:(0,$.jsx)(ute,{})}),(0,$.jsx)(Ct,{path:`authorization`,element:(0,$.jsx)(fte,{})}),(0,$.jsx)(Ct,{path:`materials`,element:(0,$.jsx)(gte,{})}),(0,$.jsx)(Ct,{path:`consume`,element:(0,$.jsx)(Pte,{})})]}),(0,$.jsx)(Ct,{path:`*`,element:(0,$.jsx)(xt,{to:`/projects`,replace:!0})})]})})})})},{})); \ No newline at end of file + `}),(0,$.jsx)(`div`,{style:{margin:`auto`,display:`flex`,flexDirection:`column`,width:y.length>0?`${y.length*80+Math.max(0,y.length-1)*1}px`:`100%`},children:(0,$.jsxs)(`div`,{style:{display:`flex`,height:86,borderRadius:12,background:`#fff`,gap:1,position:`relative`},children:[x&&y.length===0?(0,$.jsxs)(`div`,{style:{flex:`1 1 auto`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:[(0,$.jsx)(uq,{size:`small`}),(0,$.jsx)(_te,{style:{marginLeft:8,color:`#64748b`},children:`正在抽取每秒帧...`})]}):y.length>0?y.map(e=>{let t=e.second>=_[0]&&e.second<_[1];return(0,$.jsxs)(`button`,{type:`button`,onClick:()=>I(e.second),title:`${e.second}s${e.fallback?`,实际取帧 ${e.captureSecond?.toFixed(1)}s`:``}`,style:{minWidth:80,flex:`0 0 80px`,height:86,borderTop:t?`5px solid #6366f1`:`none`,borderBottom:t?`5px solid #6366f1`:`none`,padding:0,background:`transparent`,overflow:`hidden`,cursor:A?`not-allowed`:`pointer`,position:`relative`},children:[e.status===`success`&&e.image?(0,$.jsx)(`img`,{src:e.image,alt:`${e.second}s`,style:{width:`100%`,height:`100%`,objectFit:`cover`,display:`block`}}):e.status===`loading`?(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(uq,{size:`small`})}):(0,$.jsxs)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`center`,color:`#64748b`,fontSize:12,background:`#fff`},children:[(0,$.jsxs)(`span`,{children:[e.second,`s`]}),(0,$.jsx)(`span`,{style:{fontSize:11},children:`无有效帧`})]}),(0,$.jsxs)(`span`,{style:{position:`absolute`,left:0,bottom:3,color:`#ffffffff`,fontSize:16,textShadow:`0 1px 3px rgba(0,0,0,.7)`},children:[e.second,`s`]})]},e.second)}):(0,$.jsx)(`div`,{style:{flex:`1 1 auto`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#64748b`},children:`暂无帧预览,请确认视频是否加载完成`}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:-10,left:0,right:0,bottom:0},children:(0,$.jsx)(bH,{range:!0,min:0,max:O||a,step:1,value:_,onChange:P,onChangeComplete:F,tooltip:{formatter:e=>`${W9(Number(e||0))}s`},disabled:!O||A,styles:{track:{background:`#6969dd63`,height:86,borderRadius:12,margin:`0 `},rail:{height:86,borderRadius:12},handle:{width:20,height:86,marginTop:0,borderRadius:`50%`}}})})]})})]}),(0,$.jsxs)(`div`,{style:{marginTop:16,textAlign:`center`,color:`#64748b`,fontSize:14},children:[`已选取 `,k,`s`]}),E&&(0,$.jsx)(`div`,{style:{marginTop:12,padding:`10px 14px`,borderRadius:8,background:`rgba(239, 68, 68, 0.08)`,border:`1px solid rgba(239, 68, 68, 0.15)`,color:`#ef4444`,fontSize:13,textAlign:`center`},children:E})]})]})})},{TextArea:Ete}=rK,Dte=`http://ceshi.apiforeign.minzhong.cn`,Y9=2,X9=15;function Z9(e){return e?/^https?:\/\//i.test(e)?e:`${Dte}${e}`:``}function Ote(){let{creatID:e}=Ze(),t=qe(),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(!1),[o,s]=(0,S.useState)(null),[c,l]=(0,S.useState)(null),[u,d]=(0,S.useState)(null),[f,p]=(0,S.useState)(!1),m=(0,S.useRef)(null),[h,g]=(0,S.useState)(``),[_,v]=(0,S.useState)(``),[y,b]=(0,S.useState)(``),[x,C]=(0,S.useState)(null),[w,T]=(0,S.useState)([]),[E,D]=(0,S.useState)(!1),[O,k]=(0,S.useState)(!1),[A,j]=(0,S.useState)(!1),M=(0,S.useRef)(null),N=(0,S.useRef)(null),P=(0,S.useMemo)(()=>Z9(x?.videoUrl),[x?.videoUrl]),F=(0,S.useMemo)(()=>w.length===0?`AI自动拆分`:w.some(e=>e.sourceMode===`ai_suggestion`)?`AI重拆`:`AI自动拆分`,[w]),I=(0,S.useCallback)(async()=>{if(e)try{C(await g7(e))}catch{Q.error(`获取任务详情失败`)}},[e]),L=(0,S.useCallback)(async()=>{if(e)try{let t=(await y7(e)).items||[];T(t),t.some(e=>e.moduleProjectCurrentStepCode!==`video_generate`&&e.moduleProjectStatus!==`completed`&&e.moduleProjectStatus!==`failed`)?M.current||=window.setInterval(async()=>{try{let t=(await y7(e)).items||[];T(e=>e.map(e=>{let n=t.find(t=>t.id===e.id);return n&&(e.moduleProjectCurrentStepCode!==`video_generate`||e.moduleProjectStatus!==`completed`&&e.moduleProjectStatus!==`failed`)?n:e})),t.every(e=>e.moduleProjectCurrentStepCode===`video_generate`||e.moduleProjectStatus===`completed`||e.moduleProjectStatus===`failed`)&&(M.current&&=(clearInterval(M.current),null))}catch(e){console.error(`轮询获取拆镜列表失败:`,e)}},3e4):M.current&&=(clearInterval(M.current),null)}catch{Q.error(`获取拆镜列表失败`)}},[e]),R=(0,S.useCallback)(async()=>{await Promise.all([I(),L()])},[I,L]);(0,S.useEffect)(()=>(R(),()=>{M.current&&=(clearInterval(M.current),null),N.current&&=(clearInterval(N.current),null)}),[R]),(0,S.useEffect)(()=>{if(x)return x.analysisStatus===`processing`?(console.log(`开始轮询`),N.current=window.setInterval(async()=>{try{C(await g7(e))}catch{}},3e3)):N.current&&=(clearInterval(N.current),null),()=>{N.current&&=(clearInterval(N.current),null)}},[x?.analysisStatus,e]);let z=(e,t)=>{s(e),l(t),r(!0)},B=()=>{r(!1),s(null),g(``),l(``),v(``),b(``)},V=e=>{e.fileList.length===0&&b(``)},H=async e=>{try{b((await E5(e)).url),Q.success(`图片上传成功`)}catch{Q.error(`图片上传失败,请重试`)}return!1},U=async()=>{if(!o){Q.warning(`请先选择拆镜片段`);return}if(!y){Q.warning(`请上传产品图`);return}if(!h.trim()){Q.warning(`请输入产品名称`);return}if(!_.trim()){Q.warning(`请输入产品卖点`);return}let n={target_project_name:h.trim(),core_content_point:_.trim(),material_image_url:Z9(y),idempotency_key:`replication_${Date.now()}`};console.log(o,n),D(!0);try{await b7(o,n),Q.success(`视频生成任务创建成功`),B(),y7(e).then(e=>{console.log(`123123123123`,e);let n=e.items.find(e=>e.id===o);console.log(n),Q.loading(`创建中...`,3),setTimeout(()=>{t(`/removelens/${n.moduleProjectId}/removefenbu`)},3e3)})}catch(e){Q.error(e?.message||`创建失败,请重试`)}finally{D(!1)}},W=async()=>{if(e){j(!0);try{let t=w.some(e=>e.sourceMode===`ai_suggestion`);await _7(e,{selected_indices:[],replace_existing:t}),Q.success(t?`AI 重拆任务已提交`:`AI 拆镜任务已提交`),await R()}catch(e){Q.error(e?.message||`拆镜失败`)}finally{j(!1)}}},ee=()=>{if(!P){Q.warning(`原视频地址不存在`);return}a(!0)},te=async t=>{if(e){if(t.durationSecondX9){Q.warning(`拆镜片段不能超过 ${X9} 秒`);return}k(!0);try{await v7(e,{start_second:t.startSecond,end_second:t.endSecond}),Q.success(`手动拆镜任务已提交`),a(!1),await R()}catch(e){Q.error(e?.message||`手动拆镜失败`)}finally{k(!1)}}},G=e=>e?.splitStatus===`completed`&&!!e?.segmentVideoUrl;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{margin:`-24px -32px -32px`,borderRadius:20,minHeight:`calc(100vh - 34px)`,display:`flex`,flexDirection:`column`,overflow:`hidden`,background:`linear-gradient(135deg, #f8fafc 0%, #eef2ff 50%, #f0f9ff 100%)`,position:`relative`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:-100,right:-100,width:300,height:300,background:`radial-gradient(circle, rgba(99,102,241,0.08) 0%, transparent 70%)`,borderRadius:`50%`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,bottom:-100,left:-100,width:300,height:300,background:`radial-gradient(circle, rgba(167,139,250,0.08) 0%, transparent 70%)`,borderRadius:`50%`}}),(0,$.jsxs)(`div`,{style:{padding:`20px 32px`,display:`flex`,alignItems:`center`,gap:16,position:`relative`,zIndex:10},children:[(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(s2,{}),onClick:()=>t(-1),style:{fontSize:16,color:`#6366f1`,background:`rgba(99, 102, 241, 0.1)`,borderRadius:12,padding:`8px 16px`,transition:`all 0.2s ease`},onMouseEnter:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.15)`},onMouseLeave:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.1)`}}),(0,$.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:16},children:[(0,$.jsx)(`div`,{style:{width:40,height:2,background:`linear-gradient(90deg, transparent, #6366f1, #8b5cf6, transparent)`,borderRadius:1}}),(0,$.jsx)(`h1`,{style:{fontSize:22,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,margin:0},children:`AI视频拆镜工作台`}),(0,$.jsx)(`div`,{style:{width:40,height:2,background:`linear-gradient(90deg, transparent, #8b5cf6, #6366f1, transparent)`,borderRadius:1}})]})})]}),x?(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,overflow:`hidden`,padding:`0 32px 32px`},children:[(0,$.jsxs)(`div`,{style:{flex:1,background:`linear-gradient(135deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.6) 100%)`,backdropFilter:`blur(20px)`,borderRadius:20,display:`flex`,alignItems:`center`,gap:30,padding:24,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8)`,position:`relative`,overflow:`hidden`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:-50,right:-50,width:200,height:200,background:`radial-gradient(circle, rgba(99,102,241,0.05) 0%, transparent 70%)`,borderRadius:`50%`}}),(0,$.jsx)(`div`,{style:{position:`relative`,width:280,height:160,borderRadius:12,overflow:`hidden`,flexShrink:0,boxShadow:`0 4px 16px rgba(0,0,0,0.1)`},children:(0,$.jsx)(`video`,{controls:!0,src:P,style:{width:`100%`,height:`100%`,objectFit:`cover`}})}),(0,$.jsx)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`,justifyContent:`space-between`,position:`relative`,zIndex:1},children:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`},children:[(0,$.jsx)(`h2`,{style:{fontSize:20,fontWeight:600,marginBottom:16,background:`linear-gradient(135deg, #1e293b 0%, #334155 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`视频总结`}),(0,$.jsx)(`div`,{style:{textAlign:`right`},children:(0,$.jsxs)(`span`,{style:{color:`#94a3b8`,fontSize:12},children:[`上传时间: `,x.createdAt?new Date(x.createdAt).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}):`-`]})})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,marginBottom:12},children:[(0,$.jsx)(`span`,{style:{color:`#64748b`,fontSize:14,marginRight:12,width:80,flexShrink:0},children:`产品名称:`}),(0,$.jsx)(`span`,{style:{color:`#1e293b`,fontWeight:500},children:x.title})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,marginBottom:12},children:[(0,$.jsx)(`span`,{style:{color:`#64748b`,fontSize:14,marginRight:12,width:80,flexShrink:0},children:`受众群体:`}),x.analysisStatus===`processing`?(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(uq,{size:`small`,style:{color:`#f59e0b`}}),(0,$.jsx)(`span`,{style:{fontSize:14,color:`#f59e0b`},children:`分析中`})]}):x.analysisStatus===`completed`?(0,$.jsx)(`div`,{style:{display:`flex`,gap:8,flexWrap:`wrap`},children:(x.originalVideoAudience?.split(`、`)||[]).map((e,t)=>(0,$.jsx)(h$,{style:{fontSize:12,background:`rgba(99, 102, 241, 0.1)`,color:`#6366f1`,border:`none`,borderRadius:20},children:e},t))}):null]}),(0,$.jsxs)(`div`,{style:{display:`flex`},children:[(0,$.jsx)(`span`,{style:{color:`#64748b`,fontSize:14,marginRight:12,width:80,flexShrink:0},children:`视频内容:`}),x.analysisStatus===`processing`?(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(uq,{size:`small`,style:{color:`#f59e0b`}}),(0,$.jsx)(`span`,{style:{fontSize:14,color:`#f59e0b`},children:`分析中`})]}):x.analysisStatus===`completed`?(0,$.jsx)(`span`,{style:{color:`#475569`,lineHeight:1.6,height:100,overflowY:`auto`},children:x.originalVideoContent}):null]})]})})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:16,marginBottom:20,marginTop:20},children:[(0,$.jsx)(jD,{type:`default`,onClick:ee,disabled:!P||O,style:{flex:1,height:52,borderRadius:12,border:`2px solid rgba(99, 102, 241, 0.3)`,color:`#6366f1`,fontWeight:600,fontSize:15,background:`rgba(255, 255, 255, 0.9)`,backdropFilter:`blur(10px)`,transition:`all 0.3s cubic-bezier(0.4, 0, 0.2, 1)`},onMouseEnter:e=>{e.currentTarget.style.borderColor=`#6366f1`,e.currentTarget.style.boxShadow=`0 4px 20px rgba(99, 102, 241, 0.2)`},onMouseLeave:e=>{e.currentTarget.style.borderColor=`rgba(99, 102, 241, 0.3)`,e.currentTarget.style.boxShadow=`none`},children:`手动`}),(0,$.jsx)(jq,{title:F===`AI重拆`?`确定要AI重拆吗?`:`确定要AI拆分吗?`,okText:`确定`,cancelText:`取消`,onConfirm:W,children:(0,$.jsxs)(jD,{type:`primary`,loading:A,disabled:A,style:{flex:1,height:52,borderRadius:12,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #a855f7 100%)`,fontWeight:600,fontSize:15,border:`none`,boxShadow:`0 4px 20px rgba(99, 102, 241, 0.3)`,transition:`all 0.3s cubic-bezier(0.4, 0, 0.2, 1)`,position:`relative`,overflow:`hidden`},onMouseEnter:e=>{e.currentTarget.style.transform=`translateY(-2px)`,e.currentTarget.style.boxShadow=`0 6px 25px rgba(99, 102, 241, 0.4)`},onMouseLeave:e=>{e.currentTarget.style.transform=`translateY(0)`,e.currentTarget.style.boxShadow=`0 4px 20px rgba(99, 102, 241, 0.3)`},children:[(0,$.jsx)(`span`,{style:{position:`relative`,zIndex:1},children:F}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:0,left:`-100%`,width:`100%`,height:`100%`,background:`linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent)`,transition:`left 0.5s ease`},onMouseEnter:e=>{e.currentTarget.style.left=`100%`}}),x?.aiSuggestions&&x.aiSuggestions.length>0&&(0,$.jsx)(cT,{title:(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`div`,{style:{fontWeight:600,marginBottom:8,color:`#6366f1`},children:`AI拆分方案`}),(x?.ai_suggestions||x?.aiSuggestions||[]).map(e=>(0,$.jsxs)(`div`,{style:{marginBottom:8,fontSize:13,lineHeight:1.5},children:[(0,$.jsxs)(`span`,{style:{fontWeight:500,color:`#6366f1`},children:[e.index,`.`]}),(0,$.jsx)(`span`,{style:{marginLeft:4,color:`#000000ff`},children:e.timeNode}),(0,$.jsx)(`br`,{}),(0,$.jsx)(`span`,{style:{color:`#666`},children:e.content})]},e.index))]}),placement:`top`,trigger:`hover`,overlayInnerStyle:{backgroundColor:`#fff`,height:300,overflowY:`auto`,border:`1px solid rgba(99, 102, 241, 0.1)`,borderRadius:12,boxShadow:`0 8px 24px rgba(99, 102, 241, 0.12)`},children:(0,$.jsx)(`span`,{style:{marginLeft:8,fontSize:13,opacity:.9},children:`(AI 镜头拆分方案)`})})]})})]}),(0,$.jsxs)(`div`,{style:{flex:2,background:`linear-gradient(135deg, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0.7) 100%)`,backdropFilter:`blur(20px)`,borderRadius:20,overflow:`hidden`,display:`flex`,flexDirection:`column`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`},children:[(0,$.jsxs)(`div`,{style:{padding:`16px 24px`,borderBottom:`1px solid rgba(99, 102, 241, 0.1)`,background:`linear-gradient(135deg, rgba(99,102,241,0.02) 0%, transparent 100%)`},children:[(0,$.jsx)(`h3`,{style:{fontSize:16,fontWeight:600,color:`#1e293b`,margin:0},children:`拆镜片段列表`}),(0,$.jsxs)(`span`,{style:{fontSize:12,color:`#64748b`,marginLeft:12},children:[`共 `,w.length,` 个片段`]})]}),(0,$.jsx)(n$,{columns:[{title:`片段`,width:100,fixed:`left`,align:`center`,render:(e,t)=>(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`div`,{style:{fontSize:16,fontWeight:600,color:`#333`},children:t.segmentName||`片段${t.segmentIndex||``}`}),(0,$.jsx)(`div`,{style:{fontSize:12,color:`#999`},children:t.timeNode}),t.sourceMode===`custom`&&(0,$.jsx)(h$,{color:`blue`,style:{marginTop:6},children:`手动`}),t.sourceMode===`ai_suggestion`&&(0,$.jsx)(h$,{color:`orange`,style:{marginTop:6},children:`自动`})]})},{title:`片段视频`,width:150,align:`center`,render:(e,t)=>(0,$.jsx)(`div`,{style:{position:`relative`,width:120,height:80,borderRadius:6,overflow:`hidden`,background:`#f1f5f9`,cursor:`pointer`},onClick:()=>{console.log(`video clicked:`,t.segmentVideoUrl),t.segmentVideoUrl&&(d(Z9(t.segmentVideoUrl)),p(!0))},children:t.segmentVideoUrl?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`video`,{src:Z9(t.segmentVideoUrl),style:{width:`100%`,height:`100%`,objectFit:`cover`,pointerEvents:`none`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,bottom:0,display:`flex`,alignItems:`center`,justifyContent:`center`,background:`rgba(0,0,0,0.3)`},children:(0,$.jsx)(`div`,{style:{width:32,height:32,borderRadius:`50%`,background:`rgba(255,255,255,0.9)`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(`div`,{style:{width:0,height:0,borderTop:`8px solid transparent`,borderBottom:`8px solid transparent`,borderLeft:`14px solid #6366f1`,marginLeft:2}})})})]}):(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:12},children:t.splitStatus===`failed`?`切割失败`:`切割中`})})},{title:`视频内容`,width:500,align:`left`,render:(e,t)=>{if(t.source_mode===`ai_suggestion`||t.sourceMode===`ai_suggestion`)return(0,$.jsx)(`div`,{style:{fontSize:14,color:`#333`,lineHeight:1.6},children:t.segmentContent||t.lastError||`-`});let n=t.analysis_status||t.analysisStatus,r={not_required:`无需单独分析`,pending:`等待分析`,processing:`分析中`,failed:`分析失败`};return n===`processing`?(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(uq,{size:`small`}),(0,$.jsx)(`span`,{style:{fontSize:14,color:`#f59e0b`},children:`分析中`})]}):n===`failed`?(0,$.jsx)(`div`,{style:{fontSize:14,color:`#ef4444`,lineHeight:1.6},children:`分析失败`}):(0,$.jsx)(`div`,{style:{fontSize:14,color:`#333`,lineHeight:1.6},children:n&&r[n]?r[n]:t.segmentContent||t.lastError||`-`})}},{title:`视频类型`,width:120,align:`center`,render:(e,t)=>(0,$.jsx)(`div`,{style:{fontSize:14,color:`#333`,fontWeight:500},children:t.segmentCategory||`-`})},{title:`状态`,width:120,align:`center`,dataIndex:`moduleProjectStatus`,render:(e,t)=>{let n=e,r=t.moduleProjectCurrentStepCode||t.currentStepCode,i=(()=>{if(r===`image_prompt_optimize`)switch(n){case`waiting_user`:return{text:`等待融合图生成`,color:`#f59e0b`};case`processing`:return{text:`图片提示词生成中`,color:`#f59e0b`};case`completed`:return{text:`图片提示词生成成功`,color:`#10b981`};case`failed`:return{text:`图片提示词生成失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else if(r===`image_generate`)switch(n){case`waiting_user`:return{text:`等待生成视频提示词`,color:`#f59e0b`};case`processing`:return{text:`融合图生成中`,color:`#f59e0b`};case`completed`:return{text:`融合图生成成功`,color:`#10b981`};case`failed`:return{text:`融合图生成失败`,color:`#ef4444`};default:return n||`-`}else if(r===`video_prompt_optimize`)switch(n){case`waiting_user`:return{text:`等待最终视频生成`,color:`#f59e0b`};case`processing`:return{text:`视频提示词生成中`,color:`#f59e0b`};case`completed`:return{text:`视频提示词生成成功`,color:`#10b981`};case`failed`:return{text:`视频提示词生成失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else if(r===`video_generate`)switch(n){case`waiting_user`:return{text:``,color:`#666`};case`processing`:return{text:`最终视频生成中`,color:`#f59e0b`};case`completed`:return{text:`任务完成`,color:`#10b981`};case`failed`:return{text:`最终视频生成失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else if(r===`material_input`)switch(n){case`waiting_user`:return{text:`等待生成图片提示词`,color:`#f59e0b`};case`processing`:return{text:`素材处理中`,color:`#f59e0b`};case`completed`:return{text:`素材上传成功`,color:`#10b981`};case`failed`:return{text:`素材上传失败`,color:`#ef4444`};default:return{text:n||`-`,color:`#666`}}else return t.moduleProjectId?{pending:{text:`子任务待处理`,color:`#f59e0b`},waiting_user:{text:`等待用户确认或触发`,color:`#f59e0b`},processing:{text:`子任务处理中`,color:`#f59e0b`},completed:{text:`子任务完成`,color:`#10b981`},failed:{text:`子任务失败`,color:`#ef4444`},cancelled:{text:`子任务取消`,color:`#94a3b8`}}[n]||{text:n||`-`,color:`#666`}:{text:`待生成任务`,color:`#94a3b8`}})();return typeof i==`string`?(0,$.jsx)(`span`,{style:{fontSize:12,color:`#666`,fontWeight:500},children:i}):(0,$.jsx)(`span`,{style:{fontSize:12,color:i.color,fontWeight:500},children:i.text})}},{title:`操作`,width:140,fixed:`right`,align:`center`,render:(e,n)=>(0,$.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,gap:8},children:n.moduleProjectId?(0,$.jsx)(jD,{type:`text`,onClick:()=>t(`/removelens/${n.moduleProjectId}/removefenbu`),style:{color:`#10b981`,fontSize:12,padding:0,display:`flex`,alignItems:`center`,gap:4},children:`详情任务`}):(0,$.jsx)(jD,{type:`text`,onClick:()=>z(String(n.id),n.segmentName),disabled:!G(n),style:{color:G(n)?`#f59e0b`:`#94a3b8`,fontSize:12,padding:0,display:`flex`,alignItems:`center`,gap:4},children:G(n)?`视频生成`:`待切割完成`})})}],dataSource:w,pagination:!1,bordered:!1,rowKey:`id`,scroll:{y:300},style:{flex:1},components:{body:{row:({className:e,style:t,...n})=>(0,$.jsx)(`tr`,{...n,className:e,style:{...t,transition:`all 0.2s ease`,borderBottom:`1px solid rgba(99, 102, 241, 0.05)`,height:80,overflow:`auto`}}),cell:({className:e,style:t,...n})=>(0,$.jsx)(`td`,{...n,className:e,style:{...t,padding:`16px 24px`}})},header:{cell:({className:e,style:t,...n})=>(0,$.jsx)(`th`,{...n,className:e,style:{...t,background:`rgba(255, 255, 255, 1)`,color:`#64748b`,fontWeight:500,fontSize:13,padding:`16px 24px`,borderBottom:`none`}})}}})]})]}):(0,$.jsx)(`div`,{style:{flex:1,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(`span`,{style:{fontSize:16,color:`#999`},children:`加载中...`})})]}),(0,$.jsx)(Tte,{open:i,videoUrl:P,title:`手动视频切片`,loading:O,minDuration:Y9,maxDuration:X9,onCancel:()=>a(!1),onConfirm:te}),(0,$.jsx)(yU,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,width:`100%`},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsx)(`div`,{style:{width:4,height:20,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:18,fontWeight:600,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`智能视频复刻`}),c&&(0,$.jsxs)(`span`,{style:{fontSize:14,color:`#64748b`},children:[`- `,c]})]}),(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(K8,{}),onClick:B,style:{padding:0,color:`#64748b`,fontSize:14}})]}),placement:`right`,closable:!1,onClose:B,open:n,size:480,styles:{body:{padding:`24px`,background:`linear-gradient(180deg, #f8fafc 0%, #eef2ff 100%)`},header:{background:`#fff`,borderBottom:`1px solid rgba(99, 102, 241, 0.1)`,padding:`20px 24px`},section:{borderRadius:`20px 0 0 20px`,overflow:`hidden`}},children:(0,$.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:20},children:[(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,padding:16,border:`1px solid rgba(99, 102, 241, 0.1)`},children:[(0,$.jsxs)(`label`,{style:{fontWeight:500,color:`#334155`,marginBottom:8,display:`block`,fontSize:14},children:[`产品白底图 `,(0,$.jsx)(`span`,{style:{color:`#ef4444`},children:`*`})]}),(0,$.jsx)(`div`,{style:{display:`flex`,gap:12},children:(0,$.jsx)(u0,{listType:`picture-card`,onChange:V,beforeUpload:H,maxCount:1,accept:`image/*`,style:{width:120,height:120,borderRadius:8,border:`2px dashed rgba(99, 102, 241, 0.3)`,background:`rgba(99, 102, 241, 0.02)`},children:!y&&(0,$.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,alignItems:`center`,gap:6},children:[(0,$.jsx)(jR,{style:{fontSize:20,color:`#6366f1`}}),(0,$.jsx)(`span`,{style:{fontSize:12,color:`#64748b`},children:`上传产品图`})]})})})]}),(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,padding:16,border:`1px solid rgba(99, 102, 241, 0.1)`},children:[(0,$.jsxs)(`label`,{style:{fontWeight:500,color:`#334155`,marginBottom:8,display:`block`,fontSize:14},children:[`产品名称 `,(0,$.jsx)(`span`,{style:{color:`#ef4444`},children:`*`})]}),(0,$.jsx)(rK,{value:h,onChange:e=>g(e.target.value),placeholder:`请输入产品名称`,style:{height:44,borderRadius:8,border:`1px solid rgba(99, 102, 241, 0.2)`},maxLength:10,showCount:!0})]}),(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,padding:16,border:`1px solid rgba(99, 102, 241, 0.1)`},children:[(0,$.jsxs)(`label`,{style:{fontWeight:500,color:`#334155`,marginBottom:8,display:`block`,fontSize:14},children:[`产品卖点 `,(0,$.jsx)(`span`,{style:{color:`#ef4444`},children:`*`})]}),(0,$.jsx)(Ete,{value:_,onChange:e=>v(e.target.value),placeholder:`请输入产品卖点`,style:{borderRadius:8,border:`1px solid rgba(99, 102, 241, 0.2)`},maxLength:100,showCount:!0,rows:3})]}),(0,$.jsx)(`div`,{style:{display:`flex`,gap:12,marginTop:8},children:(0,$.jsx)(jD,{type:`primary`,onClick:U,loading:E,disabled:E,style:{flex:1,height:48,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,fontWeight:600,fontSize:15,border:`none`,boxShadow:`0 4px 15px rgba(99, 102, 241, 0.3)`,transition:`all 0.2s ease`},onMouseEnter:e=>{e.currentTarget.style.boxShadow=`0 6px 20px rgba(99, 102, 241, 0.4)`,e.currentTarget.style.transform=`translateY(-1px)`},onMouseLeave:e=>{e.currentTarget.style.boxShadow=`0 4px 15px rgba(99, 102, 241, 0.3)`,e.currentTarget.style.transform=`translateY(0)`},children:E?`生成中...`:`手动生成`})})]})}),(0,$.jsx)(Dq,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsx)(`div`,{style:{width:4,height:20,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:16,fontWeight:600,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`视频预览`})]}),open:f,onCancel:()=>p(!1),afterClose:()=>{m.current&&(m.current.pause(),m.current.currentTime=0)},footer:null,width:640,centered:!0,styles:{body:{padding:24},header:{borderBottom:`1px solid #e0e0e0`,padding:`20px 24px`}},children:(0,$.jsx)(`div`,{style:{borderRadius:12,overflow:`hidden`},children:(0,$.jsx)(`video`,{ref:m,controls:!0,src:u||``,style:{width:`100%`,maxHeight:420,objectFit:`contain`,backgroundColor:`#000`},playsInline:!0,"webkit-playsinline":!0,autoPlay:!0})})})]})}var{Title:kte,Text:Q9}=g1,{TextArea:Ate}=rK;function jte(e){return e===void 0?e:JSON.parse(JSON.stringify(e))}function Mte(){let e=qe(),{creatID:t}=Ze(),[n,r]=(0,S.useState)(!1),[i,a]=(0,S.useState)(``),[o,s]=(0,S.useState)(!1),[c,l]=(0,S.useState)(`image`),[u,d]=(0,S.useState)({}),[f,p]=(0,S.useState)(null),[m,h]=(0,S.useState)(null),[g,_]=(0,S.useState)(``),[v,y]=(0,S.useState)(!1),[b,x]=(0,S.useState)({}),[C,w]=(0,S.useState)(``),[T,E]=(0,S.useState)(!1),[D,O]=(0,S.useState)(!1),[k,A]=(0,S.useState)(5),[j,M]=(0,S.useState)(`16:9`),[N,P]=(0,S.useState)(`480p`),[F,I]=(0,S.useState)({ratios:[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],resolutions:[`480p`,`720p`,`1080p`],durations:[5,8,10,12,15]}),[L,R]=(0,S.useState)([]),[z,B]=(0,S.useState)(1),[V,H]=(0,S.useState)(20),[U,W]=(0,S.useState)(0),[ee,te]=(0,S.useState)(``),[G,ne]=(0,S.useState)({}),[K,q]=(0,S.useState)([]),[J,re]=(0,S.useState)([]),Y=[{id:1,title:`原始素材`,description:`上传原始视频素材`,childId:1},{id:2,title:`生成提示词`,description:`根据素材生成描述词`,childId:2},{id:3,title:`生成产品融合图`,description:`生成产品与场景融合图`,childId:3},{id:4,title:`生成视频提示词`,description:`生成视频生成提示词`,childId:4},{id:5,title:`生成最终视频`,description:`合成最终视频`,childId:5}].map((e,t)=>({...e,status:K[t]?.status||``,id:K[t]?.id||t,output:K[t]?.output||``,engineId:K[t]?.input?.payload?.videoConfig?.engineId||``}));(0,S.useEffect)(()=>{let e=new Set;J.forEach(t=>{let n=Y.find(e=>String(e.childId)===t);n&&(n.status===`completed`||n.status===`failed`)&&e.add(t)});for(let t=Y.length-1;t>=0;t--)if(Y[t].status===`completed`||Y[t].status===`failed`){e.add(String(Y[t].childId));break}e.size>0?re(Array.from(e)):re([])},[K]);let ie=(e,t,n)=>{h7(e,t,n).then(e=>{e.items&&R(e.items),e.total!==void 0&&W(e.total)}).catch(e=>{})},ae=(e,t)=>{B(e),H(t),ie(e,t,ee)},oe=()=>{ie(1,20,ee)};(0,S.useEffect)(()=>{ie(z,V,ee)},[]),(0,S.useEffect)(()=>{J5().then(e=>{if(x(e.engine||{}),e.engine?.video&&e.engine.video.length>0){w(e.engine.video[0].id);let t=e.engine.video[0];I({ratios:t.supportedRatios||[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],resolutions:t.supportedResolutions||[`480p`,`720p`,`1080p`],durations:t.supportedDurations||[5,8,10,12,15]})}}).catch(e=>{})},[]),(0,S.useEffect)(()=>()=>{m&&(clearInterval(m),h(null))},[m]),(0,S.useEffect)(()=>{let e=e=>{let t=e.target;!t.closest(`.image-settings-trigger`)&&!t.closest(`.image-settings-popover`)&&(E(!1),O(!1))};return document.addEventListener(`mousedown`,e),()=>{document.removeEventListener(`mousedown`,e)}},[]),(0,S.useEffect)(()=>{console.log(`creatID`,t),t&&x7(t).then(e=>{ne(e),e.steps&&q(e.steps)}).catch(e=>{})},[t]),(0,S.useEffect)(()=>{let e=Y[4];e&&e.status!==`completed`&&e.status!==`failed`?m||h(setInterval(le,3e4)):e&&m&&(clearInterval(m),h(null))},[Y]);let se=(e,t,n,i)=>{l(t||`image`),_(n?String(n):``),t===`video`?(p(i||null),d(e&&typeof e==`object`?jte(e):{}),a(``)):(p(null),a(e||``),d({})),r(!0)},ce=async()=>{if(c===`image`){if(!G?.id||!g){Q.warning(`缺少任务或步骤 ID,无法保存图片提示词`);return}if(!i||!i.trim()){Q.warning(`图片提示词不能为空`);return}y(!0);try{await C7(G.id,g,{prompt:i.trim()}),Q.success(`图片提示词已保存`),ue(),r(!1),_(``)}catch(e){Q.error(e?.message||`保存图片提示词失败`)}finally{y(!1)}return}if(!G?.id||!g){Q.warning(`缺少任务或步骤 ID,无法保存视频提示词`);return}if(!u||typeof u!=`object`||Object.keys(u).length===0){Q.warning(`视频提示词不能为空`);return}if(!f){Q.warning(`视频提词配置缺失,暂不能保存`);return}let e=D9(u,f);if(e){Q.warning(e);return}y(!0);try{await w7(G.id,g,{prompt_schema:u}),Q.success(`视频提示词已保存`),ue(),r(!1),_(``)}catch(e){Q.error(e?.message||`保存视频提示词失败`)}finally{y(!1)}},le=()=>{t&&x7(t).then(e=>{ne(e),e.steps&&q(e.steps)}).catch(e=>{})},ue=()=>{t&&x7(t).then(e=>{ne(e),e.steps&&q(e.steps)}).catch(e=>{})},de=e=>{S7(G.id,e.toString()).then(e=>{ue()}).catch(e=>{})},fe=e=>{T7(G.id,e.toString(),{engine_id:`0019e3dac0b795b925b`,image_proportion:`1:1`,image_px:`2048x2048`,image_size:`2K`}).then(e=>{ue()}).catch(e=>{})},pe=()=>{T7(G.id,Y[1].id.toString(),{engine_id:`0019e3dac0b795b925b`,image_proportion:`1:1`,image_px:`2048x2048`,image_size:`2K`}).then(e=>{ue()}).catch(e=>{})},me=e=>{let t={engine_id:C,duration:k,aspect_ratio:j,resolution:N,target_platform:`抖音`};E7(G.id,e.toString(),t).then(e=>{ue()}).catch(e=>{})},he=(e,t)=>{let n={engine_id:t};D7(G.id,e.toString(),n).then(e=>{ue()}).catch(e=>{})},ge=()=>{let e={engine_id:Y[3].engineId};D7(G.id,Y[2].id.toString(),e).then(e=>{ue()}).catch(e=>{})};return(0,$.jsxs)(S.Fragment,{children:[(0,$.jsxs)(`div`,{className:`initialinfo-container`,style:{margin:`-24px -32px -32px`,height:`calc(100vh - 34px)`,position:`relative`,boxSizing:`border-box`,overflow:`hidden`,display:`flex`,flexDirection:`column`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:-100,right:-100,width:300,height:300,background:`radial-gradient(circle, rgba(99,102,241,0.08) 0%, transparent 70%)`,borderRadius:`50%`,pointerEvents:`none`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,bottom:-100,left:-100,width:300,height:300,background:`radial-gradient(circle, rgba(167,139,250,0.08) 0%, transparent 70%)`,borderRadius:`50%`,pointerEvents:`none`}}),(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,justifyContent:`space-between`,alignItems:`stretch`,gap:`2%`,position:`relative`,zIndex:1,minHeight:0},children:[(0,$.jsxs)(`div`,{className:`replication-preview`,style:{flex:4,background:`rgba(255,255,255,0.85)`,backdropFilter:`blur(20px)`,borderRadius:20,overflow:`hidden`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`,display:`flex`,flexDirection:`column`,minHeight:0},children:[(0,$.jsxs)(`div`,{style:{borderBottom:`1px solid rgba(99, 102, 241, 0.08)`,width:`100%`,display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`16px 24px`,background:`rgba(255,255,255,0.6)`,backdropFilter:`blur(10px)`,boxSizing:`border-box`},children:[(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(s2,{}),onClick:()=>window.history.back(),style:{color:`#64748b`,borderRadius:10,fontSize:13,height:32,transition:`all 0.25s cubic-bezier(0.4, 0, 0.2, 1)`},children:`返回`}),(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,$.jsx)(`div`,{style:{width:32,height:2,background:`linear-gradient(90deg, transparent, #6366f1, #8b5cf6, transparent)`,borderRadius:1}}),(0,$.jsx)(`h3`,{style:{margin:0,fontSize:16,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:`拆镜复刻 - 任务详情`}),(0,$.jsx)(`div`,{style:{width:32,height:2,background:`linear-gradient(90deg, transparent, #8b5cf6, #6366f1, transparent)`,borderRadius:1}})]}),(0,$.jsx)(jD,{type:`primary`,ghost:!0,style:{borderRadius:10,padding:`4px 16px`,fontSize:13,background:`rgba(99, 102, 241, 0.1)`,borderColor:`rgba(99, 102, 241, 0.2)`,color:`#6366f1`},onClick:()=>s(!0),children:`创作记录`})]}),(0,$.jsx)(`div`,{style:{flex:1,overflowY:`auto`},children:(0,$.jsxs)(`div`,{className:`material_box`,children:[(0,$.jsxs)(`div`,{style:{display:`flex`,gap:24,flexWrap:`wrap`,alignItems:`flex-start`},children:[(0,$.jsxs)(`div`,{style:{flex:1,minWidth:250},children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`视频`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`16/9`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:G?.material?.materialVideoUrl?(0,$.jsx)(`video`,{controls:!0,src:`http://ceshi.apiforeign.minzhong.cn${G.material.materialVideoUrl}`,style:{width:`100%`,height:`100%`,objectFit:`contain`}}):(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:13},children:`暂无视频`})})]}),(0,$.jsxs)(`div`,{className:`product_img`,style:{flex:1,minWidth:250},children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`产品图片`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`1/1`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:G?.material?.materialImageUrl?(0,$.jsx)(`img`,{src:G.material.materialImageUrl,alt:``,style:{width:`100%`,height:`100%`,objectFit:`contain`}}):(0,$.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:13},children:`暂无图片`})})]})]}),G?.finalImageUrl&&(0,$.jsx)(`div`,{style:{marginTop:24},children:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`生成图片`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`1/1`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:(0,$.jsx)(`img`,{src:`http://ceshi.apiforeign.minzhong.cn${G.finalImageUrl}`,alt:``,style:{width:`100%`,height:`100%`,objectFit:`contain`}})})]})}),G?.finalVideoUrl&&(0,$.jsx)(`div`,{style:{marginTop:24},children:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`span`,{style:{fontSize:14,fontWeight:600,color:`#1e293b`,marginBottom:10,display:`flex`,alignItems:`center`,gap:6},children:[(0,$.jsx)(`span`,{style:{width:3,height:14,background:`linear-gradient(180deg, #6366f1, #8b5cf6)`,borderRadius:2,display:`inline-block`}}),`生成视频`]}),(0,$.jsx)(`div`,{className:`medio_box`,style:{aspectRatio:`16/9`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,borderRadius:14,overflow:`hidden`,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.06)`,border:`1px solid rgba(99, 102, 241, 0.08)`},children:(0,$.jsx)(`video`,{controls:!0,src:`http://ceshi.apiforeign.minzhong.cn${G.finalVideoUrl}`,style:{width:`100%`,height:`100%`,objectFit:`contain`}})})]})})]})})]}),(0,$.jsxs)(`div`,{className:`replication-form`,style:{flex:1,minWidth:`450px`,background:`rgba(255,255,255,0.85)`,backdropFilter:`blur(20px)`,borderRadius:20,overflow:`hidden`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`,display:`flex`,flexDirection:`column`,minHeight:0},children:[(0,$.jsxs)(`div`,{style:{padding:`16px 24px`,borderBottom:`1px solid rgba(99, 102, 241, 0.08)`,display:`flex`,alignItems:`center`,gap:10,background:`rgba(255,255,255,0.6)`,backdropFilter:`blur(10px)`},children:[(0,$.jsx)(`div`,{style:{width:4,height:18,background:`linear-gradient(180deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:15,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:`生成步骤`})]}),(0,$.jsx)(`div`,{style:{flex:1,overflowY:`auto`,padding:`8px 16px 16px`},children:(0,$.jsx)(Qg,{activeKey:J,onChange:re,ghost:!0,bordered:!1,style:{background:`transparent`},expandIconPlacement:`end`,items:Y.map(e=>({key:String(e.childId),label:(0,$.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,width:`100%`,justifyContent:`space-between`},children:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[(0,$.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`center`,width:16,height:16},children:e.status===`completed`?(0,$.jsx)(Y2,{style:{fontSize:16,color:`#22c55e`}}):e.status===`processing`?(0,$.jsx)(`div`,{style:{width:16,height:16,borderRadius:`50%`,border:`2px solid #e2e8f0`,borderTopColor:`#6366f1`,animation:`spinSlow 1s linear infinite`}}):e.status===`failed`?(0,$.jsx)(`div`,{style:{width:16,height:16,borderRadius:`50%`,background:`#ef4444`,display:`flex`,alignItems:`center`,justifyContent:`center`},children:(0,$.jsx)(`span`,{style:{color:`#fff`,fontSize:10},children:`×`})}):(0,$.jsx)(`div`,{style:{width:8,height:8,borderRadius:`50%`,background:`#cbd5e1`}})}),(0,$.jsx)(`span`,{style:{fontSize:14,color:e.status===`processing`||e.status===`waiting_user`?`#6366f1`:`#1e293b`,fontWeight:500},children:e.title}),(e.status===`processing`||e.status===`waiting_user`)&&(0,$.jsx)(`span`,{style:{fontSize:12,color:`#6366f1`,marginLeft:8},children:`生成中`}),e.status===`failed`&&(0,$.jsx)(`span`,{style:{fontSize:12,color:`#ef4444`,marginLeft:8},children:`失败`}),e.status===``&&(0,$.jsx)(`span`,{style:{fontSize:12,color:`#717d8b`,marginLeft:8},children:`待生成`})]})}),children:(0,$.jsxs)(`div`,{style:{padding:`16px`,background:`linear-gradient(135deg, rgba(248,250,252,0.6) 0%, rgba(238,242,255,0.4) 100%)`,borderRadius:12,marginTop:8,border:`1px solid rgba(99, 102, 241, 0.06)`},children:[e.childId===1&&(0,$.jsx)($.Fragment,{children:(0,$.jsxs)(`div`,{style:{display:`flex`,gap:20,marginBottom:20,alignItems:`flex-start`,flexWrap:`wrap`},children:[(0,$.jsxs)(`div`,{style:{flex:1,minWidth:200},children:[(0,$.jsx)(Q9,{style:{color:`#64748b`,fontSize:13,marginBottom:10,display:`block`,fontWeight:500},children:`原视频`}),(0,$.jsx)(`div`,{style:{height:180,borderRadius:12,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,display:`flex`,alignItems:`center`,justifyContent:`center`,border:`1px solid rgba(99, 102, 241, 0.06)`},children:G?.material?.materialVideoUrl?(0,$.jsx)(`video`,{src:`http://ceshi.apiforeign.minzhong.cn${G.material.materialVideoUrl}`,style:{maxWidth:`100%`,maxHeight:`100%`,objectFit:`contain`,borderRadius:10},controls:!0}):(0,$.jsxs)(`div`,{style:{textAlign:`center`,color:`#94a3b8`},children:[(0,$.jsxs)(`svg`,{width:`32`,height:`32`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,style:{marginBottom:8},children:[(0,$.jsx)(`rect`,{x:`2`,y:`2`,width:`20`,height:`16`,rx:`2`,ry:`2`}),(0,$.jsx)(`path`,{d:`M8 12l4 2 4-2`})]}),(0,$.jsx)(`div`,{style:{fontSize:13},children:`暂无视频`})]})})]}),(0,$.jsxs)(`div`,{style:{flex:1,minWidth:200},children:[(0,$.jsx)(Q9,{style:{color:`#64748b`,fontSize:13,marginBottom:10,display:`block`,fontWeight:500},children:`产品图片`}),(0,$.jsx)(`div`,{style:{height:180,borderRadius:12,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,display:`flex`,alignItems:`center`,justifyContent:`center`,border:`1px solid rgba(99, 102, 241, 0.06)`},children:G?.material?.materialImageUrl?(0,$.jsx)(`img`,{src:G.material.materialImageUrl,alt:`产品图片`,style:{maxWidth:`100%`,maxHeight:`100%`,objectFit:`contain`,borderRadius:10}}):(0,$.jsxs)(`div`,{style:{textAlign:`center`,color:`#94a3b8`},children:[(0,$.jsxs)(`svg`,{width:`32`,height:`32`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,style:{marginBottom:8},children:[(0,$.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,ry:`2`}),(0,$.jsx)(`circle`,{cx:`8.5`,cy:`8.5`,r:`1.5`,fill:`currentColor`}),(0,$.jsx)(`path`,{d:`M21 15l-5-5L5 21`})]}),(0,$.jsx)(`div`,{style:{fontSize:13},children:`暂无图片`})]})})]}),(0,$.jsx)(jD,{onClick:()=>{Q.info(`正在生成图片提示词,请稍候...`),de(e.id)},type:`primary`,style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,children:`下一步:生成图片提示词`})]})}),e.childId===2&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{style:{padding:`12px 14px`,background:`rgba(255,255,255,0.6)`,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.08)`,marginBottom:4},children:(0,$.jsx)(Q9,{style:{color:`#475569`,fontSize:13,lineHeight:1.8,whiteSpace:`pre-wrap`},children:e?.output?.payload?.prompt||`暂无提示词`})}),(0,$.jsxs)(OU,{style:{marginTop:16,gap:12,width:`100%`},children:[(0,$.jsx)(jD,{type:`default`,icon:(0,$.jsx)(x$,{}),onClick:()=>se(e?.output?.payload?.prompt,`image`,e.id),style:{flex:1,borderRadius:10,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:36,fontWeight:500,background:`rgba(99, 102, 241, 0.04)`},disabled:e.status!==`completed`,children:`修改提示词`}),(0,$.jsx)(jD,{onClick:()=>{Q.info(`正在生成图片,请稍候...`),fe(e.id)},type:`primary`,style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,children:`下一步:生成图片`})]})]}),e.childId===3&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{borderRadius:12,overflow:`hidden`,marginBottom:16,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,border:`1px solid rgba(99, 102, 241, 0.08)`,boxShadow:`0 2px 8px rgba(99, 102, 241, 0.04)`,position:`relative`},children:[G.finalImageUrl?(0,$.jsx)(`img`,{src:`http://ceshi.apiforeign.minzhong.cn${G.finalImageUrl}`,alt:`融合图`,style:{width:`100%`,height:180,objectFit:`cover`}}):(0,$.jsx)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:14},children:`暂无融合图`}),(0,$.jsx)(jD,{type:`default`,icon:(0,$.jsx)(x$,{}),onClick:()=>pe(),disabled:e.status!==`completed`,style:{position:`absolute`,bottom:8,left:8,borderRadius:8,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:30,fontWeight:500,background:`rgba(255,255,255,0.85)`,backdropFilter:`blur(4px)`,padding:`0 12px`,fontSize:12},children:`重新生成`})]}),(0,$.jsx)(`p`,{style:{marginBottom:6,fontSize:14,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:`视频参数选择:`}),(0,$.jsxs)(`div`,{style:{width:`100%`,display:`flex`,justifyContent:`space-between`,marginBottom:16},children:[(0,$.jsxs)(`div`,{style:{flex:1,position:`relative`,display:`inline-block`},children:[(0,$.jsxs)(`button`,{onClick:()=>{E(!T),O(!1)},className:`image-settings-trigger`,style:{width:`100%`,padding:`4px 12px`,height:34,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.15)`,backgroundColor:`rgba(255,255,255,0.7)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`,gap:6,transition:`all 0.2s`},children:[(0,$.jsx)(P6,{style:{fontSize:14,color:`#6366f1`}}),(0,$.jsx)(Q9,{style:{fontSize:14,fontWeight:500,color:`#64748b`},children:b.video?.find(e=>e.id===C)?.name||`选择引擎`})]}),T&&(0,$.jsx)(`div`,{className:`image-settings-popover`,style:{position:`absolute`,bottom:`calc(100% + 8px)`,left:-10,width:350,backgroundColor:`#fff`,borderRadius:16,boxShadow:`0 10px 40px rgba(0,0,0,0.15)`,padding:16,border:`none`,zIndex:9999},onClick:e=>e.stopPropagation(),children:(0,$.jsxs)(`div`,{style:{marginBottom:8},children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择引擎`}),(0,$.jsx)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:4},children:b.video?.map(e=>(0,$.jsxs)(`button`,{onClick:()=>{w(e.id),I({ratios:e.supportedRatios||[`16:9`,`4:3`,`1:1`,`3:4`,`9:16`,`21:9`],resolutions:e.supportedResolutions||[`480p`,`720p`,`1080p`],durations:e.supportedDurations||[5,8,10,12,15]}),e.supportedRatios?.includes(j)||M(e.supportedRatios?.[0]||`16:9`),e.supportedResolutions?.includes(N)||P(e.supportedResolutions?.[0]||`720p`),e.supportedDurations?.includes(k)||A(e.supportedDurations?.[0]||5),E(!1)},style:{flex:1,minHeight:48,borderRadius:8,border:C===e.id?`2px solid #6366f1`:`1px solid #e5e7eb`,backgroundColor:C===e.id?`#fff`:`#f9fafb`,cursor:`pointer`,display:`flex`,flexDirection:`column`,justifyContent:`center`,alignItems:`flex-start`,padding:`8px 12px`,transition:`all 0.2s`,textAlign:`left`},children:[(0,$.jsx)(`span`,{style:{fontSize:13,fontWeight:C===e.id?600:500,color:C===e.id?`#6366f1`:`#4b5563`,marginBottom:2},children:e.name}),(0,$.jsx)(`span`,{style:{fontSize:11,color:`#9ca3af`}})]},e.id))})]})})]}),(0,$.jsxs)(`div`,{style:{flex:1,position:`relative`,display:`inline-block`},children:[(0,$.jsxs)(`button`,{onClick:()=>{O(!D),E(!1)},className:`image-settings-trigger`,style:{width:`100%`,padding:`4px 12px`,height:34,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.15)`,backgroundColor:`rgba(255,255,255,0.7)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`,gap:6,transition:`all 0.2s`},children:[(0,$.jsx)(y3,{style:{fontSize:14,color:`#6366f1`}}),(0,$.jsxs)(Q9,{style:{fontSize:14,fontWeight:500,color:`#64748b`},children:[j,` · `,k,`s · `,N]})]}),D&&(0,$.jsxs)(`div`,{className:`image-settings-popover`,style:{position:`absolute`,bottom:`calc(100% + 8px)`,left:-160,width:350,backgroundColor:`#fff`,borderRadius:16,boxShadow:`0 10px 40px rgba(0,0,0,0.15)`,padding:16,border:`none`,zIndex:9999},onClick:e=>e.stopPropagation(),children:[(0,$.jsxs)(`div`,{style:{marginBottom:16},children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择比例`}),(0,$.jsx)(`div`,{style:{display:`flex`,flexWrap:`wrap`,gap:4},children:F.ratios.map(e=>(0,$.jsxs)(`button`,{onClick:()=>M(e),style:{flex:`0 0 calc(14.28% - 4px)`,minWidth:44,height:52,borderRadius:6,border:j===e?`2px solid #6366f1`:`1px solid #e5e7eb`,backgroundColor:j===e?`#fff`:`#f9fafb`,cursor:`pointer`,display:`flex`,flexDirection:`column`,justifyContent:`center`,alignItems:`center`,transition:`all 0.2s`},children:[(0,$.jsx)(`div`,{style:{width:18,height:18,border:`2px solid ${j===e?`#6366f1`:`#9ca3af`}`,borderRadius:2,marginBottom:2}}),(0,$.jsx)(`span`,{style:{fontSize:9,color:j===e?`#6366f1`:`#6b7280`,fontWeight:j===e?600:400},children:e})]},e))})]}),(0,$.jsxs)(`div`,{style:{marginBottom:16},children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择时长`}),(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsxs)(`div`,{style:{flex:1,position:`relative`,height:24,display:`flex`,alignItems:`center`},children:[(0,$.jsx)(`div`,{style:{position:`absolute`,top:`50%`,left:0,right:0,height:6,borderRadius:3,background:`#e5e7eb`,transform:`translateY(-50%)`}}),(0,$.jsx)(`div`,{style:{position:`absolute`,top:`50%`,left:0,height:6,borderRadius:3,background:`#6366f1`,width:`${(k-Math.min(...F.durations))/(Math.max(...F.durations)-Math.min(...F.durations))*100}%`,transform:`translateY(-50%)`}}),(0,$.jsx)(`input`,{type:`range`,min:Math.min(...F.durations),max:Math.max(...F.durations),value:k,onChange:e=>A(Number(e.target.value)),style:{position:`relative`,width:`100%`,height:24,borderRadius:3,background:`transparent`,outline:`none`,appearance:`none`,cursor:`pointer`,zIndex:1}})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:4,padding:`4px 12px`,backgroundColor:`#f1f5f9`,borderRadius:6},children:[(0,$.jsx)(`span`,{style:{fontSize:14,fontWeight:600,color:`#64748b`},children:k}),(0,$.jsx)(`span`,{style:{fontSize:12,color:`#9ca3af`},children:`秒`})]})]})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsx)(Q9,{style:{display:`block`,marginBottom:8,fontSize:12,fontWeight:500,color:`#666666`},children:`选择分辨率`}),(0,$.jsx)(`div`,{style:{display:`flex`,gap:6},children:F.resolutions.map(e=>(0,$.jsx)(`button`,{onClick:()=>P(e),style:{flex:1,height:42,borderRadius:6,border:N===e?`2px solid #6366f1`:`1px solid #e5e7eb`,backgroundColor:N===e?`#6366f1`:`#f9fafb`,cursor:`pointer`,display:`flex`,justifyContent:`center`,alignItems:`center`,transition:`all 0.2s`},children:(0,$.jsx)(`span`,{style:{fontSize:12,fontWeight:600,color:N===e?`#fff`:`#4b5563`},children:e})},e))})]})]})]})]}),(0,$.jsx)(jD,{type:`primary`,style:{width:`100%`,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},onClick:()=>{Q.info(`正在生成视频提示词,请稍候...`),me(e.id)},disabled:e.status!==`completed`,children:`下一步:生成视频提示词`})]}),e.childId===4&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{style:{padding:`12px 14px`,background:`rgba(255,255,255,0.6)`,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.08)`,marginBottom:4},children:(0,$.jsx)(Q9,{style:{color:`#64748b`,fontSize:13,lineHeight:1.8},children:`视频提词已生成,可点击按钮查看/修改`})}),(0,$.jsxs)(OU,{style:{marginTop:16,gap:12,width:`100%`},children:[(0,$.jsx)(jD,{type:`default`,icon:(0,$.jsx)(x$,{}),onClick:()=>se(G?.videoGeneration?.promptSchema,`video`,e.id,G?.videoGeneration?.schemaConfigSnapshot),style:{flex:1,borderRadius:10,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:36,fontWeight:500,background:`rgba(99, 102, 241, 0.04)`},disabled:e.status!==`completed`||!G?.videoGeneration?.promptSchema||!G?.videoGeneration?.schemaConfigSnapshot,children:`查看/修改视频提词`}),(0,$.jsx)(jD,{onClick:()=>{Q.info(`正在生成视频,请稍候...`),he(e.id,e.engineId)},type:`primary`,style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,children:`下一步:生成视频`})]})]}),e.childId===5&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{style:{borderRadius:12,overflow:`hidden`,marginBottom:16,position:`relative`,background:`linear-gradient(135deg, rgba(248,250,252,0.8) 0%, rgba(238,242,255,0.6) 100%)`,border:`1px solid rgba(99, 102, 241, 0.08)`,boxShadow:`0 2px 8px rgba(99, 102, 241, 0.04)`},children:e.status===`completed`&&G?.finalVideoUrl?(0,$.jsx)(`video`,{src:`http://ceshi.apiforeign.minzhong.cn${G.finalVideoUrl}`,style:{width:`100%`,height:180,objectFit:`cover`},controls:!0}):e.status===`processing`?(0,$.jsxs)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,flexDirection:`column`,gap:8},children:[(0,$.jsx)(`div`,{style:{width:20,height:20,borderRadius:`50%`,border:`2px solid #e2e8f0`,borderTopColor:`#6366f1`,animation:`spinSlow 1s linear infinite`}}),(0,$.jsx)(`span`,{style:{color:`#6366f1`,fontSize:14},children:`视频生成中...`})]}):e.status===`failed`?(0,$.jsx)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#ef4444`,fontSize:14},children:`视频生成失败`}):(0,$.jsx)(`div`,{style:{width:`100%`,height:180,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`#94a3b8`,fontSize:14},children:`暂无视频`})}),(0,$.jsxs)(OU,{style:{width:`100%`,gap:12},children:[(0,$.jsx)(jD,{onClick:()=>ge(),type:`default`,icon:(0,$.jsx)(x$,{}),style:{flex:1,borderRadius:10,borderColor:`rgba(99, 102, 241, 0.3)`,color:`#6366f1`,height:36,fontWeight:500,background:`rgba(99, 102, 241, 0.04)`},disabled:e.status!==`completed`,children:`重新生成`}),(0,$.jsx)(jD,{type:`primary`,icon:(0,$.jsx)(i0,{}),style:{flex:1,borderRadius:10,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`,height:36,fontWeight:500,boxShadow:`0 4px 12px rgba(99, 102, 241, 0.3)`},disabled:e.status!==`completed`,onClick:()=>{let e=`http://ceshi.apiforeign.minzhong.cn${G?.finalVideoUrl}&download=1`,t=document.createElement(`a`);t.href=e,t.download=`video_${Date.now()}.mp4`,document.body.appendChild(t),t.click(),document.body.removeChild(t)},children:`下载视频`})]})]})]})}))})})]})]})]}),(0,$.jsx)(Dq,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:10},children:[(0,$.jsx)(`div`,{style:{width:4,height:18,background:`linear-gradient(180deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:15,fontWeight:700,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`,backgroundClip:`text`},children:c===`video`?`查看/编辑视频提词`:`修改提示词`})]}),open:n,onCancel:()=>{v||r(!1)},footer:[(0,$.jsx)(jD,{onClick:()=>r(!1),disabled:v,style:{borderRadius:8},children:`取消`},`cancel`),(0,$.jsx)(jD,{type:`primary`,onClick:ce,loading:v,disabled:v,style:{borderRadius:8,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`},children:`确认`},`confirm`)],width:800,style:{borderRadius:16},styles:{header:{background:`rgba(255,255,255,0.6)`,backdropFilter:`blur(10px)`,borderBottom:`1px solid rgba(99, 102, 241, 0.08)`,padding:`16px 24px`},body:{background:`linear-gradient(135deg, #f8fafc 0%, #eef2ff 50%, #f0f9ff 100%)`,padding:`20px 24px`}},children:c===`image`?(0,$.jsx)(Ate,{value:i,onChange:e=>a(e.target.value),rows:8,style:{width:`100%`,height:300,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.15)`,background:`rgba(255,255,255,0.8)`},placeholder:`请输入提示词`}):(0,$.jsx)(`div`,{style:{maxHeight:500,overflowY:`auto`,paddingRight:10},children:(0,$.jsx)(P9,{value:u,schemaConfigSnapshot:f,onChange:d})})}),(0,$.jsxs)(Dq,{title:(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:12},children:[(0,$.jsx)(`div`,{style:{width:4,height:20,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,borderRadius:2}}),(0,$.jsx)(`span`,{style:{fontSize:16,fontWeight:600,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,WebkitBackgroundClip:`text`,WebkitTextFillColor:`transparent`},children:`创作记录`})]}),open:o,onCancel:()=>s(!1),width:800,footer:null,styles:{body:{background:`linear-gradient(180deg, #f8fafc 0%, #eef2ff 100%)`},header:{background:`#fff`,borderBottom:`1px solid rgba(99, 102, 241, 0.1)`,padding:`20px 24px`}},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,marginBottom:16,gap:8},children:[(0,$.jsx)(rK,{placeholder:`搜索产品名称`,value:ee,onChange:e=>te(e.target.value),onPressEnter:oe,style:{width:200,borderRadius:10,border:`1px solid rgba(99, 102, 241, 0.2)`,height:40}}),(0,$.jsx)(jD,{type:`primary`,onClick:oe,style:{borderRadius:10,height:40,background:`linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)`,border:`none`},children:`搜索`})]}),(0,$.jsx)(`div`,{style:{background:`linear-gradient(135deg, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0.7) 100%)`,backdropFilter:`blur(20px)`,borderRadius:16,overflow:`hidden`,border:`1px solid rgba(99, 102, 241, 0.1)`,boxShadow:`0 8px 32px rgba(99, 102, 241, 0.08)`},children:(0,$.jsx)(n$,{columns:[{title:`产品名称`,dataIndex:`title`,key:`title`,render:e=>(0,$.jsx)(`span`,{style:{fontSize:14,color:`#1e293b`,fontWeight:500},children:e})},{title:`创建时间`,dataIndex:`createdAt`,key:`createdAt`,render:e=>{if(!e)return`-`;let t=new Date(e);return(0,$.jsx)(`span`,{style:{fontSize:13,color:`#64748b`},children:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}:${String(t.getSeconds()).padStart(2,`0`)}`})}},{title:`操作`,key:`action`,align:`center`,render:t=>(0,$.jsx)(jD,{type:`text`,onClick:()=>e(`/removelens/${t.id}/removeinfo`),style:{color:`#6366f1`,fontSize:13,padding:`4px 12px`,borderRadius:6,background:`rgba(99, 102, 241, 0.1)`},onMouseEnter:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.15)`},onMouseLeave:e=>{e.currentTarget.style.background=`rgba(99, 102, 241, 0.1)`},children:`查看详情`})}],dataSource:L,rowKey:`id`,pagination:{current:z,pageSize:V,total:U,showSizeChanger:!0,showQuickJumper:!0,showTotal:e=>`共 ${e} 条`,onChange:ae,style:{padding:`16px 24px`,borderTop:`1px solid rgba(99, 102, 241, 0.1)`}},style:{fontSize:13},scroll:{y:350},components:{body:{row:({className:e,style:t,...n})=>(0,$.jsx)(`tr`,{...n,className:e,style:{...t,transition:`all 0.2s ease`,borderBottom:`1px solid rgba(99, 102, 241, 0.05)`}}),cell:({className:e,style:t,...n})=>(0,$.jsx)(`td`,{...n,className:e,style:{...t,padding:`16px 24px`}})},header:{cell:({className:e,style:t,...n})=>(0,$.jsx)(`th`,{...n,className:e,style:{...t,background:`rgba(99, 102, 241, 0.03)`,color:`#64748b`,fontWeight:500,fontSize:13,padding:`16px 24px`,borderBottom:`none`}})}}})})]})]})}var{RangePicker:Nte}=XH,$9=e=>e.replace(/_([a-z])/g,(e,t)=>t.toUpperCase()),Pte=()=>{let e=qe(),[t]=En(),{message:n}=Fx.useApp(),[r,i]=(0,S.useState)([]),[a,o]=(0,S.useState)(0),[s,c]=(0,S.useState)(!1),[l,u]=(0,S.useState)(!1),[d,f]=(0,S.useState)(!1),[p,m]=(0,S.useState)([]),[h,g]=(0,S.useState)([]),[_,v]=(0,S.useState)(``),[y,b]=(0,S.useState)(1),[x,C]=(0,S.useState)(10),[w,T]=(0,S.useState)(t.get(`accountId`)||``),[E,D]=(0,S.useState)(),[O,k]=(0,S.useState)((0,zD.default)().subtract(1,`day`).format(`YYYY-MM-DD`)),[A,j]=(0,S.useState)(``);(0,S.useEffect)(()=>{N(),M()},[]);let M=async(e=1,t=10)=>{c(!0);try{let n=await M7({advertiser_id:w||void 0,consume_date:E,page:e,page_size:t});i(n.data||[]),o(n.pagination?.total||0),b(n.pagination?.page||1),C(n.pagination?.pageSize||10)}catch{n.error(`加载数据失败`)}finally{c(!1)}},N=async()=>{try{let e=((await P7()).data||[]).map(e=>({name:$9(e.field),description:e.description}));m(e);let t=localStorage.getItem(`consumeColumns`);g(t?JSON.parse(t):e.map(e=>e.name))}catch{n.error(`加载表头字段失败`)}},P=r.map((e,t)=>({...e,index:t+1,key:e.id})),F=()=>{e(`/authorization`)},I=()=>{b(1),M(1,x)},L=()=>{T(``),D(void 0),b(1),M(1,x)},R=()=>{Dq.confirm({title:`拉取消耗数据`,content:(0,$.jsxs)(`div`,{children:[(0,$.jsxs)(`div`,{style:{marginBottom:12},children:[(0,$.jsx)(g1.Text,{style:{display:`block`,marginBottom:8},children:`同步日期:`}),(0,$.jsx)(XH,{value:(0,zD.default)(O),onChange:e=>k(e?e.format(`YYYY-MM-DD`):(0,zD.default)().subtract(1,`day`).format(`YYYY-MM-DD`)),style:{width:`100%`}})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsx)(g1.Text,{style:{display:`block`,marginBottom:8},children:`广告主ID(可选):`}),(0,$.jsx)(rK,{placeholder:`不指定则同步所有授权的广告主`,value:A,onChange:e=>j(e.target.value)})]})]}),onOk:async()=>{u(!0);try{await N7({date:O,advertiser_id:A||void 0}),n.success(`拉取消耗数据成功`),M(y,x)}catch{n.error(`拉取消耗数据失败`)}finally{u(!1)}},okText:`开始拉取`,cancelText:`取消`})},z=h.map(e=>p.find(t=>t.name===e)).filter(e=>!!e).map(e=>({title:e.description,dataIndex:e.name,key:e.name,ellipsis:!0}));return(0,$.jsxs)(`div`,{style:{minHeight:`94vh`},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,marginBottom:12},children:[(0,$.jsx)(jD,{type:`text`,icon:(0,$.jsx)(s2,{}),onClick:F}),(0,$.jsx)(j4,{style:{color:`#6366f1`,fontSize:16}}),(0,$.jsx)(g1.Text,{strong:!0,style:{fontSize:16},children:`消耗记录`})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,gap:12,marginBottom:16},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,gap:12},children:[(0,$.jsx)(rK,{placeholder:`广告主ID`,value:w,onChange:e=>T(e.target.value),style:{width:180},onPressEnter:()=>{b(1),M(1,x)}}),(0,$.jsx)(Nte,{value:E?[(0,zD.default)(E[0]),(0,zD.default)(E[1])]:void 0,onChange:e=>{e&&e[0]&&e[1]?D([e[0].format(`YYYY-MM-DD`),e[1].format(`YYYY-MM-DD`)]):D(void 0)}}),(0,$.jsx)(jD,{type:`primary`,size:`medium`,onClick:I,children:`搜索`}),(0,$.jsx)(jD,{size:`medium`,onClick:L,children:`重置`})]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:12},children:[(0,$.jsx)(jD,{icon:(0,$.jsx)(s8,{}),onClick:R,loading:l,style:{borderRadius:8},children:`拉取消耗`}),(0,$.jsx)(jD,{icon:(0,$.jsx)(P6,{}),onClick:()=>f(!0),style:{borderRadius:8},children:`自定义表头`})]})]}),(0,$.jsxs)(`div`,{style:{background:`#fff`,borderRadius:12,boxShadow:`0 1px 3px rgba(0,0,0,0.05)`},children:[(0,$.jsx)(n$,{dataSource:P,columns:z,loading:s,pagination:!1,rowKey:`id`,bordered:!1,scroll:{x:`max-content`}}),(0,$.jsx)(`div`,{style:{padding:`16px`,textAlign:`right`},children:(0,$.jsx)(UK,{current:y,pageSize:x,total:a,showSizeChanger:!0,showTotal:e=>`共 ${e} 条记录`,onChange:(e,t)=>{b(e),C(t),M(e,t)},size:`small`})})]}),(0,$.jsx)(Dq,{title:`自定义表头`,open:d,onOk:()=>{localStorage.setItem(`consumeColumns`,JSON.stringify(h)),n.success(`表头设置已保存`),f(!1)},onCancel:()=>{f(!1),v(``)},okText:`确定`,cancelText:`取消`,width:800,children:(0,$.jsxs)(`div`,{style:{display:`flex`,gap:20,height:400},children:[(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`},children:[(0,$.jsx)(rK,{placeholder:`搜索指标...`,value:_,allowClear:!0,onChange:e=>v(e.target.value),style:{marginBottom:8}}),(0,$.jsx)(g1.Text,{type:`secondary`,style:{fontSize:12,marginBottom:12,display:`block`},children:`输入指标名称进行搜索`}),(0,$.jsxs)(`div`,{style:{flex:1,overflowY:`auto`,border:`1px solid #f0f0f5`,borderRadius:8,padding:12},children:[(0,$.jsx)(`div`,{style:{marginBottom:16},children:(0,$.jsx)(g1.Text,{strong:!0,style:{fontSize:14,color:`#1e293b`},children:`任务详情指标`})}),(0,$.jsx)(bV,{checked:h.length===p.length&&p.length>0,indeterminate:h.length>0&&h.length{e.target.checked?g(p.map(e=>e.name)):g([])},style:{marginBottom:12},children:`全选`}),(0,$.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`1fr 1fr`,gap:8},children:p.filter(e=>e.description.toLowerCase().includes(_.toLowerCase())||e.name.toLowerCase().includes(_.toLowerCase())).map(e=>(0,$.jsx)(bV,{checked:h.includes(e.name),onChange:t=>{t.target.checked?g(t=>[...t,e.name]):g(t=>t.filter(t=>t!==e.name))},children:e.description},e.name))})]})]}),(0,$.jsxs)(`div`,{style:{flex:1,display:`flex`,flexDirection:`column`},children:[(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:12},children:[(0,$.jsxs)(g1.Text,{strong:!0,style:{fontSize:14,color:`#1e293b`},children:[`已添加(`,h.length,`)`]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:8},children:[(0,$.jsx)(jD,{size:`small`,onClick:()=>g([]),disabled:h.length===0,children:`清空`}),(0,$.jsx)(jD,{size:`small`,onClick:async()=>{try{let e=((await P7()).data||[]).map(e=>({name:$9(e.field),description:e.description}));m(e),g(e.map(e=>e.name)),localStorage.removeItem(`consumeColumns`),n.success(`表头字段已更新`)}catch{n.error(`更新表头字段失败`)}},children:`更新表头字段`})]})]}),(0,$.jsx)(`div`,{style:{flex:1,overflowY:`auto`,border:`1px solid #f0f0f5`,borderRadius:8,padding:12},children:h.length===0?(0,$.jsx)(g1.Text,{type:`secondary`,style:{fontSize:14,textAlign:`center`,display:`block`,padding:`40px 0`},children:`暂无已选指标`}):(0,$.jsx)(`div`,{children:h.map((e,t)=>{let n=p.find(t=>t.name===e);return(0,$.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,padding:`8px 12px`,borderBottom:`1px solid #f0f0f5`,cursor:`move`,userSelect:`none`},draggable:!0,onDragStart:e=>{e.dataTransfer.setData(`index`,String(t))},onDragOver:e=>{e.preventDefault()},onDrop:e=>{let n=parseInt(e.dataTransfer.getData(`index`)),r=t;if(n!==r){let e=[...h],[t]=e.splice(n,1);e.splice(r,0,t),g(e)}},children:[(0,$.jsx)(g1.Text,{children:n?.description||e}),(0,$.jsx)(g1.Text,{type:`secondary`,style:{fontSize:12},children:t+1})]},e)})})})]})]})})]})},Fte=({children:e})=>{let{user:t,loading:n,checkAuth:r}=I7();return(0,S.useEffect)(()=>{!localStorage.getItem(`auth_token`)&&!n&&!t&&(window.location.href=`/login`)},[t,n]),n?(0,$.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,alignItems:`center`,height:`100vh`},children:(0,$.jsx)(uq,{size:`large`})}):t?(0,$.jsx)($.Fragment,{children:e}):(window.location.href=`/login`,null)};(0,_.createRoot)(document.getElementById(`root`)).render((0,$.jsx)(()=>{let{checkAuth:e}=I7();return(0,S.useEffect)(()=>{e()},[]),(0,$.jsx)(jm,{locale:y0.default,theme:{token:{colorPrimary:`#6366f1`,borderRadius:8,fontFamily:`'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif`},components:{Button:{controlHeight:36,controlHeightLG:44},Card:{boxShadow:`0 1px 3px rgba(0,0,0,0.04)`},Table:{headerBg:`#fafbfc`}}},children:(0,$.jsx)(Fx,{children:(0,$.jsx)(hn,{children:(0,$.jsxs)(Tt,{children:[(0,$.jsx)(Ct,{path:`/login`,element:(0,$.jsx)(G7,{})}),(0,$.jsxs)(Ct,{path:`/`,element:(0,$.jsx)(Fte,{children:(0,$.jsx)(U7,{})}),children:[(0,$.jsx)(Ct,{index:!0,element:(0,$.jsx)(xt,{to:`/projects`,replace:!0})}),(0,$.jsx)(Ct,{path:`projects`,element:(0,$.jsx)(Q7,{})}),(0,$.jsx)(Ct,{path:`projects/:projectId/generate`,element:(0,$.jsx)(t9,{})}),(0,$.jsx)(Ct,{path:`records`,element:(0,$.jsx)(r9,{})}),(0,$.jsx)(Ct,{path:`credits`,element:(0,$.jsx)(a9,{})}),(0,$.jsx)(Ct,{path:`credit-records`,element:(0,$.jsx)(l9,{})}),(0,$.jsx)(Ct,{path:`order-records`,element:(0,$.jsx)(l9,{})}),(0,$.jsx)(Ct,{path:`user-center`,element:(0,$.jsx)(l9,{})}),(0,$.jsx)(Ct,{path:`messages`,element:(0,$.jsx)(c9,{})}),(0,$.jsx)(Ct,{path:`conversation`,element:(0,$.jsx)(Kee,{})}),(0,$.jsx)(Ct,{path:`initial`,element:(0,$.jsx)(Xee,{})}),(0,$.jsx)(Ct,{path:`initial/:creatID/initialinfo`,element:(0,$.jsx)(nte,{})}),(0,$.jsx)(Ct,{path:`removelens`,element:(0,$.jsx)(rte,{})}),(0,$.jsx)(Ct,{path:`removelens/:creatID/removeinfo`,element:(0,$.jsx)(Ote,{})}),(0,$.jsx)(Ct,{path:`removelens/:creatID/removefenbu`,element:(0,$.jsx)(Mte,{})}),(0,$.jsx)(Ct,{path:`generated`,element:(0,$.jsx)(ste,{})}),(0,$.jsx)(Ct,{path:`pretest`,element:(0,$.jsx)(ute,{})}),(0,$.jsx)(Ct,{path:`authorization`,element:(0,$.jsx)(fte,{})}),(0,$.jsx)(Ct,{path:`materials`,element:(0,$.jsx)(gte,{})}),(0,$.jsx)(Ct,{path:`consume`,element:(0,$.jsx)(Pte,{})})]}),(0,$.jsx)(Ct,{path:`*`,element:(0,$.jsx)(xt,{to:`/projects`,replace:!0})})]})})})})},{})); \ No newline at end of file diff --git a/video-gen-app/dist/index.html b/video-gen-app/dist/index.html index d706ca2c..2491b5a6 100644 --- a/video-gen-app/dist/index.html +++ b/video-gen-app/dist/index.html @@ -28,7 +28,7 @@ } })(); - +