diff --git a/server-rs/crates/api-server/src/editor_generation_config.rs b/server-rs/crates/api-server/src/editor_generation_config.rs index 960c77cd3..d1561cac2 100644 --- a/server-rs/crates/api-server/src/editor_generation_config.rs +++ b/server-rs/crates/api-server/src/editor_generation_config.rs @@ -93,21 +93,33 @@ pub(crate) enum EditorGenerationPricingError { Io(io::Error), Json(serde_json::Error), Invalid(String), + /// 3D 定价查询失败:结构化保留「未配置 / 缺底价 / 缺加价项」三种语义。 + Model3d(Model3dPricingError), #[cfg_attr(test, allow(dead_code))] Persistence(String), LockPoisoned, } +impl From for EditorGenerationPricingError { + fn from(error: Model3dPricingError) -> Self { + Self::Model3d(error) + } +} + impl EditorGenerationPricingConfig { /// Tripo 3D 提交查价:缺段或缺键都直接报错,不回退默认值。 + /// + /// 错误与同文件其它查询统一成 [`EditorGenerationPricingError`],3D 结构化原因收在 + /// [`EditorGenerationPricingError::Model3d`] 里,调用方不必再处理第二套错误枚举。 pub(crate) fn model3d_price( &self, query: &Model3dPricingQuery, - ) -> Result { + ) -> Result { self.model3d .as_ref() .ok_or(Model3dPricingError::NotConfigured)? .price(query) + .map_err(Into::into) } /// 后台 payload 的「可省略」语义:`model3d` 缺席或为 null 表示沿用当前 3D 段。 @@ -657,6 +669,8 @@ impl fmt::Display for EditorGenerationPricingError { Self::Invalid(message) => write!(f, "模型定价配置不合法:{message}"), Self::Persistence(message) => write!(f, "模型定价配置入库失败:{message}"), Self::LockPoisoned => write!(f, "模型定价配置锁已损坏"), + // 直接透传内层文案,保持接口响应里的 message 与改造前一致。 + Self::Model3d(error) => write!(f, "{error}"), } } } @@ -760,7 +774,13 @@ mod tests { ), )) .expect_err("未配置 3D 定价时应拒绝查价"); - assert_eq!(error, Model3dPricingError::NotConfigured); + assert!( + matches!( + error, + EditorGenerationPricingError::Model3d(Model3dPricingError::NotConfigured) + ), + "3D 段缺失应以 NotConfigured 收口,实际 {error:?}" + ); } /// 受控默认配置里的 3D 泥点价必须严格等于 `ceil(0.8 × Tripo 官方 credit)`: diff --git a/server-rs/crates/api-server/src/tripo3d/routes.rs b/server-rs/crates/api-server/src/tripo3d/routes.rs index ea59c56a1..03ece8c6c 100644 --- a/server-rs/crates/api-server/src/tripo3d/routes.rs +++ b/server-rs/crates/api-server/src/tripo3d/routes.rs @@ -146,9 +146,13 @@ async fn resolve_price_mud_points( .map_err(|error| error.into_response_with_context(Some(request_context)))?; match pricing.model3d_price(query) { Ok(price_mud_points) => Ok(u64::from(price_mud_points)), - Err(error) => { + // 查价失败只有 3D 定价这一种原因;其它变体理论上不会出现,真出现时按服务端问题上报。 + Err(crate::editor_generation_config::EditorGenerationPricingError::Model3d(error)) => { Err(map_pricing_error(error).into_response_with_context(Some(request_context))) } + Err(error) => { + Err(map_pricing_store_error(error).into_response_with_context(Some(request_context))) + } } }