Commit c29758c0 by 杨树贤

temp

parent eb70dcc2
Showing with 255 additions and 18 deletions
# 商品价格生成逻辑说明(产品版)
# 商品价格生成逻辑说明(产品版)
......@@ -60,9 +60,70 @@
- 如果 `PriceCostUs``PriceCostCn` 都为0:调用 `GenerateLadderPrice()` 生成阶梯价
- 如果已有成本价:直接使用,应用折扣系数
3. **获取折扣系数** (`GetDiscountRatio`):从配置获取折扣比例
3. **获取折扣系数** (`GetDiscountRatio`)
4. **应用折扣**:最终售价 = 成本价 × 折扣系数(这里基本都是1,都是代购渠道用得比较多)
折扣系数用于对成本价进行折扣调整,**主要适用于代购渠道**(专营渠道基本为1,即无折扣)。
**数据来源(Redis):**
| 供应商类型 | 配置Key | 默认Key |
|-----------|---------|---------|
| 代购(supplier_id ≠ 17)| `magic_cube_channel_discount_daigou` | `magic_cube_channel_discount_default_daigou` |
| 专营(supplier_id = 17)| `magic_cube_channel_discount_zhuanying` | `magic_cube_channel_discount_default_zhuanying` |
**专营供应商的Key格式:**
- 猎芯(OrgId = 1):渠道编码(如 `L0018319`
- 爱智/华云(OrgId = 3):`渠道编码-_组织ID`(如 `L0018319-_3`
**多条件匹配逻辑(按优先级从高到低):**
系统会尝试匹配最精确的折扣系数,匹配优先级:
1. **商品名称**(精确匹配)
2. **标准品牌ID**(匹配品牌)
3. **默认配置**(无特殊条件)
**匹配规则:**
- 按排序号从大到小遍历配置
- 任一条件匹配即命中,立即跳出
- 如果设置了商品名称或品牌但未匹配,继续检查下一个排序号
- 如果未设置任何特殊条件,直接采用该配置
**示例:**
```
配置1(排序号=100):
- 商品名称:STM32F103C8T6
- 折扣:0.95
配置2(排序号=50):
- 品牌:STMicroelectronics
- 折扣:0.92
配置3(排序号=1):
- 无特殊条件
- 折扣:0.90
场景A:商品是 STM32F103C8T6
→ 匹配配置1,折扣 = 0.95
场景B:商品是 STM32F407VGT6(同品牌)
→ 匹配配置2,折扣 = 0.92
场景C:商品是其他品牌
→ 匹配配置3,折扣 = 0.90
```
**计算应用:**
```
人民币成本 = 原始采购价 × 汇率 × 关税 × 折扣系数
美金成本 = 原始采购价 × 折扣系数
```
**找不到配置时的兜底:**
- 如果渠道无专属配置,使用全局默认配置
- 全局默认配置中区分人民币系数(`ration`)和美金系数(`ration_usd`
4. **应用折扣**:最终售价 = 成本价 × 折扣系数
---
......@@ -235,17 +296,39 @@ MOQ = 100,库存 = 5000
**流程说明:**
1. **获取三个系数:**
- **折扣系数**:商品的折扣比例
- **售价组系数**:不同采购数量的利润系数
- **供应商系数**:供应商级别的加成系数
2. **计算成本价:**
- 美金成本 = 原始采购价 × 折扣系数
- 人民币成本 = 原始采购价 × 汇率 × 关税 × 折扣系数
**A. 折扣系数(`GetDiscountRatio`):**
- **数据来源**:Redis `magic_cube_channel_discount_daigou`
- **适用对象**:代购供应商(supplier_id ≠ 17)
- **作用**:对供应商提供的原始采购价进行折扣调整
- **匹配逻辑**:与专营供应商相同,按优先级(商品名称 > 品牌 > 默认)匹配
- **典型值**:0.90 ~ 0.98(根据供应商合作折扣而定)
3. **计算售价:**
- 美金售价 = 美金成本 × 售价组系数
- 人民币售价 = 人民币成本 × 售价组系数
**B. 售价组系数(`GenerateLadderPrice` 或售价组配置):**
- **作用**:在成本价基础上加上利润率
- **来源**:售价组配置的 `priceRatioList`
- **典型值**:1.05 ~ 1.20(5% ~ 20%利润)
**C. 供应商系数:**
- **作用**:供应商级别的额外加成(如有)
2. **计算成本价(应用折扣系数):**
```
美金成本 = 原始采购价 × 折扣系数
人民币成本 = 原始采购价 × 汇率 × 关税 × 折扣系数
```
3. **计算售价(应用售价组系数):**
```
美金售价 = 美金成本 × 售价组系数
人民币售价 = 人民币成本 × 售价组系数
```
**完整公式串联:**
```
人民币售价 = 原始采购价 × 汇率 × 关税 × 折扣系数 × 售价组系数
美金售价 = 原始采购价 × 折扣系数 × 售价组系数
```
**特殊供应商说明:**
- **MRO(1688)**:只有人民币价格,直接作为成本价
......@@ -303,12 +386,146 @@ MOQ = 100,库存 = 5000
### 第三步:应用活动价格(GetActivityPrice)
**业务场景:**
商品参与促销活动时,需要计算活动价。
商品参与促销活动时,需要计算活动价并展示给用户
**流程说明:**
1. 检查商品是否参与活动
2. 如有活动,根据活动规则计算活动价
3. 活动价会覆盖标准售价展示给用户
**核心判断条件(同时满足才计算活动价):**
1. `GoodsType`:商品类型为联营(1)、专卖(2)或寄售(6)
2. `AcType > 1`:活动类型大于1(表示有活动)
3. `Ratio > 0`:活动折扣比例大于0
**字段说明:**
- `AcType`:活动类型(1=无活动,2=特价,3=限时折扣,4=直接覆盖原价)
- `Ratio`:人民币活动折扣比例(如90表示9折)
- `RatioUs`:美金活动折扣比例
---
#### 活动价计算方式
**计算公式:**
```
人民币活动价 = 阶梯售价 × (Ratio / 100)
美金活动价 = 阶梯售价 × (RatioUs / 100)
```
**不同组织的精度处理:**
- **猎芯(OrgId = 1)**:保留4位小数
- **爱智/华云(OrgId = 3)**:保留整数(人民币)、4位小数(美金)
---
#### 供应商类型差异处理
**A. 专营供应商(supplier_id = 17)**
针对爱智组织的特殊处理:
- 当 `OrgId == 3` 时,所有阶梯的人民币活动价都基于**第一个阶梯的售价**计算
- 美金活动价按各阶梯自身售价计算
```
示例:
阶梯1:¥100,阶梯2:¥90,阶梯3:¥85
Ratio = 90(9折)
人民币活动价计算:
- 阶梯1:¥100 × 0.9 = ¥90
- 阶梯2:¥100 × 0.9 = ¥90 ← 注意:也是基于阶梯1的价格
- 阶梯3:¥100 × 0.9 = ¥90 ← 注意:也是基于阶梯1的价格
美金活动价计算(各阶梯独立):
- 阶梯1:$15 × 0.9 = $13.5
- 阶梯2:$14 × 0.9 = $12.6
- 阶梯3:$13 × 0.9 = $11.7
```
**B. 代购供应商(supplier_id ≠ 17)**
所有阶梯的活动价都基于**各阶梯自身的售价**计算:
```
示例:
阶梯1:¥100,阶梯2:¥90,阶梯3:¥85
Ratio = 90(9折)
人民币活动价:
- 阶梯1:¥100 × 0.9 = ¥90
- 阶梯2:¥90 × 0.9 = ¥81
- 阶梯3:¥85 × 0.9 = ¥76.5
```
---
#### 特殊活动类型处理(AcType = 4)
当 `AcType == 4` 时,表示**直接覆盖原价**:
1. 将第一个阶梯的活动价**直接设为新的原价**(`PriceCn = PriceAc`)
2. 重置 `AcType = 0`,不再显示活动标签
**业务场景:** 某些活动不需要显示"活动价"标签,而是直接替换原价展示。
---
#### 活动价与原价相等的处理
**为什么前两个阶梯活动价等于原价时不展示?**
当第1或第2个阶梯的**活动价等于原价**时,系统不会展示活动价样式。
**原因:**
- 活动价有特殊的视觉样式(如红色标签、划线价等)
- 如果价格和原价一样,但样式是活动样式,客户会感到困惑
- 为避免误导,价格相同时保持原样,不显示活动标签
```
示例:
阶梯1:原价¥100,活动价¥100(Ratio=100,无折扣)
→ 不展示活动价,避免客户误以为有优惠
阶梯2:原价¥90,活动价¥90
→ 同样不展示活动价
阶梯3:原价¥85,活动价¥76.5(Ratio=90,9折)
→ 正常展示活动价
```
---
#### 活动失效判断
如果计算出的活动价都**小于等于0**,则判定活动失效:
```go
if priceAc <= 0 && priceAcUs <= 0 {
sku.AcType = 0 // 取消活动标记
}
```
---
#### 完整示例
```
商品信息:
- 供应商ID:17(专营)
- 商品类型:2(专卖)
- 组织ID:1(猎芯)
- AcType:3(限时折扣)
- Ratio:85(85折)
- RatioUs:85(85折)
阶梯价(已计算完售价):
- 1个:¥100 / $15
- 10个:¥90 / $13.5
- 100个:¥85 / $12.75
计算活动价:
- 1个:¥100×0.85=¥85 / $15×0.85=$12.75
- 10个:¥90×0.85=¥76.5 / $13.5×0.85=$11.475
- 100个:¥85×0.85=¥72.25 / $12.75×0.85=$10.8375
最终展示:
- 原价:¥100(划线价)
- 活动价:¥85(红色高亮)
```
---
......@@ -399,7 +616,27 @@ MOQ = 100,库存 = 5000
### 第三步:应用活动价格
和猎芯一样,检查是否有活动,应用活动价。
和猎芯的活动价处理逻辑基本一致,但有以下特殊点:
**1. 精度差异:**
- 人民币活动价:保留**整数**(猎芯保留4位小数)
- 美金活动价:保留4位小数(与猎芯相同)
**2. 专营供应商的特殊处理(OrgId = 3):**
```go
// 所有阶梯的人民币活动价都基于第一个阶梯的售价计算
tempAcPrice = c.MyRound(c.MulFloat(sku.LadderPrice[0].PriceCn, sku.Ratio/100), 0)
```
**示例对比:**
| 阶梯 | 原价 | 猎芯活动价 | 爱智活动价 |
|-----|------|-----------|-----------|
| 1个 | ¥100.50 | ¥90.4500 | ¥90 |
| 10个 | ¥95.80 | ¥86.2200 | ¥90(基于阶梯1)|
| 100个 | ¥90.30 | ¥81.2700 | ¥90(基于阶梯1)|
**注:** 美金活动价两个组织都保留4位小数,计算方式相同。
---
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment