feat: 迭代

This commit is contained in:
2026-05-08 20:16:34 +08:00
parent 350b9a94a1
commit da0f304a87
49 changed files with 3958 additions and 1004 deletions
+16 -2
View File
@@ -94,7 +94,9 @@ CREATE TABLE `merchants` (
`seller_id` BIGINT UNSIGNED NOT NULL COMMENT '关联商家账户ID',
`shop_name` VARCHAR(100) NOT NULL COMMENT '店铺名称',
`logo` VARCHAR(500) DEFAULT '' COMMENT '店铺Logo',
`hotel_images` TEXT DEFAULT NULL COMMENT '酒店照片,多张URL用逗号分隔',
`description` TEXT COMMENT '店铺描述',
`store_license` VARCHAR(255) DEFAULT NULL COMMENT '门店营业执照',
`phone` VARCHAR(20) NOT NULL COMMENT '联系电话',
`province` VARCHAR(50) DEFAULT '' COMMENT '',
`city` VARCHAR(50) DEFAULT '' COMMENT '',
@@ -103,6 +105,11 @@ CREATE TABLE `merchants` (
`longitude` DECIMAL(10,7) DEFAULT NULL COMMENT '经度',
`latitude` DECIMAL(10,7) DEFAULT NULL COMMENT '纬度',
`business_license` VARCHAR(500) DEFAULT '' COMMENT '营业执照图片',
`contract_type` VARCHAR(20) DEFAULT 'personal' COMMENT '签约类型:personal-个人签约,company-公司签约',
`id_card_front` VARCHAR(255) DEFAULT NULL COMMENT '身份证正面(个人签约)',
`id_card_back` VARCHAR(255) DEFAULT NULL COMMENT '身份证反面(个人签约)',
`legal_id_card_front` VARCHAR(255) DEFAULT NULL COMMENT '法人身份证正面(公司签约)',
`legal_id_card_back` VARCHAR(255) DEFAULT NULL COMMENT '法人身份证反面(公司签约)',
`license_no` VARCHAR(50) DEFAULT '' COMMENT '营业执照编号',
`legal_person` VARCHAR(50) DEFAULT '' COMMENT '法人姓名',
`status` ENUM('pending','approved','rejected','frozen') NOT NULL DEFAULT 'pending' COMMENT '状态',
@@ -112,6 +119,11 @@ CREATE TABLE `merchants` (
`bank_name` VARCHAR(100) DEFAULT '' COMMENT '开户银行',
`bank_account` VARCHAR(50) DEFAULT '' COMMENT '银行账号',
`account_name` VARCHAR(50) DEFAULT '' COMMENT '账户名',
`account_type` VARCHAR(20) DEFAULT 'company' COMMENT '账户类型:company-对公账户,personal-对私账户',
`bank_branch` VARCHAR(100) DEFAULT NULL COMMENT '支行信息(对私账户)',
`bank_license` VARCHAR(255) DEFAULT NULL COMMENT '开户营业执照(对公账户)',
`account_id_card_front` VARCHAR(255) DEFAULT NULL COMMENT '开户身份证正面(对私账户)',
`account_id_card_back` VARCHAR(255) DEFAULT NULL COMMENT '开户身份证反面(对私账户)',
`rating` DECIMAL(2,1) UNSIGNED DEFAULT 5.0 COMMENT '评分',
`review_count` INT UNSIGNED DEFAULT 0 COMMENT '评价数',
`auto_confirm` TINYINT(1) DEFAULT 0 COMMENT '是否自动接单',
@@ -122,7 +134,9 @@ CREATE TABLE `merchants` (
UNIQUE KEY `uk_seller_id` (`seller_id`),
KEY `idx_status` (`status`),
KEY `idx_city` (`city`),
KEY `idx_rating` (`rating`)
KEY `idx_rating` (`rating`),
KEY `idx_contract_type` (`contract_type`),
KEY `idx_account_type` (`account_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商家表';
-- ============================================================
@@ -258,7 +272,7 @@ CREATE TABLE `reviews` (
`merchant_reply` TEXT COMMENT '商家回复',
`replied_at` DATETIME DEFAULT NULL COMMENT '回复时间',
`is_anonymous` TINYINT(1) DEFAULT 0 COMMENT '是否匿名',
`status` ENUM('visible','hidden') DEFAULT 'visible' COMMENT '状态',
`status` ENUM('pending','visible','hidden','rejected') DEFAULT 'pending' COMMENT '状态:pending待审核,visible已通过,hidden已隐藏,rejected已拒绝',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
+67 -2
View File
@@ -19,7 +19,7 @@
| rooms | 房源表 | merchant_id, name, type, price, status, audit_status |
| room_calendar | 房量房价日历 | room_id, date, price, stock, status |
| room_calendar_logs | 房态变更日志 | room_id, operator_id, change_type |
| orders | 订单表 | order_no, user_id, merchant_id, room_id, pay_amount, service_fee, merchant_income, status |
| orders | 订单表 | order_no, user_id, merchant_id, room_id, pay_amount, service_fee, merchant_income, status, payment_method, payment_no, paid_at, confirmed_at, checkin_at, checkout_at, cancelled_at, refund_amount, refund_at, source |
| reviews | 评价表 | order_id, user_id, rating, content |
| favorites | 收藏表 | user_id, room_id |
| coupons | 优惠券模板 | name, type, value, scope |
@@ -103,7 +103,7 @@ orders (1) ──── (1) settlements
### 订单状态流转
```
待支付 ──支付成功──> 待确认 ──商家确认──> 待入住 ──入住──> 已入住 ──离店──> 已完成
待支付 ──支付成功──> 待确认 ──商家确认──> 待入住 ──入住──> 已入住 ──自动离店──> 已完成
│ │ │
└──超时/取消──> 已取消 └──商家拒绝──> 已取消 └──用户退款──> 退款中
@@ -113,6 +113,18 @@ orders (1) ──── (1) settlements
待确认 ──用户退款──> 退款中 ──商家通过──> 已退款(恢复房量)
```
**自动完成机制**
- 定时任务每天凌晨 1 点执行(`OrderSchedule.completeExpiredOrders`
- 自动将"已入住"且"离店日期为前一天"的订单标记为"已完成"
- 记录 `checkout_at` 字段为当前时间
- 用户可在订单完成后进行评价
**商家手动确认离店**
- 商家可在订单详情页点击"确认离店"按钮
- 需满足条件:订单状态为"已入住"且当前日期 >= 离店日期
- 确认后订单立即变为"已完成",无需等待自动任务
- 适用场景:客人提前离店或商家需要立即完成订单
### 订单取消/退款规则
| 操作 | 适用状态 | 说明 |
@@ -123,6 +135,30 @@ orders (1) ──── (1) settlements
| 商家通过退款 | refunding | 状态变为 refunded,恢复房量日历库存 |
| 商家拒绝退款 | refunding | 状态变为 cancelled |
### 订单时间字段说明
| 字段 | 类型 | 说明 |
| ------------- | -------- | --------------------------------------- |
| created_at | datetime | 订单创建时间 |
| paid_at | datetime | 支付完成时间(支付成功后记录) |
| confirmed_at | datetime | 商家确认时间(商家确认订单后记录) |
| checkin_at | datetime | 实际入住时间(商家办理入住后记录) |
| checkout_at | datetime | 实际离店时间(自动完成或手动离店时记录)|
| cancelled_at | datetime | 取消时间(订单取消时记录) |
| refund_at | datetime | 退款时间(退款成功时记录) |
### 订单来源 (orders.source)
- `miniapp` - 小程序下单
- `web` - 网页下单
- `third_party` - 第三方平台(如美团、携程)
### 支付方式 (orders.payment_method)
- `wechat` - 微信支付
- `alipay` - 支付宝
- `balance` - 余额支付
### 房源状态 (rooms.status)
- `on_sale` - 在售
@@ -230,6 +266,26 @@ mysql -u root -p rent_platform < database/seeds/001_init_data.sql
4. JSON 字段用于存储数组/对象(如设施列表、活动规则)
5. 所有表都有 created_at 字段,核心表有 updated_at
6. 敏感操作需记录到 operation_logs 表
7. 订单自动完成:定时任务每天凌晨 1 点执行,将离店日期为前一天的"已入住"订单自动标记为"已完成"
## 定时任务
### 订单自动完成任务 (OrderSchedule)
**文件位置**: `apps/server/src/schedule/order.schedule.ts`
**执行时间**: 每天凌晨 1 点(Cron: `0 1 * * *`
**任务逻辑**:
```typescript
// 将前一天离店且状态为"已入住"的订单自动完成
UPDATE orders
SET status = 'completed', checkout_at = NOW()
WHERE status = 'checked_in'
AND DATE(check_out_date) = DATE(NOW() - INTERVAL 1 DAY)
```
**日志输出**: `已自动完成 N 笔过期订单 (YYYY-MM-DD)`
---
@@ -568,6 +624,7 @@ apps/miniapp/src/api/
| 确认订单 | PUT /api/seller/orders/:id/confirm| pending_confirm → pending_checkin |
| 拒绝订单 | PUT /api/seller/orders/:id/reject | pending_confirm → cancelled |
| 办理入住 | PUT /api/seller/orders/:id/checkin| pending_checkin → checked_in |
| 确认离店 | PUT /api/seller/orders/:id/checkout| checked_in → completed(需已到离店日期) |
| 通过退款 | PUT /api/seller/orders/:id/approve-refund | refunding → refunded,恢复房量 |
| 拒绝退款 | PUT /api/seller/orders/:id/reject-refund | refunding → cancelled |
@@ -589,9 +646,17 @@ apps/miniapp/src/api/
| ---------------- | -------------------------- |
| pending_confirm | 确认、拒绝 |
| pending_checkin | 办理入住 |
| checked_in | 确认离店(需已到离店日期) |
| refunding | 通过退款、拒绝退款 |
| 其他状态 | 无操作 |
### 订单完成方式
| 方式 | 触发条件 | 说明 |
| ------------ | ---------------------------------- | --------------------------------------- |
| 自动完成 | 每天凌晨1点定时任务 | 将离店日期为前一天的"已入住"订单自动完成 |
| 商家手动确认 | 商家点击"确认离店"按钮 | 需已到离店日期,订单立即完成 |
---
## 文件上传服务