Appearance
Muotai Wflow 工作流引擎使用教程
版本: 5.8.0 | 作者: Aroundix SPG Team | 更新时间: 2025-01
目录
1. 概述
1.1 什么是 Wflow
Wflow 是 Muotai 平台的工作流引擎模块,基于 Flowable 6.8.0 构建,提供企业级的流程管理能力。它支持:
- 可视化流程设计:拖拽式流程图设计,支持 14 种节点类型
- 低代码表单设计:拖拽式表单编辑,支持字段权限控制
- 灵活的审批路由:支持条件分支、并行审批、会签、加签等
- 完整的审计追踪:流程执行轨迹、操作日志、讨论记录
- 多租户架构:企业级数据隔离
1.2 技术栈
| 组件 | 版本 | 说明 |
|---|---|---|
| Spring Boot | 3.4.5 | 基础框架 |
| Spring Cloud | 2024.0.0 | 微服务框架 |
| Flowable | 6.8.0 | BPMN 2.0 工作流引擎 |
| MyBatis-Plus | - | ORM 框架 |
| Nacos | 3.0.2 | 服务注册与配置中心 |
1.3 服务信息
- 服务端口: 7062
- 服务名称: muotai-wflow
- API 前缀:
/wflow
2. 架构设计
2.1 模块结构
muotai-wflow/
├── muotai-wflow-api/ # API 接口层
│ ├── dto/ # 数据传输对象
│ ├── feign/ # Feign 客户端
│ └── entity/ # 公共实体
│
├── muotai-wflow-biz/ # 业务实现层
│ ├── controller/ # REST 控制器
│ ├── service/ # 业务服务
│ ├── core/ # 核心引擎
│ │ ├── bean/ # 数据模型
│ │ ├── bpmn/ # BPMN 扩展
│ │ ├── listener/ # 事件监听
│ │ └── execute/ # 表达式执行
│ ├── dal/ # 数据访问层
│ ├── mapper/ # MyBatis 映射
│ ├── integration/ # 系统集成
│ └── config/ # 配置类
│
└── Dockerfile # 容器化配置2.2 核心服务架构
┌─────────────────────────────────────────────────────────────┐
│ REST Controllers │
│ FlowModelController │ FlowInstanceController │ FlowTaskController │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ Service Layer │
│ WflowModelService │ FlowInstanceService │ FlowTaskService │
│ FormService │ FlowOrgService │ NotifyService │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ Core Engine │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Flowable │ │ Event │ │ Expression │ │
│ │ Engine │ │ Listener │ │ Executor │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ Data Access Layer │
│ WflowProcModelMapper │ WflowProcInstMapper │ ... │
└─────────────────────────────────────────────────────────────┘3. 核心概念
3.1 流程模型 (Process Model)
流程模型是流程的定义,包含:
| 属性 | 说明 |
|---|---|
code | 流程唯一标识码 |
procName | 流程名称 |
version | 版本号 |
status | 状态 (draft/active/disabled) |
process | 流程节点定义 (JSON) |
formJson | 表单定义 (JSON) |
formFields | 表单字段列表 |
events | 流程事件配置 |
3.2 流程实例 (Process Instance)
流程实例是流程模型的运行态:
| 属性 | 说明 |
|---|---|
instId | 实例 ID (Flowable 生成) |
title | 流程标题 |
defineId | 关联的流程定义 ID |
currentNodeId | 当前节点 ID |
status | 实例状态 |
initiator | 发起人 |
createTime | 创建时间 |
3.3 实例状态 (InstanceStatus)
java
public enum InstanceStatus {
RUNNING, // 进行中
REFUSE, // 被驳回
REVOKED, // 被撤销
DELETED, // 被删除
PASS, // 审批通过
EXCEPTION // 流程异常
}3.4 处理动作 (HandlerAction)
java
public enum HandlerAction {
startup, // 发起流程
agree, // 同意
reject, // 拒绝
forward, // 转交
complete, // 完成
fallback, // 回退
delegate, // 委派
terminate, // 终止
cancel, // 取消
revoke, // 撤销
withdraw, // 撤销之前的操作
beforeAdd, // 前加签
afterAdd, // 后加签
comment, // 评论
revise, // 修改已结束流程
candidate, // 认领
cc, // 抄送
pass, // 自动通过
warning // 警告
}4. 快速开始
4.1 发起流程
步骤 1: 获取可发起的流程列表
http
GET /wflow/model/group/items/byUser响应示例:
json
{
"code": 200,
"data": [
{
"id": 1,
"name": "请假审批",
"code": "leave_process",
"icon": "vacation",
"status": "active"
}
]
}步骤 2: 获取流程发起表单
http
GET /wflow/startup/model/{code}/{version}响应示例:
json
{
"code": 200,
"data": {
"code": "leave_process",
"procName": "请假审批",
"formJson": {...},
"formFields": [...],
"process": {...},
"setting": {...}
}
}步骤 3: 预测流程路径 (可选)
http
POST /wflow/startup/forecast
Content-Type: application/json
{
"code": "leave_process",
"version": 1,
"formData": {
"days": 5,
"type": "annual"
}
}步骤 4: 发起流程
http
POST /wflow/inst/startup
Content-Type: application/json
{
"defineId": "leave_process_v1",
"formData": {
"reason": "年假",
"days": 5,
"startDate": "2025-01-08",
"endDate": "2025-01-12"
},
"variables": {},
"businessKey": "LEAVE-2025-001"
}响应:
json
{
"code": 200,
"data": "inst_12345678"
}4.2 处理待办任务
步骤 1: 查询待办任务
http
GET /wflow/task/todo?pageNo=1&pageSize=10响应示例:
json
{
"code": 200,
"data": {
"records": [
{
"instId": "inst_12345678",
"taskId": "task_87654321",
"title": "张三的请假申请",
"nodeName": "部门经理审批",
"initiator": {
"userId": "user_001",
"userName": "张三"
},
"fieldData": [...]
}
],
"total": 1
}
}步骤 2: 处理任务
http
POST /wflow/task/handler
Content-Type: application/json
{
"taskId": "task_87654321",
"instId": "inst_12345678",
"action": "agree",
"formData": {
"approverRemark": "同意请假"
},
"comment": {
"text": "已审批,注意工作交接"
}
}4.3 查询流程状态
http
GET /wflow/inst/detail?instId=inst_12345678响应示例:
json
{
"code": 200,
"data": {
"instId": "inst_12345678",
"title": "张三的请假申请",
"status": "RUNNING",
"currentNodeName": "人事审批",
"todoUsers": ["李四"],
"fieldData": [...],
"createTime": "2025-01-08 10:00:00"
}
}5. 流程模型设计
5.1 流程节点结构
流程由节点 (ProcNode) 组成,每个节点包含:
json
{
"id": "node_001",
"type": "Approval",
"name": "部门经理审批",
"props": {
"assignedType": "role",
"roleIds": [1],
"multiInstance": "sequential",
"passRate": 100
},
"childId": "node_002",
"approveFormPerms": [
{"key": "reason", "perm": "SHOW"},
{"key": "days", "perm": "EDIT"}
]
}5.2 完整流程定义示例
json
{
"id": "root",
"type": "Start",
"name": "发起申请",
"props": {
"formPerms": [
{"key": "reason", "perm": "EDIT"},
{"key": "days", "perm": "EDIT"}
]
},
"childId": "approve_1",
"children": {
"approve_1": {
"id": "approve_1",
"type": "Approval",
"name": "部门经理审批",
"props": {
"assignedType": "deptLeader",
"leaderLevel": 1
},
"childId": "gateway_1"
},
"gateway_1": {
"id": "gateway_1",
"type": "Exclusive",
"name": "条件分支",
"props": {},
"branch": [
{
"id": "branch_1",
"name": "请假天数>3天",
"props": {
"conditions": [
{"field": "days", "operator": ">", "value": 3}
]
},
"childId": "approve_2"
},
{
"id": "branch_2",
"name": "默认",
"props": {"default": true},
"childId": "end"
}
]
},
"approve_2": {
"id": "approve_2",
"type": "Approval",
"name": "HR审批",
"props": {
"assignedType": "role",
"roleIds": [2]
},
"childId": "end"
}
}
}5.3 保存流程模型
http
POST /wflow/model/save
Content-Type: application/json
{
"code": "leave_process",
"procName": "请假审批流程",
"groupId": 1,
"formType": 0,
"formJson": {...},
"formFields": [...],
"process": {...},
"events": {
"onStart": {...},
"onEnd": {...}
},
"setting": {
"revokeEnable": true,
"revokeTimeout": 120
}
}5.4 部署发布流程
http
POST /wflow/model/deploy
Content-Type: application/json
{
"code": "leave_process"
}6. 表单设计
6.1 表单类型
| 类型 | 值 | 说明 |
|---|---|---|
| 拖拽表单 | 0 | 使用 formJson 定义,低代码表单设计 |
| 代码表单 | 1 | 使用 formCode 定义,Vue 单文件组件 |
| 引用表单 | 2 | 使用 formRef 引用外部表单 |
6.2 表单字段定义
json
{
"formFields": [
{
"id": "field_001",
"key": "reason",
"name": "请假原因",
"type": "textarea",
"required": true,
"valueType": "String"
},
{
"id": "field_002",
"key": "days",
"name": "请假天数",
"type": "number",
"required": true,
"valueType": "Number"
},
{
"id": "field_003",
"key": "leaveType",
"name": "请假类型",
"type": "select",
"required": true,
"valueType": "Select",
"options": [
{"label": "年假", "value": "annual"},
{"label": "病假", "value": "sick"},
{"label": "事假", "value": "personal"}
]
}
]
}6.3 字段权限控制
每个审批节点可以配置字段权限:
json
{
"approveFormPerms": [
{"key": "reason", "perm": "SHOW"}, // 只读
{"key": "days", "perm": "SHOW"}, // 只读
{"key": "approverRemark", "perm": "EDIT"} // 可编辑
]
}| 权限 | 说明 |
|---|---|
SHOW | 显示,只读 |
EDIT | 显示,可编辑 |
HIDE | 隐藏 |
6.4 表单组件管理
查询组件列表
http
GET /wflow/form/component/list?pageNo=1&pageSize=10保存表单组件
http
POST /wflow/form/component
Content-Type: application/json
{
"name": "自定义日期选择器",
"type": "datePicker",
"renderCode": "<template>...</template><script>...</script>",
"version": "1.0.0"
}发布组件
http
PUT /wflow/form/component/publish/{formCpId}7. 节点类型详解
7.1 节点类型一览
| 类型 | 英文名 | 说明 |
|---|---|---|
| 发起节点 | Start | 流程起点,配置发起人表单权限 |
| 审批节点 | Approval | 人工审批,支持会签、或签 |
| 任务节点 | Task | 人工处理任务 |
| 条件网关 | Exclusive | 排他分支,满足条件走一个分支 |
| 并行网关 | Parallel | 并行分支,同时执行多个分支 |
| 包容网关 | Inclusive | 包容分支,满足条件的都执行 |
| 抄送节点 | Cc | 抄送通知 |
| 等待节点 | Waiting | 等待外部信号 |
| 子流程 | Subproc | 嵌入子流程 |
| 路由节点 | Router | 自定义路由逻辑 |
| 触发器 | Trigger | 触发外部事件 |
| 代理节点 | Agent | AI 代理处理 |
7.2 审批节点 (Approval)
json
{
"type": "Approval",
"name": "部门经理审批",
"props": {
"assignedType": "deptLeader",
"leaderLevel": 1,
"multiInstance": "sequential",
"passRate": 100,
"timeout": {
"enable": true,
"value": 24,
"unit": "hour",
"action": "pass"
},
"rejectTo": "previous",
"allowTransfer": true,
"allowDelegate": true
}
}审批人类型 (assignedType)
| 类型 | 说明 | 配置 |
|---|---|---|
user | 指定用户 | userIds: [1, 2] |
role | 指定角色 | roleIds: [1] |
dept | 指定部门 | deptIds: [1] |
deptLeader | 部门负责人 | leaderLevel: 1 |
initiatorDept | 发起人部门负责人 | leaderLevel: 1 |
selfSelect | 发起人自选 | selectRange: {...} |
formUser | 表单字段指定 | formUserField: "approver" |
expression | 表达式计算 | expression: "${...}" |
多实例类型 (multiInstance)
| 类型 | 说明 |
|---|---|
sequential | 依次审批(顺序会签) |
parallel | 同时审批(并行会签) |
single | 单人审批(或签) |
7.3 条件网关 (Exclusive)
json
{
"type": "Exclusive",
"name": "金额判断",
"branch": [
{
"id": "branch_1",
"name": "金额>10000",
"props": {
"conditions": [
{
"field": "amount",
"operator": ">",
"value": 10000
}
],
"groupOp": "AND"
},
"childId": "approve_finance"
},
{
"id": "branch_2",
"name": "默认分支",
"props": {
"default": true
},
"childId": "approve_manager"
}
]
}条件运算符
| 运算符 | 说明 |
|---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
contains | 包含 |
notContains | 不包含 |
startsWith | 以...开头 |
endsWith | 以...结尾 |
empty | 为空 |
notEmpty | 不为空 |
7.4 并行网关 (Parallel)
json
{
"type": "Parallel",
"name": "并行审批",
"branch": [
{
"id": "branch_1",
"name": "财务审批",
"childId": "approve_finance"
},
{
"id": "branch_2",
"name": "法务审批",
"childId": "approve_legal"
}
]
}7.5 抄送节点 (Cc)
json
{
"type": "Cc",
"name": "抄送相关人员",
"props": {
"assignedType": "user",
"userIds": [1, 2, 3],
"notifyType": ["email", "system"]
}
}8. 审批人配置
8.1 指定用户
json
{
"assignedType": "user",
"userIds": [1, 2, 3]
}8.2 指定角色
json
{
"assignedType": "role",
"roleIds": [1, 2]
}8.3 部门负责人
json
{
"assignedType": "deptLeader",
"leaderLevel": 1, // 1=直接上级, 2=上上级
"deptSource": "initiator" // initiator=发起人部门, form=表单指定
}8.4 发起人自选
json
{
"assignedType": "selfSelect",
"selectRange": {
"type": "all", // all=全部, dept=指定部门, role=指定角色
"deptIds": [],
"roleIds": []
},
"selectMode": "single" // single=单选, multiple=多选
}8.5 表单字段指定
json
{
"assignedType": "formUser",
"formUserField": "nextApprover" // 表单中的用户选择字段
}8.6 表达式计算
json
{
"assignedType": "expression",
"expression": "${formData.amount > 10000 ? [1, 2] : [3]}"
}9. 条件表达式
9.1 表达式语法
Wflow 使用 SpEL (Spring Expression Language) 作为表达式引擎。
访问表单数据
${formData.fieldName}访问流程变量
${variables.varName}访问发起人信息
${initiator.userId}
${initiator.deptId}
${initiator.roleIds}9.2 常用表达式示例
金额判断
${formData.amount > 10000}多条件组合
${formData.amount > 5000 && formData.type == 'urgent'}包含判断
${formData.deptIds.contains(1)}空值判断
${formData.remark != null && formData.remark != ''}9.3 表达式校验
http
GET /wflow/model/el/validate?el=${formData.amount > 1000}批量校验:
http
POST /wflow/model/el/validate/list
Content-Type: application/json
{
"expressions": [
"${formData.amount > 1000}",
"${initiator.deptId == 1}"
]
}10. 任务处理
10.1 查询待办任务
http
GET /wflow/task/todo?pageNo=1&pageSize=10&code=leave_process参数说明:
| 参数 | 说明 |
|---|---|
pageNo | 页码 |
pageSize | 每页数量 |
code | 流程编码(可选) |
keyword | 关键词搜索(可选) |
10.2 查询已办任务
http
GET /wflow/task/ido?pageNo=1&pageSize=1010.3 认领任务
候选人模式下,需要先认领任务:
http
GET /wflow/task/claim/{taskId}10.4 处理任务
同意
http
POST /wflow/task/handler
Content-Type: application/json
{
"taskId": "task_001",
"instId": "inst_001",
"action": "agree",
"formData": {
"approverRemark": "同意"
},
"comment": {
"text": "审批通过"
}
}拒绝
http
POST /wflow/task/handler
Content-Type: application/json
{
"taskId": "task_001",
"instId": "inst_001",
"action": "reject",
"comment": {
"text": "材料不全,请补充"
}
}转交
http
POST /wflow/task/handler
Content-Type: application/json
{
"taskId": "task_001",
"instId": "inst_001",
"action": "forward",
"targetUsers": ["user_002"],
"comment": {
"text": "转交给李四处理"
}
}回退
http
POST /wflow/task/handler
Content-Type: application/json
{
"taskId": "task_001",
"instId": "inst_001",
"action": "fallback",
"targetNodeId": "node_001",
"comment": {
"text": "退回修改"
}
}加签
http
POST /wflow/task/handler
Content-Type: application/json
{
"taskId": "task_001",
"instId": "inst_001",
"action": "beforeAdd", // beforeAdd=前加签, afterAdd=后加签
"targetUsers": ["user_003"],
"comment": {
"text": "加签给王五审批"
}
}10.5 查询可回退节点
http
GET /wflow/task/fallback/nodes?taskId={taskId}10.6 催办
http
POST /wflow/task/urging
Content-Type: application/json
{
"instId": "inst_001",
"message": "请尽快处理"
}11. 流程监听器
11.1 监听器类型
| 类型 | 说明 |
|---|---|
FlowEventListener | 全局事件监听器 |
UserTaskListener | 用户任务监听器 |
| 业务监听器 | 特定流程的业务处理 |
11.2 全局事件监听器
java
@Component
public class FlowEventListener implements FlowableEventListener {
@Override
public void onEvent(FlowableEvent event) {
switch (event.getType()) {
case TASK_CREATED:
// 任务创建时处理
break;
case TASK_COMPLETED:
// 任务完成时处理
break;
case PROCESS_COMPLETED:
// 流程完成时处理
break;
}
}
}11.3 自定义业务监听器
java
@Component
public class LeaveProcessListener implements ProcessInstanceResultEventListener {
@Override
public String getProcessCode() {
return "leave_process";
}
@Override
public void onProcessCompleted(String instId, InstanceStatus status,
Map<String, Object> formData) {
if (status == InstanceStatus.PASS) {
// 请假审批通过,更新考勤系统
updateAttendance(formData);
}
}
}11.4 节点事件配置
在流程模型中配置节点事件:
json
{
"type": "Approval",
"name": "审批节点",
"props": {
"events": {
"onEnter": {
"type": "http",
"url": "http://api/notify",
"method": "POST"
},
"onComplete": {
"type": "expression",
"expression": "${myService.doSomething(instId)}"
}
}
}
}12. 接口参考
12.1 流程模型管理
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /model/group | 查询所有流程分组 |
| POST | /model/group | 创建分组 |
| DELETE | /model/group | 删除分组 |
| GET | /model/group/items | 查询分组及模型 |
| GET | /model/group/items/byUser | 获取用户可发起的流程 |
| POST | /model/save | 保存流程模型 |
| POST | /model/deploy | 部署发布模型 |
| GET | /model | 获取已激活模型 |
| GET | /model/ver | 获取模型指定版本 |
| PUT | /model/enable | 启用/停用模型 |
| DELETE | /model/{code} | 删除模型 |
12.2 流程实例管理
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /inst/startup | 发起流程 |
| GET | /inst/list | 查询流程实例列表 |
| GET | /inst/mySubmit/list | 查询我发起的流程 |
| GET | /inst/detail | 查询实例详情 |
| DELETE | /inst/{instId} | 删除实例 |
| GET | /inst/forecast/{instId} | 查询流程预测 |
| GET | /inst/records/{instId} | 查询流程执行记录 |
| GET | /inst/process/{instId} | 查询流程图 |
| GET | /inst/discuss | 查询讨论记录 |
| POST | /inst/discuss/{instId} | 发送讨论消息 |
12.3 任务管理
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /task/todo | 查询待办任务 |
| GET | /task/ido | 查询已办任务 |
| GET | /task/claim/{taskId} | 认领任务 |
| POST | /task/handler | 处理任务 |
| GET | /task/fallback/nodes | 查询可回退节点 |
| POST | /task/urging | 催办任务 |
| GET | /task/candidate/{taskId} | 查询任务候选人 |
12.4 表单管理
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /form/component/list | 查询表单组件列表 |
| GET | /form/component/{id} | 获取组件详情 |
| POST | /form/component | 保存表单组件 |
| PUT | /form/component/publish/{id} | 发布组件 |
| PUT | /form/component/disable/{id} | 禁用组件 |
12.5 组织架构
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /org/tree | 查询组织架构树 |
| GET | /org/search | 搜索组织信息 |
| GET | /org/roles | 查询系统角色 |
| GET | /org/user/detail/{userId} | 查询用户详情 |
13. 最佳实践
13.1 流程设计原则
- 保持简单:避免过于复杂的流程,必要时拆分为子流程
- 使用条件网关:利用条件网关实现灵活路由,而非硬编码
- 合理设置超时:为关键审批节点设置超时自动处理
- 预留扩展点:使用触发器节点预留业务扩展点
13.2 表单设计原则
- 字段权限分离:不同审批节点配置不同的字段权限
- 必填字段验证:在发起节点设置必填验证
- 数据类型正确:确保字段的 valueType 与实际数据类型匹配
13.3 性能优化
- 启用缓存:使用 LocalFlowCache 缓存流程定义
- 分页查询:大数据量查询使用分页
- 异步处理:耗时业务逻辑放在监听器中异步处理
13.4 错误处理
- 异常监听:实现异常监听器捕获流程异常
- 日志记录:关键操作记录审计日志
- 通知机制:流程异常时通知相关人员
14. 常见问题
14.1 流程发起失败
问题:发起流程时提示 "流程定义不存在"
解决:
- 确认流程模型已部署 (
POST /model/deploy) - 确认流程状态为 active
- 检查 defineId 是否正确
14.2 审批人为空
问题:流程到达某节点后没有审批人
解决:
- 检查审批人配置是否正确
- 如果使用角色/部门,确认用户已分配相应角色/部门
- 如果使用表达式,验证表达式返回值
14.3 条件分支不生效
问题:条件网关总是走默认分支
解决:
- 使用表达式校验接口验证条件表达式
- 检查表单字段名称是否与条件中的字段名一致
- 检查字段值类型是否匹配(数字 vs 字符串)
14.4 回退后无法继续
问题:流程回退后卡住
解决:
- 检查回退目标节点是否正确
- 确认回退后的审批人配置
- 查看流程执行记录定位问题
14.5 并行审批问题
问题:并行分支有一条卡住导致整个流程无法继续
解决:
- 为并行分支的每个节点设置超时
- 考虑使用包容网关替代并行网关
- 增加人工干预机制
附录
A. 数据库表结构
| 表名 | 说明 |
|---|---|
wflow_proc_model | 流程模型定义 |
wflow_proc_group | 流程分组 |
wflow_proc_inst | 流程实例 |
wflow_proc_inst_task | 实例任务 |
wflow_proc_inst_record | 执行记录 |
wflow_proc_inst_form | 实例表单数据 |
wflow_proc_inst_discuss | 讨论消息 |
wflow_proc_perm | 流程权限 |
wflow_form_cp | 表单组件 |
wflow_draft | 流程草稿 |
B. 配置参数
yaml
wflow:
bpmn:
namespace: http://www.aroundix.com/bpmn
admin-role-id: 1 # 管理员角色ID
system-user-id: 1 # 系统用户ID
revoke-timeout: 120 # 消息撤销时限(秒)
flowable:
async-executor-activate: true # 启用异步执行器
process:
definition-cache-limit: 40960C. 错误码
| 错误码 | 说明 |
|---|---|
| 1001 | 流程模型不存在 |
| 1002 | 流程实例不存在 |
| 1003 | 任务不存在 |
| 1004 | 无权限操作 |
| 1005 | 表达式执行错误 |
| 1006 | 审批人配置错误 |
本文档由 Aroundix SPG Team 维护,如有问题请联系技术支持。