# 无状态会员管理

> 模块标识：statelessMember  |  接口数量：7

## 1. 获取无状态会员列表
**方法**：	GET

**路径**：				/api/stateless-members

**功能说明**：
分页获取无状态会员列表

### 请求参数
```json
{
  "query": [
    {
      "name": "pageNum",
      "type": "number",
      "required": false,
      "description": "页码，默认1"
    },
    {
      "name": "pageSize",
      "type": "number",
      "required": false,
      "description": "每页数量，默认10"
    },
    {
      "name": "name",
      "type": "string",
      "required": false,
      "description": "会员名称关键词"
    },
    {
      "name": "code",
      "type": "string",
      "required": false,
      "description": "会员编码"
    },
    {
      "name": "memberTypeId",
      "type": "string",
      "required": false,
      "description": "按会员类型ID筛选（会员类型管理记录的_id）"
    },
    {
      "name": "status",
      "type": "number",
      "required": false,
      "description": "启用状态过滤：1-有效，0-无效"
    },
    {
      "name": "saleStatus",
      "type": "number",
      "required": false,
      "description": "售卖状态过滤：0-未售（可购买），1-已售（占用）。筛选未售时会包含历史无 saleStatus 字段的记录"
    }
  ]
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "获取成功",
    "data": {
      "list": [
        {
          "id": 1,
          "code": "SM0001",
          "name": "开放平台会员",
          "secretKey": "sk-xxx",
          "memberTypeId": "xxx",
          "status": 1,
          "saleStatus": 0,
          "soldAt": null,
          "soldOrderNo": null
        }
      ],
      "total": 100,
      "pageNum": 1,
      "pageSize": 10
    }
  }
}
```


## 2. 获取无状态会员详情
**方法**：	GET

**路径**：				/api/stateless-members/{id}

**功能说明**：
根据无状态会员ID获取详细信息

### 请求参数
```json
{
  "path": [
    {
      "name": "id",
      "type": "string",
      "required": true,
      "description": "无状态会员ID"
    }
  ]
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "获取成功",
    "data": {
      "id": 1,
      "code": "SM0001",
      "name": "开放平台会员",
      "secretKey": "sk-xxx",
      "memberTypeId": "xxx",
      "status": 1,
      "saleStatus": 0,
      "soldAt": null,
      "soldOrderNo": null
    }
  },
  "failure": {
    "code": "4040",
    "message": "无状态会员不存在",
    "data": null
  }
}
```


## 3. 创建无状态会员
**方法**：	POST

**路径**：				/api/stateless-members

**功能说明**：
创建新的无状态会员

### 请求参数
```json
{
  "body": {
    "name": "string｜必填，会员名称",
    "memberTypeId": "string｜可选，会员类型ID（会员类型管理记录的_id），如果提供会校验会员类型是否存在",
    "effectiveDate": "string｜必填，生效日期",
    "validityDays": "number｜必填，有效期天数（最小7天）",
    "firstEffectiveDate": "string｜可选，首次生效日期",
    "status": "number｜可选，状态：1-有效，0-无效，默认0",
    "saleStatus": "number｜可选，售卖状态：0-未售，1-已售，默认0。创建时设为1会同时写入 soldAt"
  }
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "创建无状态会员成功",
    "data": {
      "id": 1,
      "code": "SM0001",
      "name": "开放平台会员",
      "secretKey": "sk-xxx",
      "memberTypeId": "xxx",
      "status": 1,
      "saleStatus": 0
    }
  },
  "failure": {
    "code": "4000",
    "message": "关联的会员类型不存在",
    "data": null
  }
}
```

### 注意事项
- secretKey会自动生成，无需手动提供
- 如果提供了memberTypeId，会校验会员类型是否存在，不存在返回错误：关联的会员类型不存在
- saleStatus 表示售卖/占用状态，与 status（启用禁用）独立；不影响 OpenAPI 激活校验


## 4. 更新无状态会员
**方法**：	PUT

**路径**：				/api/stateless-members/{id}

**功能说明**：
更新指定无状态会员的信息

### 请求参数
```json
{
  "body": {
    "name": "string｜可选，会员名称",
    "memberTypeId": "string｜可选，会员类型ID（会员类型管理记录的_id），如果提供会校验会员类型是否存在",
    "effectiveDate": "string｜可选，生效日期",
    "validityDays": "number｜可选，有效期天数（最小7天）",
    "firstEffectiveDate": "string｜可选，首次生效日期",
    "status": "number｜可选，状态：1-有效，0-无效"
  },
  "path": [
    {
      "name": "id",
      "type": "string",
      "required": true,
      "description": "无状态会员ID"
    }
  ]
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "更新无状态会员成功",
    "data": {
      "id": 1,
      "code": "SM0001",
      "name": "开放平台会员",
      "secretKey": "sk-xxx",
      "memberTypeId": "xxx",
      "status": 1
    }
  },
  "failure": {
    "code": "4000",
    "message": "关联的会员类型不存在",
    "data": null
  }
}
```

### 注意事项
- 如果提供了memberTypeId，会校验会员类型是否存在，不存在返回错误：关联的会员类型不存在
- 有效状态（status=1）的无状态会员不允许修改，会返回错误：有效状态的无状态会员不允许修改
- 售卖状态（saleStatus）不可通过本接口修改，请使用 PUT /api/stateless-members/{id}/sale-status


## 5. 删除无状态会员
**方法**：	DELETE

**路径**：				/api/stateless-members/{id}

**功能说明**：
删除指定的无状态会员

### 请求参数
```json
{
  "path": [
    {
      "name": "id",
      "type": "string",
      "required": true,
      "description": "无状态会员ID"
    }
  ]
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "删除无状态会员成功",
    "data": {
      "result": true
    }
  },
  "failure": {
    "code": "4000",
    "message": "删除无状态会员失败",
    "data": null
  }
}
```

### 注意事项
- 有效状态（status=1）的无状态会员不允许删除，会返回错误：有效状态的无状态会员不允许删除


## 6. 切换无状态会员状态
**方法**：	PUT

**路径**：				/api/stateless-members/{id}/status

**功能说明**：
切换无状态会员的启用/禁用状态

### 请求参数
```json
{
  "body": {
    "status": "number｜必填，状态：1-有效，0-无效"
  },
  "path": [
    {
      "name": "id",
      "type": "string",
      "required": true,
      "description": "无状态会员ID"
    }
  ]
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "状态更新成功",
    "data": {
      "id": 1,
      "code": "SM0001",
      "name": "开放平台会员",
      "secretKey": "sk-xxx",
      "memberTypeId": "xxx",
      "effectiveDate": "2025-01-01",
      "validityDays": 365,
      "firstEffectiveDate": "2025-01-01",
      "status": 1,
      "saleStatus": 0,
      "updateTime": "2025-01-01T10:00:00.000Z"
    }
  },
  "failure": {
    "code": "4040",
    "message": "无状态会员不存在",
    "data": null
  }
}
```

### 注意事项
- 该接口用于切换无状态会员的启用/禁用状态（status）
- 只有通过状态切换接口才能修改有效状态的无状态会员
- 售卖状态（saleStatus）请使用售卖状态切换接口


## 7. 切换无状态会员售卖状态
**方法**：	PUT

**路径**：				/api/stateless-members/{id}/sale-status

**功能说明**：
标记无状态会员为已售出（占用）或回库为未售。用于手动分发、渠道出库等；一卡一卖，已售不可重复标记为已售。

### 请求参数
```json
{
  "body": {
    "saleStatus": "number｜必填，售卖状态：0-未售（回库），1-已售（占用）",
    "orderNo": "string｜可选，关联订单号；标记为已售时可写入 soldOrderNo"
  },
  "path": [
    {
      "name": "id",
      "type": "string",
      "required": true,
      "description": "无状态会员ID（_id 或数字 id）"
    }
  ]
}
```

### 响应示例
```json
{
  "success": {
    "code": "0000",
    "message": "售卖状态更新成功",
    "data": {
      "id": 1,
      "code": "SM0001",
      "name": "开放平台会员",
      "saleStatus": 1,
      "soldAt": "2025-01-15T10:00:00.000Z",
      "soldOrderNo": "ORD-20250115-0010",
      "status": 1,
      "updateTime": "2025-01-15T10:00:00.000Z"
    }
  },
  "failure": {
    "code": "4000",
    "message": "该无状态会员已售出，不可重复售卖",
    "data": null
  },
  "failureNotFound": {
    "code": "4040",
    "message": "无状态会员不存在",
    "data": null
  }
}
```

### 注意事项
- saleStatus=1 时写入 soldAt；可选 orderNo 写入 soldOrderNo
- saleStatus=0 时清除 soldAt、soldOrderNo（回库）
- 已为已售（saleStatus=1）时再次设为 1 会返回：该无状态会员已售出，不可重复售卖
- 售卖状态不影响 OpenAPI 激活/校验；已售卡密在有效期内仍可无限次激活
- 管理端订单（/api/orders）在状态变为 PAID 或 COMPLETED 且带有 statelessMemberId 时，也会自动标记为已售

