日期:2026-07-22 | 优先级:P1
实现包月车(月卡/季卡/年卡)的办理、续费、到期管理。办卡自动加入白名单,到期自动移除,进出场复用现有白名单检查逻辑。
选车辆 → 选卡类型 → 自动计算到期日 → 确认办理
├── INSERT monthly_card
├── INSERT shortlist (白名单 + ExpirationTime)
└── INSERT payment_record
复用现有白名单检查(passage.go / vehicle.go),零改动。月卡到期后短名单自动失效。
车辆进出场时,若白名单 ExpirationTime < now,前端/后端提示已到期。
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 | 收银记录 |
新增菜单:停车管理 → 包月车管理
┌─────────────────────────────────────────┐
│ 包月车管理 │
│ │
│ [办理月卡] │
│ │
│ ┌───────────────────────────────────────┐│
│ │ 列表:车牌 | 卡类型 | 生效日期 | 到期日 ││
│ │ 金额 | 状态 | 操作(续费/退卡) ││
│ └───────────────────────────────────────┘│
└─────────────────────────────────────────┘
办理弹窗:
车牌号选择器 → 卡类型(月/季/年) → 自动显示到期日 → 金额输入 → 确认
续费:点击续费 → 选续费时长 → 确认(end_date 延长 + 更新 shortlist)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /monthly-card/create | 办理月卡 |
| POST | /monthly-card/renew | 续费 |
| GET | /monthly-card/list | 列表(车牌/类型/状态筛选) |
| DELETE | /monthly-card/refund | 退卡 |
| 文件 | 操作 | 说明 |
|---|---|---|
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 |
修改 | 翻译键 |
| 场景 | 处理 |
|---|---|
| 一辆车多次办卡 | 只能有一条有效记录,续费延长到期日 |
| 到期后车辆进出 | 白名单 ExpirationTime 过期,按临时车计费 |
| 退卡 | 标记 refunded,从 shortlist 移除 |
| 月卡到期当天 | 当天仍有效(23:59:59 前) |