# 运营平台及应用管理 PRD (MVP版本) v1.2.3

## 文档信息

| 项目 | 内容 |
| :--- | :--- |
| 文档名称 | 运营平台及应用管理 PRD (MVP版本) |
| 文档版本 | v1.2.3 |
| 创建日期 | 2026-02-12 |
| 最后更新 | 2026-02-28 |
| 文档状态 | 草稿 |
| 维护人 | Antigravity |

## 文档修订历史

| 版本号 | 修订日期 | 修订内容 | 修订人 |
| :--- | :--- | :--- | :--- |
| v1.2.3 | 2026-02-28 | 新增依赖配置状态展示（支付配置、短信推送配置），支持跳转对应模块配置页面 | Antigravity |
| v1.2.2 | 2026-02-13 | 优化业主登录逻辑（OpenID+手机号）、删除关联小区UI、移除页面路径限制 | Antigravity |
| v1.2.1 | 2026-02-13 | 修正权限设计、完善业主登录跨平台处理、新增删除应用配置影响说明 | Antigravity |
| v1.2.0 | 2026-02-13 | 修正应用与小区关联关系（间接关联），新增业主登录机制说明，明确配置生效时间行为 | Antigravity |
| v1.1.0 | 2026-02-13 | 补充业务逻辑说明：小区关联、权限边界、密码管理、配置验证、生效时间、删除影响、定时清理 | Antigravity |
| v1.0.0 | 2026-02-12 | 初始版本：MVP版本，聚焦核心功能 | Antigravity |

---

## 1. 产品概述

### 1.1 业务背景

物业管理系统采用多租户SaaS运营模式：
- **系统管理员（超管）**：作为软件技术提供方，负责管理整个平台、创建运营平台、配置应用
- **运营平台（渠道商）**：各地代理商，使用系统管理员配置的小程序并拓展小区
- **运营平台管理员**：管理运营平台下的小区和物业数据，无权管理应用配置
- **小区物业**：接入运营平台的小程序，使用统一的后台管理系统
- **业主用户**：通过小区关联的运营平台小程序进行登录和使用

**核心关联关系**：
- 一个运营平台可以有多个小区（1:N）
- 一个小区只能属于一个运营平台（N:1）
- 业主只能登录小区所属运营平台的小程序
- 运营平台管理员只能查看和管理自己平台下的数据

### 1.2 核心目标

构建最小可用的运营平台管理系统，满足以下核心场景：
1. 系统管理员手动创建运营平台（渠道商）
2. 系统管理员为运营平台配置微信小程序和服务号
3. 系统提供完整的应用申请指引
4. 实现多租户数据隔离，确保数据安全
5. 小区与运营平台强绑定，业主仅可访问所属运营平台的应用

### 1.3 MVP范围说明

**包含功能**：
- ✅ 运营平台管理（超管手动创建）
- ✅ 应用申请指引（完整步骤说明）
- ✅ 应用手动添加与配置
- ✅ 基础数据隔离
- ✅ 简单权限管理

**不包含功能**（后续迭代）：
- ❌ 渠道商在线申请审核流程
- ❌ 微信开放平台自动化集成
- ❌ 版本分级授权
- ❌ 配额管理
- ❌ 续费管理
- ❌ 运营数据看板
- ❌ 应用模板库

### 1.4 应用类型说明

每个运营平台需要配置以下3个微信应用：

| 应用类型 | 用户对象 | 主要功能 |
| :--- | :--- | :--- |
| 业主小程序 | 业主用户 | 物业缴费、报修、访客邀请、通知查看等 |
| 工具小程序 | 业委会、物业工作人员 | 工单处理、巡检打卡、设施管理等 |
| 微信服务号 | 业主用户（接收方） | 消息推送（缴费提醒、工单进度、活动通知等） |

### 1.5 小区与运营平台关联说明

**前置条件**：
- 小区管理模块已开发完成，不在本PRD范围内
- 小区管理功能由运营平台管理员操作

**关联规则**：
1. **创建小区时必须绑定运营平台**
   - 新建小区时，必须选择一个运营平台
   - 小区创建后即与运营平台建立绑定关系

2. **一个小区只能属于一个运营平台**
   - 小区与运营平台为N:1关系
   - 小区不能同时属于多个运营平台
   - 小区不能转移到其他运营平台（MVP版本限制）

3. **业主访问限制**
   - 业主只能登录小区所属运营平台的小程序
   - 业主无法跨运营平台登录
   - 业主通过小区ID识别所属运营平台

4. **数据隔离**
   - 运营平台管理员只能管理自己平台下的小区
   - 运营平台管理员只能查看自己平台下的物业数据
   - 不同运营平台之间数据完全隔离

### 1.6 应用与小区关联说明

**关联方式**：间接关联（通过运营平台）

**核心逻辑**：
- 小区在"小区管理"模块中已关联到运营平台
- 应用配置属于运营平台
- 小区自动使用所属运营平台的应用配置
- **不通过应用配置直接选择小区**

**关联关系图**：
```
运营平台 ← 应用配置
    ↑
    |
    | (N:1绑定)
    |
   小区
```

**说明**：
1. 系统管理员为运营平台配置3个应用（业主小程序、工具小程序、服务号）
2. 运营平台管理员在"小区管理"中创建小区并绑定到运营平台
3. 小区通过所属运营平台间接使用应用配置
4. MVP版本不支持在应用配置中手动选择小区

### 1.7 业主登录机制

**前置说明**：
- 小区管理模块和住户管理模块已开发完成
- 小区数据包含运营平台关联信息（tenant_id）
- 住户数据包含小区关联信息和微信OpenID

**登录流程**：

1. **住户信息预录入**
   - 物业管理人员在小程序后台提前录入住户信息
   - 包括：住户姓名、手机号、房号、身份证号等
   - 住户状态设为"已登记"

2. **业主登录**
   - 业主打开小程序，通过手机号验证码登录
   - 系统自动匹配预录入的住户信息

3. **平台识别与数据过滤**

   **场景1：已有OpenID（非首次登录）**
   - 小程序前端通过微信API获取用户OpenID
   - 后端根据AppID和OpenID查询住户信息
   - 过滤出该用户在当前AppID所属运营平台下的小区列表
   - 自动加载该运营平台的应用配置

   **场景2：没有OpenID（首次登录）**
   - 用户输入手机号验证码登录
   - 后端根据手机号查询住户信息
   - 过滤条件：该AppID所属运营平台下是否存在此住户
   - 如果存在：
     - 登录成功
     - 保存AppID与OpenID的关联关系
     - 后续登录走场景1流程
   - 如果不存在：
     - 提示"手机号未录入，请联系物业"

4. **跨平台场景自动处理**
   - 同一手机号在多个运营平台都有住户信息
   - 业主在A平台小程序登录：
     - 系统识别当前AppID属于A运营平台
     - 只查询和显示A平台下的小区和住户信息
   - 业主在B平台小程序登录：
     - 系统识别当前AppID属于B运营平台
     - 只查询和显示B平台下的小区和住户信息
   - 无需用户手动选择平台，完全自动识别

**查询链路说明**：
```
首次登录：
AppID → application_config(tenant_id) → 手机号+tenant_id → 住户信息 → 保存OpenID

后续登录：
AppID+OpenID → 住户信息 → 小区列表（自动过滤该AppID所属平台）
```

**登录限制**：
- 业主只能登录所属小区的运营平台小程序
- 无法登录其他运营平台的小程序
- 如手机号未预录入，则无法登录

### 1.6 角色与权限说明

| 角色 | 权限范围 | 主要职责 |
| :--- | :--- | :--- |
| 系统管理员（超管） | 全平台 | 创建运营平台、配置应用、管理所有数据 |
| 运营平台管理员 | 仅自己平台 | 管理小区、管理物业数据、不能管理应用配置 |
| 业主用户 | 仅自己小区 | 使用小程序功能，查看自己的数据 |

**权限边界**：
- 系统管理员负责运营平台和应用管理模块
- 运营平台管理员无权访问应用管理功能
- 运营平台管理员只能看到自己平台下的数据

---

## 2. 运营平台管理（系统管理员操作）

### 2.1 功能架构

```
运营平台管理
├── 运营平台列表
├── 创建运营平台
│   ├── 基础信息录入
│   └── 应用申请指引展示
├── 运营平台详情
│   ├── 基础信息
│   ├── 应用配置状态
│   └── 接入小区列表
└── 编辑运营平台
    ├── 修改基础信息
    └── 停用/启用
```

### 2.2 运营平台列表

#### 2.2.1 页面信息

**访问权限**：超级管理员
**页面标题**：运营平台管理

#### 2.2.2 页面布局

```
┌─────────────────────────────────────────────────────────────┐
│ 运营平台管理                                    [创建平台]   │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 搜索区域                                                     │
│ ┌──────────────────────┐  ┌──────────────┐  [搜索] [重置] │
│ │ 平台名称/平台ID       │  │ 状态筛选 ▼   │                 │
│ └──────────────────────┘  └──────────────┘                 │
│                                                              │
│ 数据列表                                                     │
│ ┌──────────────────────────────────────────────────────┐   │
│ │ 表格内容（见下方详细字段说明）                        │   │
│ └──────────────────────────────────────────────────────┘   │
│                                                              │
│ 分页区域                                                     │
│ 共 50 条 | 每页显示 10 条 | [1] 2 3 4 5 ... [下一页]      │
│                                                              │
└─────────────────────────────────────────────────────────────┘
```

#### 2.2.3 列表字段

| 字段名称 | 字段说明 | 列宽 | 对齐方式 | 数据示例 |
| :--- | :--- | :--- | :--- | :--- |
| 平台ID | 系统生成的唯一标识 | 120px | 左对齐 | tenant_abc123 |
| 平台名称 | 运营平台名称 | 200px | 左对齐 | XX物业管理公司 |
| 服务区域 | 省份-城市 | 150px | 左对齐 | 北京市-朝阳区 |
| 联系人 | 姓名 / 手机号 | 150px | 左对齐 | 张三 / 138****8888 |
| 小区数量 | 已接入的小区数量 | 80px | 居中 | 5 |
| 配置状态 | 支付/短信/应用配置状态标签 | 250px | 左对齐 | 标签组 |
| 状态 | 正常/已停用 | 80px | 居中 | 正常 |
| 创建时间 | YYYY-MM-DD HH:mm | 150px | 左对齐 | 2026-02-12 10:30 |
| 操作 | 操作按钮组 | 150px | 居中 | - |

**配置状态展示规则**：

配置状态列以标签形式展示未完成的配置项，点击标签可快速跳转到对应配置页面。

| 标签类型 | 图标 | 显示条件 | 点击跳转 |
| :--- | :--- | :--- | :--- |
| 💳 支付未配置 | 💳 | 未配置支付 | `/admin/payment-config/:tenant_id/setup` |
| 📨 短信未配置 | 📨 | 未配置短信 | `/admin/sms-config/:tenant_id/setup` |
| 📱 X个应用未配置 | 📱 | 有未配置的应用 | 跳转到平台详情页的应用配置区域 |
| ✓ 配置完成 | ✓ | 全部配置完成 | 无需跳转 |

**标签样式**：
- 未配置标签：黄色警告样式（黄色背景 + 深黄色文字），支持点击
- 配置完成标签：绿色成功样式（绿色背景 + 绿色文字）

**状态展示规则**：
- 正常：绿色圆点 + "正常"
- 已停用：灰色圆点 + "已停用"

#### 2.2.4 操作按钮

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 查看 | 跳转到详情页 `/admin/platforms/:id` | 查看运营平台详细信息 |
| 编辑 | 跳转到编辑页 `/admin/platforms/:id/edit` | 编辑运营平台基础信息 |
| 停用 | 弹出二次确认对话框 | 仅当状态为"正常"时显示 |
| 启用 | 弹出二次确认对话框 | 仅当状态为"已停用"时显示 |

#### 2.2.5 筛选功能

**搜索框**：
- 支持平台名称模糊搜索
- 支持平台ID精确搜索
- 实时搜索（输入后自动触发）

**状态筛选下拉框**：
- 全部
- 正常
- 已停用

#### 2.2.6 分页功能

- 默认每页显示：10条
- 可选每页显示：10条、20条、50条、100条
- 显示总条数和当前页码
- 支持快速跳转到指定页

### 2.3 创建运营平台

#### 2.3.1 页面信息

**访问权限**：超级管理员
**页面标题**：创建运营平台

#### 2.3.2 页面流程

创建运营平台分为两个步骤：
1. **步骤1**：填写基础信息表单
2. **步骤2**：保存成功后展示应用申请指引

#### 2.3.3 基础信息表单

##### 表单分组1：平台基本信息

| 字段名称 | 字段类型 | 是否必填 | 验证规则 | 提示信息 | 说明 |
| :--- | :--- | :---: | :--- | :--- | :--- |
| 平台名称 | 文本输入框 | ✓ | 2-100个字符 | 例如：XX物业管理公司 | 用于显示的平台名称 |
| 平台标识 | 文本框（只读） | - | 自动生成 | tenant_xxxxx (保存后自动生成唯一ID) | 系统自动生成，不可手动输入 |
| 公司名称 | 文本输入框 | ✓ | 2-200个字符 | 请输入完整的公司名称 | 营业执照上的公司全称 |
| 统一社会信用代码 | 文本输入框 | ✗ | 18位字符 | 请输入18位统一社会信用代码 | 用于微信认证，建议填写 |

##### 表单分组2：服务区域

| 字段名称 | 字段类型 | 是否必填 | 验证规则 | 提示信息 | 说明 |
| :--- | :--- | :---: | :--- | :--- | :--- |
| 服务省份 | 下拉选择框 | ✓ | 必须选择 | 请选择省份 | 省级行政区划 |
| 服务城市 | 下拉选择框 | ✓ | 必须选择 | 请选择城市 | 市级行政区划，根据省份联动 |

##### 表单分组3：联系人信息

| 字段名称 | 字段类型 | 是否必填 | 验证规则 | 提示信息 | 说明 |
| :--- | :--- | :---: | :--- | :--- | :--- |
| 联系人姓名 | 文本输入框 | ✓ | 2-50个字符 | 请输入联系人姓名 | 运营平台负责人姓名 |
| 联系人手机号 | 文本输入框 | ✓ | 11位数字 | 请输入11位手机号 | 用于接收登录信息 |
| 联系人邮箱 | 文本输入框 | ✗ | 邮箱格式 | 例如：zhangsan@example.com | 备用联系方式 |

##### 表单分组4：账号信息

| 字段名称 | 字段类型 | 是否必填 | 验证规则 | 提示信息 | 说明 |
| :--- | :--- | :---: | :--- | :--- | :--- |
| 登录账号 | 文本输入框 | ✓ | 手机号或邮箱格式 | 可使用手机号或邮箱 | 用于运营平台管理员登录后台 |
| 初始密码 | 文本框（只读） | - | 自动生成 | 系统自动生成，保存后通过短信/邮件发送 | 8-16位随机密码，包含大小写字母和数字 |

**密码管理说明**：
- 创建运营平台时系统自动生成初始密码
- 初始密码通过短信/邮件发送给联系人
- 运营平台管理员首次登录后可以修改密码
- 忘记密码需联系系统管理员重置
- 系统管理员可在运营平台详情页重置密码

##### 表单分组5：备注信息

| 字段名称 | 字段类型 | 是否必填 | 验证规则 | 提示信息 | 说明 |
| :--- | :--- | :---: | :--- | :--- | :--- |
| 备注 | 多行文本框 | ✗ | 最多500个字符 | 可填写补充说明 | 用于记录其他信息 |

#### 2.3.4 表单验证规则详细说明

**平台名称验证**：
- 必填
- 2-100个字符
- 支持中文、英文、数字、空格
- 前后不能有空格
- 不能与已有平台名称重复

**统一社会信用代码验证**：
- 非必填
- 如填写，必须为18位字符
- 格式：数字+大写字母
- 正则表达式：`^[0-9A-Z]{18}$`

**联系人手机号验证**：
- 必填
- 11位数字
- 以1开头
- 正则表达式：`^1[3-9]\d{9}$`

**联系人邮箱验证**：
- 非必填
- 如填写，必须符合邮箱格式
- 正则表达式：`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`

**登录账号验证**：
- 必填
- 可以是手机号或邮箱格式
- 不能与已有登录账号重复

#### 2.3.5 按钮功能

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 取消 | 返回运营平台列表页 | 不保存任何数据，弹窗确认是否放弃编辑 |
| 保存并查看指引 | 提交表单，保存数据 | 验证通过后保存，跳转到申请指引页面 |

#### 2.3.6 系统自动处理

创建运营平台时，系统自动执行以下操作：

**1. 生成租户ID（tenant_id）**
- 生成算法：`tenant_` + 时间戳 + 随机字符串（共20位）
- 示例：`tenant_1707728400abc`
- **唯一性保证**：
  - 生成后立即查询数据库验证唯一性
  - 如果重复则重新生成（最多尝试3次）
  - 数据库层面添加唯一索引约束
  - 生成失败则创建失败，提示系统错误

**2. 生成初始密码**
- 8-16位随机密码
- 包含大小写字母、数字
- 示例：`Abc12345`

**3. 发送通知**
- 短信通知：发送登录账号和初始密码到联系人手机
- 邮件通知（如有邮箱）：发送登录账号和初始密码到联系人邮箱

**4. 记录操作日志**
- 记录创建人
- 记录创建时间
- 记录IP地址

#### 2.3.7 应用申请指引页面

点击"保存并查看指引"后，跳转到创建成功页面。

**页面标题**：运营平台创建成功
```
┌─────────────────────────────────────────────────────────────┐
│ ✓ 运营平台创建成功！                                          │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 平台名称：XX物业管理公司                                       │
│ 平台ID：tenant_abc123                                        │
│ 登录账号：138****8888                                         │
│ 初始密码：已发送至联系人手机                                   │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 📱 接下来请完成微信应用申请和配置                              │
│                                                              │
│ 该运营平台需要申请以下微信应用：                               │
│   1. 业主小程序（面向业主用户）                                │
│   2. 工具小程序（面向物业工作人员）                            │
│   3. 微信服务号（用于消息推送）                                │
│                                                              │
│ ┌──────────────────────────────────────┐                    │
│ │ 应用 1: 业主小程序                    │ [展开详细步骤]      │
│ └──────────────────────────────────────┘                    │
│                                                              │
│ ┌──────────────────────────────────────┐                    │
│ │ 应用 2: 工具小程序                    │ [展开详细步骤]      │
│ └──────────────────────────────────────┘                    │
│                                                              │
│ ┌──────────────────────────────────────┐                    │
│ │ 应用 3: 微信服务号                    │ [展开详细步骤]      │
│ └──────────────────────────────────────┘                    │
│                                                              │
│                    [返回列表]  [去应用管理添加应用]            │
└─────────────────────────────────────────────────────────────┘
```

#### 2.3.8 应用申请指引展开/收起交互

**默认状态**：
- 3个应用的详细步骤默认收起
- 仅显示应用名称和"展开详细步骤"按钮

**展开交互**：
- 点击"展开详细步骤"按钮
- 使用手风琴效果展开
- 按钮文字变更为"收起详细步骤"
- 展开当前应用时，其他已展开的应用自动收起

**内容展示**：
- 使用卡片式布局
- 步骤之间用分隔线区分
- 重要提示使用高亮颜色标注
- 支持文本复制功能

#### 2.3.9 页面底部按钮

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 返回列表 | 跳转到运营平台列表页 | 返回 `/admin/platforms` |
| 去应用管理添加应用 | 跳转到该平台的应用管理页 | 跳转到 `/partner/applications?tenant_id=xxx` |

#### 2.3.10 申请步骤详细说明

本节详细列出3个应用的完整申请步骤，供运营平台参考。

##### 应用1：业主小程序申请步骤

```
┌─────────────────────────────────────────────────────────────┐
│ 📱 业主小程序申请步骤                                          │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第一步：注册小程序账号                                         │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 访问微信公众平台：https://mp.weixin.qq.com               │
│ 2. 点击右上角"立即注册"                                       │
│ 3. 选择"小程序"类型                                          │
│ 4. 填写账号信息：                                            │
│    • 邮箱（用于接收注册验证）                                 │
│    • 密码                                                    │
│ 5. 邮箱激活                                                  │
│ 6. 选择主体类型："企业"                                      │
│ 7. 填写主体信息：                                            │
│    • 企业名称：[从创建的平台信息自动获取]                      │
│    • 统一社会信用代码：[从创建的平台信息自动获取]              │
│    • 营业执照扫描件（上传）                                   │
│ 8. 填写管理员信息：                                          │
│    • 姓名：[从创建的平台信息自动获取]                         │
│    • 手机号：[从创建的平台信息自动获取]                       │
│    • 身份证号码                                              │
│ 9. 管理员微信扫码验证                                         │
│ 10. 注册完成                                                 │
│                                                              │
│ ⚠️ 注意事项：                                                │
│ • 每个邮箱只能注册一个小程序                                  │
│ • 企业主体可以注册50个小程序                                  │
│ • 管理员微信需要进行实名认证                                  │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第二步：小程序认证（必须完成）                                 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录小程序后台：https://mp.weixin.qq.com                 │
│ 2. 进入"设置" → "微信认证"                                   │
│ 3. 点击"开通"                                                │
│ 4. 同意协议并继续                                            │
│ 5. 选择认证类型："企业"                                      │
│ 6. 填写认证资料：                                            │
│    • 企业名称                                                │
│    • 营业执照注册号                                          │
│    • 营业执照照片                                            │
│    • 企业对公账户信息                                         │
│    • 运营者信息                                              │
│    • 运营者身份证照片                                         │
│ 7. 支付认证费用：300元/次                                    │
│ 8. 等待审核（1-5个工作日）                                   │
│ 9. 认证通过                                                  │
│                                                              │
│ ⚠️ 注意事项：                                                │
│ • 认证是必须的，未认证小程序功能受限                          │
│ • 认证有效期1年，到期需重新认证                               │
│ • 如果企业主体已有认证的公众号，可复用资质快速认证（免费）     │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第三步：完善小程序基本信息                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录小程序后台                                            │
│ 2. 进入"设置" → "基本设置"                                   │
│ 3. 填写小程序信息：                                          │
│    • 小程序名称：XX物业业主服务                               │
│    • 小程序简介：提供物业缴费、报修、访客等服务               │
│    • 小程序头像（上传）                                       │
│    • 服务类目：                                              │
│      - 一级类目：生活服务                                    │
│      - 二级类目：物业服务                                    │
│ 4. 提交审核（2-7个工作日）                                   │
│ 5. 审核通过后信息生效                                         │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第四步：开通小程序支付功能                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 方式一：申请微信支付商户号（推荐）                             │
│ 1. 登录小程序后台                                            │
│ 2. 进入"微信支付" → "开通"                                   │
│ 3. 填写商户资料：                                            │
│    • 企业信息（自动获取）                                     │
│    • 经营场景：物业服务                                       │
│    • 结算账户：企业对公账户                                   │
│    • 超级管理员信息                                           │
│ 4. 签署协议                                                  │
│ 5. 等待审核（1-5个工作日）                                   │
│ 6. 审核通过，获得商户号和密钥                                 │
│                                                              │
│ 方式二：关联已有商户号                                        │
│ 1. 如果企业已有微信支付商户号                                 │
│ 2. 在商户平台关联小程序                                       │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第五步：获取开发配置信息                                       │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录小程序后台                                            │
│ 2. 进入"开发" → "开发管理" → "开发设置"                      │
│ 3. 记录以下信息（后续添加应用时需要）：                       │
│                                                              │
│    ┌──────────────────────────────────────┐                │
│    │ AppID (小程序ID)                      │                │
│    │ wx1234567890abcdef                   │                │
│    │                                      │                │
│    │ AppSecret (小程序密钥) [生成/重置]    │                │
│    │ a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6     │                │
│    └──────────────────────────────────────┘                │
│                                                              │
│ 4. 配置服务器域名（由技术提供）：                             │
│    • request合法域名：https://api.yourcompany.com           │
│    • socket合法域名：wss://ws.yourcompany.com               │
│    • uploadFile合法域名：https://upload.yourcompany.com     │
│    • downloadFile合法域名：https://download.yourcompany.com │
│                                                              │
│ 5. 配置业务域名（由技术提供）：                               │
│    • https://h5.yourcompany.com                             │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第六步：获取支付配置信息                                       │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录微信支付商户平台：https://pay.weixin.qq.com          │
│ 2. 进入"账户中心" → "API安全"                               │
│ 3. 记录以下信息：                                            │
│                                                              │
│    ┌──────────────────────────────────────┐                │
│    │ 商户号                                │                │
│    │ 1234567890                           │                │
│    │                                      │                │
│    │ API密钥 [设置密钥]                    │                │
│    │ 32位字符串                            │                │
│    │                                      │                │
│    │ APIv3密钥 [设置密钥]                  │                │
│    │ 32位字符串                            │                │
│    └──────────────────────────────────────┘                │
│                                                              │
│ 4. 下载API证书（用于退款等敏感操作）                          │
│    • apiclient_cert.pem                                     │
│    • apiclient_key.pem                                      │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ ✅ 完成以上步骤后，你将获得：                                  │
│                                                              │
│ • 小程序AppID                                                │
│ • 小程序AppSecret                                            │
│ • 微信支付商户号                                             │
│ • 微信支付API密钥                                            │
│ • 微信支付API证书                                            │
│                                                              │
│ 💡 下一步：在应用管理中添加该小程序配置                       │
│                                                              │
└─────────────────────────────────────────────────────────────┘
```

##### 应用2：工具小程序申请步骤

工具小程序的申请步骤与业主小程序基本相同，参考业主小程序申请步骤完成以下操作。

**主要区别说明**：

| 区别项 | 业主小程序 | 工具小程序 |
| :--- | :--- | :--- |
| 小程序名称 | XX物业业主服务 | XX物业工作台 |
| 服务类目 | 生活服务 → 物业服务 | 生活服务 → 物业服务 |
| 企业主体 | 可复用相同的主体信息（同一家公司） | 可复用相同的主体信息（同一家公司） |
| 微信支付商户号 | 需要单独申请或关联已有商户号 | 可复用业主小程序的商户号（在商户平台关联多个小程序） |
| AppID和AppSecret | 独立的AppID和AppSecret | 独立的AppID和AppSecret（每个小程序都有独立的） |

**重要提示**：
- 同一企业主体可以注册50个小程序，建议使用相同主体统一管理
- 工具小程序和业主小程序可以共用同一个微信支付商户号
- 完成申请后，请在应用管理中添加工具小程序配置

##### 应用3：微信服务号申请步骤

微信服务号主要用于向业主推送消息通知，是物业管理系统的重要组成部分。

```
┌─────────────────────────────────────────────────────────────┐
│ 📱 微信服务号申请步骤                                          │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第一步：注册服务号                                            │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 访问微信公众平台：https://mp.weixin.qq.com               │
│ 2. 点击右上角"立即注册"                                       │
│ 3. 选择"服务号"类型                                          │
│ 4. 填写账号信息：                                            │
│    • 邮箱（注意：与小程序使用不同的邮箱）                     │
│    • 密码                                                    │
│ 5. 邮箱激活                                                  │
│ 6. 选择主体类型："企业"                                      │
│ 7. 填写主体信息（与小程序相同）：                             │
│    • 企业名称                                                │
│    • 统一社会信用代码                                         │
│    • 营业执照扫描件                                           │
│ 8. 填写管理员信息                                            │
│ 9. 管理员微信扫码验证                                         │
│ 10. 注册完成                                                 │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第二步：服务号认证（必须完成）                                 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录服务号后台：https://mp.weixin.qq.com                 │
│ 2. 进入"设置" → "公众号设置" → "微信认证"                    │
│ 3. 点击"开通"                                                │
│ 4. 填写认证资料（流程与小程序认证相同）                       │
│ 5. 支付认证费用：300元/次                                    │
│ 6. 等待审核（1-5个工作日）                                   │
│ 7. 认证通过                                                  │
│                                                              │
│ ⚠️ 重要：                                                    │
│ • 服务号必须认证才能使用高级接口（模板消息、自定义菜单等）    │
│ • 如果企业主体已有认证的小程序，可以复用资质快速认证（免费）  │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第三步：完善服务号基本信息                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录服务号后台                                            │
│ 2. 进入"设置" → "公众号设置"                                 │
│ 3. 填写服务号信息：                                          │
│    • 服务号名称：XX物业服务                                   │
│    • 微信号：xxxservice（6-20个字母、数字、下划线、减号）     │
│    • 服务号简介：提供物业缴费、报修、通知等服务               │
│    • 服务号头像（上传）                                       │
│    • 所在地：[选择省市]                                      │
│ 4. 提交审核（1-5个工作日）                                   │
│ 5. 审核通过后信息生效                                         │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第四步：配置自定义菜单                                         │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录服务号后台                                            │
│ 2. 进入"自定义菜单"                                          │
│ 3. 添加菜单（最多3个一级菜单，每个最多5个二级菜单）：         │
│                                                              │
│    一级菜单：物业服务                                         │
│    ├─ 物业报修（跳转小程序）                                  │
│    ├─ 访客邀请（跳转小程序）                                  │
│    └─ 投诉建议（跳转小程序）                                  │
│                                                              │
│    一级菜单：生活缴费                                         │
│    ├─ 物业费缴纳（跳转小程序）                                │
│    ├─ 停车费缴纳（跳转小程序）                                │
│    └─ 账单查询（跳转小程序）                                  │
│                                                              │
│    一级菜单：个人中心                                         │
│    ├─ 我的房屋（跳转小程序）                                  │
│    ├─ 我的车辆（跳转小程序）                                  │
│    └─ 关于我们（跳转网页）                                    │
│                                                              │
│ 4. 保存并发布                                                │
│                                                              │
│ 💡 提示：菜单可以稍后配置，添加应用后系统会自动生成菜单配置   │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第五步：添加模板消息                                          │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录服务号后台                                            │
│ 2. 进入"模板消息"                                            │
│ 3. 添加以下模板（从模板库选择）：                             │
│    • 缴费成功通知                                            │
│    • 缴费提醒                                                │
│    • 工单受理通知                                            │
│    • 工单完成通知                                            │
│    • 活动通知                                                │
│    • 访客到访提醒                                            │
│ 4. 记录每个模板的模板ID（后续配置需要）                      │
│                                                              │
│ 💡 提示：模板消息可以稍后配置，添加应用后在系统中统一管理     │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 第六步：获取开发配置信息                                       │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 1. 登录服务号后台                                            │
│ 2. 进入"设置" → "公众号设置" → "基本配置"                    │
│ 3. 记录以下信息（后续添加应用时需要）：                       │
│                                                              │
│    ┌──────────────────────────────────────┐                │
│    │ AppID (服务号ID)                      │                │
│    │ wx9876543210fedcba                   │                │
│    │                                      │                │
│    │ AppSecret (服务号密钥) [生成/重置]    │                │
│    │ z9y8x7w6v5u4t3s2r1q0p9o8n7m6l5k4     │                │
│    └──────────────────────────────────────┘                │
│                                                              │
│ 4. 配置IP白名单（由技术提供）                                 │
│                                                              │
│ 5. 配置服务器配置（由技术提供）：                             │
│    • 服务器地址(URL)：https://wx.yourcompany.com/callback   │
│    • 令牌(Token)：[随机生成]                                 │
│    • 消息加解密密钥：[随机生成]                               │
│    • 消息加解密方式：明文模式/兼容模式/安全模式（推荐安全）   │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ ✅ 完成以上步骤后，你将获得：                                  │
│                                                              │
│ • 服务号AppID                                                │
│ • 服务号AppSecret                                            │
│ • 模板消息模板ID列表                                          │
│                                                              │
│ 💡 下一步：在应用管理中添加该服务号配置                       │
│                                                              │
└─────────────────────────────────────────────────────────────┘
```

#### 2.3.11 指引内容实现说明

**实现方式**：
- 申请指引内容直接写死在前端页面代码中
- 不提供后台编辑功能（MVP版本简化）
- 内容基于现有的微信应用申请流程

**技术实现**：
- 使用React/Vue组件直接渲染指引内容
- 使用手风琴组件实现展开/收起效果
- 内容采用HTML+CSS布局，确保清晰易读

**后续优化**（非MVP范围）：
- 可将指引内容抽取为配置文件
- 支持系统管理员在后台编辑指引
- 支持版本管理和历史记录

### 2.4 运营平台详情

#### 2.4.1 页面信息

**访问权限**：超级管理员
**页面标题**：运营平台详情

#### 2.4.2 页面内容分区

页面分为以下5个区域：
1. 基础信息区域
2. 依赖配置状态区域
3. 应用配置状态区域
4. 接入小区列表区域
5. 操作日志区域

#### 2.4.3 基础信息展示

| 信息项 | 显示内容 | 说明 |
| :--- | :--- | :--- |
| 平台名称 | XX物业管理公司 | 运营平台名称 |
| 平台ID | tenant_abc123 | 系统生成的唯一标识 |
| 公司名称 | XX物业管理有限公司 | 营业执照上的公司全称 |
| 统一社会信用代码 | 91110000123456789X | 企业信用代码 |
| 服务区域 | 北京市 - 朝阳区 | 省份-城市 |
| 联系人 | 张三 / 138****8888 / zhangsan@example.com | 姓名/手机/邮箱 |
| 登录账号 | 138****8888 | 用于登录后台的账号 |
| 状态 | ● 正常 | 正常/已停用，用圆点和颜色区分 |
| 创建时间 | 2026-02-12 10:30:25 | YYYY-MM-DD HH:mm:ss |
| 备注 | 无 | 备注信息，如无则显示"无" |

#### 2.4.4 依赖配置状态展示

展示运营平台依赖的外部模块配置状态，包括支付配置和短信推送配置。

**展示说明**：
- 每个配置项显示为一个卡片
- 未配置的卡片使用黄色警告边框和背景色突出显示
- 点击按钮可跳转到对应模块的配置页面

**配置项列表**：

| 配置项 | 图标 | 已配置说明 | 未配置说明 | 跳转页面 |
| :--- | :--- | :--- | :--- | :--- |
| 支付配置 | 💳 | 支付功能已开通，业主可正常使用在线缴费功能 | 支付功能未配置，业主将无法使用在线缴费功能 | `/admin/payment-config/:tenant_id` |
| 短信推送配置 | 📨 | 短信通道已配置，可正常发送短信通知 | 短信通道未配置，将无法发送短信验证码和通知 | `/admin/sms-config/:tenant_id` |

**卡片状态样式**：

| 状态 | 状态标识 | 卡片样式 | 按钮文字 |
| :--- | :--- | :--- | :--- |
| 已配置 | 绿色 ✓ + "已配置" | 默认白色背景 | [查看配置] |
| 未配置 | 黄色 ⚠ + "未配置" | 黄色虚线边框 + 浅黄背景 | [去配置 →] |

**依赖配置的重要性**：
- **支付配置**：在支付中台完成，需配置微信支付商户号、支付证书、回调地址等
- **短信推送配置**：需配置短信服务商（阿里云/腾讯云等）、AccessKey、短信签名和模板

#### 2.4.5 应用配置状态展示

展示3个应用的配置状态，每个应用显示为一个卡片。

**已配置状态卡片**：
- 状态标识：绿色 ✓ + "已配置"
- 显示应用名称
- 显示AppID
- 显示配置时间
- 显示当前运营平台小区数：X个
- 操作按钮：[查看] [编辑]

**未配置状态卡片**：
- 状态标识：灰色 ✗ + "未配置"
- 仅显示应用类型说明
- 操作按钮：[去配置 →]

**应用卡片操作**：

| 按钮名称 | 触发动作 | 显示条件 |
| :--- | :--- | :--- |
| 查看 | 跳转到应用详情页 | 已配置时显示 |
| 编辑 | 跳转到应用编辑页 | 已配置时显示 |
| 去配置 | 跳转到应用添加页 | 未配置时显示 |

#### 2.4.6 接入小区列表

**列表字段**：

| 字段名称 | 字段说明 | 列宽 | 数据示例 |
| :--- | :--- | :--- | :--- |
| 小区名称 | 小区名称 | 150px | 阳光花园 |
| 地址 | 小区详细地址 | 250px | 朝阳区xxx街道xxx号 |
| 业主数 | 小区业主数量 | 100px | 1200 |
| 接入时间 | 小区接入日期 | 150px | 2026-02-10 |
| 状态 | 运营状态 | 100px | 运营中 |
| 操作 | 操作按钮 | 100px | [查看] |

**右上角按钮**：
- [添加小区]：跳转到添加小区页面

**空状态**：
- 当没有接入小区时，显示：暂无接入小区
- 提示文字：请先添加小区后再进行配置

#### 2.4.7 操作日志展示

**日志格式**：
```
时间  操作人  操作内容
```

**日志示例**：
```
2026-02-12 15:10:30  管理员(admin) 添加了工具小程序配置
2026-02-12 14:20:15  管理员(admin) 添加了业主小程序配置
2026-02-12 10:30:25  管理员(admin) 创建了运营平台
```

**显示规则**：
- 默认显示最近10条日志
- 按时间倒序排列（最新的在上面）
- 超过10条时，显示"查看更多"按钮

#### 2.4.7 页面顶部操作按钮

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 编辑 | 跳转到编辑页面 | 编辑运营平台基础信息 |
| 重置密码 | 弹出密码重置对话框 | 重置运营平台管理员登录密码 |
| 停用 | 弹出二次确认对话框 | 仅当状态为"正常"时显示 |
| 启用 | 弹出二次确认对话框 | 仅当状态为"已停用"时显示 |

**重置密码功能**：

对话框内容：
```
重置运营平台管理员密码

系统将生成新的随机密码并发送至联系人手机/邮箱

联系人：张三
手机号：138****8888
邮箱：zhangsan@example.com

[取消]  [确认重置]
```

重置成功后：
- 生成8-16位新密码
- 通过短信/邮件发送给联系人
- 提示"密码重置成功，新密码已发送"
- 记录操作日志

### 2.5 编辑运营平台

#### 2.5.1 页面信息

**访问权限**：超级管理员
**页面标题**：编辑运营平台

#### 2.5.2 可编辑字段

| 字段名称 | 是否可编辑 | 说明 |
| :--- | :---: | :--- |
| 平台名称 | ✓ | 可修改 |
| 平台标识 | ✗ | 系统生成，不可修改 |
| 公司名称 | ✓ | 可修改 |
| 统一社会信用代码 | ✓ | 可修改 |
| 服务省份 | ✓ | 可修改 |
| 服务城市 | ✓ | 可修改，根据省份联动 |
| 联系人姓名 | ✓ | 可修改 |
| 联系人手机号 | ✓ | 可修改 |
| 联系人邮箱 | ✓ | 可修改 |
| 登录账号 | ✗ | 创建后不可修改 |
| 初始密码 | ✗ | 无法修改，如需修改请使用密码重置功能 |
| 创建时间 | ✗ | 系统生成，不可修改 |
| 备注 | ✓ | 可修改 |

#### 2.5.3 表单验证

编辑时的验证规则与创建时相同，参考"2.3.4 表单验证规则详细说明"。

#### 2.5.4 操作按钮

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 保存 | 提交表单，保存修改 | 验证通过后保存，返回详情页 |
| 取消 | 返回详情页 | 放弃修改，弹窗确认是否放弃编辑 |

#### 2.5.5 保存成功后处理

- 提示"保存成功"
- 记录操作日志
- 返回运营平台详情页

### 2.6 停用/启用平台

#### 2.6.1 停用操作流程

**第一步：点击停用按钮**
- 位置：详情页顶部或列表页操作列
- 条件：仅当平台状态为"正常"时显示

**第二步：弹出二次确认对话框**

对话框内容：
```
确认停用该运营平台？

停用后：
• 运营平台管理员无法登录系统
• 业主仍可正常使用小程序（不受影响）
• 数据不会被删除，仅停止运营平台管理员登录

[取消]  [确认停用]
```

**第三步：确认停用**
- 平台状态变更为"已停用"
- 记录操作日志
- 提示"停用成功"

#### 2.6.2 启用操作流程

**第一步：点击启用按钮**
- 位置：详情页顶部或列表页操作列
- 条件：仅当平台状态为"已停用"时显示

**第二步：弹出二次确认对话框**

对话框内容：
```
确认启用该运营平台？

启用后：
• 该平台可以正常登录系统
• 该平台下的应用恢复服务

[取消]  [确认启用]
```

**第三步：确认启用**
- 平台状态变更为"正常"
- 记录操作日志
- 提示"启用成功"

#### 2.6.3 停用/启用/删除的影响范围

**停用影响**：
1. 运营平台管理员无法登录系统
2. 业主仍可正常使用小程序（不受影响）
3. 小程序和服务号继续正常运行
4. 数据不会被删除，仅停止运营平台管理员登录

**启用影响**：
1. 恢复运营平台管理员登录权限
2. 业主使用不受影响（因停用时未受影响）

**删除平台（如需要）**：
1. 删除前检查：平台下是否还有绑定的小区
2. 如有绑定小区，弹出警告对话框：
```
该运营平台下还有 5 个小区

删除后：
• 小区业主将无法登录小程序（无法找到平台对应的应用权限）
• 小区数据不会被删除，但业主无法使用
• 需要将小区重新绑定到其他运营平台才能恢复使用

是否确认删除？

[取消]  [确认删除]
```
3. 删除后的影响：
   - 业主登录时无法找到平台对应的应用权限
   - 业主无法使用小程序
   - 小区需要重新绑定到其他运营平台

**删除与停用的区别**：
- 停用：仅限制运营平台管理员登录，业主不受影响
- 删除：影响业主使用，需谨慎操作

---

## 3. 应用管理（系统管理员操作）

### 3.1 模块说明

应用管理模块由系统管理员操作，用于配置和管理运营平台的3个微信应用。

**重要说明**：
- 应用管理功能仅系统管理员可访问
- 运营平台管理员无权管理应用配置
- 运营平台管理员只能查看应用配置状态（只读）

**功能架构**：
```
应用管理
├── 应用列表（首页）
│   ├── 业主小程序卡片
│   ├── 工具小程序卡片
│   └── 微信服务号卡片
├── 添加应用配置
│   ├── 添加业主小程序
│   ├── 添加工具小程序
│   └── 添加微信服务号
├── 应用详情
│   ├── 基本信息
│   └── 配置信息
└── 编辑应用配置
    └── 修改配置信息
```

### 3.2 应用列表页

#### 3.2.1 页面信息

**访问权限**：系统管理员
**页面标题**：应用管理

**入口位置**：
- 运营平台详情页的"应用配置状态"区域
- 点击"去配置"或"查看"按钮跳转
- 需要携带tenant_id参数

#### 3.2.2 页面说明

应用列表页展示指定运营平台的3个应用配置状态，每个应用以卡片形式展示。

**页面顶部信息**：
```
运营平台：XX物业管理公司 (tenant_abc123)

当前运营平台需要配置3个微信应用，请联系渠道商按照指引完成微信应用申请
```

#### 3.2.3 应用卡片展示规则

**未配置状态卡片**：
```
┌────────────────────────────────────────────────────────┐
│ 📱 业主小程序                                          │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                        │
│ 状态：✗ 未配置                                         │
│                                                        │
│ 说明：面向业主用户，提供物业服务、报修、缴费等功能      │
│                                                        │
│              [查看申请步骤]  [添加应用配置 →]          │
└────────────────────────────────────────────────────────┘
```

**已配置状态卡片**：
```
┌────────────────────────────────────────────────────────┐
│ 📱 业主小程序                                          │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                        │
│ 状态：✓ 已配置                                         │
│                                                        │
│ 小程序名称：XX物业业主服务                              │
│ AppID：wx1234567890abcdef                             │
│ 配置时间：2026-02-12 14:20:15                         │
│ 当前运营平台小区数：2个                                 │
│                                                        │
│                          [查看详情]  [编辑配置]        │
└────────────────────────────────────────────────────────┘
```

#### 3.2.4 应用说明文字

| 应用类型 | 说明文字 |
| :--- | :--- |
| 业主小程序 | 面向业主用户，提供物业服务、报修、缴费等功能 |
| 工具小程序 | 面向物业工作人员，提供工单处理、巡检打卡等功能 |
| 微信服务号 | 用于向业主推送消息通知（缴费提醒、工单进度等） |

#### 3.2.5 操作按钮

**未配置状态按钮**：

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 查看申请步骤 | 打开申请步骤弹窗 | 展示该应用的申请步骤指引 |
| 添加应用配置 | 跳转到添加配置页 | 跳转到对应的应用配置页面 |

**已配置状态按钮**：

| 按钮名称 | 触发动作 | 说明 |
| :--- | :--- | :--- |
| 查看详情 | 跳转到应用详情页 | 查看应用的详细配置信息 |
| 编辑配置 | 跳转到应用编辑页 | 编辑应用的配置信息 |

### 3.3 添加应用配置

#### 3.3.1 添加业主小程序


**页面布局**：

```
┌─────────────────────────────────────────────────────────────┐
│ 添加业主小程序配置                                            │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 提示：请确保已完成微信小程序的申请和认证，并获取以下配置信息  │
│                                                              │
│ 基本信息                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 小程序名称 *                                                 │
│ ┌─────────────────────────────────────────┐                │
│ │ 例如：XX物业业主服务                      │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│ 小程序小标题                                                 │
│ ┌─────────────────────────────────────────┐                │
│ │ 例如：便捷生活，智慧物业                   │                │
│ └─────────────────────────────────────────┘                │
│ 用于在小程序首页或应用列表中显示的副标题                     │
│                                                              │
│ 小程序简介                                                   │
│ ┌─────────────────────────────────────────┐                │
│ │ 提供物业缴费、报修、访客等服务             │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│ 小程序图标 (可选)                                            │
│ ┌─────────────────┐                                        │
│ │   [上传图片]     │                                        │
│ └─────────────────┘                                        │
│ 建议尺寸：200x200像素                                        │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 开发配置                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 小程序 AppID *                                               │
│ ┌─────────────────────────────────────────┐                │
│ │ wx                                      │                │
│ └─────────────────────────────────────────┘                │
│ 在微信公众平台"开发-开发设置"中获取                           │
│                                                              │
│ 小程序 AppSecret *                                           │
│ ┌─────────────────────────────────────────┐                │
│ │ ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●        │                │
│ └─────────────────────────────────────────┘                │
│ 在微信公众平台"开发-开发设置"中生成                           │
│                                                              │
│ 原始ID (可选)                                                │
│ ┌─────────────────────────────────────────┐                │
│ │ gh_                                     │                │
│ └─────────────────────────────────────────┘                │
│ 在微信公众平台"设置-基本设置"中查看                           │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 支付配置                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 微信支付商户号 *                                             │
│ ┌─────────────────────────────────────────┐                │
│ │                                         │                │
│ └─────────────────────────────────────────┘                │
│ 在微信支付商户平台"账户中心"中查看                            │
│                                                              │
│ 微信支付 API 密钥 *                                          │
│ ┌─────────────────────────────────────────┐                │
│ │ ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●        │                │
│ └─────────────────────────────────────────┘                │
│ 在微信支付商户平台"账户中心-API安全"中设置                    │
│                                                              │
│ 微信支付 APIv3 密钥 *                                        │
│ ┌─────────────────────────────────────────┐                │
│ │ ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●        │                │
│ └─────────────────────────────────────────┘                │
│ 在微信支付商户平台"账户中心-API安全"中设置                    │
│                                                              │
│ 商户证书序列号                                               │
│ ┌─────────────────────────────────────────┐                │
│ │                                         │                │
│ └─────────────────────────────────────────┘                │
│ 在商户证书文件中查看，或在商户平台"API安全"中查看              │
│                                                              │
│ API 证书文件 *                                               │
│ ┌────────────────────┐  ┌────────────────────┐            │
│ │ apiclient_cert.pem │  │ apiclient_key.pem  │            │
│ │   [上传证书]        │  │   [上传密钥]        │            │
│ └────────────────────┘  └────────────────────┘            │
│ 在微信支付商户平台"账户中心-API安全"中下载                    │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 配置生效时间                                                  │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ ○ 立即生效                                                   │
│ ○ 明日生效 (次日00:00:00生效)                                │
│                                                              │
│ 说明：                                                       │
│ • 立即生效：保存后配置立即生效，当前运营平台下的所有小区立即可用│
│ • 明日生效：配置在次日00:00:00生效，在生效前系统继续使用旧配置 │
│ • 应用配置保存后，自动应用于该运营平台下的所有小区             │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 备注                                                         │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ ┌─────────────────────────────────────────┐                │
│ │                                         │                │
│ │                                         │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│                            [取消]  [保存配置]                 │
└─────────────────────────────────────────────────────────────┘
```

**字段验证规则详细说明**：

| 字段名称 | 验证规则 | 错误提示 |
| :--- | :--- | :--- |
| 小程序名称 | 必填，2-30个字符 | 请输入小程序名称，2-30个字符 |
| 小程序AppID | 必填，以"wx"开头，18位字符 | 请输入正确的AppID格式 |
| 小程序AppSecret | 必填，32位字符 | 请输入32位AppSecret |
| 微信支付商户号 | 必填，纯数字，10位 | 请输入10位商户号 |
| 微信支付API密钥 | 必填，32位字符 | 请输入32位API密钥 |
| 微信支付APIv3密钥 | 必填，32位字符 | 请输入32位APIv3密钥 |
| 商户证书序列号 | 选填，40位十六进制字符 | 请输入正确的证书序列号 |
| API证书文件 | 必填，.pem格式，单个文件不超过2MB | 请上传.pem格式的证书文件 |
| 配置生效时间 | 必填，单选 | 请选择配置生效时间 |

**配置验证功能**：

点击"保存配置"按钮后，执行以下验证步骤：

**步骤1：表单字段验证**
- 验证所有必填字段是否填写
- 验证字段格式是否正确

**步骤2：微信配置验证**
- 调用微信API验证AppID和AppSecret是否有效
- 验证请求：`GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}`
- 成功返回：`{"access_token":"xxx","expires_in":7200}`
- 失败返回：`{"errcode":40013,"errmsg":"invalid appid"}`

**步骤3：支付配置验证（可选）**
- 如需验证支付配置，可调用微信支付API测试连通性
- 建议：MVP版本可先跳过，仅做格式验证

**步骤4：证书文件验证**
- 验证上传的证书文件是否为合法的PEM格式
- 验证文件大小是否超过限制

**验证失败处理**：
- 显示错误提示信息
- 标注错误字段
- 不允许保存

**验证成功处理**：
- 保存配置到数据库
- 根据生效时间设置状态
- 记录操作日志

**保存成功后处理**：
1. 提示"配置保存成功"（Toast提示，3秒后自动消失）
2. 记录操作日志
3. 跳转到应用列表页
4. 对应应用卡片显示为"已配置"状态
5. 如选择"立即生效"，配置立即可用，当前运营平台下所有小区立即生效
6. 如选择"明日生效"，配置将在次日00:00:00生效，在生效前系统继续使用旧配置

#### 3.3.2 添加工具小程序


**页面布局**：与业主小程序类似，主要区别：

```
基本信息
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

小程序名称 *
┌─────────────────────────────────────────┐
│ 例如：XX物业工作台                        │
└─────────────────────────────────────────┘

小程序小标题
┌─────────────────────────────────────────┐
│ 例如：高效管理，智慧办公                   │
└─────────────────────────────────────────┘

小程序简介
┌─────────────────────────────────────────┐
│ 为物业工作人员提供工单处理、巡检打卡等工具 │
└─────────────────────────────────────────┘

小程序图标 (可选)
┌─────────────────┐
│   [上传图片]     │
└─────────────────┘
建议尺寸：200x200像素

开发配置：与业主小程序相同

支付配置：
┌────────────────────────────────────────────────┐
│ □ 与业主小程序使用相同的支付配置                │
│   (勾选后无需重复填写支付配置信息)              │
└────────────────────────────────────────────────┘

如果勾选，则隐藏支付配置表单，直接复用业主小程序的支付配置

配置生效时间：与业主小程序相同
```

#### 3.3.3 添加微信服务号


**页面布局**：

```
┌─────────────────────────────────────────────────────────────┐
│ 添加微信服务号配置                                            │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 提示：请确保已完成微信服务号的申请和认证，并获取以下配置信息  │
│                                                              │
│ 基本信息                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 服务号名称 *                                                 │
│ ┌─────────────────────────────────────────┐                │
│ │ 例如：XX物业服务                          │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│ 服务号小标题                                                 │
│ ┌─────────────────────────────────────────┐                │
│ │ 例如：您身边的物业管家                     │                │
│ └─────────────────────────────────────────┘                │
│ 用于服务号介绍或消息推送中显示的副标题                       │
│                                                              │
│ 微信号                                                       │
│ ┌─────────────────────────────────────────┐                │
│ │ 例如：xxxservice                         │                │
│ └─────────────────────────────────────────┘                │
│ 6-20个字母、数字、下划线、减号                                │
│                                                              │
│ 服务号简介                                                   │
│ ┌─────────────────────────────────────────┐                │
│ │ 提供物业缴费、报修、通知等服务             │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│ 服务号头像 (可选)                                            │
│ ┌─────────────────┐                                        │
│ │   [上传图片]     │                                        │
│ └─────────────────┘                                        │
│ 建议尺寸：200x200像素                                        │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 开发配置                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 服务号 AppID *                                               │
│ ┌─────────────────────────────────────────┐                │
│ │ wx                                      │                │
│ └─────────────────────────────────────────┘                │
│ 在微信公众平台"设置-公众号设置-基本配置"中获取                 │
│                                                              │
│ 服务号 AppSecret *                                           │
│ ┌─────────────────────────────────────────┐                │
│ │ ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●        │                │
│ └─────────────────────────────────────────┘                │
│ 在微信公众平台"设置-公众号设置-基本配置"中生成                 │
│                                                              │
│ 原始ID (可选)                                                │
│ ┌─────────────────────────────────────────┐                │
│ │ gh_                                     │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│ 服务器配置 (由技术人员配置，可选)                             │
│ ┌─────────────────────────────────────────┐                │
│ │ 服务器地址(URL)：https://wx.xxx.com      │                │
│ │ 令牌(Token)：[自动生成]                  │                │
│ │ 消息加解密密钥：[自动生成]                │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 自定义菜单配置 (可选，稍后配置)                               │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 暂不配置，保存后可在应用详情中配置自定义菜单                  │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 模板消息配置 (可选，稍后配置)                                 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 暂不配置，保存后可在应用详情中配置模板消息                    │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 配置生效时间                                                  │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ ○ 立即生效                                                   │
│ ○ 明日生效 (次日00:00:00生效)                                │
│                                                              │
│ 说明：                                                       │
│ • 立即生效：保存后配置立即生效，当前运营平台下的所有小区立即可用│
│ • 明日生效：配置在次日00:00:00生效，在生效前系统继续使用旧配置 │
│ • 应用配置保存后，自动应用于该运营平台下的所有小区             │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 备注                                                         │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ ┌─────────────────────────────────────────┐                │
│ │                                         │                │
│ └─────────────────────────────────────────┘                │
│                                                              │
│                            [取消]  [保存配置]                 │
└─────────────────────────────────────────────────────────────┘
```

### 3.4 应用详情

#### 3.4.1 业主小程序详情


```
┌─────────────────────────────────────────────────────────────┐
│ 业主小程序详情                              [编辑] [删除]     │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 基本信息                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 小程序名称：XX物业业主服务                                    │
│ 小程序简介：提供物业缴费、报修、访客等服务                    │
│ 小程序AppID：wx1234567890abcdef                             │
│ 原始ID：gh_xxxxxxxxxxxxx                                    │
│ 配置时间：2026-02-12 14:20:15                               │
│ 最后更新：2026-02-12 15:30:20                               │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 支付配置                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 微信支付商户号：1234567890                                   │
│ 商户证书序列号：5ABCDEF1234567890ABCDEF1234567890ABCDEF     │
│ API证书文件：已上传 ✓                                        │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 生效时间                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 配置生效时间：立即生效                                        │
│ 备注：该配置自动应用于当前运营平台下的所有小区                 │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 操作日志                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 2026-02-12 15:30:20  管理员 更新了支付配置                   │
│ 2026-02-12 14:20:15  管理员 创建了应用配置                   │
│                                                              │
└─────────────────────────────────────────────────────────────┘
```

#### 3.4.2 服务号详情（扩展配置）


```
┌─────────────────────────────────────────────────────────────┐
│ 微信服务号详情                              [编辑] [删除]     │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 基本信息                                                     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 服务号名称：XX物业服务                                        │
│ 微信号：xxxservice                                          │
│ 服务号AppID：wx9876543210fedcba                             │
│ 原始ID：gh_yyyyyyyyyyyyyy                                   │
│ 配置时间：2026-02-12 16:10:30                               │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 自定义菜单配置                                 [配置菜单]     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 状态：✓ 已配置                                               │
│ 最后更新：2026-02-12 17:00:00                               │
│                                                              │
│ 菜单结构：                                                   │
│ • 物业服务                                                   │
│   - 物业报修 (跳转小程序)                                    │
│   - 访客邀请 (跳转小程序)                                    │
│ • 生活缴费                                                   │
│   - 物业费缴纳 (跳转小程序)                                  │
│   - 停车费缴纳 (跳转小程序)                                  │
│ • 个人中心                                                   │
│   - 我的房屋 (跳转小程序)                                    │
│   - 我的车辆 (跳转小程序)                                    │
│                                                              │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│ 模板消息配置                                   [配置模板]     │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                              │
│ 状态：✓ 已配置                                               │
│ 已添加模板：6个                                              │
│                                                              │
│ • 缴费成功通知 (模板ID: xxx)                                 │
│ • 缴费提醒 (模板ID: xxx)                                     │
│ • 工单受理通知 (模板ID: xxx)                                 │
│ • 工单完成通知 (模板ID: xxx)                                 │
│ • 活动通知 (模板ID: xxx)                                     │
│ • 访客到访提醒 (模板ID: xxx)                                 │
│                                                              │
└─────────────────────────────────────────────────────────────┘
```

### 3.5 编辑应用配置

#### 3.5.1 编辑页面


**可编辑字段**：
- 小程序/服务号名称
- 小程序/服务号简介
- 图标/头像
- AppSecret（支持重新填写）
- 支付配置（全部字段）
- 备注

**不可编辑字段**：
- AppID（微信分配，不可修改）
- 配置时间

### 3.6 删除应用配置

#### 3.6.1 删除前确认

**触发方式**：
- 在应用详情页点击[删除]按钮

**确认对话框**：
```
┌─────────────────────────────────────────────┐
│  确认删除应用配置？                          │
├─────────────────────────────────────────────┤
│                                             │
│  应用名称：XX物业业主服务                    │
│  应用类型：业主小程序                        │
│                                             │
│  ⚠️ 删除后影响：                            │
│  • 该运营平台下所有小区的业主将无法登录该应用 │
│  • 业主登录时会提示"应用配置异常"            │
│  • 配置数据将被软删除，可通过后台恢复        │
│                                             │
│  请再次确认是否删除？                        │
│                                             │
│           [取消]      [确认删除]            │
└─────────────────────────────────────────────┘
```

#### 3.6.2 删除后影响

**不同应用类型的影响**：

| 应用类型 | 删除后影响 |
| :--- | :--- |
| 业主小程序 | • 业主无法登录该小程序<br>• 登录时提示"应用配置异常，请联系物业"<br>• 已登录的业主下次刷新时也会失效 |
| 工具小程序 | • 物业工作人员、业委会成员无法使用工具功能<br>• 工单处理、巡检打卡等功能无法使用 |
| 微信服务号 | • 无法推送消息通知<br>• 缴费提醒、工单进度等通知无法发送<br>• 自定义菜单失效 |

**系统处理**：
1. 执行软删除：`UPDATE application_config SET deleted_at = NOW() WHERE id = ?`
2. 记录操作日志：记录删除人、删除时间、被删除的应用信息
3. 清除应用配置缓存：`CACHE DELETE app_config:{tenant_id}:{app_type}`
4. 不影响运营平台和小区数据，仅应用配置失效

#### 3.6.3 恢复方式

**适用场景**：
- 误删除应用配置
- 需要恢复历史配置

**恢复操作**（系统管理员）：
1. 在"已删除应用配置"列表中找到目标配置
2. 点击[恢复]按钮
3. 执行SQL：`UPDATE application_config SET deleted_at = NULL WHERE id = ?`
4. 清除缓存，应用配置立即生效
5. 业主可重新登录使用

---

## 4. 数据模型设计

### 4.1 运营平台表 (partner_platform)

**表名**：`partner_platform`
**表说明**：存储运营平台（渠道商）的基础信息

| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 | 索引 |
| :--- | :--- | :--- | :---: | :--- | :--- | :--- |
| id | bigint | - | ✓ | 自增 | 主键 | PRIMARY |
| tenant_id | varchar | 64 | ✓ | - | 租户ID，格式：tenant_xxxxxxxxxx | UNIQUE |
| platform_name | varchar | 200 | ✓ | - | 平台名称 | INDEX |
| company_name | varchar | 200 | ✓ | - | 公司名称 | - |
| credit_code | varchar | 100 | ✗ | NULL | 统一社会信用代码 | - |
| service_province | varchar | 50 | ✓ | - | 服务省份 | - |
| service_city | varchar | 50 | ✓ | - | 服务城市 | - |
| contact_name | varchar | 100 | ✓ | - | 联系人姓名 | - |
| contact_phone | varchar | 20 | ✓ | - | 联系电话 | - |
| contact_email | varchar | 100 | ✗ | NULL | 联系邮箱 | - |
| login_account | varchar | 100 | ✓ | - | 登录账号 | UNIQUE |
| login_password | varchar | 200 | ✓ | - | 登录密码（bcrypt加密） | - |
| status | tinyint | - | ✓ | 1 | 状态：1=正常，2=已停用 | INDEX |
| remark | text | - | ✗ | NULL | 备注信息 | - |
| created_by | bigint | - | ✓ | - | 创建人ID | - |
| created_at | datetime | - | ✓ | CURRENT_TIMESTAMP | 创建时间 | INDEX |
| updated_at | datetime | - | ✓ | CURRENT_TIMESTAMP | 更新时间 | - |
| deleted_at | datetime | - | ✗ | NULL | 删除时间（软删除） | INDEX |

**索引说明**：
- PRIMARY KEY: `id`
- UNIQUE KEY: `tenant_id`, `login_account`
- INDEX: `platform_name`, `status`, `created_at`, `deleted_at`
- 组合索引：`(tenant_id, deleted_at)` - 用于数据隔离查询

### 4.2 应用配置表 (application_config)

**表名**：`application_config`
**表说明**：存储运营平台的微信应用配置信息

| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 | 索引 |
| :--- | :--- | :--- | :---: | :--- | :--- | :--- |
| id | bigint | - | ✓ | 自增 | 主键 | PRIMARY |
| tenant_id | varchar | 64 | ✓ | - | 租户ID | INDEX |
| app_type | tinyint | - | ✓ | - | 应用类型：1=业主小程序，2=工具小程序，3=服务号 | INDEX |
| app_name | varchar | 200 | ✓ | - | 应用名称 | - |
| app_subtitle | varchar | 200 | ✗ | NULL | 应用小标题（用于首页或列表展示） | - |
| app_desc | text | - | ✗ | NULL | 应用简介 | - |
| app_icon | varchar | 500 | ✗ | NULL | 应用图标URL | - |
| app_id | varchar | 100 | ✓ | - | 微信AppID | UNIQUE |
| app_secret | varchar | 500 | ✓ | - | 微信AppSecret（AES-256加密存储） | - |
| original_id | varchar | 100 | ✗ | NULL | 原始ID | - |
| wx_number | varchar | 50 | ✗ | NULL | 微信号（仅服务号） | - |
| payment_config | json | - | ✗ | NULL | 支付配置（JSON格式） | - |
| server_config | json | - | ✗ | NULL | 服务器配置（JSON格式，仅服务号） | - |
| menu_config | json | - | ✗ | NULL | 自定义菜单配置（JSON格式，仅服务号） | - |
| template_config | json | - | ✗ | NULL | 模板消息配置（JSON格式，仅服务号） | - |
| effective_time | datetime | - | ✗ | NULL | 配置生效时间，NULL表示立即生效 | INDEX |
| remark | text | - | ✗ | NULL | 备注信息 | - |
| status | tinyint | - | ✓ | 1 | 状态：1=正常，2=已停用 | INDEX |
| created_by | bigint | - | ✓ | - | 创建人ID | - |
| created_at | datetime | - | ✓ | CURRENT_TIMESTAMP | 创建时间 | - |
| updated_at | datetime | - | ✓ | CURRENT_TIMESTAMP | 更新时间 | - |
| deleted_at | datetime | - | ✗ | NULL | 删除时间（软删除） | INDEX |

**索引说明**：
- PRIMARY KEY: `id`
- UNIQUE KEY: `app_id`
- INDEX: `tenant_id`, `app_type`, `status`, `effective_time`, `deleted_at`
- 组合索引：`(tenant_id, app_type, deleted_at)` - 用于查询特定租户的应用列表

**JSON字段结构说明**：

#### payment_config 支付配置结构
```json
{
  "mch_id": "1234567890",
  "api_key": "encrypted_api_key",
  "api_v3_key": "encrypted_api_v3_key",
  "cert_serial_no": "5ABCDEF1234567890ABCDEF1234567890ABCDEF",
  "cert_file": "apiclient_cert.pem",
  "key_file": "apiclient_key.pem"
}
```

#### server_config 服务器配置结构（服务号）
```json
{
  "url": "https://wx.yourcompany.com/callback",
  "token": "random_token",
  "encoding_aes_key": "random_aes_key",
  "encrypt_mode": "safe"
}
```

#### menu_config 自定义菜单配置结构（服务号）
```json
{
  "button": [
    {
      "type": "miniprogram",
      "name": "物业服务",
      "sub_button": [
        {
          "type": "miniprogram",
          "name": "物业报修",
          "appid": "wx1234567890abcdef",
          "pagepath": "pages/repair/index"
        }
      ]
    }
  ]
}
```

#### template_config 模板消息配置结构（服务号）
```json
[
  {
    "template_id": "xxx",
    "title": "缴费成功通知",
    "content": "您好，您已成功缴费..."
  }
]
```

**配置生效时间说明**：

**立即生效（effective_time = NULL）**：
- 配置保存后立即生效
- 当前运营平台下的所有小区立即可用
- 业主刷新小程序即可看到新配置

**明日生效（effective_time = 次日00:00:00）**：
- 配置保存但不立即启用
- 业主继续使用旧配置内容
- 到达生效时间（次日00:00:00）后自动切换到新配置
- 查询逻辑：`WHERE (effective_time IS NULL OR effective_time <= NOW())`

**应用与小区关联关系**：
- 应用配置属于运营平台（通过tenant_id关联）
- 小区在"小区管理"模块中绑定运营平台
- 小区通过所属运营平台间接使用应用配置
- 查询逻辑：根据小区的tenant_id查询对应的应用配置

### 4.3 操作日志表 (operation_log)

**表名**：`operation_log`
**表说明**：记录系统操作日志，用于审计和追溯

| 字段名 | 类型 | 长度 | 是否必填 | 默认值 | 说明 | 索引 |
| :--- | :--- | :--- | :---: | :--- | :--- | :--- |
| id | bigint | - | ✓ | 自增 | 主键 | PRIMARY |
| tenant_id | varchar | 64 | ✓ | - | 租户ID | INDEX |
| module | varchar | 50 | ✓ | - | 模块名称：platform=运营平台，application=应用 | INDEX |
| action | varchar | 50 | ✓ | - | 操作类型：create/update/delete/enable/disable | INDEX |
| target_id | bigint | - | ✓ | - | 目标对象ID | - |
| target_name | varchar | 200 | ✓ | - | 目标对象名称 | - |
| content | text | - | ✓ | - | 操作内容描述 | - |
| operator_id | bigint | - | ✓ | - | 操作人ID | INDEX |
| operator_name | varchar | 100 | ✓ | - | 操作人姓名 | - |
| ip_address | varchar | 50 | ✓ | - | 操作IP地址 | - |
| created_at | datetime | - | ✓ | CURRENT_TIMESTAMP | 操作时间 | INDEX |

**索引说明**：
- PRIMARY KEY: `id`
- INDEX: `tenant_id`, `module`, `action`, `operator_id`, `created_at`
- 组合索引：`(tenant_id, module, created_at)` - 用于按模块查询日志

**操作日志示例**：
```json
{
  "id": 1,
  "tenant_id": "tenant_abc123",
  "module": "platform",
  "action": "create",
  "target_id": 1,
  "target_name": "XX物业管理公司",
  "content": "创建了运营平台：XX物业管理公司",
  "operator_id": 1,
  "operator_name": "admin",
  "ip_address": "192.168.1.100",
  "created_at": "2026-02-12 10:30:25"
}
```

### 4.4 数据库设计说明

#### 4.4.1 字符集和排序规则
- 字符集：`utf8mb4`
- 排序规则：`utf8mb4_unicode_ci`
- 支持emoji和特殊字符

#### 4.4.2 存储引擎
- 使用InnoDB存储引擎
- 支持事务和外键约束
- 支持行级锁

#### 4.4.3 软删除策略
- 所有主表使用软删除（deleted_at字段）
- deleted_at为NULL表示未删除
- deleted_at有值表示已删除，记录删除时间
- 查询时需过滤deleted_at IS NULL

#### 4.4.4 时间字段说明
- 所有时间字段使用datetime类型
- 统一使用北京时间（UTC+8）
- created_at和updated_at自动维护

---

## 5. 核心业务流程

### 5.1 创建运营平台流程

```
┌──────────────┐
│ 超管填写基础  │
│ 信息         │
└───────┬──────┘
        │
        ▼
┌──────────────┐
│ 系统生成租户ID│
│ 和登录密码    │
└───────┬──────┘
        │
        ▼
┌──────────────┐
│ 保存平台数据  │
└───────┬──────┘
        │
        ▼
┌──────────────┐
│ 发送登录信息  │
│ (短信/邮件)  │
└───────┬──────┘
        │
        ▼
┌──────────────┐
│ 展示申请指引  │
└──────────────┘
```

### 5.2 添加应用配置流程

```
┌──────────────────┐
│ 运营平台按照指引  │
│ 完成微信应用申请  │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 登录系统后台      │
│ 进入应用管理      │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 选择应用类型      │
│ (业主/工具/服务号)│
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 填写应用配置信息  │
│ (AppID/Secret等) │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 配置支付信息      │
│ (商户号/密钥等)   │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 选择配置生效时间  │
│ (立即/明日生效)   │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 保存配置          │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ 应用配置完成      │
│ 可以正常使用      │
└──────────────────┘
```

### 5.3 数据隔离机制

```
┌─────────────────────────────────────┐
│ 所有数据表包含 tenant_id 字段        │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│ 用户登录时获取 tenant_id             │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│ 查询时自动添加 tenant_id 过滤条件    │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│ 不同租户的数据完全隔离               │
└─────────────────────────────────────┘
```

---

## 6. 权限设计（MVP简化版）

### 6.1 角色定义

**超级管理员(Super Admin)**：
- 系统管理员
- 可以管理所有运营平台
- 可以查看所有数据

**运营平台管理员(Platform Admin)**：
- 运营平台主账号
- 只能查看和管理自己平台的数据
- 可以配置应用
- 可以管理小区

### 6.2 权限控制

**数据隔离**：
- 通过tenant_id实现
- 运营平台管理员登录后，所有查询自动过滤tenant_id

**功能权限**：
| 功能 | 超管 | 平台管理员 |
| :--- | :---: | :---: |
| 创建运营平台 | ✓ | ✗ |
| 编辑运营平台 | ✓ | ✗ |
| 停用/启用平台 | ✓ | ✗ |
| 查看所有平台 | ✓ | ✗ |
| 查看自己平台 | ✓ | ✓ |
| 添加应用配置 | ✓ | ✗ (仅查看) |
| 编辑应用配置 | ✓ | ✗ (仅查看) |
| 删除应用配置 | ✓ | ✗ (仅查看) |
| 查看应用配置 | ✓ | ✓ (只读) |
| 管理小区 | ✓ | ✓ |

**说明**：
- 系统管理员（超管）负责应用配置管理，涉及微信密钥等敏感信息
- 运营平台管理员只能查看自己平台的应用配置状态（只读权限）
- 运营平台管理员无权添加、编辑、删除应用配置

---

## 7. 技术实现要点

### 7.1 敏感数据加密

#### 7.1.1 需要加密的字段

| 字段类型 | 加密方式 | 说明 |
| :--- | :--- | :--- |
| 登录密码 | bcrypt | 单向加密，不可解密 |
| AppSecret | AES-256-CBC | 对称加密，可解密 |
| 支付API密钥 | AES-256-CBC | 对称加密，可解密 |
| 支付APIv3密钥 | AES-256-CBC | 对称加密，可解密 |
| API证书文件 | AES-256-CBC | 对称加密，可解密 |

#### 7.1.2 加密实现示例（Node.js）

**bcrypt密码加密**：
```javascript
const bcrypt = require('bcrypt');

// 加密密码
async function hashPassword(password) {
  const saltRounds = 10;
  return await bcrypt.hash(password, saltRounds);
}

// 验证密码
async function verifyPassword(password, hash) {
  return await bcrypt.compare(password, hash);
}
```

**AES-256加密实现**：
```javascript
const crypto = require('crypto');

// 加密配置
const ALGORITHM = 'aes-256-cbc';
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; // 32字节密钥
const IV_LENGTH = 16;

// 加密函数
function encrypt(text) {
  const iv = crypto.randomBytes(IV_LENGTH);
  const cipher = crypto.createCipheriv(
    ALGORITHM,
    Buffer.from(ENCRYPTION_KEY, 'hex'),
    iv
  );

  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');

  // 返回 iv + 加密内容
  return iv.toString('hex') + ':' + encrypted;
}

// 解密函数
function decrypt(text) {
  const parts = text.split(':');
  const iv = Buffer.from(parts[0], 'hex');
  const encryptedText = parts[1];

  const decipher = crypto.createDecipheriv(
    ALGORITHM,
    Buffer.from(ENCRYPTION_KEY, 'hex'),
    iv
  );

  let decrypted = decipher.update(encryptedText, 'hex', 'utf8');
  decrypted += decipher.final('utf8');

  return decrypted;
}
```

#### 7.1.3 密钥管理

**密钥存储位置**：
- 使用环境变量存储加密密钥
- 不要将密钥硬编码在代码中
- 不要将密钥提交到版本控制系统

**密钥生成方式**：
```bash
# 生成32字节（256位）随机密钥
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
```

**环境变量配置**：
```bash
# .env文件（不要提交到Git）
ENCRYPTION_KEY=64位十六进制字符串
```

### 7.2 数据隔离实现

#### 7.2.1 多租户架构

**隔离方式**：基于tenant_id的逻辑隔离
- 所有业务表包含tenant_id字段
- 查询时自动添加tenant_id过滤条件
- 通过中间件实现自动注入

#### 7.2.2 中间件实现示例（Express）

```javascript
// 租户上下文中间件
function tenantContext(req, res, next) {
  // 从认证token中获取tenant_id
  const tenantId = req.user?.tenant_id;

  if (!tenantId) {
    return res.status(401).json({
      error: '未找到租户信息'
    });
  }

  // 注入到请求上下文
  req.tenantId = tenantId;

  next();
}

// ORM查询拦截器（以Sequelize为例）
function addTenantFilter(model, options, tenantId) {
  // 自动添加tenant_id过滤条件
  if (!options.where) {
    options.where = {};
  }

  options.where.tenant_id = tenantId;
  options.where.deleted_at = null; // 过滤软删除数据

  return options;
}

// 使用示例
router.get('/applications', tenantContext, async (req, res) => {
  // 自动添加tenant_id过滤
  const applications = await Application.findAll({
    where: {
      tenant_id: req.tenantId,
      deleted_at: null
    }
  });

  res.json(applications);
});
```

#### 7.2.3 数据隔离验证

**测试要点**：
1. 不同租户之间数据完全隔离
2. 租户A无法查询到租户B的数据
3. 租户A无法修改租户B的数据
4. 租户A无法删除租户B的数据
5. 超管可以查看所有租户的数据（需要特殊权限）

### 7.3 操作日志记录

#### 7.3.1 日志记录时机

**需要记录日志的操作**：

| 模块 | 操作类型 | 记录时机 |
| :--- | :--- | :--- |
| 运营平台 | 创建 | 创建成功后 |
| 运营平台 | 编辑 | 修改成功后 |
| 运营平台 | 停用 | 停用成功后 |
| 运营平台 | 启用 | 启用成功后 |
| 应用配置 | 添加 | 添加成功后 |
| 应用配置 | 编辑 | 修改成功后 |
| 应用配置 | 删除 | 删除成功后 |

#### 7.3.2 日志记录实现示例

```javascript
// 日志记录服务
class OperationLogService {
  /**
   * 记录操作日志
   * @param {Object} logData 日志数据
   */
  static async log(logData) {
    const {
      tenantId,
      module,
      action,
      targetId,
      targetName,
      content,
      operatorId,
      operatorName,
      ipAddress
    } = logData;

    await OperationLog.create({
      tenant_id: tenantId,
      module,
      action,
      target_id: targetId,
      target_name: targetName,
      content,
      operator_id: operatorId,
      operator_name: operatorName,
      ip_address: ipAddress,
      created_at: new Date()
    });
  }
}

// 使用示例：创建运营平台
router.post('/platforms', async (req, res) => {
  const platform = await Platform.create(req.body);

  // 记录操作日志
  await OperationLogService.log({
    tenantId: platform.tenant_id,
    module: 'platform',
    action: 'create',
    targetId: platform.id,
    targetName: platform.platform_name,
    content: `创建了运营平台：${platform.platform_name}`,
    operatorId: req.user.id,
    operatorName: req.user.name,
    ipAddress: req.ip
  });

  res.json(platform);
});
```

#### 7.3.3 日志查询接口

```javascript
// 查询操作日志
router.get('/operation-logs', tenantContext, async (req, res) => {
  const { module, action, startDate, endDate, page = 1, pageSize = 10 } = req.query;

  const where = {
    tenant_id: req.tenantId
  };

  if (module) where.module = module;
  if (action) where.action = action;
  if (startDate && endDate) {
    where.created_at = {
      [Op.between]: [startDate, endDate]
    };
  }

  const { rows, count } = await OperationLog.findAndCountAll({
    where,
    order: [['created_at', 'DESC']],
    limit: pageSize,
    offset: (page - 1) * pageSize
  });

  res.json({
    data: rows,
    total: count,
    page,
    pageSize
  });
});
```

---

## 8. 实施计划（MVP版本）

### 8.1 开发阶段

**Week 1-2：基础框架**
- 数据库设计与创建
- 多租户架构搭建
- 数据隔离中间件
- 权限管理框架
- 基础UI组件

**Week 3：运营平台管理**
- 运营平台列表页
- 创建运营平台页
- 运营平台详情页
- 编辑运营平台页
- 申请指引内容展示

**Week 4：应用管理**
- 应用列表页（运营平台端）
- 添加业主小程序配置
- 添加工具小程序配置
- 添加服务号配置
- 应用详情页
- 编辑应用配置

**Week 5：测试与优化**
- 功能测试
- 数据隔离测试
- 安全测试
- Bug修复
- 性能优化

**总计：5周**

### 8.2 测试要点

**功能测试**：
- 创建运营平台
- 填写申请指引
- 添加应用配置
- 编辑应用配置
- 数据隔离验证

**安全测试**：
- 敏感数据加密验证
- 跨租户数据访问测试
- 权限验证测试

---

## 9. MVP版本功能清单

### 9.1 已包含功能

✅ 运营平台管理
- 运营平台列表
- 创建运营平台（超管手动创建）
- 运营平台详情
- 编辑运营平台
- 停用/启用平台

✅ 应用申请指引
- 业主小程序申请步骤（完整6步）
- 工具小程序申请步骤
- 微信服务号申请步骤（完整6步）
- 在创建平台后展示指引

✅ 应用管理
- 应用列表（3个应用卡片）
- 添加业主小程序配置
- 添加工具小程序配置
- 添加微信服务号配置
- 应用详情
- 编辑应用配置
- 删除应用配置

✅ 基础功能
- 多租户数据隔离
- 敏感数据加密
- 操作日志记录
- 简单权限管理（超管、平台管理员）

### 9.2 后续迭代功能

❌ 运营平台在线申请审核
❌ 微信开放平台自动化集成（代申请小程序）
❌ 版本分级授权（基础版/标准版/旗舰版）
❌ 配额管理（小区数量、存储空间）
❌ 授权期限和续费管理
❌ 运营数据看板
❌ 应用模板库
❌ 子账号管理
❌ 自定义菜单可视化配置
❌ 模板消息可视化配置

---

## 10. 附录

### 10.1 术语表

| 术语 | 说明 |
| :--- | :--- |
| MVP | Minimum Viable Product，最小可行产品 |
| 超管 | 超级管理员，系统技术提供方 |
| 运营平台 | 渠道商，运营小程序和服务号的主体 |
| tenant_id | 租户ID，用于数据隔离的唯一标识 |
| 业主小程序 | 面向业主用户的小程序 |
| 工具小程序 | 面向物业工作人员的小程序 |
| 服务号 | 微信公众平台服务号，用于消息推送 |
| AppID | 微信应用的唯一标识 |
| AppSecret | 微信应用的密钥 |

### 10.2 参考资料

- [微信小程序注册指引](https://kf.qq.com/faq/170109JrYZbA170109JVz6N3.html)
- [微信小程序认证指引](https://kf.qq.com/faq/170109yQNJBN170109bm6nI7.html)
- [微信支付接入指引](https://pay.weixin.qq.com/index.php/public/apply_sign/apply_protocol)
- [微信服务号注册指引](https://kf.qq.com/faq/120911VrYVrA151009eQrYNr.html)
- [微信公众平台技术文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)

---

## 文档结束

**文档状态**：待评审
**最后更新**：2026-02-13
**维护人**：Antigravity

**版本说明**：
- 当前版本为MVP v1.1.0，已补充完善业务逻辑说明
- 包含：小区关联规则、权限边界、密码管理、配置验证、生效时间、删除影响、定时清理等
- 后续版本将迭代添加更多高级功能
- 如有疑问或建议，请联系维护人

**补充说明内容摘要**：
1. 小区与运营平台1:N关系，小区创建时必须绑定运营平台
2. 业主只能登录小区所属运营平台的小程序，不可跨平台
3. 运营平台管理员只能管理小区和物业数据，无应用配置权限
4. 系统管理员负责运营平台和应用管理，可重置密码
5. 应用配置增加验证功能（验证AppID/AppSecret有效性）
6. 应用配置可选择生效时间（立即生效/明日生效）
7. 平台停用不影响业主使用，删除平台才影响业主登录
8. tenant_id增加唯一性校验逻辑（生成后立即验证）
9. 指引内容写死在前端代码，不提供后台编辑功能
