Commit 54eee31e by 杨树贤

暂时版本

parent 8ed2a0f5
# 价格生成逻辑文档
## 概述
本文档详细描述 `LyService.LyGoodsDetail` 方法中的价格生成逻辑,该逻辑根据组织ID(`org_id`)对不同类型的供应商采用不同的价格处理策略。
## 组织类型
| OrgId | 组织名称 | 说明 |
|-------|----------|------|
| 0 | 兼容旧价格体系 | 为兼容价格体系之前的数据保留 |
| 1 | 猎芯 | 采用标准价格体系 |
| 3 | 爱智/华云 | 需要兼容老数据和新价格体系 |
---
## 价格生成主流程
```
switch sku.OrgId
├── case 0: 空处理(兼容旧数据)
├── case 1: 猎芯价格体系
│ ├── GetCoefficientAndPrice() → 获取系数和计算价格
│ ├── getCustomPriceList() → 获取自定义价格
│ └── GetActivityPrice() → 获取活动价格
└── case 3: 爱智/华云价格体系
├── 寄售商品判断 (source == 12) → 跳过价格体系
└── 老数据兼容判断
├── 老数据格式 → GetIEdgePrice() → 处理爱智特定价格格式
└── 新价格体系 → 标准价格体系流程 + transformIEdgeLadderPrice()
└── GetActivityPrice() → 获取活动价格
GetCostForZiying() → 处理自营成本价
```
---
## 猎芯组织 (OrgId = 1) 价格流程
### 1. GetCoefficientAndPrice()
核心价格计算方法,根据供应商类型分为两条路径:
#### 专卖供应商 (supplier_id = 17)
**流程:**
1. 处理特殊供应商价格 (`TransformSpecialSupplierPrice`)
2. 处理香港自营渠道 (`L0018562`) 汇率转换
3. 获取折扣系数 (`GetDiscountRatio`)
4. 应用折扣系数到价格
**关键逻辑:**
```go
// 香港自营特殊处理:WMS同步的美金未税成本价需要转换
if sku.Canal == "L0018562" {
// 1. 获取实时汇率
// 2. 计算人民币含税价格(汇率 × 关税1.13)
// 3. 生成阶梯价
}
```
#### 代购供应商
**流程:**
1. 获取折扣系数 (`GetDiscountRatio`)
2. 获取售价组系数 (`GetPriceRatio`)
3. 获取供应商系数 (Redis: `pool_supplier_ratio`)
4. 计算成本价和售价
**价格计算公式:**
```
成本价(美金) = 原始美金价 × 折扣系数(美金)
售价(美金) = 成本价(美金) × 售价组系数(美金)
成本价(人民币) = 原始美金价 × 汇率 × 关税(1.13) × 折扣系数(人民币)
售价(人民币) = 成本价(人民币) × 售价组系数(人民币)
```
**特殊供应商处理:**
- MRO (supplier_id=1688):只有人民币价格,直接作为成本价
- Digikey (supplier_id=7):可能同时有人民币和美金价格
### 2. getCustomPriceList()
根据组织ID获取自定义价格配置,生成多个自定义价格阶梯。
```go
// 例如:会员价利润10%,企业价利润5%
// 会在基础价格上应用不同的利润率系数
customPriceList = [
{PriceName: "会员价", LadderPrice: [...]},
{PriceName: "企业价", LadderPrice: [...]}
]
```
### 3. GetActivityPrice()
应用活动价格(折扣/特价活动)。
---
## 爱智组织 (OrgId = 3) 价格流程
### 特殊判断逻辑
爱智组织需要处理**历史遗留数据****新价格体系**的兼容问题。
#### 1. 寄售商品跳过
```go
if sku.Source == 12 {
break // 寄售商品不走价格体系
}
```
#### 2. 老数据兼容判断
**老数据特征:**
| 阶梯数量 | 第一个阶梯条件 | 数据类型 | 处理方式 |
|----------|----------------|----------|----------|
| 2 | `Purchases != 0` | 老数据 | GetIEdgePrice() |
| 3 | `Purchases == 0` | 新配置(成本+会员+企业) | GetIEdgePrice() |
| 4 | `Purchases == 0` | 新配置(成本+会员+企业+限价) | GetIEdgePrice() |
**老数据处理 (GetIEdgePrice):**
```go
// Purchases 值映射到价格名称
0 "成本价"
1 "标准价"
2 "企业价"
3 "销售限价"
// 过滤规则:
// - 3个阶梯:删除第一个(成本价),保留标准价+企业价
// - 4个阶梯:取中间两个(标准价+企业价)
```
#### 3. 走价格体系的最新配置
**条件:**
- 阶梯数量为2,第一个阶梯是0(成本价 + 销售限价)
**处理流程:**
1. 去掉销售限价(因为走价格体系的前提是有成本价)
```go
if len(sku.LadderPrice) == 2 {
sku.LadderPrice = sku.LadderPrice[:1] // 只保留成本价
}
```
2. 走标准价格体系(同猎芯流程)
- `GetCoefficientAndPrice()`
- `getCustomPriceList()`
3. 华云阶梯价特殊转换 (`transformIEdgeLadderPrice`)
```go
// 华云兼容格式:
// 自定义价格 → 转换为2个阶梯的格式
// purchases=1: 标准价
// purchases=2: 企业价
```
---
## 关键数据结构
### LadderPrice(阶梯价格)
```go
type LadderPrice struct {
Purchases int64 // 购买数量
PriceUs float64 // 美金售价
PriceCn float64 // 人民币售价
PriceCostUs float64 // 成本价美金
PriceCostCn float64 // 成本价人民币
PriceAc float64 // 活动价人民币
PriceAcUs float64 // 活动价美金
PriceName string // 价格名称(华云专用)
}
```
### 华云价格名称映射
```go
priceNameMap := map[int64]string{
0: "成本价",
1: "标准价",
2: "企业价",
3: "销售限价",
}
```
---
## 特殊供应商汇率处理 (TransformSpecialSupplierPrice)
针对存入"美金"字段但实际是其他币种的供应商进行转换:
| 供应商ID | 原始币种 | 处理方式 |
|----------|----------|----------|
| 6 (Element14) | 港币 | 港币 → 人民币 → 美金 |
| 21 (RS) | 人民币 | 人民币 → 美金 |
| 1676 (Buerklin) | 欧元 | 欧元 → 人民币 → 美金 |
**汇率转换流程:**
1. 获取币种转人民币汇率 (`erp_rate`)
2. 人民币转美金汇率 = 币种汇率 ÷ 美金汇率
3. 应用转换到阶梯价
---
## 后续处理
### GetCostForZiying()
处理自营供应商的成本价。
### 最小起订量校验
```go
// 最小起订量要大于等于阶梯价的最小阶梯数量
if purchases > sku.Moq {
sku.Moq = purchases
}
```
---
## 总结
1. **猎芯 (OrgId=1)**:标准价格体系,通过系数计算生成阶梯价
2. **爱智 (OrgId=3)**:复杂兼容逻辑,需要判断数据版本并选择不同的处理路径
3. **核心公式**:成本价 × 利润系数 = 售价
4. **关键系数**:折扣系数、售价组系数、供应商系数
---
*文档生成时间:2025年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