## 預定
預定是平臺為用戶提供的一種低成本專利資源短期占有服務。
*****
### 預定方式
1. 買家自己預定
2. 銷售幫用戶 **預定 / 續訂**
#### 1. 買家自己預定
1. 買家點擊預定按鈕,選擇 天數 , 單價(元/天) ,單價由用戶的會員等級確定
2. 選擇天數后,確認支付金額,點擊提交,此專利商品被**預鎖定**,狀態變為不可售,在賣家中心顯示為 **搶訂中(未支付)**
3. 支付成功后,即預定成功(預定有效期限計時 從收到付款回調,預定/續訂成功后開始)
4. 預定成功后,此專利商品被**正式鎖定**,狀態為不可售,在賣家中心顯示為 **已被預定**
5. 用戶在 用戶中心 - 預定管理 可以看到此預定記錄
6. 預鎖定時間為5分鐘,超時未支付,預定被系統自動取消釋放
7. 普通用戶每天最多只能創建5個“預鎖定”預定,以此來限制用戶惡意搶訂
#### 2. 銷售幫用戶預定
1. 銷售點擊預定,選擇天數,輸入用戶手機號碼(若手機號碼存在則自動關聯用戶,不存在則提示,不存在也可幫其預定)
2. 選擇天數后,確認支付金額,點擊提交,此專利商品被**預鎖定**,狀態變為不可售,在賣家中心顯示為 **搶訂中(未支付)**
3. 支付成功后,即預定成功(預定有效期限計時 從收到付款回調,預定/續訂成功后開始)
4. 預定成功后,此專利商品被**正式鎖定**,狀態為不可售,在賣家中心顯示為 **已被預定**
5. 銷售在 銷售中心 - 預定管理 可以看到此預定記錄
6. 預鎖定時間為5分鐘,超時未支付,預定被系統自動取消釋放
7. 銷售每天最多只能創建10個“預鎖定”預定,以此來限制用戶惡意搶訂
> 對于預鎖定的預定,可以在頁面某個位置給用戶以倒計時提示,告訴用戶別人還未支付,你還有機會預定!營造一種緊迫感,按時用戶機會稍縱即逝!
*****
### 預定狀態變更及說明
| 狀態 | 狀態變更及說明 |
| --- | --- |
| 預鎖定 | 用戶提交預定,還未支付時,專利商品被鎖定,不能被預定、購買了,此時賣家也不能更新這件專利商品的信息,在賣家中心 狀態顯示為 **搶訂中(未支付)** |
| 被釋放 | 預鎖定的預定記錄,超時未支付,會被系統自動釋放,專利商品自動解鎖,恢復正常,此預定生命周期結束,此預定記錄關閉,用戶還可以再次進行預定 |
| 預定成功 | 專利商品被鎖定,不能被預定、購買了,此時賣家也不能更新這件專利商品的信息,在賣家中心 狀態顯示為 **已被預定** |
| 預定到期 | 預定按天數計算,到期后,專利商品自動解鎖,恢復正常,此預定生命周期結束,此預定記錄關閉,用戶還可以再次進行預定 |
| 續訂 | 在預定未到期的情況下(預定有效期內)可以對其進行續訂,續訂直接順延到期時長,操作和首次預定時基本相同 |
| 取消預定 | 用戶主動取消預定,專利商品立即自動解鎖,恢復正常,用戶還可以再次進行預定 |
| 已創建訂單 | 此預定已創建訂單(預定有效期內創建訂單),和訂單進行關聯(記錄扣減金額) |
| 已完成訂單 | 關聯訂單已完成,此預定生命周期結束 |
*****
#### 預定功能其他說明
**預定規則:** 同一件專利商品,每位用戶最多只能預定三次(包含續訂),每次預定/續訂不超過三天,即用戶最多可以預定一件專利9天,**銷售幫其預定/續訂也算在內**。
**什么是有效預定金額:**
在預定的有效期內下單,可以扣減此預定的支付金額,因未續訂而導致過期,則判定預定失效,預定過的金額也無效了,不會計入扣減。也就是說,如果用戶未在預定有效期內下單,就會損失之前支付過的全部預定金額。還有一種情況,比如今天預定過期了,第二天又再次預定了,那么有效金額從這次預定開始算,之前的就算全部作廢了。
**下單時抵扣:**
預定費可用于下單時抵扣,但是具體的抵扣規則呢,如果銷售和用戶共同參與預定/續訂了呢?
分兩種情況:
1. 全程用戶自己參與預定和續訂,都是自己交預定費用的。這種情況,用戶下單時抵扣自己有效預定的金額。
2. 用戶和銷售都參與預定和續訂了,這種情況下單時只抵扣用戶自己支付過的有效預定的那部分金額。
**如果幫其預定的用戶還不存在怎么辦?**
首先如果存在的話,直接關聯用戶。不存在的話,根據預定時填寫的用戶手機號寫一條記錄,待用戶他日登陸/注冊之時,自動同步回之前的預定信息即可。
*****
### 重要概念
**一個用戶只能對同一件專利商品預定一次,其他操作為續訂,預定到期和主動取消預定除外,預定到期和用戶主動取消預定后還可以再次進行預定。**
**一個銷售對一件專利商品,只能同時為一個用戶預定,不能同時為多個用戶預定同一件專利。只有當為某個用戶預定的專利到期或取消后,再才可以為其他用戶預定此件專利商品。**
**對于銷售幫用戶創建的預定,銷售和用戶都可以對其進行續訂,由用戶自己創建的預定,銷售不能參與續訂,但在銷售中心看得到用戶的預定記錄。**
**銷售預定/續訂所支付的費用不計入下單扣減部分,只有用戶自己支付的部分才計入扣減部分。**
**預定/續訂價格如果是銷售進行操作的話,哪怕是幫用戶操作,價格也都是統一的(10元一次)。如果是用戶自己進行的操作,則根據用戶的會員體系計算。**
*****
#### 用戶中心(買家) - 預定管理
- 預定列表
- 續訂
- 取消預定
- 預定詳情
- 預定記錄
- 預定支付記錄
*****
#### 銷售中心 - 預定管理
- 預定列表
- 續訂
- 取消預定
- 預定詳情
- 預定記錄
- 預定支付記錄
- 用戶信息
*****
#### 數據字典
```sql
# 訂單表增加 預定ID 和 預定抵扣金額 字段
ALTER TABLE `ecshop2016`.ecs_order_info add (
`reservation_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '預定ID, s_patent_reservation table id (如果預定有效期內購買了這件專利商品,則訂單記錄關聯其預定ID)',
`reservation_deduction_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '預定抵扣金額'
);
# 專利預定 表
DROP TABLE IF EXISTS `s_patent_reservation`;
CREATE TABLE `s_patent_reservation` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`goods_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '專利商品ID, ecs_goods table goods_id',
`order_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '訂單ID, ecs_order_info table order_id (如果預定有效期內創建了訂單則關聯創建的訂單ID)',
`user_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '創建預定的用戶ID, ecs_users table user_id, 銷售或用戶',
`target_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '目標用戶id, ecs_users table user_id,如果是銷售幫其預定的,那么這個字段就是用戶ID,否則為0',
`mobile` char(15) NULL DEFAULT '' COMMENT '手機號碼,銷售幫其預定時, 如果用戶不存在,則記錄這個手機號碼為約定憑證,待用戶他日登陸之時再同步過去(在這條記錄 的 target_id 上更新上 user_id 即可)',
`user_total_pay` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '用戶累計已支付金額(用戶為這筆預定總共成功支付了的金額,也是 達成訂單時的有效抵扣金額)',
`sale_total_pay` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '銷售累計已支付金額(不參與下單抵扣)',
`reservation_count` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '預定/續訂次數(已成功預定/續訂次數)',
`expires_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '預定到期時間',
`start_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '預定到期時間的起(有效期限計 從首次預定收到付款回調,預定成功后開始)',
`create_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '創建時間',
`update_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '更新時間',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '狀態:0-創建預定,待支付,1-預定生效中,2-預定已到期,3-已取消預定,4-已創建訂單,5-已完成訂單',
primary key (`id`)
) engine=innodb AUTO_INCREMENT=1 default charset=utf8 COMMENT='專利預定 表';
# 專利預定訂單/記錄 表
DROP TABLE IF EXISTS `s_patent_reservation_order`;
CREATE TABLE `s_patent_reservation_order` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`reservation_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '所屬預定ID, s_patent_reservation table id',
`goods_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '所屬預定的專利商品ID, ecs_goods table goods_id',
`user_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '生成預定訂單的用戶ID, ecs_users table user_id, 銷售或用戶',
`user_role` tinyint(4) unsigned NOT NULL DEFAULT 1 COMMENT '生成預定訂單的用戶角色:1-普通用戶,2-銷售',
`order_sn` char(50) NULL DEFAULT NULL COMMENT '預定訂單編號',
`amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '支付金額',
`data_json` text NULL COMMENT '訂單數據json,如單價,級別價格等信息',
`buy_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '購買時長(秒)',
`create_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '創建時間',
`update_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '更新時間',
`pay_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '支付時間,支付成功即預定成功,所以也是預定時間',
`type` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '類型:0-“首次”預定,1-續訂',
`pay_status` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '支付狀態:0-未支付,1-已支付',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '狀態:0-生成預定訂單,待支付,1-已完成(收到付款回調,時長更新到 已預定表中),2-已取消',
primary key (`id`),
UNIQUE KEY `order_sn` (`order_sn`) USING BTREE
) engine=innodb AUTO_INCREMENT=1 default charset=utf8 COMMENT='專利預定訂單/記錄 表';
-- 每次點擊預定都會生成一條訂單,用于支付,但是對用戶默認只顯示完成支付的記錄行(支付訂單表,類似于支付流水表)
-- 如有退款的話,訂單不會不會(再次)更新狀態
# 專利預定訂單支付 記錄/日志 表
DROP TABLE IF EXISTS `s_patent_reservation_order_pay_record`;
CREATE TABLE `s_patent_reservation_order_pay_record` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`order_sn` char(50) NULL DEFAULT NULL COMMENT '預定訂單編號, s_patent_reservation_order table order_sn',
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '記錄標題:正常/重復支付-需退款/多方重復支付-需退款/...',
`pay_platform` char(20) NULL DEFAULT '' COMMENT '支付平臺標識:alipay/wxpay...',
`return_json` text NULL COMMENT '第三方支付平臺支付回調回執所返回數據,json格式保存',
`create_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '創建時間',
`refund_status` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '退款處理狀態:0-無,1-申請退款(處理中),2-退款失敗,3-完成退款',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '狀態:0-正常,1-重復支付(需向用戶退款),2-已完成',
primary key (`id`)
) engine=innodb AUTO_INCREMENT=1 default charset=utf8 COMMENT='專利預定訂單支付 記錄/日志 表';
-- 這個支付日志記錄表是關聯 預定訂單表的,如果需要和12306一樣,每次點擊訂單支付【都用不同的數據(訂單編號)】去請求支付接口返回支付信息(第三方的支付連接或二維碼)的話,
-- 還需要在中間增加一張與訂單表對應的表,因為第三方是根據你傳入的訂單編號來生成支付信息,如果你傳入上次的訂單編號,第三方也會返回和上次相同的支付信息
-- 不過我們不考慮12306那種情況,因為12306需要快速支付出票,不能出現好友認領支付二維碼后,沒有支付,又再不能生成新的支付二維碼,導致也不能使用自己的支付寶掃碼付款而只能重新下單,我們暫不考慮這樣的情況
-- 不同第三方平臺策略可能不同,我們實現一個通用的,考慮所有情況,能滿足全部使用環境,而不能只為特定平臺考慮,任何依賴于外部環境的系統都是不安全不健壯的。
# 預定訂單退款記錄表
DROP TABLE IF EXISTS `s_patent_reservation_order_refund`;
CREATE TABLE `s_patent_reservation_order_refund` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`pay_record_id` char(50) NULL DEFAULT NULL COMMENT '對應的專利預定訂單支付記錄ID, s_patent_reservation_order_pay_record table id',
`order_sn` char(50) NULL DEFAULT NULL COMMENT '預定訂單編號, s_patent_reservation_order table order_sn',
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '退款標題:多方重復支付退款/重復支付退款/預定失敗退款/續訂失敗退款...',
`content` text NULL COMMENT '退款說明',
`amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '退款金額',
`pay_platform` char(20) NULL DEFAULT '' COMMENT '如使用在線支付渠道退款時,支付平臺標識:alipay/wxpay...',
`return_json` text NULL COMMENT '如使用在線支付渠道退款時,第三方支付平臺支付回調回執所返回數據,json格式保存',
`type` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '退款方式:0-無,1-線下渠道退款,2-在線支付渠道退款(原支付通道返回),3-其他',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '退款處理狀態:0-創建退款,1-退款處理中,2-退款失敗,3-完成退款',
`create_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '創建時間',
primary key (`id`)
) engine=innodb AUTO_INCREMENT=1 default charset=utf8 COMMENT='專利預定訂單退款 記錄/日志 表';
# 專利預定記錄/日志 表
DROP TABLE IF EXISTS `s_patent_reservation_record`;
CREATE TABLE `s_patent_reservation_record` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`reservation_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '所屬預定ID, s_patent_reservation table id',
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '日志標題:創建預定-待支付/支付成功/預定成功/預定過期/續訂成功/...',
`content` text NULL COMMENT '日志內容',
`payload` text NULL COMMENT '載荷/參數,可攜帶業務方數據,如 操作類型,涉及金額等等,在日志模板中會用到',
`type` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '日志類型:見日志類',
`create_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '創建時間',
primary key (`id`)
) engine=innodb AUTO_INCREMENT=1 default charset=utf8 COMMENT='專利預定記錄/日志 表';
-- 記錄預定的操作日志,讓每次操作和變更都有日志記錄(需要注意的是:對于業務來說日志并不重要,任何的業務邏輯都不能依賴于日志,日志只是方便用戶查看信息,有一個歷史記錄的作用)
```