# 云宿居 PMS 系统需求规格说明书 (完整版 v4.3) **快速导航:** - [1. 项目概述](#1-项目概述) - [2. 术语表](#2-术语表) - [3. 系统架构](#3-系统架构) - [4. 数据模型设计](#4-数据模型设计) - [5. 核心功能模块](#5-核心功能模块) - [6. 联系人管理](#6-联系人管理) - [7. 房态管理](#7-房态管理) - [8. 价格管理](#8-价格管理) - [9. 订单管理](#9-订单管理) - [10. 财务管理](#10-财务管理) - [11. 系统配置管理](#11-系统配置管理) - [12. 业务流程设计](#12-业务流程设计) - [13. 接口设计规范](#13-接口设计规范) - [14. 用户界面设计](#14-用户界面设计) - [15. 非功能性需求](#15-非功能性需求) - [16. 技术实现要求](#16-技术实现要求) - [17. 部署与运维](#17-部署与运维) ## 1. 项目概述 ### 1.1 项目背景 "云宿居"是一个面向中小型民宿经营者的 SaaS PMS(Property Management System)解决方案。基于若依框架构建,支持多租户架构,为民宿业主提供房间管理、订单处理、客户管理、财务结算等核心功能。 ### 1.2 核心特色 - **多租户架构**: 单实例支持多个民宿品牌或经营者 - **门店级权限**: 支持连锁民宿的分店管理 - **客户信息共享**: 租户内客户信息在各门店间共享,提升服务体验 - **移动优先**: 支持小程序和H5,适配民宿日常运营场景 ### 1.3 系统目标 - **提升运营效率**: 自动化房态管理、动态定价、智能配置 - **优化客户体验**: 租户级客户档案共享、个性化服务 - **增强收益管理**: 动态定价策略、多渠道管理、收益分析 - **保障数据安全**: 多层级权限控制、数据加密、审计追踪 ### 1.4 适用范围 - **目标用户**: 中小型民宿经营者、连锁民宿品牌、民宿管理公司 - **业务规模**: 支持1-1000间房的民宿运营管理 - **地域范围**: 主要面向中国大陆地区,支持多语言扩展 ### 1.5 核心用户角色 - **民宿主/管理员**: 系统的主要管理者,负责整体运营决策和系统配置 - **前台员工**: 日常操作人员,负责订单处理、入住退房、客户服务等 ### 1.6 功能优先级策略 本系统采用分阶段开发策略,按优先级划分功能实现: - **P0 (核心功能)**: 系统基础运营必需功能,第一阶段实现 - **P1 (重要功能)**: 提升运营效率的重要功能,第二阶段实现 - **P2 (增强功能)**: 优化用户体验的增强功能,第三阶段实现 - **P3 (扩展功能)**: 面向未来的扩展功能,后续版本实现 ## 2. 术语表 | 术语 | 定义 | 说明 | | -------------------------- | ---------------------- | ------------------------------------------ | | **租户(Tenant)** | SaaS平台的独立客户单位 | 通常是一个民宿品牌或管理公司 | | **门店(Department/Store)** | 租户下的具体经营场所 | 在系统中对应sys_dept表,表示具体的民宿分店 | | **联系人(Contact)** | 客户联系人信息 | 包括个人客人、企业联系人、代理商联系人等 | | **客人(Guest)** | 实际入住的客户 | 是联系人的一种类型,特指入住客户 | | **房型(Room Type)** | 标准化的房间类型定义 | 如标准间、豪华间、套房等 | | **房间(Room)** | 具体的物理房间 | 有唯一房间号,属于某个房型 | | **订单(Order)** | 预订记录 | 包含入住信息、客户信息、房间信息等 | | **账单(Folio)** | 财务账单 | 记录订单的费用明细和支付情况 | | **渠道(Channel)** | 订单来源渠道 | 如官网、OTA平台、电话预订等 | **重要说明**: 在PMS系统中,`sys_dept` 表的记录代表**门店/分店**,而非传统意义上的部门。这是基于民宿行业的业务特点做出的设计决策。 ## 3. 系统架构 ### 4.1 总体架构 ```mermaid graph TB subgraph "外部系统" E1[第三方支付] E2[OTA平台] E3[短信/邮件服务] E4[文件存储OSS] end subgraph "客户端层" A1[管理后台 Web] A2[小程序端管理] A4[开放API] end subgraph "应用网关层" G1[API网关] G2[负载均衡] G3[安全认证] end subgraph "应用服务层" B1[用户权限服务] BS_Core[核心业务服务 订单 房态 财务 联系人 价格] B7[系统配置服务] B8[消息通知服务] B9[报表统计服务] end subgraph "数据访问与基础设施层" C_DataAccess[数据访问 ORM 多租户与权限] C_Infra[基础设施 缓存Redis 连接池 消息队列MQ] end subgraph "数据存储层" D1[MySQL主库] D2[MySQL从库] D3[Redis缓存] D5[日志存储] end %% 外部系统连接 BS_Core -- "支付处理" --> E1 BS_Core -- "订单同步" --> E2 B8 -- "消息发送" --> E3 BS_Core -- "文件存取" --> E4 %% 客户端到网关 A1 --> G1 A2 --> G1 A4 --> G1 %% 网关到服务 (Primary routing and direct access) G1 --> G2 G2 --> G3 G3 -- "分发/认证" --> B1 G3 -- "分发/认证" --> BS_Core G3 -- "分发/认证" --> B7 G3 -- "分发/认证" --> B8 G3 -- "分发/认证" --> B9 %% 应用服务层内部依赖 (Refined logic for BS_Core operations) BS_Core -- "权限校验" --> B1 BS_Core -- "获取配置" --> B7 BS_Core -- "发送通知" --> B8 %% 服务到数据访问与基础设施 B1 -- "数据操作" --> C_DataAccess BS_Core -- "数据操作" --> C_DataAccess B7 -- "数据操作" --> C_DataAccess B8 -- "消息队列" --> C_Infra %% MQ is part of Infra B9 -- "数据查询" --> C_DataAccess %% Reports from DB B9 -- "缓存读取" --> C_Infra %% Reports might use Cache %% 数据访问与基础设施到存储 C_DataAccess -- "读/写" --> D1 C_DataAccess -- "读" --> D2 C_Infra -- "缓存操作" --> D3 %% Redis Cache C_Infra -- "日志写入" --> D5 %% MQ for logs or async tasks, or direct logging %% 存储层内部连接 D1 -.-> D2 style E1 fill:#e1f5fe style E2 fill:#e1f5fe style E3 fill:#e1f5fe style E4 fill:#e1f5fe style G1 fill:#f3e5f5 style G2 fill:#f3e5f5 style G3 fill:#f3e5f5 style BS_Core fill:#e8f5e9 style B1 fill:#e8f5e9 style B7 fill:#e8f5e9 style B8 fill:#e8f5e9 style B9 fill:#e8f5e9 ``` ### 4.2 技术架构 - **后端框架**: Spring Boot + MyBatis-Plus + 若依框架 - **前端技术**: Vue3 + Element Plus + TypeScript - **数据库**: MySQL 8.0 + Redis 6.0 - **消息队列**: RabbitMQ (可选) - **文件存储**: 阿里云OSS / 本地存储 - **部署方式**: Docker + Kubernetes ### 4.3 多租户架构设计 #### 4.3.1 多层级权限控制 ``` Level 1: 多租户拦截器 (自动) ├── 自动添加: WHERE tenant_id = #{currentTenantId} └── 确保: 租户间数据完全隔离 Level 2: 门店级权限控制 (业务层) ├── 业务层添加: AND dept_id = #{currentDeptId} └── 确保: 同租户不同门店数据隔离 Level 3: 租户级共享 (标准拦截器) ├── 适用表: 联系人信息、联系人标签 ├── 拦截器自动添加: WHERE tenant_id = #{currentTenantId} └── 确保: 租户内所有门店可见,租户间隔离 Level 4: 全局共享 (特殊处理) ├── 适用表: 系统配置、字典数据等 └── 确保: 全局数据对所有租户可见 ``` #### 4.3.2 数据隔离策略 - **租户级隔离**: 联系人信息在租户内共享,所有门店都可以查看和使用 - **门店级隔离**: 订单、房间、财务等核心业务数据按门店隔离 - **标签灵活性**: 联系人标签支持门店级和租户级两种模式 ## 4. 数据模型设计 ### 5.1 核心实体关系图 (E-R图) ```mermaid erDiagram %% --- 若依基础实体 --- sys_tenant { varchar(20) tenant_id PK "租户编号 (业务主键)" bigint id "物理主键" varchar(255) company_name "企业/民宿名称" varchar(50) status "租户状态" } sys_dept { bigint dept_id PK "部门ID (门店)" varchar(20) tenant_id FK "关联租户" varchar(30) dept_name "部门名称 (门店名称)" varchar(50) status "部门状态" } sys_user { bigint user_id PK "用户ID (PMS员工)" varchar(20) tenant_id FK "用户归属租户" bigint dept_id FK "用户所属部门" varchar(30) user_name "用户名" varchar(50) status "用户状态" } %% --- 客户管理实体 --- pms_customer_contacts { bigint contact_id PK "联系人ID" varchar(20) tenant_id FK "所属租户ID" varchar(255) full_name "联系人姓名" varchar(50) phone_number "联系电话" varchar(255) email "邮箱地址" varchar(50) contact_type "联系人类型" varchar(50) contact_status "联系人状态" varchar(50) member_level "会员等级" int total_stays "总入住次数" decimal total_amount "总消费金额 (12,2)" } pms_contact_tags { bigint tag_id PK "标签ID" varchar(20) tenant_id FK "所属租户ID" bigint dept_id FK "部门ID (可空)" varchar(100) name "标签名称" varchar(20) color "标签颜色" varchar(50) category "标签分类" } pms_contact_tag_relations { bigint relation_id PK "关联ID" varchar(20) tenant_id FK "所属租户ID" bigint contact_id FK "联系人ID" bigint tag_id FK "标签ID" } %% --- 房间管理实体 --- pms_room_types { bigint room_type_id PK "房型ID" varchar(20) tenant_id FK "租户ID" bigint dept_id FK "部门ID (门店)" varchar(255) name "房型名称" decimal default_price "默认价格 (10,2)" int capacity "标准入住人数" json amenities "房型设施" varchar(50) status "状态" } pms_room_rooms { bigint room_id PK "房间ID" varchar(20) tenant_id FK "租户ID" bigint dept_id FK "部门ID (门店)" bigint room_type_id FK "房型ID" varchar(50) room_number "房间号" varchar(50) floor "楼层" varchar(50) room_status "物理状态" varchar(50) cleaning_status "清洁状态" } %% --- 订单管理实体 --- pms_core_orders { bigint order_id PK "订单ID" varchar(20) tenant_id FK "所属租户ID" bigint dept_id FK "所属门店ID" varchar(50) order_status "订单状态" decimal total_amount "订单总金额 (15,2)" } pms_core_order_items { bigint order_item_id PK "订单项ID" varchar(20) tenant_id FK "租户ID" bigint order_id FK "订单ID" bigint dept_id FK "部门ID (门店)" varchar(50) product_type "产品类型 (房费, 服务等)" varchar(255) description "项目描述" int quantity "数量" decimal unit_price "单价 (10,2)" date service_date "服务日期" } %% --- 财务管理实体 --- pms_finance_folios { bigint folio_id PK "账单ID" varchar(20) tenant_id FK "所属租户ID" bigint dept_id FK "所属门店ID" bigint order_id FK "关联订单ID" decimal total_charges "总费用 (15,2)" decimal total_payments "总支付 (15,2)" decimal balance "余额 (15,2)" } pms_finance_transactions { bigint transaction_id PK "交易ID" varchar(20) tenant_id FK "租户ID" bigint folio_id FK "账单ID" bigint dept_id FK "部门ID (门店)" varchar(50) transaction_type "交易类型" decimal amount "交易金额 (10,2)" varchar(255) description "交易描述" varchar(100) payment_method_details "支付方式详情 (文本描述)" datetime transaction_time "交易时间" } %% --- 合作方管理实体 --- pms_suppliers { bigint supplier_id PK "供应商ID" varchar(20) tenant_id FK "所属租户ID (可空, 平台级则为空)" varchar(50) supplier_type "供应商类型" varchar(255) company_name "公司名称" varchar(100) contact_person "联系人" varchar(50) phone_number "联系电话" varchar(50) status "供应商状态" } pms_partners { bigint partner_id PK "合作伙伴ID" varchar(20) tenant_id FK "所属租户ID (可空, 平台级则为空)" varchar(50) partner_type "合作伙伴类型" varchar(255) company_name "公司名称" varchar(100) contact_person "联系人" decimal commission_rate "佣金比例 (5,2)" varchar(50) cooperation_level "合作等级" varchar(50) status "合作伙伴状态" } %% --- 实体关系定义 --- sys_tenant ||--o{ sys_dept : "包含门店/部门" sys_tenant ||--o{ sys_user : "拥有用户" sys_dept ||--o{ sys_user : "员工属于门店" sys_tenant ||--o{ pms_customer_contacts : "拥有客户" sys_tenant ||--o{ pms_contact_tags : "拥有标签 (租户级)" sys_dept ||--o{ pms_contact_tags : "拥有标签 (门店级)" pms_customer_contacts ||--o{ pms_contact_tag_relations : "客户标签关联" pms_contact_tags ||--o{ pms_contact_tag_relations : "标签关联客户" sys_tenant ||--o{ pms_room_types : "定义房型" sys_dept ||--o{ pms_room_types : "门店房型" pms_room_types ||--o{ pms_room_rooms : "有具体房间" sys_tenant ||--o{ pms_core_orders : "拥有订单" sys_dept ||--o{ pms_core_orders : "门店订单" pms_customer_contacts ||--o{ pms_core_orders : "是主要客户" pms_room_types ||--o{ pms_core_orders : "被预订类型" pms_room_rooms ||--o{ pms_core_orders : "被分配房间 (可空)" pms_core_orders ||--o{ pms_core_order_items : "包含项目" pms_core_orders |o--|| pms_finance_folios : "生成账单" pms_finance_folios ||--o{ pms_finance_transactions : "记录交易" sys_tenant ||--o{ pms_suppliers : "(管理租户级供应商)" sys_tenant ||--o{ pms_partners : "(管理租户级合作伙伴)" %% 平台级供应商/合作伙伴通过 tenant_id IS NULL 实现,不直接在图上显示对平台的FK %% The pms_tenant_settings relationship to sys_dept, IF pms_tenant_settings were in this diagram, %% would be: sys_dept ||--o{ pms_tenant_settings : "门店配置" %% Make sure this line is manually corrected if pms_tenant_settings is re-added elsewhere or if the diagram is less simplified. ``` *注意:此E-R图为核心业务实体的概览。详细的表结构、字段定义、约束及索引设计,请参考最新的《PMS数据模型设计文档》。* ### 5.2 数据表分类 以下为PMS系统核心业务相关的数据表分类。详细的表结构和字段定义请参考《PMS数据模型设计文档》。 #### 5.2.1 若依基础表 (继承) | 表名 | 说明 | 数据隔离 | | ---------- | ---------------------------------------- | -------- | | sys_tenant | 租户信息表 | 全局 | | sys_dept | 部门表 (在本系统中作为**门店/分店**使用) | 租户级 | | sys_user | 用户信息表 (PMS系统员工) | 租户级 | | sys_role | 角色信息表 | 租户级 | *其他若依基础表按原框架定义使用。* #### 5.2.2 客户管理表 | 表名 | 说明 | 数据隔离 | | ------------------------- | -------------------------------- | ------------- | | pms_customer_contacts | 存储客户核心档案信息 | 租户级共享 | | pms_contact_tags | 定义客户标签,支持租户级和门店级 | 租户级/门店级 | | pms_contact_tag_relations | 客户与标签的关联关系 | 租户级 | #### 5.2.3 房间管理表 | 表名 | 说明 | 数据隔离 | | -------------- | -------------------------------------- | -------- | | pms_room_types | 定义房型基础信息、价格、设施等 | 门店级 | | pms_room_rooms | 管理具体的物理房间及其当前状态 | 门店级 | | pms_room_locks | 记录房间的临时锁定信息(如维护、清洁) | 门店级 | #### 5.2.4 价格管理表 | 表名 | 说明 | 数据隔离 | | ---------------------- | ---------------------------- | -------- | | pms_room_pricing_rules | 定义房价的动态调整规则和策略 | 门店级 | #### 5.2.5 订单管理表 | 表名 | 说明 | 数据隔离 | | -------------------- | ------------------------------------ | -------- | | pms_core_orders | 存储客户预订的核心订单信息 | 门店级 | | pms_core_order_items | 存储订单中的具体项目,如房费、服务费 | 门店级 | | pms_core_channels | 定义订单的来源渠道信息 | 门店级 | #### 5.2.6 财务管理表 | 表名 | 说明 | 数据隔离 | | ------------------------------ | ---------------------------------- | -------- | | pms_finance_folios | 管理客户在店期间的账务信息(账单) | 门店级 | | pms_finance_transactions | 记录所有财务相关的交易流水明细 | 门店级 | | pms_finance_payment_methods | 定义系统支持的支付方式 | 门店级 | | pms_finance_extra_charge_items | 定义订单中可添加的附加费用项目 | 门店级 | #### 5.2.7 合作方管理表 | 表名 | 说明 | 数据隔离 | | ------------- | ------------------------------------- | ------------ | | pms_suppliers | 存储供应商信息 (如清洁服务、物料供应) | 全局或租户级 | | pms_partners | 存储合作伙伴信息 (如旅行社、OTA平台) | 全局或租户级 | *全局共享数据通过 `tenant_id IS NULL` 实现,租户级数据则记录对应 `tenant_id`。* #### 5.2.8 系统配置表 | 表名 | 说明 | 数据隔离 | | ----------------------- | ---------------------------------------- | ------------- | | pms_tenant_settings | 存储租户级或门店级的各项业务配置参数 | 租户级/门店级 | | pms_mp_settings | 存储小程序相关的配置信息 | 租户级/门店级 | | pms_tenant_user_devices | 存储用户登录过的设备信息,用于消息推送等 | 租户级 | ### 5.3 核心枚举值定义 系统中使用的各类业务状态和类型枚举值(例如:订单状态、客户类型、房间清洁状态等),其详细定义、可选值及完整列表请参考最新的《PMS数据模型设计文档》中的相应章节(通常在第5节"核心业务枚举值定义")。 在本文档后续的功能描述中,会根据上下文需要提及关键的枚举值及其业务含义,但《PMS数据模型设计文档》是枚举定义的唯一权威来源,以确保信息的一致性和准确性。 ## 6. 联系人管理 ### 6.1 业务背景 联系人管理是PMS系统的核心模块,负责管理所有与业务相关的联系人信息,包括客户、供应商、合作伙伴等。采用租户级共享模式,确保租户内所有门店都能访问和使用客户联系人信息。 ### 6.2 客户联系人核心功能 #### 6.2.1 基础联系人管理 [P0] - **联系人档案**: 创建和维护客户基本信息(姓名、电话、邮箱等)。 - **订单关联**: 将联系人与其历史订单关联。 - **简单搜索**: 支持按姓名、电话等关键信息搜索联系人。 #### 6.2.2 会员体系 [P1] - **会员等级**: 建立基础的会员等级体系。 - **积分系统**: 实现积分累积和兑换机制。 - **会员权益**: 为不同等级会员提供差异化权益。 #### 6.2.3 高级会员功能 [P2] - **个性化服务**: 记录客户偏好,提供个性化服务。 - **会员营销**: 针对不同会员群体进行精准营销。 - **客户分析**: 提供客户价值分析和行为分析。 ### 6.3 客户联系人数据模型与规则 #### 6.3.1 功能概述 - **关联数据表**: `pms_customer_contacts` (主表), `pms_contact_tags`, `pms_contact_tag_relations` - **数据权限**: 客户联系人信息(`pms_customer_contacts`)为租户级共享,使用标准多租户拦截器。标签(`pms_contact_tags`)支持租户级和门店级。 - **业务范围**: 管理所有类型的客户联系人信息,包括其基本档案、会员信息、标签关联等。 *详细的表结构、字段定义、约束及索引设计,请参考最新的《PMS数据模型设计文档》。* #### 6.3.2 核心字段设计 核心业务字段的描述保留在功能需求中,例如: - **联系人类型 (`contact_type`)**: 用于区分不同类型的联系人,如散客、团队负责人、企业联系人等。具体枚举值参见数据模型文档。 - **联系人状态 (`contact_status`)**: 标识联系人的当前状态,如活跃、不活跃、黑名单。具体枚举值参见数据模型文档。 - **会员等级 (`member_level`)**: 记录联系人的会员级别。 - **证件号码 (`id_number_encrypted`)**: 存储加密后的客户证件号码,确保数据安全。 - 其他关键业务字段将在后续功能点中结合描述。 #### 6.3.3 业务规则 1. **唯一性约束**: 同一租户内,有效的手机号码 (`phone_number`) 应唯一。若系统配置要求,有效的、未作废的证件号码 (`id_number_encrypted`) 在同一租户内也应唯一。 2. **数据共享**: 客户联系人核心信息在租户内所有门店间共享。 3. **隐私保护**: 客户的证件号码、银行卡信息(如果涉及)等敏感数据必须加密存储,并遵循最小权限原则进行访问和展示(如脱敏显示)。 4. **状态管理**: 支持联系人的多种状态,并可能影响其相关业务操作(例如,黑名单客户可能无法创建新订单)。 5. **会员体系**: 支持多级会员等级,会员等级可与特定权益或价格策略关联。 ### 6.4 联系人标签管理 #### 6.4.1 功能概述 - **关联数据表**: `pms_contact_tags` (标签定义表), `pms_contact_tag_relations` (客户与标签关联表) - **数据权限**: 标签可以定义为租户级(`dept_id` 为 NULL)或门店级(`dept_id` 有效)。查询客户关联的标签时,会合并其可访问的租户级标签和所属门店的门店级标签。 - **灵活性**: 支持多种标签分类(如客户等级、偏好、来源等),并允许自定义标签颜色以增强可视化区分。 *详细的表结构、字段定义、约束及索引设计,请参考最新的《PMS数据模型设计文档》。* #### 6.4.2 核心字段设计 - **标签名称 (`name`)**: 标签的显示名称,应简洁明了。 - **标签分类 (`category`)**: 用于对标签进行分组管理,便于筛选和应用。具体枚举值参见数据模型文档。 - **部门ID (`dept_id`)**: 用于区分租户级标签和门店级标签。 #### 6.4.3 标签关联管理 - 主要通过 `pms_contact_tag_relations` 表实现客户与标签的多对多关联。 - 创建关联时需校验标签的有效性和客户的可访问性(租户一致,门店标签需匹配或为租户级)。 ## 7. 房态管理 ### 7.1 核心功能与操作 #### 7.1.1 房态管理核心 [P0] - **功能描述:** - **网格日历视图**: 直观展示房间在选定日期范围内的占用情况(已预订、已入住、清洁中、维护锁定)。 - **今日状态列表**: 按预抵、在住、预离分类展示当日订单/房间。 - **清洁状态管理**: 手动标记房间清洁状态(待清洁/清洁中/已干净)。 - **快捷操作**: 在房态图上可快速创建预订、登记入住/退房、标记房间清洁状态、设置房间临时锁定/解锁。 - **核心操作:** - **查询房态**: 用户可按日期范围查看房态日历,不同状态房间用不同颜色标记。 - **修改房间清洁状态**: 更新房间清洁状态,影响房态图显示。 - **设置房间维护/锁定**: 设置房间维护或锁定状态,记录原因和时间范围。 ### 7.2 房型管理 **数据表**: `pms_room_types` **数据隔离**: 门店级隔离 **房型管理功能**: - 房型定义、价格设置、设施配置 - 容量管理、图片上传、详细描述 - 床型信息、房间面积、设施标签 ### 7.3 房间管理 **数据表**: `pms_room_rooms` **数据隔离**: 门店级隔离 **房间管理功能**: - 房间编号、楼层、当前状态 - 房间状态:可用/占用中/维护中/暂停服务 - 清洁状态:已清洁/待清洁/清洁中/已查房 ### 7.4 实时房态监控 **数据表**: `pms_room_rooms`, `pms_room_locks` **数据隔离**: 门店级隔离 **实时房态监控功能**: - 房间状态实时显示:可用、占用中、维护中、暂停服务 - 清洁状态跟踪:已清洁、待清洁、清洁中、已查房 - 房态变更历史记录和审计 ### 7.5 房间锁定管理 **数据表**: `pms_room_locks` (ER图中的定义) **数据隔离**: 门店级隔离 **锁定类型**: - 锁定类型:手动锁定、维护锁定、自动锁定、员工自用、清洁锁定 - 锁定时间段:开始时间、结束时间、锁定原因 - 批量锁定操作:支持多房间同时锁定 ### 7.6 清洁流程管理 **清洁管理功能**: - 清洁任务分配和跟踪 - 清洁标准检查清单 - 查房流程和质量控制 - 清洁人员工作量统计 ### 7.7 维护计划管理 **维护管理功能**: - 定期维护计划制定 - 维护任务分配和跟踪 - 维护成本记录和分析 - 设备保养提醒 ## 8. 价格管理 ### 8.1 动态定价规则 **数据表**: `pms_room_pricing_rules` **数据隔离**: 门店级隔离 **基础价格设置**: - 基础价格设置:房型默认价格 - 季节性价格调整:淡旺季价格策略 - 周末/节假日价格:特殊日期价格规则 - 连住优惠:最小/最大入住天数限制 - **价格调整类型**: 具体的调整类型(如固定价格覆盖、百分比折扣等) ### 8.2 价格规则管理 **价格规则功能**: - 规则优先级设置:数字越大优先级越高 - 适用日期范围:开始日期、结束日期 - 适用星期设置:支持特定星期几 - 房型适用范围:全部房型或特定房型 ### 8.3 价格计算引擎 **价格计算功能**: - 多规则叠加计算 - 实时价格查询API - 价格变更历史记录 - 收益分析和报表 ### 8.4 价格计算历史追踪 [P0] **数据表**: `pms_pricing_calculations` **数据隔离**: 门店级隔离 **价格计算历史功能**: - **计算过程记录**: 完整记录每次价格计算的过程和结果。 - **规则应用详情**: 记录哪些价格规则被应用,以及具体的调整金额。 - **价格审计**: 提供价格计算的完整审计轨迹,便于问题排查。 - **历史价格查询**: 支持查询历史某个时间点的价格计算结果。 - **价格趋势分析**: 基于历史计算数据分析价格变化趋势。 ### 8.5 特殊日期价格管理 [P1] **数据表**: `pms_special_date_pricing` **数据隔离**: 门店级隔离 **特殊日期价格功能**: - **节假日价格**: 支持国家法定节假日、传统节日的特殊定价。 - **活动日价格**: 支持本地活动、会展、赛事等特殊事件的定价。 - **日期类型管理**: 区分不同类型的特殊日期,如节假日、活动日、促销日等。 - **批量设置**: 支持批量设置连续日期的特殊价格。 - **优先级控制**: 特殊日期价格具有更高的优先级,覆盖常规价格规则。 ### 8.6 高级价格规则 [P2] **价格规则增强功能**: - **渠道差异化定价**: 不同预订渠道可设置不同的价格策略。 - **客人数量定价**: 根据入住客人数量调整价格。 - **提前预订优惠**: 根据提前预订天数给予不同程度的优惠。 - **规则组合策略**: 支持多个价格规则的智能组合和冲突处理。 - **动态库存定价**: 根据剩余库存情况动态调整价格。 - **会员专享价格**: 为不同等级会员提供专属价格。 ### 8.7 价格策略分析 [P2] **价格分析功能**: - **收益优化建议**: 基于历史数据和市场情况提供价格优化建议。 - **竞争对手价格监控**: 监控竞争对手的价格变化趋势。 - **价格弹性分析**: 分析价格变化对预订量的影响。 - **最优价格推荐**: 基于算法模型推荐最优价格策略。 ## 9. 订单管理 ### 9.1 订单核心功能 #### 9.1.1 核心订单生命周期管理 [P0] - **功能描述:** 高效、准确地管理所有来源的预订订单,覆盖从订单创建到完成的整个生命周期。订单状态的详细定义 (如 `pending_confirmation`, `confirmed` 等) - **手动创建订单**: 支持前台为散客或电话预订创建订单。 - **接收商城订单**: 通过API自动接收来自C端商城H5的预订订单。 - **订单详情查看与编辑**: 查看订单的全部信息,允许在特定规则下修改部分信息。 - **核心状态管理**: 管理订单的基本状态流转:待确认、已确认、已入住、已退房、已取消、未入住。 - **关联联系人与房间**: 将订单与联系人档案和具体房号关联。 - **生成账单基础**: 为每个订单生成初始账单框架。 - **房态联动**: 订单的创建、确认、取消、入住、退房应实时更新PMS核心房态图。 #### 9.1.2 订单状态流转图 ```mermaid stateDiagram-v2 [*] --> pending_confirmation: 创建订单 pending_confirmation --> confirmed: 确认订单 pending_confirmation --> cancelled: 取消订单 confirmed --> checked_in: 办理入住 confirmed --> cancelled: 取消订单 confirmed --> no_show: 未按时入住 checked_in --> checked_out: 办理退房 checked_in --> extended: 延长入住 extended --> checked_out: 办理退房 checked_out --> [*] cancelled --> [*] no_show --> [*] ``` #### 9.1.3 订单状态历史追踪 [P0] - **状态变更记录**: 完整记录订单状态的每次变更,包括变更时间、操作人、变更原因。 - **操作审计**: 追踪所有订单相关的关键操作,确保业务流程的可追溯性。 - **状态回滚支持**: 在特殊情况下支持订单状态的回滚操作。 - **变更通知**: 订单状态变更时自动通知相关人员。 #### 9.1.4 订单时间管理 [P0] - **关键时间点记录**: 记录订单确认时间、实际入住时间、实际退房时间、取消时间等。 - **预计到达时间**: 支持客人预约到达时间,便于前台安排接待。 - **时间差异分析**: 分析计划时间与实际时间的差异,优化运营流程。 - **超时提醒**: 对超时未入住、超时未退房等情况进行自动提醒。 #### 9.1.5 入住客人信息管理 [P1] - **主客人信息**: 记录订单主要联系人的详细信息。 - **同行客人管理**: 支持记录同行入住客人的基本信息和证件信息。 - **客人类型区分**: 区分成人、儿童、婴儿等不同类型客人。 - **证件信息加密**: 客人证件信息采用加密存储,确保数据安全。 - **入住登记**: 支持快速办理多人入住登记手续。 - **客人档案关联**: 支持将入住客人与租户级客户档案关联,实现客户信息积累和复用。 - **智能档案匹配**: 基于姓名、电话、证件号等信息智能匹配现有客户档案。 - **新档案创建**: 对于新客人,支持在入住登记时同步创建客户档案。 #### 9.1.6 客人与联系人关联管理 [P0] - **主客人关联**: 订单主客人必须关联到客户联系人档案,用于客户关系维护。 - **同行客人选择性关联**: 同行客人可选择关联现有档案或创建新档案。 - **临时客人支持**: 支持不关联档案的临时入住客人,仅记录基本入住信息。 - **档案信息同步**: 客人信息变更时可选择同步更新客户档案。 - **统计数据更新**: 入住完成后自动更新客户档案的入住次数、消费金额等统计信息。 #### 9.1.7 订单管理增强功能 [P1] - **订单修改**: 允许修改已确认订单的关键信息,系统需重新校验库存和价格。 - **款项管理**: 处理预付款、押金、部分付款的记录和跟踪。 - **取消与退款**: 支持更细致的取消政策配置,并根据政策处理退款流程。 - **基础支付集成**: 对接主流支付网关,支持在线支付扫码收款或记录线下收款。 - **自动化通知**: 通过短信或微信模板消息,发送订单状态相关的自动化通知。 - **订单备注与标签**: 支持为订单添加内部备注和自定义标签。 - **特殊要求处理**: 记录和处理客人的特殊要求,如房间偏好、服务需求等。 #### 9.1.8 实用订单工具与基础渠道对接 [P2] - **简版团体预订管理**: 支持为团体设置统一联系人并关联多个订单。 - **等候名单**: 当房型在特定日期满房时,允许客人加入等候名单。 - **Channel Manager单向订单接收**: 通过与第三方Channel Manager对接,实现单向自动接收来自OTA的订单。 - **订单报表**: 提供多维度订单分析报表。 - **发票管理**: 支持为订单生成和管理发票信息。 ### 9.2 订单处理 (详细定义) **数据表**: `pms_core_orders`, `pms_core_order_items`, `pms_core_channels`, `pms_order_status_history`, `pms_order_guests` **数据隔离**: 门店级隔离 **订单处理功能**: - 订单创建、修改、取消、确认 - 入住/退房流程管理 - 客户信息关联(关联到租户级共享的客户档案) - 房间分配与变更 - 订单状态历史追踪 - 入住客人信息管理 ### 9.3 订单来源渠道管理 **数据表**: `pms_core_channels` (ER图中的定义) **数据隔离**: 门店级隔离 (通常渠道定义可能是租户级或全局,但这里按订单关联的门店) **渠道类型与配置**: - **渠道类型**: 具体的渠道类型 (如 OTA, 直接预订等) 参见 [5.3.4 订单相关枚举](#534-订单相关枚举) 中 `pms_core_channels.channel_type` 的定义。 - **渠道配置**: 携程、飞猪、官网直订、电话预订、现场步入 - **渠道管理**: 渠道佣金设置和统计、渠道性能分析 ### 9.4 订单项目管理 **数据表**: `pms_core_order_items` (ER图中的定义) **数据隔离**: 门店级隔离 **订单项目功能**: - 房晚费用、附加服务费用 - 项目描述、数量、单价、服务日期 - 费用调整和优惠处理 ### 9.5 库存管理与房态联动 [P1] **数据表**: `pms_room_inventory_snapshot` **数据隔离**: 门店级隔离 **库存管理功能**: - **实时库存查询**: 快速查询指定日期范围内的房型可用性。 - **库存快照**: 定期生成房型库存快照,提升查询性能。 - **超售保护**: 防止房间超售,确保库存准确性。 - **房态实时同步**: 订单状态变更时实时更新房间状态和库存。 - **可用性预测**: 基于历史数据预测未来库存紧张情况。 ## 10. 财务管理 ### 10.1 财务核心功能 #### 10.1.1 基础财务管理 [P0] - **功能描述:** 为民宿提供完整的财务管理能力,确保收入准确记录和账务清晰。 - **账单(Folio)管理**: 为每个联系人/订单创建和维护详细的费用清单。 - **交易记录**: 记录所有收入和支出交易,包括房费、押金、额外消费等。 - **基础支付方式**: 支持现金、银行卡、微信支付、支付宝等常见支付方式。 - **简单对账**: 提供基础的收入汇总和对账功能。 #### 10.1.2 增强财务功能 [P1] - **多币种支持**: 支持多种货币的收费和汇率转换。 - **发票管理**: 生成和管理各类发票。 - **财务报表**: 提供收入、支出、利润等基础财务报表。 - **预付款和押金管理**: 详细管理预付款、押金的收取和退还。 #### 10.1.3 高级财务工具 [P2] - **成本核算**: 支持房间成本、运营成本的核算。 - **收益管理**: 提供ADR、RevPAR等关键指标分析。 - **税务管理**: 支持税务计算和申报辅助功能。 ### 10.2 账单管理 (详细定义) **数据表**: `pms_finance_folios` **数据隔离**: 门店级隔离 **账单管理功能**: - 自动生成订单账单、费用明细 - 支持额外费用添加、调整 - 账单状态:Refer to section [5.3.5 财务相关枚举](#535-财务相关枚举) for `pms_finance_folios.folio_status` values. ### 10.3 支付管理 (详细定义) **数据表**: `pms_finance_payment_methods` **数据隔离**: 门店级隔离 (支付方式定义通常是租户级或全局,但这里指门店可用的支付方式关联) **支付管理功能**: - 多种支付方式:Refer to section [5.3.5 财务相关枚举](#535-财务相关枚举) for `pms_finance_payment_methods.method_type` values. - 支付记录、退款处理 - 押金管理、预付款处理 ### 10.4 附加费用管理 (详细定义) **数据表**: `pms_finance_extra_charge_items` **数据隔离**: 门店级隔离 **附加费用功能**: - 费用项目定义:项目名称、默认单价、费用类别 (Refer to section [5.3.5 财务相关枚举](#535-财务相关枚举) for `pms_finance_extra_charge_items.category` values) - 税费设置:是否应税、税率配置 - 费用统计和分析 ### 10.5 交易流水管理 (详细定义) **数据表**: `pms_finance_transactions` **数据隔离**: 门店级隔离 **交易流水功能**: - 交易类型:Refer to section [5.3.5 财务相关枚举](#535-财务相关枚举) for `pms_finance_transactions.transaction_type` values. - 支付网关集成:支付宝、微信支付接口 - 交易作废和冲销处理 - 财务对账和报表 ## 11. 系统配置管理 ### 11.1 系统管理核心功能 #### 11.1.1 基础系统管理 [P0] - **功能描述:** 为租户提供系统配置和管理能力。 - **用户账号管理**: 管理租户内部员工账号和权限。 - **基础设置**: 配置民宿基本信息、营业时间等。 - **角色权限**: 基础的角色权限管理。 #### 11.1.2 增强管理功能 [P1] - **高级权限控制**: 更细粒度的权限控制。 - **系统日志**: 查看系统操作日志。 - **数据备份**: 提供数据备份和恢复功能。 ### 11.2 租户级配置管理 (详细定义) **数据表**: `pms_tenant_settings` **数据隔离**: 租户级和门店级配置 **租户级配置功能**: - 配置分组:预订规则、财务参数、界面外观、业务流程 - 配置项管理:键值对存储、数据类型支持 (`value_type`) - 敏感配置保护:加密存储 (`is_sensitive` field), 访问控制 - 配置继承:租户级配置、门店级覆盖 (通过 `dept_id` 可空实现) ### 11.3 小程序配置 (详细定义) **数据表**: `pms_mp_settings` **数据隔离**: 租户级和门店级配置 (通过 `dept_id` 可空实现) **小程序配置功能**: - 主题颜色、品牌标识、功能开关 - 支付配置、通知配置、地图配置 - 客户端版本管理、功能权限控制 ### 11.4 设备管理 (详细定义) **数据表**: `pms_tenant_user_devices` **数据隔离**: 租户级 **设备管理功能**: - 用户设备注册:iOS, Android, 微信小程序, Web (来自 `device_type`) - 推送令牌管理 (`device_token`), 设备状态跟踪 - 设备登录历史 (`last_login_time`), 安全审计 - 多设备登录控制 ### 11.5 配置项示例 ```yaml 预订规则配置: - max_advance_booking_days: 365 # 最大提前预订天数 - min_advance_booking_hours: 2 # 最小提前预订小时 - allow_same_day_booking: true # 允许当日预订 - auto_confirm_booking: false # 自动确认预订 财务参数配置: - default_currency: CNY # 默认货币 - tax_rate: 0.06 # 税率 - deposit_percentage: 0.3 # 押金比例 - cancellation_fee_rate: 0.1 # 取消费率 界面外观配置: - theme_color: "#409EFF" # 主题色 - logo_url: "/images/logo.png" # 品牌标识 - welcome_message: "欢迎入住" # 欢迎语 ``` ### 11.6 配置模板管理 (新增功能) **数据表**: 扩展 `pms_tenant_settings` 和 `pms_mp_settings` **数据隔离**: 租户级 **配置模板功能**: - 预定义配置模板:快速部署标准配置方案 - 模板分类管理:按业务场景分类(经济型、标准型、豪华型) - 模板应用机制:一键应用模板到租户或门店 - 模板导入导出:支持配置方案的备份和迁移 - 模板版本管理:支持模板的版本控制和回滚 ### 11.7 系统监控与审计 (新增功能) **数据表**: 利用系统日志表和配置变更记录 **数据隔离**: 租户级 **监控功能**: - 配置变更监控:实时监控配置项的变更情况 - 用户行为监控:跟踪用户的配置操作行为 - 性能监控:监控配置加载和应用的性能指标 - 安全审计:记录敏感配置的访问和修改日志 - 报警管理:配置异常变更的自动报警机制 ### 11.8 配置继承与覆盖机制 (详细定义) **实现方式**: 通过 `dept_id` 字段的空值处理 **继承规则**: - 租户级配置:`dept_id` 为 NULL,作为默认配置 - 门店级配置:`dept_id` 非空,覆盖租户级配置 - 查询优先级:门店级配置 > 租户级配置 > 系统默认配置 - 配置合并:支持部分覆盖,未设置的项目继承上级配置 **覆盖策略**: ```yaml 配置查询逻辑: 1. 查询门店级配置 (dept_id = 当前门店ID) 2. 如果不存在,查询租户级配置 (dept_id IS NULL) 3. 如果仍不存在,使用系统默认值 4. 返回最终配置值 配置设置逻辑: 1. 门店级设置:直接设置 dept_id = 门店ID 2. 租户级设置:设置 dept_id = NULL 3. 删除门店级配置:恢复继承租户级配置 ``` ### 11.9 敏感配置安全管理 (详细定义) **安全机制**: 通过 `is_sensitive` 字段标识 **安全功能**: - 加密存储:敏感配置值使用AES加密存储 - 访问控制:敏感配置需要特殊权限才能查看和修改 - 操作审计:所有敏感配置的操作都记录详细日志 - 脱敏显示:前端显示时对敏感信息进行脱敏处理 - 权限分级:不同角色对敏感配置有不同的访问权限 **敏感配置示例**: ```yaml 支付配置: - wechat_app_secret: "加密存储的微信小程序密钥" - alipay_private_key: "加密存储的支付宝私钥" - payment_callback_token: "加密存储的支付回调令牌" 第三方接口配置: - sms_api_key: "加密存储的短信服务API密钥" - email_smtp_password: "加密存储的邮件服务密码" - map_api_secret: "加密存储的地图服务密钥" ``` ### 11.10 用户设备管理详细功能 (详细定义) **数据表**: `pms_tenant_user_devices` **数据隔离**: 租户级 **设备注册与管理**: - 自动设备注册:用户登录时自动注册设备信息 - 设备信息收集:设备类型、设备名称、操作系统版本、应用版本 - 设备状态管理:活跃、不活跃、过期、阻止等状态控制 - 多设备支持:同一用户可在多个设备上登录 **推送令牌管理**: - 令牌自动更新:设备令牌变更时自动更新 - 推送开关控制:用户可控制是否接收推送通知 - 推送历史记录:记录推送消息的发送和接收状态 - 批量推送支持:支持按设备类型、用户群体批量推送 **安全审计功能**: - 登录历史记录:记录每次登录的时间、IP地址、位置信息 - 异常登录检测:检测异常登录行为并发出警告 - 设备锁定机制:可远程锁定或解锁特定设备 - 登录统计分析:提供用户登录行为的统计分析 ### 11.11 小程序配置管理详细功能 (详细定义) **数据表**: `pms_mp_settings` **数据隔离**: 租户级和门店级 **主题配置管理**: - 颜色主题:主色调、辅助色、背景色、文字色 - 品牌元素:Logo、品牌名称、Slogan、品牌介绍 - 界面布局:首页布局、菜单样式、按钮样式 - 多主题支持:支持预设主题和自定义主题 **功能开关管理**: - 业务功能:在线预订、在线支付、客房服务、意见反馈 - 营销功能:优惠券、积分系统、会员等级、推荐奖励 - 社交功能:分享功能、评价系统、客服聊天 - 高级功能:人脸识别、语音助手、AR看房 **支付配置管理**: - 支付方式:微信支付、支付宝、银联支付、现金支付 - 支付参数:商户号、密钥配置、回调地址 - 支付流程:支付超时时间、重试机制、退款策略 - 支付安全:支付验证、风控规则、异常监控 **通知配置管理**: - 通知类型:预订确认、入住提醒、退房提醒、活动通知 - 通知渠道:小程序消息、短信通知、邮件通知 - 通知时机:提前通知时间、重复提醒设置 - 通知模板:消息模板管理、个性化内容设置 ## 12. 业务流程设计 ### 12.1 客户管理流程 ```mermaid flowchart TD A[客户初次接触] --> B{是否已有档案} B -->|否| C[创建客户档案] B -->|是| D[更新客户信息] C --> E[分配客户标签] D --> E E --> F[关联订单信息] F --> G[更新客户统计] G --> H[推送营销活动] I[门店员工] --> J[查看租户级客户] J --> K[任意门店可见同一客户] K --> L[提升服务连贯性] ``` ### 12.2 房态管理流程 ```mermaid flowchart TD A[客人退房] --> B[房间状态变更为脏房] B --> C[分配清洁任务] C --> D[清洁人员开始清洁] D --> E[清洁状态更新为清洁中] E --> F[清洁完成] F --> G[查房人员检查] G --> H{查房是否通过} H -->|通过| I[房间状态变更为可用] H -->|不通过| J[重新清洁] J --> E I --> K[房间可供预订] L[维护需求] --> M[房间锁定] M --> N[维护任务执行] N --> O[维护完成解锁] O --> I ``` ### 12.3 动态定价流程 ```mermaid flowchart TD A[客户查询房价] --> B[获取房型基础价格] B --> C[查询适用的价格规则] C --> D[按优先级排序规则] D --> E[应用价格调整] E --> F[计算最终价格] F --> G[返回价格信息] H[价格规则管理] --> I[创建价格规则] I --> J[设置适用条件] J --> K[设置调整类型和值] K --> L[设置优先级] L --> M[激活规则] ``` ### 12.4 订单处理流程 ```mermaid flowchart TD A[接收订单] --> B[验证房型可用性] B --> C[计算动态价格] C --> D[关联客户档案] D --> E[生成订单记录] E --> F[分配房间] F --> G[生成账单] G --> H[处理支付] H --> I[确认订单] I --> J[入住流程] J --> K[房态更新] K --> L[退房结算] ``` ### 12.5 财务结算流程 ```mermaid flowchart TD A[订单确认] --> B[生成账单Folio] B --> C[添加房费项目] C --> D[添加附加费用] D --> E[计算总金额] E --> F[客户付款] F --> G[记录交易流水] G --> H[更新账单状态] H --> I{是否结清} I -->|是| J[关闭账单] I -->|否| K[等待后续付款] K --> F J --> L[生成财务报表] ``` ### 12.6 入住登记优化流程 ```mermaid flowchart TD A[订单确认] --> B[查询主联系人档案] B --> C[预填入住信息] C --> D[录入同行客人] D --> E{客人是否已有档案} E -->|是| F[关联现有档案] E -->|否| G[选择创建新档案] F --> H[完成入住登记] G --> I[创建客户档案] I --> H H --> J[更新客户统计] J --> K[房态更新] ``` ### 12.7 客户档案维护流程 ```mermaid flowchart TD A[客人入住] --> B[记录入住信息] B --> C[更新客户统计] C --> D[分析客户偏好] D --> E[更新会员等级] E --> F[推送个性化服务] F --> G[记录服务反馈] G --> H[优化偏好模型] ``` ## 13. 接口设计规范 ### 13.0 通用约定 #### 13.0.1 标准成功响应结构 所有查询类(GET)和操作成功类(POST, PUT, DELETE 无特定返回内容时)的API在成功时,应返回如下结构体: ```json { "code": 0, // 0 表示成功,其他业务错误码见下文 "message": "操作成功", // 或 "查询成功" "data": { // 对于列表查询,通常包含 list 和 total/page/size // 对于单个对象查询或创建/更新操作,直接是对象本身或其ID } } ``` #### 13.0.2 标准错误响应结构 当发生业务逻辑错误、参数校验失败、权限不足或服务器内部错误时,API应返回统一的错误结构体: ```json { "code": 10001, // 具体业务错误码,非0 "message": "具体的错误描述信息", // 例如 "参数校验失败:名称不能为空" "details": [ // 可选,用于提供更详细的错误点,例如多字段校验失败 {"field": "fieldName", "message": "错误详情"} ] } ``` **通用HTTP状态码约定:** - `200 OK`: GET请求成功,PUT/PATCH部分更新成功。 - `201 Created`: POST请求成功创建资源。 - `204 No Content`: DELETE请求成功,响应体中无内容。 - `400 Bad Request`: 请求参数校验失败、请求体格式错误。 - `401 Unauthorized`: 未认证或认证无效。 - `403 Forbidden`: 已认证但无权限访问该资源。 - `404 Not Found`: 请求的资源不存在。 - `422 Unprocessable Entity`: 请求格式正确,但由于含有语义错误,无法响应。(例如,尝试创建一个已存在的唯一资源) - `500 Internal Server Error`: 服务器内部发生未预期错误。 #### 13.0.3 分页参数约定 - `page` (integer, optional, default: 1): 请求的页码,从1开始。 - `size` (integer, optional, default: 10): 每页返回的记录数量,建议服务端限制最大值 (如100)。 #### 13.0.4 日期时间格式 - 所有API请求和响应中的日期时间格式统一使用 ISO 8601 格式,例如: `YYYY-MM-DDTHH:mm:ssZ` (UTC时间) 或 `YYYY-MM-DD HH:mm:ss` (带时区信息,具体由后端统一确定并在此明确)。推荐使用UTC时间。 ### 13.1 客户管理API #### 13.1.1 查询客户联系人列表 ```http GET /api/pms/customer-contacts ``` **描述**: 查询当前租户下的客户联系人列表,支持分页和多种条件筛选。多租户拦截器自动添加 `tenant_id` 过滤。 **权限**: `pms:customerContacts:list` (示例权限点) **查询参数**: - `page` (integer, optional, default: 1): 页码。 - `size` (integer, optional, default: 10): 每页数量。 - `contactType` (string, optional): 联系人类型 (枚举值参考《PMS数据模型设计文档》中 `pms_customer_contacts.contact_type` 定义)。 - `contactStatus` (string, optional): 联系人状态 (枚举值参考《PMS数据模型设计文档》中 `pms_customer_contacts.contact_status` 定义)。 - `memberLevel` (string, optional): 会员等级 (枚举值参考《PMS数据模型设计文档》中 `pms_customer_contacts.member_level` 定义)。 - `fullName` (string, optional, maxLength: 255): 联系人姓名 (模糊查询)。 - `phoneNumber` (string, optional, maxLength: 50): 联系电话 (精确或模糊查询)。 - `idNumber` (string, optional): 证件号码 (精确查询, 后端需处理加密匹配)。 (**注意隐私和安全风险,仅在必要且有权限时提供此查询方式**) - `tagId` (long, optional): 包含指定标签ID的联系人。 - `sortBy` (string, optional, enum: `createTime`, `lastStayDate`, `totalAmount`): 排序字段。 - `sortOrder` (string, optional, enum: `asc`, `desc`, default: `desc`): 排序顺序。 **成功响应 (200 OK)**: ```json { "code": 0, "message": "查询成功", "data": { "list": [ { "contactId": 1001, "tenantId": "T001", "contactType": "individual_guest", "fullName": "张三", "phoneNumber": "13800138000", "email": "zhangsan@example.com", "gender": "male", // 枚举值参考 PMS数据模型.md 5.1节 "dateOfBirth": "1990-01-01", "idType": "ID_CARD", // 枚举值 "idNumberMasked": "340***********1234", // 脱敏显示 "nationalityCountryCode": "CHN", "addressProvince": "安徽省", "addressCity": "合肥市", "addressDistrict": "蜀山区", "addressDetail": "望江西路xxx号", "postalCode": "230000", "contactStatus": "active", "memberLevel": "gold", "totalStays": 5, "totalAmount": 2500.00, "lastStayDate": "2023-10-01", "remarks": "重要客户", "createTime": "2023-01-15T10:30:00Z", "updateTime": "2023-10-02T08:00:00Z", "tags": [ {"tagId": 1, "name": "常客", "color": "#FF0000", "category": "contact_level"}, {"tagId": 5, "name": "喜欢安静房间", "color": "#00FF00", "category": "contact_preference"} ] } ], "total": 120, "page": 1, "size": 10 } } ``` #### 13.1.2 创建客户联系人 ```http POST /api/pms/customer-contacts ``` **描述**: 创建一个新的客户联系人档案。 **权限**: `pms:customerContacts:add` **请求体 (application/json)**: (字段参考 `pms_customer_contacts` 表定义,非所有字段都可创建,例如 `totalStays` 等统计字段后端自动处理) ```json { "contactType": "individual_guest", // (string, required, 枚举值参考《PMS数据模型设计文档》中 pms_customer_contacts.contact_type 定义) "fullName": "李四", // (string, required, minLength: 1, maxLength: 255) "phoneNumber": "13900139000", // (string, optional, unique in tenant, valid mobile format) "email": "lisi@example.com", // (string, optional, valid email format, maxLength: 255) "gender": "female", // (string, optional, 枚举值参考《PMS数据模型设计文档》中 pms_customer_contacts.gender 定义) "dateOfBirth": "1995-05-15", // (string, optional, format: YYYY-MM-DD) "idType": "ID_CARD", // (string, optional, enum, e.g., ID_CARD, PASSPORT) "idNumber": "34012319950515123X", // (string, optional, valid for idType, backend encrypts) "nationalityCountryCode": "CHN", // (string, optional, ISO 3166-1 alpha-3 code) "addressProvince": "北京市", // (string, optional, maxLength: 100) "addressCity": "北京市", // (string, optional, maxLength: 100) "addressDistrict": "朝阳区", // (string, optional, maxLength: 100) "addressDetail": "建国路xx号", // (string, optional, maxLength: 500) "postalCode": "100000", // (string, optional, valid postal code format) "memberLevel": "silver", // (string, optional, 枚举值参考《PMS数据模型设计文档》中 pms_customer_contacts.member_level 定义) "remarks": "希望高楼层", // (string, optional, maxLength: 1000) "tagIds": [1, 5] // (array of long, optional): 创建时直接关联的标签ID } ``` *注:`idNumber` 由前端传递明文,后端负责加密存储。电话号码在租户内应唯一(如果非空)。* **成功响应 (201 Created)**: ```json { "code": 0, "message": "客户联系人创建成功", "data": { "contactId": 1002 // 新创建的联系人ID // 可以考虑返回完整创建的资源,或至少关键信息 // "contactId": 1002, // "fullName": "李四", // "contactType": "individual_guest", // ... } } ``` #### 13.1.3 查询单个客户联系人详情 ```http GET /api/pms/customer-contacts/{contactId} ``` **描述**: 根据联系人ID查询其详细信息。 **权限**: `pms:customerContacts:view` 或 用户为该联系人本人 (需特定逻辑) **路径参数**: - `contactId` (long, required): 客户联系人ID。 **成功响应 (200 OK)**: ```json { "code": 0, "message": "查询成功", "data": { // 结构同 13.1.1 查询列表中的单项,但可能包含更多详情字段 "contactId": 1001, "tenantId": "T001", "contactType": "individual_guest", "fullName": "张三", "phoneNumber": "13800138000", "email": "zhangsan@example.com", "wechatOpenid": "wxopenid...", // 示例,若有 "wechatUnionid": "wxunionid...", // 示例,若有 "gender": "male", "dateOfBirth": "1990-01-01", "idType": "ID_CARD", "idNumberEncrypted": "xxxxxxx", // 后端存储的加密串,不直接返回给不具备权限的前端 "idNumberMasked": "340***********1234", // 脱敏显示给前端 "nationalityCountryCode": "CHN", "addressProvince": "安徽省", "addressCity": "合肥市", "addressDistrict": "蜀山区", "addressDetail": "望江西路xxx号", "postalCode": "230000", "contactStatus": "active", "memberLevel": "gold", "totalStays": 5, "totalAmount": 2500.00, "lastStayDate": "2023-10-01", "remarks": "重要客户", "createDept": 103, // 创建部门ID "createBy": 1, // 创建人用户ID "createTime": "2023-01-15T10:30:00Z", "updateBy": 2, "updateTime": "2023-10-02T08:00:00Z", "tags": [ {"tagId": 1, "name": "常客", "color": "#FF0000", "category": "contact_level", "isSystem": false, "sortOrder": 1}, {"tagId": 5, "name": "喜欢安静房间", "color": "#00FF00", "category": "contact_preference", "isSystem": false, "sortOrder": 2} ], "historicalOrders": [ // 简要历史订单信息,可分页 {"orderId": 9001, "orderStatus": "checked_out", "checkInDate": "2023-10-01", "totalAmount": 500.00, "deptId": 103, "deptName": "黄山路店"} ] } } ``` #### 13.1.4 更新客户联系人信息 ```http PUT /api/pms/customer-contacts/{contactId} ``` **描述**: 更新指定ID的客户联系人信息。 **权限**: `pms:customerContacts:edit` **路径参数**: - `contactId` (long, required): 要更新的客户联系人ID。 **请求体 (application/json)**: (字段同创建,但所有字段可选,仅提供需要修改的字段) ```json { "fullName": "李四新", "phoneNumber": "13900139001", "email": "lisi.new@example.com", "memberLevel": "platinum", "remarks": "更新备注信息" // 不允许直接修改 tenantId, contactId, createTime 等系统控制字段 } ``` **成功响应 (200 OK)**: ```json { "code": 0, "message": "客户联系人更新成功", "data": { "contactId": 1002 // 更新后的联系人ID,或返回完整更新后的对象 } } ``` #### 13.1.5 删除客户联系人 ```http DELETE /api/pms/customer-contacts/{contactId} ``` **描述**: 删除(逻辑删除)指定ID的客户联系人。 **权限**: `pms:customerContacts:delete` **路径参数**: - `contactId` (long, required): 要删除的客户联系人ID。 **成功响应 (204 No Content)**: (无响应体) **业务规则**: - 删除前检查该联系人是否有未完成的订单或未结清的账务。若有,根据策略可能禁止删除或提示用户。 - 逻辑删除,`del_flag` 置为 '1'。 #### 13.1.6 为客户批量添加标签 ```http POST /api/pms/customer-contacts/{contactId}/tags ``` **描述**: 为指定的客户联系人批量添加一个或多个标签。 **权限**: `pms:customerContacts:manageTags` **路径参数**: - `contactId` (long, required): 客户联系人ID。 **请求体 (application/json)**: ```json { "tagIds": [3, 7] // (array of long, required, non-empty): 要添加的标签ID列表 } ``` **成功响应 (200 OK)**: ```json { "code": 0, "message": "标签添加成功" // "data": {"addedCount": 2, "existingCount": 0} // 可选返回操作详情 } ``` **业务规则**: - 标签ID必须是当前租户下有效的(租户级或客户所属门店的门店级标签)。 - 如果客户已有关联的标签,则忽略。 #### 13.1.7 从客户批量移除标签 ```http DELETE /api/pms/customer-contacts/{contactId}/tags ``` **描述**: 从指定的客户联系人批量移除一个或多个标签。 **权限**: `pms:customerContacts:manageTags` **路径参数**: - `contactId` (long, required): 客户联系人ID。 **请求体 (application/json)**: ```json { "tagIds": [1, 5] // (array of long, required, non-empty): 要移除的标签ID列表 } ``` **成功响应 (200 OK)**: ```json { "code": 0, "message": "标签移除成功" // "data": {"removedCount": 2} // 可选返回操作详情 } ``` --- ### 13.2 联系人标签API (示例待细化) ```http # 客户标签查询 (支持门店级和租户级) GET /api/pms/contact-tags?deptId=103&category=contact_level # 查询指定门店的标签,包含门店级和租户级标签 # 创建客户标签 POST /api/pms/contact-tags # ...请求体包含 name, color, category, deptId (可选,门店级) # 更新客户标签 PUT /api/pms/contact-tags/{tagId} # 删除客户标签 DELETE /api/pms/contact-tags/{tagId} ``` ### 13.3 房态管理API (示例待细化) ```http # 房态实时查询 (日历视图/列表视图) GET /api/pms/room-status?deptId=103&date=2024-01-01&viewType=calendar&startDate=...&endDate=... # 返回指定门店指定日期范围的房态信息 # 房间锁定 POST /api/pms/room-locks { "roomId": 201, // (long, required) "deptId": 103, // (long, required) "lockType": "maintenance", // (string, required, enum) "startDatetime": "2024-01-01T14:00:00Z", // (datetime, required) "endDatetime": "2024-01-01T18:00:00Z", // (datetime, required, must be after startDatetime) "reason": "空调维修" // (string, optional, maxLength: 500) } # 解锁房间 (删除房间锁定记录或更新其状态) DELETE /api/pms/room-locks/{lockId} # 清洁状态更新 PUT /api/pms/rooms/{roomId}/cleaning-status { "cleaningStatus": "cleaning_in_progress", // (string, required, enum) "cleanerId": 1001 // (long, optional, 关联 sys_user.user_id) } ``` ### 13.4 价格管理API (示例待细化) ```http # 价格查询 (计算特定房型在某时段的价格) GET /api/pms/pricing/calculate?deptId=103&roomTypeId=101&checkInDate=2024-01-01&checkOutDate=2024-01-03&guests=2&channelCode=DIRECT # 返回动态计算后的价格信息,包括明细 # 价格规则管理 GET /api/pms/pricing-rules?deptId=103&roomTypeId=101&status=active POST /api/pms/pricing-rules { "deptId": 103, // (long, required if not tenant-level rule) "name": "周末特价", // (string, required, maxLength: 100) "roomTypeId": 101, // (long, optional, null for all room types in dept/tenant) "dateRangeStart": "2024-01-01", // (date, required) "dateRangeEnd": "2024-12-31", // (date, required, must be after start) "daysOfWeekJson": "[6,7]", // (json array of int [1-7], optional) "priceAdjustmentType": "percentage_discount_from_base", // (string, required, enum) "adjustmentValue": 15.00, // (decimal, required, e.g., 15.00 for 15%) "minLOS": 1, // (int, optional, min length of stay) "maxLOS": null, // (int, optional, max length of stay) "priority": 10, // (int, required, higher value means higher priority) "status": "active" // (string, required, enum: active, inactive) } PUT /api/pms/pricing-rules/{ruleId} DELETE /api/pms/pricing-rules/{ruleId} ``` ### 13.5 订单管理API (示例待细化) ```http # 订单查询 (门店级隔离) GET /api/pms/orders?deptId=103&orderStatus=confirmed&checkInDate=2024-01-01 # 多租户拦截器 + 门店级权限控制 # 创建订单 (关联租户级客户) POST /api/pms/orders { "deptId": 103, // (long, required) "contactId": 1001, // (long, required, 关联租户级共享的客户) "roomTypeId": 201, // (long, required) "checkInDate": "2024-01-01", // (date, required) "checkOutDate": "2024-01-03", // (date, required, must be after checkInDate) "numAdults": 2, // (int, required, min: 1) "numChildren": 0, // (int, optional, default: 0) "channelId": 4, // (long, required, 渠道信息) "orderSource": "direct_phone", // (string, optional, enum from 5.3.4) "totalAmountCalculated": 1200.00, // (decimal, optional, 前端可预计算,后端需再校验和计算) "notes": "客人要求安静房间" // (string, optional) } # 获取订单详情 GET /api/pms/orders/{orderId}?deptId=103 # 修改订单状态 (例如:确认订单、取消订单、办理入住、办理退房) PUT /api/pms/orders/{orderId}/status { "deptId": 103, // (long, required) "orderStatus": "checked_in", // (string, required, enum) "assignedRoomId": 301, // (long, optional, required if checking in) "notes": "客人已入住301房间" // (string, optional) } # 修改订单信息 (例如:修改联系人、延住) PUT /api/pms/orders/{orderId} # ...请求体包含可修改的订单字段 ``` ### 13.6 财务管理API (示例待细化) ```http # 账单查询 GET /api/pms/finance/folios?deptId=103&orderId=123&folioStatus=open # 查询指定门店的开放账单 # 获取账单详情 GET /api/pms/finance/folios/{folioId}?deptId=103 # 添加账单项目 (手动添加费用) POST /api/pms/finance/folios/{folioId}/items { "deptId": 103, "description": "额外早餐", // (string, required) "quantity": 1, // (int, required) "unitPrice": 50.00, // (decimal, required) "productType": "extra_service", // (string, required) "serviceDate": "2024-01-02" // (date, required) } # 记录交易 (收款、退款等) POST /api/pms/finance/transactions { "deptId": 103, // (long, required) "folioId": 1001, // (long, required) "transactionType": "payment", // (string, required, enum from 5.3.5) "amount": 500.00, // (decimal, required, positive for payment/charge, negative for refund) "paymentMethodId": 1, // (long, required if type is payment/refund) "description": "房费支付 - 支付宝", // (string, required) "paymentGatewayTxnId": "ALIPAY_TXN_12345" // (string, optional) } # 获取支付方式列表 GET /api/pms/finance/payment-methods?deptId=103&status=active # 获取附加费用项目列表 GET /api/pms/finance/extra-charge-items?deptId=103&category=food_beverage ``` ## 14. 用户界面设计 ### 14.1 客户管理页面 **客户列表页面**: - 支持按客户类型、状态、标签筛选 - 显示客户基本信息、最近入住时间、消费金额 - 支持批量操作:添加标签、状态变更 **客户详情页面**: - 客户基础信息编辑 - 标签管理:添加/移除标签,支持颜色显示 - 住宿历史:显示在租户内所有门店的住宿记录 - 消费统计:总消费、入住次数、平均消费 ### 14.2 房态管理页面 **房态总览页面**: - 房间状态可视化:网格布局显示所有房间状态 - 颜色编码:可用(绿色)、占用(红色)、维护(黄色)、锁定(灰色) - 实时更新:房态变更自动刷新 - 快速操作:点击房间快速变更状态 ### 14.3 价格管理页面 **价格规则管理**: - 规则列表:显示所有价格规则及状态 - 规则创建向导:分步骤创建复杂规则 - 规则优先级拖拽排序 - 规则效果预览:显示规则应用后的价格变化 ### 14.4 订单管理页面 **订单列表**: - 按门店筛选,显示当前门店订单 - 客户信息显示:关联租户级客户档案 - 支持快速操作:房间分配、状态变更 ## 15. 非功能性需求 ### 15.1 性能要求 - **响应时间**: 页面加载时间 < 3秒,API响应时间 < 500ms - **并发用户**: 支持1000个并发用户同时在线 - **数据处理**: 支持单租户10万条订单记录的快速查询 - **房态更新**: 房间状态变更实时推送延迟 < 1秒 ### 15.2 可用性要求 - **系统可用性**: 99.5%以上的系统可用性 - **故障恢复**: 系统故障后5分钟内恢复服务 - **数据备份**: 每日自动备份,支持7天内数据恢复 - **容灾机制**: 支持异地容灾,RTO < 4小时,RPO < 1小时 ### 15.3 安全性要求 - **数据加密**: 敏感数据AES-256加密存储 - **传输安全**: HTTPS/TLS 1.3加密传输 - **访问控制**: 基于RBAC的细粒度权限控制 - **审计日志**: 完整的操作审计日志,保存180天 ### 15.4 兼容性要求 - **浏览器兼容**: 支持Chrome 80+、Firefox 75+、Safari 13+、Edge 80+ - **移动设备**: 支持iOS 12+、Android 8.0+ - **数据库**: MySQL 8.0+、Redis 6.0+ - **API兼容**: RESTful API,支持JSON格式 ## 16. 技术实现要求 ### 16.1 数据库设计 - 所有PMS业务表含 `tenant_id` 字段,支持多租户拦截器 - 客户相关表使用 `customer_contacts` 术语,体现业务准确性 - 索引设计优先考虑 `(tenant_id, dept_id, 业务字段)` 复合索引 ### 16.2 缓存策略 - 客户标签缓存:租户级标签缓存,减少数据库查询 - 房间状态缓存:实时更新房间可用性 - 价格规则缓存:缓存活跃的价格规则,提升计算性能 - 权限数据缓存:用户权限和门店信息缓存 - 配置缓存:系统配置信息缓存,支持热更新 ### 16.3 性能优化 - 客户查询优化:使用复合索引支持多条件查询 - 标签关联优化:批量查询客户标签关系 - 房态查询优化:房间状态查询使用索引优化 - 价格计算优化:规则引擎缓存和并行计算 - 分页查询:所有列表页面支持分页和排序 ### 16.4 多租户拦截器配置 ```yaml # application.yml tenant: enable: true excludes: # 若依系统表 - sys_menu - sys_tenant - sys_tenant_package - sys_role_dept - sys_role_menu - sys_user_post - sys_user_role - sys_client - sys_oss_config # PMS供应商合作伙伴表 (支持全局共享,需从标准拦截器中排除,业务层处理 tenant_id IS NULL 或特定 tenant_id) - pms_suppliers - pms_partners ``` ### 16.5 权限控制最佳实践 1. **联系人信息**: 直接查询,让多租户拦截器自动处理(`tenant_id` 过滤)。 2. **联系人标签**: 业务层添加 `(dept_id = #{currentDeptId} OR dept_id IS NULL)` 条件,结合多租户拦截器实现门店级和租户级标签的查询。 3. **订单等门店级数据**: 多租户拦截器自动处理 `tenant_id`,业务代码中需额外添加 `dept_id` 过滤。 4. **供应商与合作伙伴**: 由于支持平台级共享(`tenant_id` IS NULL)和租户级数据,这些表已从标准多租户拦截器中排除。业务层查询时需手动处理 `tenant_id` 条件,例如 `WHERE (tenant_id IS NULL OR tenant_id = #{currentTenantId})`。 ## 17. 部署与运维 ### 17.1 移动端支持 #### 17.1.1 小程序 (核心管理功能) - 移动端房态总览与状态变更 (清洁, 维护, 占用等) - 客户信息快速查询与核心信息编辑 - 订单创建、查看、修改与核心处理 (如分配房间, 办理入住/退房) - 日常清洁与维护任务分配与状态更新 - 基础价格查看 (价格调整可能仍需后台) - 接收重要系统通知与告警 ### 17.2 安全与合规 #### 17.2.1 数据安全 - 租户间数据完全隔离 - 客户隐私信息加密存储(身份证号等) - 操作日志记录和审计 - 敏感配置加密存储 #### 17.2.2 权限控制 - 基于角色的访问控制 - 门店级数据权限隔离 - API接口权限验证 - 配置修改权限控制 ### 17.3 监控与运维 - **系统监控**: CPU、内存、磁盘、网络监控 - **应用监控**: 接口响应时间、错误率、吞吐量 - **业务监控**: 订单量、房态变更、支付成功率 - **日志管理**: 集中化日志收集、分析、告警 ### 17.4 部署架构 - **容器化部署**: Docker + Kubernetes - **负载均衡**: Nginx + Keepalived - **数据库集群**: MySQL主从复制 + Redis集群 - **文件存储**: 阿里云OSS / MinIO --- **版本历史:** - v1.0 - 初始版本,基本功能需求 - v2.0 - 增加多租户和权限控制需求 - v3.0 - 联系人管理重构,采用标准化表结构和权限模型 - v4.0 - 完整版需求文档,整合所有功能模块和技术要求 - v4.1 - 订单管理和价格管理功能增强,补充状态追踪、时间管理、客人信息、价格历史、特殊日期价格等高级功能 - v4.2 - 客人信息管理优化,增强客人与联系人档案的关联管理,完善入住登记和客户档案维护流程 - v4.3 - 系统配置管理模块完善,新增配置模板管理、系统监控、敏感配置安全管理、用户设备管理等功能 **重要变更说明 (v4.3):** - **系统配置管理功能完善**: 新增配置模板管理、系统监控与审计、配置继承与覆盖机制、敏感配置安全管理等高级功能 - **用户设备管理**: 新增用户设备注册、推送令牌管理、安全审计、多设备支持等功能 - **小程序配置管理**: 新增主题配置、功能开关、支付配置、通知配置等小程序专项管理功能 - **配置安全增强**: 支持敏感配置加密存储、访问控制、操作审计、脱敏显示等安全机制 - **配置继承机制**: 完善租户级和门店级配置的继承与覆盖逻辑,支持灵活的配置管理策略 - **系统监控功能**: 新增配置变更监控、用户行为监控、性能监控、安全审计、报警管理等监控功能 **重要变更说明 (v4.2):** - **客人信息管理优化**: 完善 `pms_order_guests` 表设计,支持与客户档案的智能关联 - **入住登记流程优化**: 支持主联系人自动关联、同行客人档案匹配、新档案创建等功能 - **客户档案维护**: 增强客户信息同步、统计更新、偏好分析等功能 - **数据一致性保障**: 通过关联查询避免数据冗余,确保客户信息的一致性和准确性 **重要变更说明 (v4.1):** - **订单管理功能增强**: 新增订单状态历史追踪、订单时间管理、入住客人信息管理、库存管理与房态联动等功能模块 - **价格管理功能完善**: 新增价格计算历史追踪、特殊日期价格管理、高级价格规则、价格策略分析等功能模块 - **数据表补充**: 新增 `pms_order_status_history`、`pms_order_guests`、`pms_pricing_calculations`、`pms_special_date_pricing`、`pms_room_inventory_snapshot` 等数据表支持 - **功能优先级调整**: 重新评估和调整各功能模块的优先级,确保核心功能优先实现 - **业务流程优化**: 完善订单生命周期管理和价格计算流程,提升系统的业务支撑能力