use serde::{Deserialize, Serialize}; use utoipa::ToSchema; use uuid::Uuid; use validator::Validate; // --- Dictionary DTOs --- #[derive(Debug, Serialize, ToSchema)] pub struct DictionaryItemResp { pub id: Uuid, pub dictionary_id: Uuid, pub label: String, pub value: String, pub sort_order: i32, #[serde(skip_serializing_if = "Option::is_none")] pub color: Option, } #[derive(Debug, Serialize, ToSchema)] pub struct DictionaryResp { pub id: Uuid, pub name: String, pub code: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, pub items: Vec, } #[derive(Debug, Deserialize, Validate, ToSchema)] pub struct CreateDictionaryReq { #[validate(length(min = 1, max = 100, message = "字典名称不能为空"))] pub name: String, #[validate(length(min = 1, max = 50, message = "字典编码不能为空"))] pub code: String, pub description: Option, } #[derive(Debug, Deserialize, ToSchema)] pub struct UpdateDictionaryReq { pub name: Option, pub description: Option, } #[derive(Debug, Deserialize, Validate, ToSchema)] pub struct CreateDictionaryItemReq { #[validate(length(min = 1, max = 100, message = "标签不能为空"))] pub label: String, #[validate(length(min = 1, max = 100, message = "值不能为空"))] pub value: String, pub sort_order: Option, pub color: Option, } #[derive(Debug, Deserialize, ToSchema)] pub struct UpdateDictionaryItemReq { pub label: Option, pub value: Option, pub sort_order: Option, pub color: Option, } // --- Menu DTOs --- #[derive(Debug, Serialize, ToSchema, Clone)] pub struct MenuResp { pub id: Uuid, #[serde(skip_serializing_if = "Option::is_none")] pub parent_id: Option, pub title: String, #[serde(skip_serializing_if = "Option::is_none")] pub path: Option, #[serde(skip_serializing_if = "Option::is_none")] pub icon: Option, pub sort_order: i32, pub visible: bool, pub menu_type: String, #[serde(skip_serializing_if = "Option::is_none")] pub permission: Option, pub children: Vec, } #[derive(Debug, Deserialize, Validate, ToSchema)] pub struct CreateMenuReq { pub parent_id: Option, #[validate(length(min = 1, max = 100, message = "菜单标题不能为空"))] pub title: String, pub path: Option, pub icon: Option, pub sort_order: Option, pub visible: Option, #[validate(length(min = 1, message = "菜单类型不能为空"))] pub menu_type: Option, pub permission: Option, pub role_ids: Option>, } #[derive(Debug, Deserialize, ToSchema)] pub struct UpdateMenuReq { pub title: Option, pub path: Option, pub icon: Option, pub sort_order: Option, pub visible: Option, pub permission: Option, pub role_ids: Option>, } #[derive(Debug, Deserialize, Validate, ToSchema)] pub struct BatchSaveMenusReq { #[validate(length(min = 1, message = "菜单列表不能为空"))] pub menus: Vec, } #[derive(Debug, Serialize, Deserialize, Validate, ToSchema)] pub struct MenuItemReq { pub id: Option, pub parent_id: Option, #[validate(length(min = 1, max = 100, message = "菜单标题不能为空"))] pub title: String, pub path: Option, pub icon: Option, pub sort_order: Option, pub visible: Option, pub menu_type: Option, pub permission: Option, pub role_ids: Option>, } // --- Setting DTOs --- #[derive(Debug, Serialize, ToSchema)] pub struct SettingResp { pub id: Uuid, pub scope: String, #[serde(skip_serializing_if = "Option::is_none")] pub scope_id: Option, pub setting_key: String, pub setting_value: serde_json::Value, } #[derive(Debug, Deserialize, Validate, ToSchema)] pub struct UpdateSettingReq { pub setting_value: serde_json::Value, } /// 内部参数结构体,用于减少 SettingService::set 的参数数量。 pub struct SetSettingParams { pub key: String, pub scope: String, pub scope_id: Option, pub value: serde_json::Value, } // --- Numbering Rule DTOs --- #[derive(Debug, Serialize, ToSchema)] pub struct NumberingRuleResp { pub id: Uuid, pub name: String, pub code: String, pub prefix: String, #[serde(skip_serializing_if = "Option::is_none")] pub date_format: Option, pub seq_length: i32, pub seq_start: i32, pub seq_current: i64, pub separator: String, pub reset_cycle: String, #[serde(skip_serializing_if = "Option::is_none")] pub last_reset_date: Option, } #[derive(Debug, Deserialize, Validate, ToSchema)] pub struct CreateNumberingRuleReq { #[validate(length(min = 1, max = 100, message = "规则名称不能为空"))] pub name: String, #[validate(length(min = 1, max = 50, message = "规则编码不能为空"))] pub code: String, pub prefix: Option, pub date_format: Option, pub seq_length: Option, pub seq_start: Option, pub separator: Option, pub reset_cycle: Option, } #[derive(Debug, Deserialize, ToSchema)] pub struct UpdateNumberingRuleReq { pub name: Option, pub prefix: Option, pub date_format: Option, pub seq_length: Option, pub separator: Option, pub reset_cycle: Option, } #[derive(Debug, Serialize, ToSchema)] pub struct GenerateNumberResp { pub number: String, } // --- Theme DTOs (stored via settings) --- #[derive(Debug, Serialize, Deserialize, ToSchema, Clone)] pub struct ThemeResp { #[serde(skip_serializing_if = "Option::is_none")] pub primary_color: Option, #[serde(skip_serializing_if = "Option::is_none")] pub logo_url: Option, #[serde(skip_serializing_if = "Option::is_none")] pub sidebar_style: Option, } // --- Language DTOs (stored via settings) --- #[derive(Debug, Serialize, ToSchema)] pub struct LanguageResp { pub code: String, pub name: String, pub is_active: bool, } #[derive(Debug, Deserialize, ToSchema)] pub struct UpdateLanguageReq { pub is_active: bool, }