3D 定价不再在加载时检查加总溢出

- pricing:加载校验删掉「两段加价项相加 + 全表最高底价」的溢出检查与对应的 overflow_error 助手,只保留每段键齐全与合法性的校验
- 理由写进注释:真实查价只用一个端点的底价与它自己的加价项,价格都是手填的小数字,撞不到 u32 上限;按两段相加去挡反而会拒掉能正常计费的配置
- 计费点的 checked_add 保留为唯一一道溢出闸,溢出即失败退款(PriceOverflow 的说明同步改掉「配置阶段已挡过一次」的说法)
This commit is contained in:
2026-09-24 20:34:57 +08:00
parent 93ef6cebf3
commit a6409d79dc
@@ -208,7 +208,7 @@ pub(crate) enum Model3dPricingError {
MissingAddOnPrice(Model3dAddOn),
/// `texture=false` 却带上贴图类加价项:组合自相矛盾,直接报错而不是照价收费。
InconsistentTextureAddOn(Model3dAddOn),
/// 底价 + 加价项累加超出 `u32`:配置阶段已挡过一次,这里是计费点的第二道闸。
/// 底价 + 加价项累加超出 `u32`:计费点直接失败退款,不静默截断成错价。
PriceOverflow,
}
@@ -241,27 +241,16 @@ impl std::error::Error for Model3dPricingError {}
impl Model3dPricingConfig {
/// 加载即校验:两段各自要求每个模型版本 × 两种贴图态与全部加价项键齐全。
///
/// 刻意不在这里做「加价项 + 底价会不会超出 u32」的检查:真实查价只用到一个端点的
/// 底价与它自己的加价项,价格都是运营手填的小数字,撞到 42 亿的上限不现实,而按
/// 「两段加价 + 全表最高底价」去挡反而会拒掉完全能正常计费的配置。万一真的加满,
/// [`Model3dEndpointPricing::price`] 会在计费点报 [`Model3dPricingError::PriceOverflow`],
/// 不会静默截断收费。
pub(crate) fn validate(&self) -> Result<(), String> {
for endpoint in Model3dEndpoint::ALL {
self.endpoint_pricing(endpoint).validate(endpoint)?;
}
// 加价项与底价都要累加进账单,配置阶段就挡住溢出,避免结算时静默截断。
let mut add_on_total = 0u32;
let mut max_base_price = 0u32;
for endpoint in Model3dEndpoint::ALL {
let pricing = self.endpoint_pricing(endpoint);
for price in pricing.add_on_prices.values() {
add_on_total = add_on_total
.checked_add(*price)
.ok_or_else(overflow_error)?;
}
for price in pricing.version_prices.values() {
max_base_price = max_base_price.max(price.no_texture).max(price.texture);
}
}
add_on_total
.checked_add(max_base_price)
.ok_or_else(overflow_error)?;
Ok(())
}
@@ -282,10 +271,6 @@ impl Model3dPricingConfig {
}
}
fn overflow_error() -> String {
"3D 定价表加总超出 u32 上限,请下调配置价格".to_string()
}
impl Model3dEndpointPricing {
pub(crate) fn validate(&self, endpoint: Model3dEndpoint) -> Result<(), String> {
for model_version in Model3dModelVersion::ALL.iter().copied() {
@@ -334,7 +319,7 @@ impl Model3dEndpointPricing {
.add_on_prices
.get(&add_on)
.ok_or(Model3dPricingError::MissingAddOnPrice(add_on))?;
// 与加载校验口径一致:溢出就报错退款,不静默夹到 u32 上限后按错价收费。
// 唯一的一道溢出闸就在这里:溢出就报错退款,不静默夹到 u32 上限按错价收费。
total
.checked_add(*price)
.ok_or(Model3dPricingError::PriceOverflow)