From 4e5ff179b2fd404d44f3960d9e9710095ae66629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 16:38:24 +0800 Subject: [PATCH] =?UTF-8?q?3D=20=E6=9F=A5=E4=BB=B7=E6=8B=92=E7=BB=9D=20tex?= =?UTF-8?q?ture=3Dfalse=20=E4=B8=8E=E8=B4=B4=E5=9B=BE=E5=8A=A0=E4=BB=B7?= =?UTF-8?q?=E9=A1=B9=E7=9A=84=E7=9F=9B=E7=9B=BE=E7=BB=84=E5=90=88=20-=20Mo?= =?UTF-8?q?del3dPricingError=20=E6=96=B0=E5=A2=9E=20InconsistentTextureAdd?= =?UTF-8?q?On=20=E5=8F=98=E4=BD=93=E4=B8=8E=E5=AF=B9=E5=BA=94=E6=96=87?= =?UTF-8?q?=E6=A1=88=20-=20price()=20=E5=9C=A8=E5=91=BD=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=20add-on=20=E5=90=AB=E8=B4=B4=E5=9B=BE=E7=B1=BB=E8=80=8C=20tex?= =?UTF-8?q?ture=3Dfalse=20=E6=97=B6=E5=A4=B1=E8=B4=A5=E5=85=B3=E9=97=AD?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=86=8D=E7=85=A7=E4=BB=B7=E6=94=B6=E8=B4=B9?= =?UTF-8?q?=20-=20=E8=A1=A5=E9=BD=90=E7=9F=9B=E7=9B=BE=E7=BB=84=E5=90=88?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=B8=8E=20texture=3Dtrue=20=E5=90=88?= =?UTF-8?q?=E6=B3=95=E7=BB=84=E5=90=88=E7=9A=84=E4=BB=B7=E6=A0=BC=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crates/api-server/src/tripo3d/pricing.rs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/server-rs/crates/api-server/src/tripo3d/pricing.rs b/server-rs/crates/api-server/src/tripo3d/pricing.rs index 547e75708..aa37995a3 100644 --- a/server-rs/crates/api-server/src/tripo3d/pricing.rs +++ b/server-rs/crates/api-server/src/tripo3d/pricing.rs @@ -146,6 +146,8 @@ pub(crate) enum Model3dPricingError { model_version: Model3dModelVersion, }, MissingAddOnPrice(Model3dAddOn), + /// `texture=false` 却带上贴图类加价项:组合自相矛盾,直接报错而不是照价收费。 + InconsistentTextureAddOn(Model3dAddOn), } impl std::fmt::Display for Model3dPricingError { @@ -164,6 +166,10 @@ impl std::fmt::Display for Model3dPricingError { Self::MissingAddOnPrice(add_on) => { write!(f, "Tripo 3D 定价缺少 add-on:{add_on:?}") } + Self::InconsistentTextureAddOn(add_on) => write!( + f, + "Tripo 3D 定价组合不合法:texture=false 与贴图类 add-on {add_on:?} 冲突" + ), } } } @@ -224,7 +230,18 @@ impl Model3dPricingConfig { } /// 查价:底价 + 命中的全部 add-on。缺键直接报错,不回退默认值。 + /// + /// `texture=false` 与贴图类 add-on 同时出现属于自相矛盾的组合,这里失败关闭: + /// 生产构造点([`model3d_add_ons`])已把贴图类加价项挂在 `texture` 上,构造不出该状态。 pub(crate) fn price(&self, query: &Model3dPricingQuery) -> Result { + if !query.texture + && let Some(add_on) = query.add_ons.iter().find(|add_on| { + matches!(add_on, Model3dAddOn::HdTexture | Model3dAddOn::UltraTexture) + }) + { + return Err(Model3dPricingError::InconsistentTextureAddOn(add_on)); + } + let base = self .base_prices .get(&query.endpoint) @@ -345,6 +362,30 @@ mod tests { ); } + #[test] + fn texture_add_ons_without_texture_are_rejected() { + let config = sample_config(); + let inconsistent = Model3dAddOnSet { + hd_texture: true, + ..Model3dAddOnSet::default() + }; + + assert_eq!( + config.price(&text_query(false, inconsistent)), + Err(Model3dPricingError::InconsistentTextureAddOn( + Model3dAddOn::HdTexture + )) + ); + + // texture=true 时同一个 add-on 集合是合法组合,价格按底价 + 加价项计算。 + assert_eq!( + config + .price(&text_query(true, inconsistent)) + .expect("带贴图时贴图加价项合法"), + 20 + 5 + ); + } + #[test] fn texture_quality_only_charges_detailed_and_extreme() { for (quality, expected) in [