CREATE TABLE IF NOT EXISTS user_account ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, display_name TEXT NOT NULL, user_type TEXT NOT NULL, status TEXT NOT NULL, last_login_at TEXT, created_by INTEGER, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS user_permission ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, permission_code TEXT NOT NULL, permission_name TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE(user_id, permission_code) ); CREATE TABLE IF NOT EXISTS category ( id INTEGER PRIMARY KEY AUTOINCREMENT, parent_id INTEGER, name TEXT NOT NULL, sort_no INTEGER NOT NULL DEFAULT 0, requires_detail_page INTEGER NOT NULL DEFAULT 1, category_type TEXT NOT NULL DEFAULT 'PRODUCT', created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS product_item ( id INTEGER PRIMARY KEY AUTOINCREMENT, category_id INTEGER NOT NULL, sku TEXT NOT NULL UNIQUE, name TEXT NOT NULL, model_name TEXT, status TEXT NOT NULL DEFAULT 'AVAILABLE', wholesale_price NUMERIC NOT NULL DEFAULT 0, stock_quantity INTEGER NOT NULL DEFAULT 0, cover_asset_id INTEGER, remark TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS file_asset ( id INTEGER PRIMARY KEY AUTOINCREMENT, business_type TEXT NOT NULL, business_id INTEGER NOT NULL, file_role TEXT NOT NULL, file_name TEXT NOT NULL, mime_type TEXT NOT NULL, file_size INTEGER NOT NULL, content_blob BLOB, preview_blob BLOB, sort_no INTEGER NOT NULL DEFAULT 0, is_primary INTEGER NOT NULL DEFAULT 0, sha256 TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS order_record ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_no TEXT NOT NULL UNIQUE, status TEXT NOT NULL DEFAULT 'PENDING', total_quantity INTEGER NOT NULL DEFAULT 0, total_amount NUMERIC NOT NULL DEFAULT 0, express_no TEXT, remark TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, completed_at TEXT ); CREATE TABLE IF NOT EXISTS order_item ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER NOT NULL, product_id INTEGER NOT NULL, product_name_snapshot TEXT NOT NULL, sku_snapshot TEXT NOT NULL, model_name_snapshot TEXT, unit_price NUMERIC NOT NULL DEFAULT 0, quantity INTEGER NOT NULL DEFAULT 0, line_amount NUMERIC NOT NULL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS order_operation_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER NOT NULL, operation_type TEXT NOT NULL, operation_content TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_user_permission_user_id ON user_permission(user_id); CREATE INDEX IF NOT EXISTS idx_category_parent_id ON category(parent_id); CREATE INDEX IF NOT EXISTS idx_product_category_id ON product_item(category_id); CREATE INDEX IF NOT EXISTS idx_file_asset_business ON file_asset(business_type, business_id); CREATE INDEX IF NOT EXISTS idx_order_item_order_id ON order_item(order_id); CREATE INDEX IF NOT EXISTS idx_order_log_order_id ON order_operation_log(order_id);