# 商家前端账单功能需求

## 背景

平台管理后台已有账单管理页面（`Billing/billing/index`），但商家前端（foodie-store）缺少账单功能。需要为商家前端新增"财务管理"模块，包含账单查询功能。

## 用户类型与权限

| userType | 角色 | 账单可见范围 |
|----------|------|-------------|
| 1 | 商家 | 自己名下所有门店的账单（user_id 查询，可选按 mdId 筛选） |
| 4 | 摊位主/门店 | 仅自己关联门店的账单（md_id 过滤） |

## 数据模型

### UserBilling 表（已有，无需变更）

已有 `md_id` 字段，账单记录创建时会写入门店 ID。

### 账单类型

| type | 含义 |
|------|------|
| 0 | 分成（收入） |
| 1 | 充值 |
| 2 | 提现 |
| 3 | 消费 |
| 4 | 金额冻结 |
| 5 | 金额解冻 |
| 6 | 抽成返还 |

### 账单状态

| state | 含义 |
|-------|------|
| 0 | 完成 |
| 1 | 退回 |
| 2 | 作废 |
| 3 | 未支付 |

## 后端接口

### 新增接口

#### 1. GET /billing/storeBillingList — 商家端账单列表

参数：
- `mdId`（可选）— 按门店筛选
- `type`（可选）— 账单类型
- `startDate` / `endDate`（可选）— 时间范围
- `pageNum` / `pageSize` — 分页

权限逻辑：
- userType=1（商家）：查 `user_billing WHERE user_id = 当前用户`，可选按 mdId 筛选
- userType=4（摊位主）：查 `info_user.store_id` 获取门店 → 查 `user_billing WHERE md_id = 门店ID`

返回：分页账单列表 + 门店信息

#### 2. GET /billing/storeBillingSummary — 商家端账单汇总

参数同上。

返回：`{ totalAmount, totalDivvy, netIncome }`

### 修改接口

现有 `getzddaylist`、`getzdmeeklist`、`getzdmatlist` 查询需增加 `mdId` 可选过滤条件。

#### GET /billing/getzddaylist（修改）

新增参数：
- `mdId`（可选）— 按门店筛选

影响范围：
- `UserBillingMapper.getdaylist` — SQL 增加 `(#{mdId} IS NULL OR md_id = #{mdId})`
- `UserBillingMapper.getdaysum` — SQL 增加 `(#{mdId} IS NULL OR md_id = #{mdId})`
- `UserBillingMapper.getShDaysum` — SQL 增加 `(#{mdId} IS NULL OR b.md_id = #{mdId})`

#### GET /billing/getzdmeeklist（修改）

新增参数：
- `mdId`（可选）— 按门店筛选

影响范围：
- `UserBillingMapper.getmeeklist` — SQL 增加 `(#{mdId} IS NULL OR md_id = #{mdId})`
- `UserBillingMapper.getmeeksum` — SQL 增加 `(#{mdId} IS NULL OR md_id = #{mdId})`
- `UserBillingMapper.getShMeeksum` — SQL 增加 `(#{mdId} IS NULL OR b.md_id = #{mdId})`

#### GET /billing/getzdmatlist（修改）

新增参数：
- `mdId`（可选）— 按门店筛选

影响范围：
- `UserBillingMapper.getmatlist` — SQL 增加 `(#{mdId} IS NULL OR md_id = #{mdId})`
- `UserBillingMapper.getmatsum` — SQL 增加 `(#{mdId} IS NULL OR md_id = #{mdId})`
- `UserBillingMapper.getshMonthsum` — SQL 增加 `(#{mdId} IS NULL OR b.md_id = #{mdId})`

## 前端功能

### 新增菜单目录：财务管理

```
财务管理
  └── 账单管理
```

### 账单管理页面

1. **筛选条件**
   - 门店选择（下拉框，商家可切换门店，摊位主只显示自己门店）
   - 账单类型（分成、充值、提现、消费、冻结、解冻、抽成返还）
   - 时间范围选择器

2. **汇总区域**
   - 显示筛选范围内的总金额、总抽成、净收入

3. **账单列表表格**
   - 列：订单号、账单类型、金额、抽成、净收入、门店名称、状态、时间、说明
   - 支持分页

4. **权限区分**
   - 商家（userType=1）：顶部显示门店选择下拉框，可切换查看不同门店
   - 摊位主/门店（userType=4）：无门店选择，自动只显示自己门店数据

## 相关路径

- 商家前端页面：`E:\QtwCode\foodie\foodie-store`
- 管理后台账单页面（参考）：`E:\QtwCode\foodie\foodie-admin-vue\src\views\Billing\billing\index.vue`

## 后端实现状态

| 接口 | 状态 | 说明 |
|------|------|------|
| `GET /billing/storeBillingList` | 已完成 | 商家端账单列表，分页、筛选、权限逻辑 |
| `GET /billing/storeBillingSummary` | 已完成 | 账单汇总，返回 totalAmount/totalDivvy/netIncome |
| `GET /billing/getzddaylist` | 已完成 | 日账单，支持 mdId 可选过滤 |
| `GET /billing/getzdmeeklist` | 已完成 | 周账单，支持 mdId 可选过滤 |
| `GET /billing/getzdmatlist` | 已完成 | 月账单，支持 mdId 可选过滤 |

### 涉及文件

- `ruoyi-admin/src/main/java/com/ruoyi/app/pay/UserBillingController.java` — 控制器
- `ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserBillingMapper.java` — Mapper SQL

### 实现说明

mdId 过滤采用 `(#{mdId} IS NULL OR md_id = #{mdId})` 模式，mdId 不传时查询全部数据，传入时按门店过滤。涉及 join 查询的方法使用表别名前缀 `b.md_id`。
