mahjong_group/docs/1.0.0/业务逻辑文档 copy.md
2026-01-01 14:39:23 +08:00

36 KiB
Raw Blame History

麻将组局预约小程序 - 业务逻辑详解文档

目录

  1. 项目概述
  2. 系统架构
  3. 核心业务模块
  4. 核心业务流程图
  5. 数据模型
  6. API接口详解
  7. 业务规则汇总
  8. 状态机定义

1. 项目概述

1.1 产品定位

这是一个麻将组局预约小程序,帮助麻将爱好者在线上发起、加入麻将局,线下到店进行游戏。小程序提供了完整的预约流程管理,包括房间选择、预约发起、参与管理、签到评价等功能。

1.2 技术栈

层级 技术 说明
前端 UniApp + Vue 3 支持微信小程序、H5、APP多端发布
后端 .NET Core 6.0+ RESTful API
ORM SqlSugar 数据库访问层
数据库 Microsoft SQL Server 数据持久化
支付 微信支付 鸽子费(押金)支付

1.3 核心功能清单

┌─────────────────────────────────────────────────────────┐
│                    麻将组局预约系统                      │
├─────────────────────────────────────────────────────────┤
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐    │
│  │ 首页    │  │ 预约    │  │ 个人中心│  │ 消息    │    │
│  │ 预约列表│  │ 房间选择│  │ 我的预约│  │ 站内信  │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────┘    │
├─────────────────────────────────────────────────────────┤
│  核心业务:                                              │
│  • 发起预约    • 加入预约    • 取消预约                  │
│  • 预约签到    • 牌友评价    • 信誉管理                  │
│  • 鸽子费支付  • 退款处理    • 收益提现                  │
└─────────────────────────────────────────────────────────┘

2. 系统架构

2.1 前端架构

uniapp/mahjong_group/
├── pages/                          # 页面目录
│   ├── index/
│   │   └── index.vue               # 首页 - 预约列表
│   ├── appointment/
│   │   ├── book-room-page.vue      # 房间选择页Tab页
│   │   └── appointment-page.vue    # 预约表单页
│   └── me/
│       ├── me-page.vue             # 个人中心
│       ├── appointment-record-page.vue  # 预约记录
│       ├── my-earnings-page.vue    # 我的收益
│       └── my-message-page.vue     # 消息中心
├── components/                     # 组件目录
│   ├── index/
│   │   └── MahjongCard.vue         # 麻将预约卡片(九宫格)
│   └── com/
│       ├── index/
│       │   └── ReservationPopup.vue # 预约详情弹窗
│       └── page/
│           ├── container-base.vue   # 基础容器(含签到、评价弹窗)
│           └── qiandao-popup.vue    # 签到弹窗
└── common/
    ├── server/
    │   └── interface/              # API接口定义
    │       ├── sq.js               # 预约相关接口
    │       ├── user.js             # 用户相关接口
    │       ├── earnings.js         # 收益相关接口
    │       └── message.js          # 消息相关接口
    └── system/
        ├── request.js              # 请求封装(含签名)
        └── cacheService.js         # 缓存服务

2.2 后端架构

server/CoreCms.Net.Web.WebApi/
└── Controllers/
    └── SQController.cs             # 预约核心控制器全部预约相关API
        ├── GetReservationList      # 首页预约列表
        ├── AddSQReservation        # 创建预约
        ├── JoinReservation         # 加入预约
        ├── CancelReservation       # 取消预约
        ├── CheckInReservation      # 签到
        ├── GetEvaluateServices     # 获取评价
        ├── AddEvaluateServices     # 添加评价
        ├── GetMessageList          # 消息列表
        ├── GetEarningsSummary      # 收益统计
        └── ApplyWithdraw           # 申请提现

2.3 系统架构图

graph TB
    subgraph 客户端
        A[微信小程序] --> B[UniApp]
        C[H5网页] --> B
        D[APP] --> B
    end

    subgraph 前端层
        B --> E[Vue 3 组件]
        E --> F[API接口层]
        F --> G[请求封装/签名]
    end

    subgraph 后端层
        G --> H[.NET Core WebAPI]
        H --> I[SQController]
        I --> J[Services服务层]
        J --> K[SqlSugar ORM]
    end

    subgraph 数据层
        K --> L[(SQL Server)]
    end

    subgraph 第三方服务
        H --> M[微信支付]
        H --> N[微信登录]
    end

3. 核心业务模块

3.1 用户认证模块

3.1.1 登录流程

用户通过微信小程序登录,获取手机号授权后绑定账号。

sequenceDiagram
    participant U as 用户
    participant MP as 小程序
    participant WX as 微信服务器
    participant BE as 后端服务
    participant DB as 数据库

    U->>MP: 点击登录
    MP->>U: 请求授权手机号
    U->>MP: 同意授权
    MP->>WX: 获取code和encryptedData
    WX->>MP: 返回加密数据
    MP->>BE: POST /user/UseWxPhoneNumberLogin
    Note over MP,BE: 传递code和sessionAuthId
    BE->>WX: 解密手机号
    WX->>BE: 返回手机号
    BE->>DB: 查询/创建用户
    DB->>BE: 返回用户信息
    BE->>MP: 返回token和用户信息
    MP->>MP: 存储token到本地
    MP->>U: 登录成功

3.1.2 用户信息结构

字段 类型 说明
id int 用户ID
nickName string 昵称
avatarImage string 头像URL
sex int 性别1男 2女
birthday DateTime? 生日(用于计算年龄)
credit_score decimal 信誉分0-5分默认5分
play_level decimal 牌品评分1-5分默认4分
skills_level decimal 牌技评分1-5分默认4分
dove_count int 鸽子次数

3.2 预约管理模块

3.2.1 预约生命周期

stateDiagram-v2
    [*] --> 待开始: 创建预约
    待开始 --> 已锁定: 人满
    待开始 --> 已取消: 发起者取消
    待开始 --> 待开始: 参与者加入/退出
    已锁定 --> 待开始: 参与者退出
    已锁定 --> 已取消: 发起者取消
    已锁定 --> 进行中: 签到
    待开始 --> 进行中: 签到(人未满也可签到)
    进行中 --> 已结束: 时间结束
    已取消 --> [*]
    已结束 --> [*]

3.2.2 预约状态说明

status 状态名 说明
0 待开始 预约已创建,等待参与者加入或等待开始时间
1 已锁定 参与人数已满,等待开始
2 进行中 发起者已签到,游戏进行中
3 已结束 预约时间已过,预约完成
4 已取消 预约被取消

3.2.3 发起预约流程

flowchart TD
    A[用户点击发起预约] --> B[选择日期]
    B --> C[查看房间列表及时段状态]
    C --> D{选择房间和时段}
    D --> E[填写预约信息]

    subgraph 预约信息
        E --> E1[组局名称]
        E --> E2[人数 1-4人]
        E --> E3[玩法类型]
        E --> E4[游戏规则]
        E --> E5[参与限制]
        E --> E6[鸽子费设置]
    end

    E1 & E2 & E3 & E4 & E5 & E6 --> F[提交前验证]
    F --> G{调用CanCreateSQReservation}
    G -->|验证失败| H[显示错误信息]
    H --> E
    G -->|验证通过| I{是否有鸽子费}
    I -->|有| J[发起微信支付]
    J --> K{支付结果}
    K -->|成功| L[调用AddSQReservation创建预约]
    K -->|失败| M[提示支付失败]
    I -->|无| L
    L --> N[创建预约记录]
    N --> O[创建发起者参与记录 role=1]
    O --> P[返回预约ID]
    P --> Q[跳转到预约详情]

3.2.4 加入预约流程

flowchart TD
    A[用户点击加入预约] --> B{预约是否存在且未结束}
    B -->|否| C[提示:预约不存在或已结束]
    B -->|是| D{是否已加入该预约}
    D -->|是| E[提示:您已加入该预约]
    D -->|否| F{是否为独享模式}
    F -->|是| G[提示:该预约不接受其他人加入]
    F -->|否| H[校验参与条件]

    subgraph 条件校验
        H --> H1{信誉分是否达标}
        H1 -->|否| I1[提示:信誉分不足]
        H1 -->|是| H2{性别是否符合}
        H2 -->|否| I2[提示:性别不符合要求]
        H2 -->|是| H3{年龄是否在范围内}
        H3 -->|否| I3[提示:年龄不符合限制]
        H3 -->|是| H4{是否有时间冲突}
        H4 -->|是| I4[提示:有其他预约时间冲突]
        H4 -->|否| H5{预约是否已满}
        H5 -->|是| I5[提示:预约已满]
    end

    H5 -->|否| J{是否有鸽子费}
    J -->|有| K[发起微信支付]
    K --> L{支付结果}
    L -->|成功| M[创建参与者记录 role=0]
    L -->|失败| N[提示支付失败]
    J -->|无| M
    M --> O[加入成功]

3.2.5 取消预约流程

flowchart TD
    A[用户点击取消预约] --> B{预约是否存在}
    B -->|否| C[提示:预约不存在]
    B -->|是| D{距开始是否<30分钟}
    D -->|是| E[提示开始前30分钟无法取消]
    D -->|否| F{预约状态是否>=3}
    F -->|是| G[提示:已结束或已取消]
    F -->|否| H{用户角色}

    H -->|发起者 role=1| I[发起者取消整个预约]
    I --> J[预约状态改为已取消 status=4]
    J --> K[所有参与者标记为已退出]
    K --> L{是否有已支付押金}
    L -->|有| M[已支付者标记为待退款 is_refund=3]
    M --> N[发送通知给所有参与者]
    L -->|无| N

    H -->|参与者 role=0| O{预约是否已开始}
    O -->|是| P[提示:只有发起者可取消]
    O -->|否| Q[参与者退出]
    Q --> R[标记该用户为已退出 status=1]
    R --> S{该用户是否已支付押金}
    S -->|是| T[标记为待退款 is_refund=3]
    T --> U[退出成功]
    S -->|否| U

    N --> V[取消完成]

3.3 签到模块

3.3.1 签到流程

签到是预约流程的关键环节,只有发起者可以操作,用于确认实际到场人员。

flowchart TD
    A[发起者点击签到] --> B{预约是否存在}
    B -->|否| C[提示:预约不存在]
    B -->|是| D{预约状态是否>=3}
    D -->|是| E[提示:已结束或已取消]
    D -->|否| F{是否已签到 status=2}
    F -->|是| G[提示:已签到,无法重复]
    F -->|否| H{是否为发起者}
    H -->|否| I[提示:仅发起者可签到]
    H -->|是| J[显示参与者列表]

    J --> K[勾选实际到场人员]
    K --> L[提交签到]

    L --> M[开启数据库事务]
    M --> N[预约状态改为进行中 status=2]
    N --> O[所有未退出参与者默认标记为到场 is_arrive=1]
    O --> P{是否有未到场人员}

    P -->|有| Q[未到场人员处理]
    subgraph 爽约惩罚
        Q --> Q1[标记为未到场 is_arrive=2]
        Q1 --> Q2[标记为已退出 status=1]
        Q2 --> Q3[扣除信誉分 -0.5]
        Q3 --> Q4[增加鸽子次数 dove_count++]
        Q4 --> Q5[记录信誉变更日志]
    end

    P -->|无| R[到场人员处理]
    Q5 --> R

    subgraph 守约奖励
        R --> R1[增加信誉分 +0.2 最高5.0]
        R1 --> R2[记录信誉变更日志]
    end

    R2 --> S{是否有押金}
    S -->|有| T[到场且已支付者标记为待退款 is_refund=3]
    T --> U[提交事务]
    S -->|无| U
    U --> V[签到完成]

3.3.2 签到后信誉变化

情况 信誉变化 其他影响
到场(守约) +0.2最高5.0 -
未到场(爽约) -0.5 鸽子次数+1

3.4 评价模块

3.4.1 评价流程

flowchart TD
    A[用户进入预约详情] --> B{预约是否已完成且已签到}
    B -->|否| C[不显示评价入口]
    B -->|是| D[显示评价入口]
    D --> E[点击牌友评价]
    E --> F[获取可评价参与者列表]
    F --> G[只显示实际到场的其他参与者]

    G --> H[选择要评价的人]
    H --> I[填写评价]

    subgraph 评价维度
        I --> I1[牌品评分 1-5星]
        I --> I2[牌技评分 1-5星]
    end

    I1 & I2 --> J[提交评价]
    J --> K[创建评价记录]
    K --> L[重新计算被评价人的平均分]

    subgraph 平均分计算
        L --> L1[获取所有历史评价]
        L1 --> L2[计算 牌品 = sum评价 + 4 / 评价次数 + 1]
        L2 --> L3[计算 牌技 = sum评价 + 4 / 评价次数 + 1]
        L3 --> L4[如果只有1次评价分母+1避免偏差]
    end

    L4 --> M[更新用户评分]
    M --> N[评价完成]

3.4.2 评价规则

  1. 评价时机:预约状态为"已结束"且已签到后
  2. 评价对象:只能评价实际到场的其他参与者(排除自己)
  3. 评价次数:每个参与者只能被评价一次
  4. 评价维度
    • 牌品play_level1-5分
    • 牌技skills_level1-5分

3.4.3 评分计算公式

新评分 = (历史评分总和 + 初始分4) / (评价次数 + 1)

特殊情况当只有1次评价时分母为(评价次数 + 2)避免偏差

3.5 押金(鸽子费)模块

3.5.1 押金流程总览

flowchart TD
    subgraph 发起预约
        A[发起者设置鸽子费] --> B[发起者支付鸽子费]
        B --> C[创建预约成功]
        C --> D[参与者记录 is_refund=1 待支付]
    end

    subgraph 加入预约
        E[参与者加入] --> F{预约是否有鸽子费}
        F -->|有| G[参与者支付鸽子费]
        G --> H[参与者记录 is_refund=2 已支付]
        F -->|无| I[参与者记录 is_refund=0]
    end

    subgraph 签到/取消
        J[签到或取消] --> K{参与者是否已支付}
        K -->|是| L[标记为 is_refund=3 待退款]
        K -->|否| M[无需退款]
    end

    subgraph 定时任务
        N[定时扫描 is_refund=3] --> O[调用微信退款API]
        O --> P{退款结果}
        P -->|成功| Q[更新 is_refund=4 已退款]
        P -->|失败| R[更新 is_refund=5 退款异常]
    end

3.5.2 押金状态说明

is_refund 状态名 说明
0 无押金 预约不需要鸽子费
1 待支付 需要支付但未支付
2 已支付 已完成支付
3 待退款 已发起退款流程,等待处理
4 已退款 退款完成
5 退款异常 退款失败

3.5.3 押金分配规则

flowchart TD
    A[签到确认] --> B{是否有人爽约}
    B -->|无| C[所有人押金原路退还]
    B -->|有| D[计算爽约人数和到场人数]
    D --> E[爽约者押金不退还]
    E --> F[爽约者押金平分给到场者]
    F --> G[到场者获得额外收益]
    G --> H[到场者原押金退还]

3.6 消息通知模块

3.6.1 消息类型

类型 message_type 说明
系统消息 0 预约相关自动通知
私信 1 暂未实现

3.6.2 自动发送场景

flowchart LR
    A[组局成功] --> B[通知所有参与者]
    C[组局失败/解散] --> D[通知所有参与者]
    E[预约即将开始] --> F[提醒参与者]
    G[签到完成] --> H[通知到场/未到场情况]

3.6.3 消息流程

sequenceDiagram
    participant S as 系统
    participant DB as 数据库
    participant U as 用户

    S->>DB: 插入消息记录 (SQMessage)
    Note over DB: user_id=0 表示全体用户
    U->>DB: 获取消息列表
    DB->>U: 返回消息 + 已读状态
    Note over DB: 已读状态存储在 SQMessageRead 表
    U->>DB: 标记全部已读
    Note over DB: 插入已读记录

3.7 收益模块

3.7.1 收益来源

  1. 发起预约佣金房费的10%(需线下员工在后台添加)
  2. 爽约者押金分成:爽约者的鸽子费平分给到场者

3.7.2 收益流程

flowchart TD
    A[预约完成] --> B{发起者是否有佣金}
    B -->|有| C[后台员工添加佣金记录]
    C --> D[更新待提现金额]

    E[签到确认有人爽约] --> F[计算爽约押金]
    F --> G[平分给到场者]
    G --> D

    D --> H[用户申请提现]
    H --> I{金额是否超出可提现}
    I -->|是| J[提示:超出可提现金额]
    I -->|否| K[创建提现申请记录]
    K --> L[状态:提现中]
    L --> M[后台审核]
    M --> N{审核结果}
    N -->|同意| O[线下打款]
    O --> P[状态:已提现]
    N -->|拒绝| Q[状态:已取消]

3.7.3 提现状态

状态 说明
提现中 申请已提交,等待审核
已提现 线下打款完成
已取消 后台拒绝/取消申请

3.8 黑名单模块

3.8.1 黑名单功能

flowchart TD
    A[用户A将用户B加入黑名单] --> B[写入黑名单表]
    B --> C[首页预约列表]
    C --> D{用户B是否在黑名单}
    D -->|是| E[过滤B发起的预约]
    D -->|否| F[正常显示]

3.8.2 黑名单影响

  1. 首页自动过滤黑名单用户发起的预约
  2. 黑名单用户无法加入我发起的预约(待实现)
  3. 评价页面显示黑名单状态

4. 核心业务流程图

4.1 完整预约生命周期

flowchart TB
    subgraph 发起阶段
        A1[选择房间日期] --> A2[填写预约信息]
        A2 --> A3[设置参与限制]
        A3 --> A4[设置鸽子费]
        A4 --> A5{有鸽子费?}
        A5 -->|是| A6[微信支付]
        A5 -->|否| A7[创建预约]
        A6 --> A7
        A7 --> A8[预约状态: 待开始]
    end

    subgraph 参与阶段
        A8 --> B1[等待参与者加入]
        B1 --> B2{人数已满?}
        B2 -->|是| B3[预约状态: 已锁定]
        B2 -->|否| B4{有人退出?}
        B4 -->|是| B1
        B4 -->|否| B5{到达开始时间?}
        B3 --> B5
        B5 -->|否| B1
    end

    subgraph 签到阶段
        B5 -->|是| C1[发起者签到]
        C1 --> C2[确认到场人员]
        C2 --> C3[处理到场/未到场]
        C3 --> C4[更新信誉分]
        C4 --> C5[预约状态: 进行中]
    end

    subgraph 结束阶段
        C5 --> D1[游戏进行中]
        D1 --> D2{到达结束时间?}
        D2 -->|否| D1
        D2 -->|是| D3[预约状态: 已结束]
        D3 --> D4[可以互相评价]
        D4 --> D5[处理押金退款]
        D5 --> D6[发放佣金]
    end

    subgraph 取消分支
        A8 --> E1{发起者取消?}
        B1 --> E1
        B3 --> E1
        E1 -->|是| E2[预约状态: 已取消]
        E2 --> E3[所有人退出]
        E3 --> E4[退还已支付押金]
    end

4.2 时序图:完整预约流程

sequenceDiagram
    participant U1 as 发起者
    participant U2 as 参与者
    participant FE as 前端
    participant BE as 后端
    participant DB as 数据库
    participant WX as 微信支付

    %% 发起预约
    rect rgb(200, 230, 200)
        Note over U1,WX: 发起预约阶段
        U1->>FE: 选择房间和时段
        FE->>BE: GetRoomListWithSlotsNew
        BE->>DB: 查询房间状态
        DB->>BE: 返回房间列表
        BE->>FE: 房间时段状态
        U1->>FE: 填写预约信息
        FE->>BE: CanCreateSQReservation
        BE->>DB: 校验时间冲突等
        DB->>BE: 校验结果
        BE->>FE: 可以创建
        FE->>WX: 支付鸽子费
        WX->>FE: 支付成功
        FE->>BE: AddSQReservation
        BE->>DB: 创建预约+参与者记录
        DB->>BE: 返回预约ID
        BE->>FE: 预约成功
    end

    %% 加入预约
    rect rgb(200, 200, 230)
        Note over U1,WX: 加入预约阶段
        U2->>FE: 浏览预约列表
        FE->>BE: GetReservationList
        BE->>DB: 查询预约列表
        DB->>BE: 预约数据
        BE->>FE: 预约列表
        U2->>FE: 点击加入
        FE->>BE: JoinReservation
        BE->>DB: 校验条件
        DB->>BE: 校验通过
        BE->>FE: 需要支付鸽子费
        FE->>WX: 支付鸽子费
        WX->>FE: 支付成功
        FE->>BE: JoinReservation(带支付信息)
        BE->>DB: 创建参与者记录
        DB->>BE: 成功
        BE->>FE: 加入成功
    end

    %% 签到
    rect rgb(230, 200, 200)
        Note over U1,WX: 签到阶段
        U1->>FE: 点击签到
        FE->>FE: 显示参与者列表
        U1->>FE: 确认到场人员
        FE->>BE: CheckInReservation
        BE->>DB: 开启事务
        BE->>DB: 更新预约状态
        BE->>DB: 更新到场状态
        BE->>DB: 更新信誉分
        BE->>DB: 标记待退款
        BE->>DB: 提交事务
        DB->>BE: 成功
        BE->>FE: 签到成功
    end

    %% 评价
    rect rgb(230, 230, 200)
        Note over U1,WX: 评价阶段
        U1->>FE: 点击评价
        FE->>BE: GetEvaluateServices
        BE->>DB: 查询可评价人员
        DB->>BE: 参与者列表
        BE->>FE: 可评价列表
        U1->>FE: 提交评价
        FE->>BE: AddEvaluateServices
        BE->>DB: 创建评价记录
        BE->>DB: 更新被评价人分数
        DB->>BE: 成功
        BE->>FE: 评价成功
    end

4.3 房间时段状态机

stateDiagram-v2
    [*] --> 可预约: 默认状态
    可预约 --> 已预约: 有人预约该时段
    可预约 --> 不可预约: 后台设置不可用
    已预约 --> 可预约: 预约取消
    已预约 --> 进行中: 签到开始
    进行中 --> 可预约: 预约结束
    不可预约 --> 可预约: 后台取消不可用

    note right of 可预约: 绿色
    note right of 已预约: 橙色
    note right of 不可预约: 灰色

5. 数据模型

5.1 核心数据表关系图

erDiagram
    CoreCmsUser ||--o{ SQReservationParticipants : "参与"
    CoreCmsUser ||--o{ SQReservationEvaluate : "评价"
    CoreCmsUser ||--o{ SQReservationReputation : "信誉记录"
    CoreCmsUser ||--o{ CoreCmsUserBlacklist : "黑名单"
    CoreCmsUser ||--o{ SQMessage : "接收消息"
    CoreCmsUser ||--o{ SQEarningsRecord : "收益"
    CoreCmsUser ||--o{ SQWithdrawRecord : "提现"

    SQReservations ||--o{ SQReservationParticipants : "包含"
    SQReservations ||--o{ SQReservationEvaluate : "评价关联"
    SQReservations }o--|| SQRooms : "使用房间"

    SQRooms ||--o{ SQRoomUnavailableTimes : "不可用时间"
    SQRooms ||--o{ SQRoomPricing : "价格配置"

    CoreCmsUser {
        int id PK
        string nickName
        string avatarImage
        int sex
        datetime birthday
        decimal credit_score
        decimal play_level
        decimal skills_level
        int dove_count
    }

    SQReservations {
        int id PK
        int room_id FK
        string room_name
        datetime start_time
        datetime end_time
        int duration_minutes
        string title
        string game_type
        string game_rule
        int player_count
        int status
        decimal deposit_fee
        decimal credit_limit
        int gender_limit
        int min_age
        int max_age
        bool is_smoking
        datetime latest_arrival_time
        string extra_info
        bool is_solo_mode
        datetime created_at
        datetime updated_at
    }

    SQReservationParticipants {
        int id PK
        int reservation_id FK
        int user_id FK
        int role
        int status
        datetime join_time
        datetime quit_time
        int is_arrive
        datetime check_reservation
        int is_refund
        string paymentId
        string important_data
    }

    SQRooms {
        int id PK
        string name
        int capacity
        decimal price_per_hour
        string description
        string image_url
        bool status
        datetime created_at
    }

    SQReservationEvaluate {
        int id PK
        int reservation_id FK
        int user_id FK
        int to_user_id FK
        int role
        decimal play_level
        decimal skills_level
        datetime created_at
    }

    SQReservationReputation {
        int id PK
        int user_id FK
        int reservation_id FK
        decimal reputation_value
        string remark
        datetime created_at
    }

5.2 数据表详细说明

5.2.1 SQReservations预约表

字段 类型 说明
id int 主键
room_id int 房间ID外键
room_name string 房间名称(冗余)
start_time datetime 开始时间
end_time datetime 结束时间
duration_minutes int 时长(分钟)
title string 组局名称
game_type string 游戏类型(血战/血流成河等)
game_rule string 游戏规则
player_count int 需要人数1-4
status int 状态0待开始/1已锁定/2进行中/3已结束/4已取消
deposit_fee decimal 押金费用
credit_limit decimal 最低信誉要求
gender_limit int 性别限制0不限/1男/2女
min_age int 最小年龄限制
max_age int 最大年龄限制
is_smoking bool 是否禁烟
latest_arrival_time datetime 最晚到店时间
extra_info string 其他补充说明
is_solo_mode bool 是否独享模式(人数=1时自动设为true
remarks string 备注(如取消原因)
created_at datetime 创建时间
updated_at datetime 更新时间

5.2.2 SQReservationParticipants参与者表

字段 类型 说明
id int 主键
reservation_id int 预约ID外键
user_id int 用户ID外键
role int 角色0参与者/1发起者
status int 状态0正常/1已退出
join_time datetime 加入时间
quit_time datetime 退出时间
is_arrive int 是否到场0未签到/1到场/2未到场
check_reservation datetime 签到时间
is_refund int 退款状态0无/1待支付/2已支付/3待退款/4已退款/5异常
paymentId string 支付订单号
important_data string 重要数据JSON格式含支付信息等

6. API接口详解

6.1 预约相关接口

接口 方法 路径 权限 说明
首页预约列表 GET /api/sq/GetReservationList 获取未结束的预约列表,自动过滤黑名单
预约详情 GET /api/sq/GetReservationDetail 根据ID获取预约详情
我的预约 GET /api/sq/GetMyReservation 需要 type=0参与的/type=1发起的
正在进行 GET /api/sq/GetMyUseReservation 需要 获取未结束的预约
验证创建 POST /api/sq/CanCreateSQReservation 需要 创建前校验
创建预约 POST /api/sq/AddSQReservation 需要 发起新预约
加入预约 POST /api/sq/JoinReservation 需要 加入现有预约
取消预约 POST /api/sq/CancelReservation 需要 发起者/参与者取消
签到 POST /api/sq/CheckInReservation 需要 发起者签到确认

6.2 房间相关接口

接口 方法 路径 权限 说明
可选日期 GET /api/sq/GetAvailableDates 今天+未来6天
房间时段 GET /api/sq/GetRoomListWithSlotsNew 房间列表及时段状态
房间详情 GET /api/sq/GetRoomDetail 房间信息及时段
可预约房间 GET /api/sq/GetReservationRoomList 指定时间可预约的房间
营业时间 GET /api/sq/GetBusinessHours 09:00-23:00

6.3 评价相关接口

接口 方法 路径 权限 说明
获取评价 GET /api/sq/GetEvaluateServices 需要 获取可评价的参与者
添加评价 POST /api/sq/AddEvaluateServices 需要 评价参与者
信誉记录 GET /api/sq/GetReputationByUser 需要 我的信誉变化记录
评价给我 GET /api/sq/GetEvaluateToMe 需要 别人给我的评价

6.4 消息相关接口

接口 方法 路径 权限 说明
消息列表 GET /api/sq/GetMessageList 需要 站内信列表
未读数量 GET /api/sq/GetUnreadCount 需要 未读消息数
标记已读 POST /api/sq/MarkAllAsRead 需要 全部标记已读

6.5 收益相关接口

接口 方法 路径 权限 说明
收益统计 GET /api/sq/GetEarningsSummary 需要 待提现+已提现
收益记录 POST /api/sq/GetEarningsRecordList 需要 收益明细
提现记录 POST /api/sq/GetWithdrawRecordList 需要 提现历史
申请提现 POST /api/sq/ApplyWithdraw 需要 发起提现
收益规则 GET /api/sq/GetEarningsRule 规则说明

7. 业务规则汇总

7.1 时间规则

规则 说明
可预约范围 今天+未来6天 共7天
时段划分 凌晨(0-6h)/上午(6-12h)/下午(12-18h)/晚上(18-24h) 4个时段
营业时间 09:00-23:00 可在后台配置
取消限制 开始前30分钟 30分钟内无法取消

7.2 人数规则

规则 说明
最少人数 1人 独享模式
最多人数 4人 麻将标准人数
独享模式 player_count=1 自动设置,不接受其他人加入
人满锁定 达到player_count 状态变为已锁定(1)

7.3 押金规则

规则 说明
金额范围 0-50元 可选0/5/10/20或自定义
用途 防止爽约 到场退还,爽约扣除
爽约分配 平分给到场者 由到场者瓜分
退款时机 签到后/取消后 标记待退款,定时任务处理

7.4 信誉规则

情况 变化 说明
初始信誉 5.0分 满分
守约奖励 +0.2分 最高5.0
爽约惩罚 -0.5分 最低0分鸽子次数+1
信誉限制 发起者设置 低于限制无法加入

7.5 评价规则

规则 说明
评价时机 预约完成后 状态为已结束
评价对象 到场的其他参与者 排除自己和未到场
评价维度 牌品/牌技 各1-5分
评价次数 每人一次 不可重复评价
初始分 4分 用于计算平均

7.6 参与限制规则

限制项 可选值 说明
性别限制 不限/男/女 0/1/2
年龄限制 最小-最大 0表示不限
信誉限制 0-5分 最低信誉要求
禁烟 是/否 是否禁止吸烟

8. 状态机定义

8.1 预约状态机

stateDiagram-v2
    direction LR

    [*] --> S0_待开始: 创建预约

    S0_待开始 --> S1_已锁定: 人满
    S0_待开始 --> S2_进行中: 签到
    S0_待开始 --> S4_已取消: 取消

    S1_已锁定 --> S0_待开始: 有人退出
    S1_已锁定 --> S2_进行中: 签到
    S1_已锁定 --> S4_已取消: 发起者取消

    S2_进行中 --> S3_已结束: 时间结束

    S3_已结束 --> [*]
    S4_已取消 --> [*]

    note right of S0_待开始: status=0
    note right of S1_已锁定: status=1
    note right of S2_进行中: status=2
    note right of S3_已结束: status=3
    note right of S4_已取消: status=4

8.2 参与者状态机

stateDiagram-v2
    direction LR

    [*] --> P0_正常: 加入预约

    P0_正常 --> P1_已退出: 主动退出
    P0_正常 --> P1_已退出: 被踢出(签到时未到场)
    P0_正常 --> P1_已退出: 预约取消

    P1_已退出 --> [*]

    note right of P0_正常: status=0
    note right of P1_已退出: status=1

8.3 到场状态机

stateDiagram-v2
    direction LR

    [*] --> A0_未签到: 加入预约

    A0_未签到 --> A1_到场: 签到确认到场
    A0_未签到 --> A2_未到场: 签到确认未到场

    A1_到场 --> [*]: 完成
    A2_未到场 --> [*]: 被踢出

    note right of A0_未签到: is_arrive=0
    note right of A1_到场: is_arrive=1
    note right of A2_未到场: is_arrive=2

8.4 退款状态机

stateDiagram-v2
    direction LR

    [*] --> R0_无押金: 预约无鸽子费
    [*] --> R1_待支付: 需要支付鸽子费

    R1_待支付 --> R2_已支付: 支付成功
    R1_待支付 --> R0_无押金: 预约取消(未支付)

    R2_已支付 --> R3_待退款: 签到/取消触发

    R3_待退款 --> R4_已退款: 定时任务退款成功
    R3_待退款 --> R5_退款异常: 定时任务退款失败

    R4_已退款 --> [*]
    R5_退款异常 --> R3_待退款: 人工处理后重试
    R5_退款异常 --> [*]: 人工处理
    R0_无押金 --> [*]

    note right of R0_无押金: is_refund=0
    note right of R1_待支付: is_refund=1
    note right of R2_已支付: is_refund=2
    note right of R3_待退款: is_refund=3
    note right of R4_已退款: is_refund=4
    note right of R5_退款异常: is_refund=5

附录A前端核心文件路径

功能 文件路径
首页 uniapp/mahjong_group/pages/index/index.vue
房间选择 uniapp/mahjong_group/pages/appointment/book-room-page.vue
预约表单 uniapp/mahjong_group/pages/appointment/appointment-page.vue
个人中心 uniapp/mahjong_group/pages/me/me-page.vue
预约记录 uniapp/mahjong_group/pages/me/appointment-record-page.vue
我的收益 uniapp/mahjong_group/pages/me/my-earnings-page.vue
消息中心 uniapp/mahjong_group/pages/me/my-message-page.vue
登录 uniapp/mahjong_group/pages/me/login.vue
预约卡片组件 uniapp/mahjong_group/components/index/MahjongCard.vue
预约弹窗组件 uniapp/mahjong_group/components/com/index/ReservationPopup.vue
签到弹窗组件 uniapp/mahjong_group/components/com/page/qiandao-popup.vue
API接口 uniapp/mahjong_group/common/server/interface/sq.js

附录B后端核心文件路径

功能 文件路径
预约控制器 server/CoreCms.Net.Web.WebApi/Controllers/SQController.cs
预约服务 server/CoreCms.Net.Services/SQ/SQReservationsServices.cs
房间服务 server/CoreCms.Net.Services/SQ/SQRoomsServices.cs
消息服务 server/CoreCms.Net.Services/SQ/SQMessageServices.cs
收益服务 server/CoreCms.Net.Services/SQ/SQEarningsServices.cs

附录C版本更新记录

v1.0.0 核心功能

  1. 会员档案功能

    • 微信授权登录,绑定手机号
    • 会员行为标签:星级评分、黑名单
    • 组局成功率、被投诉次数、消费频次、鸽子次数统计
  2. 麻友匹配机制

    • 发布组局需求
    • 其他客户查看并加入
    • 组局成功后自动发送消息
    • 鸽子费(押金)机制

v1.0.1 新增功能

  1. 站内信功能

    • 消息入口,红点提示
    • 自动发送通知(组局成功/失败)
    • 手动发送通知(后台配置)
  2. 预约页优化

    • 房间时段展示4个时段
    • 房间可用状态可视化
    • 无需组局选项(独享模式)
    • 鸽子费自定义金额最高50元
  3. 我的收益功能

    • 待提现/已提现金额展示
    • 收益记录查询
    • 提现申请(后台审核,线下打款)
    • 佣金规则房费10%

文档生成时间2024年 版本v1.0.1