# 外卖多国扩展需求设计文档

## 项目概述

将现有外卖系统扩展至泰国、菲律宾、马来西亚、印尼，不新建系统，在现有台湾外卖基础上开多语言版本，分区域点餐。台湾上架时同步开通这四个国家的下载。不同定位展示不同商家，数据不隔离。

**目标国家：** 台湾（已有）、泰国（TH）、菲律宾（PH）、马来西亚（MY）、印尼（ID）

---

## 1. 待确认需求

### 1.1 用户国家识别方式（待定）

用户打开 App 后，系统如何确定他应该看到哪个国家的商家。以下四种方案待选定：

#### 方案 A：GPS 定位自动判断

根据用户当前 GPS 经纬度调用 Google Maps 反向地理编码，自动确定国家。

| 优点 | 缺点 |
|------|------|
| 用户零操作，体验最顺滑 | GPS 权限被拒绝时无法工作 |
| 最准确，不存在选错的问题 | 首次加载慢（要等定位 + API 返回） |
| 适合外卖场景（本身就是本地服务） | 跨境用户（边境城市）可能误判 |
| 不需要额外的 UI 入口 | 调 Google Maps API 有费用 |

#### 方案 B：用户手动选择国家

App 首页或设置页提供国家切换入口（类似 Shopee 顶部国家标签）。

| 优点 | 缺点 |
|------|------|
| 实现最简单，不依赖 GPS 和外部 API | 用户可能选错国家，看到无关商家 |
| 响应快，无等待 | 用户换国家时需要手动操作，容易忘 |
| 完全可控 | 每个新用户都要多一步操作 |
| 适合"浏览型"场景 | 和外卖"就近点餐"的逻辑矛盾 |

#### 方案 C：GPS 自动 + 手动切换

默认 GPS 自动判断国家，但在 App 顶部提供切换入口。

| 优点 | 缺点 |
|------|------|
| 兼顾自动和灵活 | 实现复杂度最高 |
| 覆盖 GPS 不可用的 fallback | 需要额外设计国家切换 UI |
| 支持帮异地朋友点餐等场景 | 切换后商家列表要全部刷新 |
| 用户体验最优 | 两个逻辑路径都要测试和维护 |

#### 方案 D：注册时绑定国家

用户注册时选择所在国家，之后固定展示该国商家。

| 优点 | 缺点 |
|------|------|
| 实现简单，一次选择终身生效 | 用户搬家/换国家后很不方便 |
| 不依赖 GPS | 出差/旅游时无法使用当地外卖 |
| 数据归属清晰 | 不适合东南亚人群流动频繁的场景 |
| 注册信息即国家信息 | 修改国家可能涉及钱包余额等复杂问题 |

**初步建议：方案 C**，可分阶段实施（先 GPS 自动，后加手动切换）。

---

## 2. 已确认需求

### 2.1 核心原则

- **不新建系统** — 复用现有台湾外卖代码，多语言 + 分区域
- **数据不隔离** — 所有国家共享同一数据库
- **定位驱动商家列表** — 不同位置搜索到的商家不同
- **同步上架** — 台湾上架时同步开通 TH/PH/MY/ID 的 App 下载

### 2.2 当前系统现状（已确认可行）

| 能力 | 状态 | 说明 |
|------|------|------|
| 定位搜商家 | 已支持 | `ST_DISTANCE()` 按经纬度排序，`area` 字段过滤 |
| 数据不隔离 | 已支持 | 单库架构，无需改动 |
| 多语言框架 | 已支持 | 已有 zh_CN/zh_TW/en/vi 四种语言的 i18n |
| 区域点餐 | 已支持 | 商家按 area + 经纬度距离过滤 |

### 2.3 必须改造的模块（已确认）

| 问题 | 严重程度 | 说明 |
|------|----------|------|
| 无国家/地区字段 | 高 | `pos_store` 需加 `country` 字段，商家查询加国家过滤 |
| 货币固定 VND | 高 | 需按国家配置货币（THB/PHP/MYR/IDR/TWD） |
| 支付只有 ZaloPay | 高 | 各国需对接本地主流支付方式 |
| 商家注册无国家信息 | 中 | 入驻流程需加国家选择 |
| Google Maps Key 管理 | 低 | 各国共用 Google Maps，注意 API 配额 |

---

## 3. 待讨论需求

以下问题尚未讨论，后续逐一确认：

### 3.1 货币与定价（已确认）
- **各国独立定价** — 同一品牌在各国使用不同商家号管理，各自独立维护菜品和价格，不存在跨国同商品定价问题
- 各商家号绑定所在国家，使用当地货币定价（TH/THB, PH/PHP, MY/MYR, ID/IDR, TW/TWD）
- 平台佣金比例是否各国不同？待确认

### 3.2 支付方式（待调研）
- 每个国家需要接入哪些本地支付？**待调研后确定**
  - 泰国候选：PromptPay, TrueMoney
  - 菲律宾候选：GCash, Maya
  - 马来候选：Touch'n Go, FPX
  - 印尼候选：GoPay, OVO
  - 台湾：待确认
- 接入策略待定：每国一种 / 每国 2-3 种 / 聚合支付平台
- 钱包余额是否按国家隔离？待确认
- 跨国充值/提现如何处理？待确认

### 3.3 多语言（待定）
- 每个国家需要支持哪些语言？待定
  - 候选方案 A：当地语言 + 英语
  - 候选方案 B：中文 + 英语 + 当地语言
  - 候选方案 C：各国不同，逐个确认
- 商家端的语言支持范围？待定
- 菜品名称是否需要商家自己填多语言版本？待定

### 3.4 商家管理（待定）
- 商家入驻审核是各国独立还是统一管理？待定
  - 候选方案 A：统一后台，通过国家字段筛选区分
  - 候选方案 B：各国独立管理后台
- 商家可以同时在多国营业吗？待定（已确认同一品牌用不同商家号管理）
- 各国的商家分类/标签是否统一？待定

### 3.5 配送与骑手（待定）
- 配送费计算规则各国是否不同？待定
  - 候选方案 A：统一算法 + 各国参数配置
  - 候选方案 B：各国独立规则
- 骑手是按国家分开管理还是统一？待定
- 配送范围（公里数）各国是否不同？待定

### 3.6 法律与合规（待定）
- 各国的税务处理（增值税/消费税）？待定
- 食品安全认证要求是否不同？待定
- 隐私政策和用户协议是否需要各国版本？待定

### 3.7 运营与后台（待定）
- 后台管理是否需要按国家区分权限？待定
- 各国的促销/优惠券活动是否独立？待定
- 客服系统是否按国家分开？待定

---

## 4. 技术架构

### 4.1 当前技术栈

- Spring Boot 3.3.5 + Java 21
- MyBatis-Plus 3.0.3 + MySQL 8.2.0
- Redis 缓存
- Google Maps API（地理编码、路线）
- ZaloPay（越南支付）
- JWT 认证

### 4.2 核心改造点（概要，详细方案待确认后补充）

1. **商家查询** — `PosStoreMapper` 加 `country` 过滤
2. **货币系统** — 按国家配置货币单位
3. **支付网关** — 按国家路由到不同支付渠道
4. **商家入驻** — 注册时绑定国家
5. **App 配置** — 按国家加载语言、货币、支付方式

---

*文档状态：需求收集中，待逐项确认后完善*
