# 包月车管理 — 设计文档

> 日期：2026-07-22 | 优先级：P1

## 1. 目标

实现包月车（月卡/季卡/年卡）的办理、续费、到期管理。办卡自动加入白名单，到期自动移除，进出场复用现有白名单检查逻辑。

## 2. 核心设计

### 办卡 = 自动白名单

```
选车辆 → 选卡类型 → 自动计算到期日 → 确认办理
  ├── INSERT monthly_card
  ├── INSERT shortlist (白名单 + ExpirationTime)
  └── INSERT payment_record
```

### 进出场识别

复用现有白名单检查（passage.go / vehicle.go），零改动。月卡到期后短名单自动失效。

### 到期处理

车辆进出场时，若白名单 `ExpirationTime < now`，前端/后端提示已到期。

## 3. 数据模型

### 新增表：`monthly_card`

| 字段 | 类型 | 说明 |
|------|------|------|
| id | uint | 主键 |
| vehicle_id | uint | 关联 vehicle.id |
| card_type | string | month / quarter / year |
| start_date | date | 生效日期 |
| end_date | date | 到期日期 |
| fee | float64 | 实收金额 |
| payment_status | string | paid / refunded |
| operator_id | uint | 办理人 |
| remark | string | 备注 |

### 复用表

| 表 | 用途 |
|------|------|
| shortlist | 白名单 + ExpirationTime = end_date |
| payment_record | 收银记录 |

## 4. 页面结构

新增菜单：**停车管理 → 包月车管理**

```
┌─────────────────────────────────────────┐
│ 包月车管理                              │
│                                         │
│ [办理月卡]                               │
│                                         │
│ ┌───────────────────────────────────────┐│
│ │ 列表：车牌 | 卡类型 | 生效日期 | 到期日 ││
│ │ 金额 | 状态 | 操作(续费/退卡)         ││
│ └───────────────────────────────────────┘│
└─────────────────────────────────────────┘
```

**办理弹窗**：
```
车牌号选择器 → 卡类型(月/季/年) → 自动显示到期日 → 金额输入 → 确认
```

**续费**：点击续费 → 选续费时长 → 确认（end_date 延长 + 更新 shortlist）

## 5. API

| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /monthly-card/create | 办理月卡 |
| POST | /monthly-card/renew | 续费 |
| GET | /monthly-card/list | 列表（车牌/类型/状态筛选） |
| DELETE | /monthly-card/refund | 退卡 |

## 6. 文件变更

| 文件 | 操作 | 说明 |
|------|------|------|
| `internal/dao/monthly_card.go` | 新增 | DAO 实体 |
| `internal/modules/monthly/api.go` | 新增 | Handler + Router |
| `internal/modules/monthly/service/service.go` | 新增 | 办理/续费/退卡 |
| `internal/modules/monthly/repository/repo.go` | 新增 | CRUD |
| `internal/initialize/router.go` | 修改 | 注册路由 |
| `internal/initialize/gorm.go` | 修改 | AutoMigrate |
| `internal/initialize/seed.go` | 修改 | 菜单+权限 |
| `frontend/src/view/parking/monthlyCard.vue` | 新增 | 包月车管理页面 |
| `frontend/src/api/monthlyCard.js` | 新增 | API 封装 |
| `frontend/src/lang/zh-CN.js, en.js` | 修改 | 翻译键 |

## 7. 边界情况

| 场景 | 处理 |
|------|------|
| 一辆车多次办卡 | 只能有一条有效记录，续费延长到期日 |
| 到期后车辆进出 | 白名单 ExpirationTime 过期，按临时车计费 |
| 退卡 | 标记 refunded，从 shortlist 移除 |
| 月卡到期当天 | 当天仍有效（23:59:59 前） |
