827 lines
26 KiB
Plaintext
827 lines
26 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "mysql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id BigInt @id @default(autoincrement())
|
|
email String? @unique @db.VarChar(191)
|
|
phone String? @unique @db.VarChar(50)
|
|
password_hash String @db.VarChar(255)
|
|
nickname String? @db.VarChar(100)
|
|
avatar_url String? @db.VarChar(500)
|
|
role String @default("user") @db.VarChar(50)
|
|
status String @default("active") @db.VarChar(50)
|
|
wechat_openid String? @unique @db.VarChar(191)
|
|
last_login_at DateTime?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([role, status])
|
|
@@index([created_at])
|
|
@@map("users")
|
|
}
|
|
|
|
model Project {
|
|
id BigInt @id @default(autoincrement())
|
|
user_id BigInt
|
|
title String? @db.VarChar(255)
|
|
input_mode String @db.VarChar(50)
|
|
genre String? @db.VarChar(100)
|
|
style_code String? @db.VarChar(100)
|
|
output_type String? @db.VarChar(50)
|
|
output_mode String @default("image_manga") @db.VarChar(50)
|
|
visual_mode String? @db.VarChar(100)
|
|
video_generation_level String? @db.VarChar(50)
|
|
target_episode_count Int?
|
|
episode_duration Int?
|
|
status String @default("draft") @db.VarChar(80)
|
|
copyright_status String @default("pending") @db.VarChar(80)
|
|
payment_status String @default("unpaid") @db.VarChar(80)
|
|
quality_level String? @db.VarChar(50)
|
|
is_long_series Boolean @default(false)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
completed_at DateTime?
|
|
|
|
@@index([user_id, status])
|
|
@@index([genre, status])
|
|
@@index([created_at])
|
|
@@map("projects")
|
|
}
|
|
|
|
model NovelSource {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
source_type String @db.VarChar(50)
|
|
title String? @db.VarChar(255)
|
|
author_name String? @db.VarChar(100)
|
|
raw_asset_id BigInt?
|
|
raw_text String? @db.LongText
|
|
clean_text String? @db.LongText
|
|
word_count Int?
|
|
chapter_count Int?
|
|
parse_status String @default("pending") @db.VarChar(50)
|
|
parse_report Json?
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id])
|
|
@@index([parse_status])
|
|
@@map("novel_sources")
|
|
}
|
|
|
|
model NovelChapter {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
novel_source_id BigInt?
|
|
chapter_no Int
|
|
title String? @db.VarChar(255)
|
|
content String @db.LongText
|
|
summary String? @db.Text
|
|
visual_summary String? @db.Text
|
|
word_count Int?
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@unique([novel_source_id, chapter_no])
|
|
@@index([project_id, chapter_no])
|
|
@@index([project_id, status])
|
|
@@map("novel_chapters")
|
|
}
|
|
|
|
model CopyrightRecord {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
user_id BigInt
|
|
authorization_type String @db.VarChar(50)
|
|
statement_text String @db.Text
|
|
ip String? @db.VarChar(80)
|
|
user_agent String? @db.Text
|
|
confirmed_at DateTime @default(now())
|
|
|
|
@@index([project_id])
|
|
@@index([user_id])
|
|
@@index([authorization_type])
|
|
@@map("copyright_records")
|
|
}
|
|
|
|
model StoryBible {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
title String? @db.VarChar(255)
|
|
logline String? @db.Text
|
|
main_plot String? @db.Text
|
|
core_conflict String? @db.Text
|
|
selling_points String? @db.Text
|
|
tone String? @db.VarChar(100)
|
|
world_summary String? @db.Text
|
|
ending_direction String? @db.Text
|
|
taboo_rules String? @db.Text
|
|
version Int @default(1)
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id, status])
|
|
@@map("story_bibles")
|
|
}
|
|
|
|
model WorldBible {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
world_type String? @db.VarChar(100)
|
|
setting_text String? @db.Text
|
|
rules_text String? @db.Text
|
|
power_system String? @db.Text
|
|
social_structure String? @db.Text
|
|
time_period String? @db.Text
|
|
visual_rules String? @db.Text
|
|
forbidden_rules String? @db.Text
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id, status])
|
|
@@map("world_bibles")
|
|
}
|
|
|
|
model Character {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
global_character_id BigInt?
|
|
name String @db.VarChar(100)
|
|
alias_names Json?
|
|
role_type String @db.VarChar(50)
|
|
gender_label String? @db.VarChar(50)
|
|
age_group String? @db.VarChar(50)
|
|
identity_desc String? @db.Text
|
|
appearance_desc String? @db.Text
|
|
face_desc String? @db.Text
|
|
hair_desc String? @db.Text
|
|
eye_desc String? @db.Text
|
|
body_desc String? @db.Text
|
|
costume_rules String? @db.Text
|
|
special_props String? @db.Text
|
|
personality_desc String? @db.Text
|
|
speech_style String? @db.Text
|
|
relationship_desc String? @db.Text
|
|
character_arc String? @db.Text
|
|
negative_rules String? @db.Text
|
|
anchor_asset_id BigInt?
|
|
wardrobe_variant String? @db.VarChar(100)
|
|
voice_provider_code String? @db.VarChar(100)
|
|
voice_model String? @db.VarChar(100)
|
|
voice_id String? @db.VarChar(100)
|
|
voice_style String? @db.Text
|
|
performance_style String? @db.Text
|
|
importance_level Int @default(0)
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id, role_type])
|
|
@@index([project_id, status])
|
|
@@index([global_character_id])
|
|
@@map("characters")
|
|
}
|
|
|
|
model GlobalCharacter {
|
|
id BigInt @id @default(autoincrement())
|
|
name String @db.VarChar(100)
|
|
display_name String? @db.VarChar(100)
|
|
role_archetype String @default("lead") @db.VarChar(50)
|
|
gender_label String? @db.VarChar(50)
|
|
age_group String? @db.VarChar(50)
|
|
identity_desc String? @db.Text
|
|
appearance_desc String? @db.Text
|
|
face_desc String? @db.Text
|
|
hair_desc String? @db.Text
|
|
eye_desc String? @db.Text
|
|
body_desc String? @db.Text
|
|
default_costume_rules String? @db.Text
|
|
wardrobe_json Json?
|
|
special_props String? @db.Text
|
|
personality_desc String? @db.Text
|
|
speech_style String? @db.Text
|
|
voice_provider_code String? @db.VarChar(100)
|
|
voice_model String? @db.VarChar(100)
|
|
voice_id String? @db.VarChar(100)
|
|
voice_style String? @db.Text
|
|
performance_style String? @db.Text
|
|
negative_rules String? @db.Text
|
|
anchor_asset_id BigInt?
|
|
voice_sample_asset_id BigInt?
|
|
commercial_status String @default("internal_test") @db.VarChar(50)
|
|
usage_scope String @default("internal") @db.VarChar(50)
|
|
status String @default("active") @db.VarChar(50)
|
|
created_by_user_id BigInt?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([status, role_archetype])
|
|
@@index([commercial_status])
|
|
@@index([created_by_user_id])
|
|
@@map("global_characters")
|
|
}
|
|
|
|
model GlobalCharacterAsset {
|
|
id BigInt @id @default(autoincrement())
|
|
global_character_id BigInt
|
|
asset_id BigInt?
|
|
asset_type String @db.VarChar(50)
|
|
label String? @db.VarChar(100)
|
|
prompt_text String? @db.Text
|
|
is_primary Boolean @default(false)
|
|
status String @default("active") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([global_character_id, asset_type])
|
|
@@index([asset_id])
|
|
@@map("global_character_assets")
|
|
}
|
|
|
|
model CharacterImage {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
character_id BigInt
|
|
asset_id BigInt?
|
|
image_type String @db.VarChar(50)
|
|
prompt_text String? @db.Text
|
|
negative_prompt String? @db.Text
|
|
is_anchor Boolean @default(false)
|
|
quality_score Decimal? @db.Decimal(5, 2)
|
|
status String @default("pending") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id])
|
|
@@index([character_id, image_type])
|
|
@@index([character_id, is_anchor])
|
|
@@map("character_images")
|
|
}
|
|
|
|
model CharacterMemory {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
character_id BigInt
|
|
episode_id BigInt?
|
|
memory_type String @db.VarChar(50)
|
|
content String @db.Text
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id, character_id])
|
|
@@index([project_id, episode_id])
|
|
@@index([memory_type])
|
|
@@map("character_memories")
|
|
}
|
|
|
|
model Episode {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_no Int
|
|
source_chapter_ids Json?
|
|
title String? @db.VarChar(255)
|
|
summary String? @db.Text
|
|
opening_hook String? @db.Text
|
|
middle_conflict String? @db.Text
|
|
ending_hook String? @db.Text
|
|
target_duration Int?
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@unique([project_id, episode_no])
|
|
@@index([project_id, status])
|
|
@@map("episodes")
|
|
}
|
|
|
|
model EpisodeScript {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt
|
|
script_text String? @db.LongText
|
|
narration_text String? @db.LongText
|
|
dialogue_json Json?
|
|
version Int @default(1)
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id])
|
|
@@index([episode_id, version])
|
|
@@map("episode_scripts")
|
|
}
|
|
|
|
model StoryboardShot {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt
|
|
shot_no Int
|
|
scene_name String? @db.VarChar(255)
|
|
location_desc String? @db.Text
|
|
characters_json Json?
|
|
visual_desc String? @db.Text
|
|
action_desc String? @db.Text
|
|
dialogue_text String? @db.Text
|
|
narration_text String? @db.Text
|
|
camera_motion String? @db.VarChar(100)
|
|
effect_type String? @db.VarChar(100)
|
|
duration Decimal? @db.Decimal(6, 2)
|
|
scene_type String? @db.VarChar(50)
|
|
importance_score Int?
|
|
emotion_score Int?
|
|
action_score Int?
|
|
route_tier String? @db.VarChar(50)
|
|
prompt_text String? @db.Text
|
|
negative_prompt String? @db.Text
|
|
live_action_desc String? @db.Text
|
|
actor_action String? @db.Text
|
|
camera_instruction String? @db.Text
|
|
performance_instruction String? @db.Text
|
|
video_prompt String? @db.Text
|
|
keyframe_asset_id BigInt?
|
|
video_clip_asset_id BigInt?
|
|
video_status String? @db.VarChar(50)
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@unique([episode_id, shot_no])
|
|
@@index([project_id, episode_id, shot_no])
|
|
@@index([project_id, status])
|
|
@@index([scene_type])
|
|
@@index([route_tier])
|
|
@@map("storyboard_shots")
|
|
}
|
|
|
|
model ShotImage {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt?
|
|
shot_id BigInt
|
|
asset_id BigInt?
|
|
image_type String @default("preview") @db.VarChar(50)
|
|
prompt_text String? @db.Text
|
|
negative_prompt String? @db.Text
|
|
quality_score Decimal? @db.Decimal(5, 2)
|
|
status String @default("pending") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id, episode_id])
|
|
@@index([shot_id, image_type])
|
|
@@map("shot_images")
|
|
}
|
|
|
|
model ActorProfile {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
character_id BigInt
|
|
actor_desc String? @db.Text
|
|
appearance_rules String? @db.Text
|
|
wardrobe_rules String? @db.Text
|
|
performance_style String? @db.Text
|
|
voice_style String? @db.Text
|
|
reference_asset_ids Json?
|
|
anchor_asset_id BigInt?
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@unique([project_id, character_id])
|
|
@@index([project_id, status])
|
|
@@index([character_id])
|
|
@@map("actor_profiles")
|
|
}
|
|
|
|
model VideoClip {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt
|
|
shot_id BigInt
|
|
provider_id BigInt?
|
|
input_asset_id BigInt?
|
|
output_asset_id BigInt?
|
|
duration Decimal? @db.Decimal(6, 2)
|
|
prompt_text String? @db.Text
|
|
status String @default("pending") @db.VarChar(50)
|
|
cost_actual Decimal? @db.Decimal(12, 4)
|
|
retry_count Int @default(0)
|
|
quality_status String? @db.VarChar(50)
|
|
quality_score Decimal? @db.Decimal(5, 2)
|
|
quality_issues Json?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id, episode_id])
|
|
@@index([shot_id, status])
|
|
@@index([provider_id])
|
|
@@map("video_clips")
|
|
}
|
|
|
|
model PlotMemory {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt?
|
|
chapter_id BigInt?
|
|
memory_type String @db.VarChar(50)
|
|
content String @db.Text
|
|
importance_level Int @default(0)
|
|
status String @default("active") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id, episode_id])
|
|
@@index([project_id, memory_type])
|
|
@@map("plot_memories")
|
|
}
|
|
|
|
model PlotThread {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
thread_name String @db.VarChar(255)
|
|
thread_type String @db.VarChar(80)
|
|
description String? @db.Text
|
|
start_episode_no Int?
|
|
expected_resolve_episode_no Int?
|
|
resolved_episode_no Int?
|
|
status String @default("open") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id, status])
|
|
@@index([project_id, thread_type])
|
|
@@map("plot_threads")
|
|
}
|
|
|
|
model ContinuityCheck {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt?
|
|
check_type String @db.VarChar(80)
|
|
result_status String @db.VarChar(50)
|
|
issue_text String? @db.Text
|
|
suggestion_text String? @db.Text
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id, episode_id])
|
|
@@index([result_status])
|
|
@@map("continuity_checks")
|
|
}
|
|
|
|
model Asset {
|
|
id BigInt @id @default(autoincrement())
|
|
user_id BigInt?
|
|
project_id BigInt?
|
|
asset_type String @db.VarChar(50)
|
|
file_path String @db.VarChar(500)
|
|
file_url String? @db.VarChar(500)
|
|
mime_type String? @db.VarChar(100)
|
|
width Int?
|
|
height Int?
|
|
duration Decimal? @db.Decimal(10, 2)
|
|
size BigInt?
|
|
hash String? @db.VarChar(128)
|
|
visibility String @default("private") @db.VarChar(30)
|
|
status String @default("active") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id, asset_type])
|
|
@@index([user_id, asset_type])
|
|
@@index([hash])
|
|
@@map("assets")
|
|
}
|
|
|
|
model RenderTask {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt?
|
|
shot_id BigInt?
|
|
task_type String @db.VarChar(80)
|
|
provider_id BigInt?
|
|
status String @default("pending") @db.VarChar(50)
|
|
input_json Json?
|
|
input_hash String? @db.VarChar(128)
|
|
idempotency_key String? @unique @db.VarChar(191)
|
|
output_asset_id BigInt?
|
|
provider_request_id String? @db.VarChar(255)
|
|
retry_count Int @default(0)
|
|
max_retry Int @default(0)
|
|
cost_estimate Decimal? @db.Decimal(12, 4)
|
|
cost_actual Decimal? @db.Decimal(12, 4)
|
|
error_code String? @db.VarChar(100)
|
|
error_message String? @db.Text
|
|
created_at DateTime @default(now())
|
|
started_at DateTime?
|
|
finished_at DateTime?
|
|
|
|
@@index([project_id, status])
|
|
@@index([task_type, status])
|
|
@@index([project_id, episode_id])
|
|
@@index([input_hash])
|
|
@@map("render_tasks")
|
|
}
|
|
|
|
model ProviderConfig {
|
|
id BigInt @id @default(autoincrement())
|
|
provider_type String @db.VarChar(80)
|
|
provider_code String @db.VarChar(100)
|
|
display_name String? @db.VarChar(100)
|
|
mode String @default("mock") @db.VarChar(50)
|
|
model_name String? @db.VarChar(100)
|
|
config_json Json?
|
|
fallback_provider_id BigInt?
|
|
is_enabled Boolean @default(true)
|
|
priority Int @default(0)
|
|
rate_limit_json Json?
|
|
cost_rule_json Json?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@unique([provider_type, provider_code])
|
|
@@index([provider_type, is_enabled])
|
|
@@map("provider_configs")
|
|
}
|
|
|
|
model ProviderLog {
|
|
id BigInt @id @default(autoincrement())
|
|
provider_id BigInt?
|
|
task_id BigInt?
|
|
project_id BigInt?
|
|
provider_type String @db.VarChar(80)
|
|
provider_code String? @db.VarChar(100)
|
|
model_name String? @db.VarChar(100)
|
|
request_json Json?
|
|
response_json Json?
|
|
input_size Int?
|
|
output_size Int?
|
|
cost_estimate Decimal? @db.Decimal(12, 4)
|
|
cost_actual Decimal? @db.Decimal(12, 4)
|
|
status String @default("success") @db.VarChar(50)
|
|
error_code String? @db.VarChar(100)
|
|
error_message String? @db.Text
|
|
started_at DateTime?
|
|
finished_at DateTime?
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([provider_type, status])
|
|
@@index([project_id])
|
|
@@index([task_id])
|
|
@@index([created_at])
|
|
@@map("provider_logs")
|
|
}
|
|
|
|
model Order {
|
|
id BigInt @id @default(autoincrement())
|
|
user_id BigInt
|
|
project_id BigInt?
|
|
order_no String @unique @db.VarChar(100)
|
|
package_code String? @db.VarChar(100)
|
|
amount Decimal @default(0) @db.Decimal(12, 2)
|
|
currency String @default("CNY") @db.VarChar(20)
|
|
payment_method String? @db.VarChar(50)
|
|
payment_status String @default("pending") @db.VarChar(50)
|
|
paid_at DateTime?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([user_id, payment_status])
|
|
@@index([project_id])
|
|
@@map("orders")
|
|
}
|
|
|
|
model QuotaAccount {
|
|
id BigInt @id @default(autoincrement())
|
|
user_id BigInt @unique
|
|
total_quota Decimal @default(0) @db.Decimal(12, 2)
|
|
available_quota Decimal @default(0) @db.Decimal(12, 2)
|
|
frozen_quota Decimal @default(0) @db.Decimal(12, 2)
|
|
used_quota Decimal @default(0) @db.Decimal(12, 2)
|
|
status String @default("active") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([status])
|
|
@@map("quota_accounts")
|
|
}
|
|
|
|
model QuotaLog {
|
|
id BigInt @id @default(autoincrement())
|
|
user_id BigInt
|
|
project_id BigInt?
|
|
task_id BigInt?
|
|
change_type String @db.VarChar(50)
|
|
amount Decimal @db.Decimal(12, 2)
|
|
balance_after Decimal? @db.Decimal(12, 2)
|
|
reason String? @db.VarChar(255)
|
|
metadata_json Json?
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([user_id, created_at])
|
|
@@index([project_id])
|
|
@@index([task_id])
|
|
@@map("quota_logs")
|
|
}
|
|
|
|
model RevisionRequest {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
user_id BigInt
|
|
revision_type String @db.VarChar(50)
|
|
target_type String? @db.VarChar(80)
|
|
target_id BigInt?
|
|
description String @db.Text
|
|
status String @default("pending") @db.VarChar(50)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id, status])
|
|
@@index([user_id, status])
|
|
@@map("revision_requests")
|
|
}
|
|
|
|
model ContentReview {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt?
|
|
user_id BigInt?
|
|
target_type String @db.VarChar(80)
|
|
target_id BigInt?
|
|
review_type String @db.VarChar(80)
|
|
result_status String @default("pending") @db.VarChar(50)
|
|
risk_level String? @db.VarChar(50)
|
|
issue_text String? @db.Text
|
|
suggestion_text String? @db.Text
|
|
reviewer_id BigInt?
|
|
reviewed_at DateTime?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([project_id, result_status])
|
|
@@index([target_type, target_id])
|
|
@@index([review_type, result_status])
|
|
@@map("content_reviews")
|
|
}
|
|
|
|
model CaseShowcase {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
user_id BigInt?
|
|
title String @db.VarChar(255)
|
|
cover_asset_id BigInt?
|
|
video_asset_id BigInt?
|
|
authorization_status String @default("pending") @db.VarChar(50)
|
|
visibility String @default("private") @db.VarChar(30)
|
|
sort_order Int @default(0)
|
|
published_at DateTime?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([visibility, sort_order])
|
|
@@index([project_id])
|
|
@@map("case_showcases")
|
|
}
|
|
|
|
model HitAnalysisCase {
|
|
id BigInt @id @default(autoincrement())
|
|
title String @db.VarChar(255)
|
|
source_platform String? @db.VarChar(100)
|
|
source_url String? @db.VarChar(500)
|
|
content_type String @default("short_drama") @db.VarChar(80)
|
|
genre String? @db.VarChar(100)
|
|
language String @default("zh-CN") @db.VarChar(30)
|
|
target_audience String? @db.VarChar(255)
|
|
duration_seconds Int?
|
|
episode_count Int?
|
|
tags_json Json?
|
|
metrics_json Json?
|
|
transcript_text String? @db.LongText
|
|
summary_text String? @db.Text
|
|
analysis_json Json?
|
|
diagnosis_score Decimal? @db.Decimal(5, 2)
|
|
status String @default("draft") @db.VarChar(50)
|
|
created_by_user_id BigInt?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([source_platform])
|
|
@@index([genre, status])
|
|
@@index([status, diagnosis_score])
|
|
@@index([created_at])
|
|
@@map("hit_analysis_cases")
|
|
}
|
|
|
|
model HitAnalysisSegment {
|
|
id BigInt @id @default(autoincrement())
|
|
case_id BigInt
|
|
segment_no Int
|
|
start_second Int?
|
|
end_second Int?
|
|
scene_type String? @db.VarChar(80)
|
|
hook_type String? @db.VarChar(100)
|
|
emotion String? @db.VarChar(80)
|
|
conflict_type String? @db.VarChar(100)
|
|
plot_function String? @db.VarChar(120)
|
|
visual_strategy String? @db.VarChar(120)
|
|
dialogue_pattern String? @db.VarChar(120)
|
|
camera_notes String? @db.Text
|
|
importance_score Int?
|
|
emotion_score Int?
|
|
action_score Int?
|
|
tags_json Json?
|
|
summary_text String? @db.Text
|
|
prompt_seed String? @db.Text
|
|
created_at DateTime @default(now())
|
|
|
|
@@unique([case_id, segment_no])
|
|
@@index([case_id])
|
|
@@index([scene_type])
|
|
@@index([hook_type])
|
|
@@map("hit_analysis_segments")
|
|
}
|
|
|
|
model CreativePattern {
|
|
id BigInt @id @default(autoincrement())
|
|
source_case_id BigInt?
|
|
pattern_type String @db.VarChar(80)
|
|
title String @db.VarChar(255)
|
|
genre String? @db.VarChar(100)
|
|
language String @default("zh-CN") @db.VarChar(30)
|
|
description String? @db.Text
|
|
structure_json Json?
|
|
prompt_template String? @db.Text
|
|
negative_prompt String? @db.Text
|
|
tags_json Json?
|
|
usage_count Int @default(0)
|
|
effectiveness_score Decimal? @db.Decimal(5, 2)
|
|
status String @default("active") @db.VarChar(50)
|
|
created_by_user_id BigInt?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([pattern_type, status])
|
|
@@index([genre, status])
|
|
@@index([source_case_id])
|
|
@@map("creative_patterns")
|
|
}
|
|
|
|
model ProjectCreativePattern {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
creative_pattern_id BigInt
|
|
source String @default("user_selected") @db.VarChar(50)
|
|
snapshot_json Json?
|
|
sort_order Int @default(0)
|
|
created_at DateTime @default(now())
|
|
|
|
@@unique([project_id, creative_pattern_id])
|
|
@@index([project_id, sort_order])
|
|
@@index([creative_pattern_id])
|
|
@@map("project_creative_patterns")
|
|
}
|
|
|
|
model AnalyticsEvent {
|
|
id BigInt @id @default(autoincrement())
|
|
project_id BigInt
|
|
episode_id BigInt?
|
|
event_type String @db.VarChar(80)
|
|
platform String? @db.VarChar(80)
|
|
metric_json Json?
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([project_id])
|
|
@@index([episode_id])
|
|
@@index([event_type, created_at])
|
|
@@map("analytics_events")
|
|
}
|
|
|
|
model SystemConfig {
|
|
id BigInt @id @default(autoincrement())
|
|
config_key String @unique @db.VarChar(191)
|
|
config_value Json?
|
|
description String? @db.Text
|
|
is_public Boolean @default(false)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@index([is_public])
|
|
@@map("system_configs")
|
|
}
|
|
|
|
model OperationLog {
|
|
id BigInt @id @default(autoincrement())
|
|
user_id BigInt?
|
|
operator_role String? @db.VarChar(50)
|
|
action String @db.VarChar(100)
|
|
target_type String? @db.VarChar(80)
|
|
target_id BigInt?
|
|
ip String? @db.VarChar(80)
|
|
user_agent String? @db.Text
|
|
metadata_json Json?
|
|
created_at DateTime @default(now())
|
|
|
|
@@index([user_id, created_at])
|
|
@@index([target_type, target_id])
|
|
@@index([action, created_at])
|
|
@@map("operation_logs")
|
|
}
|