Browse Source

修改 bug

master
王泽彦 8 months ago
parent
commit
53f645bd8f
  1. 980
      API接口文档.md
  2. 638
      Dashboard业务逻辑文档-校区转化情况统计(校区数据).md
  3. 309
      Dashboard业务逻辑文档.md
  4. 3
      admin/src/api/contract.ts
  5. 93
      admin/src/app/views/contract/contract.vue
  6. 437
      admin/src/app/views/instructional_material/components/lesson-course-teaching-edit.vue
  7. 27
      admin/src/app/views/instructional_material/instructional_material.vue
  8. 446
      admin/src/app/views/lesson_course_teaching/components/unified-edit-dialog.vue
  9. 333
      admin/src/app/views/salary/components/salary-detail.vue
  10. 481
      admin/src/app/views/salary/components/salary-edit.vue
  11. 32
      admin/src/app/views/salary/list.vue
  12. 12
      admin/src/app/views/user_feedback/components/user-feedback-edit.vue
  13. 128
      admin/src/app/views/user_feedback/user_feedback.vue
  14. 88
      admin/src/app/views/xsyj/xsyj.vue
  15. 223
      admin/src/components/direct-upload/index.vue
  16. 255
      admin/src/utils/directUpload.ts
  17. 5
      admin/vite.config.ts
  18. 29
      niucloud/app/adminapi/controller/document/DocumentTemplate.php
  19. 6
      niucloud/app/adminapi/controller/sys/Ueditor.php
  20. 59
      niucloud/app/adminapi/controller/upload/DirectUpload.php
  21. 1
      niucloud/app/adminapi/route/document_template.php
  22. 7
      niucloud/app/adminapi/route/sys.php
  23. 2
      niucloud/app/service/admin/course/CourseService.php
  24. 30
      niucloud/app/service/admin/document/DocumentTemplateService.php
  25. 237
      niucloud/app/service/admin/upload/DirectUploadService.php
  26. 72
      niucloud/databasedoc/README.md
  27. 95
      niucloud/databasedoc/role_menu_permissions.md
  28. 97
      niucloud/databasedoc/school_account_log.md
  29. 107
      niucloud/databasedoc/school_addon.md
  30. 91
      niucloud/databasedoc/school_addon_log.md
  31. 86
      niucloud/databasedoc/school_applet_site_version.md
  32. 110
      niucloud/databasedoc/school_applet_version.md
  33. 98
      niucloud/databasedoc/school_approval_config.md
  34. 98
      niucloud/databasedoc/school_approval_config_node.md
  35. 98
      niucloud/databasedoc/school_approval_history.md
  36. 101
      niucloud/databasedoc/school_approval_participants.md
  37. 111
      niucloud/databasedoc/school_approval_process.md
  38. 108
      niucloud/databasedoc/school_assignment.md
  39. 90
      niucloud/databasedoc/school_attendance.md
  40. 77
      niucloud/databasedoc/school_campus.md
  41. 93
      niucloud/databasedoc/school_campus_pay.md
  42. 89
      niucloud/databasedoc/school_campus_person_role.md
  43. 98
      niucloud/databasedoc/school_chat_friends.md
  44. 129
      niucloud/databasedoc/school_chat_messages.md
  45. 98
      niucloud/databasedoc/school_class.md
  46. 112
      niucloud/databasedoc/school_class_personnel_rel.md
  47. 114
      niucloud/databasedoc/school_class_resources_rel.md
  48. 108
      niucloud/databasedoc/school_coach_performance.md
  49. 120
      niucloud/databasedoc/school_communication_records.md
  50. 106
      niucloud/databasedoc/school_contract.md
  51. 107
      niucloud/databasedoc/school_contract_sign.md
  52. 94
      niucloud/databasedoc/school_course.md
  53. 126
      niucloud/databasedoc/school_course_schedule.md
  54. 88
      niucloud/databasedoc/school_customer_resource_changes.md
  55. 140
      niucloud/databasedoc/school_customer_resources.md
  56. 91
      niucloud/databasedoc/school_departments.md
  57. 104
      niucloud/databasedoc/school_diy_form.md
  58. 99
      niucloud/databasedoc/school_diy_form_fields.md
  59. 95
      niucloud/databasedoc/school_diy_form_records.md
  60. 114
      niucloud/databasedoc/school_diy_form_records_fields.md
  61. 111
      niucloud/databasedoc/school_diy_form_submit_config.md
  62. 113
      niucloud/databasedoc/school_diy_form_write_config.md
  63. 113
      niucloud/databasedoc/school_diy_page.md
  64. 107
      niucloud/databasedoc/school_diy_route.md
  65. 104
      niucloud/databasedoc/school_diy_theme.md
  66. 109
      niucloud/databasedoc/school_document_data_source_config.md
  67. 118
      niucloud/databasedoc/school_document_data_source_config_backup.md
  68. 113
      niucloud/databasedoc/school_document_generate_log.md
  69. 104
      niucloud/databasedoc/school_document_generate_log_backup.md
  70. 100
      niucloud/databasedoc/school_exam_answers.md
  71. 101
      niucloud/databasedoc/school_exam_papers.md
  72. 97
      niucloud/databasedoc/school_exam_questions.md
  73. 103
      niucloud/databasedoc/school_exam_records.md
  74. 103
      niucloud/databasedoc/school_generate_column.md
  75. 98
      niucloud/databasedoc/school_generate_table.md
  76. 98
      niucloud/databasedoc/school_jobs.md
  77. 90
      niucloud/databasedoc/school_jobs_failed.md
  78. 95
      niucloud/databasedoc/school_lesson_course_teaching.md
  79. 87
      niucloud/databasedoc/school_market_performance.md
  80. 121
      niucloud/databasedoc/school_member.md
  81. 101
      niucloud/databasedoc/school_member_account_log.md
  82. 95
      niucloud/databasedoc/school_member_address.md
  83. 110
      niucloud/databasedoc/school_member_cash_out.md
  84. 74
      niucloud/databasedoc/school_member_cash_out_account.md
  85. 95
      niucloud/databasedoc/school_member_label.md
  86. 98
      niucloud/databasedoc/school_member_level.md
  87. 101
      niucloud/databasedoc/school_member_sign.md
  88. 118
      niucloud/databasedoc/school_order_table.md
  89. 108
      niucloud/databasedoc/school_pay.md
  90. 82
      niucloud/databasedoc/school_pay_channel.md
  91. 112
      niucloud/databasedoc/school_pay_refund.md
  92. 126
      niucloud/databasedoc/school_pay_transfer.md
  93. 98
      niucloud/databasedoc/school_performance_config.md
  94. 105
      niucloud/databasedoc/school_performance_records.md
  95. 97
      niucloud/databasedoc/school_person_course_schedule.md
  96. 105
      niucloud/databasedoc/school_personnel.md
  97. 121
      niucloud/databasedoc/school_personnel_info.md
  98. 109
      niucloud/databasedoc/school_personnel_summary.md
  99. 100
      niucloud/databasedoc/school_physical_test.md
  100. 87
      niucloud/databasedoc/school_reimbursement.md

980
API接口文档.md

@ -0,0 +1,980 @@
# 智慧教务系统 API 接口文档
## 📋 接口概述
### 基础信息
- **API Base URL**: `http://localhost:20080`
- **接口版本**: v1.0
- **数据格式**: JSON
- **字符编码**: UTF-8
- **认证方式**: JWT Token
### 接口前缀
- **管理端接口**: `/adminapi/*`
- **客户端接口**: `/api/*`
### 统一响应格式
```json
{
"code": 1, // 状态码:1-成功,0-失败
"msg": "操作成功", // 响应消息
"data": {} // 响应数据
}
```
### 状态码说明
| 状态码 | 说明 | 描述 |
|--------|------|------|
| 1 | 成功 | 请求处理成功 |
| 0 | 失败 | 请求处理失败 |
| 401 | 未授权 | Token无效或已过期 |
| 403 | 禁止访问 | 权限不足 |
| 404 | 未找到 | 资源不存在 |
| 500 | 服务器错误 | 内部服务器错误 |
## 🔐 认证机制
### JWT Token 认证
所有需要认证的接口都需要在请求头中携带Token:
```http
Authorization: Bearer {token}
```
### Token 获取
通过登录接口获取Token,Token有效期为24小时。
### Token 刷新
当Token即将过期时,可通过刷新接口获取新Token。
## 🔑 管理端接口 (/adminapi)
### 认证相关
#### 1. 管理员登录
**接口地址**: `POST /adminapi/login/login`
**请求参数**:
```json
{
"username": "admin", // 用户名
"password": "123456" // 密码
}
```
**响应示例**:
```json
{
"code": 1,
"msg": "登录成功",
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"expire": 86400,
"user_info": {
"uid": 1,
"username": "admin",
"nickname": "超级管理员",
"avatar": "",
"role_ids": [1],
"permissions": ["*"]
}
}
}
```
**curl 示例**:
```bash
curl -X POST http://localhost:20080/adminapi/login/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'
```
#### 2. 获取用户信息
**接口地址**: `GET /adminapi/user/info`
**请求头**:
```http
Authorization: Bearer {token}
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"uid": 1,
"username": "admin",
"nickname": "超级管理员",
"avatar": "",
"role_ids": [1],
"permissions": ["*"],
"campus_ids": [0] // 0表示所有校区
}
}
```
#### 3. 退出登录
**接口地址**: `POST /adminapi/login/logout`
**请求头**:
```http
Authorization: Bearer {token}
```
**响应示例**:
```json
{
"code": 1,
"msg": "退出成功",
"data": null
}
```
### 校区管理
#### 1. 校区列表
**接口地址**: `GET /adminapi/campus/list`
**请求参数**:
```
page: 1 // 页码
limit: 20 // 每页数量
keyword: "" // 搜索关键词
status: "" // 状态筛选:1-启用,0-禁用
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"campus_name": "总校区",
"address": "北京市朝阳区xxx路xxx号",
"phone": "010-12345678",
"contact_person": "张三",
"status": 1,
"created_at": "2025-01-01 10:00:00",
"updated_at": "2025-01-14 15:30:00"
}
],
"total": 1,
"page": 1,
"limit": 20
}
}
```
#### 2. 新增校区
**接口地址**: `POST /adminapi/campus/add`
**请求参数**:
```json
{
"campus_name": "新校区",
"address": "北京市海淀区xxx路xxx号",
"phone": "010-87654321",
"contact_person": "李四",
"status": 1,
"remark": "备注信息"
}
```
**响应示例**:
```json
{
"code": 1,
"msg": "添加成功",
"data": {
"id": 2
}
}
```
#### 3. 编辑校区
**接口地址**: `PUT /adminapi/campus/edit/{id}`
**请求参数**:
```json
{
"campus_name": "更新后的校区名称",
"address": "更新后的地址",
"phone": "010-11111111",
"contact_person": "王五",
"status": 1,
"remark": "更新后的备注"
}
```
#### 4. 删除校区
**接口地址**: `DELETE /adminapi/campus/delete/{id}`
**响应示例**:
```json
{
"code": 1,
"msg": "删除成功",
"data": null
}
```
### 人员管理
#### 1. 员工列表
**接口地址**: `GET /adminapi/personnel/list`
**请求参数**:
```
page: 1
limit: 20
keyword: "" // 姓名或工号搜索
campus_id: "" // 校区筛选
dept_id: "" // 部门筛选
status: "" // 状态筛选
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 51,
"name": "花花",
"employee_id": "EMP001",
"phone": "13800138000",
"email": "huahua@example.com",
"dept_name": "教练部",
"campus_name": "总校区",
"role_type": 10,
"role_name": "校长",
"status": 1,
"created_at": "2025-01-01 10:00:00"
}
],
"total": 1,
"page": 1,
"limit": 20
}
}
```
#### 2. 新增员工
**接口地址**: `POST /adminapi/personnel/add`
**请求参数**:
```json
{
"name": "新员工",
"employee_id": "EMP002",
"phone": "13900139000",
"email": "newstaff@example.com",
"dept_id": 2,
"campus_ids": [1, 2],
"role_type": 5,
"password": "123456",
"status": 1
}
```
#### 3. 学员列表
**接口地址**: `GET /adminapi/student/list`
**请求参数**:
```
page: 1
limit: 20
keyword: "" // 姓名或学号搜索
campus_id: "" // 校区筛选
class_id: "" // 班级筛选
status: "" // 状态筛选
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"student_name": "小明",
"student_no": "STU001",
"gender": 1,
"age": 8,
"phone": "13700137000",
"parent_name": "明爸爸",
"parent_phone": "13600136000",
"campus_name": "总校区",
"class_name": "跳绳初级班",
"status": 1,
"created_at": "2025-01-01 10:00:00"
}
],
"total": 1,
"page": 1,
"limit": 20
}
}
```
### 课程管理
#### 1. 课程列表
**接口地址**: `GET /adminapi/course/list`
**请求参数**:
```
page: 1
limit: 20
keyword: "" // 课程名称搜索
course_type: "" // 课程类型筛选
status: "" // 状态筛选
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"course_name": "跳绳基础课程",
"course_type": "跳绳",
"duration": 60,
"session_count": 12,
"single_session_count": 1,
"price": 1200.00,
"age_range": "6-12岁",
"description": "适合初学者的跳绳课程",
"cover_image": "/uploads/course/cover1.jpg",
"status": 1,
"created_at": "2025-01-01 10:00:00"
}
],
"total": 1,
"page": 1,
"limit": 20
}
}
```
#### 2. 新增课程
**接口地址**: `POST /adminapi/course/add`
**请求参数**:
```json
{
"course_name": "新课程",
"course_type": "篮球",
"duration": 90,
"session_count": 16,
"single_session_count": 1,
"price": 1600.00,
"age_range": "8-16岁",
"description": "篮球基础技能训练",
"cover_image": "/uploads/course/cover2.jpg",
"status": 1
}
```
### 班级管理
#### 1. 班级列表
**接口地址**: `GET /adminapi/class/list`
**请求参数**:
```
page: 1
limit: 20
keyword: "" // 班级名称搜索
campus_id: "" // 校区筛选
course_id: "" // 课程筛选
status: "" // 状态筛选
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"class_name": "跳绳初级班A",
"campus_name": "总校区",
"course_name": "跳绳基础课程",
"head_coach": "张教练",
"assistant_coach": "李助教",
"capacity": 15,
"current_count": 12,
"status": 1,
"created_at": "2025-01-01 10:00:00"
}
],
"total": 1,
"page": 1,
"limit": 20
}
}
```
#### 2. 新增班级
**接口地址**: `POST /adminapi/class/add`
**请求参数**:
```json
{
"class_name": "新班级",
"campus_id": 1,
"course_id": 1,
"head_coach": 51,
"assistant_coach": 52,
"capacity": 20,
"status": 1,
"remark": "备注信息"
}
```
### 排课系统
#### 1. 课程安排列表
**接口地址**: `GET /adminapi/schedule/list`
**请求参数**:
```
page: 1
limit: 20
date_start: "2025-01-01" // 开始日期
date_end: "2025-01-31" // 结束日期
campus_id: "" // 校区筛选
coach_id: "" // 教练筛选
venue_id: "" // 场地筛选
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"course_name": "跳绳基础课程",
"class_name": "跳绳初级班A",
"coach_name": "张教练",
"venue_name": "训练场地A",
"course_date": "2025-01-15",
"time_slot": "09:00-10:00",
"available_capacity": 15,
"booked_count": 12,
"status": 1,
"remarks": "正常上课"
}
],
"total": 1,
"page": 1,
"limit": 20
}
}
```
#### 2. 新增课程安排
**接口地址**: `POST /adminapi/schedule/add`
**请求参数**:
```json
{
"course_id": 1,
"class_id": 1,
"coach_id": 51,
"venue_id": 1,
"course_date": "2025-01-15",
"time_slot": "09:00-10:00",
"available_capacity": 15,
"remarks": "正常上课"
}
```
### 财务管理
#### 1. 收费记录列表
**接口地址**: `GET /adminapi/finance/payment/list`
**请求参数**:
```
page: 1
limit: 20
date_start: "2025-01-01"
date_end: "2025-01-31"
campus_id: ""
student_id: ""
payment_type: "" // 支付方式
status: "" // 状态
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"list": [
{
"id": 1,
"student_name": "小明",
"course_name": "跳绳基础课程",
"amount": 1200.00,
"payment_type": "微信支付",
"payment_time": "2025-01-15 10:30:00",
"operator": "收费员",
"status": 1,
"remark": "学费"
}
],
"total": 1,
"page": 1,
"limit": 20,
"summary": {
"total_amount": 1200.00,
"count": 1
}
}
}
```
#### 2. 新增收费记录
**接口地址**: `POST /adminapi/finance/payment/add`
**请求参数**:
```json
{
"student_id": 1,
"course_id": 1,
"amount": 1200.00,
"payment_type": "微信支付",
"payment_time": "2025-01-15 10:30:00",
"remark": "学费"
}
```
### 数据统计
#### 1. 数据看板
**接口地址**: `GET /adminapi/statistics/dashboard`
**请求参数**:
```
date_start: "2025-01-01"
date_end: "2025-01-31"
campus_id: "" // 校区筛选,空表示所有校区
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"today": {
"income": 5600.00,
"new_students": 3,
"classes": 12,
"attendance_rate": 95.5
},
"month": {
"income": 156000.00,
"new_students": 45,
"total_students": 320,
"total_classes": 280
},
"trends": {
"income_trend": [1200, 1500, 1800, 2100, 1900, 2200, 2400],
"student_trend": [2, 3, 1, 4, 2, 3, 5],
"attendance_trend": [92.5, 94.2, 96.1, 93.8, 95.5, 97.2, 95.8]
}
}
}
```
#### 2. 收入统计
**接口地址**: `GET /adminapi/statistics/income`
**请求参数**:
```
date_start: "2025-01-01"
date_end: "2025-01-31"
campus_id: ""
group_by: "day" // 分组方式:day/week/month
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"total_amount": 156000.00,
"chart_data": [
{
"date": "2025-01-01",
"amount": 5200.00,
"count": 4
},
{
"date": "2025-01-02",
"amount": 6800.00,
"count": 5
}
],
"summary": {
"avg_daily": 5200.00,
"max_daily": 8900.00,
"min_daily": 2100.00
}
}
}
```
## 📱 客户端接口 (/api)
### 员工端认证
#### 1. 员工登录
**接口地址**: `POST /api/staff/login`
**请求参数**:
```json
{
"employee_id": "EMP001", // 工号
"password": "123456" // 密码
}
```
**响应示例**:
```json
{
"code": 1,
"msg": "登录成功",
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"expire": 86400,
"user_info": {
"user_id": 51,
"name": "花花",
"employee_id": "EMP001",
"role_type": 10,
"role_name": "校长",
"campus_ids": [1, 2],
"avatar": "/uploads/avatar/51.jpg"
}
}
}
```
#### 2. 获取员工信息
**接口地址**: `GET /api/staff/info`
**请求头**:
```http
Authorization: Bearer {token}
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"user_id": 51,
"name": "花花",
"employee_id": "EMP001",
"phone": "13800138000",
"email": "huahua@example.com",
"role_type": 10,
"role_name": "校长",
"dept_name": "管理部",
"campus_ids": [1, 2],
"campus_names": ["总校区", "分校区A"],
"avatar": "/uploads/avatar/51.jpg"
}
}
```
### 员工端业务功能
#### 1. 我的课程安排
**接口地址**: `GET /api/staff/schedule`
**请求参数**:
```
date: "2025-01-15" // 查询日期,默认今天
```
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": [
{
"id": 1,
"course_name": "跳绳基础课程",
"class_name": "跳绳初级班A",
"venue_name": "训练场地A",
"time_slot": "09:00-10:00",
"student_count": 12,
"status": 1,
"remarks": "正常上课"
}
]
}
```
#### 2. 班级学员列表
**接口地址**: `GET /api/staff/class/{class_id}/students`
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": {
"class_info": {
"id": 1,
"class_name": "跳绳初级班A",
"course_name": "跳绳基础课程",
"capacity": 15,
"current_count": 12
},
"students": [
{
"id": 1,
"student_name": "小明",
"student_no": "STU001",
"gender": 1,
"age": 8,
"parent_name": "明爸爸",
"parent_phone": "13600136000",
"avatar": "/uploads/student/1.jpg",
"status": 1
}
]
}
}
```
#### 3. 考勤打卡
**接口地址**: `POST /api/staff/attendance/checkin`
**请求参数**:
```json
{
"type": 1, // 打卡类型:1-上班,2-下班
"latitude": 39.9042, // 纬度
"longitude": 116.4074, // 经度
"address": "北京市朝阳区xxx路xxx号",
"remark": "正常打卡"
}
```
**响应示例**:
```json
{
"code": 1,
"msg": "打卡成功",
"data": {
"id": 1,
"checkin_time": "2025-01-15 08:30:00",
"type": 1,
"status": 1
}
}
```
### 学员端功能
#### 1. 学员登录
**接口地址**: `POST /api/student/login`
**请求参数**:
```json
{
"phone": "13700137000", // 手机号
"code": "123456" // 验证码
}
```
#### 2. 我的课程
**接口地址**: `GET /api/student/courses`
**响应示例**:
```json
{
"code": 1,
"msg": "获取成功",
"data": [
{
"id": 1,
"course_name": "跳绳基础课程",
"class_name": "跳绳初级班A",
"coach_name": "张教练",
"total_sessions": 12,
"completed_sessions": 8,
"remaining_sessions": 4,
"next_class_time": "2025-01-16 09:00:00",
"venue_name": "训练场地A"
}
]
}
```
#### 3. 课程预约
**接口地址**: `POST /api/student/booking`
**请求参数**:
```json
{
"schedule_id": 1, // 课程安排ID
"remark": "正常预约"
}
```
## 🔧 开发调试
### 环境配置
```bash
# 启动开发环境
./start.sh
# 查看服务状态
docker ps
# 查看API日志
docker-compose logs -f php
```
### 测试工具
#### Postman 集合
可以导入以下Postman集合进行接口测试:
```json
{
"info": {
"name": "智慧教务系统API",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"variable": [
{
"key": "base_url",
"value": "http://localhost:20080"
},
{
"key": "admin_token",
"value": ""
},
{
"key": "staff_token",
"value": ""
}
]
}
```
#### curl 测试脚本
```bash
#!/bin/bash
# 设置基础URL
BASE_URL="http://localhost:20080"
# 管理员登录
echo "=== 管理员登录 ==="
ADMIN_TOKEN=$(curl -s -X POST $BASE_URL/adminapi/login/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}' | \
jq -r '.data.token')
echo "Admin Token: $ADMIN_TOKEN"
# 获取校区列表
echo "=== 获取校区列表 ==="
curl -s -H "Authorization: Bearer $ADMIN_TOKEN" \
"$BASE_URL/adminapi/campus/list" | jq
# 获取员工列表
echo "=== 获取员工列表 ==="
curl -s -H "Authorization: Bearer $ADMIN_TOKEN" \
"$BASE_URL/adminapi/personnel/list" | jq
```
### 错误处理
#### 常见错误码
| 错误码 | 错误信息 | 解决方案 |
|--------|----------|----------|
| 10001 | 参数错误 | 检查请求参数格式和必填字段 |
| 10002 | Token无效 | 重新登录获取新Token |
| 10003 | 权限不足 | 检查用户角色权限 |
| 10004 | 数据不存在 | 确认请求的资源ID是否正确 |
| 10005 | 数据库错误 | 检查数据库连接和SQL语句 |
#### 调试技巧
1. **查看详细错误信息**
```bash
# 开启调试模式
echo "APP_DEBUG=true" >> niucloud/.env
# 重启PHP服务
docker-compose restart php
```
2. **查看SQL执行日志**
```bash
# 进入MySQL容器
docker exec -it niucloud_mysql mysql -u niucloud -pniucloud123
# 开启查询日志
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/query.log';
```
3. **API响应时间监控**
```bash
# 使用curl测试响应时间
curl -w "@curl-format.txt" -o /dev/null -s "http://localhost:20080/adminapi/user/info"
```
## 📋 更新日志
### v1.0.0 (2025-01-14)
- 初始版本发布
- 完成基础认证功能
- 实现校区管理接口
- 实现人员管理接口
- 实现课程管理接口
- 实现班级管理接口
- 实现排课系统接口
- 实现财务管理接口
- 实现数据统计接口
- 完成员工端基础功能
- 完成学员端基础功能
---
**文档维护**: 开发团队
**最后更新**: 2025-01-14
**文档版本**: v1.0
**联系方式**: [技术支持邮箱]

638
Dashboard业务逻辑文档-校区转化情况统计(校区数据).md

@ -0,0 +1,638 @@
| 1月汇总数据 | | | | 2月汇总数据 | | | | 3月汇总数据 | | | | 4月汇总数据 | | | | 5月汇总数据 | | | | 6月汇总数据 | | | | 7月汇总数据 | | | | 8月汇总数据 | | | |
|--------|-----------|------|----|--------|-----------|------|----|--------|-----------|------|----|--------|-----------|------|----|--------|-----------|------|----|--------|-----------|------|----|--------|-----------|------|----|--------|-----------|------|--------|
| 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 |
| 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | 1月汇总数据 | | | | 2月汇总数据 | | | | 3月汇总数据 | | | | 4月汇总数据 | | | | 5月汇总数据 | | | | 6月汇总数据 | | | | 7月汇总数据 | | | | 8月汇总数据 | | | |
| 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 | 时限 | 渠道 | 具体内容 | 合计 |
| 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | | 当月 | 体验包(地推)一访 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | | | 体验包(活动)一访 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | | | 上门(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | | | 美团(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | | | 大众点评(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | | | 抖音(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | | | 小红书(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | | | 异业合作(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | | | 其他(一访) | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | | | 全渠道(当月汇总) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | | 往月 | 体验包(地推)一访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | | | 体验包(地推)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | | | 体验包(活动)一访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | | | 体验包(活动)二访 | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | |
| | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | | | | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | | | 上门(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | | | 上门(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | | | 美团(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | | | 美团(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | | | 大众点评(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | | | 大众点评(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | | | 抖音(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | | | 抖音(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | | | 小红书(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | | | 小红书(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | | | 异业合作(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | | | 异业合作(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | | | 其他(一访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | | | 其他(二访) | 邀约数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | | 合计 | 体验包(地推) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | | | 体验包(活动) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | | | 体验包(合计) | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | | | 转介绍 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | | | 上门 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | | | 美团 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | | | 大众点评 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | | | 抖音 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | | | 小红书 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | | | 异业合作 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | | | 其他 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |
| 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | | 汇总 | 全渠道 | 名单数 | |
| | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | | | | 到访数 | |
| | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | | | | 到访率 | |
| | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | | | | 关单数 | |
| | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | | | | 关单率 | |
| | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | | | | 关单金额 | |

309
Dashboard业务逻辑文档.md

@ -0,0 +1,309 @@
# Dashboard WebView 业务逻辑文档
## 概述
Dashboard WebView 是一个为移动端应用提供数据可视化展示的功能模块,通过WebView组件在客户端中嵌入HTML页面,展示不同角色的统计数据和图表。
## 系统架构
### 技术栈
- **后端**: ThinkPHP 框架
- **前端**: HTML5 + CSS3 + JavaScript
- **图表库**: ECharts 5.4.0
- **渲染方式**: ThinkPHP view() 模板渲染
- **数据传输**: JWT Token + HTTP GET 参数
### 文件结构
```
niucloud/app/api/
├── controller/Dashboard.php # 控制器(业务逻辑)
└── view/dashboard/ # 视图模板目录
├── main.html # 主页面模板
├── error.html # 错误页面模板
└── layouts/
└── base.html # 基础布局模板
```
## 业务流程
### 1. 页面访问流程
```
客户端 → API请求 → Token验证 → 角色识别 → 页面类型判断 → 数据获取 → 模板渲染 → HTML输出
```
### 2. 请求参数说明
| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|--------|------|------|------|--------|
| type | string | 否 | 页面类型 | my_data / dept_data / campus_data |
| token | string | 是 | 用户认证Token | JWT格式 |
| platform | string | 否 | 平台标识 | web / app / miniprogram |
### 3. 页面类型定义
- **my_data**: 我的数据 - 显示个人业绩统计
- **dept_data**: 部门数据 - 显示所属部门统计
- **campus_data**: 校区数据 - 显示整个校区统计
## 数据统计业务逻辑
### 1. 我的数据 (my_data)
**适用角色**:
市场人员(school_departments.id=1的部门=school_sys_role.dept_id的角色)
**数据维度**:
- 本月录入资源数量
- 当天录入资源数量
- 获得绩效金额
- 其他奖金
**图表展示**:
- 月度录入资源数量趋势图(折线图)
- 客户来源分布图(饼图)
**算法逻辑**:
### 2. 部门数据 (dept_data)
**适用角色**: 部门主管及以上
**权限控制**: 只能查看本部门数据
**数据维度**:
- 部门总业绩
- 团队人数
- 人均业绩
- 部门排名
**图表展示**:
- 团队成员业绩排行榜(柱状图)
- 部门月度趋势对比(折线图)
**算法逻辑**:
```php
// 基于用户所属部门统计部门数据
function getDeptData($userInfo) {
$deptId = $userInfo['department_id'];
// 部门总业绩:部门内所有员工的本月业绩总和
$deptPerformance = Contract::whereIn('staff_id', function($query) use ($deptId) {
$query->select('id')->from('staff')->where('department_id', $deptId);
})->where('status', 'signed')
->whereMonth('sign_time', date('m'))
->sum('amount');
// 团队人数:部门内员工总数
$teamCount = Staff::where('department_id', $deptId)
->where('status', 'active')
->count();
// 人均业绩:部门总业绩 / 团队人数
$avgPerformance = $teamCount > 0 ? $deptPerformance / $teamCount : 0;
// 部门排名:按业绩排序获取当前部门排名
$deptRanking = $this->calculateDeptRanking($deptId);
}
```
### 3. 校区数据 (campus_data)
**适用角色**: 校区管理员、校长级别
**权限控制**: 只能查看所属校区数据
**数据维度**:
- 校区总业绩
- 部门数量
- 员工总数
- 客户总数
**图表展示**:
- 各部门业绩对比(柱状图)
- 校区业绩趋势图(折线图)
**算法逻辑**:
```php
// 基于用户所属校区统计校区数据
function getCampusData($userInfo) {
$campusId = $userInfo['campus_id'];
// 校区总业绩:校区内所有员工的本月业绩总和
$campusPerformance = Contract::whereIn('staff_id', function($query) use ($campusId) {
$query->select('id')->from('staff')->where('campus_id', $campusId);
})->where('status', 'signed')
->whereMonth('sign_time', date('m'))
->sum('amount');
// 部门数量:校区内部门总数
$deptCount = Department::where('campus_id', $campusId)
->where('status', 'active')
->count();
// 员工总数:校区内所有员工数量
$staffCount = Staff::where('campus_id', $campusId)
->where('status', 'active')
->count();
// 客户总数:校区内所有客户数量
$customerCount = Customer::whereIn('staff_id', function($query) use ($campusId) {
$query->select('id')->from('staff')->where('campus_id', $campusId);
})->count();
}
```
## 权限控制逻辑
### 1. Token验证
```php
// JWT Token 解析获取用户信息
function verifyToken($token) {
try {
$payload = JWT::decode($token, $secretKey);
return [
'user_id' => $payload->user_id,
'user_type' => $payload->user_type,
'role_type' => $payload->role_type,
'campus_id' => $payload->campus_id ?? 0,
'department_id' => $payload->department_id ?? 0
];
} catch (Exception $e) {
throw new AuthException('Token验证失败');
}
}
```
### 2. 页面访问权限
```php
// 页面类型访问权限控制
function checkPageAccess($pageType, $userInfo) {
$rolePermissions = [
'staff' => ['my_data'], // 普通员工只能查看个人数据
'supervisor' => ['my_data', 'dept_data'], // 主管可查看个人和部门数据
'manager' => ['my_data', 'dept_data', 'campus_data'], // 经理可查看所有类型数据
'admin' => ['my_data', 'dept_data', 'campus_data'] // 管理员可查看所有类型数据
];
$userRole = $this->getUserRole($userInfo['user_id']);
$allowedPages = $rolePermissions[$userRole] ?? [];
if (!in_array($pageType, $allowedPages)) {
throw new PermissionException('无权限访问该页面');
}
}
```
### 3. 数据范围控制
```php
// 数据查询范围限制
function applyDataScope($query, $userInfo, $pageType) {
switch ($pageType) {
case 'my_data':
// 只能查看自己的数据
$query->where('staff_id', $userInfo['user_id']);
break;
case 'dept_data':
// 只能查看本部门数据
$deptStaffIds = Staff::where('department_id', $userInfo['department_id'])
->pluck('id')->toArray();
$query->whereIn('staff_id', $deptStaffIds);
break;
case 'campus_data':
// 只能查看本校区数据
$campusStaffIds = Staff::where('campus_id', $userInfo['campus_id'])
->pluck('id')->toArray();
$query->whereIn('staff_id', $campusStaffIds);
break;
}
}
```
## 图表配置说明
### 1. ECharts 配置标准
- **主题色**: #29d3b4 (青绿色)
- **背景色**: #181A20 (深灰色)
- **字体**: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif
### 2. 图表类型映射
- **折线图**: 趋势数据(月度业绩、时间序列)
- **柱状图**: 对比数据(成员排行、部门对比)
- **饼图**: 占比数据(客户来源分布、业务分布)
### 3. 响应式设计
- 移动端优化:小于480px时单列布局
- 图表自适应:监听窗口大小变化自动调整
## 性能优化
### 1. 缓存策略
```php
// Redis缓存用户统计数据(5分钟有效期)
$cacheKey = "dashboard_data_{$userInfo['user_id']}_{$pageType}";
$cachedData = Redis::get($cacheKey);
if (!$cachedData) {
$data = $this->calculateRealData($pageType, $userInfo);
Redis::setex($cacheKey, 300, json_encode($data)); // 5分钟缓存
} else {
$data = json_decode($cachedData, true);
}
```
### 2. 数据库优化
- 为统计查询添加复合索引
- 使用预计算表存储统计结果
- 分页查询避免大数据量
### 3. 前端优化
- CDN加载ECharts库
- 图片懒加载和压缩
- CSS压缩和合并
## 扩展规划
### 1. 角色细分支持
**计划支持的角色类型**:
- **销售专员**: 基础销售数据统计
- **销售主管**: 团队管理数据 + 个人数据
- **市场专员**: 线索获取和转化数据
- **客服专员**: 客户服务相关数据
- **财务专员**: 收款和财务相关数据
- **教研专员**: 课程和教学数据
- **校长**: 全校区综合数据
### 2. 数据维度扩展
**计划新增的统计维度**:
- 客户满意度统计
- 课程完成率统计
- 退费率统计
- 续费率统计
- 员工绩效评分
- 市场推广效果统计
### 3. 图表类型扩展
**计划支持的图表类型**:
- 雷达图:综合能力评估
- 热力图:时间分布统计
- 仪表盘:目标完成度
- 漏斗图:业务流程转化
- 地图:地域分布统计
## 数据表设计要求
### 统计相关表
## 错误处理
### 1. 异常类型定义
```php
class DashboardException extends Exception {
const TOKEN_INVALID = 1001; // Token无效
const PERMISSION_DENIED = 1002; // 权限不足
const DATA_NOT_FOUND = 1003; // 数据不存在
const TEMPLATE_ERROR = 1004; // 模板渲染错误
}
```
### 2. 错误页面展示
- 友好的错误提示界面
- 错误代码和消息展示
- 返回和重试按钮
*该文档会根据实际开发需求持续更新和完善*

3
admin/src/api/contract.ts

@ -81,6 +81,9 @@ export const contractTemplateApi = {
updateStatus: (id: number, status: string) => updateStatus: (id: number, status: string) =>
request.post(`/document_template/update_status/${id}`, { contract_status: status }), request.post(`/document_template/update_status/${id}`, { contract_status: status }),
// 编辑模板
update: (id: number, data: any) => request.put(`/document_template/update/${id}`, data),
// 删除模板 // 删除模板
delete: (id: number) => request.delete(`/document_template/delete/${id}`) delete: (id: number) => request.delete(`/document_template/delete/${id}`)
} }

93
admin/src/app/views/contract/contract.vue

@ -8,8 +8,8 @@
</el-form-item> </el-form-item>
<el-form-item label="合同类型"> <el-form-item label="合同类型">
<el-select v-model="searchForm.contract_type" placeholder="请选择" clearable> <el-select v-model="searchForm.contract_type" placeholder="请选择" clearable>
<el-option label="课程合同" value="course" /> <el-option label="内部合同" value="内部" />
<el-option label="服务合同" value="service" /> <el-option label="外部合同" value="外部" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -34,8 +34,8 @@
<el-table-column prop="contract_name" label="模板名称" /> <el-table-column prop="contract_name" label="模板名称" />
<el-table-column prop="contract_type" label="合同类型"> <el-table-column prop="contract_type" label="合同类型">
<template #default="{ row }"> <template #default="{ row }">
<el-tag :type="row.contract_type === 'course' ? 'primary' : 'success'"> <el-tag :type="row.contract_type === '内部' ? 'primary' : 'success'">
{{ row.contract_type === 'course' ? '课程合同' : '服务合同' }} {{ row.contract_type }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
@ -49,8 +49,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="created_at" label="创建时间" /> <el-table-column prop="created_at" label="创建时间" />
<el-table-column label="操作" width="280"> <el-table-column label="操作" width="360">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="info" size="small" @click="editTemplate(row)">
编辑
</el-button>
<el-button type="primary" size="small" @click="configPlaceholder(row)"> <el-button type="primary" size="small" @click="configPlaceholder(row)">
配置占位符 配置占位符
</el-button> </el-button>
@ -469,6 +472,42 @@
</div> </div>
</div> </div>
</Teleport> </Teleport>
<!-- 编辑弹窗 -->
<Teleport to="body">
<div v-if="showEditDialog" class="dialog-overlay" @click.self="showEditDialog = false">
<div class="dialog-content">
<div class="dialog-header">
<h3>编辑合同模板</h3>
<button @click="showEditDialog = false" class="close-btn">×</button>
</div>
<div class="dialog-body">
<div class="upload-form">
<div class="form-item">
<label>模板名称 <span style="color: red;">*</span></label>
<input v-model="editForm.contract_name" type="text" placeholder="请输入模板名称" class="form-input" />
</div>
<div class="form-item">
<label>合同类型 <span style="color: red;">*</span></label>
<select v-model="editForm.contract_type" class="form-select">
<option value="">请选择合同类型</option>
<option value="内部">内部合同</option>
<option value="外部">外部合同</option>
</select>
</div>
<div class="form-item">
<label>备注</label>
<textarea v-model="editForm.remarks" placeholder="请输入备注信息" class="form-textarea"></textarea>
</div>
</div>
</div>
<div class="dialog-footer">
<button @click="showEditDialog = false" class="btn-cancel">取消</button>
<button @click="saveEdit" class="btn-primary">保存</button>
</div>
</div>
</div>
</Teleport>
</div> </div>
</template> </template>
@ -486,6 +525,7 @@ const tableData = ref<ContractTemplate[]>([])
const showUploadDialog = ref(false) const showUploadDialog = ref(false)
const showConfigDialog = ref(false) const showConfigDialog = ref(false)
const showDistributeDialog = ref(false) const showDistributeDialog = ref(false)
const showEditDialog = ref(false)
const currentContractId = ref(0) const currentContractId = ref(0)
const currentContract = ref<ContractTemplate | null>(null) const currentContract = ref<ContractTemplate | null>(null)
const uploading = ref(false) const uploading = ref(false)
@ -519,6 +559,13 @@ const uploadForm = reactive({
remarks: '' remarks: ''
}) })
const editForm = reactive({
id: 0,
contract_name: '',
contract_type: '',
remarks: ''
})
const staffSearchForm = reactive({ const staffSearchForm = reactive({
name: '', name: '',
phone: '', phone: '',
@ -605,6 +652,42 @@ const updateStatus = async (row: ContractTemplate) => {
} }
} }
//
const editTemplate = (row: ContractTemplate) => {
editForm.id = row.id
editForm.contract_name = row.contract_name
editForm.contract_type = row.contract_type
editForm.remarks = row.remarks || ''
showEditDialog.value = true
}
//
const saveEdit = async () => {
try {
if (!editForm.contract_name) {
ElMessage.error('请输入模板名称')
return
}
if (!editForm.contract_type) {
ElMessage.error('请选择合同类型')
return
}
await contractTemplateApi.update(editForm.id, {
contract_name: editForm.contract_name,
contract_type: editForm.contract_type,
remarks: editForm.remarks
})
ElMessage.success('编辑成功')
showEditDialog.value = false
getList()
} catch (error) {
ElMessage.error('编辑失败')
}
}
const configPlaceholder = async (row: ContractTemplate) => { const configPlaceholder = async (row: ContractTemplate) => {
currentContractId.value = row.id currentContractId.value = row.id
currentTemplateInfo.value = row // currentTemplateInfo.value = row //

437
admin/src/app/views/instructional_material/components/lesson-course-teaching-edit.vue

@ -1,7 +1,7 @@
<template> <template>
<el-dialog <el-dialog
v-model="showDialog" v-model="showDialog"
:title="formData.id ? t('updateActionLibrary') : t('addActionLibrary')" :title="getDialogTitle()"
width="50%" width="50%"
class="diy-dialog-wrap" class="diy-dialog-wrap"
:destroy-on-close="true" :destroy-on-close="true"
@ -33,6 +33,7 @@
v-model="formData.type" v-model="formData.type"
clearable clearable
:placeholder="t('typePlaceholder')" :placeholder="t('typePlaceholder')"
@change="onTypeChange"
> >
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
@ -44,16 +45,73 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('url1')" v-if="formData.type == 3"> <!-- 根据素材类型显示不同的上传和预览组件 -->
<upload-image v-model="formData.url" /> <el-form-item :label="materialLabel" v-if="formData.type">
</el-form-item> <!-- 文件上传区域 -->
<div class="material-upload-area">
<direct-upload
ref="uploadRef"
:file-type="getFileTypeForDirectUpload()"
:max-size="getMaxSizeForFileType()"
:accept="getFileAccept()"
:fallback-url="uploadUrl"
@success="onDirectUploadSuccess"
@error="onUploadError"
@progress="onUploadProgress"
>
<el-button type="primary" :loading="uploading">
{{ uploading ? `上传中 ${uploadProgress}%` : '选择文件' }}
</el-button>
</direct-upload>
</div>
<el-form-item :label="t('url2')" v-if="formData.type == 2"> <!-- 文件预览区域 -->
<upload-file v-model="formData.url" /> <div class="material-preview-area" v-if="formData.url">
</el-form-item> <!-- 图片预览 -->
<div v-if="formData.type == 3" class="image-preview">
<el-image
:src="formData.url"
style="width: 200px; height: 120px"
fit="cover"
:preview-src-list="[formData.url]"
/>
<div class="preview-info">
<p>图片预览</p>
<el-button type="danger" size="small" @click="clearFile">删除</el-button>
</div>
</div>
<el-form-item :label="t('url3')" v-if="formData.type == 1"> <!-- 视频预览 -->
<upload-video v-model="formData.url" /> <div v-else-if="formData.type == 1" class="video-preview">
<video
:src="formData.url"
controls
style="width: 300px; height: 200px"
preload="metadata"
>
您的浏览器不支持视频播放
</video>
<div class="preview-info">
<p>视频预览</p>
<el-button type="danger" size="small" @click="clearFile">删除</el-button>
</div>
</div>
<!-- 文件预览 -->
<div v-else-if="formData.type == 2" class="file-preview">
<div class="file-info">
<el-icon><Document /></el-icon>
<span>{{ getFileName(formData.url) }}</span>
</div>
<div class="file-actions">
<el-button type="primary" size="small" @click="downloadFile">
<el-icon><Download /></el-icon>
下载
</el-button>
<el-button type="danger" size="small" @click="clearFile">删除</el-button>
</div>
</div>
</div>
</el-form-item> </el-form-item>
<el-form-item :label="t('content')" prop="content"> <el-form-item :label="t('content')" prop="content">
@ -74,16 +132,31 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- <el-form-item :label="t('userPermission')" prop="user_permission">--> <el-form-item label="员工权限" prop="user_permission">
<!-- <el-checkbox-group v-model="formData.user_permission" :placeholder="t('userPermissionPlaceholder')">--> <el-select
<!-- <el-checkbox--> v-model="formData.user_permission"
<!-- v-for="(item, index) in userPermissionList"--> multiple
<!-- :key="index"--> filterable
<!-- :label="item['sys_user_id']">--> clearable
<!-- {{ item['name'] }}--> placeholder="搜索并选择员工"
<!-- </el-checkbox>--> style="width: 100%"
<!-- </el-checkbox-group>--> collapse-tags
<!-- </el-form-item>--> collapse-tags-tooltip
max-collapse-tags="3"
>
<el-option
v-for="item in userPermissionList"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span>{{ item.name }}</span>
<span v-if="item.phone" style="float: right; color: #8492a6; font-size: 13px">
{{ item.phone }}
</span>
</el-option>
</el-select>
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -104,7 +177,10 @@
import { ref, reactive, computed, watch } from 'vue' import { ref, reactive, computed, watch } from 'vue'
import { useDictionary } from '@/app/api/dict' import { useDictionary } from '@/app/api/dict'
import { t } from '@/lang' import { t } from '@/lang'
import type { FormInstance } from 'element-plus' import { getToken } from '@/utils/common'
import { ElMessage } from 'element-plus'
import { Document, Download } from '@element-plus/icons-vue'
import type { FormInstance, UploadProps } from 'element-plus'
import { import {
getLessonCourseTeachingInfo, getLessonCourseTeachingInfo,
getWithPersonnelDataList, getWithPersonnelDataList,
@ -112,10 +188,24 @@ import {
import { import {
addActionLibrary, addActionLibrary,
editActionLibrary, editActionLibrary,
addFitnessLibrary,
editFitnessLibrary,
addGamesLibrary,
editGamesLibrary,
addRelaxationLibrary,
editRelaxationLibrary,
} from '@/app/api/instructional_material' } from '@/app/api/instructional_material'
import UploadImage from '@/components/upload-image/index.vue'
import UploadFile from '@/components/upload-file/index.vue'
import UploadVideo from '@/components/upload-video/index.vue'
import Editor from '@/components/editor/index.vue'
import DirectUpload from '@/components/direct-upload/index.vue'
let showDialog = ref(false) let showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
const uploading = ref(false)
const uploadProgress = ref(0)
const uploadRef = ref()
/** /**
* 表单数据 * 表单数据
@ -127,12 +217,44 @@ const initialFormData = {
type: '', type: '',
content: '', content: '',
status: '', status: '',
// user_permission: [], user_permission: [],
url: '',
library_type: '', // actionfitnessgamesrelaxation
} }
const formData: Record<string, any> = reactive({ ...initialFormData }) const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
//
const uploadUrl = computed(() => {
const baseUrl = import.meta.env.VITE_IMG_DOMAIN || 'http://localhost:20080'
switch (formData.type) {
case '1': //
return `${baseUrl}/adminapi/sys/video` //
case '2': //
return `${baseUrl}/adminapi/sys/document/material` //
case '3': //
return `${baseUrl}/adminapi/sys/image` //
default:
return ''
}
})
//
const uploadHeaders = computed(() => ({
'token': getToken() || ''
}))
//
const materialLabel = computed(() => {
switch (formData.type) {
case '1': return '视频素材'
case '2': return '文件素材'
case '3': return '图片素材'
default: return '素材内容'
}
})
// //
const formRules = computed(() => { const formRules = computed(() => {
return { return {
@ -149,26 +271,194 @@ const formRules = computed(() => {
status: [ status: [
{ required: true, message: t('statusPlaceholder'), trigger: 'blur' }, { required: true, message: t('statusPlaceholder'), trigger: 'blur' },
], ],
user_permission: [
{ required: false, message: '请选择员工权限', trigger: 'change' },
],
} }
}) })
const emit = defineEmits(['complete']) const emit = defineEmits(['complete'])
//
const getDialogTitle = () => {
const isEdit = formData.id
const titles = {
action: isEdit ? t('updateActionLibrary') : t('addActionLibrary'),
fitness: isEdit ? t('updateJumpLessonLibrary') : t('addJumpLessonLibrary'),
games: isEdit ? t('editEnTeachingLibrary') : t('addEnTeachingLibrary'),
relaxation: isEdit ? t('editBasketballTeachingLibrary') : t('addBasketballTeachingLibrary')
}
return titles[formData.library_type] || titles.action
}
//
const getSaveFunction = () => {
const isEdit = !!formData.id
const functions = {
action: isEdit ? editActionLibrary : addActionLibrary,
fitness: isEdit ? editFitnessLibrary : addFitnessLibrary,
games: isEdit ? editGamesLibrary : addGamesLibrary,
relaxation: isEdit ? editRelaxationLibrary : addRelaxationLibrary
}
return functions[formData.library_type] || functions.action
}
//
const onTypeChange = () => {
//
formData.url = ''
}
//
const beforeUpload: UploadProps['beforeUpload'] = (file) => {
console.log('准备上传文件:', file.name, '类型:', formData.type)
//
let isValid = false
let errorMsg = ''
switch (formData.type) {
case '1': //
isValid = file.type.startsWith('video/')
errorMsg = '请选择视频文件'
break
case '2': //
isValid = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain'].includes(file.type)
errorMsg = '请选择PDF、Word或文本文件'
break
case '3': //
isValid = file.type.startsWith('image/')
errorMsg = '请选择图片文件'
break
default:
errorMsg = '请先选择素材类型'
return false
}
if (!isValid) {
ElMessage.error(errorMsg)
return false
}
//
let maxSize = 10 // 10MB
let sizeText = '10MB'
if (formData.type === '1') { //
maxSize = 100 // 100MB
sizeText = '100MB'
}
const isValidSize = file.size / 1024 / 1024 < maxSize
if (!isValidSize) {
ElMessage.error(`文件大小不能超过 ${sizeText}!`)
return false
}
uploading.value = true
return true
}
//
const onUploadSuccess = (response: any) => {
console.log('上传成功响应:', response)
uploading.value = false
if (response.code === 1) {
formData.url = response.data.url
ElMessage.success('文件上传成功')
} else {
ElMessage.error(response.msg || '上传失败')
}
}
//
const onUploadError = (error: any) => {
console.error('上传失败:', error)
uploading.value = false
ElMessage.error('上传失败,请重试')
}
//
const clearFile = () => {
formData.url = ''
ElMessage.success('文件已清除')
}
//
const downloadFile = () => {
if (formData.url) {
window.open(formData.url, '_blank')
}
}
//
const getFileName = (url: string) => {
if (!url) return ''
return url.split('/').pop() || 'unknown'
}
//
const getFileTypeForDirectUpload = () => {
switch (formData.type) {
case '1': return 'video'
case '2': return 'document'
case '3': return 'image'
default: return 'image'
}
}
//
const getMaxSizeForFileType = () => {
switch (formData.type) {
case '1': return 500 // 500MB
case '2': return 50 // 50MB
case '3': return 10 // 10MB
default: return 10
}
}
//
const getFileAccept = () => {
switch (formData.type) {
case '1': return 'video/*'
case '2': return '.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx'
case '3': return 'image/*'
default: return '*/*'
}
}
//
const onDirectUploadSuccess = (url: string) => {
formData.url = url
uploading.value = false
uploadProgress.value = 0
ElMessage.success('文件上传成功')
}
//
const onUploadProgress = (percent: number) => {
uploadProgress.value = percent
uploading.value = percent > 0 && percent < 100
}
/** /**
* 确认 * 确认
* @param formEl * @param formEl
*/ */
const confirm = async (formEl: FormInstance | undefined) => { const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return if (loading.value || !formEl) return
let save = formData.id ? editActionLibrary : addActionLibrary const saveFunction = getSaveFunction()
await formEl.validate(async (valid) => { await formEl.validate(async (valid) => {
if (valid) { if (valid) {
loading.value = true loading.value = true
let data = formData let data = { ...formData }
// library_type
delete data.library_type
save(data) saveFunction(data)
.then((res) => { .then((res) => {
loading.value = false loading.value = false
showDialog.value = false showDialog.value = false
@ -210,11 +500,18 @@ watch(
const userPermissionList = ref([] as any[]) const userPermissionList = ref([] as any[])
const setUserPermissionList = async () => { const setUserPermissionList = async () => {
userPermissionList.value = await (await getWithPersonnelDataList({})).data try {
const response = await getWithPersonnelDataList({})
userPermissionList.value = response.data || []
} catch (error) {
console.error('获取员工列表失败:', error)
userPermissionList.value = []
}
} }
setUserPermissionList() setUserPermissionList()
const setFormData = async (row: any = null) => { const setFormData = async (row: any = null, libraryType: string = 'action') => {
Object.assign(formData, initialFormData) Object.assign(formData, initialFormData)
formData.library_type = libraryType
loading.value = true loading.value = true
if (row) { if (row) {
const data = await (await getLessonCourseTeachingInfo(row.id)).data const data = await (await getLessonCourseTeachingInfo(row.id)).data
@ -226,54 +523,68 @@ const setFormData = async (row: any = null) => {
loading.value = false loading.value = false
} }
//
const mobileVerify = (rule: any, value: any, callback: any) => {
if (value && !/^1[3-9]\d{9}$/.test(value)) {
callback(new Error(t('generateMobile')))
} else {
callback()
}
}
// defineExpose({
const idCardVerify = (rule: any, value: any, callback: any) => { showDialog,
if ( setFormData,
value && })
!/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( </script>
value
) <style lang="scss" scoped>
) { .material-upload-area {
callback(new Error(t('generateIdCard'))) margin-bottom: 15px;
} else {
callback()
} }
.material-preview-area {
border: 1px solid #dcdfe6;
border-radius: 4px;
padding: 15px;
background-color: #fafafa;
.image-preview {
display: flex;
align-items: center;
gap: 15px;
} }
// .video-preview {
const emailVerify = (rule: any, value: any, callback: any) => { display: flex;
if (value && !/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)) { align-items: center;
callback(new Error(t('generateEmail'))) gap: 15px;
} else {
callback()
} }
.file-preview {
display: flex;
align-items: center;
justify-content: space-between;
.file-info {
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
color: #606266;
} }
// .file-actions {
const numberVerify = (rule: any, value: any, callback: any) => { display: flex;
if (!Number.isInteger(value)) { gap: 10px;
callback(new Error(t('generateNumber')))
} else {
callback()
} }
} }
defineExpose({ .preview-info {
showDialog, display: flex;
setFormData, flex-direction: column;
}) gap: 10px;
</script>
<style lang="scss" scoped></style> p {
margin: 0;
font-size: 14px;
color: #606266;
}
}
}
</style>
<style lang="scss"> <style lang="scss">
.diy-dialog-wrap .el-form-item__label { .diy-dialog-wrap .el-form-item__label {
height: auto !important; height: auto !important;

27
admin/src/app/views/instructional_material/instructional_material.vue

@ -336,7 +336,7 @@
</div> </div>
</div> </div>
<edit-jump <edit
ref="editJumpLessonLibraryDialog" ref="editJumpLessonLibraryDialog"
@complete="loadJumpLessonLibraryList" @complete="loadJumpLessonLibraryList"
/> />
@ -507,7 +507,7 @@
</div> </div>
</div> </div>
<edit-en <edit
ref="editEnTeachingLibraryDialog" ref="editEnTeachingLibraryDialog"
@complete="loadEnTeachingLibraryList" @complete="loadEnTeachingLibraryList"
/> />
@ -682,7 +682,7 @@
</div> </div>
</div> </div>
<edit-basketball <edit
ref="editBasketballTeachingLibraryDialog" ref="editBasketballTeachingLibraryDialog"
@complete="loadBasketballTeachingLibraryList" @complete="loadBasketballTeachingLibraryList"
/> />
@ -717,9 +717,6 @@ import {
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessageBox, FormInstance } from 'element-plus' import { ElMessageBox, FormInstance } from 'element-plus'
import Edit from '@/app/views/instructional_material/components/lesson-course-teaching-edit.vue' import Edit from '@/app/views/instructional_material/components/lesson-course-teaching-edit.vue'
import EditJump from '@/app/views/instructional_material/components/Jump-lesson-library-edit.vue'
import EditEn from '@/app/views/instructional_material/components/en-course-teaching-edit.vue'
import EditBasketball from '@/app/views/instructional_material/components/basketball-course-teaching-edit.vue'
import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue' import bindingPersonnel from '@/app/views/binding_personnel/binding_personnel.vue'
import bindingTestPaper from '@/app/views/binding_test_paper/binding_test_paper.vue' import bindingTestPaper from '@/app/views/binding_test_paper/binding_test_paper.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
@ -844,7 +841,7 @@ loadActionLibraryList()
* 添加热身动作库 * 添加热身动作库
*/ */
const addActionLibrary = () => { const addActionLibrary = () => {
editActionLibraryDialog.value.setFormData() editActionLibraryDialog.value.setFormData(null, 'action')
editActionLibraryDialog.value.showDialog = true editActionLibraryDialog.value.showDialog = true
} }
@ -852,8 +849,8 @@ const addActionLibrary = () => {
* 编辑热身动作库 * 编辑热身动作库
* @param data * @param data
*/ */
const editActionLibrary = (data: any) => { const updateActionLibrary = (data: any) => {
editActionLibraryDialog.value.setFormData(data) editActionLibraryDialog.value.setFormData(data, 'action')
editActionLibraryDialog.value.showDialog = true editActionLibraryDialog.value.showDialog = true
} }
@ -884,7 +881,7 @@ loadJumpLessonLibraryList()
* 添加体能动作库 * 添加体能动作库
*/ */
const addJumpLessonLibrary = () => { const addJumpLessonLibrary = () => {
editJumpLessonLibraryDialog.value.setFormData() editJumpLessonLibraryDialog.value.setFormData(null, 'fitness')
editJumpLessonLibraryDialog.value.showDialog = true editJumpLessonLibraryDialog.value.showDialog = true
} }
@ -893,7 +890,7 @@ const addJumpLessonLibrary = () => {
* @param data * @param data
*/ */
const editJumpLessonLibrary = (data: any) => { const editJumpLessonLibrary = (data: any) => {
editJumpLessonLibraryDialog.value.setFormData(data) editJumpLessonLibraryDialog.value.setFormData(data, 'fitness')
editJumpLessonLibraryDialog.value.showDialog = true editJumpLessonLibraryDialog.value.showDialog = true
} }
@ -924,7 +921,7 @@ loadEnTeachingLibraryList()
* 添加趣味游戏 * 添加趣味游戏
*/ */
const addEnTeachingLibrary = () => { const addEnTeachingLibrary = () => {
editEnTeachingLibraryDialog.value.setFormData() editEnTeachingLibraryDialog.value.setFormData(null, 'games')
editEnTeachingLibraryDialog.value.showDialog = true editEnTeachingLibraryDialog.value.showDialog = true
} }
@ -933,7 +930,7 @@ const addEnTeachingLibrary = () => {
* @param data * @param data
*/ */
const editEnTeachingLibrary = (data: any) => { const editEnTeachingLibrary = (data: any) => {
editEnTeachingLibraryDialog.value.setFormData(data) editEnTeachingLibraryDialog.value.setFormData(data, 'games')
editEnTeachingLibraryDialog.value.showDialog = true editEnTeachingLibraryDialog.value.showDialog = true
} }
@ -964,7 +961,7 @@ loadBasketballTeachingLibraryList()
* 添加篮球教案库 * 添加篮球教案库
*/ */
const addBasketballTeachingLibrary = () => { const addBasketballTeachingLibrary = () => {
editBasketballTeachingLibraryDialog.value.setFormData() editBasketballTeachingLibraryDialog.value.setFormData(null, 'relaxation')
editBasketballTeachingLibraryDialog.value.showDialog = true editBasketballTeachingLibraryDialog.value.showDialog = true
} }
@ -973,7 +970,7 @@ const addBasketballTeachingLibrary = () => {
* @param data * @param data
*/ */
const editBasketballTeachingLibrary = (data: any) => { const editBasketballTeachingLibrary = (data: any) => {
editBasketballTeachingLibraryDialog.value.setFormData(data) editBasketballTeachingLibraryDialog.value.setFormData(data, 'relaxation')
editBasketballTeachingLibraryDialog.value.showDialog = true editBasketballTeachingLibraryDialog.value.showDialog = true
} }

446
admin/src/app/views/lesson_course_teaching/components/unified-edit-dialog.vue

@ -28,20 +28,31 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('image')" prop="image"> <el-form-item :label="t('image')" prop="image">
<div class="w-[120px] h-[120px] border border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-blue-400 transition-colors" @click="selectImage"> <div class="image-preview-container">
<div v-if="!formData.image" class="text-center text-gray-400"> <div v-if="formData.image" class="image-display">
<el-image
:src="img(formData.image)"
style="width: 120px; height: 120px"
fit="cover"
:preview-src-list="[img(formData.image)]"
/>
<div class="image-info">
<p>封面预览</p>
<el-button type="danger" size="small" @click="clearImage">删除</el-button>
</div>
</div>
<div v-else class="image-placeholder">
<el-icon size="30" class="mb-2"> <el-icon size="30" class="mb-2">
<Plus /> <Picture />
</el-icon> </el-icon>
<div class="text-xs">上传图片</div> <div class="text-xs text-gray-400">暂无封面图片</div>
</div> </div>
<img v-else :src="img(formData.image)" class="w-full h-full object-cover rounded-lg" />
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('type')" prop="type"> <el-form-item :label="t('type')" prop="type">
<el-select v-model="formData.type" :placeholder="t('typePlaceholder')" class="w-full"> <el-select v-model="formData.type" :placeholder="t('typePlaceholder')" class="w-full" @change="onTypeChange">
<el-option <el-option
v-for="(item, index) in typeList" v-for="(item, index) in typeList"
:key="index" :key="index"
@ -53,17 +64,74 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <!-- 根据素材类型显示不同的上传和预览组件 -->
<el-row :gutter="20" v-if="formData.type">
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="t('url')" prop="url"> <el-form-item :label="materialLabel" prop="url">
<div class="w-full flex gap-2"> <!-- 文件上传区域 -->
<el-input <div class="material-upload-area">
v-model="formData.url" <direct-upload
:placeholder="getUrlPlaceholder" ref="uploadRef"
clearable :file-type="getFileTypeForDirectUpload()"
class="flex-1" :max-size="getMaxSizeForFileType()"
:accept="getFileAccept"
:fallback-url="uploadUrl"
@success="onDirectUploadSuccess"
@error="onUploadError"
@progress="onUploadProgress"
>
<el-button type="primary" :loading="uploading">
{{ uploading ? `上传中 ${uploadProgress}%` : '选择文件' }}
</el-button>
</direct-upload>
</div>
<!-- 文件预览区域 -->
<div class="material-preview-area" v-if="formData.url">
<!-- 图片预览 -->
<div v-if="formData.type == '3'" class="image-preview">
<el-image
:src="formData.url"
style="width: 200px; height: 120px"
fit="cover"
:preview-src-list="[formData.url]"
/> />
<el-button type="primary" @click="selectFile">选择文件</el-button> <div class="preview-info">
<p>图片预览</p>
<el-button type="danger" size="small" @click="clearFile">删除</el-button>
</div>
</div>
<!-- 视频预览 -->
<div v-else-if="formData.type == '1'" class="video-preview">
<video
:src="formData.url"
controls
style="width: 300px; height: 200px"
preload="metadata"
>
您的浏览器不支持视频播放
</video>
<div class="preview-info">
<p>视频预览</p>
<el-button type="danger" size="small" @click="clearFile">删除</el-button>
</div>
</div>
<!-- 文件预览 -->
<div v-else-if="formData.type == '2'" class="file-preview">
<div class="file-info">
<el-icon><Document /></el-icon>
<span>{{ getFileName(formData.url) }}</span>
</div>
<div class="file-actions">
<el-button type="primary" size="small" @click="downloadFile">
<el-icon><Download /></el-icon>
下载
</el-button>
<el-button type="danger" size="small" @click="clearFile">删除</el-button>
</div>
</div>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -72,12 +140,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="t('content')" prop="content"> <el-form-item :label="t('content')" prop="content">
<el-input <editor v-model="formData.content" />
v-model="formData.content"
type="textarea"
:placeholder="t('contentPlaceholder')"
:autosize="{ minRows: 4, maxRows: 8 }"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -96,19 +159,29 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="t('userPermission')" prop="user_permission"> <el-form-item label="员工权限" prop="user_permission">
<el-select <el-select
v-model="formData.user_permission" v-model="formData.user_permission"
multiple multiple
:placeholder="t('userPermissionPlaceholder')" filterable
class="w-full" clearable
placeholder="搜索并选择员工"
style="width: 100%"
collapse-tags
collapse-tags-tooltip
max-collapse-tags="3"
> >
<el-option <el-option
v-for="item in personnelList" v-for="item in personnelList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
/> >
<span>{{ item.name }}</span>
<span v-if="item.phone" style="float: right; color: #8492a6; font-size: 13px">
{{ item.phone }}
</span>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -122,23 +195,6 @@
</el-button> </el-button>
</template> </template>
<!-- 文件选择器 -->
<input
ref="fileInputRef"
type="file"
style="display: none"
@change="handleFileSelect"
:accept="getFileAccept"
/>
<!-- 图片选择器 -->
<input
ref="imageInputRef"
type="file"
style="display: none"
@change="handleImageSelect"
accept="image/*"
/>
</el-dialog> </el-dialog>
</template> </template>
@ -150,7 +206,11 @@ import { addUnified, editUnified, getUnifiedInfo } from '@/app/api/lesson_course
import { getWithPersonnelDataList } from '@/app/api/lesson_course_teaching' import { getWithPersonnelDataList } from '@/app/api/lesson_course_teaching'
import { img } from '@/utils/common' import { img } from '@/utils/common'
import { ElMessage, FormInstance } from 'element-plus' import { ElMessage, FormInstance } from 'element-plus'
import { Plus } from '@element-plus/icons-vue' import { Plus, Document, Download, Picture } from '@element-plus/icons-vue'
import { getToken } from '@/utils/common'
import type { UploadProps } from 'element-plus'
import Editor from '@/components/editor/index.vue'
import DirectUpload from '@/components/direct-upload/index.vue'
const props = defineProps<{ const props = defineProps<{
moduleConfig: { moduleConfig: {
@ -165,8 +225,9 @@ const emit = defineEmits(['complete'])
const showDialog = ref(false) const showDialog = ref(false)
const submitLoading = ref(false) const submitLoading = ref(false)
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const fileInputRef = ref<HTMLInputElement>() const uploadRef = ref()
const imageInputRef = ref<HTMLInputElement>() const uploading = ref(false)
const uploadProgress = ref(0)
const formData = reactive({ const formData = reactive({
id: 0, id: 0,
@ -199,15 +260,6 @@ const dialogTitle = computed(() => {
return `${action}${props.moduleConfig?.name || ''}` return `${action}${props.moduleConfig?.name || ''}`
}) })
// URL
const getUrlPlaceholder = computed(() => {
const typeMap: Record<string, string> = {
'1': '视频文件地址',
'2': '文档文件地址',
'3': '图片文件地址'
}
return typeMap[formData.type] || '请输入文件地址'
})
// //
const getFileAccept = computed(() => { const getFileAccept = computed(() => {
@ -219,6 +271,36 @@ const getFileAccept = computed(() => {
return typeMap[formData.type] || '*/*' return typeMap[formData.type] || '*/*'
}) })
//
const uploadUrl = computed(() => {
const baseUrl = import.meta.env.VITE_IMG_DOMAIN || 'http://localhost:20080'
switch (formData.type) {
case '1': //
return `${baseUrl}/adminapi/sys/video`
case '2': //
return `${baseUrl}/adminapi/sys/document/material`
case '3': //
return `${baseUrl}/adminapi/sys/image`
default:
return ''
}
})
//
const uploadHeaders = computed(() => ({
'token': getToken() || ''
}))
//
const materialLabel = computed(() => {
switch (formData.type) {
case '1': return '视频素材'
case '2': return '文件素材'
case '3': return '图片素材'
default: return '素材内容'
}
})
// //
const initDictionaries = async () => { const initDictionaries = async () => {
try { try {
@ -283,43 +365,160 @@ const open = async (rowData?: any) => {
showDialog.value = true showDialog.value = true
} }
//
const selectImage = () => { //
imageInputRef.value?.click() const beforeUpload: UploadProps['beforeUpload'] = (file) => {
console.log('准备上传文件:', file.name, '类型:', formData.type)
//
let isValid = false
let errorMsg = ''
switch (formData.type) {
case '1': //
isValid = file.type.startsWith('video/')
errorMsg = '请选择视频文件'
break
case '2': //
isValid = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain'].includes(file.type)
errorMsg = '请选择PDF、Word或文本文件'
break
case '3': //
isValid = file.type.startsWith('image/')
errorMsg = '请选择图片文件'
break
default:
errorMsg = '请先选择素材类型'
return false
}
if (!isValid) {
ElMessage.error(errorMsg)
return false
}
//
let maxSize = 10 // 10MB
let sizeText = '10MB'
if (formData.type === '1') { //
maxSize = 100 // 100MB
sizeText = '100MB'
}
const isValidSize = file.size / 1024 / 1024 < maxSize
if (!isValidSize) {
ElMessage.error(`文件大小不能超过 ${sizeText}!`)
return false
}
uploading.value = true
return true
}
//
const onUploadSuccess = (response: any) => {
console.log('上传成功响应:', response)
uploading.value = false
if (response.code === 1) {
formData.url = response.data.url
//
if (formData.type === '3') {
formData.image = response.data.url
}
ElMessage.success('文件上传成功')
} else {
ElMessage.error(response.msg || '上传失败')
}
}
//
const onUploadError = (error: any) => {
console.error('上传失败:', error)
uploading.value = false
ElMessage.error('上传失败,请重试')
} }
// //
const selectFile = () => { const clearFile = () => {
fileInputRef.value?.click() formData.url = ''
ElMessage.success('文件已清除')
} }
// //
const handleImageSelect = (event: Event) => { const downloadFile = () => {
const target = event.target as HTMLInputElement if (formData.url) {
const file = target.files?.[0] window.open(formData.url, '_blank')
if (file) {
//
// 使
const reader = new FileReader()
reader.onload = (e) => {
formData.image = e.target?.result as string
} }
reader.readAsDataURL(file)
ElMessage.success('图片已选择,请先上传到服务器获取正确地址')
} }
//
const getFileName = (url: string) => {
if (!url) return ''
return url.split('/').pop() || 'unknown'
} }
// //
const handleFileSelect = (event: Event) => { const clearImage = () => {
const target = event.target as HTMLInputElement formData.image = ''
const file = target.files?.[0] ElMessage.success('封面图片已清除')
if (file) { }
//
formData.url = file.name // //
ElMessage.success('文件已选择,请先上传到服务器获取正确地址') const onTypeChange = () => {
//
formData.url = ''
//
if (formData.type !== '3') {
formData.image = ''
} }
} }
//
const getFileTypeForDirectUpload = () => {
switch (formData.type) {
case '1': return 'video'
case '2': return 'document'
case '3': return 'image'
default: return 'image'
}
}
//
const getMaxSizeForFileType = () => {
switch (formData.type) {
case '1': return 500 // 500MB
case '2': return 50 // 50MB
case '3': return 10 // 10MB
default: return 10
}
}
//
const onDirectUploadSuccess = (url: string) => {
formData.url = url
//
if (formData.type === '3') {
formData.image = url
}
uploading.value = false
uploadProgress.value = 0
ElMessage.success('文件上传成功')
}
//
const onUploadProgress = (percent: number) => {
uploadProgress.value = percent
uploading.value = percent > 0 && percent < 100
}
// //
const handleSubmit = async () => { const handleSubmit = async () => {
if (!formRef.value) return if (!formRef.value) return
@ -368,4 +567,91 @@ defineExpose({
width: 100%; width: 100%;
} }
} }
.material-upload-area {
margin-bottom: 15px;
}
.image-preview-container {
.image-display {
display: flex;
align-items: flex-start;
gap: 15px;
.image-info {
display: flex;
flex-direction: column;
gap: 10px;
p {
margin: 0;
font-size: 14px;
color: #606266;
}
}
}
.image-placeholder {
width: 120px;
height: 120px;
border: 1px dashed #dcdfe6;
border-radius: 4px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #c0c4cc;
background-color: #fafafa;
}
}
.material-preview-area {
border: 1px solid #dcdfe6;
border-radius: 4px;
padding: 15px;
background-color: #fafafa;
.image-preview {
display: flex;
align-items: center;
gap: 15px;
}
.video-preview {
display: flex;
align-items: center;
gap: 15px;
}
.file-preview {
display: flex;
align-items: center;
justify-content: space-between;
.file-info {
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
color: #606266;
}
.file-actions {
display: flex;
gap: 10px;
}
}
.preview-info {
display: flex;
flex-direction: column;
gap: 10px;
p {
margin: 0;
font-size: 14px;
color: #606266;
}
}
}
</style> </style>

333
admin/src/app/views/salary/components/salary-detail.vue

@ -0,0 +1,333 @@
<template>
<el-dialog
v-model="showDialog"
title="工资条详情"
width="50%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<div v-loading="loading" class="salary-detail">
<div class="detail-header">
<el-row :gutter="24" class="mb-6">
<el-col :span="8">
<div class="info-item">
<span class="label">员工姓名</span>
<span class="value">{{ detailData.staff_name || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="label">校区</span>
<span class="value">{{ detailData.campus_name || '-' }}</span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="label">工资月份</span>
<span class="value">{{ detailData.salary_month || '-' }}</span>
</div>
</el-col>
</el-row>
</div>
<el-divider>考勤信息</el-divider>
<el-row :gutter="24" class="mb-6">
<el-col :span="8">
<div class="info-item">
<span class="label">应出勤天数</span>
<span class="value">{{ detailData.full_attendance_days || 0 }} </span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="label">实际出勤天数</span>
<span class="value">{{ detailData.attendance || 0 }} </span>
</div>
</el-col>
<el-col :span="8">
<div class="info-item">
<span class="label">出勤率</span>
<span class="value">{{ attendanceRate }}%</span>
</div>
</el-col>
</el-row>
<el-divider>工资构成</el-divider>
<div class="salary-breakdown">
<el-row :gutter="24" class="mb-4">
<el-col :span="12">
<div class="salary-item">
<span class="label">基础工资</span>
<span class="value">¥{{ (detailData.base_salary || 0).toFixed(2) }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="salary-item">
<span class="label">出勤工资</span>
<span class="value">¥{{ (detailData.work_salary || 0).toFixed(2) }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="24" class="mb-4">
<el-col :span="12">
<div class="salary-item">
<span class="label">管理绩效</span>
<span class="value">¥{{ (detailData.mgr_performance || 0).toFixed(2) }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="salary-item">
<span class="label">绩效奖金</span>
<span class="value">¥{{ (detailData.performance_bonus || 0).toFixed(2) }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="24" class="mb-4">
<el-col :span="12">
<div class="salary-item">
<span class="label">其他补贴</span>
<span class="value">¥{{ (detailData.other_subsidies || 0).toFixed(2) }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="salary-item">
<span class="label">其他扣减</span>
<span class="value text-red">-¥{{ (detailData.deductions || 0).toFixed(2) }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="24" class="mb-4">
<el-col :span="24">
<div class="salary-item highlight">
<span class="label">应发工资</span>
<span class="value text-blue">¥{{ (detailData.gross_salary || 0).toFixed(2) }}</span>
</div>
</el-col>
</el-row>
</div>
<el-divider>扣除项目</el-divider>
<el-row :gutter="24" class="mb-4">
<el-col :span="12">
<div class="salary-item">
<span class="label">社保扣除</span>
<span class="value text-red">-¥{{ (detailData.social_security || 0).toFixed(2) }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="salary-item">
<span class="label">个人所得税</span>
<span class="value text-red">-¥{{ (detailData.individual_income_tax || 0).toFixed(2) }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="24" class="mb-6">
<el-col :span="24">
<div class="salary-item highlight final">
<span class="label">实发工资</span>
<span class="value text-green">¥{{ (detailData.net_salary || 0).toFixed(2) }}</span>
</div>
</el-col>
</el-row>
<el-divider>其他信息</el-divider>
<el-row :gutter="24" class="mb-4">
<el-col :span="12">
<div class="info-item">
<span class="label">状态</span>
<el-tag v-if="detailData.status === 0" type="info">草稿</el-tag>
<el-tag v-else-if="detailData.status === 1" type="warning">已提交</el-tag>
<el-tag v-else-if="detailData.status === 2" type="success">已发放</el-tag>
</div>
</el-col>
<el-col :span="12">
<div class="info-item">
<span class="label">创建时间</span>
<span class="value">{{ detailData.created_at || '-' }}</span>
</div>
</el-col>
</el-row>
<div v-if="detailData.remarks" class="remarks-section">
<div class="info-item">
<span class="label">备注</span>
<div class="remarks-content">{{ detailData.remarks }}</div>
</div>
</div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed } from 'vue'
import { ElMessage } from 'element-plus'
import { getSalaryInfo, type SalaryItem } from '@/app/api/salary'
const showDialog = ref(false)
const loading = ref(false)
//
const detailData = reactive<Partial<SalaryItem>>({})
//
const attendanceRate = computed(() => {
if (!detailData.full_attendance_days || detailData.full_attendance_days === 0) {
return '0'
}
const rate = ((detailData.attendance || 0) / detailData.full_attendance_days * 100)
return rate.toFixed(1)
})
//
const setDetailData = async (row: SalaryItem) => {
if (!row || !row.id) {
ElMessage.error('数据有误')
return
}
showDialog.value = true
loading.value = true
try {
const res = await getSalaryInfo(row.id)
if (res.data) {
Object.assign(detailData, res.data)
}
} catch (error) {
console.error('加载详情失败:', error)
ElMessage.error('加载详情失败')
showDialog.value = false
} finally {
loading.value = false
}
}
defineExpose({
showDialog,
setDetailData
})
</script>
<style lang="scss" scoped>
.salary-detail {
.detail-header {
background-color: #f8f9ff;
padding: 16px;
border-radius: 8px;
margin-bottom: 20px;
}
.info-item {
display: flex;
align-items: flex-start;
margin-bottom: 12px;
.label {
color: #666;
font-weight: 500;
min-width: 100px;
display: inline-block;
}
.value {
color: #333;
font-weight: 500;
}
}
.salary-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background-color: #fafafa;
border-radius: 6px;
margin-bottom: 8px;
.label {
color: #666;
font-weight: 500;
}
.value {
color: #333;
font-weight: 600;
}
&.highlight {
background-color: #e8f4fd;
border: 1px solid #b3d8ff;
.label, .value {
font-size: 16px;
font-weight: 600;
}
}
&.final {
background-color: #f0f9ff;
border: 2px solid #16a34a;
.label, .value {
font-size: 18px;
font-weight: 700;
}
}
}
.remarks-section {
margin-top: 20px;
padding: 16px;
background-color: #f8f9fa;
border-radius: 8px;
.remarks-content {
margin-top: 8px;
padding: 12px;
background-color: white;
border-radius: 6px;
color: #333;
line-height: 1.5;
word-break: break-all;
}
}
.text-red {
color: #f56565 !important;
}
.text-blue {
color: #2563eb !important;
}
.text-green {
color: #16a34a !important;
}
.el-divider {
margin: 24px 0 16px 0;
.el-divider__text {
background-color: white;
font-weight: 600;
color: #333;
}
}
}
</style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label {
height: auto !important;
}
</style>

481
admin/src/app/views/salary/components/salary-edit.vue

@ -0,0 +1,481 @@
<template>
<el-dialog
v-model="showDialog"
:title="formData.id ? '编辑工资条' : '新增工资条'"
width="60%"
class="diy-dialog-wrap"
:destroy-on-close="true"
>
<el-form
:model="formData"
label-width="120px"
ref="formRef"
:rules="formRules"
class="page-form"
v-loading="loading"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="员工" prop="staff_id">
<el-select
v-model="formData.staff_id"
placeholder="请选择员工"
clearable
filterable
class="w-full"
@change="handleStaffChange"
>
<el-option
v-for="item in personnelList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="校区" prop="campus_id">
<el-select
v-model="formData.campus_id"
placeholder="请选择校区"
clearable
class="w-full"
>
<el-option
v-for="item in campusList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="工资月份" prop="salary_month">
<el-date-picker
v-model="formData.salary_month"
type="month"
placeholder="请选择工资月份"
format="YYYY-MM"
value-format="YYYY-MM"
clearable
class="w-full"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="基础工资(元)" prop="base_salary">
<el-input-number
v-model="formData.base_salary"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入基础工资"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="应出勤天数" prop="full_attendance_days">
<el-input-number
v-model="formData.full_attendance_days"
:min="0"
:precision="0"
class="w-full"
placeholder="请输入应出勤天数"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实际出勤天数" prop="attendance">
<el-input-number
v-model="formData.attendance"
:min="0"
:precision="0"
class="w-full"
placeholder="请输入实际出勤天数"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="出勤工资(元)">
<el-input
v-model="workSalary"
disabled
class="w-full"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="管理绩效(元)" prop="mgr_performance">
<el-input-number
v-model="formData.mgr_performance"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入管理绩效"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="绩效奖金(元)" prop="performance_bonus">
<el-input-number
v-model="formData.performance_bonus"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入绩效奖金"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="其他补贴(元)" prop="other_subsidies">
<el-input-number
v-model="formData.other_subsidies"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入其他补贴"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="其他扣减(元)" prop="deductions">
<el-input-number
v-model="formData.deductions"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入其他扣减"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="应发工资(元)">
<el-input
v-model="grossSalary"
disabled
class="w-full"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="社保扣除(元)" prop="social_security">
<el-input-number
v-model="formData.social_security"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入社保扣除"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="个人所得税(元)" prop="individual_income_tax">
<el-input-number
v-model="formData.individual_income_tax"
:min="0"
:precision="2"
class="w-full"
placeholder="请输入个人所得税"
@change="calculateSalary"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="实发工资(元)">
<el-input
v-model="netSalary"
disabled
class="w-full"
style="font-weight: 600; color: #16a34a;"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select
v-model="formData.status"
placeholder="请选择状态"
class="w-full"
>
<el-option label="草稿" :value="0" />
<el-option label="已提交" :value="1" />
<el-option label="已发放" :value="2" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注">
<el-input
v-model="formData.remarks"
type="textarea"
:rows="3"
placeholder="请输入备注信息"
class="w-full"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false">取消</el-button>
<el-button
type="primary"
:loading="loading"
@click="confirm(formRef)"
>
确认
</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import type { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus'
import {
createSalary,
updateSalary,
getSalaryInfo,
getPersonnelList,
getCampusList,
calculateWorkSalary,
calculateGrossSalary,
calculateNetSalary,
type SalaryFormData
} from '@/app/api/salary'
const showDialog = ref(false)
const loading = ref(false)
//
const initialFormData: SalaryFormData = {
staff_id: undefined,
campus_id: undefined,
salary_month: '',
base_salary: 0,
full_attendance_days: 0,
attendance: 0,
mgr_performance: 0,
performance_bonus: 0,
other_subsidies: 0,
deductions: 0,
social_security: 0,
individual_income_tax: 0,
remarks: ''
}
const formData: Record<string, any> = reactive({ ...initialFormData })
const formRef = ref<FormInstance>()
//
const personnelList = ref<any[]>([])
const campusList = ref<any[]>([])
//
const workSalary = computed(() => {
return calculateWorkSalary(
formData.base_salary || 0,
formData.full_attendance_days || 0,
formData.attendance || 0
).toFixed(2)
})
const grossSalary = computed(() => {
const work = calculateWorkSalary(
formData.base_salary || 0,
formData.full_attendance_days || 0,
formData.attendance || 0
)
return calculateGrossSalary(
work,
formData.mgr_performance || 0,
formData.performance_bonus || 0,
formData.other_subsidies || 0,
formData.deductions || 0
).toFixed(2)
})
const netSalary = computed(() => {
const work = calculateWorkSalary(
formData.base_salary || 0,
formData.full_attendance_days || 0,
formData.attendance || 0
)
const gross = calculateGrossSalary(
work,
formData.mgr_performance || 0,
formData.performance_bonus || 0,
formData.other_subsidies || 0,
formData.deductions || 0
)
return calculateNetSalary(
gross,
formData.social_security || 0,
formData.individual_income_tax || 0
).toFixed(2)
})
//
const formRules = computed(() => {
return {
staff_id: [
{ required: true, message: '请选择员工', trigger: 'change' }
],
salary_month: [
{ required: true, message: '请选择工资月份', trigger: 'change' }
],
base_salary: [
{ required: true, message: '请输入基础工资', trigger: 'blur' },
{ type: 'number', min: 0, message: '基础工资不能小于0', trigger: 'blur' }
],
full_attendance_days: [
{ required: true, message: '请输入应出勤天数', trigger: 'blur' },
{ type: 'number', min: 0, message: '应出勤天数不能小于0', trigger: 'blur' }
],
attendance: [
{ required: true, message: '请输入实际出勤天数', trigger: 'blur' },
{ type: 'number', min: 0, message: '实际出勤天数不能小于0', trigger: 'blur' }
]
}
})
const emit = defineEmits(['complete'])
//
const loadOptions = async () => {
try {
const [personnelRes, campusRes] = await Promise.all([
getPersonnelList(),
getCampusList()
])
personnelList.value = personnelRes.data
campusList.value = campusRes.data
} catch (error) {
console.error('加载选项数据失败:', error)
}
}
//
const handleStaffChange = (staffId: number) => {
if (staffId) {
const staff = personnelList.value.find(item => item.id === staffId)
if (staff && staff.campus_id) {
formData.campus_id = staff.campus_id
}
}
}
//
const calculateSalary = () => {
//
}
//
const confirm = async (formEl: FormInstance | undefined) => {
if (loading.value || !formEl) return
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true
const saveData = { ...formData }
const saveAction = formData.id ? updateSalary : createSalary
try {
await saveAction(saveData)
ElMessage.success(formData.id ? '更新成功' : '创建成功')
showDialog.value = false
emit('complete')
} catch (error) {
console.error('保存失败:', error)
ElMessage.error('保存失败')
} finally {
loading.value = false
}
}
})
}
//
const setFormData = async (row: any = null) => {
Object.assign(formData, initialFormData)
loading.value = true
try {
if (row && row.id) {
const res = await getSalaryInfo(row.id)
if (res.data) {
Object.keys(formData).forEach((key: string) => {
if (res.data[key] !== undefined) {
formData[key] = res.data[key]
}
})
}
} else {
//
formData.status = 0
formData.full_attendance_days = 22
formData.attendance = 22
}
} catch (error) {
console.error('加载数据失败:', error)
ElMessage.error('加载数据失败')
} finally {
loading.value = false
}
}
//
loadOptions()
defineExpose({
showDialog,
setFormData
})
</script>
<style lang="scss" scoped>
.w-full {
width: 100%;
}
</style>
<style lang="scss">
.diy-dialog-wrap .el-form-item__label {
height: auto !important;
}
</style>

32
admin/src/app/views/salary/list.vue

@ -201,6 +201,12 @@
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
<!-- 工资编辑弹窗 -->
<SalaryEdit ref="salaryEditRef" @complete="handleDialogComplete" />
<!-- 工资详情弹窗 -->
<SalaryDetail ref="salaryDetailRef" />
</el-card> </el-card>
</div> </div>
</template> </template>
@ -209,7 +215,6 @@
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox, type FormInstance } from 'element-plus' import { ElMessage, ElMessageBox, type FormInstance } from 'element-plus'
import { Search, Refresh, Plus, Upload, Download, UploadFilled } from '@element-plus/icons-vue' import { Search, Refresh, Plus, Upload, Download, UploadFilled } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
import { import {
getSalaryList, getSalaryList,
deleteSalary, deleteSalary,
@ -218,8 +223,8 @@ import {
type QueryParams, type QueryParams,
type SalaryItem type SalaryItem
} from '@/app/api/salary' } from '@/app/api/salary'
import SalaryEdit from './components/salary-edit.vue'
const router = useRouter() import SalaryDetail from './components/salary-detail.vue'
// //
const loading = ref(false) const loading = ref(false)
@ -240,6 +245,8 @@ const queryParams = reactive<QueryParams>({
const queryFormRef = ref<FormInstance>() const queryFormRef = ref<FormInstance>()
const uploadRef = ref() const uploadRef = ref()
const salaryEditRef = ref()
const salaryDetailRef = ref()
// //
const importAction = '/salary/payroll/import' const importAction = '/salary/payroll/import'
@ -293,17 +300,25 @@ const resetQuery = () => {
// //
const handleAdd = () => { const handleAdd = () => {
router.push('/salary/edit') if (salaryEditRef.value) {
salaryEditRef.value.showDialog = true
salaryEditRef.value.setFormData()
}
} }
// //
const handleEdit = (row: SalaryItem) => { const handleEdit = (row: SalaryItem) => {
router.push(`/salary/edit?id=${row.id}`) if (salaryEditRef.value) {
salaryEditRef.value.showDialog = true
salaryEditRef.value.setFormData(row)
}
} }
// //
const handleView = (row: SalaryItem) => { const handleView = (row: SalaryItem) => {
router.push(`/salary/detail?id=${row.id}`) if (salaryDetailRef.value) {
salaryDetailRef.value.setDetailData(row)
}
} }
// //
@ -391,6 +406,11 @@ const handleImportSuccess = (response: any) => {
const handleImportError = () => { const handleImportError = () => {
ElMessage.error('导入失败') ElMessage.error('导入失败')
} }
//
const handleDialogComplete = () => {
loadTableData()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

12
admin/src/app/views/user_feedback/components/user-feedback-edit.vue

@ -1,8 +1,8 @@
<template> <template>
<el-dialog v-model="showDialog" :title="formData.id ? t('updateUserFeedback') : t('addUserFeedback')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true"> <el-dialog v-model="showDialog" :title="formData.id ? t('updateUserFeedback') : t('addUserFeedback')" width="50%" class="diy-dialog-wrap" :destroy-on-close="true">
<el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading"> <el-form :model="formData" label-width="120px" ref="formRef" :rules="formRules" class="page-form" v-loading="loading">
<el-form-item :label="t('userId')" > <el-form-item :label="t('userId')" prop="user_id">
<el-select class="input-width" v-model="formData.user_id" clearable :placeholder="t('userIdPlaceholder')" disabled> <el-select class="input-width" v-model="formData.user_id" clearable :placeholder="t('userIdPlaceholder')">
<el-option label="请选择" value=""></el-option> <el-option label="请选择" value=""></el-option>
<el-option <el-option
v-for="(item, index) in userIdList" v-for="(item, index) in userIdList"
@ -13,11 +13,11 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('feedbackText')" > <el-form-item :label="t('feedbackText')" prop="feedback_text">
<el-input disabled v-model="formData.feedback_text" type="textarea" rows="4" clearable :placeholder="t('feedbackTextPlaceholder')" class="input-width"/> <el-input v-model="formData.feedback_text" type="textarea" rows="4" clearable :placeholder="t('feedbackTextPlaceholder')" class="input-width"/>
</el-form-item> </el-form-item>
<el-form-item :label="t('attachmentUrl')" > <el-form-item :label="t('attachmentUrl')" prop="attachment_url">
<upload-file v-model="formData.attachment_url" disabled/> <upload-image v-model="formData.attachment_url" :limit="1" width="120px" height="120px" imageText="上传图片"/>
</el-form-item> </el-form-item>
</el-form> </el-form>

128
admin/src/app/views/user_feedback/user_feedback.vue

@ -42,24 +42,38 @@
<el-table-column <el-table-column
prop="attachment_url" prop="attachment_url"
:label="t('attachmentUrl')" :label="t('attachmentUrl')"
min-width="120" min-width="150"
:show-overflow-tooltip="false" :show-overflow-tooltip="false"
> >
<template #default="{ row }"> <template #default="{ row }">
<el-icon <div v-if="row.attachment_url" class="attachment-preview">
v-if="isImage(row.attachment_url)" <!-- 图片预览 -->
class="clickable" <div v-if="isImage(row.attachment_url)" class="image-preview-wrapper">
@click="handlePreview(row.attachment_url)" <el-image
:src="row.attachment_url"
style="width: 60px; height: 60px"
fit="cover"
:preview-src-list="[row.attachment_url]"
> >
<Picture /> <template #error>
</el-icon> <div style="display: flex; align-items: center; justify-content: center; width: 60px; height: 60px; background: #f5f7fa; color: #909399; border: 1px solid #e4e7ed;">
<span style="font-size: 12px;">加载失败</span>
</div>
</template>
</el-image>
</div>
<!-- 非图片文件 -->
<div v-else class="file-preview">
<el-icon <el-icon
v-else class="file-icon"
class="clickable"
@click="openFile(row.attachment_url)" @click="openFile(row.attachment_url)"
> >
<Document /> <Document />
</el-icon> </el-icon>
<span class="file-name">文件</span>
</div>
</div>
<span v-else class="no-attachment">无附件</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('operation')" fixed="right" min-width="120"> <el-table-column :label="t('operation')" fixed="right" min-width="120">
@ -81,9 +95,6 @@
</el-card> </el-card>
<el-dialog v-model="dialogVisible" width="60%">
<img :src="previewImageUrl" style="width: 100%" />
</el-dialog>
</div> </div>
</template> </template>
@ -96,7 +107,7 @@ import { img } from '@/utils/common'
import { ElMessageBox,FormInstance } from 'element-plus' import { ElMessageBox,FormInstance } from 'element-plus'
import Edit from '@/app/views/user_feedback/components/user-feedback-edit.vue' import Edit from '@/app/views/user_feedback/components/user-feedback-edit.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { Picture, Document } from '@element-plus/icons-vue' import { Picture, Document, ZoomIn } from '@element-plus/icons-vue'
const route = useRoute() const route = useRoute()
const pageName = route.meta.title; const pageName = route.meta.title;
@ -116,10 +127,6 @@ const searchFormRef = ref<FormInstance>()
// //
const selectData = ref<any[]>([]) const selectData = ref<any[]>([])
//
const dialogVisible = ref(false)
const previewImageUrl = ref('')
/** /**
* 判断是否是图片 * 判断是否是图片
*/ */
@ -127,19 +134,11 @@ const selectData = ref<any[]>([])
return /\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i.test(url) return /\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i.test(url)
} }
/**
* 弹出图片预览
*/
const handlePreview = (url: string) => {
previewImageUrl.value = `${import.meta.env.VITE_IMG_DOMAIN}/${url}`
dialogVisible.value = true
}
/** /**
* 跳转打开文件 * 跳转打开文件
*/ */
const openFile = (url: string) => { const openFile = (url: string) => {
window.open(`${import.meta.env.VITE_IMG_DOMAIN}/${url}`, '_blank') window.open(url, '_blank')
} }
/** /**
@ -224,4 +223,81 @@ const resetForm = (formEl: FormInstance | undefined) => {
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
} }
/* 附件预览样式 */
.attachment-preview {
display: flex;
align-items: center;
justify-content: center;
}
.image-preview-wrapper {
display: flex;
align-items: center;
justify-content: center;
}
.thumbnail-image {
width: 60px;
height: 60px;
border-radius: 4px;
cursor: pointer;
border: 1px solid #e4e7ed;
transition: all 0.3s;
&:hover {
transform: scale(1.05);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
}
.image-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 60px;
height: 60px;
background-color: #f5f7fa;
border-radius: 4px;
border: 1px solid #e4e7ed;
color: #909399;
font-size: 12px;
.el-icon {
font-size: 20px;
margin-bottom: 4px;
}
}
.file-preview {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
padding: 8px;
border-radius: 4px;
transition: background-color 0.3s;
&:hover {
background-color: #f5f7fa;
}
}
.file-icon {
font-size: 24px;
color: #409eff;
margin-bottom: 4px;
}
.file-name {
font-size: 12px;
color: #606266;
}
.no-attachment {
color: #c0c4cc;
font-size: 12px;
}
</style> </style>

88
admin/src/app/views/xsyj/xsyj.vue

@ -3,7 +3,10 @@
<el-card class="box-card !border-none" shadow="never" v-loading="loading"> <el-card class="box-card !border-none" shadow="never" v-loading="loading">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-lg">{{ pageName }}</span> <span class="text-lg">{{ pageName }}</span>
<el-button type="primary" @click="addStage"> 新增阶段</el-button> <el-text type="info" size="small">
<el-icon><InfoFilled /></el-icon>
阶段名称来自系统字典"sales_title"配置
</el-text>
</div> </div>
</el-card> </el-card>
@ -25,7 +28,7 @@
<el-form label-width="100px" style="margin-bottom: 10px"> <el-form label-width="100px" style="margin-bottom: 10px">
<el-form-item label="阶段名称"> <el-form-item label="阶段名称">
<el-input v-model="stage.name" placeholder="请输入阶段名称"/> <el-input v-model="stage.name" placeholder="阶段名称" readonly/>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -118,9 +121,6 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-button type="danger" size="small" style="margin-top: 10px"
@click="removeStage(index)">删除该阶段
</el-button>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -192,10 +192,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import {xsyjConfig, getXsyjConfig} from '@/app/api/sys' import {xsyjConfig, getXsyjConfig} from '@/app/api/sys'
import {reactive, ref} from 'vue' import {useDictionary} from '@/app/api/dict'
import {reactive, ref, onMounted} from 'vue'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import {InfoFilled} from '@element-plus/icons-vue'
import {useRoute} from 'vue-router' import {useRoute} from 'vue-router'
import Template from "@/addon/shop/views/delivery/template.vue";
const route = useRoute() const route = useRoute()
const pageName = route.meta.title const pageName = route.meta.title
@ -203,6 +204,7 @@ const pageName = route.meta.title
const loading = ref(true) const loading = ref(true)
const stages = ref([]) const stages = ref([])
const activeNames = ref(null) const activeNames = ref(null)
const salesTitleList = ref([])
const form = ref({ const form = ref({
@ -214,10 +216,44 @@ const form = ref({
const course_type = ref({}); const course_type = ref({});
//
const getSalesTitleList = async () => {
try {
const res = await useDictionary('sales_title')
salesTitleList.value = res.data?.dictionary || []
} catch (error) {
console.error('获取销售职称失败:', error)
salesTitleList.value = []
}
}
function addStage() { //
const newStage = { const initStagesFromDict = () => {
name: '默认阶段', if (salesTitleList.value.length === 0) return
//
const newStages = []
salesTitleList.value.forEach(title => {
//
const existingStage = stages.value.find(stage =>
stage.title_key === title.value || stage.name === title.name
)
if (existingStage) {
//
newStages.push({
...existingStage,
id: title.value,
title_key: title.value,
name: title.name,
})
} else {
//
newStages.push({
id: title.value,
title_key: title.value,
name: title.name,
price: 0, price: 0,
rules: [ rules: [
{ {
@ -232,15 +268,15 @@ function addStage() {
new_move_7: '', new_move_7: '',
}, },
], ],
})
} }
stages.value.push(newStage) })
activeNames.value = newStage.name
}
function removeStage(index) { stages.value = newStages
stages.value.splice(index, 1)
} }
//
function addRule(stage) { function addRule(stage) {
stage.rules.push({ stage.rules.push({
renewal_standard_min: '0', renewal_standard_min: '0',
@ -264,14 +300,30 @@ function removeRule(stage, ruleIndex) {
} }
const setFormData = async () => { const setFormData = async () => {
try {
//
await getSalesTitleList()
//
const data = await (await getXsyjConfig()).data const data = await (await getXsyjConfig()).data
stages.value = data.data stages.value = data.data || []
form.value = data.form form.value = data.form || {}
course_type.value = data.course_type course_type.value = data.course_type || {}
//
initStagesFromDict()
loading.value = false loading.value = false
} catch (error) {
console.error('获取配置数据失败:', error)
loading.value = false
}
} }
//
onMounted(() => {
setFormData() setFormData()
})
const onSave = async () => { const onSave = async () => {
xsyjConfig({'stages': stages.value, 'form': form.value, 'course_type': course_type.value}) xsyjConfig({'stages': stages.value, 'form': form.value, 'course_type': course_type.value})

223
admin/src/components/direct-upload/index.vue

@ -0,0 +1,223 @@
<template>
<div class="direct-upload-wrapper">
<el-upload
ref="uploadRef"
:action="''"
:auto-upload="false"
:show-file-list="false"
:accept="accept"
:before-upload="beforeUpload"
:on-change="handleFileChange"
v-bind="$attrs"
>
<slot>
<el-button type="primary" :loading="uploading">
{{ uploading ? `上传中 ${uploadProgress}%` : '选择文件' }}
</el-button>
</slot>
</el-upload>
</div>
</template>
<script lang="ts" setup>
import { ref, computed } from 'vue'
import { ElMessage } from 'element-plus'
import type { UploadFile, UploadProps } from 'element-plus'
import { uploadFile, isDirectUploadSupported } from '@/utils/directUpload'
import { getToken } from '@/utils/common'
interface Props {
fileType: 'image' | 'video' | 'document'
maxSize?: number // MB
accept?: string
fallbackUrl?: string // URL
}
const props = withDefaults(defineProps<Props>(), {
fileType: 'image',
maxSize: 10,
accept: '*/*'
})
const emit = defineEmits<{
success: [url: string, file: UploadFile]
error: [error: string]
progress: [percent: number]
}>()
const uploading = ref(false)
const uploadProgress = ref(0)
const uploadRef = ref()
// accept
const acceptMap = {
image: 'image/*',
video: 'video/*',
document: '.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx'
}
const computedAccept = computed(() => {
return props.accept !== '*/*' ? props.accept : acceptMap[props.fileType]
})
/**
* 上传前验证
*/
const beforeUpload: UploadProps['beforeUpload'] = (file) => {
//
let isValidType = false
let errorMsg = ''
switch (props.fileType) {
case 'image':
isValidType = file.type.startsWith('image/')
errorMsg = '请选择图片文件'
break
case 'video':
isValidType = file.type.startsWith('video/')
errorMsg = '请选择视频文件'
break
case 'document':
isValidType = [
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
].includes(file.type)
errorMsg = '请选择有效的文档文件'
break
}
if (!isValidType) {
ElMessage.error(errorMsg)
return false
}
//
const maxSizeBytes = props.maxSize * 1024 * 1024
if (file.size > maxSizeBytes) {
ElMessage.error(`文件大小不能超过 ${props.maxSize}MB`)
return false
}
return true
}
/**
* 文件选择改变时触发
*/
const handleFileChange = async (uploadFile: UploadFile) => {
if (!uploadFile.raw) return
uploading.value = true
uploadProgress.value = 0
try {
//
const supportDirectUpload = await isDirectUploadSupported()
if (supportDirectUpload) {
// 使
await handleDirectUpload(uploadFile.raw, uploadFile)
} else {
//
await handleFallbackUpload(uploadFile.raw, uploadFile)
}
} catch (error) {
const errorMsg = error instanceof Error ? error.message : '上传失败'
ElMessage.error(errorMsg)
emit('error', errorMsg)
} finally {
uploading.value = false
uploadProgress.value = 0
}
}
/**
* 直传上传
*/
const handleDirectUpload = async (file: File, uploadFile: UploadFile) => {
const result = await uploadFile({
file,
fileType: props.fileType,
onProgress: (percent) => {
uploadProgress.value = percent
emit('progress', percent)
}
})
if (result.success) {
ElMessage.success('上传成功')
emit('success', result.url, uploadFile)
} else {
throw new Error(result.error || '上传失败')
}
}
/**
* 后备上传传统方式
*/
const handleFallbackUpload = async (file: File, uploadFile: UploadFile) => {
if (!props.fallbackUrl) {
throw new Error('直传不可用且未配置后备上传接口')
}
return new Promise<void>((resolve, reject) => {
const formData = new FormData()
formData.append('file', file)
const xhr = new XMLHttpRequest()
//
xhr.upload.addEventListener('progress', (event) => {
if (event.lengthComputable) {
const percent = Math.round((event.loaded / event.total) * 100)
uploadProgress.value = percent
emit('progress', percent)
}
})
//
xhr.addEventListener('load', () => {
try {
const response = JSON.parse(xhr.responseText)
if (response.code === 1) {
ElMessage.success('上传成功')
emit('success', response.data.url, uploadFile)
resolve()
} else {
reject(new Error(response.msg || '上传失败'))
}
} catch (error) {
reject(new Error('响应解析失败'))
}
})
//
xhr.addEventListener('error', () => {
reject(new Error('网络错误,上传失败'))
})
//
xhr.open('POST', props.fallbackUrl, true)
xhr.setRequestHeader('token', getToken() || '')
xhr.send(formData)
})
}
//
defineExpose({
clearFiles: () => {
uploadRef.value?.clearFiles()
}
})
</script>
<style lang="scss" scoped>
.direct-upload-wrapper {
display: inline-block;
}
</style>

255
admin/src/utils/directUpload.ts

@ -0,0 +1,255 @@
/**
*
* COS和阿里云OSS
*/
import { getToken } from '@/utils/common'
import { ElMessage } from 'element-plus'
export interface UploadCredentials {
storage_type: 'tencent' | 'aliyun'
upload_url: string
credentials: any
file_path: string
domain: string
max_size: number
expired: number
}
export interface UploadResult {
success: boolean
url: string
error?: string
}
export interface UploadOptions {
file: File
fileType: 'image' | 'video' | 'document'
onProgress?: (percent: number) => void
onSuccess?: (result: UploadResult) => void
onError?: (error: string) => void
}
/**
*
*/
export class DirectUpload {
private baseUrl: string
constructor() {
this.baseUrl = import.meta.env.VITE_IMG_DOMAIN || 'http://localhost:20080'
}
/**
*
*/
private async getUploadCredentials(fileType: string, fileName?: string): Promise<UploadCredentials> {
const params = new URLSearchParams({
file_type: fileType
})
if (fileName) {
params.append('file_name', fileName)
}
const response = await fetch(`${this.baseUrl}/adminapi/sys/direct/credentials?${params}`, {
method: 'GET',
headers: {
'token': getToken() || '',
'Content-Type': 'application/json'
}
})
const result = await response.json()
if (result.code !== 1) {
throw new Error(result.msg || '获取上传凭证失败')
}
return result.data
}
/**
*
*/
async upload(options: UploadOptions): Promise<UploadResult> {
const { file, fileType, onProgress, onSuccess, onError } = options
try {
// 1. 获取上传凭证
const credentials = await this.getUploadCredentials(fileType, file.name)
// 2. 验证文件大小
if (credentials.max_size > 0 && file.size > credentials.max_size) {
const maxSizeMB = Math.round(credentials.max_size / 1024 / 1024)
throw new Error(`文件大小不能超过 ${maxSizeMB}MB`)
}
// 3. 根据存储类型执行上传
let uploadResult: UploadResult
if (credentials.storage_type === 'tencent') {
uploadResult = await this.uploadToTencent(file, credentials, onProgress)
} else if (credentials.storage_type === 'aliyun') {
uploadResult = await this.uploadToAliyun(file, credentials, onProgress)
} else {
throw new Error('不支持的存储类型')
}
// 4. 上传成功回调
if (uploadResult.success && onSuccess) {
onSuccess(uploadResult)
}
return uploadResult
} catch (error) {
const errorMsg = error instanceof Error ? error.message : '上传失败'
if (onError) {
onError(errorMsg)
}
return {
success: false,
url: '',
error: errorMsg
}
}
}
/**
* COS直传
*/
private async uploadToTencent(
file: File,
credentials: UploadCredentials,
onProgress?: (percent: number) => void
): Promise<UploadResult> {
return new Promise((resolve, reject) => {
const formData = new FormData()
// 生成文件路径(替换模板中的${filename})
const filePath = credentials.file_path.replace('${filename}', file.name)
// 添加腾讯云COS必需的字段
formData.append('key', filePath)
formData.append('policy', credentials.credentials.policy)
formData.append('q-sign-algorithm', credentials.credentials['q-sign-algorithm'])
formData.append('q-ak', credentials.credentials['q-ak'])
formData.append('q-key-time', credentials.credentials['q-key-time'])
formData.append('q-signature', credentials.credentials['q-signature'])
formData.append('file', file)
const xhr = new XMLHttpRequest()
// 上传进度
if (onProgress) {
xhr.upload.addEventListener('progress', (event) => {
if (event.lengthComputable) {
const percent = Math.round((event.loaded / event.total) * 100)
onProgress(percent)
}
})
}
// 上传完成
xhr.addEventListener('load', () => {
if (xhr.status === 204 || xhr.status === 200) {
const fileUrl = `${credentials.domain}/${filePath}`
resolve({
success: true,
url: fileUrl
})
} else {
reject(new Error('上传失败,请重试'))
}
})
// 上传错误
xhr.addEventListener('error', () => {
reject(new Error('网络错误,上传失败'))
})
// 执行上传
xhr.open('POST', credentials.upload_url, true)
xhr.send(formData)
})
}
/**
* OSS直传
*/
private async uploadToAliyun(
file: File,
credentials: UploadCredentials,
onProgress?: (percent: number) => void
): Promise<UploadResult> {
return new Promise((resolve, reject) => {
const formData = new FormData()
// 生成文件路径(替换模板中的${filename})
const filePath = credentials.file_path.replace('${filename}', file.name)
// 添加阿里云OSS必需的字段
formData.append('OSSAccessKeyId', credentials.credentials.OSSAccessKeyId)
formData.append('policy', credentials.credentials.policy)
formData.append('signature', credentials.credentials.signature)
formData.append('key', filePath)
formData.append('success_action_status', credentials.credentials.success_action_status)
formData.append('file', file)
const xhr = new XMLHttpRequest()
// 上传进度
if (onProgress) {
xhr.upload.addEventListener('progress', (event) => {
if (event.lengthComputable) {
const percent = Math.round((event.loaded / event.total) * 100)
onProgress(percent)
}
})
}
// 上传完成
xhr.addEventListener('load', () => {
if (xhr.status === 200) {
const fileUrl = `${credentials.domain}/${filePath}`
resolve({
success: true,
url: fileUrl
})
} else {
reject(new Error('上传失败,请重试'))
}
})
// 上传错误
xhr.addEventListener('error', () => {
reject(new Error('网络错误,上传失败'))
})
// 执行上传
xhr.open('POST', credentials.upload_url, true)
xhr.send(formData)
})
}
}
// 导出单例实例
export const directUpload = new DirectUpload()
/**
* 便
*/
export async function uploadFile(options: UploadOptions): Promise<UploadResult> {
return directUpload.upload(options)
}
/**
*
*/
export async function isDirectUploadSupported(): Promise<boolean> {
try {
const directUploadInstance = new DirectUpload()
await directUploadInstance.getUploadCredentials('image')
return true
} catch (error) {
console.warn('Direct upload not supported:', error)
return false
}
}

5
admin/vite.config.ts

@ -17,7 +17,10 @@ export default defineConfig({
resolvers: [ElementPlusResolver()] resolvers: [ElementPlusResolver()]
}), }),
Components({ Components({
resolvers: [ElementPlusResolver()] resolvers: [ElementPlusResolver()],
dirs: ['src/components'],
deep: true,
dts: true
}) })
], ],
resolve: { resolve: {

29
niucloud/app/adminapi/controller/document/DocumentTemplate.php

@ -254,6 +254,35 @@ class DocumentTemplate extends BaseAdminController
} }
} }
/**
* 编辑模板
* @param int $id
* @return \think\Response
*/
public function update(int $id)
{
$data = $this->request->params([
['contract_name', ''],
['contract_type', ''],
['remarks', '']
]);
if (empty($data['contract_name'])) {
return fail('模板名称不能为空');
}
if (empty($data['contract_type'])) {
return fail('合同类型不能为空');
}
try {
(new DocumentTemplateService())->update($id, $data);
return success('编辑成功');
} catch (\Exception $e) {
return fail($e->getMessage());
}
}
/** /**
* 更新模板状态 * 更新模板状态
* @param int $id * @param int $id

6
niucloud/app/adminapi/controller/sys/Ueditor.php

@ -36,7 +36,7 @@ class Ueditor extends BaseAdminController
// 插入的图片浮动方式,默认值:none // 插入的图片浮动方式,默认值:none
"imageInsertAlign" => "none", "imageInsertAlign" => "none",
// 图片访问路径前缀,默认值:空 // 图片访问路径前缀,默认值:空
"imageUrlPrefix" => url('/', domain: true)->buildUrl(), "imageUrlPrefix" => request()->domain(),
// 执行上传涂鸦的action名称,默认值:uploadscrawl // 执行上传涂鸦的action名称,默认值:uploadscrawl
"scrawlActionName" => "crawl", "scrawlActionName" => "crawl",
// 提交的图片表单名称,默认值:upfile // 提交的图片表单名称,默认值:upfile
@ -70,7 +70,7 @@ class Ueditor extends BaseAdminController
// 提交的视频表单名称,默认值:upfile // 提交的视频表单名称,默认值:upfile
"videoFieldName" => "file", "videoFieldName" => "file",
// 视频访问路径前缀 // 视频访问路径前缀
"videoUrlPrefix" => url('/', domain: true)->buildUrl(), "videoUrlPrefix" => request()->domain(),
// 上传大小限制,单位B,默认值:102400000 // 上传大小限制,单位B,默认值:102400000
"videoMaxSize" => 104857600, "videoMaxSize" => 104857600,
// 上传视频格式显示 // 上传视频格式显示
@ -106,7 +106,7 @@ class Ueditor extends BaseAdminController
// 公式配置 // 公式配置
"formulaConfig" => [ "formulaConfig" => [
// 公式渲染的路径 // 公式渲染的路径
"imageUrlTemplate" => url('/', domain: true)->buildUrl() . "{}" "imageUrlTemplate" => request()->domain() . "{}"
] ]
], 'json', 200); ], 'json', 200);
} }

59
niucloud/app/adminapi/controller/upload/DirectUpload.php

@ -0,0 +1,59 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\adminapi\controller\upload;
use app\service\admin\upload\DirectUploadService;
use core\base\BaseAdminController;
use think\Response;
/**
* 对象存储直传控制器
*/
class DirectUpload extends BaseAdminController
{
/**
* 获取对象存储直传临时凭证
* @return Response
*/
public function getUploadCredentials()
{
$data = $this->request->params([
['file_type', 'image'], // 文件类型:image、video、document
['file_name', ''], // 文件名(可选)
]);
$service = new DirectUploadService();
$result = $service->getUploadCredentials($data['file_type'], $data['file_name']);
return success($result);
}
/**
* 确认文件上传完成,将文件信息保存到数据库
* @return Response
*/
public function confirmUpload()
{
$data = $this->request->params([
['file_url', ''], // 文件URL
['file_name', ''], // 文件名
['file_size', 0], // 文件大小
['file_type', 'image'], // 文件类型
['storage_type', 'tencent'], // 存储类型
]);
$service = new DirectUploadService();
$result = $service->confirmUpload($data);
return success($result);
}
}

1
niucloud/app/adminapi/route/document_template.php

@ -21,6 +21,7 @@ Route::group('document_template', function () {
// 模板管理 // 模板管理
Route::get('lists', 'document.DocumentTemplate/lists'); Route::get('lists', 'document.DocumentTemplate/lists');
Route::get('info/:id', 'document.DocumentTemplate/info'); Route::get('info/:id', 'document.DocumentTemplate/info');
Route::put('update/:id', 'document.DocumentTemplate/update');
Route::post('update_status/:id', 'document.DocumentTemplate/updateStatus'); Route::post('update_status/:id', 'document.DocumentTemplate/updateStatus');
Route::delete('delete/:id', 'document.DocumentTemplate/delete'); Route::delete('delete/:id', 'document.DocumentTemplate/delete');
Route::post('copy/:id', 'document.DocumentTemplate/copy'); Route::post('copy/:id', 'document.DocumentTemplate/copy');

7
niucloud/app/adminapi/route/sys.php

@ -326,9 +326,14 @@ Route::group('sys', function() {
//附件上传 //附件上传
Route::post('document/:type', 'upload.Upload/document'); Route::post('document/:type', 'upload.Upload/document');
Route::post('document_lead/:type', 'upload.Upload/document_lead'); Route::post('document_lead/:type', 'upload.Upload/document_lead');
/***************************************************** 对象存储直传 ****************************************************/
//获取直传凭证
Route::get('direct/credentials', 'upload.DirectUpload/getUploadCredentials');
//确认上传完成
Route::post('direct/confirm', 'upload.DirectUpload/confirmUpload');
//附件列表 //附件列表
Route::get('attachment', 'sys.Attachment/lists'); Route::get('attachment', 'sys.Attachment/lists');
//附件列表 //附件列表

2
niucloud/app/service/admin/course/CourseService.php

@ -47,7 +47,7 @@ class CourseService extends BaseAdminService
public function contract_all(){ public function contract_all(){
$contract = new Contract(); $contract = new Contract();
$list = $contract->where(['contract_type' => '外部','contract_status' => '可用'])->select()->toArray(); $list = $contract->where(['contract_type' => '外部','contract_status' => 'active'])->select()->toArray();
return $list; return $list;
} }

30
niucloud/app/service/admin/document/DocumentTemplateService.php

@ -945,6 +945,36 @@ class DocumentTemplateService extends BaseAdminService
return $this->logModel->whereIn('id', $ids)->delete(); return $this->logModel->whereIn('id', $ids)->delete();
} }
/**
* 编辑模板
* @param int $id
* @param array $data
* @return bool
* @throws \Exception
*/
public function update(int $id, array $data)
{
$template = $this->contractModel->find($id);
if (!$template) {
throw new \Exception('模板不存在');
}
// 更新基本信息
if (isset($data['contract_name'])) {
$template->contract_name = $data['contract_name'];
}
if (isset($data['contract_type'])) {
$template->contract_type = $data['contract_type'];
}
if (isset($data['remarks'])) {
$template->remarks = $data['remarks'];
}
$template->updated_at = date('Y-m-d H:i:s');
return $template->save();
}
/** /**
* 更新模板状态 * 更新模板状态
* @param int $id * @param int $id

237
niucloud/app/service/admin/upload/DirectUploadService.php

@ -0,0 +1,237 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\upload;
use app\service\core\sys\CoreConfigService;
use core\base\BaseAdminService;
use core\exception\AdminException;
/**
* 对象存储直传服务类
*/
class DirectUploadService extends BaseAdminService
{
/**
* 获取上传凭证
* @param string $file_type 文件类型
* @param string $file_name 文件名
* @return array
*/
public function getUploadCredentials($file_type = 'image', $file_name = '')
{
// 获取存储配置
$config_data = (new CoreConfigService())->getConfig('STORAGE');
if (empty($config_data) || empty($config_data['value'])) {
throw new AdminException('存储配置未设置');
}
$storage_config = $config_data['value'];
if (is_string($storage_config)) {
$storage_config = json_decode($storage_config, true);
}
if (empty($storage_config)) {
throw new AdminException('存储配置格式错误');
}
$default_storage = $storage_config['default'] ?? 'local';
if ($default_storage == 'local') {
throw new AdminException('本地存储不支持直传');
}
if (!isset($storage_config[$default_storage])) {
throw new AdminException('存储配置错误');
}
$config = $storage_config[$default_storage];
// 生成文件路径
$file_path = $this->generateFilePath($file_type, $file_name);
// 根据不同存储类型获取凭证
switch ($default_storage) {
case 'tencent':
return $this->getTencentCredentials($config, $file_path, $file_type);
case 'aliyun':
return $this->getAliyunCredentials($config, $file_path, $file_type);
default:
throw new AdminException('不支持的存储类型');
}
}
/**
* 获取腾讯云COS直传凭证
* @param array $config 配置信息
* @param string $file_path 文件路径
* @param string $file_type 文件类型
* @return array
*/
private function getTencentCredentials($config, $file_path, $file_type)
{
// 检查必要的配置
$required_keys = ['bucket', 'region', 'access_key', 'secret_key'];
foreach ($required_keys as $key) {
if (empty($config[$key])) {
throw new AdminException("腾讯云配置缺少必要参数: {$key}");
}
}
// 生成策略
$expired = time() + 3600; // 1小时过期
$policy = [
'expiration' => gmdate('Y-m-d\TH:i:s.000\Z', $expired),
'conditions' => [
['bucket' => $config['bucket']],
['starts-with' => '$key', $file_path]
]
];
// 根据文件类型设置大小限制
$max_size = $this->getMaxFileSize($file_type);
if ($max_size > 0) {
$policy['conditions'][] = ['content-length-range', 0, $max_size];
}
$policy_encoded = base64_encode(json_encode($policy));
$signature = hash_hmac('sha1', $policy_encoded, $config['secret_key'], true);
$signature_encoded = base64_encode($signature);
return [
'storage_type' => 'tencent',
'upload_url' => "https://{$config['bucket']}.cos.{$config['region']}.myqcloud.com",
'credentials' => [
'policy' => $policy_encoded,
'q-sign-algorithm' => 'sha1',
'q-ak' => $config['access_key'],
'q-key-time' => time() . ';' . $expired,
'q-signature' => $signature_encoded,
],
'file_path' => $file_path,
'domain' => $config['domain'] ?? "https://{$config['bucket']}.cos.{$config['region']}.myqcloud.com",
'max_size' => $max_size,
'expired' => $expired
];
}
/**
* 获取阿里云OSS直传凭证
* @param array $config 配置信息
* @param string $file_path 文件路径
* @param string $file_type 文件类型
* @return array
*/
private function getAliyunCredentials($config, $file_path, $file_type)
{
// 检查必要的配置
$required_keys = ['bucket', 'endpoint', 'access_key', 'secret_key'];
foreach ($required_keys as $key) {
if (empty($config[$key])) {
throw new AdminException("阿里云配置缺少必要参数: {$key}");
}
}
$expired = time() + 3600; // 1小时过期
$dir = dirname($file_path) . '/';
// 生成策略
$policy = [
'expiration' => gmdate('Y-m-d\TH:i:s.000\Z', $expired),
'conditions' => [
['starts-with' => '$key', $dir],
]
];
// 根据文件类型设置大小限制
$max_size = $this->getMaxFileSize($file_type);
if ($max_size > 0) {
$policy['conditions'][] = ['content-length-range', 0, $max_size];
}
$policy_encoded = base64_encode(json_encode($policy));
$signature = base64_encode(hash_hmac('sha1', $policy_encoded, $config['secret_key'], true));
return [
'storage_type' => 'aliyun',
'upload_url' => "https://{$config['bucket']}.{$config['endpoint']}",
'credentials' => [
'OSSAccessKeyId' => $config['access_key'],
'policy' => $policy_encoded,
'signature' => $signature,
'key' => $file_path,
'success_action_status' => '200',
],
'file_path' => $file_path,
'domain' => $config['domain'] ?? "https://{$config['bucket']}.{$config['endpoint']}",
'max_size' => $max_size,
'expired' => $expired
];
}
/**
* 生成文件路径
* @param string $file_type 文件类型
* @param string $file_name 文件名
* @return string
*/
private function generateFilePath($file_type, $file_name = '')
{
$type_dir_map = [
'image' => 'upload/attachment/image',
'video' => 'upload/attachment/video',
'document' => 'upload/attachment/document'
];
$dir = $type_dir_map[$file_type] ?? 'upload/attachment/file';
$date_dir = date('Y/m/d');
if (empty($file_name)) {
$file_name = uniqid() . '_${filename}'; // ${filename} 将被前端替换
}
return $dir . '/' . $date_dir . '/' . $file_name;
}
/**
* 根据文件类型获取最大文件大小
* @param string $file_type 文件类型
* @return int 字节数,0表示不限制
*/
private function getMaxFileSize($file_type)
{
$size_map = [
'image' => 10 * 1024 * 1024, // 10MB
'video' => 500 * 1024 * 1024, // 500MB
'document' => 50 * 1024 * 1024, // 50MB
];
return $size_map[$file_type] ?? 10 * 1024 * 1024;
}
/**
* 确认上传完成
* @param array $data 文件信息
* @return array
*/
public function confirmUpload($data)
{
// 这里可以将文件信息保存到附件表,供后续管理使用
// 暂时直接返回文件URL,实际项目中可以根据需要保存到数据库
return [
'url' => $data['file_url'],
'name' => $data['file_name'],
'size' => $data['file_size'],
'type' => $data['file_type'],
'storage_type' => $data['storage_type']
];
}
}

72
niucloud/databasedoc/README.md

@ -0,0 +1,72 @@
# 智慧教务系统数据库文档
## 概述
本目录包含智慧教务系统所有数据表的功能用途文档,共计 **122个** 数据表的详细说明文档。
## 文档结构
每个数据表文档包含以下内容:
- **表概述**: 表名和功能描述
- **字段说明**: 详细的字段信息,包括类型、约束、注释等
- **功能用途**: 主要功能和业务场景说明
- **关联关系**: 与其他表的直接和间接关联关系
- **索引建议**: 基于字段特点的索引优化建议
- **注意事项**: 重要的使用注意事项和最佳实践
## 核心业务表
### 基础数据表
- `school_campus.md` - 校区信息管理表
- `school_sys_user.md` - 系统用户管理表
- `school_sys_role.md` - 角色权限管理表
- `school_sys_menu.md` - 菜单权限管理表
### 学员管理表
- `school_student.md` - 学员信息管理表
- `school_class.md` - 班级管理表
- `school_class_personnel_rel.md` - 班级人员关系表
### 课程管理表
- `school_course.md` - 课程信息管理表
- `school_schedule.md` - 课程安排表
- `school_attendance.md` - 考勤记录表
### 财务管理表
- `school_fee.md` - 费用管理表
- `school_account_log.md` - 账单日志表
- `school_campus_pay.md` - 校区支付配置表
### 系统管理表
- `school_addon.md` - 插件管理表
- `school_sys_config.md` - 系统配置表
- `school_sys_cron_task.md` - 定时任务表
## 文档使用说明
### 开发人员
1. 在进行数据库设计时,参考相关表的字段说明和关联关系
2. 根据索引建议优化数据库查询性能
3. 遵循注意事项中的最佳实践
### 运维人员
1. 了解表的功能用途,合理规划数据备份策略
2. 根据关联关系分析数据依赖,避免误删重要数据
3. 参考索引建议进行数据库性能优化
### 产品经理
1. 通过功能用途和业务场景了解系统数据结构
2. 基于表关联关系理解业务流程
3. 为新功能设计提供数据支撑
## 文档维护
- 文档生成时间: 2025年12月
- 数据库版本: MySQL 8.0
- 文档状态: 已完成所有表的详细说明
- 更新频率: 随数据库结构变更同步更新
## 注意事项
1. 所有文档基于当前数据库结构生成,如有结构变更需要同步更新文档
2. 关联关系分析基于字段命名和业务逻辑推断,实际使用时请结合具体业务场景
3. 索引建议仅供参考,实际创建时需要结合具体的查询场景和数据量
4. 涉及个人隐私的表(如学员信息)需要严格遵循数据保护法规
## 联系方式
如有文档相关问题或建议,请联系系统开发团队。

95
niucloud/databasedoc/role_menu_permissions.md

@ -0,0 +1,95 @@
# role_menu_permissions 表文档
## 表概述
**表名**: role_menu_permissions
**功能**: 角色菜单权限关联表,用于管理系统中角色与菜单之间的权限关联关系,实现基于角色的访问控制(RBAC),支持细粒度的菜单权限管理和动态权限分配,为系统安全和权限控制提供核心数据支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
role_id int NULL NO MUL NULL select,insert,update,references 角色ID
menu_id int NULL NO MUL NULL select,insert,update,references 菜单ID
is_enabled tinyint(1) NULL YES 1 select,insert,update,references 是否启用
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references
```
## 功能用途
### 主要功能
- **角色菜单权限关联**: 建立角色与菜单之间的权限关联关系
- **权限控制**: 控制不同角色对系统菜单的访问权限
- **权限启用管理**: 通过is_enabled字段控制权限的启用和禁用
- **细粒度权限**: 实现菜单级别的精细化权限控制
- **权限继承**: 支持角色权限的继承和覆盖机制
- **动态权限**: 支持运行时动态调整角色菜单权限
- **权限审计**: 记录权限分配的时间和变更历史
- **批量权限**: 支持批量分配和回收角色权限
- **权限模板**: 为角色权限分配提供模板支持
### 业务场景
- **权限分配**: 为新创建的角色分配菜单访问权限
- **权限调整**: 根据业务需要调整角色的菜单权限
- **权限回收**: 回收离职人员或角色变更的菜单权限
- **权限审核**: 定期审核和清理不必要的权限分配
- **功能上线**: 新功能菜单上线时的权限分配
- **权限继承**: 角色层级变化时的权限继承处理
- **临时权限**: 临时授予特定角色某些菜单权限
- **权限模板**: 基于角色模板快速分配权限
- **合规检查**: 满足权限管理的合规性要求
## 关联关系
### 主要关联表
- `school_sys_role`: 系统角色表 (role_id外键关联)
- `school_sys_menu`: 系统菜单表 (menu_id外键关联)
- `school_personnel`: 人员信息表 (通过角色关联用户)
- `sys_log`: 系统日志表 (权限变更日志)
- `school_sys_config`: 系统配置表 (权限相关配置)
- `school_campus`: 校区信息表 (数据权限范围)
### 关联说明
- **角色关联**: role_id关联school_sys_role表,确定权限归属角色
- **菜单关联**: menu_id关联school_sys_menu表,确定可访问的菜单
- **用户关联**: 通过角色间接关联用户,实现用户菜单权限控制
- **日志关联**: 权限变更操作记录到系统日志中
- **配置关联**: 权限相关的系统配置参数
- **数据权限**: 结合校区等信息实现数据级权限控制
- **层级关联**: 支持菜单层级权限的继承和控制
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- role_id (角色权限查询)
- menu_id (菜单权限查询)
- **业务索引**:
- is_enabled (启用状态查询)
- **复合索引**:
- (role_id, menu_id) (角色菜单权限唯一性)
- (role_id, is_enabled) (角色启用权限查询)
- (menu_id, is_enabled) (菜单启用权限查询)
- (role_id, menu_id, is_enabled) (完整权限查询)
- **时间索引**:
- created_at (创建时间查询)
- updated_at (更新时间查询)
## 注意事项
- **权限唯一性**: (role_id, menu_id)组合应保证唯一性,避免重复权限记录
- **外键完整性**: role_id和menu_id必须在对应的表中存在
- **权限一致性**: 权限变更时需要同步更新相关缓存和会话
- **启用状态**: is_enabled字段变更需要实时生效到用户权限
- **权限继承**: 角色层级变化时需要重新计算权限继承关系
- **批量操作**: 批量权限分配时需要保证事务一致性
- **权限验证**: 菜单访问时需要验证对应的权限记录
- **软删除**: 建议使用软删除而非物理删除权限记录
- **权限缓存**: 频繁访问的权限信息建议使用缓存机制
- **审计日志**: 权限变更操作需要记录详细的审计日志
- **默认权限**: 新角色创建时需要分配默认的基础权限
- **权限回收**: 角色删除时需要同步清理相关权限记录
- **数据完整性**: 删除角色或菜单时需要检查权限依赖关系
- **权限模板**: 建议建立权限模板机制简化权限分配
- **最小权限**: 遵循最小权限原则,只分配必要的菜单权限
- **权限监控**: 建立权限使用监控,及时发现异常权限访问
- **时效性**: 权限变更需要及时生效,避免权限延迟

97
niucloud/databasedoc/school_account_log.md

@ -0,0 +1,97 @@
# school_account_log 表文档
## 表概述
**表名**: school_account_log
**功能**: 账户日志管理表,负责记录教务系统中的各种账户交易日志,包括支付、退款、转账等财务操作的详细记录
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
type varchar(255) utf8mb4_general_ci NO pay select,insert,update,references 账单类型pay,refund,transfer
money decimal(10,2) NULL NO 0.00 select,insert,update,references 交易金额
trade_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 对应类型交易单号
create_time varchar(255) utf8mb4_general_ci NO 0 select,insert,update,references 添加时间
```
## 功能用途
### 主要功能
- **交易日志记录**: 记录所有账户相关的交易操作日志
- **交易类型管理**: 区分支付、退款、转账等不同类型的交易
- **金额追踪**: 记录每笔交易的具体金额信息
- **交易单号关联**: 通过交易单号关联具体的业务订单
- **时间记录**: 记录交易发生的准确时间
- **审计追踪**: 提供完整的财务操作审计轨迹
- **数据统计**: 支持各种财务数据的统计和分析
- **异常监控**: 监控异常交易和可疑操作
- **对账支持**: 为财务对账提供详细数据支持
### 业务场景
- **支付记录**: 记录学员缴费、课程购买等支付操作
- **退款处理**: 记录退课、退费等退款操作
- **转账管理**: 记录账户间的资金转移操作
- **财务对账**: 与第三方支付平台进行对账
- **审计检查**: 财务审计时提供详细的交易记录
- **异常排查**: 排查账户异常和交易问题
- **报表生成**: 生成各种财务报表和统计数据
- **风控监控**: 监控可疑交易和风险操作
- **数据分析**: 分析收入趋势和交易模式
## 关联关系
### 主要关联表
- `school_pay`: 支付表 (支付交易关联)
- `school_order_table`: 订单表 (订单交易关联)
- `school_contract`: 合同表 (合同交易关联)
- `school_member`: 会员表 (会员交易关联)
- `school_refund`: 退款表 (退款交易关联)
- `school_transfer`: 转账表 (转账交易关联)
- `school_personnel`: 人员表 (操作人员关联)
- `school_campus`: 校区表 (校区财务关联)
### 关联说明
- **支付关联**: trade_no关联支付表的支付单号,记录支付日志
- **订单关联**: 通过交易单号关联订单,追踪订单支付状态
- **合同关联**: 记录合同相关的收款和退款操作
- **会员关联**: 记录会员的充值、消费、退款等操作
- **退款关联**: trade_no关联退款单号,记录退款日志
- **转账关联**: 记录账户间的转账操作日志
- **人员关联**: 记录操作人员,便于责任追踪
- **校区关联**: 区分不同校区的财务操作
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**:
- trade_no (交易单号唯一)
- **业务索引**:
- type (交易类型查询)
- money (金额查询)
- create_time (时间查询)
- **复合索引**:
- (type, create_time) (类型时间查询)
- (trade_no, type) (交易单号类型查询)
- (create_time, type) (时间类型排序查询)
- **范围索引**:
- money (金额范围查询)
- create_time (时间范围查询)
## 注意事项
- **交易单号唯一性**: trade_no必须唯一,避免重复记录
- **金额精度**: money字段使用decimal(10,2)确保金额精度
- **交易类型**: type字段需要严格控制枚举值(pay、refund、transfer)
- **时间格式**: create_time字段格式需要统一和规范
- **数据完整性**: 所有字段都不能为空,确保日志完整性
- **只增不删**: 日志数据原则上只能新增,不能修改或删除
- **实时记录**: 交易发生时必须立即记录日志
- **异常处理**: 记录日志失败时需要有补偿机制
- **数据备份**: 财务日志数据需要定期备份
- **访问控制**: 日志数据需要严格的访问权限控制
- **审计要求**: 满足财务审计的相关要求
- **性能优化**: 大量日志数据需要考虑查询性能
- **数据归档**: 历史日志数据需要定期归档
- **监控告警**: 异常交易需要及时告警
- **对账机制**: 支持与外部系统的对账功能
- **数据一致性**: 确保与业务表数据的一致性
- **并发控制**: 高并发场景下的数据一致性保证

107
niucloud/databasedoc/school_addon.md

@ -0,0 +1,107 @@
# school_addon 表文档
## 表概述
**表名**: school_addon
**功能**: 插件管理表,负责管理教务系统中的插件安装、配置、版本控制、状态管理等扩展功能模块
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
title varchar(40) utf8mb4_general_ci NO select,insert,update,references 插件名称
icon varchar(255) utf8mb4_general_ci NO select,insert,update,references 插件图标
key varchar(20) utf8mb4_general_ci NO select,insert,update,references 插件标识
desc text utf8mb4_general_ci YES NULL select,insert,update,references 插件描述
status tinyint NULL NO 1 select,insert,update,references 状态
author varchar(40) utf8mb4_general_ci NO select,insert,update,references 作者
version varchar(20) utf8mb4_general_ci NO select,insert,update,references 版本号
create_time int NULL NO 0 select,insert,update,references 创建时间
install_time int NULL NO 0 select,insert,update,references 安装时间
update_time int NULL NO 0 select,insert,update,references 更新时间
cover varchar(255) utf8mb4_general_ci NO select,insert,update,references 封面
type varchar(255) utf8mb4_general_ci NO app select,insert,update,references 插件类型app,addon
support_app varchar(255) utf8mb4_general_ci NO select,insert,update,references 插件支持的应用空表示通用插件
is_star tinyint NULL NO 1 select,insert,update,references 是否加星
compile varchar(2000) utf8mb4_general_ci NO select,insert,update,references 编译端口
```
## 功能用途
### 主要功能
- **插件安装管理**: 管理插件的安装、卸载和重新安装
- **版本控制**: 跟踪插件的版本信息和更新历史
- **状态管理**: 控制插件的启用、禁用和运行状态
- **插件信息**: 管理插件名称、描述、图标等基本信息
- **作者管理**: 记录插件开发者和维护者信息
- **类型分类**: 区分不同类型的插件(app、addon等)
- **应用支持**: 管理插件支持的应用范围
- **编译配置**: 管理插件的编译端口和配置信息
- **星标管理**: 支持插件的收藏和推荐功能
### 业务场景
- **系统扩展**: 通过插件扩展系统功能和特性
- **功能定制**: 根据业务需要安装特定功能插件
- **版本升级**: 管理插件的版本更新和兼容性
- **插件市场**: 支持插件的发布、下载和安装
- **功能开关**: 通过启用/禁用控制插件功能
- **系统集成**: 插件与核心系统的集成和配置
- **开发调试**: 插件开发过程中的测试和调试
- **性能优化**: 根据需要选择性加载插件
- **安全管理**: 控制插件的安装权限和安全性
## 关联关系
### 主要关联表
- `school_sys_config`: 系统配置表 (插件配置关联)
- `school_sys_menu`: 系统菜单表 (插件菜单关联)
- `school_sys_role`: 系统角色表 (插件权限关联)
- `sys_log`: 系统日志表 (插件操作日志)
- `school_personnel`: 人员表 (插件使用权限)
- `school_campus`: 校区表 (插件应用范围)
### 关联说明
- **配置关联**: 插件可能有专门的配置项存储在系统配置表中
- **菜单关联**: 插件安装时可能添加新的菜单项
- **权限关联**: 插件功能需要相应的角色权限控制
- **日志关联**: 插件的安装、卸载、启用等操作记录在日志中
- **用户关联**: 不同用户可能有不同的插件使用权限
- **校区关联**: 插件可能只在特定校区启用或配置
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**:
- key (插件标识唯一)
- **业务索引**:
- status (状态查询)
- type (类型查询)
- is_star (星标查询)
- author (作者查询)
- **复合索引**:
- (status, type) (有效插件类型查询)
- (type, support_app) (应用插件查询)
- (status, is_star) (推荐插件查询)
- **时间索引**:
- create_time (创建时间查询)
- install_time (安装时间查询)
- update_time (更新时间查询)
## 注意事项
- **插件标识唯一性**: key字段必须唯一,避免插件标识冲突
- **版本兼容性**: 插件版本需要与系统版本兼容
- **状态一致性**: 插件状态变更需要同步更新相关配置
- **安装顺序**: 某些插件可能有依赖关系,需要按顺序安装
- **卸载检查**: 卸载插件前需要检查是否有其他插件依赖
- **权限验证**: 插件安装和管理需要相应的管理权限
- **数据备份**: 插件操作前建议备份相关数据
- **编译配置**: compile字段存储编译相关配置,格式需要规范
- **应用范围**: support_app字段控制插件的应用范围
- **安全检查**: 插件安装前需要进行安全性检查
- **资源管理**: 插件可能占用系统资源,需要监控
- **配置迁移**: 插件更新时需要处理配置数据迁移
- **错误处理**: 插件加载失败时需要有容错机制
- **日志记录**: 插件操作需要详细的日志记录
- **缓存清理**: 插件状态变更时需要清理相关缓存
- **测试验证**: 插件安装后需要验证功能正常性
- **回滚机制**: 插件更新失败时需要支持回滚
- **文档维护**: 插件需要维护详细的使用文档

91
niucloud/databasedoc/school_addon_log.md

@ -0,0 +1,91 @@
# school_addon_log 表文档
## 表概述
**表名**: school_addon_log
**功能**: 插件操作日志表,用于记录插件的安装、卸载、更新等操作历史,包括版本变更追踪、操作审计和故障排查支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
action varchar(40) utf8mb4_general_ci NO select,insert,update,references 操作类型 install 安装 uninstall 卸载 update 更新
key varchar(20) utf8mb4_general_ci NO select,insert,update,references 插件标识
from_version varchar(20) utf8mb4_general_ci NO select,insert,update,references 升级前的版本号
to_version varchar(20) utf8mb4_general_ci NO select,insert,update,references 升级后的版本号
create_time int NULL NO 0 select,insert,update,references 创建时间
```
## 功能用途
### 主要功能
- **插件操作日志**: 记录插件的安装、卸载、更新等操作历史
- **版本追踪**: 跟踪插件版本变更历史,记录升级前后版本号
- **操作审计**: 提供插件操作的审计追踪和历史记录
- **故障排查**: 为插件相关问题提供操作历史支持
- **回滚支持**: 为插件回滚操作提供版本信息参考
- **操作统计**: 统计插件的使用和更新频率
- **合规记录**: 满足系统变更管理的合规性要求
- **时间追踪**: 记录每次操作的具体时间
- **插件标识**: 通过key字段唯一标识操作的插件
### 业务场景
- **插件安装**: 记录新插件的安装操作和版本信息
- **插件卸载**: 记录插件卸载操作,保留历史信息
- **版本升级**: 记录插件版本升级的完整过程
- **故障诊断**: 通过操作历史排查插件相关问题
- **系统审计**: 定期审计插件变更操作
- **回滚操作**: 基于历史记录进行插件版本回滚
- **变更管理**: 管理和跟踪系统插件变更
- **操作报告**: 生成插件操作统计报告
- **合规检查**: 满足系统变更的合规性检查
## 关联关系
### 主要关联表
- `school_addon`: 插件管理表 (key字段关联)
- `school_personnel`: 人员信息表 (操作人员关联)
- `school_sys_config`: 系统配置表 (插件配置关联)
- `sys_log`: 系统日志表 (操作日志关联)
- `school_campus`: 校区信息表 (操作范围关联)
### 关联说明
- **插件关联**: key字段关联school_addon表的插件标识
- **操作人员**: 通过系统日志关联操作人员信息
- **配置关联**: 插件操作可能涉及相关配置变更
- **日志关联**: 与系统操作日志形成完整的审计链
- **范围关联**: 插件操作可能限定在特定校区范围
- **版本关联**: from_version和to_version形成版本变更链
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- key (插件标识查询)
- action (操作类型查询)
- from_version (源版本查询)
- to_version (目标版本查询)
- **复合索引**:
- (key, action) (插件操作类型查询)
- (key, create_time) (插件操作时间查询)
- (action, create_time) (操作类型时间查询)
- (key, from_version, to_version) (版本变更查询)
- **时间索引**:
- create_time (创建时间查询)
## 注意事项
- **操作类型**: action字段限定为install、uninstall、update三种类型
- **插件标识**: key字段必须与school_addon表中的插件标识保持一致
- **版本格式**: from_version和to_version需要遵循版本号格式规范
- **只增不删**: 日志记录应该只增不删,保持完整的操作历史
- **时间精度**: create_time需要精确记录操作时间
- **数据完整性**: 所有字段都不允许为空,确保日志完整性
- **版本一致性**: 升级操作的to_version应该与实际安装版本一致
- **操作原子性**: 插件操作和日志记录应该在同一事务中完成
- **日志清理**: 建立合理的日志清理策略,避免数据过度膨胀
- **权限控制**: 只有授权人员才能进行插件操作
- **备份策略**: 重要插件操作前需要进行数据备份
- **回滚验证**: 记录的版本信息需要支持插件回滚操作
- **异常处理**: 操作失败时也需要记录相应的日志信息
- **监控告警**: 建立插件操作的监控和异常告警机制
- **审计要求**: 满足系统变更管理的审计要求
- **性能考虑**: 大量日志查询时需要考虑性能优化

86
niucloud/databasedoc/school_applet_site_version.md

@ -0,0 +1,86 @@
# school_applet_site_version 表文档
## 表概述
**表名**: school_applet_site_version
**功能**: 小程序站点版本管理表,负责管理教务系统中小程序的版本操作记录,包括版本下载、更新等操作的追踪和管理
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
version_id int NULL NO 0 select,insert,update,references 版本id
type varchar(20) utf8mb4_general_ci NO select,insert,update,references 小程序类型
action varchar(20) utf8mb4_general_ci NO select,insert,update,references 操作方式 download 下载 upgrade 更新
create_time int NULL NO 0 select,insert,update,references 创建时间
```
## 功能用途
### 主要功能
- **版本操作记录**: 记录小程序版本的下载和更新操作
- **小程序类型管理**: 区分不同类型的小程序版本操作
- **操作追踪**: 跟踪版本操作的时间和类型
- **版本关联**: 关联具体的版本ID进行操作记录
- **操作统计**: 统计版本操作的频率和类型
- **历史记录**: 保存版本操作的完整历史
- **审计支持**: 为版本管理提供审计追踪
- **时间管理**: 记录每次操作的具体时间
- **操作分类**: 区分下载和更新两种主要操作类型
### 业务场景
- **版本下载**: 记录小程序版本的下载操作
- **版本更新**: 记录小程序版本的更新操作
- **操作审计**: 审计小程序版本的操作历史
- **使用统计**: 统计不同版本的使用情况
- **问题排查**: 通过操作记录排查版本相关问题
- **版本管理**: 管理小程序的版本生命周期
- **操作监控**: 监控版本操作的频率和状态
- **数据分析**: 分析版本操作的趋势和模式
- **合规记录**: 满足版本管理的合规性要求
## 关联关系
### 主要关联表
- `school_applet_version`: 小程序版本表 (version_id字段关联)
- `school_personnel`: 人员信息表 (操作人员关联)
- `school_campus`: 校区信息表 (操作范围关联)
- `school_sys_config`: 系统配置表 (小程序配置关联)
- `sys_log`: 系统日志表 (操作日志关联)
### 关联说明
- **版本关联**: version_id字段关联school_applet_version表的版本信息
- **操作人员**: 通过系统日志关联具体的操作人员
- **小程序类型**: type字段区分不同类型的小程序
- **操作类型**: action字段区分下载和更新操作
- **时间关联**: create_time记录操作的具体时间
- **业务关联**: 与小程序管理业务流程紧密关联
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**: version_id (版本关联查询)
- **业务索引**:
- type (小程序类型查询)
- action (操作类型查询)
- **复合索引**:
- (version_id, action) (版本操作查询)
- (type, action) (类型操作查询)
- (version_id, create_time) (版本时间查询)
- (action, create_time) (操作时间查询)
- **时间索引**: create_time (创建时间查询)
## 注意事项
- **版本ID完整性**: version_id必须关联到有效的小程序版本
- **操作类型限制**: action字段限定为download和upgrade两种类型
- **小程序类型**: type字段需要与系统支持的小程序类型保持一致
- **时间精度**: create_time需要精确记录操作时间
- **数据完整性**: 所有必填字段都不允许为空
- **操作原子性**: 版本操作和记录插入应该在同一事务中完成
- **重复操作**: 需要考虑同一版本的重复操作记录
- **权限控制**: 只有授权人员才能进行版本操作
- **日志清理**: 建立合理的操作记录清理策略
- **性能优化**: 大量记录查询时需要考虑性能
- **监控告警**: 建立版本操作的监控机制
- **审计要求**: 满足版本管理的审计要求
- **数据一致性**: 确保操作记录与实际版本状态一致
- **异常处理**: 操作失败时的记录处理策略

110
niucloud/databasedoc/school_applet_version.md

@ -0,0 +1,110 @@
# school_applet_version 表文档
## 表概述
**表名**: school_applet_version
**功能**: 小程序版本管理表,负责管理教务系统中小程序的版本信息,包括版本配置、状态管理、发布控制等核心功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
config varchar(255) utf8mb4_general_ci NO select,insert,update,references 配置信息
type varchar(20) utf8mb4_general_ci NO select,insert,update,references 小程序类型
desc text utf8mb4_general_ci YES NULL select,insert,update,references 插件描述
status tinyint NULL NO 1 select,insert,update,references 状态 下架 上架
uid varchar(40) utf8mb4_general_ci NO select,insert,update,references 发布者
path varchar(255) utf8mb4_general_ci NO select,insert,update,references 小程序包地址
version varchar(20) utf8mb4_general_ci NO select,insert,update,references 版本号
version_num varchar(20) utf8mb4_general_ci NO select,insert,update,references 版本号数字(用于排序)
release_version varchar(20) utf8mb4_general_ci NO select,insert,update,references 发布线上版本号
create_time int NULL NO 0 select,insert,update,references 创建时间
delete_time int NULL NO 0 select,insert,update,references 删除时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **版本信息管理**: 管理小程序的版本号、配置信息和描述
- **状态控制**: 控制小程序版本的上架和下架状态
- **发布管理**: 管理小程序的发布版本和线上版本
- **配置管理**: 存储小程序的配置信息和参数
- **版本排序**: 通过版本号数字进行版本排序管理
- **发布者管理**: 记录版本的发布者信息
- **包路径管理**: 管理小程序包的存储路径
- **类型分类**: 区分不同类型的小程序版本
- **生命周期管理**: 管理版本的创建、更新和删除
- **软删除支持**: 支持版本的逻辑删除和恢复
### 业务场景
- **版本发布**: 发布新的小程序版本到系统
- **版本更新**: 更新现有小程序版本的信息和配置
- **版本下架**: 将有问题的版本下架处理
- **版本回滚**: 回滚到之前的稳定版本
- **版本审核**: 审核小程序版本的质量和合规性
- **版本分发**: 向不同校区分发小程序版本
- **版本监控**: 监控小程序版本的运行状态
- **版本统计**: 统计版本的使用情况和性能
- **版本维护**: 维护和优化小程序版本
## 关联关系
### 主要关联表
- `school_applet_site_version`: 小程序站点版本表 (版本操作记录关联)
- `school_personnel`: 人员信息表 (发布者关联)
- `school_campus`: 校区信息表 (版本分发关联)
- `school_sys_config`: 系统配置表 (小程序配置关联)
- `school_addon`: 插件管理表 (小程序插件关联)
- `sys_log`: 系统日志表 (版本操作日志关联)
- `school_sys_attachment`: 附件表 (小程序包文件关联)
### 关联说明
- **操作记录**: school_applet_site_version表记录此表版本的操作历史
- **发布者关联**: uid字段关联发布者的人员信息
- **小程序类型**: type字段区分不同类型的小程序
- **版本状态**: status字段控制版本的可用性
- **包路径**: path字段关联小程序包的存储位置
- **版本号管理**: version和version_num字段管理版本信息
- **发布版本**: release_version字段管理线上发布版本
- **配置关联**: config字段存储小程序的配置信息
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- type (小程序类型查询)
- status (状态查询)
- uid (发布者查询)
- version (版本号查询)
- release_version (发布版本查询)
- **复合索引**:
- (type, status) (类型状态查询)
- (uid, create_time) (发布者时间查询)
- (type, version) (类型版本查询)
- (status, create_time) (状态时间查询)
- (version_num, type) (版本排序查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
- delete_time (删除时间查询)
- **全文索引**: desc (描述内容搜索)
## 注意事项
- **版本号格式**: version和version_num需要遵循统一的版本号格式规范
- **状态一致性**: status字段变更需要与实际小程序状态保持一致
- **发布者验证**: uid字段必须关联到有效的系统用户
- **包路径有效性**: path字段必须指向有效的小程序包文件
- **配置格式**: config字段需要遵循JSON格式规范
- **版本唯一性**: 同类型小程序的版本号不能重复
- **软删除机制**: 使用delete_time实现软删除,避免物理删除
- **发布版本控制**: release_version变更需要经过审核流程
- **权限控制**: 只有授权人员才能发布和管理版本
- **版本回滚**: 版本回滚操作需要保留历史版本信息
- **包文件管理**: 删除版本时需要同步处理相关的包文件
- **依赖检查**: 删除版本前需要检查是否有其他组件依赖
- **审计要求**: 版本变更操作需要记录完整的审计日志
- **性能优化**: 大量版本查询时需要考虑缓存策略
- **备份策略**: 重要版本需要建立备份和恢复机制
- **监控告警**: 建立版本状态的监控和异常告警
- **数据一致性**: 确保版本信息与实际部署状态一致
- **版本清理**: 建立过期版本的清理策略

98
niucloud/databasedoc/school_approval_config.md

@ -0,0 +1,98 @@
# school_approval_config 表文档
## 表概述
**表名**: school_approval_config
**功能**: 审批配置管理表,负责管理教务系统中各种业务流程的审批配置,包括审批流程模板、业务类型配置、状态控制等核心功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 配置ID
config_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 配置名称
description text utf8mb4_general_ci YES NULL select,insert,update,references 配置描述
status tinyint(1) NULL NO 1 select,insert,update,references 状态: 0-禁用, 1-启用
creator_id int NULL NO NULL select,insert,update,references 创建人ID
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
business_type varchar(100) utf8mb4_general_ci YES NULL select,insert,update,references 业务类型标识
```
## 功能用途
### 主要功能
- **审批配置管理**: 管理系统中各种业务流程的审批配置
- **业务类型分类**: 通过business_type字段区分不同业务的审批配置
- **配置状态控制**: 通过status字段控制审批配置的启用和禁用
- **配置描述**: 提供详细的配置说明和使用描述
- **创建人追踪**: 记录配置的创建人员信息
- **时间管理**: 记录配置的创建和修改时间
- **配置模板**: 为不同业务提供审批流程模板
- **动态配置**: 支持运行时动态调整审批配置
- **配置继承**: 支持基于模板的配置继承机制
### 业务场景
- **请假审批**: 配置员工请假的审批流程
- **报销审批**: 配置费用报销的审批流程
- **合同审批**: 配置合同签署的审批流程
- **课程审批**: 配置课程安排的审批流程
- **学员退费**: 配置学员退费的审批流程
- **薪资调整**: 配置薪资变更的审批流程
- **权限申请**: 配置系统权限申请的审批流程
- **资源申请**: 配置教学资源申请的审批流程
- **流程优化**: 根据业务需要优化审批流程配置
## 关联关系
### 主要关联表
- `school_approval_process`: 审批流程表 (配置关联)
- `school_approval_config_node`: 审批配置节点表 (配置详情)
- `school_personnel`: 人员信息表 (creator_id外键关联)
- `school_approval_history`: 审批历史表 (配置使用记录)
- `school_approval_participants`: 审批参与者表 (审批人员)
- `school_campus`: 校区信息表 (配置范围)
- `sys_log`: 系统日志表 (配置变更日志)
### 关联说明
- **创建人关联**: creator_id关联school_personnel表,记录配置创建人
- **流程关联**: 与审批流程表关联,定义具体的审批步骤
- **节点关联**: 与配置节点表关联,定义审批流程的详细节点
- **历史关联**: 审批历史记录使用的配置信息
- **参与者关联**: 配置中定义的审批参与人员
- **业务关联**: business_type关联具体的业务模块
- **日志关联**: 配置变更操作记录到系统日志
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- creator_id (创建人查询)
- **业务索引**:
- business_type (业务类型查询)
- status (状态查询)
- config_name (配置名称查询)
- **复合索引**:
- (business_type, status) (业务启用配置查询)
- (creator_id, created_at) (创建人时间查询)
- (status, updated_at) (启用配置更新时间查询)
- **时间索引**:
- created_at (创建时间查询)
- updated_at (更新时间查询)
## 注意事项
- **配置名称唯一性**: config_name在同一business_type下应保证唯一性
- **业务类型规范**: business_type需要遵循系统定义的业务类型标准
- **状态一致性**: 配置状态变更需要同步更新相关审批流程
- **创建人验证**: creator_id必须是有效的人员ID
- **配置完整性**: 配置禁用前需要检查是否有正在进行的审批流程
- **描述规范**: description字段应提供清晰的配置说明
- **权限控制**: 只有授权人员才能创建和修改审批配置
- **配置备份**: 重要配置修改前需要备份原始配置
- **依赖检查**: 删除配置前需要检查相关流程和历史记录
- **版本管理**: 建议建立配置版本管理机制
- **测试验证**: 新配置上线前需要进行充分测试
- **文档维护**: 配置变更需要同步更新相关文档
- **监控告警**: 建立配置使用情况的监控机制
- **性能优化**: 频繁使用的配置建议使用缓存机制
- **审计要求**: 配置变更需要满足审计合规要求
- **回滚机制**: 建立配置变更的回滚机制
- **通知机制**: 配置变更需要通知相关使用人员

98
niucloud/databasedoc/school_approval_config_node.md

@ -0,0 +1,98 @@
# school_approval_config_node 表文档
## 表概述
**表名**: school_approval_config_node
**功能**: 审批配置节点表,用于定义和管理审批流程中的具体节点配置,包括审批人类型(用户/角色/部门)、审批方式(或签/会签)、节点顺序等,支持灵活的审批流程设计和多维度审批人配置,为学校提供完整的审批流程节点管理和配置功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 节点ID
config_id int NULL NO MUL NULL select,insert,update,references 配置ID
node_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 节点名称
approver_type enum('user','role','department') utf8mb4_general_ci NO NULL select,insert,update,references 审批人类型: user-指定用户, role-指定角色, department-指定部门
approver_ids varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 审批人ID集合,逗号分隔
sign_type enum('or_sign','and_sign') utf8mb4_general_ci NO or_sign select,insert,update,references 审批类型: or_sign-或签(一人通过即可), and_sign-会签(需全部通过)
sequence int NULL NO NULL select,insert,update,references 节点顺序
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
1. **审批节点配置**: 定义审批流程中的具体节点信息和配置
2. **审批人管理**: 配置每个节点的审批人类型和具体审批人员
3. **审批类型控制**: 支持或签(一人通过即可)和会签(需全部通过)两种审批模式
4. **节点顺序管理**: 通过sequence字段控制审批节点的执行顺序
5. **多维度审批人**: 支持指定用户、角色、部门三种审批人类型
6. **审批人集合**: 支持一个节点配置多个审批人,用逗号分隔存储
7. **节点命名**: 提供节点名称字段,便于识别和管理
8. **配置关联**: 与审批配置表关联,形成完整的审批流程
9. **时间追踪**: 记录节点配置的创建和修改时间
### 业务场景
1. **流程设计**: 设计多级审批流程,配置每个审批节点
2. **权限分配**: 为不同审批节点分配相应的审批人员或角色
3. **并行审批**: 配置会签节点,需要多人同时审批通过
4. **串行审批**: 配置或签节点,任意一人审批即可通过
5. **部门审批**: 配置部门级别的审批,由部门负责人审批
6. **角色审批**: 配置基于角色的审批,如财务审批、人事审批
7. **用户审批**: 配置指定用户的审批,如总经理审批
8. **流程优化**: 根据业务需要调整审批节点和审批人配置
9. **审批监控**: 通过节点配置监控审批流程的执行情况
## 关联关系
### 主要关联表
1. **school_approval_config**: 审批配置表 (config_id)
2. **school_approval_process**: 审批流程表 (通过config_id间接关联)
3. **school_approval_participants**: 审批参与人表 (节点配置关联)
4. **school_approval_history**: 审批历史记录表 (节点执行记录)
5. **school_personnel**: 人员表 (审批人关联)
6. **school_sys_role**: 角色表 (角色审批人关联)
7. **school_department**: 部门表 (部门审批人关联)
8. **school_campus**: 校区表 (审批范围关联)
### 关联说明
- **配置关联**: config_id关联school_approval_config表,确定节点所属的审批配置
- **审批人关联**: approver_ids根据approver_type关联不同的人员、角色或部门表
- **流程关联**: 通过config_id间接关联审批流程,确定节点在流程中的位置
- **执行关联**: 审批执行时根据节点配置创建参与人和历史记录
- **顺序关联**: sequence字段确定节点在审批流程中的执行顺序
- **类型关联**: approver_type决定审批人的查找方式和权限验证
- **签名关联**: sign_type影响节点的审批通过条件和逻辑
## 索引建议
- **主键索引**: id (自动创建)
- **外键索引**: config_id (审批配置查询)
- **业务索引**:
- (config_id, sequence) (按配置和顺序查询节点)
- approver_type (按审批人类型查询)
- sign_type (按签名类型查询)
- **复合索引**:
- (config_id, approver_type) (配置内按类型查询)
- (approver_type, approver_ids) (审批人查询)
- **时间索引**:
- created_at (创建时间查询)
- updated_at (修改时间查询)
## 注意事项
1. **外键完整性**: config_id必须存在于school_approval_config表中
2. **审批人类型**: approver_type只能是user、role、department三种类型之一
3. **审批人ID格式**: approver_ids使用逗号分隔,需要验证ID的有效性
4. **签名类型**: sign_type影响审批逻辑,or_sign和and_sign有不同的通过条件
5. **节点顺序**: sequence在同一config_id下应该唯一,确保顺序的正确性
6. **节点名称**: node_name应该具有描述性,便于识别节点功能
7. **审批人验证**: 根据approver_type验证approver_ids中的ID是否存在
8. **权限检查**: 审批人必须具有相应的审批权限
9. **数据一致性**: 修改节点配置时需要考虑正在进行的审批流程
10. **删除限制**: 删除节点前需要检查是否有正在使用的审批流程
11. **配置完整性**: 确保审批配置的所有必要节点都已配置
12. **顺序连续性**: sequence应该连续,避免跳跃或重复
13. **审批人数量**: 会签节点的审批人数量应该合理,避免过多影响效率
14. **角色权限**: 基于角色的审批需要确保角色权限的正确配置
15. **部门层级**: 基于部门的审批需要考虑部门层级关系
16. **并发控制**: 多人同时修改节点配置时需要并发控制
17. **审计要求**: 节点配置的变更需要记录审计日志

98
niucloud/databasedoc/school_approval_history.md

@ -0,0 +1,98 @@
# school_approval_history 表文档
## 表概述
**表名**: school_approval_history
**功能**: 审批历史记录表,用于记录审批流程中每个节点的操作历史和结果,包括审批人操作、审批意见、操作时间等,支持审批追溯、合规审计和流程优化,为学校提供完整的审批操作审计轨迹
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 历史记录ID
process_id int NULL NO MUL NULL select,insert,update,references 流程ID
participant_id int NULL NO MUL NULL select,insert,update,references 审批人ID
sequence int NULL NO NULL select,insert,update,references 审批顺序
action enum('approve','reject','forward','cancel') utf8mb4_0900_ai_ci NO NULL select,insert,update,references 操作类型
status enum('approved','rejected','forwarded','cancelled') utf8mb4_0900_ai_ci NO NULL select,insert,update,references 操作结果
remarks text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 审批意见
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 操作时间
```
## 功能用途
### 主要功能
- **审批历史记录**: 记录审批流程中每个节点的操作历史和结果
- **操作类型管理**: 支持批准、拒绝、转发、取消四种操作类型
- **状态结果跟踪**: 记录每次操作的具体结果状态
- **审批顺序管理**: 记录审批人在流程中的执行顺序
- **审批意见存储**: 存储审批人的详细审批意见和备注
- **时间追踪**: 记录每次审批操作的具体时间
- **审计追踪**: 提供完整的审批操作审计轨迹
- **流程关联**: 关联具体的审批流程和参与人
- **历史查询**: 支持审批历史的查询和统计
### 业务场景
- **审批记录**: 记录每次审批操作的详细信息
- **审批追溯**: 追溯审批流程的完整历史轨迹
- **审批统计**: 统计审批人的审批效率和结果
- **审批分析**: 分析审批流程的瓶颈和优化点
- **合规审计**: 提供审批操作的合规性审计
- **争议处理**: 处理审批争议时提供历史依据
- **流程优化**: 基于历史数据优化审批流程
- **绩效考核**: 评估审批人员的工作绩效
- **报表生成**: 生成审批相关的统计报表
## 关联关系
### 主要关联表
- `school_approval_process`: 审批流程表 (process_id外键关联)
- `school_approval_participants`: 审批参与人表 (participant_id外键关联)
- `school_personnel`: 人员信息表 (审批人信息关联)
- `school_approval_config`: 审批配置表 (流程配置关联)
- `school_approval_config_node`: 审批节点配置表 (节点配置关联)
- `sys_log`: 系统日志表 (操作日志关联)
### 关联说明
- **流程关联**: process_id关联school_approval_process表,确定历史记录所属流程
- **参与人关联**: participant_id关联school_approval_participants表,确定操作的审批人
- **人员关联**: 通过participant_id间接关联school_personnel表获取审批人详细信息
- **配置关联**: 通过流程关联审批配置和节点配置信息
- **日志关联**: 审批操作同时记录到系统日志中
- **顺序关联**: sequence字段确定审批操作在流程中的执行顺序
- **操作关联**: action和status字段关联,记录操作类型和结果
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- process_id (流程历史查询)
- participant_id (审批人历史查询)
- **业务索引**:
- action (操作类型查询)
- status (操作结果查询)
- sequence (审批顺序查询)
- **复合索引**:
- (process_id, sequence) (流程顺序查询)
- (participant_id, created_at) (审批人时间查询)
- (process_id, action, status) (流程操作结果查询)
- (action, status, created_at) (操作结果时间查询)
- **时间索引**:
- created_at (操作时间查询)
## 注意事项
- **操作类型**: action字段限定为approve、reject、forward、cancel四种类型
- **状态结果**: status字段限定为approved、rejected、forwarded、cancelled四种状态
- **外键完整性**: process_id和participant_id必须在对应表中存在
- **顺序唯一性**: 同一流程中的sequence应该是唯一的
- **操作一致性**: action和status应该保持逻辑一致性
- **只增不删**: 历史记录表应该只允许插入,不允许删除或修改
- **时间精度**: created_at使用timestamp类型,确保时间精度
- **审批意见**: remarks字段可以为空,但重要操作建议填写
- **数据完整性**: 每次审批操作都必须记录完整的历史信息
- **并发控制**: 防止同一审批人同时进行多次操作
- **权限验证**: 确保只有授权的审批人才能进行操作
- **审计要求**: 所有操作都必须有完整的审计轨迹
- **数据备份**: 重要的审批历史数据需要定期备份
- **性能优化**: 大量历史数据查询时需要考虑分页和索引优化
- **监控告警**: 建立异常审批操作的监控机制
- **数据归档**: 建立历史数据的归档策略
- **查询优化**: 复杂的历史查询需要优化SQL性能

101
niucloud/databasedoc/school_approval_participants.md

@ -0,0 +1,101 @@
# school_approval_participants 表文档
## 表概述
**表名**: school_approval_participants
**功能**: 审批参与人管理表,用于管理审批流程中的参与人员信息和审批状态,包括审批顺序、审批类型(或签/会签)、审批状态跟踪等,支持多种审批模式和流程控制,为学校提供完整的审批流程参与人管理和状态监控功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 参与编号
process_id int NULL NO MUL NULL select,insert,update,references 流程ID
participant_id int NULL NO NULL select,insert,update,references 参与人ID
sequence int NULL NO NULL select,insert,update,references 审批顺序
status enum('pending','approved','rejected') utf8mb4_general_ci NO NULL select,insert,update,references 当前状态: pending-待审批, approved-已批准, rejected-已拒绝
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 备注
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
sign_type enum('or_sign','and_sign') utf8mb4_general_ci NO or_sign select,insert,update,references 审批类型: or_sign-或签, and_sign-会签
```
## 功能用途
### 主要功能
- **审批参与人管理**: 管理审批流程中的参与人员和角色分配
- **审批顺序控制**: 控制审批人员在流程中的执行顺序
- **审批状态跟踪**: 跟踪每个参与人的审批状态(待审批/已批准/已拒绝)
- **审批类型管理**: 支持或签(or_sign)和会签(and_sign)两种审批类型
- **审批备注记录**: 记录审批人的审批意见和备注信息
- **流程关联**: 关联具体的审批流程实例
- **时间管理**: 记录参与人的创建和更新时间
- **参与人权限**: 管理不同参与人的审批权限
- **审批结果统计**: 统计参与人的审批结果和效率
### 业务场景
- **流程分配**: 为审批流程分配具体的审批参与人
- **顺序审批**: 按照设定的顺序进行逐级审批
- **并行审批**: 支持多人同时进行审批(或签模式)
- **会签审批**: 要求所有指定人员都同意才能通过(会签模式)
- **审批替代**: 处理审批人请假或不在时的替代审批
- **审批监控**: 监控审批进度和参与人状态
- **审批提醒**: 提醒相关人员及时进行审批
- **权限控制**: 控制不同级别人员的审批权限
- **审批统计**: 统计各参与人的审批效率和结果
## 关联关系
### 主要关联表
- `school_approval_process`: 审批流程表 (process_id外键关联)
- `school_personnel`: 人员信息表 (participant_id外键关联)
- `school_approval_history`: 审批历史表 (审批操作记录关联)
- `school_approval_config`: 审批配置表 (流程配置关联)
- `school_approval_config_node`: 审批节点配置表 (节点配置关联)
- `school_sys_role`: 角色表 (审批权限关联)
- `school_campus`: 校区表 (数据权限关联)
### 关联说明
- **流程关联**: process_id关联school_approval_process表,确定参与人所属的审批流程
- **人员关联**: participant_id关联school_personnel表,确定具体的审批参与人
- **历史关联**: 与school_approval_history表关联,记录参与人的审批操作历史
- **配置关联**: 通过流程关联审批配置,获取审批规则和节点信息
- **权限关联**: 通过人员信息关联角色权限,控制审批权限
- **顺序关联**: sequence字段确定审批的执行顺序
- **类型关联**: sign_type字段确定审批类型(或签/会签)
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- process_id (流程参与人查询)
- participant_id (人员审批查询)
- **业务索引**:
- status (审批状态查询)
- sequence (审批顺序查询)
- sign_type (审批类型查询)
- **复合索引**:
- (process_id, sequence) (流程顺序查询)
- (participant_id, status) (人员状态查询)
- (process_id, status) (流程状态查询)
- (sign_type, status, created_at) (类型状态时间查询)
- **时间索引**:
- created_at (创建时间查询)
- updated_at (更新时间查询)
## 注意事项
- **审批状态**: status字段限定为pending、approved、rejected三种状态
- **审批类型**: sign_type字段限定为or_sign(或签)和and_sign(会签)两种类型
- **外键完整性**: process_id和participant_id必须在对应表中存在
- **顺序唯一性**: 同一流程中的sequence应该是唯一的
- **状态流转**: 状态只能从pending转换为approved或rejected
- **审批权限**: 确保参与人具有相应的审批权限
- **或签逻辑**: or_sign模式下,任一人审批通过即可
- **会签逻辑**: and_sign模式下,所有人都必须审批通过
- **时间一致性**: created_at和updated_at时间应该合理
- **备注规范**: remarks字段建议填写审批意见
- **并发控制**: 防止同一参与人重复审批
- **数据完整性**: 确保参与人信息的完整性和准确性
- **权限验证**: 验证参与人是否有权限参与该流程审批
- **状态同步**: 参与人状态变更需要同步到流程状态
- **审计要求**: 所有状态变更都需要记录审计日志
- **性能优化**: 大量参与人查询时需要考虑索引优化
- **监控告警**: 建立审批超时和异常的监控机制

111
niucloud/databasedoc/school_approval_process.md

@ -0,0 +1,111 @@
# school_approval_process 表文档
## 表概述
**表名**: school_approval_process
**功能**: 审批流程管理表,负责管理教务系统中的各种业务审批流程,包括流程状态跟踪、审批人管理、业务数据关联等核心功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 流程编号
process_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 流程名称
applicant_id int NULL NO NULL select,insert,update,references 申请人ID
application_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 申请时间
current_approver_id int NULL NO NULL select,insert,update,references 当前审批人ID
approval_status enum('pending','approved','rejected') utf8mb4_general_ci NO NULL select,insert,update,references 审批状态: pending-待审批, approved-已批准, rejected-已拒绝
approval_time timestamp NULL YES NULL select,insert,update,references 审批时间
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 备注
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
business_type varchar(255) utf8mb4_general_ci YES MUL NULL select,insert,update,references 业务方法名
business_id int NULL YES NULL select,insert,update,references 关联业务ID
business_data longtext utf8mb4_general_ci YES NULL select,insert,update,references 业务数据JSON
```
## 功能用途
### 主要功能
- **审批流程管理**: 管理各种业务的审批流程实例
- **流程状态跟踪**: 跟踪审批流程的当前状态(待审批/已批准/已拒绝)
- **申请人管理**: 记录流程的发起人和申请时间
- **当前审批人跟踪**: 跟踪当前负责审批的人员
- **业务数据关联**: 关联具体的业务类型和业务数据
- **审批时间管理**: 记录申请时间和审批完成时间
- **流程备注记录**: 记录流程相关的备注和说明信息
- **业务类型分类**: 支持多种业务类型的审批流程
- **JSON数据存储**: 存储复杂的业务数据结构
### 业务场景
- **请假审批**: 员工请假申请的审批流程
- **报销审批**: 费用报销的审批流程
- **合同审批**: 合同签署的审批流程
- **课程审批**: 新课程开设的审批流程
- **学员退费**: 学员退费申请的审批流程
- **薪资调整**: 员工薪资调整的审批流程
- **权限申请**: 系统权限申请的审批流程
- **资源申请**: 教学资源申请的审批流程
- **变更审批**: 各种业务变更的审批流程
## 关联关系
### 主要关联表
- `school_personnel`: 人员信息表 (applicant_id、current_approver_id外键关联)
- `school_approval_config`: 审批配置表 (business_type关联)
- `school_approval_participants`: 审批参与人表 (流程参与人关联)
- `school_approval_history`: 审批历史表 (流程操作历史关联)
- `school_approval_config_node`: 审批节点配置表 (流程节点关联)
- `school_contract`: 合同表 (business_id关联,当business_type为合同时)
- `school_member`: 会员表 (business_id关联,当business_type为退费时)
- `school_salary`: 薪资表 (business_id关联,当business_type为薪资时)
- `sys_log`: 系统日志表 (操作日志关联)
### 关联说明
- **申请人关联**: applicant_id关联school_personnel表,确定流程发起人
- **审批人关联**: current_approver_id关联school_personnel表,确定当前审批人
- **配置关联**: business_type关联school_approval_config表,获取审批配置
- **参与人关联**: 与school_approval_participants表关联,管理流程参与人
- **历史关联**: 与school_approval_history表关联,记录审批操作历史
- **业务关联**: business_id根据business_type关联不同的业务表
- **节点关联**: 通过配置关联审批节点信息
- **数据关联**: business_data存储具体的业务数据JSON
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- applicant_id (申请人查询)
- current_approver_id (当前审批人查询)
- business_type (业务类型查询,已存在MUL)
- **业务索引**:
- approval_status (审批状态查询)
- business_id (业务ID查询)
- **复合索引**:
- (applicant_id, approval_status) (申请人状态查询)
- (current_approver_id, approval_status) (审批人状态查询)
- (business_type, approval_status) (业务类型状态查询)
- (business_type, business_id) (业务关联查询)
- (approval_status, application_time) (状态时间查询)
- **时间索引**:
- application_time (申请时间查询)
- approval_time (审批时间查询)
- created_at (创建时间查询)
- updated_at (更新时间查询)
## 注意事项
- **审批状态**: approval_status字段限定为pending、approved、rejected三种状态
- **外键完整性**: applicant_id和current_approver_id必须在school_personnel表中存在
- **业务类型**: business_type应该与school_approval_config表中的配置一致
- **业务关联**: business_id应该在对应的业务表中存在
- **状态流转**: 状态只能从pending转换为approved或rejected
- **时间逻辑**: approval_time应该晚于application_time
- **当前审批人**: current_approver_id应该与当前审批节点的参与人一致
- **JSON数据**: business_data应该是有效的JSON格式
- **流程完整性**: 确保流程配置和参与人配置的完整性
- **权限验证**: 验证申请人和审批人的权限
- **并发控制**: 防止同一流程被多人同时操作
- **数据一致性**: 确保流程状态与参与人状态的一致性
- **审计要求**: 所有状态变更都需要记录详细的审计日志
- **性能优化**: 大量流程查询时需要考虑分页和索引优化
- **监控告警**: 建立流程超时和异常的监控机制
- **数据备份**: 重要的审批流程数据需要定期备份
- **清理策略**: 建立已完成流程的归档和清理策略

108
niucloud/databasedoc/school_assignment.md

@ -0,0 +1,108 @@
# school_assignment 表文档
## 表概述
**表名**: school_assignment
**功能**: 作业管理表,负责管理教务系统中的作业布置、提交、批改等全流程,支持班级作业和学员个人作业两种模式,支持图片、视频、文本等多种作业内容类型
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
type int NULL NO 2 select,insert,update,references 1班级作业 2学员作业
class_id int NULL YES NULL select,insert,update,references 班级id
course_id int NULL YES NULL select,insert,update,references 课程id
personnel_id int NULL YES NULL select,insert,update,references 老师id
student_id int NULL NO NULL select,insert,update,references 学员id
description text utf8mb4_general_ci NO NULL select,insert,update,references 作业描述(老师留作业的描述)
content_type enum('1','2','3') utf8mb4_general_ci NO 1 select,insert,update,references 作业类型1图片2视频3文本
content_text text utf8mb4_general_ci YES NULL select,insert,update,references 学生提交的作业内容(根据content_type字段判断学生提交的内容是|文本,视频oss绝对路径url,图片oss上的绝对路径ur)
deleted_at int NULL NO 0 select,insert,update,references 逻辑删除时间
status int NULL NO 1 select,insert,update,references 状态 1未提交 2已提交 3待批改 4已批改
create_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 校区创建时间
update_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 校区更新时间
```
## 功能用途
### 主要功能
- **作业管理**: 管理班级作业和学员个人作业的布置和提交
- **作业类型分类**: 支持班级作业(type=1)和学员作业(type=2)两种类型
- **多媒体作业**: 支持图片、视频、文本三种作业内容类型
- **作业状态跟踪**: 跟踪作业从未提交到已批改的完整流程
- **作业描述**: 记录老师布置作业的详细描述和要求
- **内容存储**: 存储学员提交的作业内容(文本/图片/视频)
- **关联管理**: 关联班级、课程、老师、学员等相关信息
- **逻辑删除**: 支持作业的逻辑删除和恢复
- **时间追踪**: 记录作业的创建和更新时间
### 业务场景
- **作业布置**: 老师为班级或特定学员布置作业任务
- **作业提交**: 学员提交图片、视频或文本形式的作业
- **作业批改**: 老师对学员提交的作业进行批改和评价
- **作业跟踪**: 跟踪作业的完成进度和批改状态
- **作业统计**: 统计班级作业完成情况和批改进度
- **作业归档**: 对已完成的作业进行归档管理
- **作业查询**: 查询特定课程或学员的作业记录
- **作业提醒**: 提醒学员及时提交作业
- **教学评估**: 基于作业情况评估教学效果
## 关联关系
### 主要关联表
- `school_class`: 班级信息表 (class_id外键关联)
- `school_course`: 课程信息表 (course_id外键关联)
- `school_personnel`: 人员信息表 (personnel_id外键关联,老师)
- `school_student`: 学员信息表 (student_id外键关联)
- `school_sys_attachment`: 附件表 (作业文件关联)
- `school_campus`: 校区信息表 (数据范围关联)
### 关联说明
- **班级关联**: class_id关联school_class表,确定作业所属班级
- **课程关联**: course_id关联school_course表,确定作业所属课程
- **老师关联**: personnel_id关联school_personnel表,确定布置作业的老师
- **学员关联**: student_id关联school_student表,确定作业归属学员
- **附件关联**: 作业中的图片和视频文件关联附件表
- **校区关联**: 通过班级或课程间接关联校区信息
- **类型关联**: type字段区分班级作业和个人作业
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- class_id (班级作业查询)
- course_id (课程作业查询)
- personnel_id (老师作业查询)
- student_id (学员作业查询)
- **业务索引**:
- type (作业类型查询)
- status (作业状态查询)
- content_type (作业内容类型查询)
- deleted_at (逻辑删除查询)
- **复合索引**:
- (class_id, status) (班级作业状态查询)
- (student_id, status) (学员作业状态查询)
- (personnel_id, create_time) (老师作业时间查询)
- (course_id, type, status) (课程作业类型状态查询)
- (type, status, create_time) (作业类型状态时间查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
## 注意事项
- **作业类型**: type字段限定为1(班级作业)和2(学员作业)两种类型
- **外键完整性**: class_id、course_id、personnel_id、student_id必须在对应表中存在
- **内容类型**: content_type限定为1(图片)、2(视频)、3(文本)三种类型
- **状态流转**: status状态流转应遵循1→2→3→4的顺序(未提交→已提交→待批改→已批改)
- **逻辑删除**: 使用deleted_at字段进行逻辑删除,0表示未删除
- **内容存储**: content_text根据content_type存储不同类型的内容
- **文件路径**: 图片和视频需要存储OSS的绝对路径URL
- **作业描述**: description字段不能为空,必须提供作业要求
- **数据完整性**: 班级作业必须有class_id,学员作业必须有student_id
- **权限控制**: 只有授权老师才能布置和批改作业
- **文件安全**: 上传的图片和视频需要进行安全检查
- **存储优化**: 大文件建议使用CDN加速访问
- **备份策略**: 重要作业内容需要定期备份
- **性能优化**: 大量作业查询时需要考虑分页和缓存
- **监控告警**: 建立作业提交和批改的监控机制
- **数据清理**: 建立过期作业的清理策略
- **审计要求**: 作业操作需要记录详细的操作日志

90
niucloud/databasedoc/school_attendance.md

@ -0,0 +1,90 @@
# school_attendance 表文档
## 表概述
**表名**: school_attendance
**功能**: 考勤管理表,存储教务系统中所有员工的考勤记录,包括签到签退时间、请假信息、考勤状态等核心数据
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 考勤编号
campus_id int NULL NO NULL select,insert,update,references 校区ID
staff_id int NULL NO NULL select,insert,update,references 人员ID
attendance_date date NULL NO NULL select,insert,update,references 考勤日期
check_in_time time NULL YES NULL select,insert,update,references 签到时间
check_out_time time NULL YES NULL select,insert,update,references 签退时间
leave_start_time time NULL YES NULL select,insert,update,references 请假开始时间|默认null,只有status=请假的时候本字段必须有值
leave_end_time time NULL YES NULL select,insert,update,references 请假结束时间|默认null,只有status=请假的时候本字段必须有值
status enum('present','absent','late','leave_early','leave') utf8mb4_general_ci NO NULL select,insert,update,references 考勤状态: present-出勤, absent-缺勤, late-迟到, leave_early-早退,leave-请假
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 备注
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
coordinate varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 坐标|经度,纬度
```
## 功能用途
### 主要功能
1. **考勤记录管理**: 记录员工每日的签到签退时间
2. **请假管理**: 管理员工请假的开始和结束时间
3. **考勤状态跟踪**: 自动判断和记录考勤状态(出勤、缺勤、迟到、早退、请假)
4. **地理位置验证**: 通过坐标字段验证员工打卡位置
5. **校区考勤管理**: 按校区分别管理员工考勤
6. **考勤异常处理**: 记录和处理考勤异常情况
7. **考勤备注管理**: 支持考勤异常或特殊情况的备注说明
### 业务场景
1. **日常打卡**: 员工上下班时进行签到签退操作
2. **请假申请**: 员工申请请假时记录请假时间段
3. **考勤统计**: 按月度、季度统计员工考勤情况
4. **薪资计算**: 根据考勤记录计算员工工资和绩效
5. **异常处理**: 处理迟到、早退、缺勤等异常考勤
6. **位置验证**: 验证员工是否在指定地点打卡
7. **考勤报表**: 生成各类考勤统计报表
8. **人事管理**: 为人事决策提供考勤数据支持
## 关联关系
### 主要关联表
1. **school_personnel**: 人员表(staff_id字段关联)
2. **school_campus**: 校区表(campus_id字段关联)
3. **school_salary**: 薪资表(考勤数据用于薪资计算)
4. **school_performance_records**: 绩效记录表(考勤影响绩效)
5. **school_sys_schedule**: 排班表(与排班计划对比)
6. **school_approval_process**: 审批流程表(请假审批关联)
### 关联说明
1. **人员关联**: 通过staff_id与人员表关联,确定考勤记录所属员工
2. **校区关联**: 通过campus_id关联校区,实现多校区考勤管理
3. **薪资关联**: 考勤数据作为薪资计算的重要依据
4. **绩效关联**: 考勤情况影响员工绩效评估
5. **排班关联**: 与排班计划对比,判断考勤是否正常
6. **审批关联**: 请假等需要审批的考勤状态与审批流程关联
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**:
- staff_id(员工关联查询)
- campus_id(校区关联查询)
3. **普通索引**:
- attendance_date(考勤日期查询)
- status(考勤状态筛选)
- created_at(创建时间排序)
4. **复合索引**:
- (staff_id, attendance_date)(员工+日期查询)
- (campus_id, attendance_date)(校区+日期查询)
- (attendance_date, status)(日期+状态查询)
- (staff_id, status, attendance_date)(员工+状态+日期查询)
## 注意事项
1. **时间逻辑**: check_in_time应早于check_out_time
2. **请假时间**: 请假状态时leave_start_time和leave_end_time必须有值
3. **状态一致性**: 考勤状态需要与时间字段保持逻辑一致
4. **唯一性约束**: 同一员工同一天只能有一条考勤记录
5. **坐标验证**: 打卡坐标需要在允许的范围内
6. **数据完整性**: 签到时间为必填,签退时间可为空(未签退)
7. **状态自动判断**: 系统应根据时间自动判断迟到、早退等状态
8. **异常处理**: 需要处理跨天打卡、忘记打卡等异常情况
9. **权限控制**: 员工只能查看自己的考勤记录
10. **数据备份**: 考勤数据涉及薪资计算,需要定期备份

77
niucloud/databasedoc/school_campus.md

@ -0,0 +1,77 @@
# school_campus 表文档
## 表概述
**表名**: school_campus
**功能**: 校区信息管理表,用于存储和管理学校各个校区的基本信息、地理位置、状态等核心数据,是整个教务系统的基础数据表。
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键ID
campus_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 校区名称
campus_address varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 校区地址
campus_preview_image varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 校区预览图,存储图片路径
campus_coordinates varchar(512) utf8mb4_general_ci YES NULL select,insert,update,references 校区坐标,格式为经度,纬度
campus_introduction text utf8mb4_general_ci YES NULL select,insert,update,references 校区介绍
campus_status tinyint NULL YES 1 select,insert,update,references 校区状态:0-禁用,1-启用
create_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 校区创建时间
update_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 校区更新时间
delete_time int NULL NO 0 select,insert,update,references 逻辑删除字段,0表示未删除,非空表示已删除
```
## 功能用途
### 主要功能
1. **校区基础信息管理**: 存储校区名称、地址、介绍等基本信息
2. **地理位置管理**: 通过坐标字段支持地图定位和导航功能
3. **校区展示**: 支持校区预览图片展示,用于宣传和介绍
4. **状态控制**: 支持校区启用/禁用状态管理
5. **数据完整性**: 提供软删除机制,保证数据的完整性和可追溯性
### 业务场景
- 多校区学校的校区信息管理
- 学生选择校区时的信息展示
- 校区相关的课程、教师、学生数据关联
- 校区地理位置查询和导航
- 校区宣传和介绍展示
- 系统数据按校区进行分类管理
## 关联关系
### 直接关联表
1. **school_student**: 通过campus_id字段关联学生所属校区
2. **school_teacher**: 通过campus_id字段关联教师所属校区
3. **school_course**: 通过campus_id字段关联课程开设校区
4. **school_classroom**: 通过campus_id字段关联教室所属校区
5. **school_department**: 通过campus_id字段关联院系所属校区
### 间接关联表
1. **school_class**: 通过校区间接关联班级信息
2. **school_schedule**: 通过校区间接关联课程安排
3. **school_exam**: 通过校区间接关联考试安排
4. **school_fee**: 通过校区间接关联费用管理
### 关联说明
- `id`字段作为主键,在多个业务表中作为campus_id外键引用
- 校区是整个教务系统的基础维度,几乎所有业务数据都与校区相关
- 支持多校区独立管理,也支持跨校区数据统计分析
- 校区状态影响相关业务数据的可用性
## 索引建议
- 主键索引:id(自动创建)
- 唯一索引:campus_name(校区名称唯一性)
- 普通索引:campus_status(按状态查询活跃校区)
- 普通索引:delete_time(软删除查询)
- 复合索引:campus_status + delete_time(查询有效校区)
- 普通索引:create_time(按创建时间排序)
## 注意事项
1. **数据完整性**: 校区是基础数据,删除前需要检查关联的业务数据
2. **软删除**: 使用delete_time字段实现软删除,避免影响历史数据
3. **坐标格式**: campus_coordinates字段建议使用标准的"经度,纬度"格式
4. **图片路径**: campus_preview_image存储相对路径,需要配合文件服务使用
5. **状态一致性**: campus_status和delete_time需要保持逻辑一致性
6. **唯一性约束**: 校区名称应该保持唯一性,避免重复
7. **时区处理**: timestamp字段需要注意时区设置和显示
8. **级联影响**: 校区状态变更会影响所有关联的业务数据可用性

93
niucloud/databasedoc/school_campus_pay.md

@ -0,0 +1,93 @@
# school_campus_pay 表文档
## 表概述
**表名**: school_campus_pay
**功能**: 校区支付配置表,用于管理各校区独立的支付参数和密钥配置,包括微信支付商户号、API密钥、证书等,支持多校区支付、密钥管理和支付安全,为学校提供分校区的支付配置和财务管理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
campus_id int NULL NO UNI NULL select,insert,update,references 校区id
mchid varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 商户号
pay_sign_key varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references APIv3密钥
apiclient_key varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 商户私钥
apiclient_cert varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 商户公钥
wx_pay_key varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 微信支付公钥
wx_pay_key_id varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 微信支付公钥ID
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
- **校区支付配置**: 管理各校区独立的支付参数和密钥配置
- **微信支付集成**: 存储微信支付相关的商户号、密钥等配置信息
- **支付安全管理**: 管理支付过程中的各种密钥和证书
- **多校区支付**: 支持不同校区使用不同的支付配置
- **支付参数管理**: 统一管理支付接口所需的各种参数
- **密钥轮换**: 支持支付密钥的更新和轮换
- **支付渠道配置**: 配置不同支付渠道的参数
- **安全认证**: 管理支付过程中的安全认证信息
- **配置版本管理**: 跟踪支付配置的变更历史
### 业务场景
- **校区收费**: 各校区独立进行学费、杂费等收费操作
- **在线支付**: 学员通过微信等渠道在线支付费用
- **退费处理**: 处理学员退费时的支付渠道配置
- **分校区结算**: 不同校区的收入分别结算到不同账户
- **支付配置更新**: 定期更新支付密钥和证书
- **多渠道支付**: 支持微信、支付宝等多种支付方式
- **支付安全审计**: 定期检查支付配置的安全性
- **异常支付处理**: 处理支付异常时的配置问题
- **财务对账**: 基于校区维度进行财务对账
## 关联关系
### 主要关联表
- `school_campus`: 校区表 (campus_id字段关联)
- `school_pay`: 支付表 (支付配置关联)
- `school_order`: 订单表 (支付处理关联)
- `school_member`: 会员表 (支付用户关联)
- `school_sys_config`: 系统配置表 (全局支付配置)
- `school_account_log`: 账户日志表 (支付日志关联)
- `school_pay_refund`: 退款表 (退款配置关联)
### 关联说明
- **校区关联**: campus_id关联校区表,实现校区级别的支付配置
- **支付关联**: 支付操作时根据校区获取对应的支付配置
- **订单关联**: 订单支付时使用对应校区的支付配置
- **用户关联**: 用户支付时根据所属校区使用相应配置
- **配置关联**: 与全局支付配置形成层级关系
- **日志关联**: 支付操作产生的日志记录使用的配置信息
- **退款关联**: 退款操作使用相同的支付配置进行处理
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**:
- campus_id (校区唯一配置)
- **业务索引**:
- mchid (商户号查询)
- created_at (创建时间查询)
- updated_at (更新时间查询)
- **复合索引**:
- (campus_id, mchid) (校区商户查询)
## 注意事项
- **校区唯一性**: 每个校区只能有一套支付配置,campus_id必须唯一
- **密钥安全**: 所有密钥字段需要加密存储,防止泄露
- **配置完整性**: 所有支付相关字段都不能为空,确保支付功能正常
- **密钥格式**: 各种密钥和证书需要符合微信支付的格式要求
- **权限控制**: 支付配置的查看和修改需要严格的权限控制
- **配置验证**: 保存配置前需要验证密钥和证书的有效性
- **备份恢复**: 支付配置需要定期备份,支持快速恢复
- **变更记录**: 配置变更需要记录操作人员和变更时间
- **测试验证**: 配置更新后需要进行支付测试验证
- **监控告警**: 支付配置异常时需要及时告警
- **合规要求**: 支付配置需要符合相关法规和安全标准
- **密钥轮换**: 定期更换支付密钥,提高安全性
- **环境隔离**: 测试环境和生产环境的支付配置需要严格隔离
- **访问日志**: 记录支付配置的访问和使用日志
- **异常处理**: 支付配置错误时需要有降级和容错机制

89
niucloud/databasedoc/school_campus_person_role.md

@ -0,0 +1,89 @@
# school_campus_person_role 表文档
## 表概述
**表名**: school_campus_person_role
**功能**: 校区人员角色关系表,用于管理人员在不同校区的角色分配和权限设置,支持多校区权限管理和组织架构维护
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 关系编号
campus_id int NULL NO 0 select,insert,update,references 校区ID
person_id int NULL NO NULL select,insert,update,references 人员ID
role_id int NULL NO NULL select,insert,update,references 角色ID
dept_id int NULL YES NULL select,insert,update,references 部门表
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
deleted_at int NULL NO 0 select,insert,update,references 逻辑删除时间
phone varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references
task_num int NULL NO 0 select,insert,update,references
```
## 功能用途
### 主要功能
- **人员角色分配**: 管理人员在不同校区的角色分配和权限设置
- **多校区权限管理**: 支持人员在多个校区拥有不同角色和权限
- **部门关联管理**: 关联人员在特定校区的部门归属关系
- **任务数量统计**: 记录人员在该校区角色下的任务数量
- **联系方式管理**: 存储人员在该校区的联系电话信息
- **时间追踪**: 记录角色分配的创建和更新时间
- **逻辑删除支持**: 支持逻辑删除功能,保留历史角色分配记录
- **权限继承**: 支持角色权限的继承和覆盖机制
### 业务场景
- **多校区管理**: 集团化运营中人员在不同校区担任不同角色
- **权限分级管理**: 根据校区和角色进行细粒度的权限控制
- **人员调动**: 处理人员在校区间的调动和角色变更
- **临时授权**: 为人员在特定校区临时分配角色和权限
- **部门协作**: 管理跨部门、跨校区的人员协作关系
- **任务分配**: 基于校区角色进行任务的分配和管理
- **绩效考核**: 按校区和角色维度进行人员绩效评估
- **组织架构管理**: 维护复杂的多校区组织架构关系
- **应急响应**: 在紧急情况下快速调配人员和权限
## 关联关系
### 主要关联表
- **school_campus**: 校区表,关联人员所属的校区信息
- **school_personnel**: 人员表,关联具体的人员基本信息
- **school_sys_role**: 系统角色表,关联人员被分配的角色
- **school_department**: 部门表,关联人员在校区的部门归属
- **school_sys_user**: 系统用户表,关联人员的登录账户信息
- **school_permission**: 权限表,通过角色关联具体的权限设置
- **school_task**: 任务表,关联人员在该角色下的具体任务
- **school_organization**: 组织架构表,关联校区的组织结构
### 关联说明
- `campus_id` 关联 `school_campus.id`,标识人员所属的校区
- `person_id` 关联 `school_personnel.id`,标识被分配角色的人员
- `role_id` 关联 `school_sys_role.id`,标识人员被分配的角色
- `dept_id` 关联 `school_department.id`,标识人员在校区的部门归属
- 与权限系统关联,实现基于校区和角色的权限控制
- 与工作流系统关联,支持角色变更的审批流程
- 与考勤系统关联,按校区角色进行考勤管理
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **校区索引**: `INDEX idx_campus_id (campus_id)` - 支持按校区查询人员角色
- **人员索引**: `INDEX idx_person_id (person_id)` - 支持按人员查询角色分配
- **角色索引**: `INDEX idx_role_id (role_id)` - 支持按角色查询人员
- **部门索引**: `INDEX idx_dept_id (dept_id)` - 支持按部门查询
- **电话索引**: `INDEX idx_phone (phone)` - 支持按联系方式查询
- **时间索引**: `INDEX idx_created_at (created_at)` - 支持按创建时间查询
- **逻辑删除索引**: `INDEX idx_deleted_at (deleted_at)` - 支持逻辑删除查询
- **复合索引**: `INDEX idx_campus_person (campus_id, person_id)` - 支持校区和人员的复合查询
- **唯一索引**: `UNIQUE INDEX uk_campus_person_role (campus_id, person_id, role_id, deleted_at)` - 防止重复分配
## 注意事项
- **权限冲突检查**: 分配角色时需要检查权限冲突,避免权限过度集中
- **角色继承规则**: 明确角色权限的继承和覆盖规则,避免权限混乱
- **数据一致性**: 确保人员、校区、角色数据的一致性和完整性
- **权限审计**: 定期审计人员的角色分配,确保权限的合理性
- **批量操作控制**: 对批量角色分配操作进行严格控制和审批
- **历史记录保留**: 保留角色分配的历史记录,支持权限变更的追溯
- **并发控制**: 在高并发环境下确保角色分配的原子性
- **权限缓存**: 合理使用权限缓存,提高系统性能
- **安全控制**: 严格控制超级管理员等高权限角色的分配
- **监控告警**: 建立权限异常变更的监控告警机制

98
niucloud/databasedoc/school_chat_friends.md

@ -0,0 +1,98 @@
# school_chat_friends 表文档
## 表概述
**表名**: school_chat_friends
**功能**: 聊天好友关系管理表,用于管理员工与学生客户资源之间的聊天关系和消息状态
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references
personnel_id int NULL NO NULL select,insert,update,references 员工人力资源表id
customer_resources_id int NULL NO NULL select,insert,update,references 学生资源表id
unread_count_personnel int NULL NO 0 select,insert,update,references 员工未读消息数量|默认0
unread_count_customer_resources int NULL NO 0 select,insert,update,references 学生端未读消息数量|默认0
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 添加时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
delete_time int NULL NO 0 select,insert,update,references 逻辑删除时间
```
## 功能用途
### 主要功能
- **好友关系管理**: 建立和维护员工与学生客户之间的聊天关系
- **消息状态跟踪**: 分别跟踪员工端和学生端的未读消息数量
- **聊天会话管理**: 管理一对一的聊天会话和对话历史
- **消息计数器**: 实时更新双方的未读消息统计
- **关系状态维护**: 维护聊天关系的有效性和活跃状态
- **消息提醒**: 支持基于未读消息数量的提醒功能
- **会话列表**: 为聊天应用提供好友列表和会话列表
- **消息同步**: 确保双方消息状态的同步更新
- **关系删除**: 支持聊天关系的逻辑删除和恢复
### 业务场景
- **客户咨询**: 学生客户向销售或客服人员进行课程咨询
- **学习指导**: 教师与学员进行一对一的学习指导和答疑
- **课程服务**: 班主任与学员进行课程安排和学习跟进
- **售后服务**: 客服人员处理学员的投诉和建议
- **招生沟通**: 招生顾问与潜在客户进行招生宣传和答疑
- **家长沟通**: 教师与学员家长进行学习情况沟通
- **紧急通知**: 学校向学员发送紧急通知和重要信息
- **作业辅导**: 教师为学员提供课后作业指导
- **考试答疑**: 考前为学员提供专门的答疑服务
## 关联关系
### 主要关联表
- `school_personnel`: 人员表(员工信息)
- `school_customer_resources`: 客户资源表(学生客户信息)
- `school_chat_messages`: 聊天消息表(具体的聊天消息)
- `school_member`: 会员表(正式学员信息)
- `school_sys_user`: 系统用户表(用户登录信息)
- `school_course`: 课程表(相关课程信息)
- `school_class`: 班级表(班级关联信息)
- `school_campus`: 校区表(所属校区)
### 关联说明
- **员工关联**: personnel_id关联到school_personnel表的员工信息
- **客户关联**: customer_resources_id关联到客户资源表
- **消息关联**: 与聊天消息表形成一对多关系
- **用户关联**: 通过人员和客户资源关联到系统用户
- **业务关联**: 可能关联到具体的课程、班级等业务对象
- **校区关联**: 通过人员和客户资源间接关联到校区
- **时间关联**: 记录关系建立和更新的时间信息
## 索引建议
- **主键索引**: id(已存在)
- **外键索引**:
- personnel_id(员工查询)
- customer_resources_id(客户查询)
- **复合索引**:
- (personnel_id, customer_resources_id)(唯一好友关系)
- (personnel_id, delete_time)(员工有效关系查询)
- (customer_resources_id, delete_time)(客户有效关系查询)
- **时间索引**:
- created_at(创建时间查询)
- updated_at(更新时间查询)
- **状态索引**: delete_time(逻辑删除查询)
- **消息统计索引**:
- unread_count_personnel(员工未读消息)
- unread_count_customer_resources(客户未读消息)
## 注意事项
- **唯一性约束**: 确保同一员工与同一客户只能有一个有效的聊天关系
- **消息计数准确性**: 保证未读消息计数的准确性和实时性
- **逻辑删除**: 使用delete_time字段进行逻辑删除,保留历史记录
- **权限控制**: 严格控制聊天关系的建立和访问权限
- **数据同步**: 确保消息状态与实际聊天记录的同步
- **性能优化**: 大量聊天关系时需要优化查询性能
- **消息清理**: 定期清理过期的聊天关系和消息记录
- **隐私保护**: 保护聊天关系和消息内容的隐私安全
- **并发控制**: 处理消息计数更新时的并发问题
- **关系恢复**: 支持已删除聊天关系的恢复功能
- **监控告警**: 监控异常的聊天行为和消息量
- **备份策略**: 重要的聊天关系数据需要定期备份
- **消息推送**: 基于未读消息数量进行消息推送
- **会话管理**: 合理管理长期不活跃的聊天会话
- **数据迁移**: 支持聊天关系数据的迁移和同步

129
niucloud/databasedoc/school_chat_messages.md

@ -0,0 +1,129 @@
# school_chat_messages 表文档
## 表概述
**表名**: school_chat_messages
**功能**: 聊天消息管理表,用于记录和管理系统内部的即时通讯消息,支持员工与学员、员工之间的多种类型消息交流,包括文本、图片、系统通知等,为教育机构提供完整的内部沟通平台
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references
from_type enum('personnel','customer','system') utf8mb4_general_ci NO NULL select,insert,update,references 发送者类型|personnel=员工,customer=学生(客户)system(系统消息)
from_id int NULL NO NULL select,insert,update,references 发送者ID(员工/学生)根据from_type进行判断为presonnel时,必然是员工id,为customer时必然是学生id
to_id int NULL NO MUL NULL select,insert,update,references 接收者ID(员工/学生)根据from_type进行判断为presonnel时,必然是员工id,为customer时必然是学生id
to_type enum('personnel','customer','member') utf8mb4_general_ci NO customer select,insert,update,references 接收者类型
friend_id int NULL NO NULL select,insert,update,references 关联chat_friends表id
message_type enum('text','img','system','notification','homework','feedback','reminder','order','student_courses','person_course_schedule') utf8mb4_general_ci YES text select,insert,update,references
content text utf8mb4_general_ci NO NULL select,insert,update,references 文本内容(JSON 格式扩展字段)
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 添加时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
delete_time int NULL NO 0 select,insert,update,references 逻辑删除时间
is_read tinyint(1) NULL YES 0 select,insert,update,references 是否已读 0-未读 1-已读
read_time timestamp NULL YES NULL select,insert,update,references 已读时间
title varchar(255) utf8mb4_general_ci YES select,insert,update,references 消息标题
business_id int NULL YES NULL select,insert,update,references 关联业务ID
business_type varchar(50) utf8mb4_general_ci YES select,insert,update,references 业务类型
```
## 功能用途
### 主要功能
- **多类型消息支持**: 支持文本、图片、系统通知、作业、反馈等多种消息类型
- **用户身份管理**: 区分员工、学员、系统等不同发送者和接收者类型
- **好友关系维护**: 通过friend_id关联聊天好友关系
- **消息状态跟踪**: 跟踪消息的已读状态和阅读时间
- **业务消息关联**: 支持与具体业务对象的关联,如课程、订单等
- **软删除机制**: 支持消息的逻辑删除,保护数据完整性
- **消息标题管理**: 支持消息标题,便于消息分类和展示
- **时间戳记录**: 完整记录消息的创建和更新时间
### 业务场景
- **师生沟通**: 教师与学员之间的课程咨询和学习交流
- **作业布置**: 教师向学员布置和批改作业
- **学习反馈**: 学员向教师反馈学习情况和问题
- **课程提醒**: 系统自动发送课程安排和变更通知
- **订单通知**: 支付成功、课程购买等订单相关通知
- **系统公告**: 重要系统公告和通知的推送
- **客服咨询**: 学员与客服人员的在线咨询
- **内部协作**: 员工之间的工作协作和信息交流
- **家校沟通**: 教师与家长的沟通交流
- **紧急通知**: 紧急情况下的即时通知和提醒
## 关联关系
### 主要关联表
- **school_chat_friends**: 聊天好友表,通过friend_id关联好友关系
- **school_personnel**: 人员表,当from_type或to_type为personnel时关联
- **school_student**: 学员表,当from_type或to_type为customer时关联
- **school_member**: 会员表,当to_type为member时关联
- **school_course**: 课程表,当business_type为课程相关时关联
- **school_pay**: 支付表,当business_type为订单相关时关联
- **school_person_course_schedule**: 个人课程安排表,当message_type为person_course_schedule时关联
- **school_student_courses**: 学员课程表,当message_type为student_courses时关联
### 关联说明
- 通过from_id和to_id建立消息发送者和接收者的关联
- 通过friend_id关联具体的好友关系记录
- 通过business_id和business_type关联具体的业务对象
- 支持多种用户类型之间的消息交流
- 消息类型决定了消息的展示方式和处理逻辑
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 接收者索引(用于查询接收的消息)
INDEX idx_to_id (to_id)
-- 好友关系索引(用于查询好友间的消息)
INDEX idx_friend_id (friend_id)
-- 发送者索引(用于查询发送的消息)
INDEX idx_from_id (from_id)
-- 已读状态索引(用于查询未读消息)
INDEX idx_is_read (is_read)
-- 创建时间索引(用于按时间排序)
INDEX idx_created_at (created_at)
-- 删除时间索引(用于软删除查询)
INDEX idx_delete_time (delete_time)
-- 消息类型索引(用于按类型查询)
INDEX idx_message_type (message_type)
-- 业务关联索引(用于查询业务相关消息)
INDEX idx_business (business_type, business_id)
-- 复合索引(接收者和已读状态)
INDEX idx_to_read (to_id, is_read)
-- 复合索引(好友和时间)
INDEX idx_friend_time (friend_id, created_at)
-- 复合索引(发送者类型和ID)
INDEX idx_from_type_id (from_type, from_id)
-- 复合索引(接收者类型和ID)
INDEX idx_to_type_id (to_type, to_id)
```
## 注意事项
- **消息安全**: 确保消息内容的安全性,防止敏感信息泄露
- **权限控制**: 严格控制消息的发送和接收权限
- **内容审核**: 建立消息内容的审核机制,防止不当内容
- **存储优化**: 大量消息数据需要考虑存储优化和归档策略
- **实时性**: 确保消息的实时推送和接收
- **消息格式**: JSON格式的content字段需要规范化处理
- **文件管理**: 图片等文件类型消息需要配套的文件存储方案
- **消息限制**: 设置合理的消息长度和发送频率限制
- **数据清理**: 定期清理过期的已删除消息数据
- **备份策略**: 重要消息需要建立备份和恢复机制
- **性能监控**: 监控消息系统的性能和响应时间
- **用户体验**: 优化消息的展示和交互体验
- **离线消息**: 处理用户离线时的消息存储和推送
- **消息统计**: 建立消息发送和接收的统计分析
- **异常处理**: 处理消息发送失败和网络异常情况

98
niucloud/databasedoc/school_class.md

@ -0,0 +1,98 @@
# school_class 表文档
## 表概述
**表名**: school_class
**功能**: 班级信息管理表,存储教务系统中所有班级的基本信息、教练配置、课程关联、学员管理等核心数据
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 班级编号
campus_id int NULL NO NULL select,insert,update,references 校区ID
campus_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 校区名称
class_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 班级名称
head_coach varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 班级主教练
age_group varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 班级授课年龄段
class_type varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 班级类型
assistant_coach varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 班级助教
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
deleted_at varchar(255) utf8mb4_general_ci YES 0 select,insert,update,references 逻辑删除时间
status tinyint NULL YES 1 select,insert,update,references 班级状态(1开启 2关闭)
sort_order int NULL NO NULL select,insert,update,references 班级排序
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 班级备注
educational_id int NULL NO 0 select,insert,update,references 教务id
```
## 功能用途
### 主要功能
1. **班级基础管理**: 存储班级名称、编号、类型、状态等基本信息
2. **教练配置管理**: 配置主教练(head_coach)和助理教练(assistant_coach)
3. **课程关联管理**: 通过course_id关联具体课程信息
4. **学员容量管理**: 设置班级最大学员数量限制
5. **时间周期管理**: 管理班级开始和结束时间
6. **校区归属管理**: 通过campus_id关联所属校区
7. **班级状态控制**: 管理班级的启用/禁用状态
8. **排序展示管理**: 通过sort字段控制班级显示顺序
### 业务场景
1. **班级创建**: 新建班级,配置基本信息和教练
2. **学员报名**: 学员选择班级进行课程学习
3. **排课管理**: 为班级安排具体的上课时间和地点
4. **教练调配**: 根据需要调整班级的主教练和助理教练
5. **容量控制**: 限制班级学员数量,避免超员
6. **班级调整**: 修改班级信息、合并或拆分班级
7. **数据统计**: 统计班级学员数量、课程进度等信息
8. **校区管理**: 不同校区的班级独立管理
## 关联关系
### 主要关联表
1. **school_course**: 课程表(course_id字段关联)
2. **school_personnel**: 人员表(head_coach, assistant_coach关联)
3. **school_campus**: 校区表(campus_id字段关联)
4. **school_class_member**: 班级学员关联表
5. **school_schedule**: 排课表(班级排课关联)
6. **school_class_course**: 班级课程关联表
7. **school_attendance**: 考勤表(班级考勤统计)
8. **school_homework**: 作业表(班级作业管理)
### 关联说明
1. **课程关联**: 通过course_id与课程表关联,确定班级所属课程
2. **教练关联**: head_coach和assistant_coach关联人员表,配置班级教练
3. **校区关联**: 通过campus_id关联校区,实现多校区班级管理
4. **学员关联**: 通过班级学员关联表管理班级内的学员
5. **排课关联**: 班级与排课表关联,安排具体上课时间
6. **教学关联**: 与考勤、作业等教学管理功能关联
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**:
- course_id(课程关联查询)
- campus_id(校区关联查询)
- head_coach(主教练查询)
- assistant_coach(助理教练查询)
3. **普通索引**:
- class_name(班级名称搜索)
- class_type(班级类型筛选)
- status(状态筛选)
- sort(排序查询)
- create_time(创建时间排序)
4. **复合索引**:
- (campus_id, status)(校区+状态查询)
- (course_id, status)(课程+状态查询)
- (status, sort)(状态+排序查询)
## 注意事项
1. **容量控制**: max_students字段需要与实际报名人数进行校验
2. **教练配置**: 主教练和助理教练不能为同一人
3. **时间逻辑**: start_time不能晚于end_time
4. **软删除**: 使用deleted_at字段实现软删除,保护历史数据
5. **状态管理**: 班级状态变更需要考虑已报名学员的影响
6. **课程关联**: course_id变更需要验证课程的有效性
7. **校区归属**: campus_id变更需要考虑教练和学员的校区匹配
8. **排序维护**: sort字段需要保证在同一校区内的唯一性和连续性
9. **教练权限**: 教练只能管理自己负责的班级
10. **数据一致性**: 班级删除时需要处理相关的学员、排课等数据

112
niucloud/databasedoc/school_class_personnel_rel.md

@ -0,0 +1,112 @@
# school_class_personnel_rel 表文档
## 表概述
**表名**: school_class_personnel_rel
**功能**: 班级人员关联表,用于管理班级与教学人员之间的多对多关联关系,支持主教练、助教、教务等不同角色的分工管理,记录人员在班级中的加入时间、离开时间和状态信息,为班级教学管理和人员调配提供完整的关联数据支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
class_id int NULL NO NULL select,insert,update,references 班级id
campus_id int NULL YES NULL select,insert,update,references 校区id
source_id int NULL YES NULL select,insert,update,references 数据id
join_time int NULL YES NULL select,insert,update,references 加入时间
out_time int NULL YES NULL select,insert,update,references 离开时间
status tinyint NULL YES NULL select,insert,update,references 状态1正常2请假
create_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
update_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
role varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 主教练coach,asistantcoach助教,affairs教务
```
## 功能用途
### 主要功能
- **班级人员关联**: 建立班级与教师、教务等人员的多对多关联关系
- **角色分工管理**: 通过role字段区分主教练、助教、教务等不同角色
- **人员状态跟踪**: 管理人员在班级中的状态(正常、请假等)
- **时间周期管理**: 记录人员加入和离开班级的具体时间
- **校区关联管理**: 关联人员所属的校区信息
- **数据源追踪**: 通过source_id字段追踪人员数据的来源
- **人员变更记录**: 完整记录班级人员的变更历史
- **多角色支持**: 支持一个人员在同一班级担任多个角色
- **时间段管理**: 支持人员在不同时间段的角色变更
### 业务场景
- **班级组建**: 新班级创建时分配主教练、助教等教学人员
- **人员调配**: 根据教学需要调整班级的教学人员配置
- **请假管理**: 教师请假时更新状态,安排代课教师
- **角色变更**: 助教晋升为主教练,或教务转为教学岗位
- **跨校区教学**: 教师在多个校区的不同班级任教
- **临时支援**: 临时安排教师支援其他班级的教学工作
- **人员考核**: 统计教师在各班级的任教情况和时长
- **排课管理**: 根据班级人员配置进行课程安排
- **工作量统计**: 统计教师的班级数量和教学工作量
- **人员流动**: 跟踪教师在不同班级间的流动情况
## 关联关系
### 主要关联表
- **school_class**: 班级表,通过class_id字段关联
- **school_campus**: 校区表,通过campus_id字段关联
- **school_personnel**: 人员表,通过source_id字段关联
- **school_course**: 课程表,班级关联的课程信息
- **school_schedule**: 排课表,根据班级人员安排课程
- **school_attendance**: 考勤表,记录班级人员的考勤情况
- **school_sys_user**: 系统用户表,人员可能对应系统用户
### 关联说明
- **班级关联**: 通过class_id与school_class表建立多对一关系
- **校区关联**: 通过campus_id与school_campus表建立多对一关系
- **人员关联**: 通过source_id与school_personnel表建立多对一关系
- **课程关联**: 班级人员配置影响课程的教学安排
- **排课关联**: 班级人员信息是排课的重要依据
- **考勤关联**: 班级人员的考勤记录与此表相关
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 班级ID索引(用于查询班级人员)
INDEX idx_class_id (class_id)
-- 校区ID索引(用于按校区查询)
INDEX idx_campus_id (campus_id)
-- 数据源ID索引(用于查询人员班级)
INDEX idx_source_id (source_id)
-- 状态索引(用于查询有效人员)
INDEX idx_status (status)
-- 角色索引(用于按角色查询)
INDEX idx_role (role)
-- 复合索引(用于班级人员查询)
INDEX idx_class_status (class_id, status)
-- 复合索引(用于人员班级查询)
INDEX idx_source_class (source_id, class_id)
-- 时间范围索引(用于查询在职人员)
INDEX idx_time_range (join_time, out_time)
```
## 注意事项
- **角色规范**: role字段应使用标准的角色代码(coach、assistantcoach、affairs)
- **时间逻辑**: join_time应小于out_time,out_time为空表示仍在职
- **状态一致性**: 人员状态变更应与实际工作状态保持一致
- **重复检查**: 避免同一人员在同一班级同一时间段重复分配
- **权限控制**: 不同角色的人员应有不同的班级管理权限
- **数据完整性**: source_id应确保在school_personnel表中存在
- **校区一致性**: 人员所属校区应与班级所属校区保持一致
- **时间精度**: 时间字段应保证足够的精度,支持精确的时间管理
- **状态流转**: 人员状态变更应遵循合理的流转规则
- **历史记录**: 重要的人员变更应保留完整的历史记录
- **并发控制**: 人员分配操作需要考虑并发安全问题
- **业务规则**: 主教练不能为空,每个班级至少要有一个主教练
- **离职处理**: 人员离职时应及时更新out_time字段
- **数据清理**: 定期清理过期的人员关联记录
- **审计追踪**: 重要的人员变更操作应记录操作日志

114
niucloud/databasedoc/school_class_resources_rel.md

@ -0,0 +1,114 @@
# school_class_resources_rel 表文档
## 表概述
**表名**: school_class_resources_rel
**功能**: 班级学员关联表,用于管理班级与学员之间的多对多关联关系,支持正式学员和临时学员的分类管理,记录学员在班级中的加入时间、离开时间和状态变化,为班级学员管理、学籍管理和学员流动追踪提供完整的数据支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
class_id int NULL NO NULL select,insert,update,references 班级id
resource_id int NULL YES NULL select,insert,update,references 资源id
campus_id int NULL YES NULL select,insert,update,references 校区id
source_id int NULL YES NULL select,insert,update,references 数据id
source_type varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 数据资源类型student是学员,temporary是非正式学员
join_time int NULL YES NULL select,insert,update,references 加入时间
out_time int NULL YES NULL select,insert,update,references 离开时间
status tinyint NULL YES NULL select,insert,update,references 状态1新入2续费3过期4转班5转校
create_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
update_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **班级学员关联**: 建立班级与学员之间的多对多关联关系
- **学员类型管理**: 通过source_type区分正式学员(student)和临时学员(temporary)
- **学员状态跟踪**: 管理学员在班级中的状态(新入、续费、过期、转班、转校)
- **时间周期管理**: 记录学员加入和离开班级的具体时间
- **校区关联管理**: 关联学员所属的校区信息
- **学员流动追踪**: 完整记录学员在不同班级间的流动历史
- **学籍状态管理**: 管理学员的学籍状态和变更记录
- **多校区支持**: 支持学员在不同校区间的转移和管理
- **数据源追踪**: 通过source_id字段追踪学员数据的来源
### 业务场景
- **学员报名入班**: 新学员报名后分配到相应的班级
- **学员续费管理**: 学员续费后更新在班级中的状态
- **学员转班操作**: 学员因各种原因需要转到其他班级
- **学员转校管理**: 学员在不同校区间的转移管理
- **学员退学处理**: 学员退学时更新离开时间和状态
- **试听学员管理**: 临时学员的试听课程管理
- **班级人数统计**: 统计各班级的学员人数和构成
- **学员流动分析**: 分析学员在不同班级间的流动情况
- **学籍状态查询**: 查询学员的当前学籍状态和历史记录
- **收费管理**: 根据学员在班级的状态进行收费管理
## 关联关系
### 主要关联
- **school_class**: 关联班级信息,获取班级基本信息、课程信息和状态
- **school_member**: 通过source_id关联学员信息,获取学员基本资料
- **school_campus**: 关联校区信息,支持多校区学员管理
### 间接关联
- **school_course**: 通过班级关联课程信息,了解学员所学课程
- **school_personnel**: 通过班级关联教师信息,了解学员的任课教师
- **school_contract**: 通过学员关联合同信息,管理学员的合同状态
- **school_pay**: 通过学员关联缴费信息,管理学员的缴费状态
- **school_attendance**: 关联考勤记录,跟踪学员的出勤情况
- **school_grade**: 关联成绩记录,跟踪学员的学习成绩
## 索引建议
### 主要索引
```sql
-- 班级学员查询索引
CREATE INDEX idx_class_student_class_id ON school_class_resources_rel(class_id);
-- 学员班级查询索引
CREATE INDEX idx_class_student_source ON school_class_resources_rel(source_type, source_id);
-- 校区学员查询索引
CREATE INDEX idx_class_student_campus_id ON school_class_resources_rel(campus_id);
-- 状态查询索引
CREATE INDEX idx_class_student_status ON school_class_resources_rel(status);
```
### 复合索引
```sql
-- 班级状态复合索引
CREATE INDEX idx_class_student_class_status ON school_class_resources_rel(class_id, status);
-- 学员状态复合索引
CREATE INDEX idx_class_student_source_status ON school_class_resources_rel(source_type, source_id, status);
-- 时间范围查询索引
CREATE INDEX idx_class_student_time_range ON school_class_resources_rel(join_time, leave_time);
-- 校区班级复合索引
CREATE INDEX idx_class_student_campus_class ON school_class_resources_rel(campus_id, class_id);
```
## 注意事项
### 数据完整性
- 确保class_id和source_id的有效性,避免无效关联
- 合理设置学员的加入和离开时间,确保时间逻辑正确
- 及时更新学员状态,保持数据的准确性
- 避免同一学员在同一时间段内重复加入同一班级
### 性能优化
- 定期清理历史的学员关联记录
- 合理使用索引提高查询效率
- 避免频繁的学员状态变更操作
- 对于大量学员的批量操作要注意性能影响
### 业务规则
- 学员在同一时间只能属于一个班级(除非支持多班级学习)
- 学员转班时需要正确处理原班级的离开时间和新班级的加入时间
- 删除班级时需要妥善处理相关的学员关联记录
- 临时学员和正式学员的管理规则可能不同,需要区别对待

108
niucloud/databasedoc/school_coach_performance.md

@ -0,0 +1,108 @@
# school_coach_performance 表文档
## 表概述
**表名**: school_coach_performance
**功能**: 教练绩效管理表,用于记录和管理教练人员的绩效考核数据,包括绩效金额、资源销售数量、绩效配置和算法等信息,为教练薪酬计算、绩效评估和激励管理提供数据支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
personnel_id int NULL YES NULL select,insert,update,references 人员ID
campus_id int NULL YES NULL select,insert,update,references 校区ID
performance_amount decimal(10,2) NULL YES NULL select,insert,update,references 绩效金额
new_resource_count int NULL YES NULL select,insert,update,references 新购买课程资源数量
renew_resource_count int NULL YES NULL select,insert,update,references 续费资源数量
performance_date date NULL YES NULL select,insert,update,references 绩效日期
performance_config varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 绩效配置
performance_algorithm varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 绩效算法
created_at timestamp NULL YES NULL select,insert,update,references 创建时间
updated_at timestamp NULL YES NULL select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **绩效金额管理**: 记录教练的绩效金额和奖金计算结果
- **资源销售统计**: 统计教练的新购买和续费资源销售数量
- **绩效配置管理**: 管理教练绩效考核的配置参数
- **算法规则应用**: 应用不同的绩效计算算法和规则
- **日期维度统计**: 按日期维度记录和统计绩效数据
- **校区绩效分析**: 支持按校区维度进行绩效分析
- **人员绩效跟踪**: 跟踪个人教练的绩效变化趋势
- **薪酬计算基础**: 为教练薪酬和奖金计算提供数据基础
### 业务场景
- **月度绩效考核**: 按月统计和考核教练的销售绩效
- **季度奖金计算**: 基于绩效数据计算季度奖金
- **年度绩效评估**: 进行年度绩效评估和排名
- **销售目标管理**: 设定和跟踪教练的销售目标完成情况
- **团队绩效比较**: 比较不同教练和团队的绩效表现
- **校区绩效分析**: 分析不同校区教练的绩效水平
- **绩效趋势分析**: 分析教练绩效的变化趋势
- **激励政策制定**: 基于绩效数据制定激励政策
- **培训需求识别**: 识别绩效较低教练的培训需求
- **薪酬结构优化**: 优化教练的薪酬结构和激励机制
## 关联关系
### 主要关联表
- **school_personnel**: 人员表,关联教练的基本信息
- **school_campus**: 校区表,关联教练所属的校区信息
- **school_performance_config**: 绩效配置表,关联绩效考核的配置规则
- **school_course**: 课程表,关联教练销售的课程资源
- **school_pay**: 支付表,关联教练销售产生的支付记录
- **school_contract**: 合同表,关联教练签署的销售合同
- **school_sales_performance**: 销售绩效表,可能存在关联的销售绩效数据
- **school_member**: 会员表,关联教练服务的会员客户
### 关联说明
- 通过personnel_id关联具体的教练人员信息
- 通过campus_id关联教练所属的校区
- 通过performance_config关联具体的绩效配置规则
- 绩效数据与教练的课程销售、合同签署等业务活动关联
- 支持多维度的绩效数据分析和统计
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 人员ID索引(用于查询特定教练的绩效)
INDEX idx_personnel_id (personnel_id)
-- 校区ID索引(用于按校区统计绩效)
INDEX idx_campus_id (campus_id)
-- 绩效日期索引(用于按时间查询和统计)
INDEX idx_performance_date (performance_date)
-- 创建时间索引(用于按创建时间排序)
INDEX idx_created_at (created_at)
-- 复合索引(人员和日期)
INDEX idx_personnel_date (personnel_id, performance_date)
-- 复合索引(校区和日期)
INDEX idx_campus_date (campus_id, performance_date)
-- 绩效金额索引(用于绩效排名)
INDEX idx_performance_amount (performance_amount)
```
## 注意事项
- **数据准确性**: 确保绩效数据的准确性,避免计算错误
- **算法一致性**: 保持绩效计算算法的一致性和公平性
- **时间维度**: 注意绩效统计的时间维度和周期设置
- **配置管理**: 妥善管理绩效配置的变更和版本控制
- **数据安全**: 绩效数据涉及薪酬信息,需要严格的权限控制
- **审计追踪**: 建立绩效数据的审计追踪机制
- **异常处理**: 处理绩效计算中的异常情况和边界条件
- **数据备份**: 定期备份重要的绩效数据
- **性能优化**: 大量数据时需要优化查询和统计性能
- **报表生成**: 支持各种绩效报表的生成和导出
- **历史数据**: 妥善保存历史绩效数据,支持趋势分析
- **多维分析**: 支持按人员、校区、时间等多维度分析
- **激励透明**: 确保绩效计算过程的透明性和可解释性
- **定期审核**: 定期审核绩效数据和计算规则的合理性

120
niucloud/databasedoc/school_communication_records.md

@ -0,0 +1,120 @@
# school_communication_records 表文档
## 表概述
**表名**: school_communication_records
**功能**: 沟通记录管理表,用于记录和管理员工与各类资源对象之间的沟通交流信息,支持多种沟通方式和结果跟踪,为客户关系管理和服务质量监控提供完整的沟通历史记录
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 沟通记录编号
staff_id int NULL NO NULL select,insert,update,references 员工ID
resource_id int NULL NO NULL select,insert,update,references 资源ID
resource_type varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 资源类型(如设备、文件、系统等)
communication_type enum('phone','email','meeting','other') utf8mb4_general_ci NO NULL select,insert,update,references 沟通类型: phone-电话, email-邮件, meeting-会议, other-其他
communication_result enum('success','failure','pending') utf8mb4_general_ci NO NULL select,insert,update,references 沟通结果: success-成功, failure-失败, pending-待定
communication_time datetime NULL NO NULL select,insert,update,references 沟通时间
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 备注
tag enum('high','medium','low') utf8mb4_general_ci YES NULL select,insert,update,references 标签:|默认null high-高, medium-中, low-低
business_id int NULL YES NULL select,insert,update,references 关联的业务ID
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
- **沟通记录管理**: 完整记录各种沟通交流的详细信息和内容
- **参与者跟踪**: 通过user_id和target_id跟踪沟通的参与双方
- **沟通类型分类**: 通过type字段区分不同类型的沟通方式
- **内容存储**: 详细记录沟通的具体内容和相关信息
- **状态管理**: 跟踪沟通记录的处理状态和进展情况
- **时间轴记录**: 完整记录沟通的发生时间和更新时间
- **优先级管理**: 通过priority字段标识沟通的重要程度
- **结果跟踪**: 记录沟通的结果和后续处理情况
- **软删除支持**: 支持软删除机制,保留重要的沟通历史
### 业务场景
- **客户沟通**: 记录与客户的电话、微信、面谈等沟通记录
- **家校沟通**: 记录学校与家长之间的各种沟通交流
- **内部沟通**: 记录员工之间的工作沟通和协调记录
- **投诉处理**: 记录投诉的沟通过程和处理结果
- **咨询服务**: 记录客户咨询的问题和解答过程
- **销售跟进**: 记录销售人员与潜在客户的沟通跟进
- **售后服务**: 记录售后服务过程中的沟通记录
- **问题反馈**: 记录用户问题反馈和处理沟通
- **会议记录**: 记录重要会议的沟通内容和决议
- **培训沟通**: 记录培训过程中的师生沟通交流
## 关联关系
### 主要关联表
- **school_sys_user**: 系统用户表,通过user_id关联发起沟通的用户
- **school_member**: 会员表,通过target_id关联沟通对象(会员)
- **school_personnel**: 人员表,通过target_id关联沟通对象(员工)
- **school_student**: 学员表,通过target_id关联沟通对象(学员)
- **school_course**: 课程表,课程相关的沟通记录
- **school_class**: 班级表,班级相关的沟通记录
- **school_pay**: 支付表,支付相关的沟通记录
- **school_contract**: 合同表,合同相关的沟通记录
### 关联说明
- **用户关联**: user_id关联发起沟通的系统用户
- **目标关联**: target_id根据沟通对象类型关联不同的用户表
- **类型关联**: type字段标识沟通类型,可能关联不同的业务场景
- **业务关联**: 根据沟通内容可能与课程、班级、支付等业务表关联
- **状态关联**: status字段可能与工作流状态表关联
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 用户ID索引(用于查询用户发起的沟通)
INDEX idx_user_id (user_id)
-- 目标ID索引(用于查询与特定对象的沟通)
INDEX idx_target_id (target_id)
-- 沟通类型索引(用于按类型查询)
INDEX idx_type (type)
-- 状态索引(用于按状态查询)
INDEX idx_status (status)
-- 优先级索引(用于按优先级查询)
INDEX idx_priority (priority)
-- 创建时间索引(用于按时间查询)
INDEX idx_create_time (create_time)
-- 更新时间索引(用于按更新时间查询)
INDEX idx_update_time (update_time)
-- 复合索引(用于用户沟通统计)
INDEX idx_user_type_time (user_id, type, create_time)
-- 复合索引(用于目标对象沟通查询)
INDEX idx_target_status_time (target_id, status, create_time)
-- 软删除索引(用于查询有效记录)
INDEX idx_delete_time (delete_time)
```
## 注意事项
- **数据完整性**: 确保user_id和target_id字段的数据完整性
- **隐私保护**: 沟通内容可能涉及隐私,需要严格的访问控制
- **内容审核**: 沟通内容应经过适当的审核和过滤
- **状态一致性**: 沟通状态应与实际处理进度保持一致
- **时间精度**: 时间字段应保证足够精度,支持精确的时间统计
- **类型规范**: type字段应有明确的分类标准和枚举值
- **优先级管理**: priority字段应有清晰的优先级定义
- **内容长度**: content字段长度应满足实际沟通内容的存储需求
- **权限控制**: 不同角色用户应有不同的沟通记录访问权限
- **数据备份**: 重要的沟通记录需要定期备份
- **查询优化**: 针对常用查询场景优化索引和查询语句
- **数据清理**: 定期清理过期或无效的沟通记录
- **并发控制**: 多人同时处理同一沟通记录时需要考虑并发控制
- **通知机制**: 重要沟通应有相应的通知提醒机制
- **跟进提醒**: 建立沟通跟进的提醒和督办机制

106
niucloud/databasedoc/school_contract.md

@ -0,0 +1,106 @@
# school_contract 表文档
## 表概述
**表名**: school_contract
**功能**: 合同信息管理表,存储教务系统中所有学员合同的基本信息、课程关联、价格体系、课时管理等核心数据
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 合同编号
contract_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 合同名称
contract_template text utf8mb4_general_ci NO NULL select,insert,update,references 合同模板
contract_content longtext utf8mb4_general_ci YES NULL select,insert,update,references 合同内容(Word解析后的内容)
contract_status varchar(50) utf8mb4_general_ci NO NULL select,insert,update,references 合同状态
contract_type varchar(50) utf8mb4_general_ci NO NULL select,insert,update,references 合同类型
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 合同备注
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
deleted_at int NULL NO 0 select,insert,update,references 逻辑删除时间
placeholder text utf8mb4_general_ci YES NULL select,insert,update,references 占位符配置
placeholder_config json NULL YES NULL select,insert,update,references 占位符配置
original_filename varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 原始文件名
file_size int NULL YES 0 select,insert,update,references 文件大小(字节)
file_hash varchar(64) utf8mb4_general_ci YES NULL select,insert,update,references 文件hash值,用于防重复
placeholders json NULL YES NULL select,insert,update,references 从模板中解析出的占位符列表
```
## 功能用途
### 主要功能
1. **合同基础管理**: 存储合同编号、名称、类型、状态等基本信息
2. **学员关联管理**: 通过member_id关联具体学员信息
3. **课程关联管理**: 通过course_id关联具体课程信息
4. **价格体系管理**: 管理合同总价、已付金额、优惠金额等财务信息
5. **课时管理系统**: 管理总课时、已消耗课时、剩余课时等课时信息
6. **合同周期管理**: 管理合同开始和结束时间
7. **合同状态控制**: 管理合同的各种状态(待审核、生效、暂停、结束等)
8. **校区归属管理**: 通过campus_id关联所属校区
9. **销售跟踪管理**: 记录销售人员和签约信息
### 业务场景
1. **合同签署**: 学员报名时创建合同,记录课程和价格信息
2. **课时消耗**: 学员上课时扣减合同中的剩余课时
3. **财务结算**: 根据合同进行学费收取和退费处理
4. **合同变更**: 修改合同内容、延期、转课等操作
5. **课时预警**: 当剩余课时不足时进行提醒
6. **合同续费**: 合同到期时进行续费操作
7. **数据统计**: 统计合同收入、课时消耗等业务数据
8. **合同审核**: 合同创建后的审核流程管理
## 关联关系
### 主要关联表
1. **school_member**: 会员表(member_id字段关联)
2. **school_course**: 课程表(course_id字段关联)
3. **school_campus**: 校区表(campus_id字段关联)
4. **school_personnel**: 人员表(销售人员关联)
5. **school_order**: 订单表(合同支付关联)
6. **school_class_member**: 班级学员表(合同对应班级)
7. **school_schedule**: 排课表(课时消耗关联)
8. **school_refund**: 退费表(合同退费关联)
9. **school_contract_log**: 合同变更日志表
10. **school_payment**: 付款记录表
### 关联说明
1. **学员关联**: 通过member_id与会员表关联,确定合同所属学员
2. **课程关联**: 通过course_id与课程表关联,确定合同对应的课程
3. **校区关联**: 通过campus_id关联校区,实现多校区合同管理
4. **财务关联**: 与订单、付款、退费等财务数据关联
5. **教学关联**: 与班级、排课等教学管理功能关联
6. **销售关联**: 记录销售人员的业绩和跟进情况
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**:
- member_id(学员关联查询)
- course_id(课程关联查询)
- campus_id(校区关联查询)
3. **唯一索引**:
- contract_no(合同编号唯一)
4. **普通索引**:
- contract_name(合同名称搜索)
- status(状态筛选)
- start_time(开始时间排序)
- end_time(结束时间排序)
- create_time(创建时间排序)
5. **复合索引**:
- (member_id, status)(学员+状态查询)
- (campus_id, status)(校区+状态查询)
- (course_id, status)(课程+状态查询)
- (status, end_time)(状态+到期时间查询)
## 注意事项
1. **财务精度**: 价格相关字段使用decimal类型,避免浮点数精度问题
2. **课时逻辑**: used_class_hour不能超过total_class_hour
3. **时间逻辑**: start_time不能晚于end_time
4. **合同编号**: contract_no需要保证全局唯一性
5. **状态流转**: 合同状态变更需要记录操作日志
6. **软删除**: 使用deleted_at字段实现软删除,保护历史数据
7. **课时扣减**: 课时消耗需要原子性操作,避免并发问题
8. **合同变更**: 重要字段变更需要审核流程
9. **到期提醒**: 需要定时任务检查合同到期情况
10. **数据一致性**: 合同删除时需要处理相关的课时、付款等数据
11. **权限控制**: 不同角色对合同的操作权限不同
12. **审计追踪**: 重要操作需要记录操作人和操作时间

107
niucloud/databasedoc/school_contract_sign.md

@ -0,0 +1,107 @@
# school_contract_sign 表文档
## 表概述
**表名**: school_contract_sign
**功能**: 合同签署管理表,用于管理合同的电子签署流程,支持内部人员和外部学员的合同签署,包括电子签名、状态跟踪、自动分发和数据填充等功能,为合同管理提供完整的数字化解决方案
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
contract_id int NULL NO NULL select,insert,update,references 合同
personnel_id int NULL NO NULL select,insert,update,references 下发人员
sign_file text utf8mb4_general_ci YES NULL select,insert,update,references 签署附件
status int NULL NO 1 select,insert,update,references 1未签署 2已签署3 已生效 4 已失效
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
sign_time datetime NULL YES NULL select,insert,update,references 签署时间
signature_image varchar(500) utf8mb4_general_ci YES NULL select,insert,update,references 签名图片路径
source_type varchar(50) utf8mb4_general_ci YES manual select,insert,update,references 分发来源:manual手动分发,auto_course自动课程分发
source_id int NULL YES NULL select,insert,update,references 来源ID(如课程ID、订单ID等)
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
deleted_at int NULL NO 0 select,insert,update,references 逻辑删除时间
type tinyint(1) NULL YES NULL select,insert,update,references 签订类型1内部人员2外部人员
fill_data text utf8mb4_general_ci YES NULL select,insert,update,references 填充数据JSON
error_msg varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 错误信息
student_id int NULL YES NULL select,insert,update,references 学员 Id
```
## 功能用途
### 主要功能
- **合同签署管理**: 管理合同的签署流程和状态跟踪
- **电子签名**: 支持电子签名图片的存储和验证
- **多角色签署**: 支持内部人员和外部人员(学员)的合同签署
- **签署文件管理**: 存储签署后的合同附件和相关文档
- **自动化分发**: 支持手动分发和自动课程分发两种模式
- **数据填充**: 支持合同模板的动态数据填充
- **状态追踪**: 完整的签署状态生命周期管理
### 业务场景
- **学员入学合同**: 新学员报名时签署入学协议和课程合同
- **员工劳动合同**: 内部人员入职时签署劳动合同和保密协议
- **课程服务协议**: 学员购买课程时自动生成并分发服务协议
- **合同续签**: 到期合同的续签和重新签署流程
- **批量合同处理**: 批量生成和分发合同给多个签署人
- **合同审核**: 签署完成后的合同审核和生效流程
- **电子存档**: 已签署合同的电子化存档和管理
## 关联关系
### 主要关联表
- **school_contract**: 通过contract_id关联合同基础信息
- **school_personnel**: 通过personnel_id关联下发人员信息
- **school_student**: 通过student_id关联学员信息
- **school_course**: 通过source_id关联课程信息(当source_type为auto_course时)
- **school_sys_user**: 关联系统用户信息
### 关联说明
- `contract_id``school_contract.id`: 多对一关系,一个合同可以有多个签署记录
- `personnel_id``school_personnel.id`: 记录合同的分发人员
- `student_id``school_student.id`: 外部人员签署时关联学员信息
- `source_id`: 根据source_type关联不同的业务对象(课程、订单等)
- 支持软删除机制,通过deleted_at字段管理数据生命周期
## 索引建议
```sql
-- 主键索引(已存在)
PRIMARY KEY (id)
-- 合同查询索引
INDEX idx_contract_id (contract_id)
-- 人员查询索引
INDEX idx_personnel_id (personnel_id)
-- 学员查询索引
INDEX idx_student_id (student_id)
-- 状态查询索引
INDEX idx_status (status)
-- 签署类型索引
INDEX idx_type (type)
-- 来源查询索引
INDEX idx_source (source_type, source_id)
-- 复合索引:合同+状态
INDEX idx_contract_status (contract_id, status)
-- 软删除查询索引
INDEX idx_deleted_at (deleted_at)
-- 时间范围查询索引
INDEX idx_created_at (created_at)
INDEX idx_sign_time (sign_time)
```
## 注意事项
- **法律效力**: 电子签名需要符合相关法律法规要求
- **身份验证**: 签署前必须验证签署人的身份信息
- **签名安全**: 签名图片应加密存储,防止篡改
- **状态一致性**: 签署状态变更需要保证数据一致性
- **文件完整性**: 签署文件的完整性和不可篡改性验证
- **时间戳**: 签署时间的准确性和不可篡改性
- **错误处理**: 签署失败时的错误信息记录和处理机制
- **数据备份**: 重要合同数据的定期备份和恢复机制

94
niucloud/databasedoc/school_course.md

@ -0,0 +1,94 @@
# school_course 表文档
## 表概述
**表名**: school_course
**功能**: 课程信息管理表,存储教务系统中所有课程的基本信息、价格体系、课时配置、提醒设置等核心数据
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 课程编号
course_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 课程名称
course_type varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 课程类型
duration int NULL NO NULL select,insert,update,references 课程时长
session_count int NULL NO NULL select,insert,update,references 课时数量
single_session_count int NULL NO 0 select,insert,update,references 单次消课数量
gift_session_count int NULL NO 0 select,insert,update,references 赠送课时数量
price decimal(10,2) NULL NO NULL select,insert,update,references 课程价格
internal_reminder int NULL YES NULL select,insert,update,references 内部提醒课时
customer_reminder int NULL YES NULL select,insert,update,references 客户提醒课时
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 课程备注
created_at int NULL YES 0 select,insert,update,references 创建时间
updated_at int NULL YES 0 select,insert,update,references 更新时间
deleted_at int NULL YES 0 select,insert,update,references 逻辑删除时间
contract_id int NULL YES NULL select,insert,update,references 合同 id
status tinyint NULL YES 1 select,insert,update,references 课程状态 1 有效 0 无效
is_regular_course tinyint NULL YES 1 select,insert,update,references 是否为正式课 1 是 0 否
```
## 功能用途
### 主要功能
1. **课程基础管理**: 存储课程名称、类型、时长等基本信息
2. **课时体系管理**: 管理总课时数、单次消课数、赠送课时等
3. **价格体系管理**: 设置课程价格,支持灵活定价策略
4. **提醒机制管理**: 内部提醒和客户提醒的课时阈值设置
5. **课程状态管理**: 控制课程的有效性和可用性
6. **正式课程标识**: 区分正式课程和体验课程
7. **合同关联管理**: 与合同模板进行关联绑定
### 业务场景
1. **课程创建**: 新课程录入,设置基本信息和价格体系
2. **课程销售**: 销售人员根据课程信息进行推广销售
3. **课时消耗**: 学员上课时按照单次消课数扣减课时
4. **库存预警**: 根据提醒阈值进行课时不足预警
5. **财务结算**: 基于课程价格进行收费和分成计算
6. **合同生成**: 选择课程后自动关联对应的合同模板
7. **数据分析**: 课程销售情况、受欢迎程度等数据统计
## 关联关系
### 主要关联表
1. **school_contract**: 合同表(contract_id字段关联)
2. **school_order**: 订单表(课程购买记录)
3. **school_course_member**: 会员课程关联表
4. **school_class_course**: 班级课程关联表
5. **school_schedule**: 排课表(课程安排)
6. **school_course_category**: 课程分类表
7. **school_teacher_course**: 教师课程关联表
8. **school_campus_course**: 校区课程关联表
### 关联说明
1. **合同关联**: 通过contract_id与合同模板关联,支持自动合同生成
2. **销售关联**: 与订单表关联,记录课程销售情况
3. **教学关联**: 与班级、排课表关联,实现课程教学安排
4. **人员关联**: 与会员、教师表关联,管理课程参与者
5. **校区关联**: 支持多校区课程管理和独立定价
6. **分类关联**: 通过课程分类实现课程体系化管理
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**:
- contract_id(合同关联查询)
3. **普通索引**:
- course_type(课程类型筛选)
- status(状态筛选)
- is_regular_course(正式课程筛选)
- created_at(创建时间排序)
- price(价格范围查询)
4. **复合索引**:
- (status, course_type)(状态+类型查询)
- (is_regular_course, status)(正式课程+状态查询)
5. **全文索引**:
- course_name(课程名称搜索)
## 注意事项
1. **课时逻辑**: session_count必须大于0,single_session_count不能超过总课时
2. **价格精度**: price字段使用decimal(10,2)确保财务精度
3. **软删除**: 使用deleted_at字段实现软删除,保护历史数据
4. **状态管理**: status字段变更需要同步更新相关业务数据
5. **提醒阈值**: 提醒课时数应小于总课时数,避免逻辑错误
6. **合同关联**: contract_id变更需要验证合同模板的有效性
7. **赠送课时**: gift_session_count需要在业务逻辑中正确处理
8. **正式课标识**: is_regular_course影响计费和统计逻辑

126
niucloud/databasedoc/school_course_schedule.md

@ -0,0 +1,126 @@
# school_course_schedule 表文档
## 表概述
**表名**: school_course_schedule
**功能**: 课程安排管理表,负责管理教务系统中的课程排课信息,包括上课时间、场地安排、教练分配、学员管理等核心排课功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 课程安排编号
campus_id int NULL NO NULL select,insert,update,references 校区ID
venue_id int NULL NO MUL NULL select,insert,update,references 场地ID
course_date date NULL NO MUL NULL select,insert,update,references 上课日期
time_slot varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 上课时段
start_time time NULL YES NULL select,insert,update,references
end_time time NULL YES NULL select,insert,update,references
course_id int NULL NO NULL select,insert,update,references 课程ID
coach_id int NULL NO MUL NULL select,insert,update,references 上课教练ID
participants json NULL YES NULL select,insert,update,references 参与人员列表,存储为JSON数组,包含学员ID和来源信息
student_ids json NULL YES NULL select,insert,update,references 上课学生ID列表,存储为JSON数组
available_capacity int NULL YES NULL select,insert,update,references 根据场地容量判断的可安排学员位置数量
status enum('pending','upcoming','ongoing','completed') utf8mb4_general_ci YES pending select,insert,update,references 课程状态: pending-待开始, upcoming-即将开始, ongoing-进行中, completed-已结束
auto_schedule tinyint(1) NULL YES NULL select,insert,update,references 是否自动排课1是0否
created_by enum('manual','system') utf8mb4_general_ci NO NULL select,insert,update,references 课程安排创建方式: manual-人员安排, system-系统创建
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
deleted_at int NULL YES 0 select,insert,update,references 逻辑删除时间
assistant_ids varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 助教ID列表(逗号分隔)
education_id int NULL YES NULL select,insert,update,references 教务ID
recurring_type enum('none','daily','weekly','monthly') utf8mb4_general_ci YES none select,insert,update,references 重复类型
recurring_end_date date NULL YES NULL select,insert,update,references 重复结束日期
is_trial_class tinyint(1) NULL YES 0 select,insert,update,references 是否体验课
max_students int NULL YES NULL select,insert,update,references 本次课程最大学员数
remarks varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 课程备注
begin_img varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 开课图片
class_id int NULL YES NULL select,insert,update,references 班级 id
```
## 功能用途
### 主要功能
- **课程排期管理**: 管理具体的上课日期、时段和时间安排
- **场地资源调度**: 分配和管理上课场地,控制场地使用冲突
- **教练安排**: 分配主教练和助教,支持教练排课管理
- **学员管理**: 管理参与课程的学员列表,控制课程容量
- **容量控制**: 根据场地容量和课程设置控制学员数量上限
- **课程状态跟踪**: 跟踪课程从待开始到已结束的全生命周期状态
- **自动排课**: 支持系统自动排课和人工手动排课两种模式
- **重复课程**: 支持日、周、月重复课程的批量生成
- **体验课管理**: 区分正式课程和体验课程
- **教务管理**: 支持教务人员的课程管理和监督
### 业务场景
- **日常排课**: 教务人员根据课程计划安排具体的上课时间和场地
- **教练调配**: 根据教练时间安排和专业能力分配合适的教练
- **学员选课**: 学员根据课程安排选择合适的时间段上课
- **场地管理**: 避免场地冲突,合理利用场地资源
- **容量控制**: 确保课程人数不超过场地和教学质量要求
- **课程调整**: 处理临时的课程时间、教练、场地变更
- **体验课安排**: 为潜在学员安排体验课程
- **批量排课**: 使用重复功能批量生成常规课程安排
- **课程监控**: 实时监控课程状态和进度
## 关联关系
### 主要关联表
- `school_campus`: 校区信息表 (campus_id)
- `school_venue`: 场地信息表 (venue_id)
- `school_course`: 课程信息表 (course_id)
- `school_personnel`: 人员信息表 (coach_id, assistant_ids, education_id)
- `school_class`: 班级信息表 (class_id)
- `school_member`: 学员信息表 (通过student_ids关联)
- `school_attendance`: 考勤记录表 (关联上课记录)
- `school_homework`: 作业管理表 (关联课程作业)
- `school_class_member`: 班级学员表 (关联班级学员)
### 关联说明
- **校区场地**: campus_id和venue_id确定上课的具体位置和场地
- **课程关联**: course_id关联具体的课程信息,class_id关联班级
- **人员关联**: coach_id关联主教练,assistant_ids关联助教,education_id关联教务
- **学员关联**: student_ids(JSON)存储参与课程的学员ID列表
- **参与人员**: participants(JSON)存储详细的参与人员信息
- **教学关联**: 与考勤、作业等教学管理功能关联
- **容量关联**: available_capacity与场地容量和课程设置关联
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- campus_id (校区查询)
- venue_id (场地查询,已存在MUL)
- course_id (课程查询)
- coach_id (教练查询,已存在MUL)
- class_id (班级查询)
- education_id (教务查询)
- **时间索引**:
- course_date (上课日期查询,已存在MUL)
- created_at (创建时间查询)
- **状态索引**: status (课程状态查询)
- **复合索引**:
- (campus_id, course_date) (校区日期查询)
- (venue_id, course_date, time_slot) (场地时间冲突检查)
- (coach_id, course_date) (教练排课查询)
- (course_id, course_date) (课程安排查询)
- (class_id, course_date) (班级课程查询)
- (course_date, status) (日期状态查询)
- **特殊索引**:
- recurring_type (重复课程查询)
- is_trial_class (体验课查询)
## 注意事项
- **时间逻辑**: end_time必须大于start_time,course_date不能是过去的日期
- **场地冲突**: 同一场地在同一时间段不能安排多个课程
- **教练冲突**: 同一教练在同一时间不能安排多个课程
- **容量控制**: 实际学员数不能超过available_capacity和max_students
- **JSON字段**: student_ids和participants使用JSON格式,需要注意数据格式验证
- **状态流转**: 课程状态有严格的时间顺序,不能随意跳跃
- **重复课程**: recurring_type不为none时,必须设置recurring_end_date
- **软删除**: 使用deleted_at字段进行逻辑删除,删除时需要考虑关联数据
- **自动排课**: auto_schedule为1时,系统可能自动调整课程安排
- **体验课标识**: is_trial_class影响课程的计费和统计逻辑
- **助教管理**: assistant_ids使用逗号分隔,需要验证人员ID的有效性
- **图片管理**: begin_img需要验证图片格式和大小
- **权限控制**: 不同角色对课程安排的操作权限需要严格控制
- **数据一致性**: 修改课程安排时需要同步更新相关的考勤、作业等数据
- **时区处理**: 时间字段需要考虑时区问题,确保时间显示正确

88
niucloud/databasedoc/school_customer_resource_changes.md

@ -0,0 +1,88 @@
# school_customer_resource_changes 表文档
## 表概述
**表名**: school_customer_resource_changes
**功能**: 客户资源变更记录表,用于记录和追踪客户资源的所有变更操作,包括字段级别的修改记录、操作人员信息、变更时间等,支持数据审计、回滚操作和合规管理
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 修改编号
customer_resource_id int NULL NO NULL select,insert,update,references 客户资源的ID
operator_id int NULL NO NULL select,insert,update,references 操作人的ID
campus_id int NULL NO NULL select,insert,update,references 操作校区的ID
modified_fields text utf8mb4_general_ci NO NULL select,insert,update,references 修改的哪些字段
old_values text utf8mb4_general_ci NO NULL select,insert,update,references 修改前的值
new_values text utf8mb4_general_ci NO NULL select,insert,update,references 修改后的值
modification_time timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 修改的时间
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建的时间
deleted_at int NULL NO 0 select,insert,update,references 逻辑删除时间
is_rolled_back tinyint(1) NULL YES 0 select,insert,update,references 数据是否回滚
rollback_time timestamp NULL YES NULL select,insert,update,references 回滚的时间
action_type varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 操作类型:新增、修改
```
## 功能用途
### 主要功能
- **变更记录追踪**: 详细记录客户资源的所有变更操作,实现完整的数据变更审计
- **字段级别监控**: 精确记录被修改的字段名称,实现字段级别的变更追踪
- **数据对比存储**: 完整保存修改前后的数据值,支持数据对比和分析
- **操作人员记录**: 记录执行变更操作的人员信息,确保操作可追溯
- **校区级别管理**: 按校区维度管理变更记录,支持多校区数据隔离
- **回滚功能支持**: 支持数据回滚操作,可以恢复到变更前的状态
- **操作类型分类**: 区分新增、修改等不同类型的操作,便于分类管理
- **逻辑删除支持**: 支持逻辑删除功能,保留历史变更记录
### 业务场景
- **客户信息变更**: 记录客户基本信息、联系方式、状态等关键数据的变更
- **数据合规审计**: 满足数据保护法规要求,提供完整的数据变更审计轨迹
- **操作行为监控**: 监控员工对客户数据的操作行为,识别异常操作
- **数据质量管理**: 通过变更记录分析数据质量问题,优化数据管理流程
- **客户服务支持**: 为客户服务提供历史变更信息,提升服务质量
- **错误数据恢复**: 在数据错误时快速定位问题并恢复正确数据
- **业务流程优化**: 分析变更模式,优化客户管理业务流程
- **权限审计**: 配合权限系统,审计用户的数据操作权限使用情况
- **数据分析支持**: 为客户行为分析和业务决策提供历史数据支持
## 关联关系
### 主要关联表
- **school_customer_resources**: 客户资源表,记录被变更的客户资源信息
- **school_personnel**: 人员表,关联执行变更操作的人员信息
- **school_campus**: 校区表,关联变更操作发生的校区
- **school_sys_user**: 系统用户表,关联操作用户的详细信息
- **school_six_speed_modification_log**: 六速修改日志表,可能存在相似的变更记录
- **school_member**: 会员表,客户资源可能关联到具体的会员信息
### 关联说明
- `customer_resource_id` 关联 `school_customer_resources.id`,标识被变更的客户资源
- `operator_id` 关联 `school_personnel.id``school_sys_user.id`,标识执行变更的操作人员
- `campus_id` 关联 `school_campus.id`,标识变更操作发生的校区
- 与权限管理系统关联,验证操作权限的合法性
- 与工作流系统关联,支持变更审批和流程管理
- 与通知系统关联,及时通知相关人员重要的数据变更
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **客户资源索引**: `INDEX idx_customer_resource_id (customer_resource_id)` - 支持按客户查询变更历史
- **操作人索引**: `INDEX idx_operator_id (operator_id)` - 支持按操作人查询
- **校区索引**: `INDEX idx_campus_id (campus_id)` - 支持按校区查询
- **时间索引**: `INDEX idx_modification_time (modification_time)` - 支持按变更时间查询
- **回滚状态索引**: `INDEX idx_is_rolled_back (is_rolled_back)` - 支持按回滚状态查询
- **操作类型索引**: `INDEX idx_action_type (action_type)` - 支持按操作类型查询
- **逻辑删除索引**: `INDEX idx_deleted_at (deleted_at)` - 支持逻辑删除查询
- **复合索引**: `INDEX idx_customer_time (customer_resource_id, modification_time)` - 支持客户和时间的复合查询
## 注意事项
- **数据完整性**: 确保变更前后数据的完整记录,避免数据丢失
- **存储空间管理**: 大量变更记录可能占用大量存储空间,需要制定数据清理策略
- **性能影响**: 高频变更操作可能影响系统性能,需要优化记录机制
- **敏感信息保护**: 对敏感信息的变更需要特殊处理,考虑加密或脱敏
- **回滚操作验证**: 执行回滚前需要验证数据一致性,避免产生冲突
- **权限控制**: 严格控制变更记录的查看和操作权限
- **并发处理**: 在高并发环境下确保变更记录的原子性和一致性
- **数据保留策略**: 制定合理的历史数据保留策略,平衡审计需求和存储成本
- **监控告警**: 建立异常变更的监控告警机制,及时发现问题
- **备份恢复**: 定期备份变更记录,确保数据的安全性和可恢复性

140
niucloud/databasedoc/school_customer_resources.md

@ -0,0 +1,140 @@
# school_customer_resources 表文档
## 表概述
**表名**: school_customer_resources
**功能**: 客户资源管理表,负责管理教务系统中的潜在客户信息、销售线索跟踪、客户转化流程等客户关系管理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 编号
member_id int NULL YES 0 select,insert,update,references 会员表id(登录时使用member表)
create_year_month varchar(7) utf8mb4_general_ci NO NULL select,insert,update,references 入会时间
create_date date NULL NO NULL select,insert,update,references 创建日期
source_channel varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 来源渠道|0=线下
source varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 来源
consultant varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 顾问
name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 姓名
age varchar(5) utf8mb4_general_ci YES NULL select,insert,update,references 年龄
gender enum('male','female','other') utf8mb4_general_ci NO NULL select,insert,update,references 性别: male-男性, female-女性, other-其他
phone_number varchar(15) utf8mb4_general_ci NO UNI NULL select,insert,update,references 联系电话|唯一的
demand text utf8mb4_general_ci YES NULL select,insert,update,references 需求
purchasing_power varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 购买力
cognitive_idea text utf8mb4_general_ci YES NULL select,insert,update,references 认知理念
optional_class_time varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 可选上课时间
distance varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 距离
decision_maker varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 决策人
initial_intent varchar(10) utf8mb4_general_ci YES NULL select,insert,update,references 客户初步意向度: high-高, medium-中, low-低
campus int NULL YES NULL select,insert,update,references 所属校区
trial_class_count int NULL YES 0 select,insert,update,references 体验课次数|默认0
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
deleted_at int NULL NO 0 select,insert,update,references 逻辑删除时间
member_label varchar(255) utf8mb4_general_ci NO select,insert,update,references 会员标签
rf_type varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 资源新增类型market市场人员新增sale销售人员新增teacher教练新增
status varchar(15) utf8mb4_general_ci YES NULL select,insert,update,references 客户状态
miniopenid varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 小程序 openid
wechatopenid varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 公众号 openid
referral_resource_id int NULL YES 0 select,insert,update,references 推荐人资源ID
password varchar(255) utf8mb4_general_ci YES select,insert,update,references 会员密码
login_ip varchar(255) utf8mb4_general_ci YES select,insert,update,references 当前登录ip
login_count int NULL YES 0 select,insert,update,references 登录次数
login_time int NULL YES 0 select,insert,update,references 当前登录时间
blacklist tinyint NULL YES 1 select,insert,update,references 是否加入黑名单1 可追单 0 黑名单
```
## 功能用途
### 主要功能
- **客户信息管理**: 管理潜在客户的基本信息和联系方式
- **来源渠道跟踪**: 记录客户的来源渠道和获客方式
- **销售线索管理**: 跟踪客户的购买意向和决策过程
- **顾问分配**: 为客户分配专属销售顾问进行跟进
- **意向度评估**: 评估和记录客户的购买意向强度
- **体验课管理**: 记录客户的体验课参与情况
- **推荐关系**: 管理客户推荐关系和转介绍业务
- **黑名单管理**: 控制不良客户的追单权限
- **登录账户**: 支持客户登录查看相关信息
- **微信集成**: 关联小程序和公众号用户身份
### 业务场景
- **线索收集**: 从各种渠道收集潜在客户信息
- **销售跟进**: 销售顾问跟进客户并记录沟通情况
- **体验课安排**: 为潜在客户安排和记录体验课
- **意向评估**: 评估客户购买意向并制定跟进策略
- **转化分析**: 分析不同渠道的客户转化效果
- **推荐奖励**: 处理客户推荐带来的新客户
- **客户服务**: 为已注册客户提供信息查询服务
- **营销活动**: 基于客户标签进行精准营销
- **数据分析**: 分析客户来源、转化率等关键指标
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (member_id)
- `school_campus`: 校区信息表 (campus)
- `school_personnel`: 人员信息表 (顾问关联)
- `school_course_schedule`: 课程安排表 (体验课关联)
- `school_order_table`: 订单信息表 (转化订单)
- `school_contract`: 合同信息表 (签约转化)
- `school_follow_record`: 跟进记录表 (客户跟进)
- `school_trial_class`: 体验课记录表 (体验课管理)
### 关联说明
- **会员关联**: member_id关联正式会员,支持客户转化为正式学员
- **校区关联**: campus确定客户所属校区,便于就近服务
- **顾问关联**: consultant字段关联销售顾问,支持客户分配和跟进
- **推荐关联**: referral_resource_id建立客户推荐关系链
- **体验课关联**: trial_class_count记录体验课参与情况
- **转化关联**: 通过订单和合同表跟踪客户转化结果
- **微信关联**: 通过openid关联微信生态用户身份
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**: phone_number (已存在,客户唯一标识)
- **外键索引**:
- member_id (会员关联查询)
- campus (校区客户查询)
- referral_resource_id (推荐关系查询)
- **业务索引**:
- status (客户状态查询)
- initial_intent (意向度查询)
- source_channel (来源渠道分析)
- consultant (顾问客户查询)
- rf_type (资源类型查询)
- blacklist (黑名单过滤)
- **时间索引**:
- create_date (创建日期查询)
- create_year_month (月度统计)
- created_at (创建时间查询)
- login_time (登录时间查询)
- **软删除索引**: deleted_at (有效客户查询)
- **复合索引**:
- (campus, status, deleted_at) (校区有效客户查询)
- (consultant, status) (顾问客户状态查询)
- (source_channel, create_date) (渠道效果分析)
- (initial_intent, status) (意向客户查询)
- **微信索引**:
- miniopenid (小程序用户查询)
- wechatopenid (公众号用户查询)
## 注意事项
- **手机号唯一性**: phone_number字段具有唯一约束,确保客户不重复
- **性别枚举**: gender字段使用枚举类型,只能是male/female/other
- **意向度标准**: initial_intent使用high/medium/low标准化意向度评估
- **软删除机制**: deleted_at字段控制逻辑删除,保证数据完整性
- **密码安全**: password字段需要加密存储,不能明文保存
- **登录控制**: 通过login_count和login_time跟踪客户登录行为
- **黑名单逻辑**: blacklist字段控制追单权限(1=可追单,0=黑名单)
- **推荐关系**: referral_resource_id建立推荐链,需要防止循环推荐
- **体验课计数**: trial_class_count需要与实际体验课记录保持一致
- **校区归属**: campus字段确定客户归属,影响服务分配
- **来源跟踪**: source_channel和source字段用于渠道效果分析
- **顾问分配**: consultant字段需要与人员表保持一致性
- **微信绑定**: openid字段用于微信生态集成,需要保证唯一性
- **数据完整性**: 客户转化为会员时需要同步更新member_id
- **时间一致性**: create_date和created_at需要保持逻辑一致
- **标签管理**: member_label支持多标签,建议使用JSON格式
- **状态流转**: status字段变更需要记录变更日志
- **权限控制**: 不同角色对客户信息的访问权限需要严格控制

91
niucloud/databasedoc/school_departments.md

@ -0,0 +1,91 @@
# school_departments 表文档
## 表概述
**表名**: school_departments
**功能**: 部门管理表,负责管理教务系统中的组织架构和部门层级关系,支持多级部门结构和部门路径管理
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 部门编号
department_name varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 部门名称
parent_department_id int NULL YES NULL select,insert,update,references 上级部门ID
path varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 部门路径
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
deleted_at int NULL NO 0 select,insert,update,references
```
## 功能用途
### 主要功能
1. **部门层级管理**: 管理多级部门组织架构,支持无限级部门嵌套
2. **部门信息维护**: 维护部门名称、上级部门等基本信息
3. **部门路径管理**: 通过path字段记录部门的完整层级路径
4. **组织架构展示**: 为系统提供完整的组织架构数据
5. **权限范围控制**: 为权限管理提供部门范围控制
6. **人员归属管理**: 为人员分配提供部门归属依据
7. **逻辑删除支持**: 支持部门的逻辑删除和恢复
8. **时间追踪**: 记录部门的创建和修改时间
### 业务场景
1. **组织架构搭建**: 初始化和维护学校的组织架构
2. **部门人员管理**: 为人员分配和管理提供部门依据
3. **权限分级管理**: 基于部门层级进行权限分配和控制
4. **数据权限控制**: 控制用户只能查看本部门及下级部门数据
5. **报表统计分析**: 按部门维度进行各类业务数据统计
6. **审批流程设计**: 为审批流程提供部门层级依据
7. **成本核算管理**: 按部门进行成本分摊和核算
8. **绩效考核管理**: 按部门进行绩效考核和评估
9. **组织架构调整**: 支持部门的新增、修改、删除等调整操作
## 关联关系
### 主要关联表
1. **school_personnel**: 人员表(部门人员关联)
2. **school_campus**: 校区表(校区部门关联)
3. **school_sys_role**: 角色表(部门角色权限关联)
4. **school_approval_config**: 审批配置表(部门审批流程关联)
5. **school_performance_records**: 绩效记录表(部门绩效关联)
6. **school_salary**: 薪资表(部门薪资管理关联)
7. **school_course**: 课程表(部门课程管理关联)
### 关联说明
1. **自关联**: parent_department_id与本表id形成父子部门关系
2. **人员关联**: 人员表通过部门ID关联,确定员工所属部门
3. **权限关联**: 与角色权限系统关联,实现基于部门的权限控制
4. **业务关联**: 各业务表通过部门关联实现数据权限控制
5. **路径关联**: path字段存储完整部门路径,便于层级查询
6. **审批关联**: 审批流程中的部门审批人配置
7. **统计关联**: 各类统计报表按部门维度进行数据汇总
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**: parent_department_id(父部门查询)
3. **普通索引**:
- department_name(部门名称查询)
- path(路径查询)
- deleted_at(逻辑删除查询)
4. **复合索引**:
- (parent_department_id, deleted_at)(父部门有效子部门查询)
- (path, deleted_at)(路径有效部门查询)
5. **时间索引**:
- created_at(创建时间查询)
- updated_at(更新时间查询)
## 注意事项
1. **层级完整性**: 删除部门时需要检查是否有子部门
2. **路径一致性**: path字段需要与实际层级关系保持一致
3. **循环引用**: 防止部门层级出现循环引用
4. **逻辑删除**: 使用deleted_at字段进行逻辑删除,0表示未删除
5. **人员迁移**: 删除部门前需要处理部门内人员的归属
6. **权限更新**: 部门变更时需要同步更新相关权限配置
7. **路径更新**: 修改部门层级时需要更新所有子部门的path
8. **名称唯一性**: 同级部门名称应保持唯一
9. **数据一致性**: 部门变更时需要同步更新相关业务数据
10. **性能优化**: 深层级查询时需要考虑性能优化
11. **备份策略**: 组织架构数据需要定期备份
12. **审计要求**: 部门变更操作需要记录详细日志
13. **并发控制**: 多用户同时修改部门时需要并发控制
14. **历史追踪**: 重要的部门变更需要保留历史记录

104
niucloud/databasedoc/school_diy_form.md

@ -0,0 +1,104 @@
# school_diy_form 表文档
## 表概述
**表名**: school_diy_form
**功能**: 自定义表单管理表,负责管理教务系统中的动态表单创建、表单配置、数据收集、表单模板等自定义表单功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
form_id int NULL NO PRI NULL auto_increment select,insert,update,references 表单id
page_title varchar(255) utf8mb4_general_ci NO select,insert,update,references 表单名称(用于后台展示)
title varchar(255) utf8mb4_general_ci NO select,insert,update,references 表单名称(用于前台展示)
type varchar(255) utf8mb4_general_ci NO select,insert,update,references 表单类型
status tinyint NULL NO 0 select,insert,update,references 状态(0,关闭,1:开启)
template varchar(255) utf8mb4_general_ci NO select,insert,update,references 模板名称
value longtext utf8mb4_general_ci YES NULL select,insert,update,references 表单数据,json格式,包含展示组件
addon varchar(255) utf8mb4_general_ci NO select,insert,update,references 所属插件标识
share varchar(1000) utf8mb4_general_ci NO select,insert,update,references 分享内容
write_num int NULL NO 0 select,insert,update,references 表单填写总数量
remark varchar(255) utf8mb4_general_ci NO select,insert,update,references 备注说明
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **动态表单创建**: 支持用户自定义创建各种类型的表单
- **表单模板管理**: 管理和维护表单模板,支持模板复用
- **表单配置**: 配置表单的字段、验证规则、显示样式等
- **数据收集**: 收集和统计表单填写数据
- **表单状态控制**: 管理表单的启用、禁用状态
- **表单分享**: 支持表单的分享和传播功能
- **填写统计**: 统计表单的填写次数和数据
- **插件集成**: 支持与各种插件的集成使用
- **JSON数据存储**: 灵活存储表单的结构和配置数据
### 业务场景
- **信息收集**: 收集学生、教师、家长的各种信息
- **报名登记**: 课程报名、活动报名等登记表单
- **问卷调查**: 满意度调查、需求调研等问卷
- **申请审批**: 各种申请表单的在线填写
- **数据录入**: 批量数据录入和信息采集
- **反馈收集**: 意见反馈、建议收集等
- **考试报名**: 考试报名表单和信息收集
- **活动报名**: 学校活动、比赛报名表单
- **资料提交**: 各种资料和文档的在线提交
## 关联关系
### 主要关联表
- `school_student`: 学生信息表 (学生填写表单)
- `school_personnel`: 人员信息表 (教师创建和管理表单)
- `school_course`: 课程信息表 (课程相关表单)
- `school_campus`: 校区信息表 (校区相关表单)
- `school_addon`: 插件表 (表单所属插件)
- `school_sys_attachment`: 附件表 (表单附件关联)
- `sys_log`: 系统日志表 (表单操作日志)
### 关联说明
- **用户关联**: 学生和教师可以填写和创建表单
- **业务关联**: 表单可能关联具体的课程、校区等业务对象
- **插件关联**: addon字段关联表单所属的插件模块
- **附件关联**: 表单可能包含文件上传等附件功能
- **模板关联**: template字段关联表单使用的模板
- **数据关联**: value字段存储表单的结构和配置数据
- **统计关联**: write_num字段统计表单的填写次数
## 索引建议
- **主键索引**: form_id (已存在)
- **业务索引**:
- type (表单类型查询)
- status (状态查询)
- template (模板查询)
- addon (插件查询)
- **复合索引**:
- (status, type) (有效表单类型查询)
- (addon, status) (插件有效表单查询)
- (template, status) (模板有效表单查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
- **全文索引**:
- title (表单标题搜索)
- page_title (后台标题搜索)
## 注意事项
- **JSON格式验证**: value字段存储JSON数据,需要验证格式正确性
- **表单状态一致性**: status字段变更需要同步更新相关业务逻辑
- **模板有效性**: template字段需要确保模板文件存在且有效
- **插件依赖**: addon字段确定表单归属,删除插件时需要处理相关表单
- **数据完整性**: 表单配置数据需要保证完整性和一致性
- **填写统计**: write_num字段需要实时更新,确保统计准确性
- **权限控制**: 表单的创建、编辑、删除需要严格的权限控制
- **数据备份**: 重要表单数据需要定期备份
- **性能优化**: 大量表单数据查询时需要考虑性能优化
- **表单验证**: 表单提交时需要验证数据的有效性
- **分享安全**: 表单分享功能需要考虑安全性和隐私保护
- **模板管理**: 表单模板的版本管理和兼容性
- **数据导出**: 支持表单数据的导出和分析功能
- **移动端适配**: 表单需要支持移动端的显示和填写
- **缓存策略**: 频繁访问的表单可以使用缓存提高性能
- **监控告警**: 表单异常情况需要监控和告警机制

99
niucloud/databasedoc/school_diy_form_fields.md

@ -0,0 +1,99 @@
# school_diy_form_fields 表文档
## 表概述
**表名**: school_diy_form_fields
**功能**: 自定义表单字段管理表,负责管理教务系统中自定义表单的字段配置,包括字段类型、验证规则、显示属性、隐私保护等字段级别的详细配置
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
field_id int NULL NO PRI NULL auto_increment select,insert,update,references 字段id
form_id int NULL NO 0 select,insert,update,references 所属万能表单id
field_key varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段唯一标识
field_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段类型
field_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段名称
field_remark varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段说明
field_default text utf8mb4_general_ci YES NULL select,insert,update,references 字段默认值
write_num int NULL NO 0 select,insert,update,references 字段填写总数量
field_required tinyint NULL NO 0 select,insert,update,references 字段是否必填 0:否 1:是
field_hidden tinyint NULL NO 0 select,insert,update,references 字段是否隐藏 0:否 1:是
field_unique tinyint NULL NO 0 select,insert,update,references 字段内容防重复 0:否 1:是
privacy_protection tinyint NULL NO 0 select,insert,update,references 隐私保护 0:关闭 1:开启
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **字段配置管理**: 管理表单中每个字段的详细配置信息
- **字段类型控制**: 支持多种字段类型(文本、数字、选择、日期等)
- **验证规则设置**: 配置字段的必填、唯一性、格式验证等规则
- **显示控制**: 管理字段的显示/隐藏状态
- **默认值设置**: 为字段设置默认值,提升用户体验
- **隐私保护**: 对敏感字段进行隐私保护设置
- **填写统计**: 统计每个字段的填写次数和使用情况
- **字段标识**: 通过field_key提供字段的唯一标识
- **字段说明**: 为字段提供详细的说明和帮助信息
### 业务场景
- **表单设计**: 在创建自定义表单时配置各种字段
- **数据收集**: 根据字段配置收集和验证用户输入数据
- **表单验证**: 基于字段规则进行数据验证和格式检查
- **隐私合规**: 对涉及隐私的字段进行特殊保护处理
- **用户体验**: 通过默认值和说明提升表单填写体验
- **数据分析**: 分析各字段的填写情况和使用频率
- **表单优化**: 根据字段使用统计优化表单设计
- **权限控制**: 根据字段属性控制不同用户的访问权限
## 关联关系
### 主要关联表
- `school_diy_form`: 自定义表单表 (form_id)
- `school_diy_form_data`: 表单数据表 (通过field_key关联)
- `school_student`: 学生信息表 (表单填写者)
- `school_personnel`: 人员信息表 (表单创建者)
- `sys_log`: 系统日志表 (字段操作日志)
### 关联说明
- **表单关联**: form_id关联到school_diy_form表,确定字段所属表单
- **数据关联**: field_key作为字段标识,关联到具体的表单数据
- **用户关联**: 字段配置影响用户填写表单的体验和验证
- **日志关联**: 字段的创建、修改、删除操作需要记录日志
- **统计关联**: write_num字段统计该字段的填写次数
## 索引建议
- **主键索引**: field_id (已存在)
- **外键索引**: form_id (表单字段查询)
- **唯一索引**: (form_id, field_key) (表单内字段唯一性)
- **业务索引**:
- field_type (字段类型查询)
- field_required (必填字段查询)
- field_hidden (显示字段查询)
- field_unique (唯一字段查询)
- **复合索引**:
- (form_id, field_hidden) (表单可见字段查询)
- (form_id, field_required) (表单必填字段查询)
- (field_type, field_required) (特定类型必填字段)
- **统计索引**: write_num (字段使用统计)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
## 注意事项
- **字段标识唯一性**: field_key在同一表单内必须唯一,作为字段的唯一标识
- **表单关联完整性**: form_id必须对应有效的表单记录
- **字段类型一致性**: field_type需要与实际数据类型保持一致
- **验证规则合理性**: 必填、唯一性等规则需要合理设置,避免冲突
- **默认值格式**: field_default需要符合字段类型的格式要求
- **隐私保护合规**: privacy_protection字段涉及数据隐私,需要严格管理
- **字段依赖关系**: 修改字段配置时需要考虑对现有数据的影响
- **统计数据准确性**: write_num需要实时更新,确保统计准确
- **字段删除影响**: 删除字段前需要检查是否有关联的表单数据
- **权限控制**: 字段配置的修改需要适当的权限验证
- **数据迁移**: 修改字段类型时需要考虑数据迁移和兼容性
- **性能优化**: 大量字段的表单需要考虑查询性能优化
- **缓存策略**: 频繁访问的字段配置可以使用缓存
- **版本管理**: 字段配置的变更需要版本控制和回滚机制
- **监控告警**: 字段配置异常需要监控和告警

95
niucloud/databasedoc/school_diy_form_records.md

@ -0,0 +1,95 @@
# school_diy_form_records 表文档
## 表概述
**表名**: school_diy_form_records
**功能**: 自定义表单填写记录表,负责管理教务系统中用户填写自定义表单的记录数据,包括表单数据存储、填写人信息、业务关联等核心记录管理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
record_id int NULL NO PRI NULL auto_increment select,insert,update,references 表单填写记录id
form_id int NULL NO 0 select,insert,update,references 所属万能表单id
value longtext utf8mb4_general_ci YES NULL select,insert,update,references 填写的表单数据
member_id int NULL NO 0 select,insert,update,references 填写人会员id
relate_id int NULL NO 0 select,insert,update,references 关联业务id
create_time int NULL NO 0 select,insert,update,references 创建时间
student_id int NULL YES NULL select,insert,update,references 学员 id
```
## 功能用途
### 主要功能
- **表单记录管理**: 存储用户填写的表单完整记录信息
- **数据持久化**: 将表单填写的数据以JSON格式持久化存储
- **用户关联**: 记录表单填写者的会员和学员身份信息
- **业务关联**: 支持表单记录与其他业务对象的关联
- **数据追溯**: 提供表单填写的时间追溯和历史记录
- **多身份支持**: 同时支持会员和学员两种身份的表单填写
- **记录查询**: 支持按表单、用户、时间等维度查询记录
- **数据统计**: 为表单使用情况统计提供基础数据
- **数据导出**: 支持表单填写数据的导出和分析
### 业务场景
- **信息收集**: 收集学生、教师、家长填写的各种信息表单
- **报名记录**: 记录课程报名、活动报名等表单填写数据
- **调查问卷**: 存储满意度调查、需求调研等问卷填写结果
- **申请审批**: 记录各种申请表单的填写和提交数据
- **数据录入**: 批量数据录入和信息采集的记录存储
- **反馈收集**: 存储意见反馈、建议收集等表单数据
- **考试报名**: 记录考试报名表单的填写信息
- **活动参与**: 存储学校活动、比赛报名的参与记录
- **资料提交**: 记录各种资料和文档的在线提交数据
## 关联关系
### 主要关联表
- `school_diy_form`: 自定义表单表 (form_id)
- `school_member`: 会员信息表 (member_id)
- `school_student`: 学生信息表 (student_id)
- `school_diy_form_records_fields`: 表单记录字段表 (record_id)
- `school_personnel`: 人员信息表 (业务关联)
- `school_course`: 课程信息表 (relate_id业务关联)
- `school_class`: 班级信息表 (relate_id业务关联)
- `sys_log`: 系统日志表 (记录操作日志)
### 关联说明
- **表单关联**: form_id关联到school_diy_form表,确定记录所属表单
- **用户关联**: member_id和student_id分别关联会员和学员信息
- **字段关联**: 通过school_diy_form_records_fields表存储详细字段数据
- **业务关联**: relate_id可以关联到不同的业务对象(课程、班级等)
- **数据关联**: value字段存储完整的表单填写数据(JSON格式)
- **时间关联**: create_time记录表单填写的具体时间
## 索引建议
- **主键索引**: record_id (已存在)
- **外键索引**:
- form_id (表单记录查询)
- member_id (会员记录查询)
- student_id (学员记录查询)
- **业务索引**: relate_id (业务关联查询)
- **复合索引**:
- (form_id, member_id) (表单会员记录查询)
- (form_id, student_id) (表单学员记录查询)
- (form_id, create_time) (表单时间记录查询)
- (member_id, create_time) (会员时间记录查询)
- **时间索引**: create_time (创建时间查询)
- **全文索引**: value (表单内容搜索,如果需要)
## 注意事项
- **JSON格式验证**: value字段存储JSON数据,需要验证格式正确性
- **表单关联完整性**: form_id必须对应有效的表单记录
- **用户身份一致性**: member_id和student_id需要保持逻辑一致性
- **数据完整性**: 表单记录的数据需要与表单字段配置保持一致
- **业务关联有效性**: relate_id需要确保关联的业务对象存在
- **数据隐私保护**: 涉及隐私的表单数据需要特殊保护
- **存储空间管理**: value字段可能存储大量数据,需要考虑存储优化
- **查询性能**: 大量记录查询时需要合理使用索引
- **数据备份**: 重要表单记录需要定期备份
- **权限控制**: 表单记录的查看和修改需要严格权限控制
- **数据导出**: 支持表单数据的批量导出和分析
- **历史记录**: 表单记录一般不允许删除,保证数据完整性
- **关联清理**: 删除表单时需要处理相关记录数据
- **性能监控**: 监控表单记录的查询和存储性能
- **数据统计**: 为业务分析提供准确的统计数据
- **缓存策略**: 频繁访问的记录可以使用缓存提高性能

114
niucloud/databasedoc/school_diy_form_records_fields.md

@ -0,0 +1,114 @@
# school_diy_form_records_fields 表文档
## 表概述
**表名**: school_diy_form_records_fields
**功能**: 自定义表单记录字段详情表,负责管理教务系统中表单填写记录的字段级详细数据,包括字段值存储、字段属性、修改追踪等字段级数据管理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
form_id int NULL NO 0 select,insert,update,references 所属万能表单id
form_field_id int NULL NO 0 select,insert,update,references 关联表单字段id
record_id int NULL NO 0 select,insert,update,references 关联表单填写记录id
member_id int NULL NO 0 select,insert,update,references 填写会员id
field_key varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段唯一标识
field_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段类型
field_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 字段名称
field_value longtext utf8mb4_general_ci NO NULL select,insert,update,references 字段值,根据类型展示对应效果
field_required tinyint NULL NO 0 select,insert,update,references 字段是否必填 0:否 1:是
field_hidden tinyint NULL NO 0 select,insert,update,references 字段是否隐藏 0:否 1:是
field_unique tinyint NULL NO 0 select,insert,update,references 字段内容防重复 0:否 1:是
privacy_protection tinyint NULL NO 0 select,insert,update,references 隐私保护 0:关闭 1:开启
update_num int NULL NO 0 select,insert,update,references 字段修改次数
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
- **字段级数据存储**: 存储表单记录中每个字段的具体值和属性
- **字段值管理**: 管理不同类型字段的值存储和格式化
- **字段属性记录**: 记录字段的必填、隐藏、唯一等属性状态
- **修改追踪**: 跟踪字段值的修改次数和变更历史
- **隐私保护**: 对敏感字段进行隐私保护标记和处理
- **字段关联**: 关联表单配置中的字段定义和实际填写值
- **数据验证**: 基于字段类型和属性进行数据验证
- **查询优化**: 支持按字段维度的高效查询和统计
- **数据分析**: 为字段级数据分析提供基础数据支持
### 业务场景
- **表单数据查询**: 按字段维度查询和筛选表单填写数据
- **字段统计分析**: 分析特定字段的填写情况和数据分布
- **数据验证**: 验证字段值是否符合配置的规则和格式
- **隐私数据处理**: 对涉及隐私的字段进行特殊处理和保护
- **数据导出**: 按字段维度导出和分析表单数据
- **字段使用统计**: 统计各字段的使用频率和修改情况
- **数据清洗**: 对字段数据进行清洗和标准化处理
- **报表生成**: 基于字段数据生成各种统计报表
- **数据迁移**: 在表单结构变更时进行数据迁移
## 关联关系
### 主要关联表
- `school_diy_form`: 自定义表单表 (form_id)
- `school_diy_form_fields`: 表单字段配置表 (form_field_id)
- `school_diy_form_records`: 表单记录表 (record_id)
- `school_member`: 会员信息表 (member_id)
- `school_student`: 学生信息表 (通过member关联)
- `sys_log`: 系统日志表 (字段操作日志)
### 关联说明
- **表单关联**: form_id关联到school_diy_form表,确定字段所属表单
- **字段配置关联**: form_field_id关联到school_diy_form_fields表,获取字段配置信息
- **记录关联**: record_id关联到school_diy_form_records表,确定字段所属记录
- **用户关联**: member_id关联到填写表单的会员信息
- **字段标识**: field_key作为字段的唯一标识,用于数据关联
- **值存储**: field_value存储字段的实际填写值
- **属性同步**: 字段属性与配置表保持同步
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- form_id (表单字段查询)
- form_field_id (字段配置查询)
- record_id (记录字段查询)
- member_id (会员字段查询)
- **唯一索引**: (record_id, field_key) (记录内字段唯一性)
- **业务索引**:
- field_key (字段标识查询)
- field_type (字段类型查询)
- field_required (必填字段查询)
- field_hidden (显示字段查询)
- **复合索引**:
- (form_id, field_key) (表单字段查询)
- (record_id, field_key) (记录字段查询)
- (member_id, field_key) (用户字段查询)
- (form_id, field_type) (表单类型字段查询)
- **统计索引**: update_num (修改统计查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
- **全文索引**: field_value (字段值搜索,根据需要)
## 注意事项
- **字段关联完整性**: form_field_id必须对应有效的字段配置
- **记录关联一致性**: record_id必须对应有效的表单记录
- **字段标识唯一性**: field_key在同一记录内必须唯一
- **字段值格式**: field_value需要符合field_type的格式要求
- **属性同步**: 字段属性需要与配置表保持同步
- **隐私保护合规**: privacy_protection字段需要严格管理
- **修改追踪**: update_num需要准确记录字段修改次数
- **数据类型一致性**: 字段值类型需要与字段配置保持一致
- **必填验证**: field_required为1时,field_value不能为空
- **唯一性检查**: field_unique为1时,需要检查值的唯一性
- **隐藏字段处理**: field_hidden为1的字段需要特殊处理
- **存储优化**: field_value可能存储大量数据,需要优化存储
- **查询性能**: 大量字段数据查询时需要合理使用索引
- **数据备份**: 重要字段数据需要定期备份
- **权限控制**: 字段数据的访问需要严格权限控制
- **数据清理**: 删除记录时需要同步清理字段数据
- **性能监控**: 监控字段数据的查询和存储性能
- **缓存策略**: 频繁访问的字段数据可以使用缓存

111
niucloud/databasedoc/school_diy_form_submit_config.md

@ -0,0 +1,111 @@
# school_diy_form_submit_config 表文档
## 表概述
**表名**: school_diy_form_submit_config
**功能**: 自定义表单提交配置表,负责管理教务系统中表单的提交规则和配置,包括提交限制、验证规则、通知设置等表单提交行为的控制和管理
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键id
form_id int NULL NO 0 select,insert,update,references 所属万能表单id
submit_after_action varchar(255) utf8mb4_general_ci NO select,insert,update,references 填表人提交后操作,text:文字信息,voucher:核销凭证
tips_type varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 提示内容类型,default:默认提示,diy:自定义提示
tips_text varchar(255) utf8mb4_general_ci NO select,insert,update,references 自定义提示内容
time_limit_type varchar(255) utf8mb4_general_ci NO 0 select,insert,update,references 核销凭证有效期限制类型,no_limit:不限制,specify_time:指定固定开始结束时间,submission_time:按提交时间设置有效期
time_limit_rule text utf8mb4_general_ci YES NULL select,insert,update,references 核销凭证时间限制规则,json格式
voucher_content_rule text utf8mb4_general_ci YES NULL select,insert,update,references 核销凭证内容,json格式
success_after_action text utf8mb4_general_ci YES NULL select,insert,update,references 填写成功后续操作
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **提交规则配置**: 配置表单的提交次数限制、时间限制等规则
- **验证规则管理**: 设置表单提交时的数据验证规则和要求
- **通知配置**: 配置表单提交后的通知方式和接收人
- **权限控制**: 设置表单提交的权限要求和访问控制
- **状态管理**: 管理表单的启用/禁用状态和提交开关
- **限制设置**: 设置单用户提交次数、总提交次数等限制
- **时间控制**: 配置表单的开放时间和截止时间
- **审核配置**: 设置表单提交后的审核流程和规则
- **数据处理**: 配置提交数据的处理方式和存储规则
### 业务场景
- **报名表单**: 配置课程报名表单的提交限制和验证规则
- **调查问卷**: 设置问卷调查的提交次数和时间限制
- **申请表单**: 配置各类申请表单的审核流程和通知
- **反馈表单**: 设置用户反馈表单的提交规则和处理方式
- **考试报名**: 配置考试报名表单的时间限制和资格验证
- **活动报名**: 设置活动报名表单的人数限制和条件
- **信息收集**: 配置信息收集表单的数据验证和处理
- **预约表单**: 设置预约表单的时间限制和冲突检查
- **评价表单**: 配置课程评价表单的提交规则和统计
## 关联关系
### 主要关联表
- `school_diy_form`: 自定义表单表 (form_id)
- `school_diy_form_records`: 表单记录表 (提交记录)
- `school_member`: 会员信息表 (提交权限)
- `school_student`: 学生信息表 (学员权限)
- `school_personnel`: 人员信息表 (教职工权限)
- `school_course`: 课程信息表 (课程相关表单)
- `school_class`: 班级信息表 (班级相关表单)
- `sys_log`: 系统日志表 (配置变更日志)
### 关联说明
- **表单关联**: form_id关联到school_diy_form表,确定配置所属表单
- **提交记录**: 与school_diy_form_records表关联,控制提交行为
- **用户权限**: 通过member_id等关联用户信息,控制提交权限
- **业务关联**: 可能关联课程、班级等业务对象
- **配置继承**: 子表单可以继承父表单的提交配置
- **规则应用**: 配置规则应用到实际的表单提交过程
- **通知关联**: 提交后的通知与用户和管理员关联
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- form_id (表单配置查询)
- site_id (站点配置查询)
- **唯一索引**: form_id (每个表单唯一配置)
- **业务索引**:
- status (状态查询)
- submit_limit_type (限制类型查询)
- is_need_login (登录要求查询)
- is_need_verify (验证要求查询)
- **复合索引**:
- (site_id, status) (站点状态查询)
- (form_id, status) (表单状态查询)
- (submit_limit_type, submit_limit_num) (限制规则查询)
- **时间索引**:
- submit_start_time (开始时间查询)
- submit_end_time (结束时间查询)
- create_time (创建时间查询)
- update_time (更新时间查询)
- **统计索引**:
- submit_limit_num (限制数量统计)
- total_submit_num (总提交数统计)
## 注意事项
- **表单关联完整性**: form_id必须对应有效的表单记录
- **时间逻辑一致性**: submit_start_time必须小于submit_end_time
- **限制规则合理性**: submit_limit_num必须为正数且合理
- **状态管理**: status变更需要考虑已有提交记录的影响
- **权限验证**: is_need_login和is_need_verify需要与实际验证逻辑一致
- **时间有效性**: 需要定期检查表单的时间有效性
- **限制计数**: submit_limit_num的计数需要准确维护
- **并发控制**: 高并发提交时需要考虑限制数量的准确性
- **配置缓存**: 频繁查询的配置可以使用缓存提高性能
- **变更影响**: 配置变更可能影响正在进行的提交流程
- **数据一致性**: 配置与实际提交行为需要保持一致
- **审核流程**: 如果启用审核,需要配置相应的审核人员
- **通知设置**: 通知配置需要确保接收人的有效性
- **备份恢复**: 重要配置需要定期备份
- **权限控制**: 配置修改需要严格的权限控制
- **日志记录**: 配置变更需要详细的日志记录
- **性能监控**: 监控配置对表单提交性能的影响
- **兼容性**: 配置变更需要考虑向后兼容性

113
niucloud/databasedoc/school_diy_form_write_config.md

@ -0,0 +1,113 @@
# school_diy_form_write_config 表文档
## 表概述
**表名**: school_diy_form_write_config
**功能**: 自定义表单填写配置表,负责管理教务系统中表单的填写权限、规则和限制,包括填写方式、参与人员、次数限制、时间控制等表单填写行为的详细配置
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键id
form_id int NULL NO 0 select,insert,update,references 所属万能表单id
write_way varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 填写方式,no_limit:不限制,scan:仅限微信扫一扫,url:仅限链接进入
join_member_type varchar(255) utf8mb4_general_ci NO all_member select,insert,update,references 参与会员,all_member:所有会员参与,selected_member_level:指定会员等级,selected_member_label:指定会员标签
level_ids text utf8mb4_general_ci YES NULL select,insert,update,references 会员等级id集合
label_ids text utf8mb4_general_ci YES NULL select,insert,update,references 会员标签id集合
member_write_type varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 每人可填写次数,no_limit:不限制,diy:自定义
member_write_rule text utf8mb4_general_ci NO NULL select,insert,update,references 每人可填写次数自定义规则
form_write_type varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 表单可填写数量,no_limit:不限制,diy:自定义
form_write_rule text utf8mb4_general_ci NO NULL select,insert,update,references 表单可填写总数自定义规则
time_limit_type varchar(255) utf8mb4_general_ci NO 0 select,insert,update,references 填写时间限制类型,no_limit:不限制, specify_time:指定开始结束时间,open_day_time:设置每日开启时间
time_limit_rule text utf8mb4_general_ci NO NULL select,insert,update,references 填写时间限制规则
is_allow_update_content tinyint NULL NO 0 select,insert,update,references 是否允许修改自己填写的内容,0:否,1:是
write_instruction text utf8mb4_general_ci YES NULL select,insert,update,references 表单填写须知
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **填写方式控制**: 配置表单的填写入口方式(不限制、扫码、链接)
- **参与人员管理**: 设置表单填写的参与人员范围和权限
- **会员等级限制**: 基于会员等级控制表单填写权限
- **会员标签筛选**: 通过会员标签精确控制参与人员
- **次数限制管理**: 设置个人和表单总体的填写次数限制
- **时间控制**: 配置表单的开放时间和填写时间限制
- **修改权限**: 控制用户是否可以修改已填写的内容
- **填写须知**: 提供表单填写的说明和注意事项
- **规则引擎**: 支持复杂的填写规则配置和验证
### 业务场景
- **课程报名**: 配置课程报名表单的参与人员和时间限制
- **活动报名**: 设置活动报名的人数限制和资格要求
- **问卷调查**: 配置调查问卷的填写次数和时间范围
- **考试报名**: 设置考试报名的资格限制和截止时间
- **信息收集**: 配置信息收集表单的填写权限和规则
- **预约服务**: 设置服务预约的时间限制和人员范围
- **反馈收集**: 配置反馈表单的填写频次和修改权限
- **申请审批**: 设置申请表单的填写资格和时间控制
- **会员专享**: 配置会员专享表单的等级和标签限制
## 关联关系
### 主要关联表
- `school_diy_form`: 自定义表单表 (form_id)
- `school_member_level`: 会员等级表 (level_ids)
- `school_member_label`: 会员标签表 (label_ids)
- `school_diy_form_records`: 表单记录表 (填写记录)
- `school_member`: 会员信息表 (参与人员)
- `school_student`: 学生信息表 (学员参与)
- `school_personnel`: 人员信息表 (教职工参与)
- `sys_log`: 系统日志表 (配置变更日志)
### 关联说明
- **表单关联**: form_id关联到school_diy_form表,确定配置所属表单
- **等级关联**: level_ids关联到school_member_level表,控制等级权限
- **标签关联**: label_ids关联到school_member_label表,筛选参与人员
- **记录关联**: 与school_diy_form_records表关联,统计填写次数
- **用户关联**: 通过会员、学生、人员表控制填写权限
- **规则应用**: 配置规则应用到实际的表单填写过程
- **权限验证**: 填写时验证用户是否符合配置要求
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**: form_id (表单配置查询)
- **唯一索引**: form_id (每个表单唯一配置)
- **业务索引**:
- write_way (填写方式查询)
- join_member_type (参与类型查询)
- member_write_type (个人次数类型查询)
- form_write_type (表单次数类型查询)
- time_limit_type (时间限制类型查询)
- is_allow_update_content (修改权限查询)
- **复合索引**:
- (form_id, write_way) (表单填写方式查询)
- (join_member_type, member_write_type) (参与规则查询)
- (time_limit_type, form_write_type) (时间次数规则查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
- **全文索引**:
- write_instruction (填写须知搜索)
## 注意事项
- **表单关联完整性**: form_id必须对应有效的表单记录
- **等级ID格式**: level_ids需要使用正确的JSON或逗号分隔格式
- **标签ID格式**: label_ids需要使用正确的JSON或逗号分隔格式
- **规则JSON格式**: 各种rule字段需要使用有效的JSON格式
- **填写方式枚举**: write_way必须是预定义的枚举值
- **参与类型一致性**: join_member_type与level_ids、label_ids的使用要一致
- **次数限制合理性**: 填写次数限制必须为正数且合理
- **时间规则有效性**: 时间限制规则需要符合逻辑和格式要求
- **权限验证**: 填写时需要严格验证用户是否符合配置要求
- **规则缓存**: 频繁查询的配置规则可以使用缓存
- **并发控制**: 次数限制在高并发时需要准确控制
- **配置变更影响**: 配置变更可能影响正在进行的填写流程
- **数据一致性**: 配置与实际填写行为需要保持一致
- **备份恢复**: 重要配置需要定期备份
- **权限控制**: 配置修改需要严格的权限控制
- **日志记录**: 配置变更需要详细的日志记录
- **性能监控**: 监控配置对表单填写性能的影响
- **兼容性**: 配置变更需要考虑向后兼容性

113
niucloud/databasedoc/school_diy_page.md

@ -0,0 +1,113 @@
# school_diy_page 表文档
## 表概述
**表名**: school_diy_page
**功能**: 自定义页面管理表,负责管理教务系统中的自定义页面内容,包括页面设计、内容编辑、布局配置、发布管理等页面构建和展示功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
page_title varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面名称(用于后台展示)
title varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面标题(用于前台展示)
name varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面标识
type varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面模板
template varchar(255) utf8mb4_general_ci NO select,insert,update,references 模板名称
mode varchar(255) utf8mb4_general_ci NO diy select,insert,update,references 页面展示模式,diy:自定义,fixed:固定
value longtext utf8mb4_general_ci YES NULL select,insert,update,references 页面数据,json格式
is_default int NULL NO 0 select,insert,update,references 是否默认页面,1:是,0:否
is_change int NULL NO 0 select,insert,update,references 数据是否发生过变化,1:变化了,2:没有
share varchar(1000) utf8mb4_general_ci NO select,insert,update,references 分享内容
visit_count int NULL NO 0 select,insert,update,references 访问量
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **页面内容管理**: 管理自定义页面的标题、内容和描述信息
- **页面设计配置**: 支持页面的布局设计和样式配置
- **页面状态控制**: 管理页面的发布状态和可见性
- **页面分类管理**: 支持页面的分类和标签管理
- **页面模板系统**: 提供页面模板的创建和应用
- **内容编辑器**: 支持富文本编辑和可视化编辑
- **页面预览**: 提供页面预览和实时编辑功能
- **SEO优化**: 支持页面的SEO设置和优化
- **访问统计**: 记录页面的访问量和用户行为
- **版本管理**: 支持页面内容的版本控制和回滚
### 业务场景
- **学校介绍**: 创建学校简介、师资力量等展示页面
- **课程展示**: 制作课程详情、教学大纲等介绍页面
- **活动宣传**: 设计活动介绍、报名须知等宣传页面
- **新闻公告**: 发布学校新闻、通知公告等信息页面
- **招生简章**: 制作招生政策、报名流程等说明页面
- **教学资源**: 创建学习资料、教学视频等资源页面
- **联系我们**: 设计联系方式、地址导航等信息页面
- **帮助中心**: 制作使用说明、常见问题等帮助页面
- **政策制度**: 发布学校规章、管理制度等政策页面
## 关联关系
### 主要关联表
- `school_diy_route`: 自定义路由表 (页面路由配置)
- `school_addon`: 插件表 (页面功能扩展)
- `sys_attachment`: 附件表 (页面图片、文件)
- `school_member`: 会员表 (页面访问权限)
- `school_personnel`: 人员表 (页面编辑权限)
- `sys_log`: 系统日志表 (页面操作日志)
- `school_site_config`: 站点配置表 (页面全局设置)
- `school_navigation`: 导航表 (页面导航链接)
### 关联说明
- **路由关联**: 与school_diy_route表关联,配置页面的访问路由
- **插件关联**: 通过school_addon表扩展页面功能和组件
- **附件关联**: 与sys_attachment表关联,管理页面中的图片和文件
- **权限关联**: 通过会员和人员表控制页面的访问和编辑权限
- **日志关联**: 与sys_log表关联,记录页面的操作和访问日志
- **配置关联**: 与站点配置表关联,应用全局页面设置
- **导航关联**: 与导航表关联,将页面添加到网站导航中
- **内容关联**: 页面内容可能引用其他业务数据和信息
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- title (页面标题查询)
- status (页面状态查询)
- type (页面类型查询)
- is_published (发布状态查询)
- sort_order (排序查询)
- **复合索引**:
- (type, status) (类型状态查询)
- (is_published, sort_order) (发布排序查询)
- (status, create_time) (状态时间查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
- publish_time (发布时间查询)
- **全文索引**:
- title (标题搜索)
- content (内容搜索)
- description (描述搜索)
## 注意事项
- **内容安全**: 页面内容需要进行XSS和SQL注入防护
- **HTML验证**: 页面HTML内容需要验证格式和安全性
- **图片处理**: 页面图片需要压缩优化和格式转换
- **缓存策略**: 页面内容需要合理的缓存策略提升性能
- **SEO优化**: 页面需要设置合适的标题、关键词和描述
- **响应式设计**: 页面需要适配不同设备和屏幕尺寸
- **加载性能**: 页面内容和资源需要优化加载速度
- **版本控制**: 重要页面修改需要保留历史版本
- **权限控制**: 页面编辑和发布需要严格的权限控制
- **内容审核**: 页面发布前需要内容审核和质量检查
- **备份恢复**: 页面内容需要定期备份和恢复机制
- **链接检查**: 页面中的链接需要定期检查有效性
- **移动适配**: 页面需要在移动端有良好的显示效果
- **搜索优化**: 页面内容需要便于搜索引擎收录
- **用户体验**: 页面设计需要注重用户体验和易用性
- **数据统计**: 需要统计页面的访问量和用户行为
- **错误处理**: 页面加载失败需要友好的错误提示
- **国际化**: 多语言环境下需要支持国际化

107
niucloud/databasedoc/school_diy_route.md

@ -0,0 +1,107 @@
# school_diy_route 表文档
## 表概述
**表名**: school_diy_route
**功能**: 自定义路由管理表,负责管理教务系统中的自定义页面路由配置,包括路由规则、访问控制、重定向设置、SEO优化等路由管理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
title varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面名称
name varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面标识
page varchar(255) utf8mb4_general_ci NO select,insert,update,references 页面路径
share varchar(1000) utf8mb4_general_ci NO select,insert,update,references 分享内容
is_share int NULL NO 0 select,insert,update,references 是否支持分享
sort int NULL NO 0 select,insert,update,references 排序
```
## 功能用途
### 主要功能
- **路由规则管理**: 配置自定义页面的访问路径和路由规则
- **URL美化**: 提供友好的URL格式和SEO优化路径
- **访问控制**: 设置路由的访问权限和用户限制
- **重定向管理**: 配置页面重定向和跳转规则
- **参数传递**: 支持路由参数的定义和传递
- **路由缓存**: 提供路由缓存机制提升访问性能
- **多语言路由**: 支持多语言环境下的路由配置
- **移动端适配**: 配置移动端专用的路由规则
- **路由监控**: 监控路由的访问情况和性能指标
- **动态路由**: 支持动态生成和配置路由规则
### 业务场景
- **页面访问**: 为自定义页面配置友好的访问路径
- **SEO优化**: 设置搜索引擎友好的URL结构
- **权限控制**: 根据用户权限控制页面访问
- **多语言支持**: 配置不同语言版本的页面路由
- **移动适配**: 为移动端用户提供专门的页面路由
- **营销推广**: 配置营销活动页面的专用路由
- **API接口**: 为前端API调用配置路由规则
- **静态资源**: 管理静态资源文件的访问路由
- **错误处理**: 配置404、500等错误页面路由
## 关联关系
### 主要关联表
- `school_diy_page`: 自定义页面表 (page_id)
- `school_addon`: 插件表 (路由功能扩展)
- `school_member`: 会员表 (访问权限控制)
- `school_personnel`: 人员表 (管理权限控制)
- `sys_log`: 系统日志表 (路由访问日志)
- `school_site_config`: 站点配置表 (全局路由设置)
- `school_navigation`: 导航表 (导航链接路由)
- `sys_attachment`: 附件表 (静态资源路由)
### 关联说明
- **页面关联**: page_id关联到school_diy_page表,确定路由对应的页面
- **插件关联**: 通过school_addon表扩展路由功能和中间件
- **权限关联**: 与会员和人员表关联,控制路由的访问权限
- **日志关联**: 与sys_log表关联,记录路由的访问和操作日志
- **配置关联**: 与站点配置表关联,应用全局路由设置
- **导航关联**: 与导航表关联,为导航项配置路由
- **资源关联**: 与附件表关联,管理静态资源的路由访问
- **业务关联**: 路由可能关联到各种业务模块和功能
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**: page_id (页面路由查询)
- **唯一索引**:
- route_path (路由路径唯一性)
- (domain, route_path) (域名路径组合唯一)
- **业务索引**:
- status (路由状态查询)
- type (路由类型查询)
- is_active (激活状态查询)
- priority (优先级排序)
- **复合索引**:
- (status, is_active) (状态激活查询)
- (type, priority) (类型优先级查询)
- (domain, status) (域名状态查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
- **全文索引**:
- route_name (路由名称搜索)
- description (描述搜索)
## 注意事项
- **路径唯一性**: route_path在同一域名下必须保持唯一
- **页面关联完整性**: page_id必须对应有效的页面记录
- **路由格式验证**: 路由路径需要符合URL规范和格式要求
- **权限验证**: 路由访问需要严格的权限验证机制
- **缓存策略**: 路由规则需要合理的缓存策略提升性能
- **重定向循环**: 避免重定向规则造成的无限循环
- **SEO友好**: 路由设计需要考虑搜索引擎优化
- **参数安全**: 路由参数需要进行安全验证和过滤
- **性能监控**: 监控路由的访问性能和响应时间
- **错误处理**: 路由匹配失败需要友好的错误处理
- **版本兼容**: 路由变更需要考虑向后兼容性
- **多语言支持**: 多语言环境下路由配置的一致性
- **移动适配**: 移动端路由的特殊处理和优化
- **安全防护**: 防止路由注入和恶意访问
- **日志记录**: 详细记录路由的访问和操作日志
- **备份恢复**: 重要路由配置需要备份和恢复机制
- **测试验证**: 路由配置变更需要充分的测试验证
- **文档维护**: 保持路由配置文档的及时更新

104
niucloud/databasedoc/school_diy_theme.md

@ -0,0 +1,104 @@
# school_diy_theme 表文档
## 表概述
**表名**: school_diy_theme
**功能**: 自定义主题配色管理表,负责管理教务系统中的界面主题和配色方案,包括主题创建、配色设置、模式切换等界面个性化定制功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
title varchar(255) utf8mb4_general_ci NO select,insert,update,references 标题
type varchar(255) utf8mb4_general_ci NO select,insert,update,references 插件类型app,addon
addon varchar(255) utf8mb4_general_ci NO select,insert,update,references 所属应用,app:系统,shop:商城、o2o:上门服务
color_mark varchar(255) utf8mb4_general_ci NO select,insert,update,references 颜色标识
color_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 颜色名称
mode varchar(255) utf8mb4_general_ci NO select,insert,update,references 模式,default:默认【跟随系统】,diy:自定义配色
value text utf8mb4_general_ci YES NULL select,insert,update,references 配色
diy_value text utf8mb4_general_ci YES NULL select,insert,update,references 自定义配色
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **主题管理**: 创建和管理不同的界面主题方案
- **配色设置**: 设置和调整系统的配色方案
- **模式切换**: 支持默认模式和自定义模式的切换
- **颜色标识**: 为不同主题设置颜色标识和名称
- **应用适配**: 支持不同应用模块的主题适配
- **配色预览**: 提供主题配色的预览功能
- **主题导入导出**: 支持主题配置的导入和导出
- **版本管理**: 管理主题的版本和更新
- **用户个性化**: 支持用户个性化主题设置
- **主题分享**: 支持主题配置的分享和复用
### 业务场景
- **品牌定制**: 根据机构品牌色彩定制系统主题
- **节日主题**: 在特殊节日使用特定的主题配色
- **用户体验**: 提供多样化的界面风格选择
- **视觉识别**: 通过主题强化品牌视觉识别
- **季节变换**: 根据季节变化调整系统配色
- **活动推广**: 配合营销活动使用特定主题
- **个性化服务**: 为不同用户群体提供个性化界面
- **无障碍设计**: 提供高对比度等无障碍主题
- **夜间模式**: 提供护眼的夜间模式主题
## 关联关系
### 主要关联表
- `school_diy_page`: 自定义页面表 (主题应用)
- `school_sys_config`: 系统配置表 (默认主题设置)
- `school_sys_user`: 系统用户表 (用户主题偏好)
- `school_campus`: 校区表 (校区主题定制)
- `school_addon`: 插件表 (插件主题适配)
- `school_web_adv`: 网站广告表 (主题适配)
- `school_template_message`: 模板消息表 (主题色彩)
- `sys_log`: 系统日志表 (主题操作日志)
### 关联说明
- **页面关联**: 自定义页面应用特定的主题配色
- **配置关联**: 系统配置中设置默认主题
- **用户关联**: 用户可以设置个人主题偏好
- **校区关联**: 不同校区可以使用不同的主题
- **插件关联**: 插件模块适配相应的主题风格
- **广告关联**: 广告内容与主题色彩协调
- **消息关联**: 消息模板使用主题配色
- **日志关联**: 记录主题的操作和变更历史
- **业务关联**: 各业务模块应用统一的主题风格
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- type (插件类型查询)
- addon (应用类型查询)
- mode (模式查询)
- create_time (创建时间查询)
- update_time (更新时间查询)
- **复合索引**:
- (type, addon) (类型应用查询)
- (addon, mode) (应用模式查询)
- **全文索引**:
- title (主题标题搜索)
- color_name (颜色名称搜索)
## 注意事项
- **主题兼容性**: 确保主题在不同设备和浏览器上的兼容性
- **配色规范**: 遵循UI设计规范和无障碍设计标准
- **性能影响**: 主题切换不应影响系统性能
- **数据格式**: value和diy_value字段存储JSON格式数据
- **默认主题**: 系统必须有一个默认主题作为备选
- **颜色对比度**: 确保文字和背景有足够的对比度
- **主题缓存**: 主题配置应该合理缓存提升加载速度
- **版本控制**: 主题更新时需要考虑向后兼容性
- **用户体验**: 主题切换应该平滑无闪烁
- **移动适配**: 主题在移动端的显示效果
- **品牌一致性**: 主题设计应符合机构品牌形象
- **配色数量**: 避免过多的配色选项影响用户选择
- **主题测试**: 新主题上线前需要充分测试
- **回滚机制**: 主题出现问题时的快速回滚机制
- **用户反馈**: 收集用户对主题的反馈和建议
- **定期更新**: 定期更新主题以保持界面的现代感
- **数据备份**: 重要主题配置需要备份

109
niucloud/databasedoc/school_document_data_source_config.md

@ -0,0 +1,109 @@
# school_document_data_source_config 表文档
## 表概述
**表名**: school_document_data_source_config
**功能**: 文档数据源配置表,负责管理教务系统中文档生成的数据源配置,包括数据源定义、字段映射、查询条件等文档数据获取和处理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
contract_id int NULL NO MUL NULL select,insert,update,references 合同ID
placeholder varchar(255) utf8mb4_0900_ai_ci NO NULL select,insert,update,references 占位符
data_type enum('database','system','user_input','sign_img','signature') utf8mb4_0900_ai_ci YES user_input select,insert,update,references 数据类型
system_function varchar(100) utf8mb4_0900_ai_ci YES select,insert,update,references 系统函数名称
table_name varchar(100) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 数据表名
field_name varchar(100) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 字段名
field_type varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 字段类型
is_required tinyint NULL YES 0 select,insert,update,references 是否必填
default_value text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 默认值
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references
validation_rule text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 数据验证规则,JSON格式存储
sign_party enum('party_a','party_b') utf8mb4_0900_ai_ci YES NULL select,insert,update,references 签署方:party_a-甲方,party_b-乙方
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **数据源管理**: 配置和管理文档生成的数据源
- **字段映射**: 定义数据源字段与文档模板的映射关系
- **查询配置**: 设置数据查询的条件和参数
- **数据过滤**: 配置数据筛选和过滤规则
- **格式转换**: 处理数据格式转换和标准化
- **关联查询**: 配置多表关联查询逻辑
- **数据验证**: 验证数据源的有效性和完整性
- **缓存策略**: 配置数据缓存和更新策略
- **权限控制**: 控制数据源的访问权限
- **版本管理**: 管理数据源配置的版本和变更
### 业务场景
- **成绩单生成**: 配置学生成绩数据源生成成绩单
- **证书制作**: 配置学员信息数据源生成证书
- **报表生成**: 配置统计数据源生成各类报表
- **通知书制作**: 配置学员数据生成入学通知书
- **档案整理**: 配置学员档案数据生成档案文件
- **财务报表**: 配置财务数据生成财务报表
- **教学计划**: 配置课程数据生成教学计划文档
- **考试安排**: 配置考试数据生成考试安排表
- **毕业证书**: 配置毕业生数据生成毕业证书
## 关联关系
### 主要关联表
- `school_document_template`: 文档模板表 (模板数据源)
- `school_document_generate_log`: 文档生成日志表 (生成记录)
- `school_student`: 学员表 (学员数据源)
- `school_course`: 课程表 (课程数据源)
- `school_class`: 班级表 (班级数据源)
- `school_teacher`: 教师表 (教师数据源)
- `school_exam`: 考试表 (考试数据源)
- `school_grade`: 成绩表 (成绩数据源)
- `school_finance`: 财务表 (财务数据源)
- `sys_config`: 系统配置表 (配置参数)
### 关联说明
- **模板关联**: 文档模板使用特定的数据源配置
- **日志关联**: 记录数据源在文档生成中的使用情况
- **学员关联**: 学员相关文档使用学员数据源
- **课程关联**: 课程相关文档使用课程数据源
- **班级关联**: 班级相关文档使用班级数据源
- **教师关联**: 教师相关文档使用教师数据源
- **考试关联**: 考试相关文档使用考试数据源
- **成绩关联**: 成绩相关文档使用成绩数据源
- **财务关联**: 财务相关文档使用财务数据源
- **配置关联**: 系统配置影响数据源的行为
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- template_id (模板查询)
- data_source_type (数据源类型查询)
- status (状态查询)
- create_time (创建时间查询)
- update_time (更新时间查询)
- **复合索引**:
- (template_id, data_source_type) (模板数据源查询)
- (data_source_type, status) (类型状态查询)
- **全文索引**:
- name (数据源名称搜索)
- description (描述搜索)
## 注意事项
- **数据安全**: 确保数据源配置不泄露敏感信息
- **性能优化**: 合理配置查询条件避免性能问题
- **数据一致性**: 确保数据源配置与实际数据结构一致
- **权限控制**: 严格控制数据源的访问权限
- **配置验证**: 数据源配置变更前需要验证有效性
- **版本兼容**: 数据源配置变更需要考虑向后兼容性
- **错误处理**: 完善的错误处理和异常捕获机制
- **日志记录**: 详细记录数据源的使用和变更日志
- **缓存管理**: 合理使用缓存提升数据获取效率
- **数据格式**: config字段存储JSON格式的配置信息
- **查询优化**: 优化数据源查询语句提升性能
- **连接管理**: 合理管理数据库连接避免连接泄露
- **事务处理**: 涉及多表操作时注意事务一致性
- **监控告警**: 监控数据源的可用性和性能
- **备份恢复**: 重要配置需要定期备份
- **文档同步**: 配置变更时同步更新相关文档

118
niucloud/databasedoc/school_document_data_source_config_backup.md

@ -0,0 +1,118 @@
# school_document_data_source_config_backup 表文档
## 表概述
**表名**: school_document_data_source_config_backup
**功能**: 文档数据源配置备份表,用于备份和管理文档生成时的数据源配置信息
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 配置ID
contract_id int NULL NO MUL 0 select,insert,update,references 合同ID
table_name varchar(64) utf8mb4_general_ci NO MUL NULL select,insert,update,references 数据表名
table_alias varchar(64) utf8mb4_general_ci YES NULL select,insert,update,references 表别名(显示名称)
field_name varchar(64) utf8mb4_general_ci NO NULL select,insert,update,references 字段名
field_alias varchar(64) utf8mb4_general_ci YES NULL select,insert,update,references 字段别名(显示名称)
field_type varchar(32) utf8mb4_general_ci YES text select,insert,update,references 字段类型:text-文本,number-数字,date-日期,datetime-日期时间
is_active tinyint(1) NULL YES MUL 1 select,insert,update,references 是否启用:1-启用,0-禁用
sort_order int NULL YES 0 select,insert,update,references 排序
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **配置备份**: 备份文档生成时使用的数据源配置信息
- **合同关联**: 通过contract_id关联具体的合同文档
- **表结构映射**: 记录数据表名和字段名的映射关系
- **别名管理**: 管理表名和字段名的显示别名,提高可读性
- **字段类型**: 定义字段的数据类型(文本、数字、日期等)
- **状态控制**: 通过is_active控制配置的启用状态
- **排序管理**: 通过sort_order控制字段的显示顺序
- **版本控制**: 记录配置的创建和更新时间,支持版本追踪
- **数据恢复**: 在配置丢失时可以从备份中恢复
- **配置审计**: 提供配置变更的审计追踪功能
### 业务场景
- **合同文档生成**: 为合同文档生成提供数据源配置备份
- **报表模板**: 为各类报表模板提供数据字段配置
- **文档模板**: 为文档模板系统提供数据源映射配置
- **数据导出**: 为数据导出功能提供字段配置信息
- **配置恢复**: 在系统故障时恢复数据源配置
- **版本管理**: 管理不同版本的数据源配置
- **配置迁移**: 在系统升级时迁移配置数据
- **模板复制**: 复制现有模板的数据源配置
- **批量处理**: 批量处理多个合同的配置备份
- **配置审计**: 审计配置变更历史和操作记录
## 关联关系
### 主要关联表
- **school_contract**: 合同表,通过contract_id关联合同信息
- **school_document_data_source_config**: 原始数据源配置表
- **school_document_template**: 文档模板表,关联模板信息
- **school_document_generate_log**: 文档生成日志表,关联生成记录
- **school_sys_user**: 系统用户表,关联配置操作用户
- **school_member**: 会员表,合同相关的会员信息
- **school_course**: 课程表,课程相关的合同配置
- **school_campus**: 校区表,校区相关的配置信息
### 关联说明
- `contract_id` 关联 `school_contract.id`,标识配置所属的合同
- `table_name` 标识数据源表名,对应系统中的实际数据表
- `field_name` 标识具体的字段名,对应表中的实际字段
- `table_alias``field_alias` 提供用户友好的显示名称
- **配置关联**: 与原始配置表关联,实现配置的备份和恢复
- **模板关联**: 与文档模板关联,支持模板的数据源配置
- **合同关联**: 与合同表关联,获取合同的详细信息
- **日志关联**: 与生成日志关联,追踪配置的使用情况
- **用户关联**: 与用户表关联,记录配置的操作者
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 合同ID索引(用于查询合同的配置备份)
INDEX idx_contract_id (contract_id)
-- 表名索引(用于按表查询配置)
INDEX idx_table_name (table_name)
-- 启用状态索引(用于查询启用的配置)
INDEX idx_is_active (is_active)
-- 创建时间索引(用于按时间查询)
INDEX idx_created_at (created_at)
-- 更新时间索引(用于按更新时间查询)
INDEX idx_updated_at (updated_at)
-- 复合索引(用于查询合同的启用配置)
INDEX idx_contract_active (contract_id, is_active)
-- 复合索引(用于查询表的字段配置)
INDEX idx_table_field (table_name, field_name)
-- 复合索引(用于排序查询)
INDEX idx_contract_sort (contract_id, sort_order)
```
## 注意事项
- **数据一致性**: 确保备份的配置与原始配置保持一致
- **字段类型**: field_type字段值需要严格按照规范设置
- **表名有效性**: table_name必须对应系统中实际存在的数据表
- **字段名有效性**: field_name必须对应表中实际存在的字段
- **别名唯一性**: 在同一合同内,别名应该保持唯一性
- **排序合理性**: sort_order应该保证字段显示的合理顺序
- **状态管理**: is_active状态变更需要考虑对文档生成的影响
- **备份时机**: 在配置变更前应及时创建备份
- **数据清理**: 定期清理过期或无效的配置备份
- **权限控制**: 配置备份的查看和操作需要严格权限控制
- **版本管理**: 通过时间戳实现配置的版本管理
- **恢复验证**: 从备份恢复配置时需要验证数据完整性
- **性能优化**: 大量配置查询时需要考虑缓存机制
- **监控告警**: 监控配置备份的创建和使用情况
- **数据备份**: 重要的配置备份数据需要定期备份到外部存储

113
niucloud/databasedoc/school_document_generate_log.md

@ -0,0 +1,113 @@
# school_document_generate_log 表文档
## 表概述
**表名**: school_document_generate_log
**功能**: 文档生成日志表,负责记录教务系统中文档生成的操作日志,包括生成记录、状态跟踪、错误信息等文档生成过程的完整记录和监控功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
user_type int NULL NO 0 select,insert,update,references 人员类型1内部 2外部
template_id int NULL NO MUL NULL select,insert,update,references 模板ID
template_name varchar(255) utf8mb4_0900_ai_ci YES select,insert,update,references 模板名称
user_id int NULL NO NULL select,insert,update,references 操作用户
user_name varchar(100) utf8mb4_0900_ai_ci YES select,insert,update,references 用户姓名
business_id int NULL YES NULL select,insert,update,references 关联业务ID
business_type varchar(50) utf8mb4_0900_ai_ci YES select,insert,update,references 业务类型
fill_data text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 填充数据JSON
original_data longtext utf8mb4_0900_ai_ci YES NULL select,insert,update,references 生成时使用的原始数据JSON
generated_file varchar(500) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 生成文件路径
file_size bigint NULL YES 0 select,insert,update,references 生成文件大小
download_count int NULL YES 0 select,insert,update,references 下载次数
status enum('pending','processing','completed','failed') utf8mb4_0900_ai_ci YES MUL pending select,insert,update,references
error_msg text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 错误信息
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
completed_at timestamp NULL YES NULL select,insert,update,references 完成时间
```
## 功能用途
### 主要功能
- **生成记录**: 记录文档生成的完整过程和结果
- **状态跟踪**: 跟踪文档生成的各个阶段状态
- **错误日志**: 记录生成过程中的错误和异常信息
- **性能监控**: 监控文档生成的耗时和性能指标
- **用户追踪**: 记录文档生成的操作用户信息
- **模板使用**: 记录使用的文档模板和数据源
- **文件管理**: 管理生成的文档文件路径和存储信息
- **批量处理**: 支持批量文档生成的日志记录
- **审计追踪**: 提供完整的文档生成审计轨迹
- **统计分析**: 支持文档生成的统计和分析功能
### 业务场景
- **成绩单生成**: 记录学生成绩单的生成过程和结果
- **证书制作**: 记录各类证书的制作日志和状态
- **报表生成**: 记录各种报表的生成历史和性能
- **通知书制作**: 记录入学通知书等文档的生成情况
- **批量导出**: 记录批量文档导出的处理过程
- **定时任务**: 记录定时生成文档任务的执行情况
- **错误排查**: 通过日志排查文档生成失败的原因
- **性能优化**: 分析生成耗时优化文档生成性能
- **合规审计**: 提供文档生成的合规性审计记录
## 关联关系
### 主要关联表
- `school_document_template`: 文档模板表 (使用的模板)
- `school_document_data_source_config`: 数据源配置表 (使用的数据源)
- `school_student`: 学员表 (文档相关学员)
- `school_course`: 课程表 (文档相关课程)
- `school_class`: 班级表 (文档相关班级)
- `school_teacher`: 教师表 (文档相关教师)
- `school_exam`: 考试表 (文档相关考试)
- `sys_user`: 系统用户表 (操作用户)
- `sys_file`: 系统文件表 (生成的文件)
- `sys_log`: 系统日志表 (系统操作日志)
### 关联说明
- **模板关联**: 记录使用的文档模板信息
- **数据源关联**: 记录使用的数据源配置
- **学员关联**: 记录文档涉及的学员信息
- **课程关联**: 记录文档涉及的课程信息
- **班级关联**: 记录文档涉及的班级信息
- **教师关联**: 记录文档涉及的教师信息
- **考试关联**: 记录文档涉及的考试信息
- **用户关联**: 记录执行文档生成的用户
- **文件关联**: 关联生成的文档文件
- **日志关联**: 与系统日志形成完整的操作记录
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- template_id (模板查询)
- user_id (用户查询)
- status (状态查询)
- generate_time (生成时间查询)
- create_time (创建时间查询)
- **复合索引**:
- (template_id, status) (模板状态查询)
- (user_id, generate_time) (用户时间查询)
- (status, generate_time) (状态时间查询)
- **时间索引**:
- generate_time (按生成时间排序)
- create_time (按创建时间排序)
## 注意事项
- **日志保留**: 合理设置日志保留期限避免数据过度膨胀
- **性能影响**: 日志记录不应影响文档生成的性能
- **存储优化**: 大量日志数据需要考虑存储优化策略
- **隐私保护**: 日志中不应包含敏感的个人信息
- **错误处理**: 完善的错误信息记录便于问题排查
- **并发控制**: 高并发场景下的日志写入控制
- **数据完整性**: 确保日志记录的完整性和准确性
- **查询优化**: 优化日志查询性能避免影响系统
- **归档策略**: 制定合理的历史日志归档策略
- **监控告警**: 监控异常日志并及时告警
- **数据格式**: params和result字段存储JSON格式数据
- **文件清理**: 定期清理无效的生成文件
- **统计分析**: 利用日志数据进行业务分析和优化
- **备份恢复**: 重要日志数据需要定期备份
- **权限控制**: 控制日志数据的访问权限
- **实时性**: 确保日志记录的实时性和准确性

104
niucloud/databasedoc/school_document_generate_log_backup.md

@ -0,0 +1,104 @@
# school_document_generate_log_backup 表文档
## 表概述
**表名**: school_document_generate_log_backup
**功能**: 文档生成日志备份表,用于备份和管理文档生成的历史记录,包括生成状态、文件信息和下载统计
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 记录ID
template_id int NULL NO MUL NULL select,insert,update,references 模板ID(关联school_contract.id)
user_id int NULL NO MUL NULL select,insert,update,references 操作用户ID
user_type varchar(20) utf8mb4_general_ci YES admin select,insert,update,references 用户类型:1 员工 2 外部用户
fill_data json NULL YES NULL select,insert,update,references 填充数据JSON格式
generated_file_path varchar(500) utf8mb4_general_ci YES NULL select,insert,update,references 生成文件路径
generated_file_name varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 生成文件名
status enum('pending','processing','completed','failed') utf8mb4_general_ci NO MUL pending select,insert,update,references 生成状态:pending-等待,processing-处理中,completed-完成,failed-失败
error_msg text utf8mb4_general_ci YES NULL select,insert,update,references 错误信息
process_start_time timestamp NULL YES NULL select,insert,update,references 处理开始时间
process_end_time timestamp NULL YES NULL select,insert,update,references 处理完成时间
download_count int NULL YES 0 select,insert,update,references 下载次数
last_download_time timestamp NULL YES NULL select,insert,update,references 最后下载时间
created_at int NULL NO MUL 0 select,insert,update,references 创建时间
updated_at int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **日志备份**: 备份文档生成的历史记录和操作日志
- **状态追踪**: 跟踪文档生成的完整生命周期状态
- **文件管理**: 管理生成文件的存储路径和文件名信息
- **错误记录**: 记录文档生成过程中的错误信息和失败原因
- **性能监控**: 监控文档生成的处理时间和性能指标
- **下载统计**: 统计生成文档的下载次数和使用情况
- **用户追踪**: 记录文档生成的操作用户和用户类型
- **数据恢复**: 提供文档生成数据的备份和恢复功能
- **审计追溯**: 支持文档生成操作的审计和追溯
### 业务场景
- **合同文档生成**: 备份教学合同、协议等文档的生成记录
- **报表文档生成**: 备份各种统计报表的生成历史
- **证书文档生成**: 备份学员证书、荣誉证书的生成记录
- **通知文档生成**: 备份家长通知、缴费通知等文档生成
- **批量文档生成**: 备份批量生成文档的操作记录
- **模板文档生成**: 备份基于模板生成文档的历史记录
- **自定义文档生成**: 备份用户自定义文档的生成记录
- **系统文档生成**: 备份系统自动生成文档的记录
- **历史数据恢复**: 从备份中恢复历史文档生成数据
## 关联关系
### 主要关联表
- `school_contract`: 合同表(模板ID关联合同记录)
- `school_document_generate_log`: 文档生成日志表(主表备份关系)
- `school_sys_user`: 系统用户表(操作用户关联)
- `school_member`: 会员表(外部用户关联)
- `school_document_template`: 文档模板表(模板配置关联)
- `school_sys_attachment`: 附件表(生成文件关联)
- `school_campus`: 校区表(校区相关文档)
### 关联说明
- **模板关联**: template_id关联到具体的文档模板或合同记录
- **用户关联**: user_id根据user_type关联到不同的用户表
- **文件关联**: generated_file_path关联到实际的文件存储位置
- **状态关联**: status字段反映文档生成的当前状态
- **时间关联**: 记录文档生成的完整时间线信息
- **备份关联**: 与主日志表保持数据一致性和完整性
## 索引建议
- **主键索引**: id(已存在)
- **外键索引**:
- template_id(模板查询)
- user_id(用户查询)
- **状态索引**: status(状态查询)
- **时间索引**:
- created_at(创建时间查询)
- updated_at(更新时间查询)
- process_start_time(处理开始时间)
- process_end_time(处理完成时间)
- last_download_time(最后下载时间)
- **复合索引**:
- (user_id, user_type)(用户类型查询优化)
- (template_id, status)(模板状态查询)
- (status, created_at)(状态时间查询)
- (user_id, created_at)(用户历史查询)
## 注意事项
- **数据一致性**: 确保备份数据与主表数据的一致性
- **存储管理**: 生成文件的存储路径需要有效管理,防止文件丢失
- **状态同步**: 文档生成状态变更需要及时同步到备份表
- **文件清理**: 定期清理过期的生成文件,释放存储空间
- **权限控制**: 备份数据的访问需要严格的权限控制
- **错误处理**: 详细记录错误信息,便于问题排查和解决
- **性能监控**: 监控文档生成的性能,优化处理效率
- **备份策略**: 制定合理的数据备份和归档策略
- **数据恢复**: 建立完善的数据恢复机制和流程
- **审计合规**: 确保备份数据符合审计和合规要求
- **版本管理**: 支持备份数据的版本管理和历史追溯
- **安全保护**: 备份数据需要加密存储,防止数据泄露
- **监控告警**: 建立异常情况的监控和告警机制
- **容量规划**: 合理规划备份数据的存储容量和增长
- **数据迁移**: 系统升级时需要考虑备份数据的迁移

100
niucloud/databasedoc/school_exam_answers.md

@ -0,0 +1,100 @@
# school_exam_answers 表文档
## 表概述
**表名**: school_exam_answers
**功能**: 考试答题记录表,负责管理教务系统中的具体答题记录,记录用户对每道题目的答案和正确性判断
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 答题记录编号
campus_id int NULL NO NULL select,insert,update,references 校区ID
user_id int NULL NO NULL select,insert,update,references 人员ID
question_id int NULL NO NULL select,insert,update,references 试题ID
answer text utf8mb4_general_ci YES NULL select,insert,update,references 用户答案
is_correct tinyint(1) NULL YES NULL select,insert,update,references 是否正确
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
1. **答题记录管理**: 记录用户对每道题目的具体答案
2. **正确性判断**: 自动判断和记录答案的正确性
3. **人员答题跟踪**: 跟踪特定人员的答题情况
4. **题目答题统计**: 统计每道题目的答题情况
5. **校区数据管理**: 按校区管理答题记录
6. **答题时间记录**: 记录答题的时间信息
7. **成绩计算支持**: 为考试成绩计算提供基础数据
8. **答题分析支持**: 为答题情况分析提供详细数据
9. **考试过程追踪**: 详细记录考试过程中的每一步
### 业务场景
1. **实时答题**: 记录考试过程中的实时答题情况
2. **成绩计算**: 基于答题记录计算考试总成绩
3. **错题分析**: 分析学员/员工的错题情况,提供针对性指导
4. **题目质量评估**: 基于答题统计评估题目的难度和质量
5. **学习效果评估**: 评估学员的学习效果和知识掌握情况
6. **考试作弊检测**: 通过答题模式检测可能的作弊行为
7. **个性化推荐**: 基于答题情况推荐相关学习内容
8. **教学改进**: 为教师提供学员答题数据,改进教学方法
9. **数据挖掘**: 挖掘答题数据中的学习规律和趋势
## 关联关系
### 主要关联表
1. **school_exam_questions**: 考试题目表(question_id外键关联)
2. **school_personnel**: 人员表(user_id关联员工)
3. **school_student**: 学员表(user_id关联学员)
4. **school_campus**: 校区表(campus_id外键关联)
5. **school_exam_records**: 考试记录表(考试实例关联)
6. **school_exam_papers**: 试卷表(间接关联)
7. **school_course**: 课程表(课程答题关联)
8. **school_class**: 班级表(班级答题关联)
### 关联说明
1. **题目关联**: question_id字段关联到具体的考试题目
2. **人员关联**: user_id字段关联到答题人员(员工或学员)
3. **校区关联**: campus_id字段关联到具体校区
4. **考试关联**: 通过user_id和时间关联到具体的考试记录
5. **试卷关联**: 通过题目间接关联到试卷
6. **课程关联**: 答题可以关联到具体的课程或班级
7. **正确性关联**: is_correct字段用于成绩计算和统计
8. **答案关联**: answer字段存储用户的具体答案内容
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**:
- campus_id(校区查询)
- user_id(人员查询)
- question_id(题目查询)
3. **普通索引**:
- is_correct(正确性查询)
4. **复合索引**:
- (user_id, question_id)(人员+题目查询,防重复答题)
- (question_id, is_correct)(题目+正确性统计)
- (campus_id, user_id)(校区+人员查询)
- (user_id, is_correct)(人员+正确性查询)
5. **时间索引**:
- created_at(答题时间查询)
- updated_at(更新时间查询)
6. **全文索引**:
- answer(答案内容搜索)
## 注意事项
1. **外键完整性**: campus_id、user_id、question_id必须存在
2. **答案格式**: answer字段格式需要与题目类型匹配
3. **正确性判断**: is_correct应基于标准答案自动判断
4. **重复答题**: 同一用户同一题目可能有多次答题记录
5. **答案验证**: 答案内容需要进行格式和有效性验证
6. **数据一致性**: 答题记录与考试记录的时间应保持一致
7. **权限控制**: 只有答题人员本人和管理员可以查看答题记录
8. **答案安全**: 答案内容需要进行安全性检查
9. **性能优化**: 大量答题记录查询需要考虑性能
10. **数据完整性**: 删除题目或人员时需要处理相关答题记录
11. **审计要求**: 答题过程需要记录详细的操作日志
12. **备份策略**: 重要答题数据需要定期备份
13. **数据归档**: 历史答题记录需要定期归档处理
14. **统计准确性**: 基于答题记录的统计数据需要保证准确性

101
niucloud/databasedoc/school_exam_papers.md

@ -0,0 +1,101 @@
# school_exam_papers 表文档
## 表概述
**表名**: school_exam_papers
**功能**: 试卷管理表,负责管理教务系统中的考试试卷配置,支持随机组卷和手动组卷两种模式,管理试卷题目、分数设置和考试类型
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 试卷编号
selection_mode enum('random','manual') utf8mb4_general_ci NO NULL select,insert,update,references 题目选择模式: random-随机主题, manual-自选题目
total_score decimal(5,2) NULL NO NULL select,insert,update,references 总分
passing_score decimal(5,2) NULL NO NULL select,insert,update,references 合格分数
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
questions_ids text utf8mb4_general_ci YES NULL select,insert,update,references 问题 id
title varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 试卷名称
single_choice_count int NULL NO 0 select,insert,update,references 单选题数量
multiple_choice_count int NULL NO 0 select,insert,update,references 多选题数量
true_false_count int NULL NO 0 select,insert,update,references 判断题数量
every_score decimal(10,1) unsigned NULL NO 0.0 select,insert,update,references 每道题分数
number_answers int NULL YES NULL select,insert,update,references 答题次数
answer_type tinyint NULL YES NULL select,insert,update,references 答题类型 1 员工考试 2 学员考试
```
## 功能用途
### 主要功能
1. **试卷配置管理**: 创建和管理考试试卷的基本配置信息
2. **组卷模式控制**: 支持随机组卷和手动选题两种组卷方式
3. **分数设置管理**: 设置试卷总分、合格分数和每题分数
4. **题型数量控制**: 管理单选题、多选题、判断题的数量配置
5. **题目关联管理**: 通过questions_ids字段关联具体的考试题目
6. **考试类型分类**: 区分员工考试和学员考试两种类型
7. **答题次数限制**: 控制试卷的答题次数限制
8. **试卷命名管理**: 为试卷提供清晰的标题和标识
9. **时间追踪**: 记录试卷的创建和修改时间
### 业务场景
1. **员工考核**: 创建员工技能考试、入职考试、培训考试试卷
2. **学员测评**: 创建学员课程测试、阶段考试、毕业考试试卷
3. **随机考试**: 使用随机组卷模式创建不同难度的考试
4. **定制考试**: 使用手动选题模式创建针对性考试
5. **分级考试**: 根据不同级别设置不同的合格分数
6. **题型配置**: 根据考试需要配置不同题型的数量比例
7. **重复考试**: 设置答题次数限制,支持多次考试
8. **考试分析**: 基于试卷配置进行考试结果分析
9. **模板管理**: 创建试卷模板供重复使用
## 关联关系
### 主要关联表
1. **school_exam_questions**: 考试题目表(questions_ids字段关联)
2. **school_exam_records**: 考试记录表(试卷考试记录关联)
3. **school_exam_answers**: 考试答案表(试卷答题记录关联)
4. **school_personnel**: 人员表(员工考试关联)
5. **school_student**: 学员表(学员考试关联)
6. **school_course**: 课程表(课程考试关联)
7. **school_class**: 班级表(班级考试关联)
8. **school_campus**: 校区表(校区考试管理关联)
### 关联说明
1. **题目关联**: questions_ids字段存储试卷包含的题目ID列表
2. **考试记录**: 考试记录表记录基于此试卷的具体考试实例
3. **答题记录**: 答案表记录学员/员工对此试卷的答题情况
4. **人员关联**: 根据answer_type区分员工考试和学员考试
5. **课程关联**: 试卷可以关联到具体的课程或班级
6. **校区关联**: 试卷可以按校区进行管理和使用
7. **类型关联**: answer_type字段区分不同的考试对象
## 索引建议
1. **主键索引**: id(已存在)
2. **普通索引**:
- title(试卷名称查询)
- selection_mode(组卷模式查询)
- answer_type(考试类型查询)
3. **复合索引**:
- (answer_type, selection_mode)(类型+模式查询)
- (total_score, passing_score)(分数范围查询)
4. **时间索引**:
- created_at(创建时间查询)
- updated_at(更新时间查询)
5. **全文索引**:
- title(试卷标题搜索)
## 注意事项
1. **分数逻辑**: passing_score不能大于total_score
2. **题目数量**: 各题型数量之和应与实际题目数量一致
3. **分数计算**: every_score * 题目总数应等于total_score
4. **题目ID格式**: questions_ids字段需要验证JSON格式和题目ID有效性
5. **组卷模式**: 随机模式需要足够的题库支持
6. **答题次数**: number_answers为0表示无限制,大于0表示限制次数
7. **考试类型**: answer_type必须为1(员工)或2(学员)
8. **数据完整性**: 删除试卷前需要检查是否有关联的考试记录
9. **题目更新**: 修改questions_ids时需要重新计算分数
10. **权限控制**: 不同角色对试卷的操作权限需要严格控制
11. **备份策略**: 重要试卷数据需要定期备份
12. **版本管理**: 试卷修改时建议保留历史版本
13. **性能优化**: 大量题目的试卷查询需要考虑性能
14. **审计要求**: 试卷操作需要记录详细的操作日志

97
niucloud/databasedoc/school_exam_questions.md

@ -0,0 +1,97 @@
# school_exam_questions 表文档
## 表概述
**表名**: school_exam_questions
**功能**: 考试题目管理表,负责管理教务系统中的考试题库,支持单选题、多选题、判断题三种题型,支持文本和图片两种题干类型
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 试题编号
question_type enum('single_choice','multiple_choice','true_false') utf8mb4_general_ci NO NULL select,insert,update,references 题型: single_choice-单选, multiple_choice-多选, true_false-判断
title varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 题目标题
question_content_type enum('text','image') utf8mb4_general_ci NO NULL select,insert,update,references 题干类型: text-文本, image-图片
question_content text utf8mb4_general_ci NO NULL select,insert,update,references 题干内容(如果是图片则存储URL)
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
option_json text utf8mb4_general_ci YES NULL select,insert,update,references 选项
correct_answer varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 正确答案
```
## 功能用途
### 主要功能
1. **题目信息管理**: 创建和维护考试题目的基本信息
2. **题型分类管理**: 支持单选题、多选题、判断题三种题型
3. **题干内容管理**: 支持文本和图片两种题干内容类型
4. **选项配置管理**: 通过option_json字段管理题目选项
5. **答案设置管理**: 设置和管理题目的正确答案
6. **题目标题管理**: 为题目提供清晰的标题标识
7. **内容类型控制**: 区分文本题干和图片题干
8. **时间追踪**: 记录题目的创建和修改时间
9. **题库构建**: 为试卷组卷提供题目资源
### 业务场景
1. **题库建设**: 构建完整的考试题库资源
2. **试卷组卷**: 为试卷提供题目选择和组合
3. **员工考试**: 创建员工技能测试、入职考试题目
4. **学员测评**: 创建学员课程测试、阶段考试题目
5. **随机抽题**: 支持系统随机抽取题目组成试卷
6. **题目分类**: 按照题型和难度对题目进行分类管理
7. **题目复用**: 同一题目可以在多个试卷中使用
8. **题目维护**: 定期更新和维护题目内容和答案
9. **质量控制**: 对题目质量进行审核和管理
## 关联关系
### 主要关联表
1. **school_exam_papers**: 试卷表(试卷题目关联)
2. **school_exam_answers**: 考试答案表(答题记录关联)
3. **school_exam_records**: 考试记录表(考试题目关联)
4. **school_personnel**: 人员表(出题人关联)
5. **school_student**: 学员表(答题人关联)
6. **school_course**: 课程表(课程题目关联)
7. **school_sys_attachment**: 附件表(图片题干关联)
8. **school_campus**: 校区表(题库管理关联)
### 关联说明
1. **试卷关联**: 试卷通过questions_ids字段关联到具体题目
2. **答题关联**: 答案表记录用户对具体题目的答题情况
3. **考试关联**: 考试记录关联到具体的题目和答案
4. **人员关联**: 题目可以关联到出题人和答题人
5. **课程关联**: 题目可以按课程进行分类和管理
6. **附件关联**: 图片类型题干关联到附件表
7. **校区关联**: 题目可以按校区进行管理和使用
8. **内容关联**: 题干内容根据类型存储文本或图片URL
## 索引建议
1. **主键索引**: id(已存在)
2. **普通索引**:
- question_type(题型查询)
- question_content_type(内容类型查询)
- title(题目标题查询)
3. **复合索引**:
- (question_type, question_content_type)(题型+内容类型查询)
4. **时间索引**:
- created_at(创建时间查询)
- updated_at(更新时间查询)
5. **全文索引**:
- title(题目标题搜索)
- question_content(题干内容搜索)
## 注意事项
1. **题型一致性**: question_type必须为枚举值中的一种
2. **选项格式**: option_json字段必须为有效的JSON格式
3. **答案格式**: correct_answer格式需要与题型匹配
4. **内容类型**: question_content_type决定question_content的存储格式
5. **图片URL**: 图片类型题干需要验证URL的有效性
6. **选项数量**: 单选题和多选题必须有足够的选项
7. **答案验证**: 正确答案必须在选项范围内
8. **JSON结构**: option_json需要统一的数据结构
9. **内容安全**: 题目内容需要进行安全性检查
10. **数据完整性**: 删除题目前需要检查是否被试卷使用
11. **版本管理**: 题目修改时建议保留历史版本
12. **权限控制**: 题目的创建和修改需要权限验证
13. **备份策略**: 重要题目数据需要定期备份
14. **审计要求**: 题目操作需要记录详细的操作日志

103
niucloud/databasedoc/school_exam_records.md

@ -0,0 +1,103 @@
# school_exam_records 表文档
## 表概述
**表名**: school_exam_records
**功能**: 考试记录管理表,负责管理教务系统中的考试实例记录,跟踪考试过程、记录考试成绩和管理考试状态
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 记录编号
campus_id int NULL NO NULL select,insert,update,references 校区ID
user_id int NULL NO NULL select,insert,update,references 人员ID
paper_id int NULL NO NULL select,insert,update,references 试卷ID
score decimal(5,2) NULL YES NULL select,insert,update,references 得分
status enum('in_progress','completed') utf8mb4_general_ci YES in_progress select,insert,update,references 考试状态: in_progress-进行中, completed-已完成
start_time datetime NULL YES NULL select,insert,update,references 考试开始时间
end_time datetime NULL YES NULL select,insert,update,references 考试结束时间
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
1. **考试实例管理**: 创建和管理具体的考试实例记录
2. **考试状态跟踪**: 跟踪考试的进行状态(进行中/已完成)
3. **成绩记录管理**: 记录和管理考试的最终得分
4. **时间管理**: 记录考试的开始时间和结束时间
5. **人员关联管理**: 关联考试人员和试卷信息
6. **校区管理**: 按校区管理考试记录
7. **考试过程控制**: 控制考试的开始、进行和结束流程
8. **数据统计支持**: 为考试数据分析提供基础数据
9. **时间追踪**: 记录考试记录的创建和修改时间
### 业务场景
1. **员工考试**: 记录员工技能测试、入职考试、培训考试过程
2. **学员测评**: 记录学员课程测试、阶段考试、毕业考试过程
3. **考试监控**: 实时监控考试进行状态和完成情况
4. **成绩管理**: 统计和管理考试成绩,生成成绩报告
5. **考试分析**: 分析考试时长、通过率等数据
6. **补考管理**: 管理需要补考的人员和考试安排
7. **考试审计**: 提供考试过程的审计追踪
8. **数据导出**: 导出考试记录用于外部分析
9. **考试统计**: 按时间、人员、试卷等维度统计考试情况
## 关联关系
### 主要关联表
1. **school_exam_papers**: 试卷表(paper_id外键关联)
2. **school_personnel**: 人员表(user_id关联员工)
3. **school_student**: 学员表(user_id关联学员)
4. **school_campus**: 校区表(campus_id外键关联)
5. **school_exam_answers**: 考试答案表(考试答题记录关联)
6. **school_course**: 课程表(课程考试关联)
7. **school_class**: 班级表(班级考试关联)
8. **school_exam_questions**: 考试题目表(间接关联)
### 关联说明
1. **试卷关联**: paper_id字段关联到具体的试卷配置
2. **人员关联**: user_id字段关联到考试人员(员工或学员)
3. **校区关联**: campus_id字段关联到具体校区
4. **答题关联**: 考试答案表记录此次考试的具体答题情况
5. **课程关联**: 考试可以关联到具体的课程或班级
6. **题目关联**: 通过试卷间接关联到考试题目
7. **状态关联**: 考试状态决定是否可以查看成绩
8. **时间关联**: 开始和结束时间用于计算考试时长
## 索引建议
1. **主键索引**: id(已存在)
2. **外键索引**:
- campus_id(校区查询)
- user_id(人员查询)
- paper_id(试卷查询)
3. **普通索引**:
- status(状态查询)
- score(成绩查询)
4. **复合索引**:
- (campus_id, user_id)(校区+人员查询)
- (paper_id, status)(试卷+状态查询)
- (user_id, status)(人员+状态查询)
- (start_time, end_time)(时间范围查询)
5. **时间索引**:
- start_time(开始时间查询)
- end_time(结束时间查询)
- created_at(创建时间查询)
- updated_at(更新时间查询)
## 注意事项
1. **状态一致性**: status必须为枚举值中的一种
2. **时间逻辑**: end_time必须大于start_time
3. **成绩范围**: score应在试卷设定的分数范围内
4. **外键完整性**: campus_id、user_id、paper_id必须存在
5. **状态流转**: 只能从in_progress转换为completed
6. **并发控制**: 同一人员同一试卷同时只能有一个进行中的考试
7. **时间控制**: 考试时间不能超过试卷设定的时间限制
8. **成绩计算**: 成绩应基于答题情况自动计算
9. **数据完整性**: 删除考试记录需要同时删除相关答题记录
10. **权限验证**: 只有考试人员本人和管理员可以查看考试记录
11. **审计要求**: 考试过程需要记录详细的操作日志
12. **备份策略**: 重要考试数据需要定期备份
13. **性能优化**: 大量考试记录查询需要考虑性能
14. **数据归档**: 历史考试记录需要定期归档处理

103
niucloud/databasedoc/school_generate_column.md

@ -0,0 +1,103 @@
# school_generate_column 表文档
## 表概述
**表名**: school_generate_column
**功能**: 代码生成器字段配置表,用于管理代码生成器中每个字段的详细配置信息,包括表单控件类型、显示属性、验证规则、查询方式等,支持动态表单生成和自动化代码生成
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references id
table_id int NULL NO 0 select,insert,update,references 表id
column_name varchar(100) utf8mb4_general_ci NO select,insert,update,references 字段名称
column_comment varchar(300) utf8mb4_general_ci NO select,insert,update,references 字段描述
column_type varchar(100) utf8mb4_general_ci NO select,insert,update,references 字段类型
is_required tinyint(1) NULL YES 0 select,insert,update,references 是否必填 0-非必填 1-必填
is_pk tinyint(1) NULL YES 0 select,insert,update,references 是否为主键 0-不是 1-是
is_insert tinyint(1) NULL YES 0 select,insert,update,references 是否为插入字段 0-不是 1-是
is_update tinyint(1) NULL YES 0 select,insert,update,references 是否为更新字段 0-不是 1-是
is_lists tinyint(1) NULL YES 1 select,insert,update,references 是否为列表字段 0-不是 1-是
is_query tinyint(1) NULL YES 1 select,insert,update,references 是否为查询字段 0-不是 1-是
is_search tinyint(1) NULL YES 1 select,insert,update,references 是否搜索字段
query_type varchar(100) utf8mb4_general_ci YES = select,insert,update,references 查询类型
view_type varchar(100) utf8mb4_general_ci YES input select,insert,update,references 显示类型
dict_type varchar(255) utf8mb4_general_ci YES select,insert,update,references 字典类型
addon varchar(255) utf8mb4_general_ci YES select,insert,update,references 远程下拉关联应用
model varchar(255) utf8mb4_general_ci YES select,insert,update,references 远程下拉关联model
label_key varchar(255) utf8mb4_general_ci YES select,insert,update,references 远程下拉标题字段
value_key varchar(255) utf8mb4_general_ci YES select,insert,update,references 远程下拉value字段
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 修改时间
is_delete tinyint NULL YES 0 select,insert,update,references 是否为软删除字段 0-不是 1-是
is_order tinyint NULL YES 0 select,insert,update,references 是否为排序字段 0-不是 1-是
validate_type varchar(255) utf8mb4_general_ci YES select,insert,update,references 验证类型
```
## 功能用途
### 主要功能
- **字段配置管理**: 管理代码生成器中每个字段的详细配置信息
- **表单控件配置**: 定义字段在表单中的显示类型和交互方式
- **列表显示控制**: 控制字段是否在列表页面中显示
- **查询条件配置**: 设置字段的查询类型和搜索方式
- **数据验证规则**: 定义字段的验证类型和必填规则
- **字典关联管理**: 配置字段与数据字典的关联关系
- **远程数据源**: 支持远程下拉选择的数据源配置
- **字段权限控制**: 控制字段的增删改查权限
### 业务场景
- **代码自动生成**: 根据配置自动生成CRUD页面和表单
- **动态表单构建**: 根据配置动态生成各种业务表单
- **数据列表定制**: 自定义数据列表的显示字段和格式
- **搜索条件配置**: 配置高级搜索的查询条件和方式
- **数据导入导出**: 配置数据导入导出的字段映射
- **报表字段配置**: 定义报表中的字段显示和计算规则
- **API接口生成**: 根据配置自动生成RESTful API接口
- **移动端适配**: 配置字段在移动端的显示方式
- **多语言支持**: 支持字段标签的多语言配置
## 关联关系
### 主要关联表
- **school_generate_table**: 生成表配置表,关联字段所属的表配置
- **school_sys_dict_type**: 字典类型表,关联字段的字典配置
- **school_sys_dict_data**: 字典数据表,提供字段的选项数据
- **school_sys_addon**: 插件表,关联远程下拉的插件信息
- **school_sys_model**: 模型表,关联远程下拉的数据模型
- **school_sys_user**: 用户表,关联配置的创建和修改人员
- **school_form_template**: 表单模板表,关联生成的表单模板
- **school_report_config**: 报表配置表,关联报表字段配置
### 关联说明
- `table_id` 关联 `school_generate_table.id`,标识字段所属的表
- `dict_type` 关联 `school_sys_dict_type.type`,关联字典类型
- `addon` 关联 `school_sys_addon.key`,关联远程数据源插件
- `model` 关联 `school_sys_model.name`,关联数据模型
- `label_key``value_key` 定义远程下拉的显示和值字段
- 与代码生成器引擎关联,实现自动化代码生成
- 与表单渲染引擎关联,实现动态表单生成
- 与数据验证引擎关联,实现字段验证规则
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **表ID索引**: `INDEX idx_table_id (table_id)` - 支持按表查询字段配置
- **字段名索引**: `INDEX idx_column_name (column_name)` - 支持按字段名查询
- **字段类型索引**: `INDEX idx_column_type (column_type)` - 支持按字段类型查询
- **显示类型索引**: `INDEX idx_view_type (view_type)` - 支持按显示类型查询
- **字典类型索引**: `INDEX idx_dict_type (dict_type)` - 支持按字典类型查询
- **创建时间索引**: `INDEX idx_create_time (create_time)` - 支持按创建时间查询
- **复合索引**: `INDEX idx_table_column (table_id, column_name)` - 支持表和字段的复合查询
- **状态索引**: `INDEX idx_flags (is_required, is_pk, is_insert, is_update)` - 支持按字段状态查询
## 注意事项
- **配置一致性**: 确保字段配置与实际数据库表结构保持一致
- **类型匹配**: 验证字段类型与显示类型的兼容性
- **权限控制**: 严格控制字段配置的修改权限,防止误操作
- **缓存管理**: 合理使用缓存提高配置读取性能
- **版本控制**: 建立配置变更的版本控制和回滚机制
- **数据验证**: 确保验证规则的正确性和有效性
- **性能优化**: 避免过多的字段配置影响页面渲染性能
- **兼容性**: 确保配置在不同浏览器和设备上的兼容性
- **安全性**: 防止通过字段配置进行SQL注入等安全攻击
- **备份恢复**: 定期备份重要的字段配置数据

98
niucloud/databasedoc/school_generate_table.md

@ -0,0 +1,98 @@
# school_generate_table 表文档
## 表概述
**表名**: school_generate_table
**功能**: 代码生成表管理表,用于存储和管理代码生成器的表配置信息,支持自动化代码生成、表结构管理和代码模板配置,为系统开发提供快速的代码生成服务
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
table_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 表名
table_content varchar(255) utf8mb4_general_ci NO select,insert,update,references 描述前缀
module_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 模块名
class_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 类名前缀
create_time int NULL NO 0 select,insert,update,references 添加时间
edit_type int NULL NO 1 select,insert,update,references 编辑方式 1-弹框 2-新页面
addon_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 插件名
order_type int NULL NO 0 select,insert,update,references 排序方式 0-无排序 1-正序 2-倒序
parent_menu varchar(255) utf8mb4_general_ci NO select,insert,update,references 上级菜单
relations text utf8mb4_general_ci YES NULL select,insert,update,references 关联配置
synchronous_number int NULL NO 0 select,insert,update,references 同步次数
```
## 功能用途
### 主要功能
- **表配置管理**: 存储数据库表的基本信息和生成配置
- **代码生成配置**: 管理代码生成的模板和参数设置
- **表结构分析**: 记录表的字段信息和结构特征
- **生成历史跟踪**: 跟踪代码生成的历史记录和版本信息
- **模板管理**: 管理不同类型的代码生成模板
- **自动化配置**: 支持批量表的自动化代码生成配置
- **权限控制**: 控制不同用户对代码生成功能的访问权限
- **备注说明**: 记录表的用途和生成说明信息
### 业务场景
- **快速开发**: 为新功能模块快速生成基础代码框架
- **CRUD生成**: 自动生成增删改查的控制器和服务代码
- **API接口生成**: 根据表结构自动生成RESTful API接口
- **前端页面生成**: 生成对应的前端表单和列表页面
- **数据模型生成**: 自动生成数据模型和实体类
- **文档生成**: 根据表结构生成API文档和数据字典
- **测试代码生成**: 生成单元测试和集成测试代码
- **数据库迁移**: 生成数据库迁移脚本和SQL语句
- **代码重构**: 支持现有代码的重构和优化
- **多语言支持**: 支持生成多种编程语言的代码
## 关联关系
### 主要关联表
- **school_generate_column**: 代码生成字段表,存储表字段的详细配置
- **school_sys_user**: 系统用户表,记录代码生成的操作用户
- **school_sys_menu**: 系统菜单表,可能生成对应的菜单项
- **school_sys_dict**: 系统字典表,可能引用字典数据进行代码生成
- **information_schema.tables**: 数据库表信息,获取实际表结构
- **information_schema.columns**: 数据库字段信息,获取字段详情
### 关联说明
- 与school_generate_column表形成一对多关系,一个表对应多个字段配置
- 通过table_name字段关联实际的数据库表
- 生成的代码可能涉及多个系统表的关联和引用
- 支持跨表关联的代码生成和业务逻辑处理
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 表名唯一索引(确保表名唯一性)
UNIQUE INDEX idx_table_name (table_name)
-- 模块名索引(用于按模块查询)
INDEX idx_module_name (module_name)
-- 创建时间索引(用于按时间排序)
INDEX idx_create_time (create_time)
-- 更新时间索引(用于查询最近更新的配置)
INDEX idx_update_time (update_time)
-- 复合索引(模块名+表名)
INDEX idx_module_table (module_name, table_name)
```
## 注意事项
- **表名规范**: 确保table_name与实际数据库表名保持一致
- **代码规范**: 生成的代码应符合项目的编码规范和标准
- **版本控制**: 代码生成前应备份现有代码,避免覆盖重要修改
- **权限安全**: 严格控制代码生成功能的使用权限
- **模板管理**: 定期更新和维护代码生成模板
- **配置验证**: 生成前验证表配置的完整性和正确性
- **依赖关系**: 考虑表间的依赖关系,合理安排生成顺序
- **性能优化**: 大批量生成时需要考虑性能和资源消耗
- **错误处理**: 完善的错误处理和回滚机制
- **文档同步**: 生成代码后及时更新相关文档
- **测试验证**: 生成的代码需要经过充分的测试验证
- **备份恢复**: 建立完善的备份和恢复机制

98
niucloud/databasedoc/school_jobs.md

@ -0,0 +1,98 @@
# school_jobs 表文档
## 表概述
**表名**: school_jobs
**功能**: 队列任务管理表,负责管理教务系统中的异步任务队列,支持任务调度、重试机制和任务状态跟踪
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
queue varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references
payload longtext utf8mb4_general_ci NO NULL select,insert,update,references
attempts tinyint unsigned NULL NO 0 select,insert,update,references
reserve_time int unsigned NULL YES 0 select,insert,update,references
available_time int unsigned NULL YES 0 select,insert,update,references
create_time int unsigned NULL YES 0 select,insert,update,references
```
## 功能用途
### 主要功能
1. **队列任务管理**: 管理系统中的异步任务队列
2. **任务负载存储**: 通过payload字段存储任务的具体数据和参数
3. **重试机制**: 通过attempts字段跟踪任务的执行次数
4. **任务调度**: 通过reserve_time和available_time控制任务的执行时机
5. **队列分类**: 通过queue字段对不同类型的任务进行分类管理
6. **任务状态跟踪**: 跟踪任务的执行状态和进度
7. **延迟执行**: 支持任务的延迟执行和定时调度
8. **失败重试**: 自动重试失败的任务,提高系统可靠性
9. **任务监控**: 监控任务队列的执行情况和性能
### 业务场景
1. **邮件发送**: 异步处理邮件发送任务,避免阻塞主流程
2. **数据导出**: 处理大量数据的导出任务,如成绩单、报表等
3. **文件处理**: 处理文件上传、转换、压缩等耗时操作
4. **通知推送**: 批量发送系统通知、短信、微信消息等
5. **数据同步**: 与第三方系统进行数据同步和交换
6. **定时任务**: 执行定时的数据清理、备份、统计等任务
7. **图片处理**: 处理图片的缩放、裁剪、水印等操作
8. **报表生成**: 生成复杂的统计报表和分析数据
9. **系统维护**: 执行系统清理、优化、更新等维护任务
## 关联关系
### 主要关联表
1. **school_sys_user**: 系统用户表(任务创建者关联)
2. **school_campus**: 校区表(任务校区关联)
3. **school_sys_config**: 系统配置表(队列配置关联)
4. **school_addon**: 插件表(插件任务关联)
5. **sys_log**: 系统日志表(任务执行日志关联)
6. **school_sys_attachment**: 附件表(文件处理任务关联)
7. **school_order_table**: 订单表(支付任务关联)
8. **school_member**: 会员表(通知任务关联)
### 关联说明
1. **队列分类**: queue字段标识任务类型和处理队列
2. **任务数据**: payload字段存储任务的具体执行参数
3. **执行控制**: reserve_time和available_time控制任务执行时机
4. **重试机制**: attempts字段记录任务重试次数
5. **时间管理**: create_time记录任务创建时间
6. **状态跟踪**: 通过时间字段判断任务执行状态
7. **业务关联**: 任务可能关联到各种业务表的数据处理
8. **系统集成**: 与系统配置和日志系统集成
## 索引建议
1. **主键索引**: id(已存在)
2. **业务索引**:
- queue(队列类型查询)
- attempts(重试次数查询)
3. **时间索引**:
- reserve_time(预约时间查询)
- available_time(可用时间查询)
- create_time(创建时间查询)
4. **复合索引**:
- (queue, available_time)(队列可用任务查询)
- (queue, attempts)(队列重试任务查询)
- (available_time, attempts)(可执行任务查询)
5. **状态索引**:
- (reserve_time, available_time)(任务状态查询)
## 注意事项
1. **队列名称**: queue字段应使用标准的队列命名规范
2. **负载格式**: payload字段应存储有效的JSON或序列化数据
3. **重试限制**: attempts字段应设置合理的重试上限,避免无限重试
4. **时间精度**: 时间字段使用Unix时间戳,注意时区处理
5. **任务超时**: 长时间未处理的任务需要超时机制
6. **并发控制**: 同一任务避免重复执行,需要锁机制
7. **内存管理**: payload字段可能存储大量数据,注意内存使用
8. **错误处理**: 任务执行失败需要记录详细的错误信息
9. **队列监控**: 需要监控队列长度和处理速度
10. **数据清理**: 已完成的任务需要定期清理,避免表过大
11. **优先级管理**: 重要任务需要优先级机制
12. **死锁检测**: 避免任务间的死锁情况
13. **资源限制**: 控制并发任务数量,避免系统资源耗尽
14. **备份恢复**: 重要任务数据需要备份和恢复机制
15. **性能优化**: 大量任务处理时需要考虑性能优化
16. **安全控制**: 任务执行需要适当的权限和安全控制

90
niucloud/databasedoc/school_jobs_failed.md

@ -0,0 +1,90 @@
# school_jobs_failed 表文档
## 表概述
**表名**: school_jobs_failed
**功能**: 任务失败记录表,用于记录和管理系统中执行失败的异步任务信息,包括任务队列、载荷数据、异常信息等,为系统任务监控、错误排查和故障恢复提供完整的失败任务记录
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
connection text utf8mb4_general_ci NO NULL select,insert,update,references
queue text utf8mb4_general_ci NO NULL select,insert,update,references
payload longtext utf8mb4_general_ci NO NULL select,insert,update,references
exception longtext utf8mb4_general_ci NO NULL select,insert,update,references
fail_time timestamp NULL NO CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references
```
## 功能用途
### 主要功能
- **失败任务记录**: 记录执行失败的异步任务的完整信息
- **队列信息管理**: 记录任务所属的队列和连接信息
- **载荷数据保存**: 保存任务的完整载荷数据,便于重新执行
- **异常信息记录**: 详细记录任务失败的异常信息和错误堆栈
- **失败时间跟踪**: 记录任务失败的具体时间点
- **错误分析支持**: 为系统错误分析和故障排查提供数据支持
- **任务重试基础**: 为失败任务的重新执行提供数据基础
- **系统监控**: 支持系统任务执行状态的监控和告警
### 业务场景
- **邮件发送失败**: 记录邮件发送任务的失败信息
- **短信发送失败**: 记录短信发送任务的失败详情
- **数据同步失败**: 记录数据同步任务的失败情况
- **文件处理失败**: 记录文件上传、转换等处理任务的失败
- **支付回调失败**: 记录支付回调处理任务的失败
- **报表生成失败**: 记录报表生成任务的失败信息
- **数据导入失败**: 记录批量数据导入任务的失败
- **定时任务失败**: 记录定时执行任务的失败情况
- **API调用失败**: 记录第三方API调用任务的失败
- **消息推送失败**: 记录消息推送任务的失败详情
## 关联关系
### 主要关联表
- **school_sys_cron_task**: 定时任务表,可能产生失败的定时任务记录
- **school_sys_notice_log**: 通知发送日志表,通知发送失败时的记录
- **school_sys_notice_sms_log**: 短信发送日志表,短信发送失败时的记录
- **school_service_logs**: 服务日志表,记录相关的服务执行日志
- **school_sys_export**: 导出任务表,导出任务失败时的记录
- **school_pay**: 支付表,支付相关任务失败时的关联
- **school_sys_log**: 系统日志表,记录相关的系统操作日志
### 关联说明
- 作为系统任务队列的失败记录存储,与各业务模块的异步任务关联
- 通过queue字段标识不同类型的任务队列
- 通过payload字段保存任务的完整上下文信息
- 为任务重试和错误恢复提供数据支持
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 队列索引(用于按队列查询失败任务)
INDEX idx_queue (queue(100))
-- 连接索引(用于按连接查询失败任务)
INDEX idx_connection (connection(100))
-- 失败时间索引(用于按时间排序和清理)
INDEX idx_fail_time (fail_time)
-- 复合索引(队列和时间)
INDEX idx_queue_time (queue(50), fail_time)
```
## 注意事项
- **数据清理**: 定期清理过期的失败任务记录,避免表数据过大
- **异常信息长度**: exception字段可能包含很长的错误堆栈信息
- **载荷数据安全**: payload字段可能包含敏感信息,需要注意数据安全
- **存储空间**: longtext字段会占用较大存储空间,需要监控表大小
- **查询性能**: 大量数据时需要注意查询性能,合理使用索引
- **重试机制**: 建立合理的任务重试机制,避免无限重试
- **监控告警**: 建立失败任务的监控和告警机制
- **错误分类**: 对不同类型的错误进行分类处理
- **日志关联**: 与系统日志建立关联,便于问题追踪
- **备份策略**: 重要的失败任务记录需要建立备份策略
- **权限控制**: 严格控制对失败任务记录的访问权限
- **数据分析**: 定期分析失败任务的模式,优化系统稳定性

95
niucloud/databasedoc/school_lesson_course_teaching.md

@ -0,0 +1,95 @@
# school_lesson_course_teaching 表文档
## 表概述
**表名**: school_lesson_course_teaching
**功能**: 课程教学内容管理表,用于管理各种类型的教学资源和教案库,包括视频、文件、图片等多媒体素材,支持多项目教学内容分类、权限控制和个性化推送
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 主键
title varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 课程标题
image varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 预览图
type tinyint NULL YES NULL select,insert,update,references 素材类型 (1视频 2文件 3图片)
content text utf8mb4_general_ci YES NULL select,insert,update,references 课程内容
status tinyint NULL YES NULL select,insert,update,references 状态 (1开启 2关闭)
create_time datetime NULL YES NULL select,insert,update,references 创建时间
update_time datetime NULL YES NULL select,insert,update,references 修改时间
delete_time varchar(32) utf8mb4_general_ci YES 0 select,insert,update,references 删除时间
table_type int NULL YES NULL select,insert,update,references 类型 1课程教学大纲 2跳绳教案库 3增高教案库 4篮球教案库 5强化教案库 6空中忍者教案库 7少儿安防教案库 8体能教案库 9热身动作库 10体能动作库 11趣味游戏库 12放松动作库 13训练内容 14训练视频 15课后作业 16优秀一堂课 17空中忍者 18篮球动作 19跳绳动作 20跑酷动作 21安防动作 22标准化动作 233-6岁体测 247+体测 253-6岁体测讲解—解读 267+岁体测讲解—解读 27互动游戏 28套圈游戏 29鼓励方式
user_permission text utf8mb4_general_ci YES NULL select,insert,update,references 用户权限
user_permission_name text utf8mb4_general_ci YES NULL select,insert,update,references 用户名称(权限)
url text utf8mb4_general_ci YES NULL select,insert,update,references 素材路径
exam_papers_id int NULL YES 0 select,insert,update,references 试卷id
answers_num int NULL YES 0 select,insert,update,references 答题次数
student_ids text utf8mb4_general_ci YES NULL select,insert,update,references 学员 Id
```
## 功能用途
### 主要功能
- **教学内容管理**: 统一管理各种类型的教学内容和教案资源
- **多媒体素材支持**: 支持视频、文件、图片等多种类型的教学素材
- **教案库分类**: 按运动项目和教学内容进行详细的分类管理
- **权限控制**: 支持用户权限管理,控制教学内容的访问和使用
- **状态管理**: 管理教学内容的启用/禁用状态,支持动态调整
- **考试集成**: 集成试卷功能,支持教学效果评估
- **学员关联**: 关联具体学员,支持个性化教学内容推送
- **版本控制**: 支持教学内容的版本管理和更新追踪
### 业务场景
- **标准化教学**: 建立标准化的教学内容库,确保教学质量一致性
- **多项目教学**: 支持跳绳、篮球、体能、安防等多个运动项目的教学
- **分龄教学**: 针对不同年龄段(3-6岁、7+岁)提供专门的教学内容
- **教师培训**: 为教师提供标准化的教案和教学参考资料
- **课程设计**: 支持教师根据教案库设计个性化的课程内容
- **教学评估**: 通过试卷和作业评估教学效果和学员掌握情况
- **资源共享**: 在校区间共享优质的教学资源和教案
- **教学创新**: 收集和管理创新的教学方法和优秀课程案例
- **家庭教育**: 为家长提供课后作业和家庭教育指导
## 关联关系
### 主要关联表
- **school_course**: 课程表,关联教学内容所属的课程
- **school_class**: 班级表,关联使用该教学内容的班级
- **school_member**: 学员表,关联接受教学内容的学员
- **school_personnel**: 教师表,关联创建和使用教学内容的教师
- **school_exam_papers**: 试卷表,关联教学内容的考试评估
- **school_sys_attachment**: 附件表,关联教学素材的文件存储
- **school_sys_user**: 用户表,关联有权限访问内容的用户
- **school_campus**: 校区表,关联教学内容的使用范围
### 关联说明
- `exam_papers_id` 关联 `school_exam_papers.id`,关联相关的试卷和考试
- `student_ids` 存储关联的学员ID列表,支持个性化推送
- `user_permission` 存储用户权限信息,控制内容访问
- `table_type` 字段区分不同类型的教学内容(教案库、动作库、游戏库等)
- 与文件存储系统关联,管理教学素材的上传和下载
- 与权限系统关联,实现细粒度的内容访问控制
- 与统计系统关联,分析教学内容的使用效果
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **类型索引**: `INDEX idx_table_type (table_type)` - 支持按教学内容类型查询
- **状态索引**: `INDEX idx_status (status)` - 支持按状态查询
- **试卷索引**: `INDEX idx_exam_papers_id (exam_papers_id)` - 支持按试卷查询
- **素材类型索引**: `INDEX idx_type (type)` - 支持按素材类型查询
- **时间索引**: `INDEX idx_create_time (create_time)` - 支持按创建时间查询
- **更新时间索引**: `INDEX idx_update_time (update_time)` - 支持按更新时间查询
- **逻辑删除索引**: `INDEX idx_delete_time (delete_time)` - 支持逻辑删除查询
- **标题索引**: `INDEX idx_title (title)` - 支持按标题搜索
- **复合索引**: `INDEX idx_type_status (table_type, status)` - 支持类型和状态的复合查询
## 注意事项
- **内容版权**: 确保教学内容的版权合规,避免侵权问题
- **文件大小控制**: 对上传的视频和文件进行大小限制,避免存储压力
- **权限安全**: 严格控制教学内容的访问权限,保护知识产权
- **内容质量**: 建立内容审核机制,确保教学内容的质量和准确性
- **存储优化**: 对大量的多媒体文件进行存储优化和CDN加速
- **备份策略**: 制定重要教学内容的备份和恢复策略
- **版本管理**: 妥善管理教学内容的版本更新,避免内容混乱
- **使用统计**: 统计教学内容的使用情况,优化内容库结构
- **性能优化**: 对大量教学内容的查询和加载进行性能优化
- **移动适配**: 确保教学内容在移动设备上的良好展示效果

87
niucloud/databasedoc/school_market_performance.md

@ -0,0 +1,87 @@
# school_market_performance 表文档
## 表概述
**表名**: school_market_performance
**功能**: 市场绩效管理表,用于记录和管理市场人员的绩效数据,包括绩效金额、资源数量、绩效配置和算法等,为市场人员的绩效考核和薪酬计算提供数据支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
personnel_id int NULL YES NULL select,insert,update,references 人员ID
campus_id int NULL YES NULL select,insert,update,references 校区ID
performance_amount decimal(10,2) NULL YES 0.00 select,insert,update,references 绩效金额
resource_count int NULL YES NULL select,insert,update,references 资源数量
performance_date date NULL YES NULL select,insert,update,references 绩效日期
performance_config varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 绩效配置
performance_algorithm varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 绩效算法
status tinyint NULL YES NULL select,insert,update,references 1新录入2待联系3已关单
created_at timestamp NULL YES NULL select,insert,update,references 创建时间
updated_at timestamp NULL YES NULL select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **绩效记录**: 记录市场人员的日常绩效数据和业绩表现
- **绩效计算**: 根据配置的算法自动计算绩效金额
- **资源统计**: 统计市场人员获取的客户资源数量
- **绩效配置**: 管理不同的绩效计算配置和规则
- **状态跟踪**: 跟踪绩效记录的处理状态(新录入/待联系/已关单)
- **校区分析**: 按校区维度分析市场绩效表现
- **时间管理**: 按日期维度管理和查询绩效数据
- **算法管理**: 支持多种绩效计算算法和规则
- **绩效审核**: 对绩效数据进行审核和确认
### 业务场景
- **日常绩效录入**: 市场人员每日录入获取的客户资源和业绩数据
- **绩效计算**: 系统根据配置的算法自动计算绩效金额
- **绩效审核**: 管理人员审核和确认市场人员的绩效数据
- **薪酬计算**: 基于绩效数据计算市场人员的薪酬和奖金
- **业绩分析**: 分析市场人员和校区的业绩表现趋势
- **资源管理**: 管理和分配市场获取的客户资源
- **绩效考核**: 定期对市场人员进行绩效考核和评估
- **激励机制**: 根据绩效表现制定激励和奖惩措施
- **数据报表**: 生成各类绩效分析报表和统计数据
## 关联关系
### 可能的关联表
- **school_personnel**: 通过personnel_id关联人员信息表,获取市场人员详细信息
- **school_campus**: 通过campus_id关联校区表,确定绩效所属校区
- **school_member**: 关联学员表,统计市场人员获取的客户资源
- **school_contract**: 关联合同表,分析签约转化率和业绩
- **school_finance_record**: 关联财务记录,计算实际收入绩效
- **school_sys_config**: 关联系统配置,获取绩效计算参数
### 关联说明
- **与personnel表**: personnel_id关联school_personnel.id,确定绩效归属的市场人员
- **与campus表**: campus_id关联school_campus.id,确定绩效所属的校区
- **业务关联**: 通过人员和校区信息关联相关的业务数据
- **配置关联**: performance_config字段关联绩效配置规则
- **算法关联**: performance_algorithm字段关联具体的计算算法
- **时间关联**: performance_date字段用于时间维度的数据分析
## 索引建议
- **主键索引**: id字段(已存在)
- **人员索引**: personnel_id字段,用于查询特定人员的绩效记录
- **校区索引**: campus_id字段,用于按校区查询绩效数据
- **日期索引**: performance_date字段,用于按时间范围查询
- **状态索引**: status字段,用于按状态筛选绩效记录
- **复合索引**:
- (personnel_id, performance_date) 用于查询人员的时间范围绩效
- (campus_id, performance_date) 用于查询校区的时间范围绩效
- (status, performance_date) 用于查询特定状态的时间范围数据
## 注意事项
- **数据精度**: performance_amount使用decimal(10,2)确保金额计算精度
- **状态管理**: status字段值需要严格控制(1新录入/2待联系/3已关单)
- **算法配置**: performance_algorithm字段需要与系统支持的算法保持一致
- **日期有效性**: performance_date不能超过当前日期
- **权限控制**: 确保只有相关人员能够修改绩效数据
- **数据完整性**: personnel_id和campus_id必须在对应表中存在
- **计算准确性**: 绩效金额计算需要严格按照配置的算法执行
- **审核流程**: 重要的绩效数据变更需要经过审核流程
- **历史数据**: 已确认的绩效数据不应随意修改
- **性能优化**: 大量数据查询时需要合理使用索引和分页

121
niucloud/databasedoc/school_member.md

@ -0,0 +1,121 @@
# school_member 表文档
## 表概述
**表名**: school_member
**功能**: 会员用户管理表,存储教务系统中所有会员用户的基本信息、登录状态、积分余额、推广关系等核心数据
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
member_id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 主键
member_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 会员编码
pid int NULL NO 0 select,insert,update,references 推广会员id
username varchar(255) utf8mb4_general_ci NO select,insert,update,references 会员用户名
mobile varchar(20) utf8mb4_general_ci NO select,insert,update,references 手机号
password varchar(255) utf8mb4_general_ci NO select,insert,update,references 会员密码
nickname varchar(255) utf8mb4_general_ci NO select,insert,update,references 会员昵称
headimg varchar(1000) utf8mb4_general_ci NO select,insert,update,references 会员头像
member_level int NULL NO 0 select,insert,update,references 会员等级
member_label varchar(255) utf8mb4_general_ci NO select,insert,update,references 会员标签
wx_openid varchar(255) utf8mb4_general_ci NO select,insert,update,references 微信用户openid
weapp_openid varchar(255) utf8mb4_general_ci NO select,insert,update,references 微信小程序openid
wx_unionid varchar(255) utf8mb4_general_ci NO select,insert,update,references 微信unionid
ali_openid varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付宝账户id
douyin_openid varchar(255) utf8mb4_general_ci NO select,insert,update,references 抖音小程序openid
register_channel varchar(255) utf8mb4_general_ci NO H5 select,insert,update,references 注册来源
register_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 注册方式
login_ip varchar(255) utf8mb4_general_ci NO select,insert,update,references 当前登录ip
login_type varchar(255) utf8mb4_general_ci NO h5 select,insert,update,references 当前登录的操作终端类型
login_channel varchar(255) utf8mb4_general_ci NO select,insert,update,references
login_count int NULL NO 0 select,insert,update,references 登录次数
login_time int NULL NO 0 select,insert,update,references 当前登录时间
create_time int NULL NO 0 select,insert,update,references 注册时间
last_visit_time int NULL NO 0 select,insert,update,references 最后访问时间
last_consum_time int NULL NO 0 select,insert,update,references 最后消费时间
sex tinyint NULL NO 0 select,insert,update,references 性别 0保密 1男 2女
status tinyint NULL NO 1 select,insert,update,references 用户状态 用户状态默认为1
birthday varchar(20) utf8mb4_general_ci NO select,insert,update,references 出生日期
point int NULL NO 0 select,insert,update,references 可用积分
point_get int NULL NO 0 select,insert,update,references 累计获取积分
balance decimal(10,2) NULL NO 0.00 select,insert,update,references 可用余额
balance_get decimal(10,2) NULL NO 0.00 select,insert,update,references 累计获取余额
money decimal(10,2) NULL NO 0.00 select,insert,update,references 可用余额(可提现)
money_get decimal(10,2) NULL NO 0.00 select,insert,update,references 累计获取余额(可提现)
money_cash_outing decimal(10,2) NULL NO 0.00 select,insert,update,references 提现中余额(可提现)
growth int NULL NO 0 select,insert,update,references 成长值
growth_get int NULL NO 0 select,insert,update,references 累计获得成长值
commission decimal(10,2) NULL NO 0.00 select,insert,update,references 当前佣金
commission_get decimal(10,2) NULL NO 0.00 select,insert,update,references 佣金获取
commission_cash_outing decimal(10,2) NULL NO 0.00 select,insert,update,references 提现中佣金
is_member tinyint NULL NO 0 select,insert,update,references 是否是会员
member_time int NULL NO 0 select,insert,update,references 成为会员时间
is_del tinyint NULL NO 0 select,insert,update,references 0正常 1已删除
province_id int NULL NO 0 select,insert,update,references 省id
city_id int NULL NO 0 select,insert,update,references 市id
district_id int NULL NO 0 select,insert,update,references 区县id
address varchar(255) utf8mb4_general_ci NO select,insert,update,references 详细地址
location varchar(255) utf8mb4_general_ci NO select,insert,update,references 定位地址
delete_time int NULL NO 0 select,insert,update,references 删除时间
update_time int NULL NO 0 select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
1. **用户身份管理**: 存储会员基本信息(用户名、手机号、昵称、头像等)
2. **多平台登录支持**: 支持微信、支付宝、抖音等多平台账号绑定
3. **积分与余额管理**: 管理用户积分、余额、佣金等财务数据
4. **推广体系**: 支持会员推广关系管理(pid字段)
5. **用户等级管理**: 会员等级、标签、成长值等用户分层
6. **地理位置管理**: 用户地址、定位信息存储
### 业务场景
1. **用户注册登录**: 新用户注册、老用户多平台登录验证
2. **会员权益管理**: 根据会员等级提供不同服务权益
3. **积分商城**: 用户通过积分兑换课程或商品
4. **推广营销**: 会员推广新用户获得佣金奖励
5. **用户画像分析**: 基于用户行为数据进行精准营销
6. **财务结算**: 用户余额充值、消费、提现等财务操作
## 关联关系
### 主要关联表
1. **school_member_level**: 会员等级表(member_level字段关联)
2. **school_order**: 订单表(member_id关联)
3. **school_course_member**: 会员课程关联表
4. **school_point_log**: 积分变动记录表
5. **school_balance_log**: 余额变动记录表
6. **school_commission_log**: 佣金记录表
7. **sys_region**: 地区表(province_id, city_id, district_id关联)
### 关联说明
1. **推广关系**: pid字段形成会员推广树状结构
2. **财务关联**: 与各种财务日志表关联,记录资金变动
3. **课程关联**: 通过中间表与课程、班级等教学资源关联
4. **地理关联**: 与地区表关联,支持按地区统计分析
5. **等级关联**: 与会员等级表关联,实现会员分层管理
## 索引建议
1. **主键索引**: member_id(已存在)
2. **唯一索引**:
- mobile(手机号唯一)
- username(用户名唯一)
3. **普通索引**:
- pid(推广查询)
- member_level(等级筛选)
- status(状态筛选)
- create_time(注册时间排序)
- last_visit_time(活跃度分析)
4. **复合索引**:
- (status, member_level)(状态+等级查询)
- (province_id, city_id, district_id)(地区查询)
## 注意事项
1. **数据安全**: password字段需要加密存储,不可明文
2. **软删除**: 使用is_del字段实现软删除,保护历史数据
3. **财务精度**: 所有金额字段使用decimal(10,2)确保精度
4. **状态管理**: status字段控制用户可用性,需要业务逻辑配合
5. **多平台openid**: 各平台openid字段需要做唯一性校验
6. **积分余额**: 涉及财务的字段变更需要记录操作日志
7. **推广关系**: pid字段变更需要重新计算推广层级关系

101
niucloud/databasedoc/school_member_account_log.md

@ -0,0 +1,101 @@
# school_member_account_log 表文档
## 表概述
**表名**: school_member_account_log
**功能**: 会员账户日志表,负责记录会员账户的所有变动操作,包括积分、余额等账户数据的增减记录和审计追踪
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references
member_id int NULL NO 0 select,insert,update,references 用户id
account_type varchar(255) utf8mb4_general_ci NO point select,insert,update,references 账户类型
account_data decimal(10,2) NULL NO 0.00 select,insert,update,references 账户数据
account_sum decimal(10,2) NULL NO 0.00 select,insert,update,references 变动后的账户余额
from_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 来源类型
related_id varchar(50) utf8mb4_general_ci NO select,insert,update,references 关联Id
create_time int NULL NO 0 select,insert,update,references 创建时间
memo varchar(255) utf8mb4_general_ci NO select,insert,update,references 备注信息
```
## 功能用途
### 主要功能
1. **账户变动记录**: 记录会员账户的所有变动操作
2. **账户类型管理**: 支持多种账户类型(积分、余额等)
3. **变动金额跟踪**: 记录每次变动的具体金额
4. **余额计算**: 记录变动后的账户余额
5. **来源追踪**: 记录账户变动的来源类型
6. **关联业务**: 通过关联ID关联具体的业务操作
7. **操作备注**: 记录详细的操作说明和备注信息
8. **时间记录**: 记录操作的准确时间
9. **审计支持**: 提供完整的账户操作审计轨迹
### 业务场景
- 会员充值时增加账户余额
- 会员消费时扣减账户余额
- 积分获得和消费记录
- 会员退款时账户余额变动
- 系统调账和账户纠错
- 促销活动赠送积分或余额
- 会员等级升级奖励
- 推荐奖励和返利记录
- 账户冻结和解冻操作
- 财务对账和审计检查
## 关联关系
### 主要关联表
1. **school_member**: 通过member_id关联会员信息
2. **school_pay**: 通过related_id关联支付记录
3. **school_order_table**: 通过related_id关联订单信息
4. **school_contract**: 通过related_id关联合同记录
5. **school_member_level**: 会员等级变动关联
6. **school_member_sign**: 签到奖励关联
7. **school_sys_user**: 操作人员关联
8. **school_campus**: 校区操作关联
### 关联说明
- **会员关联**: member_id关联会员基本信息和账户状态
- **支付关联**: 充值、退款等操作关联支付记录
- **订单关联**: 消费扣款关联具体订单
- **合同关联**: 合同相关的账户操作
- **等级关联**: 会员等级变动产生的奖励记录
- **签到关联**: 签到获得的积分奖励
- **操作关联**: 记录具体的操作人员
- **校区关联**: 区分不同校区的账户操作
## 索引建议
- **主键索引**: id(已存在)
- **外键索引**: member_id(会员账户查询)
- **业务索引**:
- account_type(账户类型查询)
- from_type(来源类型查询)
- related_id(关联业务查询)
- **复合索引**:
- (member_id, account_type)(会员特定账户查询)
- (member_id, create_time)(会员时间序列查询)
- (from_type, related_id)(来源业务查询)
- (account_type, create_time)(类型时间查询)
- **时间索引**:
- create_time(时间范围查询)
- **金额索引**:
- account_data(金额范围查询)
## 注意事项
1. **数据完整性**: 所有字段都不能为空,确保日志完整性
2. **余额一致性**: account_sum必须与实际账户余额保持一致
3. **账户类型**: account_type需要严格控制枚举值
4. **金额精度**: 使用decimal(10,2)确保金额计算精度
5. **时间戳**: create_time使用时间戳格式记录
6. **只增不改**: 日志记录原则上只能新增,不能修改删除
7. **关联有效性**: related_id必须关联有效的业务记录
8. **来源追踪**: from_type必须明确标识变动来源
9. **并发控制**: 账户操作需要防止并发冲突
10. **备注规范**: memo字段应记录详细的操作说明
11. **审计要求**: 满足财务审计的相关要求
12. **数据备份**: 账户日志需要定期备份
13. **性能优化**: 大量日志数据需要考虑查询性能
14. **数据归档**: 历史日志数据需要定期归档
15. **监控告警**: 异常账户变动需要及时告警

95
niucloud/databasedoc/school_member_address.md

@ -0,0 +1,95 @@
# school_member_address 表文档
## 表概述
**表名**: school_member_address
**功能**: 会员地址管理表,用于存储和管理会员的收货地址信息,支持多地址管理、默认地址设置和地理位置定位
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references
member_id int NULL NO MUL 0 select,insert,update,references 会员id
name varchar(255) utf8mb4_general_ci NO select,insert,update,references 用户姓名
mobile varchar(255) utf8mb4_general_ci NO select,insert,update,references 手机
province_id int NULL NO 0 select,insert,update,references 省id
city_id int NULL NO 0 select,insert,update,references 市id
district_id int NULL NO 0 select,insert,update,references 区县id
address varchar(255) utf8mb4_general_ci NO select,insert,update,references 地址信息
address_name varchar(255) utf8mb4_general_ci NO select,insert,update,references
full_address varchar(255) utf8mb4_general_ci NO select,insert,update,references 详细地址信息
lng varchar(255) utf8mb4_general_ci NO select,insert,update,references 经度
lat varchar(255) utf8mb4_general_ci NO select,insert,update,references 纬度
is_default tinyint NULL NO 0 select,insert,update,references 是否是默认地址
```
## 功能用途
### 主要功能
- **多地址管理**: 支持会员添加和管理多个收货地址
- **默认地址设置**: 通过is_default字段设置和管理默认收货地址
- **地理位置定位**: 存储地址的经纬度信息,支持地图定位和距离计算
- **行政区划管理**: 通过省市区三级联动管理地址的行政区划
- **联系信息存储**: 存储收货人姓名和联系电话
- **详细地址记录**: 支持完整的地址信息存储,包括门牌号等详细信息
- **地址验证**: 支持地址信息的完整性和准确性验证
- **快速选择**: 为会员提供快速选择常用地址的功能
### 业务场景
- **商品配送**: 为会员购买的教材、用品等商品提供配送地址
- **证书邮寄**: 为学员的毕业证书、结业证书等提供邮寄地址
- **活动物料**: 为线上活动的奖品、礼品等提供收货地址
- **教学用品**: 为在线课程的教学用品、学习资料等提供配送服务
- **紧急联系**: 在紧急情况下作为会员的联系地址
- **就近服务**: 基于地理位置为会员推荐就近的校区或服务点
- **区域分析**: 分析会员的地理分布,优化服务布局
- **物流优化**: 基于地址信息优化配送路线和成本
## 关联关系
### 主要关联表
- **school_member**: 会员表,通过member_id关联会员基本信息
- **school_sys_area**: 地区表,通过province_id、city_id、district_id关联行政区划
- **school_order**: 订单表,关联订单的收货地址信息
- **school_delivery**: 配送表,关联配送记录和地址信息
- **school_campus**: 校区表,用于计算最近校区和服务范围
### 关联说明
- `member_id` 关联 `school_member.id`,标识地址所属的会员
- `province_id`、`city_id`、`district_id` 关联地区表,获取完整的行政区划信息
- 与订单系统关联,为订单提供准确的收货地址
- 与配送系统关联,支持物流配送和跟踪
- 与校区系统关联,计算会员与各校区的距离
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 会员索引(用于查询会员的所有地址)
INDEX idx_member_id (member_id)
-- 默认地址索引(用于快速查找默认地址)
INDEX idx_member_default (member_id, is_default)
-- 省市区索引(用于地区统计)
INDEX idx_province_city_district (province_id, city_id, district_id)
-- 手机号索引(用于联系方式查询)
INDEX idx_mobile (mobile)
-- 地理位置索引(用于位置查询)
INDEX idx_location (lng, lat)
```
## 注意事项
- **默认地址唯一性**: 每个会员只能有一个默认地址,设置新默认地址时需要取消其他地址的默认状态
- **地址完整性**: 确保地址信息的完整性,包括省市区和详细地址
- **联系方式验证**: 验证手机号格式的正确性和有效性
- **地理坐标精度**: 经纬度信息应保证足够精度,支持准确的位置计算
- **数据同步**: 地址变更时需要同步更新相关订单和配送信息
- **隐私保护**: 地址信息涉及用户隐私,需要严格的访问控制
- **地址验证**: 建议集成地址验证服务,确保地址的真实性
- **存储优化**: 对于大量地址数据,考虑分表或分区策略
- **缓存策略**: 常用地址信息可以适当缓存,提高查询效率
- **数据清理**: 定期清理无效或重复的地址信息

110
niucloud/databasedoc/school_member_cash_out.md

@ -0,0 +1,110 @@
# school_member_cash_out 表文档
## 表概述
**表名**: school_member_cash_out
**功能**: 会员提现管理表,用于管理会员的资金提现申请和处理流程,包括提现申请、审核、转账、状态跟踪等完整的提现业务流程,支持多种提现方式和账户类型,为会员资金管理和财务结算提供完整的提现服务
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
cash_out_no varchar(50) utf8mb4_general_ci NO select,insert,update,references 提现交易号
member_id int NULL NO 0 select,insert,update,references 会员id
account_type varchar(255) utf8mb4_general_ci NO money select,insert,update,references 提现账户类型
transfer_type varchar(20) utf8mb4_general_ci NO 0 select,insert,update,references 转账提现类型
transfer_realname varchar(50) utf8mb4_general_ci NO select,insert,update,references 联系人名称
transfer_mobile varchar(11) utf8mb4_general_ci NO select,insert,update,references 手机号
transfer_bank varchar(255) utf8mb4_general_ci NO select,insert,update,references 银行名称
transfer_account varchar(255) utf8mb4_general_ci NO select,insert,update,references 收款账号
transfer_payee varchar(255) utf8mb4_general_ci NO select,insert,update,references 转账收款方(json),主要用于对接在线的打款方式
transfer_payment_code varchar(500) utf8mb4_general_ci NO select,insert,update,references 收款码图片
transfer_fail_reason varchar(255) utf8mb4_general_ci NO select,insert,update,references 失败原因
transfer_status varchar(20) utf8mb4_general_ci NO select,insert,update,references 转账状态
transfer_time int NULL NO 0 select,insert,update,references 转账时间
apply_money decimal(10,2) NULL NO 0.00 select,insert,update,references 提现申请金额
rate decimal(10,2) NULL NO 0.00 select,insert,update,references 提现手续费比率
service_money decimal(10,2) NULL NO 0.00 select,insert,update,references 提现手续费
money decimal(10,2) NULL NO 0.00 select,insert,update,references 提现到账金额
audit_time int NULL NO 0 select,insert,update,references 审核时间
status int NULL NO 0 select,insert,update,references 状态1待审核2.待转账3已转账 -1拒绝 -2 已取消
remark varchar(255) utf8mb4_general_ci NO select,insert,update,references 备注
create_time int NULL NO 0 select,insert,update,references 申请时间
refuse_reason varchar(255) utf8mb4_general_ci NO select,insert,update,references 拒绝理由
update_time int NULL NO 0 select,insert,update,references
transfer_no varchar(50) utf8mb4_general_ci NO select,insert,update,references 转账单号
cancel_time int NULL NO 0 select,insert,update,references 取消时间
final_transfer_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 转账方式
```
## 功能用途
### 主要功能
- **会员提现申请管理**: 处理会员的提现申请,包括申请金额、手续费计算等
- **提现账户信息管理**: 管理提现的收款账户信息(银行卡、支付宝、微信等)
- **提现流程控制**: 管理提现的完整流程(申请→审核→转账→完成)
- **提现状态跟踪**: 实时跟踪提现状态变化和处理进度
- **手续费计算**: 根据提现金额和费率计算手续费,确定实际到账金额
- **转账记录管理**: 记录转账操作的详细信息和结果
- **审核机制**: 支持人工审核,防范风险和异常提现
- **失败处理**: 记录提现失败原因,支持重新处理
- **取消机制**: 支持用户主动取消提现申请
### 业务场景
- **会员余额提现**: 会员将账户余额提现到银行卡或第三方支付账户
- **佣金提现**: 推广员或代理商提现佣金收入
- **退费提现**: 课程退费后的资金提现
- **批量提现处理**: 财务人员批量处理提现申请
- **提现审核**: 风控人员审核大额或异常提现申请
- **自动转账**: 系统自动处理符合条件的提现申请
- **提现对账**: 与银行或第三方支付平台进行提现对账
- **提现统计**: 生成提现相关的财务报表和统计数据
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (member_id)
- `school_member_cash_out_account`: 提现账户表 (通过member_id和账户信息关联)
- `school_member_account`: 会员账户表 (member_id)
- `school_pay`: 支付记录表 (通过业务关联)
- `school_sys_user`: 系统用户表 (审核人员信息)
- `school_member_account_log`: 账户流水表 (资金变动记录)
### 关联说明
- **会员关联**: member_id关联会员基本信息,确定提现申请人
- **账户关联**: 与会员账户表关联,验证可提现余额
- **收款账户**: 通过账户类型和账户信息关联具体的收款方式
- **资金流水**: 提现成功后在账户流水表中记录资金变动
- **审核关联**: 审核操作可能关联系统用户信息
- **支付关联**: 提现可能涉及原始支付记录的关联
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**: cash_out_no (提现交易号唯一性)
- **外键索引**: member_id (会员查询)
- **状态索引**: status (状态查询)
- **时间索引**:
- create_time (申请时间查询)
- audit_time (审核时间查询)
- transfer_time (转账时间查询)
- **复合索引**:
- (member_id, status) (会员提现状态查询)
- (status, create_time) (状态时间查询)
- (transfer_status, transfer_time) (转账状态时间查询)
- (account_type, status) (账户类型状态查询)
## 注意事项
- **金额精度**: 所有金额字段使用decimal(10,2),确保财务计算精度
- **状态流转**: 提现状态有严格的流转规则,不能随意跳跃
- **余额验证**: 提现前必须验证会员账户余额是否充足
- **手续费计算**: 手续费计算必须准确,避免财务差错
- **账户安全**: 收款账户信息需要验证真实性和有效性
- **审核机制**: 大额提现或异常提现必须人工审核
- **时间逻辑**: 各个时间字段的逻辑关系必须正确
- **失败处理**: 提现失败时必须记录详细原因,便于问题排查
- **取消限制**: 已审核或已转账的提现不能取消
- **重复申请**: 防止同一笔资金重复申请提现
- **数据一致性**: 提现成功后必须同步更新会员账户余额
- **日志记录**: 所有提现操作都应该有详细的日志记录
- **风控规则**: 建立完善的风控规则,防范异常提现
- **对账机制**: 定期与银行或第三方支付平台进行对账

74
niucloud/databasedoc/school_member_cash_out_account.md

@ -0,0 +1,74 @@
# school_member_cash_out_account 表文档
## 表概述
**表名**: school_member_cash_out_account
**功能**: 会员提现账户管理表,用于存储和管理会员的提现账户信息,支持多种账户类型和支付方式,为会员资金提现提供安全可靠的账户管理服务
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
account_id int NULL NO PRI NULL auto_increment select,insert,update,references
member_id int NULL NO 0 select,insert,update,references 会员id
account_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 账户类型
bank_name varchar(255) utf8mb4_general_ci NO select,insert,update,references 银行名称
realname varchar(255) utf8mb4_general_ci NO select,insert,update,references 真实名称
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 修改时间
account_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 提现账户
transfer_payment_code varchar(255) utf8mb4_general_ci NO select,insert,update,references 收款码
```
## 功能用途
### 主要功能
- **提现账户管理**: 存储会员的提现账户信息,支持多种账户类型
- **银行账户绑定**: 管理会员绑定的银行卡信息,包括银行名称、账户号码
- **收款码管理**: 支持移动支付收款码的存储和管理
- **实名认证**: 记录账户持有人的真实姓名信息
- **账户安全**: 提供账户创建和修改的时间追踪
### 业务场景
- **会员提现申请**: 会员申请提现时选择已绑定的提现账户
- **多账户管理**: 支持会员绑定多个不同类型的提现账户
- **风控审核**: 提现审核时验证账户信息的真实性和有效性
- **财务结算**: 财务人员根据账户信息进行资金转账操作
- **账户变更**: 会员可以修改或更新已绑定的账户信息
## 关联关系
### 主要关联表
- **school_member**: 通过member_id关联会员基础信息
- **school_member_cash_out**: 关联具体的提现申请记录
- **school_pay**: 可能关联支付相关的账户验证
### 关联说明
- `member_id``school_member.member_id`: 一对多关系,一个会员可以有多个提现账户
- 与提现申请表形成业务关联,提现时选择对应的账户信息
- 支持账户类型的扩展,适应不同的支付方式需求
## 索引建议
```sql
-- 主键索引(已存在)
PRIMARY KEY (account_id)
-- 会员账户查询索引
INDEX idx_member_id (member_id)
-- 账户类型查询索引
INDEX idx_account_type (account_type)
-- 复合索引:会员+账户类型
INDEX idx_member_account_type (member_id, account_type)
-- 创建时间索引
INDEX idx_create_time (create_time)
```
## 注意事项
- **数据安全**: 银行账户信息属于敏感数据,需要加密存储
- **实名验证**: 真实姓名必须与银行账户持有人一致
- **账户唯一性**: 同一会员的同类型账户应避免重复绑定
- **状态管理**: 建议增加账户状态字段(启用/禁用)
- **审核机制**: 新增账户应经过审核验证后才能用于提现
- **日志记录**: 账户信息的修改应记录详细的操作日志

95
niucloud/databasedoc/school_member_label.md

@ -0,0 +1,95 @@
# school_member_label 表文档
## 表概述
**表名**: school_member_label
**功能**: 会员标签管理表,负责管理教务系统中的会员标签分类,包括标签创建、分类管理、排序设置等会员分组和标识功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
label_id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 标签id
label_name varchar(50) utf8mb4_general_ci NO select,insert,update,references 标签名称
memo varchar(1000) utf8mb4_general_ci NO select,insert,update,references 备注
sort int NULL NO 0 select,insert,update,references 排序
create_time int NULL NO 0 select,insert,update,references 添加时间
update_time int NULL NO 0 select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
- **标签创建管理**: 创建和管理各种会员标签类型
- **标签分类**: 对会员进行分类标识和管理
- **排序控制**: 设置标签的显示顺序和优先级
- **标签描述**: 提供标签的详细说明和备注信息
- **标签维护**: 支持标签的修改、删除和更新操作
- **标签统计**: 统计各标签下的会员数量
- **标签筛选**: 支持基于标签的会员筛选和查询
- **标签应用**: 为会员分配和移除标签
- **标签权限**: 控制标签的使用权限和可见性
### 业务场景
- **会员分组**: 根据不同特征对会员进行分组管理
- **营销活动**: 基于标签进行精准营销和推广
- **课程推荐**: 根据会员标签推荐合适的课程
- **权益管理**: 为不同标签的会员提供差异化权益
- **数据分析**: 基于标签进行会员行为分析
- **客户服务**: 根据标签提供个性化服务
- **活动报名**: 限制特定标签会员参与活动
- **消息推送**: 向特定标签会员推送消息
- **会员筛选**: 在各种业务场景中筛选目标会员
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (标签关联)
- `school_member_label_relation`: 会员标签关系表 (多对多关联)
- `school_diy_form_write_config`: 表单配置表 (标签筛选)
- `school_course`: 课程表 (课程推荐)
- `school_activity`: 活动表 (活动参与限制)
- `school_message`: 消息表 (消息推送)
- `school_personnel`: 人员表 (标签管理权限)
- `sys_log`: 系统日志表 (标签操作日志)
### 关联说明
- **会员关联**: 通过关系表与会员信息建立多对多关联
- **表单关联**: 在表单配置中用于筛选参与人员
- **课程关联**: 基于标签进行课程推荐和限制
- **活动关联**: 控制活动的参与人员范围
- **消息关联**: 实现精准的消息推送和通知
- **权限关联**: 控制标签的创建和管理权限
- **日志关联**: 记录标签的操作和变更历史
- **业务关联**: 在各种业务场景中作为筛选条件
## 索引建议
- **主键索引**: label_id (已存在)
- **唯一索引**: label_name (标签名称唯一)
- **业务索引**:
- sort (排序查询)
- create_time (创建时间查询)
- update_time (更新时间查询)
- **复合索引**:
- (sort, create_time) (排序时间查询)
- **全文索引**:
- label_name (标签名称搜索)
- memo (备注内容搜索)
## 注意事项
- **标签名称唯一性**: label_name必须保持唯一,避免重复标签
- **排序值管理**: sort字段需要合理设置,避免排序冲突
- **标签删除检查**: 删除标签前需要检查是否有会员关联
- **备注信息完整性**: memo字段应提供清晰的标签说明
- **标签层级**: 如需要层级结构,需要扩展表结构
- **标签数量控制**: 避免创建过多无用标签影响管理
- **权限控制**: 标签的创建和修改需要适当的权限控制
- **标签应用**: 标签分配给会员时需要验证标签有效性
- **数据一致性**: 标签修改时需要同步更新相关业务
- **性能考虑**: 大量标签时需要考虑查询性能
- **标签规范**: 建立标签命名和使用规范
- **定期清理**: 定期清理无用或过期的标签
- **标签统计**: 定期统计标签使用情况和效果
- **备份恢复**: 重要标签配置需要备份
- **版本控制**: 标签变更需要记录历史版本
- **国际化**: 多语言环境下标签名称的处理
- **缓存策略**: 频繁使用的标签可以缓存提升性能

98
niucloud/databasedoc/school_member_level.md

@ -0,0 +1,98 @@
# school_member_level 表文档
## 表概述
**表名**: school_member_level
**功能**: 会员等级管理表,负责管理教务系统中的会员等级体系、成长值要求、等级权益、等级礼包等会员激励机制
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
level_id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 会员等级
level_name varchar(50) utf8mb4_general_ci NO select,insert,update,references 等级名称
growth int NULL NO 0 select,insert,update,references 所需成长值
remark varchar(255) utf8mb4_general_ci NO select,insert,update,references 备注
status int NULL NO 1 select,insert,update,references 状态 0已禁用1已启用
create_time int NULL NO 0 select,insert,update,references 添加时间
update_time int NULL NO 0 select,insert,update,references 更新时间
level_benefits text utf8mb4_general_ci YES NULL select,insert,update,references 等级权益
level_gifts text utf8mb4_general_ci YES NULL select,insert,update,references 等级礼包
```
## 功能用途
### 主要功能
- **等级体系管理**: 建立完整的会员等级体系和等级名称
- **成长值设定**: 设定各等级所需的成长值门槛
- **等级权益管理**: 配置不同等级享有的权益和特权
- **等级礼包配置**: 设置等级升级时的奖励礼包
- **等级状态控制**: 管理等级的启用和禁用状态
- **等级排序**: 支持等级的排序和层级管理
- **权益差异化**: 实现不同等级的差异化服务
- **激励机制**: 通过等级体系激励会员消费和活跃
- **等级备注**: 支持等级说明和备注信息
### 业务场景
- **会员注册**: 新会员默认分配初始等级
- **等级升级**: 会员达到成长值要求时自动升级
- **权益享受**: 会员根据等级享受相应权益和服务
- **礼包发放**: 等级升级时自动发放等级礼包
- **营销活动**: 基于等级开展差异化营销活动
- **服务定价**: 不同等级享受不同的服务价格
- **客户维护**: 通过等级体系维护高价值客户
- **数据分析**: 分析不同等级会员的行为和价值
- **等级调整**: 根据业务需要调整等级体系
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (会员等级关联)
- `school_member_account_log`: 会员账户日志表 (成长值变化记录)
- `school_order_table`: 订单表 (消费产生成长值)
- `school_contract`: 合同表 (签约产生成长值)
- `school_pay`: 支付表 (支付产生成长值)
- `school_member_sign`: 会员签到表 (签到产生成长值)
- `school_course`: 课程表 (等级享受课程优惠)
- `school_gift`: 赠品表 (等级礼包关联)
### 关联说明
- **会员关联**: 会员表中的level_id字段关联此表的level_id
- **成长值关联**: 会员的各种行为产生成长值,影响等级升级
- **消费关联**: 订单、合同、支付等消费行为产生成长值
- **活跃关联**: 签到、学习等活跃行为产生成长值
- **权益关联**: 等级权益影响课程价格、服务质量等
- **礼包关联**: 等级升级时发放相应的礼品和优惠
- **营销关联**: 等级信息用于精准营销和客户分层
## 索引建议
- **主键索引**: level_id (已存在)
- **唯一索引**:
- level_name (等级名称唯一)
- growth (成长值唯一,避免重复门槛)
- **业务索引**:
- status (状态查询)
- sort (排序查询)
- **复合索引**:
- (status, sort) (有效等级排序查询)
- (growth, status) (成长值门槛查询)
- **时间索引**:
- create_time (创建时间查询)
- update_time (更新时间查询)
## 注意事项
- **等级唯一性**: level_name必须唯一,避免等级名称重复
- **成长值递增**: growth值应该递增设置,确保等级层次合理
- **成长值唯一**: 同一成长值不能对应多个等级
- **状态控制**: 禁用等级时需要考虑现有会员的处理
- **权益格式**: level_benefits字段建议使用JSON格式存储
- **礼包格式**: level_gifts字段建议使用JSON格式存储
- **等级排序**: sort字段用于控制等级显示顺序
- **数据完整性**: 删除等级前需要检查是否有会员使用
- **升级逻辑**: 会员成长值达到门槛时需要自动升级
- **降级处理**: 需要考虑是否支持等级降级机制
- **权益兑现**: 等级权益需要在相关业务中实际生效
- **礼包发放**: 等级升级时需要自动发放对应礼包
- **历史记录**: 建议记录会员等级变更历史
- **缓存策略**: 等级信息变更频率低,适合缓存
- **权限控制**: 等级配置需要严格的权限控制
- **数据备份**: 等级配置是核心业务数据,需要定期备份

101
niucloud/databasedoc/school_member_sign.md

@ -0,0 +1,101 @@
# school_member_sign 表文档
## 表概述
**表名**: school_member_sign
**功能**: 会员签到记录表,负责管理教务系统中的会员签到功能,包括签到记录、签到统计、连续签到、签到奖励等会员活跃度管理功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
sign_id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references
member_id int NULL NO 0 select,insert,update,references 会员id
days int NULL NO 0 select,insert,update,references 连续签到天数
day_award varchar(255) utf8mb4_general_ci NO select,insert,update,references 日签奖励
continue_award varchar(255) utf8mb4_general_ci NO select,insert,update,references 连签奖励
continue_tag varchar(30) utf8mb4_general_ci NO select,insert,update,references 连签奖励标识
create_time int NULL NO 0 select,insert,update,references 签到时间
start_time int NULL NO 0 select,insert,update,references 签到周期开始时间
is_sign tinyint(1) NULL NO 0 select,insert,update,references 是否签到(0未签到 1已签到)
```
## 功能用途
### 主要功能
- **签到记录**: 记录会员每日签到情况和时间
- **签到统计**: 统计会员的签到次数和频率
- **连续签到**: 计算和记录会员连续签到天数
- **签到奖励**: 根据签到情况发放积分或奖励
- **签到提醒**: 提醒会员进行每日签到
- **签到历史**: 查看会员的历史签到记录
- **签到排行**: 展示签到排行榜和活跃度排名
- **补签功能**: 支持会员补签漏签的日期
- **签到验证**: 验证签到的有效性和防作弊
- **签到分析**: 分析会员签到行为和活跃度
### 业务场景
- **会员活跃**: 通过签到提升会员活跃度和粘性
- **积分获取**: 会员通过签到获得积分奖励
- **习惯养成**: 培养会员定期访问的习惯
- **数据分析**: 分析会员活跃度和使用频率
- **营销活动**: 基于签到数据开展营销活动
- **会员等级**: 签到作为会员等级提升的条件
- **课程提醒**: 结合签到提醒会员上课
- **社区建设**: 通过签到增强社区氛围
- **用户留存**: 提高用户留存率和回访率
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (签到用户)
- `school_member_account_log`: 会员账户日志表 (签到奖励)
- `school_member_sign_config`: 签到配置表 (签到规则)
- `school_course`: 课程表 (课程签到)
- `school_class`: 班级表 (班级签到)
- `school_activity`: 活动表 (活动签到)
- `school_message`: 消息表 (签到提醒)
- `sys_log`: 系统日志表 (签到日志)
### 关联说明
- **会员关联**: 记录具体会员的签到行为和数据
- **账户关联**: 签到奖励通过账户日志记录积分变化
- **配置关联**: 根据签到配置执行签到规则和奖励
- **课程关联**: 课程相关的签到记录和统计
- **班级关联**: 班级成员的签到情况统计
- **活动关联**: 活动期间的特殊签到要求
- **消息关联**: 发送签到提醒和奖励通知
- **日志关联**: 记录签到操作的详细日志
- **业务关联**: 与各种业务场景的签到需求关联
## 索引建议
- **主键索引**: sign_id (已存在)
- **业务索引**:
- member_id (会员查询)
- sign_date (签到日期查询)
- create_time (创建时间查询)
- continuous_days (连续天数查询)
- **复合索引**:
- (member_id, sign_date) (会员签到记录查询)
- (member_id, create_time) (会员签到历史)
- (sign_date, create_time) (日期时间查询)
- **唯一索引**:
- (member_id, sign_date) (防止重复签到)
## 注意事项
- **重复签到防护**: 同一会员同一天只能签到一次
- **时间有效性**: 签到时间需要在有效的时间范围内
- **连续天数计算**: 连续签到天数的计算逻辑要准确
- **时区处理**: 跨时区用户的签到时间处理
- **补签限制**: 补签功能需要设置合理的时间限制
- **奖励发放**: 签到奖励的发放需要保证准确性
- **数据一致性**: 签到记录与奖励记录保持一致
- **性能优化**: 大量签到数据的查询性能优化
- **防作弊机制**: 防止恶意刷签到的安全措施
- **数据清理**: 定期清理过期的签到数据
- **统计准确性**: 签到统计数据的准确性验证
- **异常处理**: 处理签到过程中的各种异常情况
- **缓存策略**: 签到状态和统计数据的缓存
- **并发控制**: 高并发签到时的数据一致性
- **历史数据**: 长期签到历史数据的存储策略
- **备份恢复**: 重要签到数据的备份和恢复
- **监控告警**: 签到异常情况的监控和告警

118
niucloud/databasedoc/school_order_table.md

@ -0,0 +1,118 @@
# school_order_table 表文档
## 表概述
**表名**: school_order_table
**功能**: 订单信息管理表,负责管理教务系统中的所有订单信息,包括新订单、续费订单、转校订单等各种类型的订单处理
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 订单编号
payment_id varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 支付编号
order_type varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 订单类型1新订单2续费订单3内部员工订单4 转校 5 客户内转课订单
order_status enum('pending','paid','signed','completed','transfer') utf8mb4_general_ci YES pending select,insert,update,references 订单状态: pending-待支付, paid-已支付,signed待签约,completed已完成,transfer转学
payment_type enum('cash','scan_code','subscription','wxpay_online') utf8mb4_general_ci NO NULL select,insert,update,references 付款类型: cash-现金支付, scan_code-扫码支付, subscription-订阅支付, wxpay_online-微信在线代付
order_amount decimal(10,2) NULL NO NULL select,insert,update,references 订单金额
course_id int NULL NO NULL select,insert,update,references 课程ID
class_id int NULL YES NULL select,insert,update,references 班级ID
staff_id int NULL NO NULL select,insert,update,references 人员ID|员工表school_personnel.id
resource_id int NULL NO NULL select,insert,update,references 资源ID|客户资源表school_customer_resources.id
after_sales_status varchar(50) utf8mb4_general_ci YES NULL select,insert,update,references 售后状态
after_sales_reason text utf8mb4_general_ci YES NULL select,insert,update,references 售后原因
after_sales_time timestamp NULL YES NULL select,insert,update,references 售后时间
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
payment_time timestamp NULL YES NULL select,insert,update,references 支付时间
subscription_payment_time timestamp NULL YES NULL select,insert,update,references 订阅支付生成时间
ipv3 varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references
accounting_time timestamp NULL YES NULL select,insert,update,references 核算时间
campus_id int NULL NO NULL select,insert,update,references 校区ID
gift_id int NULL YES NULL select,insert,update,references 赠品 id
discount_amount decimal(10,2) NULL YES NULL select,insert,update,references 优惠金额
course_plan_id int NULL YES NULL select,insert,update,references 课程计划 id
student_id int NULL NO NULL select,insert,update,references 学员 id
remark varchar(512) utf8mb4_general_ci YES NULL select,insert,update,references 订单备注
contract_id int NULL YES NULL select,insert,update,references 合同 id
gift_type tinyint NULL YES NULL select,insert,update,references 赠品使用类型 1 减现2 赠课
```
## 功能用途
### 主要功能
- **订单生命周期管理**: 管理从订单创建到完成的全流程状态跟踪
- **多类型订单支持**: 支持新订单、续费订单、内部员工订单、转校订单、客户内转课订单
- **支付管理**: 关联支付信息,支持多种支付方式(现金、扫码、订阅、微信在线代付)
- **课程订单关联**: 建立订单与课程、班级的关联关系
- **售后服务管理**: 处理订单售后状态、原因和时间记录
- **财务核算**: 订单金额、优惠金额、核算时间等财务相关信息管理
- **赠品管理**: 支持赠品关联和赠品类型管理(减现、赠课)
- **合同关联**: 订单与合同的关联管理
### 业务场景
- **订单创建**: 学员报名时创建新订单,记录课程、金额、支付方式等信息
- **续费管理**: 处理学员续费订单,延续学习服务
- **转校业务**: 处理学员转校相关的订单和费用结算
- **内部订单**: 处理员工内部订单,可能享受特殊优惠政策
- **支付处理**: 跟踪订单支付状态,从待支付到已支付的状态流转
- **售后服务**: 处理退费、换课等售后需求
- **财务结算**: 进行订单核算,生成财务报表
- **营销活动**: 通过赠品和优惠金额支持各种营销活动
## 关联关系
### 主要关联表
- `school_course`: 课程信息表 (course_id)
- `school_class`: 班级信息表 (class_id)
- `school_personnel`: 人员信息表 (staff_id)
- `school_customer_resources`: 客户资源表 (resource_id)
- `school_campus`: 校区信息表 (campus_id)
- `school_member`: 学员信息表 (student_id)
- `school_contract`: 合同信息表 (contract_id)
- `school_pay`: 支付信息表 (payment_id)
- `school_course_plan`: 课程计划表 (course_plan_id)
- `school_gift`: 赠品信息表 (gift_id)
### 关联说明
- **课程关联**: 通过course_id关联具体课程,class_id关联具体班级
- **人员关联**: staff_id关联处理订单的员工,student_id关联购买的学员
- **支付关联**: payment_id关联支付记录,跟踪支付状态和支付方式
- **合同关联**: contract_id关联生成的合同,建立订单与合同的对应关系
- **校区关联**: campus_id确定订单所属校区,用于区域化管理
- **资源关联**: resource_id关联客户资源,跟踪订单来源
- **赠品关联**: gift_id关联赠品信息,支持营销活动
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- course_id (课程查询)
- class_id (班级查询)
- staff_id (员工订单查询)
- student_id (学员订单查询)
- campus_id (校区订单查询)
- contract_id (合同关联查询)
- **状态索引**: order_status (订单状态查询)
- **时间索引**:
- created_at (创建时间查询)
- payment_time (支付时间查询)
- accounting_time (核算时间查询)
- **复合索引**:
- (student_id, order_status) (学员订单状态查询)
- (campus_id, created_at) (校区订单时间查询)
- (order_type, order_status) (订单类型状态查询)
- (payment_type, order_status) (支付方式状态查询)
## 注意事项
- **金额精度**: order_amount和discount_amount使用decimal(10,2),确保财务计算精度
- **状态流转**: 订单状态有严格的流转规则,不能随意跳跃状态
- **支付关联**: payment_id可能为空,表示未关联支付记录的订单
- **订单类型**: order_type决定了订单的处理流程和业务逻辑
- **售后处理**: 售后状态、原因、时间需要同步更新,保持数据一致性
- **时间逻辑**: 支付时间不能早于创建时间,核算时间不能早于支付时间
- **校区归属**: 订单必须归属于特定校区,不能为空
- **学员关联**: student_id不能为空,每个订单必须有明确的学员
- **合同生成**: 订单状态为signed时,应该有对应的contract_id
- **赠品逻辑**: gift_type和gift_id需要配套使用,确保赠品逻辑正确
- **优惠计算**: 实际支付金额 = order_amount - discount_amount
- **数据完整性**: 删除订单时需要考虑关联数据的处理
- **权限控制**: 不同角色对订单的操作权限需要严格控制

108
niucloud/databasedoc/school_pay.md

@ -0,0 +1,108 @@
# school_pay 表文档
## 表概述
**表名**: school_pay
**功能**: 支付信息管理表,负责管理教务系统中的所有支付记录,包括支付流水、支付状态、支付方式等核心支付信息
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 主键
main_id int NULL NO 0 select,insert,update,references 支付会员id
from_main_id int NULL NO 0 select,insert,update,references 发起支付会员id
out_trade_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付流水号
trade_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 业务类型
trade_id int NULL NO 0 select,insert,update,references 业务id
trade_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 交易单号
body varchar(1000) utf8mb4_general_ci NO select,insert,update,references 支付主体
money decimal(10,2) NULL NO NULL select,insert,update,references 支付金额
voucher varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付票据
status int NULL NO 0 select,insert,update,references 支付状态(0.待支付 1. 支付中 2. 已支付 -1已取消)
json varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付扩展用支付信息
create_time int NULL NO 0 select,insert,update,references 创建时间
pay_time int NULL NO 0 select,insert,update,references 支付时间
cancel_time int NULL NO 0 select,insert,update,references 关闭时间
type varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付方式
mch_id varchar(50) utf8mb4_general_ci NO select,insert,update,references 商户收款账号
main_type varchar(255) utf8mb4_general_ci NO select,insert,update,references
channel varchar(50) utf8mb4_general_ci NO select,insert,update,references 支付渠道
fail_reason varchar(255) utf8mb4_general_ci NO select,insert,update,references 失败原因
```
## 功能用途
### 主要功能
- **支付流水管理**: 生成和管理唯一的支付流水号,确保支付记录可追溯
- **多业务类型支持**: 支持不同业务类型的支付处理(订单支付、充值等)
- **支付状态跟踪**: 实时跟踪支付状态(待支付、支付中、已支付、已取消)
- **多支付方式**: 支持多种支付渠道和支付方式
- **代付功能**: 支持发起支付会员和实际支付会员的分离管理
- **支付票据管理**: 管理支付凭证和票据信息
- **商户账号管理**: 管理不同的商户收款账号
- **支付时间记录**: 记录支付创建、完成、取消等关键时间节点
- **失败原因追踪**: 记录支付失败的具体原因,便于问题排查
### 业务场景
- **订单支付**: 学员购买课程时的支付处理
- **充值支付**: 学员账户余额充值
- **代付服务**: 家长为孩子支付学费等代付场景
- **退款处理**: 处理退费相关的支付记录
- **支付对账**: 与第三方支付平台进行对账
- **财务结算**: 生成财务报表和收入统计
- **支付监控**: 监控支付成功率和失败原因
- **风控管理**: 识别异常支付行为
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (main_id, from_main_id)
- `school_order_table`: 订单信息表 (通过trade_id关联)
- `school_contract`: 合同信息表 (通过trade_id关联)
- `school_refund`: 退款信息表 (通过trade_id关联)
- `school_recharge`: 充值记录表 (通过trade_id关联)
- `sys_pay_config`: 支付配置表 (通过type关联)
### 关联说明
- **会员关联**: main_id关联实际支付的会员,from_main_id关联发起支付的会员
- **业务关联**: 通过trade_type和trade_id关联具体的业务记录(订单、合同、充值等)
- **支付配置**: 通过type字段关联支付方式配置
- **商户关联**: mch_id关联具体的商户收款账号
- **渠道关联**: channel字段标识支付渠道来源
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**: out_trade_no (支付流水号唯一性)
- **外键索引**:
- main_id (支付会员查询)
- from_main_id (发起支付会员查询)
- **业务索引**:
- trade_type (业务类型查询)
- trade_id (业务ID查询)
- trade_no (交易单号查询)
- **状态索引**: status (支付状态查询)
- **时间索引**:
- create_time (创建时间查询)
- pay_time (支付时间查询)
- **复合索引**:
- (main_id, status) (会员支付状态查询)
- (trade_type, trade_id) (业务关联查询)
- (type, status) (支付方式状态查询)
- (create_time, status) (时间状态查询)
- (mch_id, status) (商户支付状态查询)
## 注意事项
- **流水号唯一性**: out_trade_no必须全局唯一,避免重复支付
- **金额精度**: money字段使用decimal(10,2),确保财务计算精度
- **状态流转**: 支付状态有严格的流转规则(0→1→2或0→-1)
- **时间逻辑**: pay_time不能早于create_time,cancel_time只在取消时设置
- **代付逻辑**: from_main_id和main_id可以不同,支持代付场景
- **业务关联**: trade_type和trade_id必须配套使用,确保业务关联正确
- **支付方式**: type字段决定了支付的具体处理逻辑
- **商户配置**: mch_id必须与系统配置的商户账号匹配
- **支付渠道**: channel字段用于区分不同的支付来源
- **失败处理**: 支付失败时必须记录fail_reason,便于问题排查
- **数据安全**: 支付相关敏感信息需要加密存储
- **幂等性**: 同一笔支付请求多次提交应该返回相同结果
- **对账机制**: 定期与第三方支付平台进行对账,确保数据一致性
- **监控告警**: 支付失败率过高时需要及时告警

82
niucloud/databasedoc/school_pay_channel.md

@ -0,0 +1,82 @@
# school_pay_channel 表文档
## 表概述
**表名**: school_pay_channel
**功能**: 支付渠道配置管理表,用于管理和配置各种支付方式的参数信息,包括微信支付、支付宝、银行卡等多种支付渠道,支持渠道启用控制、配置参数管理、排序设置和状态监控,为学校提供完整的支付渠道管理和配置功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 主键
type varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付类型
channel varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付渠道
config text utf8mb4_general_ci NO NULL select,insert,update,references 支付配置
create_time int NULL NO 0 select,insert,update,references 创建时间
update_time int NULL NO 0 select,insert,update,references 修改时间
status int NULL NO 0 select,insert,update,references 是否启用
sort int NULL NO 0 select,insert,update,references 排序
```
## 功能用途
### 主要功能
- **支付渠道管理**: 统一管理各种支付渠道的配置信息,支持多种支付方式
- **支付类型分类**: 按支付类型进行分类管理,如在线支付、线下支付等
- **渠道配置存储**: 存储各支付渠道的详细配置参数,如API密钥、商户号等
- **渠道状态控制**: 支持启用/禁用支付渠道,灵活控制可用的支付方式
- **渠道排序管理**: 支持支付渠道的排序功能,控制支付方式的展示顺序
- **配置参数管理**: 支持复杂的JSON配置存储,满足不同支付渠道的配置需求
- **时间追踪**: 记录支付渠道的创建和修改时间,便于配置变更追踪
- **渠道唯一标识**: 通过唯一ID确保支付渠道的准确识别和调用
### 业务场景
- **学费缴纳**: 为学员提供多种学费缴纳方式,如微信支付、支付宝、银行卡等
- **课程购买**: 支持在线课程购买的多种支付渠道选择
- **充值续费**: 为会员账户充值和课程续费提供便捷的支付方式
- **活动缴费**: 支持各类教育活动、比赛报名的在线缴费
- **教材费用**: 处理教材、资料等额外费用的支付
- **退费处理**: 配合退费流程,支持原路退回等退费方式
- **分期付款**: 支持学费分期付款的支付渠道配置
- **企业付款**: 为企业客户提供专门的支付渠道和配置
- **国际支付**: 支持国际学员的跨境支付需求
## 关联关系
### 主要关联表
- **school_pay**: 支付记录表,记录使用该支付渠道的具体支付信息
- **school_order_table**: 订单表,关联订单的支付渠道选择
- **school_member_account_log**: 会员账户日志表,记录通过该渠道的充值记录
- **school_refund_record**: 退费记录表,记录退费时使用的支付渠道
- **school_campus**: 校区表,不同校区可能配置不同的支付渠道
- **school_sys_config**: 系统配置表,可能存储全局的支付配置信息
### 关联说明
- 与 `school_pay` 关联,记录每笔支付使用的具体支付渠道
- 与 `school_order_table` 关联,订单可以选择可用的支付渠道
- 与 `school_member_account_log` 关联,记录会员充值使用的支付方式
- 与退费系统关联,支持原支付渠道的退费处理
- 与财务系统关联,提供支付渠道的财务对账和统计
- 与风控系统关联,监控不同支付渠道的风险情况
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **支付类型索引**: `INDEX idx_type (type)` - 支持按支付类型查询
- **支付渠道索引**: `INDEX idx_channel (channel)` - 支持按支付渠道查询
- **状态索引**: `INDEX idx_status (status)` - 支持按启用状态查询
- **排序索引**: `INDEX idx_sort (sort)` - 支持按排序字段查询
- **时间索引**: `INDEX idx_create_time (create_time)` - 支持按创建时间查询
- **复合索引**: `INDEX idx_type_status_sort (type, status, sort)` - 支持多条件查询
- **唯一索引**: `UNIQUE INDEX idx_type_channel (type, channel)` - 确保同类型下渠道唯一
## 注意事项
- **配置安全**: 支付渠道配置包含敏感信息,需要加密存储和传输
- **参数验证**: 严格验证支付渠道配置参数的正确性,避免支付失败
- **状态同步**: 及时同步支付渠道的可用状态,避免使用不可用渠道
- **配置备份**: 定期备份支付渠道配置,防止配置丢失
- **权限控制**: 严格控制支付渠道配置的修改权限,防止误操作
- **测试验证**: 配置变更后需要进行充分的测试验证
- **监控告警**: 建立支付渠道的监控告警机制,及时发现异常
- **合规要求**: 确保支付渠道配置符合相关法规和合规要求
- **版本管理**: 对支付渠道配置进行版本管理,支持配置回滚
- **日志记录**: 详细记录配置变更日志,便于问题追踪和审计

112
niucloud/databasedoc/school_pay_refund.md

@ -0,0 +1,112 @@
# school_pay_refund 表文档
## 表概述
**表名**: school_pay_refund
**功能**: 支付退款管理表,用于处理和管理各种业务场景下的退款申请和处理流程,包括课程退费、订单取消、服务纠纷等退款场景,支持多渠道退款、状态跟踪、失败处理和凭证管理,为学校提供完整的退款业务管理和财务对账功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 主键
refund_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 退款单号
out_trade_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付流水号
type varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付方式
channel varchar(50) utf8mb4_general_ci NO select,insert,update,references 支付渠道
money decimal(10,2) NULL NO 0.00 select,insert,update,references 支付金额
reason varchar(255) utf8mb4_general_ci NO select,insert,update,references 退款原因
status varchar(255) utf8mb4_general_ci NO 0 select,insert,update,references 支付状态(0.待退款 1. 退款中 2. 已退款 -1已关闭)
create_time int NULL NO 0 select,insert,update,references 创建时间
refund_time int NULL NO 0 select,insert,update,references 支付时间
close_time int NULL NO 0 select,insert,update,references 关闭时间
fail_reason varchar(255) utf8mb4_general_ci NO select,insert,update,references 失败原因
voucher varchar(255) utf8mb4_general_ci NO select,insert,update,references 支付凭证
trade_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 业务类型
trade_id varchar(50) utf8mb4_general_ci NO select,insert,update,references 业务关联id
refund_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 退款方式
main_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 操作人类型
main_id int NULL NO 0 select,insert,update,references 操作人
pay_refund_no varchar(255) utf8mb4_general_ci NO select,insert,update,references 外部支付方式的退款单号
```
## 功能用途
### 主要功能
- **退款申请管理**: 处理各种业务场景下的退款申请和审批流程
- **退款流程控制**: 管理退款的完整流程(申请→审核→退款→完成)
- **退款状态跟踪**: 实时跟踪退款状态变化和处理进度
- **多渠道退款**: 支持多种支付渠道的退款处理(微信、支付宝、银行卡等)
- **退款金额管理**: 精确计算和管理退款金额,支持部分退款
- **退款凭证管理**: 管理退款凭证和相关票据信息
- **失败处理机制**: 记录退款失败原因,支持重新处理
- **业务关联**: 与原始支付记录和相关业务进行关联
- **操作人员管理**: 记录退款操作的具体执行人员
### 业务场景
- **课程退费**: 学员申请课程退费的退款处理
- **订单取消退款**: 订单取消后的自动退款
- **服务纠纷退款**: 因服务质量问题产生的退款
- **系统错误退款**: 因系统错误导致的多收费用退款
- **部分退款**: 课程部分完成后的按比例退款
- **批量退款**: 因活动取消等原因的批量退款处理
- **退款审核**: 财务人员审核退款申请的合理性
- **退款对账**: 与第三方支付平台进行退款对账
## 关联关系
### 主要关联表
- `school_pay`: 支付记录表 (out_trade_no)
- `school_member`: 会员信息表 (main_id)
- `school_order`: 订单信息表 (通过trade_id关联)
- `school_contract`: 合同信息表 (通过trade_id关联)
- `school_course`: 课程信息表 (通过业务关联)
- `school_sys_user`: 系统用户表 (操作人员信息)
- `school_member_account`: 会员账户表 (退款到余额)
- `school_member_account_log`: 账户流水表 (资金变动记录)
### 关联说明
- **支付关联**: out_trade_no关联原始支付记录,确保退款与支付匹配
- **会员关联**: main_id关联退款接收方的会员信息
- **业务关联**: 通过trade_type和trade_id关联具体的业务记录
- **操作人关联**: main_id在不同main_type下关联不同类型的操作人员
- **账户关联**: 退款到余额时需要关联会员账户信息
- **流水关联**: 退款完成后在账户流水表中记录资金变动
- **渠道关联**: channel和type字段关联支付渠道配置
## 索引建议
- **主键索引**: id (已存在)
- **唯一索引**: refund_no (退款单号唯一性)
- **外键索引**:
- out_trade_no (支付流水号查询)
- main_id (操作人查询)
- **业务索引**:
- trade_type (业务类型查询)
- trade_id (业务ID查询)
- **状态索引**: status (退款状态查询)
- **时间索引**:
- create_time (创建时间查询)
- refund_time (退款时间查询)
- close_time (关闭时间查询)
- **复合索引**:
- (out_trade_no, status) (支付退款状态查询)
- (main_id, status) (操作人退款状态查询)
- (trade_type, trade_id) (业务关联查询)
- (type, status) (退款方式状态查询)
- (create_time, status) (时间状态查询)
## 注意事项
- **金额精度**: money字段使用decimal(10,2),确保财务计算精度
- **退款限制**: 退款金额不能超过原支付金额
- **状态流转**: 退款状态有严格的流转规则(0→1→2或0→-1)
- **时间逻辑**: refund_time不能早于create_time,close_time只在关闭时设置
- **支付关联**: 必须基于有效的支付记录才能发起退款
- **渠道一致性**: 退款渠道应与原支付渠道保持一致
- **重复退款**: 防止同一笔支付重复退款或超额退款
- **失败处理**: 退款失败时必须记录详细的fail_reason
- **凭证管理**: voucher字段用于存储退款凭证,确保可追溯
- **业务完整性**: trade_type和trade_id必须与原支付记录保持一致
- **操作权限**: 不同类型的操作人员有不同的退款权限
- **数据一致性**: 退款成功后必须同步更新相关业务状态
- **审核机制**: 大额退款需要多级审核确认
- **对账要求**: 定期与第三方支付平台进行退款对账
- **法律合规**: 退款操作需要符合相关法律法规要求

126
niucloud/databasedoc/school_pay_transfer.md

@ -0,0 +1,126 @@
# school_pay_transfer 表文档
## 表概述
**表名**: school_pay_transfer
**功能**: 支付转账管理表,用于记录和管理系统中的各类转账业务,包括会员提现、退费转账、佣金结算等多种转账类型,支持银行转账、在线支付等多种转账方式,为财务管理和资金流转提供完整的转账记录和状态跟踪
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
trade_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 业务类型
transfer_no varchar(50) utf8mb4_general_ci NO select,insert,update,references 转账单号
main_id int NULL NO 0 select,insert,update,references 会员id
main_type varchar(255) utf8mb4_general_ci NO select,insert,update,references 主体类型
transfer_type varchar(20) utf8mb4_general_ci NO select,insert,update,references 转账类型
transfer_realname varchar(50) utf8mb4_general_ci NO select,insert,update,references 联系人名称
transfer_mobile varchar(11) utf8mb4_general_ci NO select,insert,update,references 手机号
transfer_bank varchar(255) utf8mb4_general_ci NO select,insert,update,references 银行名称
transfer_account varchar(255) utf8mb4_general_ci NO select,insert,update,references 收款账号
transfer_voucher varchar(255) utf8mb4_general_ci NO select,insert,update,references 凭证
transfer_remark varchar(255) utf8mb4_general_ci NO select,insert,update,references 凭证说明
transfer_payment_code varchar(255) utf8mb4_general_ci NO select,insert,update,references 收款码图片
transfer_fail_reason varchar(2000) utf8mb4_general_ci NO select,insert,update,references 失败原因
transfer_status varchar(20) utf8mb4_general_ci NO select,insert,update,references 转账状态
money decimal(10,2) NULL NO 0.00 select,insert,update,references 转账金额
create_time int NULL NO 0 select,insert,update,references 申请时间
transfer_time int NULL NO 0 select,insert,update,references 转账时间
update_time int NULL NO 0 select,insert,update,references
openid varchar(50) utf8mb4_general_ci NO select,insert,update,references
remark varchar(255) utf8mb4_general_ci NO select,insert,update,references
batch_id varchar(500) utf8mb4_general_ci NO select,insert,update,references 转账批次id
transfer_payee varchar(500) utf8mb4_general_ci NO select,insert,update,references 在线转账数据(json)
out_batch_no varchar(500) utf8mb4_general_ci NO select,insert,update,references 扩展数据,主要用于记录接收到线上打款的业务数据编号
```
## 功能用途
### 主要功能
- **转账业务管理**: 处理多种类型的转账业务需求
- **转账单号生成**: 为每笔转账生成唯一的转账单号
- **主体信息管理**: 记录转账相关的主体信息和类型
- **收款信息管理**: 管理收款人的详细信息和账户信息
- **转账方式支持**: 支持银行转账、在线支付等多种转账方式
- **凭证管理**: 存储和管理转账凭证和收款码信息
- **状态跟踪**: 实时跟踪转账的处理状态和结果
- **失败处理**: 记录转账失败的原因和处理方案
- **批次管理**: 支持批量转账的批次管理功能
- **金额管理**: 精确记录和管理转账金额
- **时间管理**: 记录申请时间、转账时间等关键时间节点
### 业务场景
- **会员提现**: 处理会员账户余额的提现申请和转账
- **退费处理**: 处理学员退费的转账操作
- **佣金结算**: 处理销售人员、推荐人等的佣金转账
- **奖励发放**: 发放各类奖励和补贴的转账
- **供应商付款**: 向供应商或合作伙伴的付款转账
- **员工薪资**: 员工工资和奖金的转账发放
- **代理分润**: 代理商分润的转账结算
- **活动奖金**: 营销活动奖金的转账发放
- **保证金退还**: 各类保证金的退还转账
- **批量转账**: 批量处理多笔转账业务
- **紧急转账**: 处理紧急情况下的转账需求
- **定期结算**: 定期的财务结算转账
## 关联关系
### 主要关联表
- `school_member`: 会员信息表 (main_id关联,主体为会员时)
- `school_personnel`: 人员信息表 (main_id关联,主体为员工时)
- `school_pay`: 支付记录表 (关联原始支付信息)
- `school_pay_refund`: 退费记录表 (退费转账关联)
- `school_member_cash_out`: 会员提现表 (提现转账关联)
- `school_account_log`: 账户日志表 (资金变动记录)
- `school_sys_user`: 系统用户表 (操作人员信息)
- `school_campus`: 校区信息表 (转账归属校区)
### 关联说明
- **主体关联**: main_id根据main_type关联不同的主体表(会员、员工等)
- **支付关联**: 与school_pay表关联,记录原始支付信息
- **退费关联**: 退费转账与school_pay_refund表关联
- **提现关联**: 提现转账与school_member_cash_out表关联
- **账户关联**: 与school_account_log表关联,记录账户资金变动
- **用户关联**: 记录转账操作的系统用户信息
- **校区关联**: 转账业务归属的校区信息
- **批次关联**: 通过batch_id关联同批次的转账记录
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- transfer_no (转账单号唯一查询)
- main_id (主体转账记录查询)
- transfer_status (转账状态查询)
- trade_type (业务类型查询)
- batch_id (批次转账查询)
- **复合索引**:
- (main_id, main_type) (主体转账记录查询)
- (transfer_status, create_time) (状态时间查询)
- (trade_type, transfer_status) (业务状态查询)
- (batch_id, transfer_status) (批次状态查询)
- (main_type, main_id, transfer_status) (完整主体状态查询)
- **时间索引**:
- create_time (申请时间查询)
- transfer_time (转账时间查询)
- update_time (更新时间查询)
- **金额索引**:
- money (金额范围查询)
## 注意事项
- **数据完整性**: main_id必须在对应的主体表中存在
- **单号唯一性**: transfer_no必须保证全局唯一性
- **金额精度**: money字段使用decimal类型,保证金额计算精度
- **状态一致性**: 转账状态变更需要同步更新相关业务表
- **时间逻辑**: transfer_time不能早于create_time
- **主体类型**: main_type必须与main_id对应的表类型一致
- **批次管理**: 批量转账时batch_id必须保持一致
- **凭证安全**: 转账凭证和收款码需要做好安全存储
- **失败处理**: 转账失败时需要详细记录失败原因
- **重复检查**: 避免重复转账,需要做好幂等性控制
- **权限控制**: 转账操作需要严格的权限验证
- **审计追踪**: 所有转账操作需要记录详细的审计日志
- **资金安全**: 转账金额变更需要多重验证和确认
- **状态流转**: 转账状态流转需要遵循业务规则
- **异常处理**: 建立完善的异常处理和回滚机制
- **监控告警**: 大额转账和异常转账需要实时监控告警
- **合规要求**: 转账操作需要满足相关法规和合规要求

98
niucloud/databasedoc/school_performance_config.md

@ -0,0 +1,98 @@
# school_performance_config 表文档
## 表概述
**表名**: school_performance_config
**功能**: 绩效配置管理表,用于存储和管理员工绩效考核的配置信息,支持多维度绩效指标设置、考核周期配置和绩效计算规则管理,为人力资源绩效管理提供灵活的配置服务
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
config_type varchar(50) utf8mb4_unicode_ci NO UNI NULL select,insert,update,references 配置类型:market_staff/sales_staff/coach_staff
config_data json NULL NO NULL select,insert,update,references 配置数据
version varchar(20) utf8mb4_unicode_ci NO 1.0 select,insert,update,references 配置版本
is_active tinyint(1) NULL YES 1 select,insert,update,references 是否生效
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references
created_by int NULL YES NULL select,insert,update,references 创建人
updated_by int NULL YES NULL select,insert,update,references 修改人
```
## 功能用途
### 主要功能
- **绩效指标配置**: 设置和管理各类绩效考核指标和权重
- **考核周期管理**: 配置绩效考核的时间周期和频率
- **计算规则设置**: 定义绩效分数的计算方法和公式
- **目标值管理**: 设置各项指标的目标值和达成标准
- **权重分配**: 管理不同指标在总绩效中的权重比例
- **等级划分**: 配置绩效等级和对应的分数区间
- **奖惩规则**: 设置基于绩效结果的奖励和惩罚机制
- **模板管理**: 提供不同岗位的绩效配置模板
### 业务场景
- **教师绩效考核**: 配置教师的教学质量、学生满意度等考核指标
- **销售人员考核**: 设置销售额、客户开发、续费率等销售指标
- **管理人员考核**: 配置团队管理、目标达成、创新能力等管理指标
- **客服人员考核**: 设置服务质量、响应时间、客户满意度等服务指标
- **季度考核**: 配置季度性的综合绩效考核方案
- **年度考核**: 设置年度绩效评估和晋升考核标准
- **项目绩效**: 配置特定项目的绩效考核指标
- **部门绩效**: 设置部门整体绩效考核方案
- **试用期考核**: 配置新员工试用期的考核标准
- **专项考核**: 设置特殊时期或特殊任务的考核方案
## 关联关系
### 主要关联表
- **school_personnel**: 人员表,绩效配置的应用对象
- **school_coach_performance**: 教练绩效表,应用绩效配置进行考核
- **school_sales_performance**: 销售绩效表,使用销售相关的绩效配置
- **school_campus**: 校区表,可能按校区设置不同的绩效配置
- **school_sys_user**: 系统用户表,记录配置的创建和修改用户
- **school_sys_dict**: 系统字典表,可能引用绩效等级等字典数据
### 关联说明
- 为不同类型的人员提供个性化的绩效配置方案
- 与具体的绩效记录表关联,提供考核标准和计算依据
- 支持按校区、部门、岗位等维度设置差异化配置
- 配置变更会影响相关人员的绩效考核结果
## 索引建议
```sql
-- 主键索引(自动创建)
PRIMARY KEY (id)
-- 配置名称索引(用于按名称查询)
INDEX idx_config_name (config_name)
-- 配置类型索引(用于按类型筛选)
INDEX idx_config_type (config_type)
-- 状态索引(用于查询有效配置)
INDEX idx_status (status)
-- 创建时间索引(用于按时间排序)
INDEX idx_create_time (create_time)
-- 更新时间索引(用于查询最近更新的配置)
INDEX idx_update_time (update_time)
-- 复合索引(类型+状态)
INDEX idx_type_status (config_type, status)
```
## 注意事项
- **配置合理性**: 确保绩效指标设置合理,权重分配科学
- **数据一致性**: 配置修改时需要考虑对历史绩效数据的影响
- **权限控制**: 严格控制绩效配置的修改权限,避免随意变更
- **版本管理**: 重要配置变更应保留历史版本,支持回滚
- **计算准确性**: 确保绩效计算公式的正确性和准确性
- **公平性原则**: 配置应体现公平公正的考核原则
- **目标可达性**: 设置的目标值应具有挑战性但可实现
- **周期合理性**: 考核周期设置应符合业务特点和管理需要
- **数据备份**: 定期备份绩效配置数据,防止数据丢失
- **性能优化**: 复杂计算规则可能影响系统性能,需要优化
- **法规遵循**: 绩效配置应符合劳动法规和公司制度
- **沟通透明**: 绩效配置应向员工公开透明,确保理解和认同

105
niucloud/databasedoc/school_performance_records.md

@ -0,0 +1,105 @@
# school_performance_records 表文档
## 表概述
**表名**: school_performance_records
**功能**: 绩效记录管理表,负责管理教务系统中员工的绩效评估、考核记录、绩效指标跟踪和绩效奖励计算等功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 绩效编号
staff_id int NULL NO NULL select,insert,update,references 员工ID
resource_id int NULL NO NULL select,insert,update,references 资源ID
order_id int NULL YES NULL select,insert,update,references 订单ID
order_status enum('pending','completed','cancelled') utf8mb4_general_ci YES pending select,insert,update,references 订单状态: pending-待处理, completed-已完成, cancelled-已取消
performance_type enum('sales','marketing','other','coach','consultant') utf8mb4_general_ci NO NULL select,insert,update,references 绩效类型: sales-销售绩效, marketing-市场绩效, coach教练绩效,other-其他,consultant教务绩效
performance_value decimal(10,2) NULL NO NULL select,insert,update,references 绩效金额
remarks text utf8mb4_general_ci YES NULL select,insert,update,references 备注
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
- **绩效记录管理**: 记录员工的各类绩效数据和业绩表现
- **绩效类型分类**: 区分销售、市场、教练、教务等不同类型绩效
- **绩效金额计算**: 计算和记录具体的绩效奖励金额
- **订单关联**: 关联具体订单跟踪绩效来源
- **资源关联**: 关联客户资源跟踪转化绩效
- **状态跟踪**: 跟踪订单状态对绩效的影响
- **绩效统计**: 提供各类绩效数据的统计分析
- **奖金计算**: 为薪资系统提供绩效奖金数据
- **业绩分析**: 分析员工业绩趋势和表现
### 业务场景
- **销售绩效**: 记录销售人员的签单业绩和提成
- **市场绩效**: 记录市场人员的获客和转化业绩
- **教练绩效**: 记录教练的授课和学员满意度绩效
- **教务绩效**: 记录教务人员的服务质量绩效
- **订单跟踪**: 跟踪订单完成情况对绩效的影响
- **客户转化**: 记录客户资源转化带来的绩效
- **月度结算**: 月度绩效统计和奖金结算
- **业绩排名**: 员工业绩排名和激励
- **绩效分析**: 分析绩效趋势和改进方向
## 关联关系
### 主要关联表
- `school_personnel`: 人员信息表 (staff_id)
- `school_customer_resources`: 客户资源表 (resource_id)
- `school_order_table`: 订单信息表 (order_id)
- `school_salary`: 薪资管理表 (绩效奖金关联)
- `school_contract`: 合同信息表 (签约绩效)
- `school_member`: 会员信息表 (客户关联)
- `school_campus`: 校区信息表 (校区绩效)
- `school_course`: 课程信息表 (教练绩效)
### 关联说明
- **员工关联**: staff_id关联具体员工,确定绩效归属
- **资源关联**: resource_id关联客户资源,跟踪转化绩效
- **订单关联**: order_id关联具体订单,跟踪销售绩效
- **薪资关联**: 绩效金额直接影响薪资中的绩效奖金计算
- **合同关联**: 通过订单关联合同,跟踪签约绩效
- **会员关联**: 通过资源和订单关联会员,跟踪服务绩效
- **校区关联**: 通过员工关联校区,支持分校区绩效统计
- **课程关联**: 教练绩效关联具体授课课程
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- staff_id (员工绩效查询)
- resource_id (资源绩效查询)
- order_id (订单绩效查询)
- **业务索引**:
- performance_type (绩效类型查询)
- order_status (订单状态查询)
- performance_value (绩效金额查询)
- **复合索引**:
- (staff_id, performance_type) (员工类型绩效查询)
- (staff_id, created_at) (员工时间绩效查询)
- (performance_type, created_at) (类型时间绩效统计)
- (order_status, performance_type) (状态类型绩效查询)
- **时间索引**:
- created_at (创建时间查询)
- updated_at (更新时间查询)
## 注意事项
- **绩效类型**: performance_type字段使用枚举类型,严格控制类型范围
- **订单状态**: order_status影响绩效计算,需要实时同步
- **金额精度**: performance_value使用decimal(10,2)确保金额精度
- **数据完整性**: staff_id、resource_id、performance_type等关键字段不能为空
- **重复记录**: 避免同一业务产生重复的绩效记录
- **实时更新**: 订单状态变化时需要及时更新绩效记录
- **权限控制**: 绩效数据访问需要严格的权限控制
- **薪资同步**: 绩效数据需要与薪资系统保持同步
- **业绩统计**: 支持按时间、类型、员工等维度统计绩效
- **异常监控**: 监控异常绩效数据和计算错误
- **审计追踪**: 保留完整的绩效记录变更轨迹
- **数据备份**: 绩效数据需要定期备份和归档
- **计算规则**: 不同绩效类型的计算规则需要明确定义
- **时效性**: 绩效记录需要及时生成,避免延迟
- **关联验证**: 确保resource_id和order_id的有效性
- **状态一致性**: 订单状态与绩效状态保持一致
- **分润规则**: 多人参与的业务需要明确分润规则

97
niucloud/databasedoc/school_person_course_schedule.md

@ -0,0 +1,97 @@
# school_person_course_schedule 表文档
## 表概述
**表名**: school_person_course_schedule
**功能**: 人员课程排课表,用于管理学员、教师等人员的课程安排和时间分配,包括课程状态跟踪、请假管理、补课安排等,支持多种课程类型和人员类型,为学校提供完整的排课管理和教学调度功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 关系编号
resources_id int NULL YES NULL select,insert,update,references 资源ID
person_id int NULL YES NULL select,insert,update,references 人员ID
student_id int NULL YES NULL select,insert,update,references 学员ID
person_type enum('student','customer_resource') utf8mb4_general_ci NO NULL select,insert,update,references 人员类型: student-正式学员, customer_resource-客户资源,teacher教练
schedule_id int NULL NO MUL NULL select,insert,update,references 课程安排ID
course_date date NULL NO NULL select,insert,update,references 上课日期
schedule_type tinyint(1) NULL YES NULL select,insert,update,references 课程安排类型1临时课2固定课
course_type tinyint(1) NULL YES NULL select,insert,update,references 课程类型1加课2补课3 等待位
time_slot varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 上课时段
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
deleted_at int NULL YES 0 select,insert,update,references 删除
status tinyint(1) NULL NO 0 select,insert,update,references 状态0待上课1已上课2请假
remark varchar(512) utf8mb4_general_ci YES NULL select,insert,update,references 请假备注
student_course_id int NULL YES NULL select,insert,update,references 学员课程ID(关联到student_courses表)
cancel_reason varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 取消预约原因
```
## 功能用途
### 主要功能
- **课程排课管理**: 管理学员和教师的课程安排和时间分配
- **人员类型区分**: 支持学员、客户资源、教师等不同人员类型的排课
- **课程状态跟踪**: 跟踪课程的待上课、已上课、请假等状态
- **时间段管理**: 精确管理每个课程的上课日期和时间段
- **课程类型分类**: 区分临时课、固定课、加课、补课等不同类型
- **请假管理**: 处理学员请假申请和备注信息
- **取消预约**: 管理课程取消和取消原因记录
- **资源关联**: 关联教学资源和学员课程信息
### 业务场景
- **日常排课**: 为学员安排日常的固定课程和临时课程
- **补课安排**: 处理因请假或其他原因需要补课的安排
- **加课服务**: 为需要额外辅导的学员安排加课
- **请假处理**: 处理学员的请假申请和课程调整
- **教师排课**: 为教师安排教学时间和课程分配
- **资源调度**: 协调教室、设备等教学资源的使用
- **课程统计**: 统计学员的上课情况和教师的工作量
- **排课冲突检测**: 检测和避免时间冲突的课程安排
- **等待位管理**: 管理课程的等待位和候补安排
## 关联关系
### 主要关联表
- **school_schedule**: 课程安排表,关联具体的课程安排信息
- **school_member**: 学员表,关联参与课程的学员信息
- **school_personnel**: 人员表,关联教师和其他人员信息
- **school_customer_resources**: 客户资源表,关联潜在客户信息
- **school_student_courses**: 学员课程表,关联学员的课程购买信息
- **school_course**: 课程表,关联课程的基本信息
- **school_classroom**: 教室表,关联上课地点信息
- **school_resources**: 资源表,关联教学资源信息
### 关联说明
- `schedule_id` 关联 `school_schedule.id`,标识具体的课程安排
- `person_id` 关联 `school_personnel.id`,标识参与人员(如教师)
- `student_id` 关联 `school_member.id`,标识参与的学员
- `resources_id` 关联 `school_resources.id`,标识使用的教学资源
- `student_course_id` 关联 `school_student_courses.id`,标识学员的课程购买记录
- `person_type` 字段区分不同类型的参与人员
- 与考勤系统关联,记录实际的上课出勤情况
- 与通知系统关联,发送课程提醒和变更通知
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **课程安排索引**: `INDEX idx_schedule_id (schedule_id)` - 支持按课程安排查询
- **人员索引**: `INDEX idx_person_id (person_id)` - 支持按人员查询
- **学员索引**: `INDEX idx_student_id (student_id)` - 支持按学员查询
- **日期索引**: `INDEX idx_course_date (course_date)` - 支持按上课日期查询
- **状态索引**: `INDEX idx_status (status)` - 支持按课程状态查询
- **人员类型索引**: `INDEX idx_person_type (person_type)` - 支持按人员类型查询
- **课程类型索引**: `INDEX idx_course_type (course_type)` - 支持按课程类型查询
- **复合索引**: `INDEX idx_schedule_date (schedule_id, course_date)` - 支持课程安排和日期的复合查询
- **时间段索引**: `INDEX idx_date_time (course_date, time_slot)` - 支持日期和时间段的复合查询
## 注意事项
- **时间冲突检测**: 严格检测同一人员在同一时间段的课程冲突
- **状态一致性**: 确保课程状态与实际上课情况保持一致
- **请假流程**: 建立完善的请假申请和审批流程
- **补课机制**: 建立合理的补课安排和补课次数限制
- **资源占用**: 合理管理教学资源的占用和释放
- **数据完整性**: 确保人员、课程、时间等关键信息的完整性
- **权限控制**: 严格控制排课数据的查看和修改权限
- **历史记录**: 保留课程变更的历史记录,便于追溯
- **通知机制**: 及时通知相关人员课程安排的变更
- **统计准确性**: 确保课程统计数据的准确性和实时性

105
niucloud/databasedoc/school_personnel.md

@ -0,0 +1,105 @@
# school_personnel 表文档
## 表概述
**表名**: school_personnel
**功能**: 人员信息管理表,存储教务系统中所有工作人员(教师、销售、教务等)的基本信息、系统账号关联、微信绑定等核心数据
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references ID
name varchar(255) utf8mb4_0900_ai_ci NO NULL select,insert,update,references 姓名
head_img varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 头像
gender tinyint(1) NULL NO 0 select,insert,update,references 性别:1男性,2女性 0不详
birthday date NULL YES NULL select,insert,update,references 生日
phone varchar(15) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 电话
email varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 邮箱
wx varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 微信号
address varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 家庭住址
native_place varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 祖籍
education varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 学历
profile text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 个人简介
emergency_contact_phone varchar(15) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 应急联系人电话
id_card_front varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 身份证正面
id_card_back varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 身份证反面
employee_number varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 员工编号
status tinyint(1) NULL NO 1 select,insert,update,references 状态:1待审核,2已审核,0已禁用
is_sys_user tinyint(1) NULL NO NULL select,insert,update,references 是否登录系统
sys_user_id int NULL YES NULL select,insert,update,references 系统用户id
account_type varchar(255) utf8mb4_0900_ai_ci NO NULL select,insert,update,references 账号类型(前端用来登录时确认订单身份的标识)|teacher=老师,market=销售
create_time datetime NULL NO NULL select,insert,update,references 创建时间
update_time datetime NULL YES NULL select,insert,update,references 更新时间
deleted_at varchar(255) utf8mb4_0900_ai_ci NO 0 select,insert,update,references 逻辑删除字段
join_time datetime NULL YES NULL select,insert,update,references 入职时间
work_call varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 职称
wxminiopenid varchar(52) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 微信小程序 openid
wxgzhopenid varchar(52) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 微信公众号 openid
```
## 功能用途
### 主要功能
1. **人员基础管理**: 存储员工姓名、性别、生日、联系方式等基本信息
2. **身份证件管理**: 管理身份证正反面照片,用于实名认证
3. **系统账号关联**: 通过sys_user_id关联系统登录账号
4. **账号类型管理**: 区分教师(teacher)和销售(market)等不同角色
5. **微信集成**: 支持微信小程序和公众号openid绑定
6. **状态审核管理**: 人员状态审核流程(待审核、已审核、已禁用)
7. **员工档案管理**: 学历、简介、入职时间等档案信息
### 业务场景
1. **员工入职**: 新员工信息录入、身份验证、账号开通
2. **权限管理**: 根据account_type分配不同的系统权限
3. **排课安排**: 教师人员参与课程安排和班级管理
4. **销售管理**: 销售人员进行客户跟进和业绩统计
5. **微信办公**: 通过微信小程序进行移动办公
6. **人事管理**: 员工档案维护、状态变更、离职处理
7. **应急联系**: 紧急情况下的员工联系和通知
## 关联关系
### 主要关联表
1. **sys_user**: 系统用户表(sys_user_id字段关联)
2. **school_class**: 班级表(head_coach, assistant_coach关联)
3. **school_schedule**: 排课表(教师排课关联)
4. **school_order**: 订单表(销售人员关联)
5. **school_teacher_course**: 教师课程关联表
6. **school_campus**: 校区表(人员所属校区)
7. **school_member**: 会员表(销售跟进关联)
8. **school_performance**: 业绩表(销售业绩统计)
### 关联说明
1. **系统账号关联**: 通过sys_user_id与系统登录账号一对一关联
2. **教学关联**: 教师与班级、课程、排课等教学资源关联
3. **销售关联**: 销售人员与客户、订单、业绩等销售数据关联
4. **微信关联**: 通过openid实现微信生态集成
5. **校区关联**: 人员归属特定校区,支持多校区管理
6. **角色关联**: account_type决定人员在系统中的角色和权限
## 索引建议
1. **主键索引**: id(已存在)
2. **唯一索引**:
- phone(手机号唯一)
- employee_number(员工编号唯一)
- sys_user_id(系统用户ID唯一)
- wxminiopenid(微信小程序openid唯一)
- wxgzhopenid(微信公众号openid唯一)
3. **普通索引**:
- account_type(账号类型筛选)
- status(状态筛选)
- create_time(创建时间排序)
- join_time(入职时间排序)
4. **复合索引**:
- (account_type, status)(类型+状态查询)
- (status, join_time)(状态+入职时间查询)
## 注意事项
1. **数据安全**: 身份证照片等敏感信息需要加密存储
2. **唯一性约束**: 手机号、员工编号、系统用户ID等需要保证唯一性
3. **软删除**: 使用deleted_at字段实现软删除,保护历史数据
4. **状态流转**: status状态变更需要记录操作日志
5. **账号类型**: account_type变更需要同步更新系统权限
6. **微信绑定**: openid绑定需要验证微信账号的有效性
7. **系统关联**: sys_user_id关联需要确保系统用户的存在性
8. **应急联系**: emergency_contact_phone字段在紧急情况下的重要性

121
niucloud/databasedoc/school_personnel_info.md

@ -0,0 +1,121 @@
# school_personnel_info 表文档
## 表概述
**表名**: school_personnel_info
**功能**: 人员详细信息表,负责存储教务系统中人员的详细个人信息,包括教育背景、家庭情况、银行信息、合同信息等扩展资料
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int unsigned NULL NO PRI NULL auto_increment select,insert,update,references 主键ID
person_id int NULL NO NULL select,insert,update,references 人员id
name varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 花名
store varchar(100) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 门店
ethnicity varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 民族
age int NULL YES NULL select,insert,update,references 年龄
tenure varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 司龄
regular_date varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 转正时间
is_regular varchar(10) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 是否转正
politics varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 政治面貌
education varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 学历
university varchar(100) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 毕业院校
major varchar(100) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 专业
graduation_date varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 毕业时间
household_place varchar(255) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 户籍所在地
household_type varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 户籍类型
household_address varchar(200) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 户籍地址
current_address varchar(200) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 现居地址
emergency_contact varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 紧急联系人
emergency_phone varchar(20) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 紧急联系人联系电话
marital_status varchar(10) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 婚否
bank_card varchar(30) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 银行卡号
bank_name varchar(100) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 开户行
contract_expire varchar(50) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 合同到期时间
is_rehired varchar(10) utf8mb4_0900_ai_ci YES NULL select,insert,update,references 是否复聘
remark text utf8mb4_0900_ai_ci YES NULL select,insert,update,references 备注
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
```
## 功能用途
### 主要功能
1. **个人详细信息管理**: 存储人员的详细个人资料和背景信息
2. **教育背景记录**: 记录学历、毕业院校、专业等教育信息
3. **家庭信息管理**: 管理户籍、现居地址、婚姻状况等家庭信息
4. **紧急联系人**: 存储紧急联系人和联系方式
5. **银行信息管理**: 管理银行卡号、开户行等财务信息
6. **合同信息跟踪**: 记录合同到期时间、转正情况等
7. **工作履历**: 记录司龄、转正时间、复聘情况等
8. **政治面貌**: 记录民族、政治面貌等政治信息
9. **备注信息**: 存储其他重要的补充信息
### 业务场景
- 员工入职时录入详细个人信息
- 人事档案管理和维护
- 薪资发放时使用银行信息
- 紧急情况联系紧急联系人
- 合同到期提醒和续签
- 员工转正评估和记录
- 人事统计和分析
- 员工背景调查和验证
- 社保公积金办理
- 年度考核和评估
## 关联关系
### 主要关联表
1. **school_personnel**: 通过person_id关联人员基本信息
2. **school_salary**: 薪资发放关联银行信息
3. **school_contract**: 合同管理关联
4. **school_performance_records**: 绩效考核关联
5. **school_departments**: 部门信息关联
6. **school_campus**: 校区门店信息关联
7. **school_sys_user**: 系统用户关联
8. **school_personnel_summary**: 人员汇总信息关联
### 关联说明
- **人员关联**: person_id关联人员基本信息表,形成完整的人员档案
- **薪资关联**: 银行卡信息用于薪资发放和财务管理
- **合同关联**: 合同到期时间用于合同管理和续签提醒
- **绩效关联**: 个人信息用于绩效考核和评估
- **部门关联**: 门店信息关联部门和校区管理
- **用户关联**: 与系统用户账号关联
- **汇总关联**: 用于生成人员统计和汇总报表
## 索引建议
- **主键索引**: id(已存在)
- **外键索引**: person_id(人员信息查询)
- **业务索引**:
- name(花名查询)
- store(门店查询)
- education(学历查询)
- is_regular(转正状态查询)
- bank_card(银行卡查询)
- **复合索引**:
- (person_id, is_regular)(人员转正状态查询)
- (store, is_regular)(门店转正人员查询)
- (education, age)(学历年龄查询)
- **时间索引**:
- regular_date(转正时间查询)
- graduation_date(毕业时间查询)
- contract_expire(合同到期查询)
- created_at(创建时间查询)
## 注意事项
1. **数据隐私**: 个人敏感信息需要严格的访问权限控制
2. **银行信息安全**: 银行卡号等财务信息需要加密存储
3. **信息完整性**: 关键信息如紧急联系人不能为空
4. **数据格式**: 电话号码、银行卡号等需要格式验证
5. **合同提醒**: 合同到期时间需要及时提醒和处理
6. **转正流程**: 转正状态变更需要有完整的审批流程
7. **信息更新**: 个人信息变更需要及时更新和记录
8. **备份保护**: 人事档案数据需要定期备份
9. **审计要求**: 重要信息变更需要记录操作日志
10. **法规遵循**: 个人信息处理需要符合相关法律法规
11. **数据一致性**: 与人员基本信息表保持数据一致性
12. **权限分级**: 不同级别用户只能查看相应权限的信息
13. **历史记录**: 重要信息变更需要保留历史记录
14. **定期核查**: 定期核查信息的准确性和时效性
15. **紧急联系**: 确保紧急联系人信息的有效性

109
niucloud/databasedoc/school_personnel_summary.md

@ -0,0 +1,109 @@
# school_personnel_summary 表文档
## 表概述
**表名**: school_personnel_summary
**功能**: 人员工作汇总统计表,用于按日期统计销售人员和教练人员的工作绩效数据,包括任务完成情况、资源分配、到访数量、续费情况等关键指标,为人员绩效考核、工作量分析和业务管理提供数据支持
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references
task_date varchar(255) utf8mb4_general_ci NO NULL select,insert,update,references 任务日期
campus_person_role_id int NULL NO NULL select,insert,update,references 销售及教练 人员角色 id
role_type int NULL NO 1 select,insert,update,references 1销售 2教练
task_num int NULL NO 0 select,insert,update,references 任务数量
complete_num int NULL NO 0 select,insert,update,references 完成数量
expire_num int NULL NO 0 select,insert,update,references 到期数量
renew_num int NULL NO 0 select,insert,update,references 续费数量
resource_num int NULL NO 0 select,insert,update,references 分配的资源数量
visit_num int NULL NO 0 select,insert,update,references 到访数量
person_id int NULL NO NULL select,insert,update,references 人员id
```
## 功能用途
### 主要功能
- **日期统计管理**: 按任务日期统计人员的工作绩效数据
- **角色分类统计**: 分别统计销售人员和教练人员的工作数据
- **任务完成跟踪**: 记录和统计人员的任务数量和完成情况
- **资源分配统计**: 统计分配给人员的客户资源数量
- **到访数据统计**: 记录客户到访数量和转化情况
- **续费业绩统计**: 统计人员的续费业绩和客户维护情况
- **到期提醒统计**: 统计即将到期的客户数量
- **绩效数据汇总**: 为绩效考核提供量化的数据支持
- **工作量分析**: 分析人员的工作负荷和效率
- **趋势分析支持**: 支持按时间维度的趋势分析
### 业务场景
- **日报统计**: 每日统计销售和教练的工作完成情况
- **绩效考核**: 为月度、季度绩效考核提供数据依据
- **工作量分析**: 分析人员工作负荷,合理分配任务
- **业绩排名**: 根据完成数量等指标进行人员排名
- **资源效率**: 分析资源分配的转化效率和质量
- **续费管理**: 跟踪和管理客户续费的完成情况
- **到期预警**: 监控即将到期的客户,及时跟进
- **团队管理**: 团队负责人查看下属的工作统计
- **数据报表**: 生成各类工作统计和分析报表
- **目标管理**: 对比实际完成情况与设定目标
- **奖惩依据**: 为奖金发放和绩效奖惩提供数据
- **培训需求**: 根据完成情况识别培训需求
## 关联关系
### 主要关联表
- `school_campus_person_role`: 校区人员角色表 (campus_person_role_id外键关联)
- `school_personnel`: 人员信息表 (person_id外键关联)
- `school_campus`: 校区信息表 (通过角色关联)
- `school_customer_resource`: 客户资源表 (资源分配统计)
- `school_six_speed`: 六速跟进表 (到访和转化统计)
- `school_contract`: 合同信息表 (续费统计关联)
- `school_performance_config`: 绩效配置表 (绩效计算规则)
- `school_coach_performance`: 教练绩效表 (教练绩效关联)
- `school_sales_performance`: 销售绩效表 (销售绩效关联)
### 关联说明
- **角色关联**: campus_person_role_id关联校区人员角色表,确定统计的具体角色
- **人员关联**: person_id关联人员信息表,确定统计的具体人员
- **校区关联**: 通过角色表间接关联校区信息
- **资源关联**: 资源数量统计来源于客户资源分配记录
- **跟进关联**: 到访数量等数据来源于六速跟进记录
- **合同关联**: 续费数量统计来源于合同续费记录
- **绩效关联**: 统计数据用于绩效计算和考核
- **配置关联**: 统计规则和计算方式参考绩效配置
## 索引建议
- **主键索引**: id (已存在)
- **外键索引**:
- campus_person_role_id (角色统计查询)
- person_id (人员统计查询)
- **业务索引**:
- task_date (日期统计查询)
- role_type (角色类型查询)
- **复合索引**:
- (person_id, task_date) (人员日期统计)
- (campus_person_role_id, task_date) (角色日期统计)
- (role_type, task_date) (类型日期统计)
- (person_id, role_type, task_date) (完整统计查询)
- **统计索引**:
- (task_date, complete_num) (完成情况统计)
- (task_date, resource_num) (资源分配统计)
- (task_date, visit_num) (到访情况统计)
## 注意事项
- **数据完整性**: campus_person_role_id和person_id必须在对应表中存在
- **日期格式**: task_date字段应使用统一的日期格式
- **角色类型**: role_type必须与实际角色类型保持一致
- **数据一致性**: 统计数据应与源业务数据保持一致
- **重复统计**: 避免同一人员同一日期的重复统计记录
- **数据时效**: 统计数据应及时更新,保证数据的时效性
- **计算准确性**: 各项数量统计的计算逻辑应准确无误
- **权限控制**: 人员只能查看自己的统计数据
- **数据备份**: 重要的统计数据需要定期备份
- **异常处理**: 统计过程中的异常情况需要妥善处理
- **性能优化**: 大量统计数据的查询需要优化性能
- **数据清理**: 定期清理过期的统计数据
- **审计追踪**: 统计数据的修改需要记录审计日志
- **报表生成**: 基于统计数据生成的报表需要保证准确性
- **目标对比**: 实际完成数据与目标数据的对比分析
- **趋势分析**: 支持按时间维度的数据趋势分析

100
niucloud/databasedoc/school_physical_test.md

@ -0,0 +1,100 @@
# school_physical_test 表文档
## 表概述
**表名**: school_physical_test
**功能**: 学员体测管理表,负责管理教务系统中学员的体能测试数据,包括身高体重测量、体测报告生成、教练指导记录等体能评估相关功能
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 体测编号
resource_id int NULL NO NULL select,insert,update,references 资源ID
student_id int NULL YES NULL select,insert,update,references 学员ID
height decimal(5,2) NULL NO NULL select,insert,update,references 身高
weight decimal(5,2) NULL NO NULL select,insert,update,references 体重
coach_id int NULL YES NULL select,insert,update,references 教练ID
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 更新时间
physical_test_report text utf8mb4_general_ci YES NULL select,insert,update,references 体测报告附件(多文件)
```
## 功能用途
### 主要功能
- **体测数据记录**: 记录学员的身高、体重等基础体测数据
- **资源关联管理**: 关联客户资源,跟踪潜在学员的体测情况
- **学员体测跟踪**: 记录正式学员的定期体测数据
- **教练指导记录**: 记录负责体测的教练信息
- **体测报告管理**: 存储和管理体测报告附件
- **时间记录**: 记录体测的创建和更新时间
- **数据对比**: 支持学员体测数据的历史对比
- **健康评估**: 基于体测数据进行健康状况评估
- **训练建议**: 根据体测结果提供个性化训练建议
### 业务场景
- **入学体测**: 新学员入学时进行初始体能测试
- **定期体测**: 在读学员定期进行体能测试
- **课程匹配**: 根据体测结果推荐适合的课程
- **训练计划**: 教练根据体测数据制定个性化训练计划
- **进度跟踪**: 跟踪学员体能改善进度
- **健康监控**: 监控学员健康状况变化
- **报告生成**: 生成详细的体测分析报告
- **家长沟通**: 向家长展示学员体能发展情况
- **数据分析**: 分析整体学员体能水平趋势
## 关联关系
### 主要关联表
- `school_customer_resources`: 客户资源表 (resource_id关联)
- `school_student`: 学员信息表 (student_id关联)
- `school_personnel`: 人员表 (coach_id关联教练)
- `school_course`: 课程表 (体测结果影响课程推荐)
- `school_class`: 班级表 (体测结果影响班级分配)
- `school_sys_attachment`: 附件表 (体测报告文件)
- `school_member`: 会员表 (学员会员信息)
- `school_contract`: 合同表 (体测影响签约决策)
### 关联说明
- **资源关联**: resource_id关联客户资源表,跟踪潜在客户体测
- **学员关联**: student_id关联学员信息,记录正式学员体测
- **教练关联**: coach_id关联负责体测的教练人员
- **课程关联**: 体测结果用于课程推荐和适配
- **班级关联**: 体测数据影响班级分配和分组
- **附件关联**: physical_test_report存储体测报告文件路径
- **会员关联**: 通过学员信息关联到会员账户
- **合同关联**: 体测结果可能影响合同签署决策
## 索引建议
- **主键索引**: id (已存在)
- **业务索引**:
- resource_id (资源查询)
- student_id (学员查询)
- coach_id (教练查询)
- **复合索引**:
- (resource_id, created_at) (资源体测时间查询)
- (student_id, created_at) (学员体测历史查询)
- (coach_id, created_at) (教练体测记录查询)
- **时间索引**:
- created_at (创建时间查询)
- updated_at (更新时间查询)
- **数值索引**:
- height (身高范围查询)
- weight (体重范围查询)
## 注意事项
- **数据精度**: 身高体重使用decimal(5,2),精确到小数点后两位
- **关联完整性**: resource_id和student_id至少有一个不能为空
- **教练权限**: 只有授权教练才能录入和修改体测数据
- **数据有效性**: 需要验证身高体重数据的合理性范围
- **隐私保护**: 体测数据涉及个人隐私,需要严格保护
- **报告格式**: physical_test_report建议使用JSON格式存储多文件信息
- **时间戳**: 使用timestamp类型自动记录时间
- **数据备份**: 体测数据是重要的学员档案,需要定期备份
- **历史记录**: 不建议删除历史体测记录,用于对比分析
- **文件管理**: 体测报告文件需要与数据库记录保持一致
- **数据分析**: 体测数据可用于学员健康趋势分析
- **权限控制**: 体测数据查看需要相应权限控制
- **数据导出**: 支持体测数据的导出和报表生成
- **异常处理**: 需要处理体测设备故障等异常情况
- **标准化**: 体测流程和数据记录需要标准化

87
niucloud/databasedoc/school_reimbursement.md

@ -0,0 +1,87 @@
# school_reimbursement 表文档
## 表概述
**表名**: school_reimbursement
**功能**: 员工费用报销管理表,用于处理和管理员工提交的各种费用报销申请,支持完整的审批流程和凭证管理
## 字段说明
```
Field Type Collation Null Key Default Extra Privileges Comment
id int NULL NO PRI NULL auto_increment select,insert,update,references 报销编号
applicant_id int NULL NO NULL select,insert,update,references 申请人ID
amount decimal(10,2) NULL NO NULL select,insert,update,references 报销金额
description text utf8mb4_general_ci NO NULL select,insert,update,references 报销描述
receipt_url varchar(255) utf8mb4_general_ci YES NULL select,insert,update,references 发票或收据URL
status enum('pending','approved','rejected') utf8mb4_general_ci NO NULL select,insert,update,references 状态: pending-待审批, approved-已批准, rejected-已拒绝
process_id int NULL YES MUL NULL select,insert,update,references 关联的审批流程ID
created_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED select,insert,update,references 创建时间
updated_at timestamp NULL YES CURRENT_TIMESTAMP DEFAULT_GENERATED on update CURRENT_TIMESTAMP select,insert,update,references 修改时间
```
## 功能用途
### 主要功能
- **报销申请管理**: 处理员工提交的各种费用报销申请
- **金额计算**: 精确记录和计算报销金额,支持小数点后两位
- **凭证管理**: 管理发票、收据等报销凭证的电子化存储
- **审批流程**: 集成审批工作流,支持多级审批和状态跟踪
- **状态控制**: 管理报销申请的待审批、已批准、已拒绝等状态
- **申请人追踪**: 记录报销申请人的详细信息和联系方式
- **描述记录**: 详细记录报销事由和相关说明信息
- **时间追踪**: 记录申请创建和处理的完整时间轨迹
### 业务场景
- **日常费用报销**: 处理员工的交通费、餐费、办公用品等日常开支
- **差旅费报销**: 管理出差产生的住宿费、交通费、餐补等费用
- **培训费用**: 处理员工参加培训、会议等产生的费用报销
- **教学用品采购**: 报销购买教学器材、教具等教学相关费用
- **营销活动费用**: 报销市场推广、活动组织等营销费用
- **设备维护费用**: 报销设备维修、保养等维护费用
- **办公场所费用**: 报销租金、水电费、物业费等场所运营费用
- **员工福利费用**: 报销团建活动、员工关怀等福利支出
- **紧急费用处理**: 快速处理紧急情况下的费用报销需求
## 关联关系
### 主要关联表
- **school_personnel**: 人员表,关联报销申请人的基本信息
- **school_approval_process**: 审批流程表,关联报销的审批流程
- **school_approval_participants**: 审批参与者表,关联审批人员信息
- **school_campus**: 校区表,关联报销申请所属的校区
- **school_department**: 部门表,关联申请人所属的部门
- **school_sys_attachment**: 附件表,关联报销凭证的文件存储
- **school_finance_account**: 财务账户表,关联报销款项的支付账户
- **school_budget**: 预算表,关联部门或项目的预算控制
### 关联说明
- `applicant_id` 关联 `school_personnel.id`,标识报销申请人
- `process_id` 关联 `school_approval_process.id`,关联审批流程实例
- `receipt_url` 存储报销凭证的文件路径或URL
- 与财务系统关联,实现报销款项的自动支付
- 与预算系统关联,控制报销金额不超过预算限额
- 与通知系统关联,及时通知相关人员审批进度
- 与权限系统关联,控制报销申请的查看和操作权限
## 索引建议
- **主键索引**: `PRIMARY KEY (id)` - 自动创建
- **申请人索引**: `INDEX idx_applicant_id (applicant_id)` - 支持按申请人查询
- **状态索引**: `INDEX idx_status (status)` - 支持按审批状态查询
- **流程索引**: `INDEX idx_process_id (process_id)` - 支持按审批流程查询
- **金额索引**: `INDEX idx_amount (amount)` - 支持按金额范围查询
- **创建时间索引**: `INDEX idx_created_at (created_at)` - 支持按申请时间查询
- **更新时间索引**: `INDEX idx_updated_at (updated_at)` - 支持按处理时间查询
- **复合索引**: `INDEX idx_applicant_status (applicant_id, status)` - 支持申请人和状态的复合查询
- **时间范围索引**: `INDEX idx_created_amount (created_at, amount)` - 支持时间和金额的复合查询
## 注意事项
- **金额精度**: 确保金额计算的精度,避免浮点数误差
- **凭证完整性**: 严格要求上传完整、清晰的报销凭证
- **审批时效**: 建立审批时效机制,避免报销申请长期积压
- **预算控制**: 实施严格的预算控制,防止超预算报销
- **权限管理**: 严格控制报销数据的查看和修改权限
- **数据备份**: 定期备份重要的报销数据和凭证文件
- **审计合规**: 确保报销流程符合财务审计和税务要求
- **防重复报销**: 建立机制防止同一费用的重复报销
- **异常监控**: 监控异常的报销行为,如大额报销、频繁报销等
- **归档管理**: 建立报销记录的归档和长期保存机制

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save