feat: 迭代
This commit is contained in:
@@ -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
@@ -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点定时任务 | 将离店日期为前一天的"已入住"订单自动完成 |
|
||||
| 商家手动确认 | 商家点击"确认离店"按钮 | 需已到离店日期,订单立即完成 |
|
||||
|
||||
---
|
||||
|
||||
## 文件上传服务
|
||||
|
||||
Reference in New Issue
Block a user