Files
FlowPilot/docs/md/手机接码价格区间与最低购买价开发方案.md
2026-05-15 06:40:53 +08:00

183 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 手机接码价格区间与最低购买价开发方案
## 1. 需求结论
本次需求不是把“价格上限”改成一个可解析字符串,而是要在现有接码价格逻辑上新增一个独立的最低购买价边界,让用户能配置:
- 只设上限
- 只设下限
- 上下限都设
- 仍然保留“指定档位”作为独立偏好
最终结论:
1. 不建议把上限文本框直接改成“范围字符串”。
2. 建议在当前价格控制区内新增一个独立的“最低购买价”输入。
3. 价格区间采用**闭区间**语义,两个边界都可空。
4. `指定档位` 不并入区间字段,只在区间内才生效。
5. 现有的内部换档下限 `countryPriceFloorByCountryId` 继续保留,不和用户可配最低价混用。
## 2. 需求符合性分析
### 2.1 符合的部分
- 低价号过滤是明确业务诉求,和当前“只看上限”确实不匹配。
- 用户希望继续保留指定档位,说明这是“筛选 + 偏好”组合,而不是单纯范围匹配。
- 当前价格控制区本来就集中在同一块,适合扩展为区间控制,不需要拆散到别的区域。
### 2.2 不足和潜在冲突
1. **直接复用上限做范围解析不稳**
- 会把“上限”语义和“范围”语义混在一起。
- 还会让 `指定档位` 的优先级变得不清楚。
2. **最低价不能复用 `heroSmsPreferredPrice`**
- `heroSmsPreferredPrice` 是“指定档位”,不是下限。
- 两者语义完全不同,混用会造成维护和排障困难。
3. **用户最低价和内部换档下限不是同一层**
- `countryPriceFloorByCountryId` 是 Step 9 内部避让逻辑。
- 用户最低购买价是配置项。
- 两者必须分开,否则会互相污染。
4. **区间反转是边界问题**
- 如果最低价大于上限,逻辑上是无效区间。
- 这个状态必须显式处理,不能默默当成正常配置。
5. **区间和指定档位的关系要明确**
- 指定档位只有在区间内才应参与排序。
- 超出区间的指定档位应忽略,不应反向突破边界。
## 3. 设计方案
### 3.1 字段模型
建议保留现有字段结构,只新增最低价字段:
- `heroSmsMinPrice`
- `heroSmsMaxPrice`
- `heroSmsPreferredPrice`
- `fiveSimMinPrice`
- `fiveSimMaxPrice`
其中:
- `heroSmsMinPrice` 兼容 HeroSMS / NexSMS
- `fiveSimMinPrice` 仅服务 5sim
- `heroSmsPreferredPrice` 保持原语义,不改名
### 3.2 UI 位置
价格区仍放在当前 `row-hero-sms-max-price` 这一块里,不另起炉灶。
建议布局为:
- `最低购买价`
- `价格上限`
- `指定档位`
- `号码复用`
这样用户一眼就能看出这四项是一组策略,不会散到别的位置。
### 3.3 逻辑规则
1. 先按价格区间过滤候选。
2. 再应用指定档位排序。
3. 再按平台自身规则进行换档、重试、兜底。
4. 当区间内没有可用价格时,显示“无可用号源”类提示,而不是继续尝试区间外价格。
### 3.4 取号语义
建议统一成如下顺序:
```mermaid
flowchart TD
A["读取当前 provider 的最低价/上限/指定档位"] --> B["收集平台候选价格"]
B --> C["过滤掉区间外价格"]
C --> D{"指定档位是否仍在区间内"}
D -->|是| E["优先尝试指定档位"]
D -->|否| F["忽略指定档位"]
E --> G["按平台规则排序并取号"]
F --> G
G --> H{"是否仍无可用号源"}
H -->|是| I["输出范围相关诊断/提示"]
H -->|否| J["继续验证码和后续流程"]
```
## 4. 开发清单
### 阶段 1:字段与持久化
目标:
- 新增最低价字段默认值
- 新增归一化逻辑
- 新增保存/回显/导入兼容
- 不破坏旧配置
自检项:
- 保存后能否正确回显
- 旧配置导入后是否保持可用
- 新旧字段是否存在命名冲突
- 是否有乱码或字段缺失
### 阶段 2UI 改造
目标:
- 在现有价格区内新增最低购买价输入
- 调整文案为“价格区间”
- 保持控件布局整齐,不把新输入塞到别的区域
自检项:
- 侧边栏宽度下是否挤压、换行错乱
- 输入框宽度是否足够
- 切换 provider 时回显是否正确
- 文案是否统一、无错别字、无乱码
### 阶段 3:取号与预览逻辑
目标:
- HeroSMS / NexSMS / 5sim 都按区间过滤候选
- 指定档位仅在区间内生效
- 预览文案同步展示区间后的结果
- 无号源提示能反映“区间过窄/区间反转/无可用档位”
自检项:
- 只设上限是否仍与现有行为一致
- 只设下限是否能正常过滤低价
- 上下限同时设置是否只保留区间内候选
- 指定档位超出区间时是否被正确忽略
-`countryPriceFloorByCountryId` 是否仍然隔离
### 阶段 4:测试与全量复审
目标:
- 补齐单测
- 回归 sidepanel、background、preview、保存/切换
- 全量检查无遗漏后再提交
自检项:
- 运行测试是否通过
- 新增字段是否所有路径都覆盖
- 是否还有未同步的文案/默认值/回显逻辑
- 是否存在边界问题或乱码
## 5. 完成标准
本需求只有在以下条件同时满足时才算完成:
1. 新的最低购买价能正确保存、回显、切换、导入。
2. 价格区间在 HeroSMS / NexSMS / 5sim 的候选过滤中生效。
3. 指定档位不会突破区间边界。
4. 预览与无号源提示和真实取号逻辑一致。
5. 代码、测试、文案、注释都没有乱码和明显冲突。
6. 全量复审通过后再写中文提交信息并提交。