# API文档

URL 以及 接口结构仅供参考。无需完全对应

## 接口定义（JSON 请求 / 响应）

### 1.1 发送验证码 `POST /api/v1/auth/send-code`
- `传入 手机号`
- **请求**
```json
{
  "phone": "18888888888"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "验证码已发送",
  "data": {
    "expiresIn": 300
  }
}
```

### 1.2 登录 `POST /api/v1/auth/login`
- `传入 手机号 验证码`
- **请求**
```json
{
  "phone": "18888888888",
  "code": "123456"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "登录成功",
  "data": {
    "token": "jwt-token",
    "user": {
      "id": "user_001",
      "name": "操作员",
      "role": "admin",
      "permissions": [
        "view_revenue",
        "view_exam",
        "manage_meal_status",
        "edit_notes"
      ]
    }
  }
}
```

### 2.1 获取今日体检统计 `GET /api/v1/home/daily-stats`
- `获取：今日预约人数 已签到人数 在检人数 已打印导检单数量 已完成人数 已用餐人数`
- **响应**
```json
{
  "code": 200,
  "data": {
    "dailyAppointment": 80,
    "signedIn": 60,
    "inExam": 25,
    "guidePrinted": 40,
    "completed": 30,
    "meal": 15
  }
}
```

### 3.1 获取营收统计（管理员）`GET /api/v1/home/revenue-stats`
- `获取：体检收入 加项收入 整体收入 目标收入`
- **响应**
```json
{
  "code": 200,
  "data": {
    "examRevenue": 86000,
    "addonRevenue": 12400,
    "totalRevenue": 98400,
    "targetRevenue": 120000,
    "gap": 21600
  }
}
```

### 4.1 获取 B1 数据 `GET /api/v1/home/b1-dashboard`
- `获取：当前客户总数 待检人数 在检人数`
- `列表：科室 医生 已检人数 已检部位数 总时长 平均时长`
- **响应**
```json
{
  "code": 200,
  "data": {
    "summary": {
      "totalClients": 33,
      "waiting": 10,
      "inExam": 10
    },
    "rows": [
      {
        "department": "B超1",
        "doctor": "张医生",
        "examinedCount": 6,
        "examinedParts": 18,
        "totalDuration": 90,
        "avgDuration": 15,
        "inExam": 2,
        "waiting": 2
      }
    ]
  }
}
```

### 5.1 获取北3数据 `GET /api/v1/home/north3-dashboard`
- `获取：今日家医生数 分配客户数 面诊数`
- `列表：家医 面诊率 分配客户数 面诊数`
- **响应**
```json
{
  "code": 200,
  "data": {
    "summary": {
      "totalDoctors": 3,
      "totalAssigned": 45,
      "consultations": 26
    },
    "rows": [
      {
        "doctor": "刘医生",
        "assignmentCount": 15,
        "consultations": 9,
        "consultRate": 0.6
      }
    ]
  }
}
```

### 7.1 获取体检客户列表 `GET /api/v1/exam/clients`
- `条件：时间段，如 8:00 ~ 12:00 到 12:00 ~ 17:00（或者上午0下午1）`
- `条件：用户等级，如高客 普客 散客 团客`
- `条件：登记情况，如已登记 未登记`
- `获取：套餐名称 渠道 状态 签到时间（耗时起始时间） 是否已签到 已加项数量 是否打印体检单`
- **查询参数**
```json
{
  "timeRange": "08:00-12:00",
  "level": "高客",
  "customerType": "团客",
  "signStatus": "已登记",
  "search": "张",
  "page": 1,
  "pageSize": 20
}
```
- **响应**
```json
{
  "code": 200,
  "data": {
    "total": 100,
    "page": 1,
    "pageSize": 20,
    "list": [
      {
        "id": "A001",
        "name": "张伟",
        "packageName": "高端入职体检套餐",
        "channel": "团体客户",
        "status": "体检中",
        "signedIn": true,
        "signTime": "2025-11-18 08:55",
        "elapsed": "00:45",
        "addonCount": 2,
        "guidePrinted": true,
        "timeSlot": "上午",
        "level": "VIP",
        "vipType": "高客",
        "customerType": "团客"
      }
    ]
  }
}
```

### 8.1 获取体检客户详情 `GET /api/v1/exam/clients/{clientId}`
- `基础信息：姓名 身份证 手机号 性别 年龄 客户级别 渠道 婚姻 家医 团标签`
- `体检进度：已查项目 未查项目 弃检项目 延期项目`
- `历史记录`
- `加项内容`
- `该次体检是否上传身份证（或已上传的身份证信息）`
- `该次体检是否已签名（或已上传的签名图片）`
- `体检知情同意书`
- `可选的加项列表（可以用字段表明已经支付后的加项）`
- `导检单PDF`
- **响应**
```json
{
  "code": 200,
  "data": {
    "id": "A001",
    "basicInfo": {
      "name": "张伟",
      "idCard": "4401********1234",
      "mobile": "137****9988",
      "gender": "男",
      "age": 35,
      "level": "VIP",
      "channel": "团检",
      "maritalStatus": "未婚",
      "familyDoctor": "李医生",
      "groupTag": "团检"
    },
    "progress": {
      "checkedItems": ["签到", "更衣"],
      "pendingItems": ["家医面诊"],
      "abandonedItems": [],
      "deferredItems": []
    },
    "history": [],
    "addonSummary": [
      {
        "name": "肿瘤标志物筛查",
        "paid": true,
        "tags": [
          {
            "title": "热门",
            "type": 1,
          },
          {
            "title": "肺结节筛查",
            "type": 2,
          },
          {
            "title": "医生推荐",
            "type": 3,
          },
          {
            "title": "渠道八折",
            "type": 4,
          }
        ],
        "originalPrice": "320.00",
        "currentPrice": "240.00"
      }
    ],
    "idCardUploaded": true,
    "idCardImages": {
      "front": "https://...",
      "back": "https://..."
    },
    "consentSigned": true,
    "consentImage": "https://...",
    "consentDocumentUrl": "https://...",
    "addonOptions": [
      {
        "id": "addon_001",
        "name": "甲状腺彩超",
        "price": 300,
        "paid": false
      }
    ],
    "guidePdfUrl": "https://example.com/guides/A001.pdf"
  }
}
```

### 8.2 上传身份证 `POST /api/v1/exam/clients/{clientId}/id-card`
- `具体用户上传身份证正面、反面`
- **请求**
```json
{
  "frontImage": "base64-front",
  "backImage": "base64-back"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "身份证上传成功"
}
```

### 8.5 上传体检同意书签名 `POST /api/v1/exam/clients/{clientId}/consent`
- `上传体检同意书签名图片`
- **请求**
```json
{
  "signatureImage": "base64-signature",
  "documentVersion": "v1.0"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "签名已保存"
}
```

### 8.6 生成加项订单 `POST /api/v1/exam/clients/{clientId}/addon-orders`
- `选择加项内容后获取订单号以及支付二维码`
- **请求**
```json
{
  "addonIds": ["addon_001", "addon_002"],
  "paymentMethod": "wechat_qr", // 如果是聚合码则取消
}
```
- **响应**
```json
{
  "code": 200,
  "data": {
    "orderId": "order_001",
    "amount": 800,
    "qrcodeUrl": "https://example.com/pay/order_001.png",
    "expiresIn": 300
  }
}
```

### 8.7 查询订单支付状态 `GET /api/v1/payments/{orderId}`
- `根据订单号查询 是否已经支付成功（HTTP或SSE）`
- **响应**
```json
{
  "code": 200,
  "data": {
    "orderId": "order_001",
    "status": "paid",
    "paidAt": "2025-11-18T09:20:00+08:00"
  }
}
```
- **SSE（可选）** `GET /api/v1/payments/{orderId}/events`
  - 服务端推送字段：`event`=`status`, `data`=`{"status":"paid"}`。

### 9.0 获取客服咨询信息 `GET /api/v1/support/info`
- `获取 标题 内容 图片`
- **响应**
```json
{
  "code": 200,
  "data": {
    "title": "客服咨询 · 圆圆客服台卡",
    "content": "一站式健康服务说明",
    "imageUrl": "https://example.com/assets/support-card.png"
  }
}
```

### 9.1 获取用餐状态列表 `GET /api/v1/meals`
- `条件 全部 已用餐 未用餐 姓名 体检号`
- **查询参数**
```json
{
  "status": "all",
  "clientName": "张",
  "clientId": "A001"
}
```
- **响应**
```json
{
  "code": 200,
  "data": [
    {
      "id": "A001",
      "name": "张伟",
      "status": "体检中",
      "mealStatus": "done",
      "mealTime": "2025-11-18 09:30"
    }
  ]
}
```

### 9.2 更新用餐状态 `POST /api/v1/meals/{clientId}`
- `更新指定用户用餐状态`
- **请求**
```json
{
  "mealStatus": "done"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "用餐状态已更新"
}
```

### 9.3 获取太平 VIP 认证二维码 `GET /api/v1/support/taiping-vip`
- `获取 标题 内容 图片`
- **响应**
```json
{
  "code": 200,
  "data": {
    "title": "太平 VIP 认证",
    "content": "扫描二维码完成认证",
    "imageUrl": "https://example.com/assets/taiping-vip.png"
  }
}
```

### 10.1 获取报告寄送登记二维码 `GET /api/v1/support/report-delivery`
- `获取 客服名称 图片`
- **响应**
```json
{
  "code": 200,
  "data": {
    "serviceName": "圆圆客服",
    "imageUrl": "https://example.com/assets/delivery-qrcode.png"
  }
}
```

### 10.2 报告寄送登记 `POST /api/v1/support/report-delivery`
- `传入 收件人 手机号 地址`
- **请求**
```json
{
  "recipient": "李四",
  "phone": "13800000000",
  "address": "上海市浦东新区世纪大道100号10楼",
  "remark": "加急寄送"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "寄送信息已保存",
  "data": {
    "deliveryId": "delivery_001"
  }
}
```

### 10.3 保存操作员备注 `POST /api/v1/notes`
- `保存操作员备注内容`
- **请求**
```json
{
  "operatorId": "user_001",
  "content": "客户希望下午完成全部项目"
}
```
- **响应**
```json
{
  "code": 200,
  "message": "备注已保存"
}
```

### 10.4 获取操作员备注 `GET /api/v1/notes`
- `获取操作员备注内容`
- **响应**
```json
{
  "code": 200,
  "data": [
    {
      "operatorId": "user_001",
      "content": "客户希望下午完成全部项目",
      "createdAt": "2025-11-18 10:00:00"
    }
  ]
}
```