# GVS-DSDK API 使用手册

> 版本：1.0.0 | 更新日期：2026-06-13

## 目录

- [1. 概述](#1-概述)
- [2. 快速开始](#2-快速开始)
- [3. 包结构](#3-包结构)
- [4. 用户管理 (UserManager)](#4-用户管理-usermanager)
- [5. 角色管理 (RoleManager)](#5-角色管理-rolemanager)
- [6. 商铺管理 (ShopManager)](#6-商铺管理-shopmanager)
- [7. 职务管理 (PositionManager)](#7-职务管理-positionmanager)
- [8. 权限验证 (PermissionVerifier)](#8-权限验证-permissionverifier)
- [9. ELT 认证](#9-elt-认证)
- [10. 分佣引擎 (CommissionEngine)](#10-分佣引擎-commissionengine)
- [11. 支付网关 (PaymentManager)](#11-支付网关-paymentmanager)
- [12. MSYNC 服务间通信](#12-msync-服务间通信)
- [13. FluentQuery ORM 查询](#13-fluentquery-orm-查询)
- [14. 数据库路由与建表](#14-数据库路由与建表)
- [15. 数据模型一览](#15-数据模型一览)

---

## 1. 概述

GVS-DSDK 是 GVS 分布式服务 SDK，提供：

- **SAAS 用户管理**：用户、角色、权限、商铺、职务的完整 CRUD 和关联管理
- **ELT 认证**：Cookie → EphemeralToken → User 的无状态认证体系
- **分佣引擎**：5 种分账策略 + 预结算 + 邀请链分佣
- **支付网关**：微信/支付宝/银行卡三渠道适配 + 统一编排
- **MSYNC 通信**：服务注册/发现/OGM/分布式事务
- **FluentQuery**：SQLAlchemy 风格的 ORM 查询层

全程 PascalCase 命名，从数据库到前端无中间转换层。

---

## 2. 快速开始

### 安装

```bash
pip install -e /path/to/gvsdsdk
```

### settings.py 配置

```python
INSTALLED_APPS = [
    ...
    'gvsdsdk',
]

# 方式一：子服务器连接 SAAS 主库（只读）
DATABASES = {
    'default': { ... },   # 本地数据库
    'saas': {             # SAAS 主库
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Users',
        'USER': 'root',
        'PASSWORD': '***',
        'HOST': 'saas-db.gvsds.com',
        'PORT': '3306',
    },
}
DATABASE_ROUTERS = ['gvsdsdk.db_router.SAASDatabaseRouter']
GVSDSDK_SAAS_READ_ONLY = True  # 默认 True

# 方式二：同源数据库（可读写）
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        ...
    },
}
DATABASE_ROUTERS = []
GVSDSDK_MANAGE_TABLES = True  # 允许 Django 管理表
```

### 建表

```bash
# 方式一：Django migrate（需 GVSDSDK_MANAGE_TABLES=True）
python manage.py makemigrations gvsdsdk
python manage.py migrate

# 方式二：gvsdsdk_init 命令（无需 GVSDSDK_MANAGE_TABLES）
python manage.py gvsdsdk_init --db default
python manage.py gvsdsdk_init --db default --dry-run     # 仅打印 SQL
python manage.py gvsdsdk_init --db default --modules auth,commission,payment
```

---

## 3. 包结构

```
gvsdsdk/
├── __init__.py          # 统一入口（惰性加载 90+ 符号）
├── models.py            # SAAS 核心数据模型（17 张表）
├── model_base.py        # QModel 元类 + FluentQuery 注入
├── model_utils.py       # UUIDObj
├── fluent.py            # FluentQuery ORM 查询层
├── db_router.py         # SAASDatabaseRouter
├── apps.py              # Django AppConfig
├── management/
│   └── commands/
│       └── gvsdsdk_init.py  # 建表命令
│
├── auth/                # ELT 用户认证模块
│   ├── elt_auth.py      # ELT 认证后端
│   ├── cookie.py        # Cookie 管理
│   ├── crypto.py        # 密码哈希 + AES-256-GCM
│   ├── middleware.py     # ELTAuthMiddleware + CurrentRoleMiddleware
│   ├── permissions.py    # RBAC/ABAC 权限
│   └── managers.py      # UserManager + RoleManager + ShopManager + PositionManager
│
├── msync/               # MSYNC 服务间通信
│   ├── auth.py          # 服务认证签名
│   ├── registry.py      # 服务注册中心
│   ├── ogm.py           # 全局对象映射
│   ├── Transaction.py   # 分布式事务
│   ├── LocalTx.py       # 本地事务
│   └── client.py        # 服务客户端
│
├── commission/          # 分佣引擎
│   ├── models.py        # 6 张数据模型
│   ├── manager.py       # CommissionEngine 编排器
│   └── strategies/
│       └── engine.py    # 5 种策略 + 工厂
│
└── payment/             # 支付网关
    ├── models.py        # 2 张数据模型
    ├── manager.py       # PaymentManager 编排器
    └── gateways/
        ├── base.py      # 抽象网关 + 数据类
        ├── registry.py  # GatewayRegistry + payment_registry
        ├── wechat.py    # 微信支付适配器
        ├── alipay.py    # 支付宝适配器
        └── bank.py      # 银行卡适配器
```

---

## 4. 用户管理 (UserManager)

```python
from gvsdsdk.models import User

# 创建用户
user = User.objects.create_user(username='alice', password='xxx', email='a@b.com')
user = User.objects.create_superuser(username='admin', password='xxx')

# 密码
user.SetPassword('new_pass')       # bcrypt 哈希
user.CheckPassword('input')        # 验证密码

# 查询
user = User.objects.get(UserName='alice')
users = User.objects.filter(UserAccountLicense=1)

# 属性
user.IsActive          # UserAccountLicense == 1
user.IsOnJob           # UserPositionStatus == 0
user.UUIDStr           # UUID 字符串
user.HasPermission('menu:admin')  # 检查权限
```

---

## 5. 角色管理 (RoleManager)

```python
from gvsdsdk.auth.managers import RoleManager

# 创建角色
role = RoleManager.CreateRole(name='管理员', company_uuid=company_uuid)

# 分配/移除角色
RoleManager.AssignRole(user_uuid=user.UserUUID, role_uuid=role.RoleUUID)
RoleManager.RemoveRole(user_uuid=user.UserUUID, role_uuid=role.RoleUUID)

# 查询角色
roles = RoleManager.GetRolesForUser(user_uuid=user.UserUUID)
users = RoleManager.GetUsersForRole(role_uuid=role.RoleUUID)

# 分配/移除权限
RoleManager.AssignPermission(role_uuid=role.RoleUUID, perm_code='menu:admin', perm_name='菜单管理')
RoleManager.RemovePermission(role_uuid=role.RoleUUID, perm_code='menu:admin')

# 查询权限
perms = RoleManager.GetPermissionsForRole(role_uuid=role.RoleUUID)
```

---

## 6. 商铺管理 (ShopManager)

```python
from gvsdsdk.auth.managers import ShopManager

# 创建商铺
shop = ShopManager.CreateShop(
    name='旗舰店',
    company_uuid=company_uuid,
    code='SHOP-001',
    shop_type=1,
    ShopAddress='北京市朝阳区xxx',
    ShopContact='张三',
    ShopPhone='13800138000',
    ShopDesc='公司旗舰门店',
)

# 角色关联商铺
ShopManager.AssignRole(role_uuid=role.RoleUUID, shop_uuid=shop.ShopUUID, is_main_shop=True)
ShopManager.RemoveRole(role_uuid=role.RoleUUID, shop_uuid=shop.ShopUUID)

# 查询
shops = ShopManager.GetShopsForRole(role_uuid=role.RoleUUID)       # 角色的所有商铺
roles = ShopManager.GetRolesForShop(shop_uuid=shop.ShopUUID)       # 商铺的所有角色
main_shop = ShopManager.GetMainShopForRole(role_uuid=role.RoleUUID) # 角色的主商铺
company_shops = ShopManager.GetShopsForCompany(company_uuid=company_uuid) # 公司的所有商铺

# 模型方法
shop.GetRoles()  # 商铺关联的所有角色
```

### 商铺模型字段

| 字段 | 类型 | 说明 |
|------|------|------|
| ShopUUID | BINARY(16) PK | 商铺 UUID |
| CompanyUUID | BINARY(16) | 所属公司 UUID |
| ShopName | VARCHAR(128) | 商铺名称 |
| ShopCode | VARCHAR(64) | 商铺编码 |
| ShopType | SMALLINT | 商铺类型 |
| ShopStatus | SMALLINT | 状态（1=启用） |
| ShopAddress | VARCHAR(512) | 地址 |
| ShopContact | VARCHAR(128) | 联系人 |
| ShopPhone | VARCHAR(32) | 联系电话 |
| ShopDesc | VARCHAR(512) | 描述 |
| CreateTime | DATETIME | 创建时间 |
| UpdateTime | DATETIME | 更新时间 |

### 角色商铺关联表 (RoleShop)

| 字段 | 类型 | 说明 |
|------|------|------|
| RoleShopUUID | BINARY(16) PK | 关联 UUID |
| RoleUUID | BINARY(16) | 角色 UUID |
| ShopUUID | BINARY(16) | 商铺 UUID |
| IsMainShop | SMALLINT | 是否主商铺（0/1） |
| CreateTime | DATETIME | 创建时间 |

---

## 7. 职务管理 (PositionManager)

```python
from gvsdsdk.auth.managers import PositionManager

# 创建职务
position = PositionManager.CreatePosition(
    name='总经理',
    company_uuid=company_uuid,
    code='POS-CEO',
    level=10,
    PositionDesc='公司最高管理职务',
)

# 角色关联职务
PositionManager.AssignRole(role_uuid=role.RoleUUID, position_uuid=position.PositionUUID, is_main_position=True)
PositionManager.RemoveRole(role_uuid=role.RoleUUID, position_uuid=position.PositionUUID)

# 查询
positions = PositionManager.GetPositionsForRole(role_uuid=role.RoleUUID)       # 角色的所有职务
roles = PositionManager.GetRolesForPosition(position_uuid=position.PositionUUID) # 职务的所有角色
main_pos = PositionManager.GetMainPositionForRole(role_uuid=role.RoleUUID)     # 角色的主职务
company_positions = PositionManager.GetPositionsForCompany(company_uuid=company_uuid) # 公司的所有职务

# 模型方法
position.GetRoles()  # 职务关联的所有角色
```

### 职务模型字段

| 字段 | 类型 | 说明 |
|------|------|------|
| PositionUUID | BINARY(16) PK | 职务 UUID |
| CompanyUUID | BINARY(16) | 所属公司 UUID |
| PositionName | VARCHAR(128) | 职务名称 |
| PositionCode | VARCHAR(64) | 职务编码 |
| PositionLevel | SMALLINT | 职务级别 |
| PositionStatus | SMALLINT | 状态（1=启用） |
| PositionDesc | VARCHAR(512) | 描述 |
| CreateTime | DATETIME | 创建时间 |
| UpdateTime | DATETIME | 更新时间 |

### 角色职务关联表 (RolePosition)

| 字段 | 类型 | 说明 |
|------|------|------|
| RolePositionUUID | BINARY(16) PK | 关联 UUID |
| RoleUUID | BINARY(16) | 角色 UUID |
| PositionUUID | BINARY(16) | 职务 UUID |
| IsMainPosition | SMALLINT | 是否主职务（0/1） |
| CreateTime | DATETIME | 创建时间 |

---

## 8. 权限验证 (PermissionVerifier)

```python
from gvsdsdk.auth.permissions import PermissionVerifier, IsAdminUser, CompanyScopedMixin

# 手动验证
if PermissionVerifier(perm_level=1, perm_attrs=['menu:admin'], user=request.user, request=request):
    pass

# DRF 权限类
class MyViewSet(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated, IsAdminUser]

# 公司范围自动过滤
class MyCompanyViewSet(CompanyScopedMixin, viewsets.ModelViewSet):
    company_field = 'CompanyUUID'  # 自动按当前角色公司过滤
```

---

## 9. ELT 认证

### 认证流程

```
浏览器 Cookie (ELT_TOKEN) → ELTAuthentication → EphemeralToken → User
```

### 中间件

```python
# settings.py MIDDLEWARE
'gvsdsdk.auth.middleware.ELTAuthMiddleware',       # 解析 ELT Cookie
'gvsdsdk.auth.middleware.CurrentRoleMiddleware',    # 注入 request.current_role

# 视图中使用
request.user                    # gvsdsdk.models.User 实例
request.current_role            # gvsdsdk.models.Role 实例（或 None）
request.current_company_uuid    # 当前角色所属公司 UUID（或 None）
```

### Cookie 管理

```python
from gvsdsdk.auth.cookie import SetELTCookie, DeleteELTCookie, ELT_COOKIE_NAME

# 登录成功后设置 Cookie
SetELTCookie(response, token_value)

# 登出时删除 Cookie
DeleteELTCookie(response)
```

### 加密工具

```python
from gvsdsdk.auth.crypto import HashPassword, VerifyPassword, SymmetricEncrypt, SymmetricDecrypt

# 密码
hashed = HashPassword('plaintext')
is_valid = VerifyPassword('plaintext', hashed)

# AES-256-GCM 对称加密
encrypted = SymmetricEncrypt('sensitive data', key)
decrypted = SymmetricDecrypt(encrypted, key)
```

---

## 10. 分佣引擎 (CommissionEngine)

```python
from gvsdsdk.commission import CommissionEngine, CommissionError

engine = CommissionEngine()

# 配置规则
engine.ConfigureRule(
    event_type='order_complete',
    participant_rules=[
        {'Type': 'percentage', 'Rate': 0.10, 'ParticipantID': 'platform'},
        {'Type': 'fixed', 'Amount': 50.00, 'ParticipantID': 'agent'},
        {'Type': 'remainder', 'ParticipantID': 'merchant'},
    ],
)

# 触发分佣
engine.Dispatch(
    event_type='order_complete',
    event_key='ORDER-12345',
    total_amount=1000.00,
    tenant_uuid=tenant_uuid,
)

# 邀请链分佣
engine.BuildInviteChainCommission(
    event_type='member_purchase',
    event_key='MEMBER-67890',
    total_amount=500.00,
    invite_chain=[user_uuid_1, user_uuid_2, user_uuid_3],
    tenant_uuid=tenant_uuid,
)

# 预结算
engine.PreSettle(event_key='ORDER-12345', participant_id='agent', amount=50.00)
engine.ConfirmPreSettlement(presettlement_uuid=uuid)
engine.RejectPreSettlement(presettlement_uuid=uuid)

# 查询
records = engine.QueryRecords(participant_id='agent')
total = engine.TotalByParticipant(participant_id='agent')
```

### 策略类型

| 策略 | Type | 说明 |
|------|------|------|
| PercentageStrategy | `percentage` | 比例分账，支持保底/封顶 |
| FixedStrategy | `fixed` | 固定金额 |
| TieredStrategy | `tiered` | 阶梯分账 |
| RemainderStrategy | `remainder` | 剩余归平台 |
| WithdrawalFeeStrategy | `withdrawal_fee` | 提现手续费 |

---

## 11. 支付网关 (PaymentManager)

```python
from gvsdsdk.payment import PaymentManager, PaymentError

manager = PaymentManager()

# 配置网关
manager.ConfigureGateway(
    tenant_uuid=tenant_uuid,
    platform='wechat',
    app_id='wx1234567890',
    merchant_id='1234567890',
    api_key='***',
)

# 发起支付
response = manager.Pay(
    tenant_uuid=tenant_uuid,
    platform='wechat',
    out_trade_no='ORDER-12345',
    total_amount=100.00,
    subject='商品名称',
    pay_method='JSAPI',
    openid='user_openid',
)

# 查询订单
result = manager.Query(tenant_uuid=tenant_uuid, out_trade_no='ORDER-12345')

# 退款
result = manager.Refund(
    tenant_uuid=tenant_uuid,
    out_trade_no='ORDER-12345',
    refund_amount=50.00,
    refund_reason='用户申请退款',
)

# 企业转账
result = manager.Transfer(
    tenant_uuid=tenant_uuid,
    platform='wechat',
    out_trade_no='TRANSFER-001',
    amount=100.00,
    transfer_type='balance',
    openid='user_openid',
)

# 处理回调
result = manager.HandleNotify(platform='wechat', raw_body=request.body)

# 列出可用渠道
channels = manager.ListChannels()
```

### 支付渠道

| 渠道 | Platform | 支付方式 | 转账 |
|------|----------|---------|------|
| 微信支付 | `wechat` | JSAPI/Native/H5/小程序 | 支持 |
| 支付宝 | `alipay` | APP/H5/Native | 支持 |
| 银行卡 | `bank` | APP/H5/Native | 仅 bank 类型 |

---

## 12. MSYNC 服务间通信

```python
from gvsdsdk.msync import ServiceRegistry, OGMManager, TransactionManager, ServiceClient
from gvsdsdk.msync.auth import SignPayload, BuildAuthPayload

# 服务注册
registry = ServiceRegistry()
registry.Register(
    service_name='my-service',
    domain='https://my-service.gvsds.com',
    secret='***',
    scope=['ogm:read', 'ogm:write'],
)

# OGM 全局对象映射
ogm = OGMManager()
mapping_id = ogm.CreateMapping(local_type='User', local_id=user_id)
remote_obj = ogm.GetRemote(mapping_id)

# 分布式事务
tx_mgr = TransactionManager()
tx = tx_mgr.Begin(participants=['service-a', 'service-b'])
tx_mgr.ExecuteStep(tx, 'service-a', 'create_order', {'item': 'xxx'})
tx_mgr.ExecuteStep(tx, 'service-b', 'deduct_stock', {'item': 'xxx'})
tx_mgr.Commit(tx)

# 服务客户端
client = ServiceClient(service_name='target-service')
response = client.Call('/api/resource', method='GET')
```

---

## 13. FluentQuery ORM 查询

```python
from gvsdsdk.models import User, Role, Shop, Position

# 通过 .query 属性使用 FluentQuery
users = User.query.filter(User.UserAccountLicense == 1).all()
admins = User.query.filter(User.IsSuperuser == True).all()

# 运算符重载
young = User.query.filter(User.UserAccountLicense != 0).all()

# 排序和分页
users = User.query.filter(User.IsActive == True).order_by(User.UserCreateTime).limit(10)

# Django ORM 原生查询（始终可用）
users = User.objects.filter(UserAccountLicense=1)
users = User.objects.filter(UserName__contains='admin')
```

---

## 14. 数据库路由与建表

### SAASDatabaseRouter

```python
# settings.py — 子服务器连接 SAAS 主库
DATABASE_ROUTERS = ['gvsdsdk.db_router.SAASDatabaseRouter']

# 可选配置
GVSDSDK_SAAS_DB_ALIAS = 'saas'       # SAAS 数据库别名，默认 'saas'
GVSDSDK_SAAS_READ_ONLY = True         # 子服务器只读，默认 True
```

### gvsdsdk_init 建表命令

```bash
# 完整建表
python manage.py gvsdsdk_init --db default

# 仅打印 SQL
python manage.py gvsdsdk_init --db default --dry-run

# 按模块建表
python manage.py gvsdsdk_init --db default --modules auth
python manage.py gvsdsdk_init --db default --modules auth,commission,payment
```

### GVSDSDK_MANAGE_TABLES

```python
# settings.py — 同源数据库，允许 Django 管理表
GVSDSDK_MANAGE_TABLES = True

# 然后执行
# python manage.py makemigrations gvsdsdk
# python manage.py migrate
```

---

## 15. 数据模型一览

### SAAS 核心模型 (gvsdsdk.models)

| 模型 | 表名 | 说明 |
|------|------|------|
| User | User | 用户表 |
| Role | Role | 角色表 |
| Permission | Permission | 权限表 |
| UserRole | UserRole | 用户-角色多对多 |
| RoleDept | RoleDept | 角色-部门多对多 |
| Shop | Shop | 商铺表 |
| RoleShop | RoleShop | 角色-商铺多对多 |
| Position | Position | 职务表 |
| RolePosition | RolePosition | 角色-职务多对多 |
| EphemeralToken | EphemeralToken | ELT 令牌表 |
| User2FA | User2FA | 双因素认证表 |
| UserPending2FA | UserPending2FA | 2FA 待验证表 |
| UserAvatar | UserAvatar | 用户头像表 |
| UserLoginLog | UserLoginLog | 登录日志表 |
| AccountActivation | AccountActivation | 账户激活码表 |
| UserABAC | UserABAC | 用户 ABAC 表 |
| Password | Password | 密码表 |

### 分佣模型 (gvsdsdk.commission.models)

| 模型 | 表名 | 说明 |
|------|------|------|
| CommissionEvent | CommissionEvent | 分佣事件表 |
| RateTable | CommissionRateTable | 费率表 |
| RateEntry | CommissionRateEntry | 费率条目表 |
| CommissionRule | CommissionRule | 分佣规则表 |
| CommissionRecord | CommissionRecord | 分佣记录表 |
| PreSettlement | CommissionPreSettlement | 预结算表 |

### 支付模型 (gvsdsdk.payment.models)

| 模型 | 表名 | 说明 |
|------|------|------|
| PaymentGatewayConfig | PaymentGatewayConfig | 支付网关配置表 |
| PaymentTransaction | PaymentTransaction | 支付交易流水表 |

---

## 导入速查表

| 用途 | 导入路径 | 顶层快捷 |
|------|---------|---------|
| 用户模型 | `from gvsdsdk.models import User` | `from gvsdsdk import User` |
| 角色管理 | `from gvsdsdk.auth.managers import RoleManager` | `from gvsdsdk import RoleManager` |
| 商铺管理 | `from gvsdsdk.auth.managers import ShopManager` | `from gvsdsdk import ShopManager` |
| 职务管理 | `from gvsdsdk.auth.managers import PositionManager` | `from gvsdsdk import PositionManager` |
| 权限验证 | `from gvsdsdk.auth.permissions import PermissionVerifier` | `from gvsdsdk import PermissionVerifier` |
| ELT 认证 | `from gvsdsdk.auth.elt_auth import ELTAuthentication` | `from gvsdsdk import ELTAuthentication` |
| Cookie | `from gvsdsdk.auth.cookie import SetELTCookie` | `from gvsdsdk import SetELTCookie` |
| 加密 | `from gvsdsdk.auth.crypto import SymmetricEncrypt` | `from gvsdsdk import SymmetricEncrypt` |
| 中间件 | `from gvsdsdk.auth.middleware import ELTAuthMiddleware` | `from gvsdsdk import ELTAuthMiddleware` |
| 分佣引擎 | `from gvsdsdk.commission import CommissionEngine` | `from gvsdsdk import CommissionEngine` |
| 支付网关 | `from gvsdsdk.payment import PaymentManager` | `from gvsdsdk import PaymentManager` |
| 微信支付 | `from gvsdsdk.payment.gateways.wechat import WechatPaymentGateway` | `from gvsdsdk import WechatPaymentGateway` |
| MSYNC 认证 | `from gvsdsdk.msync.auth import SignPayload` | `from gvsdsdk import SignPayload` |
| 服务注册 | `from gvsdsdk.msync import ServiceRegistry` | `from gvsdsdk import ServiceRegistry` |
| OGM | `from gvsdsdk.msync import OGMManager` | `from gvsdsdk import OGMManager` |
| 事务 | `from gvsdsdk.msync import TransactionManager` | `from gvsdsdk import TransactionManager` |
| 数据库路由 | `from gvsdsdk.db_router import SAASDatabaseRouter` | — |
| UUID 工具 | `from gvsdsdk.model_utils import UUIDObj` | `from gvsdsdk import UUIDObj` |
| QModel | `from gvsdsdk.model_base import QModel` | `from gvsdsdk import QModel` |
