Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
黄成意
/
go_sku_server
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
fda608a7
authored
Apr 13, 2026
by
杨树贤
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
确认板
parent
b6f4903a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
608 additions
and
853 deletions
doc/price_generation_logic.md
doc/price_generation_logic_白话版.md
doc/price_generation_logic.md
View file @
fda608a7
#
价格生成逻辑文档
#
商品价格生成逻辑说明(产品版)
## 概述
##
一、整体流程
概述
本文档详细描述
`LyService.LyGoodsDetail`
方法中的价格生成逻辑,该逻辑根据组织ID(
`org_id`
)对不同类型的供应商采用不同的价格处理策略。
当用户查看商品详情时,系统会根据商品所属的组织类型,采用不同的价格计算方式。目前主要有两种组织:
## 组织类型
-
**猎芯(OrgId = 1)**
:标准价格体系
-
**爱智/华云(OrgId = 3)**
:兼容多种历史数据格式
| OrgId | 组织名称 | 说明 |
---
|-------|----------|------|
| 0 | 兼容旧价格体系 | 为兼容价格体系之前的数据保留 |
## 二、猎芯的价格生成流程
| 1 | 猎芯 | 采用标准价格体系 |
| 3 | 爱智/华云 | 需要兼容老数据和新价格体系 |
### 第一步:售价计算(GetCoefficientAndPrice)
#### A. 专营供应商(supplier_id = 17)
**说明:**
supplier_id = 17 是"专营供应商"的统一标识,实际上包含多个自营渠道:
-
**L0018319**
:国内自营(WMS同步人民币未税成本价)
-
**L0018562**
:香港自营(WMS同步美金未税成本价)
-
**L0003270**
:其他自营渠道
-
以及其他以 L 开头的专营渠道编码
**核心概念:单一成本价 vs 自营商品成本价**
这是两个不同的概念,需要区分清楚:
| 类型 | 定义 | 适用场景 |
|-----|------|---------|
|
**单一成本价**
| 上传数据只有
**1个阶梯**
,且
`阶梯数量 = 0`
| 专营供应商(supplier_id = 17) |
|
**自营商品成本价**
| WMS同步的库存成本价(含税) | 专营供应商 supplier_id = 17(自营商品) |
**单一成本价的判断逻辑:**
```
上传的数据:
- 只有1个阶梯,且 阶梯数量 = 0 → 代表是【单一成本价】
- 有多个阶梯,且 阶梯数量 > 0 → 代表是【已有阶梯价】
```
**单一成本价的特点:**
-
供应商上传时只提供了一个成本价(没有设置阶梯价)
-
系统需要根据这个成本价,自动生成完整的阶梯价格
-
适用于专营供应商(supplier_id = 17)
**自营商品成本价的特点:**
-
从WMS系统同步过来的库存成本价
-
国内自营(L0018319):同步人民币含税成本价
-
香港自营(L0018562):同步美金未税成本价
-
需要根据汇率和关税转换成含税成本价
---
---
## 价格生成主流程
**流程说明:**
1.
**汇率转换(仅香港自营 L0018562)**
:
-
WMS同步的是美金未税成本价
-
需要 × 汇率 × 关税(1.13) = 人民币含税成本价
2.
**判断是否有成本价**
:
-
如果
`PriceCostUs`
和
`PriceCostCn`
都为0:调用
`GenerateLadderPrice()`
生成阶梯价
-
如果已有成本价:直接使用,应用折扣系数
3.
**获取折扣系数**
(
`GetDiscountRatio`
)
折扣系数用于对成本价进行折扣调整,
**主要适用于代购渠道**
(专营渠道基本为1,即无折扣)。
**多条件匹配逻辑(按优先级从高到低):**
系统会尝试匹配最精确的折扣系数,匹配优先级:
1.
**商品名称**
(精确匹配)
2.
**标准品牌ID**
(匹配品牌)
3.
**默认配置**
(无特殊条件)
**匹配规则:**
-
按排序号从大到小遍历配置
-
任一条件匹配即命中,立即跳出
-
如果设置了商品名称或品牌但未匹配,继续检查下一个排序号
-
如果未设置任何特殊条件,直接采用该配置
**示例:**
```
```
switch sku.OrgId
配置1(排序号=100):
├── case 0: 空处理(兼容旧数据)
- 商品名称:STM32F103C8T6
├── case 1: 猎芯价格体系
- 折扣:0.95
│ ├── GetCoefficientAndPrice() → 获取系数和计算价格
│ ├── getCustomPriceList() → 获取自定义价格
│ └── GetActivityPrice() → 获取活动价格
└── case 3: 爱智/华云价格体系
├── 寄售商品判断 (source == 12) → 跳过价格体系
└── 老数据兼容判断
├── 老数据格式 → GetIEdgePrice() → 处理爱智特定价格格式
└── 新价格体系 → 标准价格体系流程 + transformIEdgeLadderPrice()
└── GetActivityPrice() → 获取活动价格
GetCostForZiying() → 处理自营成本价
配置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.
**应用折扣**
:最终售价 = 成本价 × 折扣系数
---
---
##
猎芯组织 (OrgId = 1) 价格流程
##
## A.4 GenerateLadderPrice - 生成阶梯价格
### 1. GetCoefficientAndPrice()
**适用范围:**
专营供应商(supplier_id = 17)
核心价格计算方法,根据供应商类型分为两条路径
:
当专营供应商载入产品时,有两种情况会进入这个方法
:
#### 专卖供应商 (supplier_id = 17)
1.
**单一成本价**
(阶梯数量 = 0):只提供了一个成本价,没有阶梯价,需要生成完整的阶梯价格
2.
**已有阶梯价**
(阶梯数量 > 0):载入了阶梯价,需要应用利润系数来计算售价
**流程:**
**注意:**
自营商品不经过这个逻辑,因为自营商品的成本价是从WMS系统同步过来的,使用另一种计算价格的方法。
1.
处理特殊供应商价格 (
`TransformSpecialSupplierPrice`
)
2.
处理香港自营渠道 (
`L0018562`
) 汇率转换
3.
获取折扣系数 (
`GetDiscountRatio`
)
4.
应用折扣系数到价格
**关键逻辑:**
---
```
go
// 香港自营特殊处理:WMS同步的美金未税成本价需要转换
##### A.4.1 单一成本价生成阶梯价格 (阶梯数量 = 0)
if
sku
.
Canal
==
"L0018562"
{
// 1. 获取实时汇率
**情况1:MOQ <= 50 固定阶梯 (小MOQ产品)**
// 2. 计算人民币含税价格(汇率 × 关税1.13)
// 3. 生成阶梯价
当最小订购量小于等于50时,系统使用
**固定阶梯和固定利润率**
来生成价格,以避免亏损。
}
**固定阶梯配置表:**
| MOQ范围 | 阶梯1 | 阶梯2 | 阶梯3 | 阶梯4 | 阶梯5 |
|---------|-------|-------|-------|-------|-------|
| < 10 | MOQ | 30 | 100 | 300 | 1000 |
| 10-29 | MOQ | 50 | 200 | 500 | 1000 |
| 30-50 | MOQ | 200 | 500 | 1000 | 2000 |
**固定利润率 (下限保证利润):**
-
阶梯1 (MOQ):11% 利润
-
阶梯2:10% 利润
-
阶梯3:9% 利润
-
阶梯4:8% 利润
-
阶梯5:7% 利润
**示例 (MOQ = 5):**
```
成本价:¥100
生成的阶梯价格:
- 5个:¥100 × 1.11 = ¥111 (11% 利润)
- 30个:¥100 × 1.10 = ¥110 (10% 利润)
- 100个:¥100 × 1.09 = ¥109 (9% 利润)
- 300个:¥100 × 1.08 = ¥108 (8% 利润)
- 1000个:¥100 × 1.07 = ¥107 (7% 利润)
```
```
#### 代购供应商
**情况2:MOQ > 50 动态阶梯 (大MOQ产品)**
**流程:**
当最小订购量大于50时,系统根据
**库存量**
和
**销售价格组配置的利润系数**
动态计算阶梯和利润率。
1.
获取折扣系数 (
`GetDiscountRatio`
)
2.
获取售价组系数 (
`GetPriceRatio`
)
3.
获取供应商系数 (Redis:
`pool_supplier_ratio`
)
4.
计算成本价和售价
**价格计算公式:**
**计算逻辑:**
1.
根据库存量确定可以显示的阶梯数量(库存量必须满足该阶梯的数量要求)
2.
读取销售价格组配置的利润系数
3.
成本价 × 利润系数 = 每个阶梯的售价
**关键配置参数:**
-
`ladderPriceMiniProfitLevel`
:阶梯最小利润点数量(例如设置为5,表示最多显示5个阶梯,从第5个利润点开始往前)
-
`costLadderCount`
:根据库存量计算出的实际阶梯数量
**示例计算阶梯利润:**
```
```
成本价(美金) = 原始美金价 × 折扣系数(美金)
假设销售价格组配置了9个利润系数(从低到高):
售价(美金) = 成本价(美金) × 售价组系数(美金)
[1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11, 1.12, 1.13]
MOQ = 100,库存量 = 5000
最小利润点 = 5
库存量满足的阶梯数量 = 3(100×1=100,100×5=500,100×10=1000都在库存量范围内)
成本价(人民币) = 原始美金价 × 汇率 × 关税(1.13) × 折扣系数(人民币)
因为 3 < 5,所以取向后阶梯利润:
售价(人民币) = 成本价(人民币) × 售价组系数(人民币)
阶梯1 -> 取(5-3+0)=3个利润系数 = 1.07 -> 售价 ¥cost × 1.07
阶梯2 -> 取(5-3+1)=3个利润系数 = 1.08 -> 售价 ¥cost × 1.08
阶梯3 -> 取(5-3+2)=5个利润系数 = 1.09 -> 售价 ¥cost × 1.09
```
```
**特殊供应商处理:**
---
-
MRO (supplier_id=1688):只有人民币价格,直接作为成本价
-
Digikey (supplier_id=7):可能同时有人民币和美金价格
###
2. getCustomPriceList(
)
###
## A.4.2 已有阶梯价应用利润系数 (阶梯数量 > 0
)
根据组织ID获取自定义价格配置,生成多个自定义价格阶梯。
当供应商载入了阶梯价(阶梯数量 > 0)时,系统根据销售价格组配置的
`ladderType`
字段,采用两种不同的处理方法:
```
go
**销售价格组配置解释:**
// 例如:会员价利润10%,企业价利润5%
-
`ladderType = 1`
:旧逻辑,
**基于载入的阶梯**
,取向后利润系数
// 会在基础价格上应用不同的利润率系数
-
`ladderType = 2`
:新逻辑,
**基于销售价格组配置的阶梯**
,生成固定阶梯
customPriceList
=
[
-
`ladderPriceMiniProfitLevel`
:阶梯最小利润点数量(限制显示的最大阶梯数量)
{
PriceName
:
"会员价"
,
LadderPrice
:
[
...
]},
{
PriceName
:
"企业价"
,
LadderPrice
:
[
...
]}
---
]
**类型A:ladderType = 1 (旧逻辑:基于载入的阶梯)**
**处理逻辑:**
1.
基于载入的阶梯数量(例如供应商载入了3个阶梯:1个、10个、100个)
2.
根据库存量判断可以满足的阶梯数量(库存量必须满足该阶梯的数量要求)
3.
从销售价格组配置的利润系数中
**取向后值**
**示例:**
```
载入的阶梯:
- 1个:$50 (成本价)
- 10个:$45 (成本价)
- 100个:$40 (成本价)
销售价格组配置了9个利润系数:[1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11, 1.12, 1.13]
最小利润点 = 5
库存量满足的阶梯数量 = 3
方法计算(取向后):
阶梯1 (1个) -> 取(5-3+0)=3个利润系数 = 1.07 -> 售价 $50 × 1.07 = $53.5
阶梯2 (10个) -> 取(5-3+1)=3个利润系数 = 1.08 -> 售价 $45 × 1.08 = $48.6
阶梯3 (100个) -> 取(5-3+2)=5个利润系数 = 1.09 -> 售价 $40 × 1.09 = $43.6
```
---
**类型B:ladderType = 2 (新逻辑:基于销售价格组配置的阶梯)**
**业务场景:**
操作希望统一某些产品的阶梯显示格式,不论供应商载入了什么阶梯,都按照销售价格组配置的阶梯显示。
**处理逻辑:**
1.
**忽略载入的阶梯数量**
,基于销售价格组配置的阶梯
2.
基于
**载入的第一个阶梯的价格**
作为基准(作为成本价)
3.
乘以销售价格组配置的每个阶梯的利润系数,生成固定阶梯价格
**示例:**
```
载入的阶梯:
- 5个:¥100 (成本价)
- 50个:¥90 (成本价)
- 200个:¥80 (成本价)
销售价格组配置(固定阶梯):
- 1个:利润系数 1.15
- 10个:利润系数 1.12
- 100个:利润系数 1.10
- 1000个:利润系数 1.08
处理方法(基于第一个阶梯的价格):
成本价基准 = ¥100
生成的阶梯价格:
- 1个:¥100 × 1.15 = ¥115 (销售价格组配置的阶梯)
- 10个:¥100 × 1.12 = ¥112 (销售价格组配置的阶梯)
- 100个:¥100 × 1.10 = ¥110 (销售价格组配置的阶梯)
- 1000个:¥100 × 1.08 = ¥108 (销售价格组配置的阶梯)
注意:
- 显示的阶梯数量和最终显示的数量完全由销售价格组配置决定
- 其他载入的阶梯(50个、200个)被忽略
```
**两种类型的比较:**
| 比较项 | ladderType = 1 (旧逻辑) | ladderType = 2 (新逻辑) |
|-------|------------------------|------------------------|
| 阶梯来源 | 基于载入的阶梯 | 基于销售价格组配置的阶梯 |
| 阶梯数量 | 载入的阶梯数量 | 销售价格组配置的阶梯数量 |
| 利润系数取值 | 取向后值 | 直接取值 |
| 适用场景 | 遵循供应商载入的阶梯配置 | 统一产品阶梯显示格式 |
---
#### B. 代购供应商(supplier_id != 17)
**流程说明:**
1.
**获取三个系数:**
**A. 折扣系数(`GetDiscountRatio`):**
-
**数据来源**
:Redis
`magic_cube_channel_discount_daigou`
-
**适用对象**
:代购供应商(supplier_id != 17)
-
**作用**
:对供应商提供的原始采购价进行折扣调整
-
**匹配逻辑**
:与专营供应商相同,按优先级(商品名称 > 品牌 > 默认)匹配
-
**典型值**
:0.90 ~ 0.98(根据供应商合作折扣而定)
**B. 售价组系数(`GenerateLadderPrice` 或售价组配置):**
-
**作用**
:在成本价基础上加上利润率
-
**来源**
:售价组配置的
`priceRatioList`
-
**典型值**
:1.05 ~ 1.20(5% ~ 20%利润)
**C. 供应商系数:**
-
**作用**
:供应商级别的额外加成(如有)
2.
**计算成本价(应用折扣系数):**
```
美金成本 = 原始采购价 × 折扣系数
人民币成本 = 原始采购价 × 汇率 × 关税 × 折扣系数
```
3. **计算售价(应用售价组系数):**
```
美金售价 = 美金成本 × 售价组系数
人民币售价 = 人民币成本 × 售价组系数
```
**完整公式串联:**
```
人民币售价 = 原始采购价 × 汇率 × 关税 × 折扣系数 × 售价组系数
美金售价 = 原始采购价 × 折扣系数 × 售价组系数
```
**特殊供应商说明:**
- **MRO(1688)**:只有人民币价格,直接作为成本价
- **Digikey(7)**:可能同时有人民币和美金价格
**价格计算示例:**
```
原始采购价:$100
折扣系数:0.95
售价组系数:1.15(15%利润)
汇率:7.2
关税:1.13
计算过程:
美金成本 = $100 × 0.95 = $95
美金售价 = $95 × 1.15 = $109.25
人民币成本 = $100 × 7.2 × 1.13 × 0.95 = ¥772.2
人民币售价 = ¥772.2 × 1.15 = ¥888.03
```
```
###
3. GetActivityPrice()
###
第二步:生成自定义价格(getCustomPriceList)
应用活动价格(折扣/特价活动)。
**业务场景:**
除了标准售价外,还需要展示会员价、企业价等多种价格。
**流程说明:**
1. 根据组织ID从Redis获取自定义价格规则
2. 每条规则包含:价格名称(如"会员价")+ 利润比例(如10%)
3. 在标准售价基础上,应用不同的利润率,生成多套阶梯价
**举个栗子:**
```
标准售价阶梯:
-
1个:¥100
-
10个:¥95
-
100个:¥90
自定义价格配置:
-
会员价:利润10%
-
企业价:利润5%
生成结果:
会员价阶梯:
-
1个:¥100 × 1.10 = ¥110
-
10个:¥95 × 1.10 = ¥104.5
-
100个:¥90 × 1.10 = ¥99
企业价阶梯:
-
1个:¥100 × 1.05 = ¥105
-
10个:¥95 × 1.05 = ¥99.75
-
100个:¥90 × 1.05 = ¥94.5
```
### 第三步:应用活动价格(GetActivityPrice)
**业务场景:**
商品参与促销活动时,需要计算活动价并展示给用户。
**核心判断条件(同时满足才计算活动价):**
1. `GoodsType`:商品类型为联营(1)、专卖(2)或寄售(6)
2. `AcType > 1`:活动类型大于1(表示有活动)
3. `Ratio > 0`:活动折扣比例大于0
**字段说明:**
- `AcType`:活动类型(1=无活动,2=特价,3=限时折扣,4=直接覆盖原价)
- `Ratio`:人民币活动折扣比例(如90表示9折)
- `RatioUs`:美金活动折扣比例
---
---
## 爱智组织 (OrgId = 3) 价格流程
#### 活动价计算方式
**计算公式:**
```
人民币活动价 = 阶梯售价 × (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折)
→ 正常展示活动价
```
### 特殊判断逻辑
---
爱智组织需要处理
**历史遗留数据**
和
**新价格体系**
的兼容问题。
#### 活动失效判断
#### 1. 寄售商品跳过
如果计算出的活动价都**小于等于0**,则判定活动失效:
```
go
```
go
if
sku
.
Source
==
12
{
if
priceAc <= 0 && priceAcUs <= 0
{
break
// 寄售商品不走价格体系
sku.AcType = 0 // 取消活动标记
}
}
```
```
#### 2. 老数据兼容判断
---
**老数据特征:**
#### 完整示例
| 阶梯数量 | 第一个阶梯条件 | 数据类型 | 处理方式 |
```
|----------|----------------|----------|----------|
商品信息:
| 2 |
`Purchases != 0`
| 老数据 | GetIEdgePrice() |
-
供应商ID:17(专营)
| 3 |
`Purchases == 0`
| 新配置(成本+会员+企业) | GetIEdgePrice() |
-
商品类型:2(专卖)
| 4 |
`Purchases == 0`
| 新配置(成本+会员+企业+限价) | GetIEdgePrice() |
-
组织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(红色高亮)
```
**老数据处理 (GetIEdgePrice):**
---
```
go
## 三、爱智/华云的价格生成流程
// Purchases 值映射到价格名称
0
→
"成本价"
爱智的价格逻辑比较复杂,因为需要兼容**历史遗留数据**和**新的价格体系**。
1
→
"标准价"
2
→
"企业价"
### 第一步:判断是否为寄售商品
3
→
"销售限价"
**判断条件:** `source == 12`
**处理逻辑:**
- **是寄售商品**:直接跳过价格体系,使用上传的价格
- **非寄售商品**:继续后续判断
### 第二步:判断数据类型(老数据 vs 新数据)
根据阶梯价的数量和格式,判断是老数据还是新数据:
#### 情况A:老数据格式(直接展示,不走价格体系)
**老数据的三种情况:**
| 阶梯数量 | 第一个阶梯 | 数据说明 | 处理方式 |
|---------|-----------|---------|---------|
| 2个 | 数量≠0 | 旧版格式(标准价+企业价)| GetIEdgePrice处理 |
| 3个 | 数量=0 | 新版格式(成本价+会员价+企业价)| GetIEdgePrice处理,删除成本价 |
| 4个 | 数量=0 | 新版格式(成本+会员+企业+限价)| GetIEdgePrice处理,取中间两个 |
**GetIEdgePrice处理逻辑:**
1. **给每个阶梯添加价格名称:**
- 数量0 → "成本价"
- 数量1 → "标准价"
- 数量2 → "企业价"
- 数量3 → "销售限价"
2. **过滤不需要展示的价格:**
- 3个阶梯时:删除第一个(成本价),只展示标准价+企业价
- 4个阶梯时:取中间两个(标准价+企业价)
**举个栗子(3个阶梯):**
```
上传的数据:
-
数量0:¥50(成本价)
-
数量1:¥100(标准价)
-
数量2:¥80(企业价)
处理后展示:
-
数量1:标准价 ¥100
-
数量2:企业价 ¥80
// 过滤规则:
成本价内部保留,前端不展示
// - 3个阶梯:删除第一个(成本价),保留标准价+企业价
// - 4个阶梯:取中间两个(标准价+企业价)
```
```
####
3. 走价格体系的最新配置
####
情况B:新数据格式(走价格体系)
**条件:**
**判断条件:**
-
阶梯数量为2,第一个阶梯是0(成本价 + 销售限价)
- 阶梯数量为2
- 第一个阶梯数量为0(即成本价)
**处理流程:**
**处理流程:**
1.
去掉销售限价(因为走价格体系的前提是有成本价)
```
go
1. **预处理阶梯价:**
if
len
(
sku
.
LadderPrice
)
==
2
{
如果同时有成本价和销售限价,去掉销售限价(因为走价格体系的前提是有成本价)
sku
.
LadderPrice
=
sku
.
LadderPrice
[
:
1
]
// 只保留成本价
```
}
原始:[成本价, 销售限价]
处理后:[成本价]
```
```
2. 走标准价格体系(同猎芯流程)
2. **走标准价格体系:**
- `
GetCoefficientAndPrice
()
`
和猎芯的流程一样:
- `
getCustomPriceList
()
`
- GetCoefficientAndPrice(基础价格计算)
- getCustomPriceList(生成自定义价格)
3. 华云阶梯价特殊转换 (`
transformIEdgeLadderPrice
`)
3. **华云格式转换(transformIEdgeLadderPrice):**
```
go
为了让华云的老系统能正常显示,需要将自定义价格转换成特定的格式:
// 华云兼容格式:
// 自定义价格 → 转换为2个阶梯的格式
```
// purchases=1: 标准价
转换前(自定义价格):
// purchases=2: 企业价
- 会员价:数量100,价格¥90
- 企业价:数量100,价格¥85
转换后(华云格式):
- 数量1:标准价 ¥90
- 数量2:企业价 ¥85
```
```
---
### 第三步:应用活动价格
## 关键数据结构
和猎芯的活动价处理逻辑基本一致,但有以下特殊点:
### LadderPrice(阶梯价格)
**1. 精度差异:**
- 人民币活动价:保留**整数**(猎芯保留4位小数)
- 美金活动价:保留4位小数(与猎芯相同)
**2. 专营供应商的特殊处理(OrgId = 3):**
```
go
```
go
type LadderPrice struct {
// 所有阶梯的人民币活动价都基于第一个阶梯的售价计算
Purchases int64 // 购买数量
tempAcPrice = c.MyRound(c.MulFloat(sku.LadderPrice
[
0
]
.PriceCn, sku.Ratio/100), 0)
PriceUs float64 // 美金售价
PriceCn float64 // 人民币售价
PriceCostUs float64 // 成本价美金
PriceCostCn float64 // 成本价人民币
PriceAc float64 // 活动价人民币
PriceAcUs float64 // 活动价美金
PriceName string // 价格名称(华云专用)
}
```
```
### 华云价格名称映射
**示例对比:**
```
go
| 阶梯 | 原价 | 猎芯活动价 | 爱智活动价 |
priceNameMap := map
[
int64
]
string{
|-----|------|-----------|-----------|
0: "成本价",
| 1个 | ¥100.50 | ¥90.4500 | ¥90 |
1: "标准价",
| 10个 | ¥95.80 | ¥86.2200 | ¥90(基于阶梯1)|
2: "企业价",
| 100个 | ¥90.30 | ¥81.2700 | ¥90(基于阶梯1)|
3: "销售限价",
}
**注:** 美金活动价两个组织都保留4位小数,计算方式相同。
```
---
---
## 特殊供应商汇率处理 (TransformSpecialSupplierPrice)
## 四、特殊供应商的币种转换
有些供应商存入"美金"字段的实际上不是美金,需要进行币种转换:
针对存入"美金"字段但实际是其他币种的供应商进行转换:
| 供应商 | 原始币种 | 转换逻辑 |
|-------|---------|---------|
| Element14(6)| 港币 | 港币 → 人民币 → 美金 |
| RS(21)| 人民币 | 人民币 → 美金 |
| Buerklin(1676)| 欧元 | 欧元 → 人民币 → 美金 |
| 供应商ID | 原始币种 | 处理方式 |
**转换示例(Element14):**
|----------|----------|----------|
```
| 6 (Element14) | 港币 | 港币 → 人民币 → 美金 |
原始价格:100港币
| 21 (RS) | 人民币 | 人民币 → 美金 |
港币汇率:0.92(1港币 = 0.92人民币)
| 1676 (Buerklin) | 欧元 | 欧元 → 人民币 → 美金 |
美金汇率:7.2(1美金 = 7.2人民币)
**汇率转换流程:**
计算:
1. 获取币种转人民币汇率 (`erp_rate`)
人民币 = 100 × 0.92 = 92元
2. 人民币转美金汇率 = 币种汇率 ÷ 美金汇率
美金 = 92 ÷ 7.2 = $12.78
3. 应用转换到阶梯价
```
---
---
## 后续处理
##
五、
后续处理
###
GetCostForZiying()
###
1. 自营成本价处理(GetCostForZiying)
处理自营供应商的成本价
。
针对自营供应商的特殊成本价处理
。
### 最小起订量校验
### 2. 最小起订量校验
```
go
```
// 最小起订量要大于等于阶梯价的最小阶梯数量
规则:最小起订量 ≥ 阶梯价的最小数量
if purchases > sku.Moq {
sku.Moq = purchases
示例:
}
-
商品设置的最小起订量:5个
-
阶梯价最小数量:10个
-
最终结果:最小起订量改为10个
```
```
---
---
## 总结
## 六、总结对比表
| 组织 | 价格体系 | 主要特点 |
|-----|---------|---------|
| 猎芯(1)| 标准体系 | 通过系数计算价格,支持多种自定义价格 |
| 爱智(3)| 兼容体系 | 需要判断数据版本,老数据直接展示,新数据走价格体系 |
| 寄售商品 | 跳过体系 | 直接使用上传的价格 |
---
## 七、关键术语解释
1.
**猎芯 (OrgId=1)**
:标准价格体系,通过系数计算生成阶梯价
| 术语 | 说明 |
2.
**爱智 (OrgId=3)**
:复杂兼容逻辑,需要判断数据版本并选择不同的处理路径
|-----|------|
3.
**核心公式**
:成本价 × 利润系数 = 售价
| 阶梯价 | 不同采购数量对应的不同价格,数量越多单价越低 |
4.
**关键系数**
:折扣系数、售价组系数、供应商系数
| 成本价 | 采购成本,内部使用 |
| 标准价 | 普通用户看到的售价 |
| 会员价 | 会员用户专享价格 |
| 企业价 | 企业客户专享价格 |
| 折扣系数 | 对成本价的折扣比例 |
| 售价组系数 | 不同利润档位 |
| 最小起订量(MOQ)| 单次采购的最低数量要求 |
---
---
*文档
生成
时间:2025年4月*
*文档
编写
时间:2025年4月*
doc/price_generation_logic_白话版.md
deleted
100644 → 0
View file @
b6f4903a
# 商品价格生成逻辑说明(产品版)
# 商品价格生成逻辑说明(产品版)
## 一、整体流程概述
当用户查看商品详情时,系统会根据商品所属的组织类型,采用不同的价格计算方式。目前主要有两种组织:
-
**猎芯(OrgId = 1)**
:标准价格体系
-
**爱智/华云(OrgId = 3)**
:兼容多种历史数据格式
---
## 二、猎芯的价格生成流程
### 第一步:售价计算(GetCoefficientAndPrice)
#### 情况A:专卖供应商(supplier_id = 17,自营渠道)
**说明:**
supplier_id = 17 是"专营供应商"的统一标识,实际上包含多个自营渠道:
-
**L0018319**
:国内自营(WMS同步人民币未税成本价)
-
**L0018562**
:香港自营(WMS同步美金未税成本价)
-
**L0003270**
:其他自营渠道
-
以及其他以 L 开头的专营渠道编码
**核心概念:单一成本价 vs 自营商品成本价**
这是两个不同的概念,需要区分清楚:
| 类型 | 定义 | 适用场景 |
|-----|------|---------|
|
**单一成本价**
| 上传数据只有
**1个阶梯**
,且
`Purchases = 0`
| 代购供应商(从第三方采购的商品) |
|
**自营商品成本价**
| WMS同步的库存成本价(含税) | 专营供应商 supplier_id = 17(自营商品) |
**单一成本价的判断逻辑:**
```
上传的数据:
- 只有1个阶梯,且 Purchases = 0 → 代表是【单一成本价】
- 有多个阶梯,且 Purchases > 0 → 代表是【已有阶梯价】
```
**单一成本价的特点:**
-
供应商上传时只提供了一个成本价(没有设置阶梯价)
-
系统需要根据这个成本价,自动生成完整的阶梯价格
-
适用于专营供应商(supplier_id = 17)
**自营商品成本价的特点:**
-
从WMS系统同步过来的库存成本价
-
国内自营(L0018319):同步人民币含税成本价
-
香港自营(L0018562):同步美金未税成本价
-
需要根据汇率和关税转换成含税成本价
---
**流程说明:**
1.
**汇率转换(仅香港自营 L0018562)**
:
-
WMS同步的是美金未税成本价
-
需要 × 汇率 × 关税(1.13) = 人民币含税成本价
2.
**判断是否有成本价**
:
-
如果
`PriceCostUs`
和
`PriceCostCn`
都为0:调用
`GenerateLadderPrice()`
生成阶梯价
-
如果已有成本价:直接使用,应用折扣系数
3.
**获取折扣系数**
(
`GetDiscountRatio`
)
折扣系数用于对成本价进行折扣调整,
**主要适用于代购渠道**
(专营渠道基本为1,即无折扣)。
**多条件匹配逻辑(按优先级从高到低):**
系统会尝试匹配最精确的折扣系数,匹配优先级:
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.
**应用折扣**
:最终售价 = 成本价 × 折扣系数
---
**核心方法:GenerateLadderPrice(生成阶梯价)**
**适用范围:专营供应商(supplier_id = 17)**
当专营供应商上传商品时,有两种情况会进入这个方法:
1.
**单一成本价**
(Purchases = 0):只提供了一个成本价,没有阶梯价,需要生成完整阶梯
2.
**已有阶梯价**
(Purchases > 0):上传了阶梯价,需要应用利润系数计算售价
**注意:自营商品不走这个逻辑**
,因为自营商品有WMS同步的成本价,使用另外的价格计算方式。
---
### 第一部分:单一成本价生成阶梯价(Purchases = 0)
**情况1:起订量 ≤ 50 的固定阶梯(MOQ小的商品)**
当最小起订量较小时,系统使用
**固定的阶梯数量和固定的利润率**
来生成价格,防止卖亏。
**固定阶梯配置表:**
| MOQ范围 | 阶梯1 | 阶梯2 | 阶梯3 | 阶梯4 | 阶梯5 |
|---------|-------|-------|-------|-------|-------|
| < 10 | MOQ | 30 | 100 | 300 | 1000 |
| 10-29 | MOQ | 50 | 200 | 500 | 1000 |
| 30-50 | MOQ | 200 | 500 | 1000 | 2000 |
**固定利润率(安全保底):**
-
阶梯1(MOQ):11% 利润
-
阶梯2:10% 利润
-
阶梯3:9% 利润
-
阶梯4:8% 利润
-
阶梯5:7% 利润
**示例(MOQ = 5):**
```
成本价:¥100
生成的阶梯价:
- 5个:¥100 × 1.11 = ¥111(11%利润)
- 30个:¥100 × 1.10 = ¥110(10%利润)
- 100个:¥100 × 1.09 = ¥109(9%利润)
- 300个:¥100 × 1.08 = ¥108(8%利润)
- 1000个:¥100 × 1.07 = ¥107(7%利润)
```
**情况2:起订量 > 50 的动态阶梯(MOQ大的商品)**
当最小起订量较大时,系统根据
**库存量**
和
**配置的售价组系数**
动态计算阶梯数量和利润率。
**计算逻辑:**
1.
根据库存量确定可以展示多少个阶梯(库存要满足该阶梯的数量需求)
2.
从售价组配置中读取利润系数
3.
成本价 × 利润系数 = 各阶梯售价
**关键配置参数:**
-
`ladderPriceMiniProfitLevel`
:最小利润点阶梯数(如设为5,表示最多展示5个阶梯,从第5个利润点开始倒推)
-
`costLadderCount`
:根据库存计算出的实际阶梯数
**利润阶梯计算示例:**
```
假设售价组配置了9个利润系数(利润从低到高):
[1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11, 1.12, 1.13]
MOQ = 100,库存 = 5000
最小利润点 = 5
库存满足的阶梯数 = 3(100×1=100, 100×5=500, 100×10=1000 都在库存范围内)
因为 3 < 5,所以倒推取利润阶梯:
阶梯1 → 取第(5-3+0)=3个利润系数 = 1.07
阶梯2 → 取第(5-3+1)=3个利润系数 = 1.08
阶梯3 → 取第(5-3+2)=5个利润系数 = 1.09
最终价格:
- 100个:¥成本 × 1.07
- 500个:¥成本 × 1.08
- 1000个:¥成本 × 1.09
```
---
### 第二部分:已有阶梯价时应用利润系数(Purchases > 0)
当供应商上传商品时已经设置了阶梯价(Purchases > 0),系统会根据售价组配置的
`ladderType`
字段,采用两种不同的处理方式:
**售价组配置参数说明:**
-
`ladderType = 1`
:老逻辑,
**以上传的阶梯为准**
,倒推取利润系数
-
`ladderType = 2`
:新逻辑,
**以售价组配置的阶梯为准**
,固定生成阶梯
-
`ladderPriceMiniProfitLevel`
:最小利润点阶梯数(限制最多展示多少个阶梯)
---
#### 类型A:ladderType = 1(老逻辑:以上传阶梯为准)
**处理逻辑:**
1.
以上传的阶梯数量为准(如供应商上传了3个阶梯:1个、10个、100个)
2.
根据库存判断能满足多少个阶梯(库存要满足该阶梯的数量需求)
3.
从售价组利润系数中
**倒推取值**
**示例:**
```
上传的阶梯:
- 1个:$50(成本价)
- 10个:$45(成本价)
- 100个:$40(成本价)
售价组配置9个利润系数:[1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11, 1.12, 1.13]
最小利润点 = 5
库存满足的阶梯数 = 3
计算方式(倒推):
阶梯1(1个)→ 取第(5-3+0)=3个系数 1.07 → 售价 $50×1.07 = $53.5
阶梯2(10个)→ 取第(5-3+1)=3个系数 1.08 → 售价 $45×1.08 = $48.6
阶梯3(100个)→ 取第(5-3+2)=5个系数 1.09 → 售价 $40×1.09 = $43.6
```
---
#### 类型B:ladderType = 2(新逻辑:以售价组配置为准)
**业务场景:**
运营希望统一某些商品的阶梯展示格式,不管供应商上传了什么阶梯,都按照售价组配置的固定阶梯来展示。
**处理逻辑:**
1.
**忽略上传的阶梯数量**
,以售价组配置的阶梯为准
2.
以上传的
**第一个阶梯的价格**
为基础(作为成本价)
3.
乘以售价组各阶梯的利润系数,生成固定格式的阶梯价
**示例:**
```
上传的阶梯:
- 5个:¥100(成本价)
- 50个:¥90(成本价)
- 200个:¥80(成本价)
售价组配置(固定阶梯):
- 1个:利润系数 1.15
- 10个:利润系数 1.12
- 100个:利润系数 1.10
- 1000个:利润系数 1.08
处理方式(以第一个阶梯价格为基础):
基础成本价 = ¥100
生成的阶梯价:
- 1个:¥100 × 1.15 = ¥115(售价组配置的阶梯数量)
- 10个:¥100 × 1.12 = ¥112(售价组配置的阶梯数量)
- 100个:¥100 × 1.10 = ¥110(售价组配置的阶梯数量)
- 1000个:¥100 × 1.08 = ¥108(售价组配置的阶梯数量)
注意:
- 最终展示的阶梯数量和数量值,完全由售价组配置决定
- 上传的其他阶梯(50个、200个)被忽略
```
**两种类型的对比:**
| 对比项 | ladderType = 1(老逻辑) | ladderType = 2(新逻辑) |
|-------|------------------------|------------------------|
| 阶梯数量来源 | 以上传的阶梯为准 | 以售价组配置为准 |
| 阶梯数量值 | 供应商上传的数量 | 售价组配置的数量 |
| 利润系数取值 | 倒推取值 | 正序取值 |
| 适用场景 | 尊重供应商的阶梯设置 | 统一商品阶梯展示格式 |
#### 情况B:代购供应商(从第三方采购)
**流程说明:**
1.
**获取三个系数:**
**A. 折扣系数(`GetDiscountRatio`):**
-
**数据来源**
:Redis
`magic_cube_channel_discount_daigou`
-
**适用对象**
:代购供应商(supplier_id ≠ 17)
-
**作用**
:对供应商提供的原始采购价进行折扣调整
-
**匹配逻辑**
:与专营供应商相同,按优先级(商品名称 > 品牌 > 默认)匹配
-
**典型值**
:0.90 ~ 0.98(根据供应商合作折扣而定)
**B. 售价组系数(`GenerateLadderPrice` 或售价组配置):**
-
**作用**
:在成本价基础上加上利润率
-
**来源**
:售价组配置的
`priceRatioList`
-
**典型值**
:1.05 ~ 1.20(5% ~ 20%利润)
**C. 供应商系数:**
-
**作用**
:供应商级别的额外加成(如有)
2.
**计算成本价(应用折扣系数):**
```
美金成本 = 原始采购价 × 折扣系数
人民币成本 = 原始采购价 × 汇率 × 关税 × 折扣系数
```
3. **计算售价(应用售价组系数):**
```
美金售价 = 美金成本 × 售价组系数
人民币售价 = 人民币成本 × 售价组系数
```
**完整公式串联:**
```
人民币售价 = 原始采购价 × 汇率 × 关税 × 折扣系数 × 售价组系数
美金售价 = 原始采购价 × 折扣系数 × 售价组系数
```
**特殊供应商说明:**
- **MRO(1688)**:只有人民币价格,直接作为成本价
- **Digikey(7)**:可能同时有人民币和美金价格
**价格计算示例:**
```
原始采购价:$100
折扣系数:0.95
售价组系数:1.15(15%利润)
汇率:7.2
关税:1.13
计算过程:
美金成本 = $100 × 0.95 = $95
美金售价 = $95 × 1.15 = $109.25
人民币成本 = $100 × 7.2 × 1.13 × 0.95 = ¥772.2
人民币售价 = ¥772.2 × 1.15 = ¥888.03
```
### 第二步:生成自定义价格(getCustomPriceList)
**业务场景:**
除了标准售价外,还需要展示会员价、企业价等多种价格。
**流程说明:**
1. 根据组织ID从Redis获取自定义价格规则
2. 每条规则包含:价格名称(如"会员价")+ 利润比例(如10%)
3. 在标准售价基础上,应用不同的利润率,生成多套阶梯价
**举个栗子:**
```
标准售价阶梯:
-
1个:¥100
-
10个:¥95
-
100个:¥90
自定义价格配置:
-
会员价:利润10%
-
企业价:利润5%
生成结果:
会员价阶梯:
-
1个:¥100 × 1.10 = ¥110
-
10个:¥95 × 1.10 = ¥104.5
-
100个:¥90 × 1.10 = ¥99
企业价阶梯:
-
1个:¥100 × 1.05 = ¥105
-
10个:¥95 × 1.05 = ¥99.75
-
100个:¥90 × 1.05 = ¥94.5
```
### 第三步:应用活动价格(GetActivityPrice)
**业务场景:**
商品参与促销活动时,需要计算活动价并展示给用户。
**核心判断条件(同时满足才计算活动价):**
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(红色高亮)
```
---
## 三、爱智/华云的价格生成流程
爱智的价格逻辑比较复杂,因为需要兼容**历史遗留数据**和**新的价格体系**。
### 第一步:判断是否为寄售商品
**判断条件:** `source == 12`
**处理逻辑:**
- **是寄售商品**:直接跳过价格体系,使用上传的价格
- **非寄售商品**:继续后续判断
### 第二步:判断数据类型(老数据 vs 新数据)
根据阶梯价的数量和格式,判断是老数据还是新数据:
#### 情况A:老数据格式(直接展示,不走价格体系)
**老数据的三种情况:**
| 阶梯数量 | 第一个阶梯 | 数据说明 | 处理方式 |
|---------|-----------|---------|---------|
| 2个 | 数量≠0 | 旧版格式(标准价+企业价)| GetIEdgePrice处理 |
| 3个 | 数量=0 | 新版格式(成本价+会员价+企业价)| GetIEdgePrice处理,删除成本价 |
| 4个 | 数量=0 | 新版格式(成本+会员+企业+限价)| GetIEdgePrice处理,取中间两个 |
**GetIEdgePrice处理逻辑:**
1. **给每个阶梯添加价格名称:**
- 数量0 → "成本价"
- 数量1 → "标准价"
- 数量2 → "企业价"
- 数量3 → "销售限价"
2. **过滤不需要展示的价格:**
- 3个阶梯时:删除第一个(成本价),只展示标准价+企业价
- 4个阶梯时:取中间两个(标准价+企业价)
**举个栗子(3个阶梯):**
```
上传的数据:
-
数量0:¥50(成本价)
-
数量1:¥100(标准价)
-
数量2:¥80(企业价)
处理后展示:
-
数量1:标准价 ¥100
-
数量2:企业价 ¥80
成本价内部保留,前端不展示
```
#### 情况B:新数据格式(走价格体系)
**判断条件:**
- 阶梯数量为2
- 第一个阶梯数量为0(即成本价)
**处理流程:**
1. **预处理阶梯价:**
如果同时有成本价和销售限价,去掉销售限价(因为走价格体系的前提是有成本价)
```
原始:[成本价, 销售限价]
处理后:[成本价]
```
2. **走标准价格体系:**
和猎芯的流程一样:
- GetCoefficientAndPrice(基础价格计算)
- getCustomPriceList(生成自定义价格)
3. **华云格式转换(transformIEdgeLadderPrice):**
为了让华云的老系统能正常显示,需要将自定义价格转换成特定的格式:
```
转换前(自定义价格):
- 会员价:数量100,价格¥90
- 企业价:数量100,价格¥85
转换后(华云格式):
- 数量1:标准价 ¥90
- 数量2:企业价 ¥85
```
### 第三步:应用活动价格
和猎芯的活动价处理逻辑基本一致,但有以下特殊点:
**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位小数,计算方式相同。
---
## 四、特殊供应商的币种转换
有些供应商存入"美金"字段的实际上不是美金,需要进行币种转换:
| 供应商 | 原始币种 | 转换逻辑 |
|-------|---------|---------|
| Element14(6)| 港币 | 港币 → 人民币 → 美金 |
| RS(21)| 人民币 | 人民币 → 美金 |
| Buerklin(1676)| 欧元 | 欧元 → 人民币 → 美金 |
**转换示例(Element14):**
```
原始价格:100港币
港币汇率:0.92(1港币 = 0.92人民币)
美金汇率:7.2(1美金 = 7.2人民币)
计算:
人民币 = 100 × 0.92 = 92元
美金 = 92 ÷ 7.2 = $12.78
```
---
## 五、后续处理
### 1. 自营成本价处理(GetCostForZiying)
针对自营供应商的特殊成本价处理。
### 2. 最小起订量校验
```
规则:最小起订量 ≥ 阶梯价的最小数量
示例:
-
商品设置的最小起订量:5个
-
阶梯价最小数量:10个
-
最终结果:最小起订量改为10个
```
---
## 六、总结对比表
| 组织 | 价格体系 | 主要特点 |
|-----|---------|---------|
| 猎芯(1)| 标准体系 | 通过系数计算价格,支持多种自定义价格 |
| 爱智(3)| 兼容体系 | 需要判断数据版本,老数据直接展示,新数据走价格体系 |
| 寄售商品 | 跳过体系 | 直接使用上传的价格 |
---
## 七、关键术语解释
| 术语 | 说明 |
|-----|------|
| 阶梯价 | 不同采购数量对应的不同价格,数量越多单价越低 |
| 成本价 | 采购成本,内部使用 |
| 标准价 | 普通用户看到的售价 |
| 会员价 | 会员用户专享价格 |
| 企业价 | 企业客户专享价格 |
| 折扣系数 | 对成本价的折扣比例 |
| 售价组系数 | 不同利润档位 |
| 最小起订量(MOQ)| 单次采购的最低数量要求 |
---
*文档编写时间:2025年4月*
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment