---
AIGC:
    Label: "1"
    ContentProducer: 001191440300708461136T1XGW3
    ProduceID: 96fe338f7fff1558be1c7f0355f40426_3be035ca8f1311f1a37a525400287e28
    ReservedCode1: 7Vj0YCcCfT7EkRKzmQfdqnOeAizQvjn8l4i3hjvkbv4gCXTU5OxQpKlk9VM0iI/yKUytHHCDxqp1vNbzJR0WI+Oj2Sbm8IdqDBlSlWHnS8HMgNss7Uu4oxuMVbuVWE6lHgvAY9s/iOr4RTQll2muvL0n5NlILWiOgEL7/CadNzbtXvwqqe/Y7y4IiJc=
    ContentPropagator: 001191440300708461136T1XGW3
    PropagateID: 96fe338f7fff1558be1c7f0355f40426_3be035ca8f1311f1a37a525400287e28
    ReservedCode2: 7Vj0YCcCfT7EkRKzmQfdqnOeAizQvjn8l4i3hjvkbv4gCXTU5OxQpKlk9VM0iI/yKUytHHCDxqp1vNbzJR0WI+Oj2Sbm8IdqDBlSlWHnS8HMgNss7Uu4oxuMVbuVWE6lHgvAY9s/iOr4RTQll2muvL0n5NlILWiOgEL7/CadNzbtXvwqqe/Y7y4IiJc=
---

# PC挂号 — 图文咨询与线上门诊 前端接口文档

## 概述

在现有 PC 挂号页面新增「图文咨询」和「线上门诊」两种就诊类型。操作流程与线下门诊完全一致：**选科室 → 选医生 → 选时段 → 选患者 → 确认费用 → 挂号提交**。

后端复用现有两步挂号流程（`PrePatRegister` + `CompletionPatRegister`），挂号成功后自动写入咨询记录。以下为前端全流程所需的全部接口。

---

## 接口清单

| 序号 | 步骤 | code | 接口 | 用途 | 状态 | 备注 |
|------|------|------|------|------|------|------|
| 26 | 0 | `01040160` | `GetHBResTypeLinkHospId` | 查询医院资源类型（判断是否支持图文/线上门诊） | 就绪 | **新增** |
| 27 | 1 | `03040005` | `GetRegLocList` | 获取可挂号科室列表 | 就绪（与线下共用） | — |
| 28 | 2 | `03040002` | `GetSchedulingData` | 获取指定日期的排班号源 | **需改造** | — |
| 29 | 3 | `03040018` | `GetRegTimedata` | 获取时段及费用预览 | 就绪 | — |
| 30 | 4 | `03040004` | `GetPatientInfo` | 刷卡/辅号查询患者信息 | 就绪 | — |
| 31 | 5 | `03040008` | `GetRegistFee` | 计算挂号费用明细 | 就绪（现有接口） | — |
| 32 | 6 | `03040051` | `ImageConsultRegister` | 提交图文咨询挂号 | 就绪 | **新增** |
| 33 | 7 | `03040052` | `VideoConsultRegister` | 提交线上门诊挂号 | 就绪 | **新增** |
| 34 | 8 | `03040016` | `CancleRegist` | 退号 | 就绪（通用，不依赖 ResourceType） | — |

---

## 接口调用时序

```mermaid
sequenceDiagram
    participant 前端 as 前端页面
    participant 后端 as 后端接口

    Note over 前端,后端: 【页面初始化】
    前端->>后端: 0. GetHBResTypeLinkHospId (hospID)
    后端-->>前端: 返回资源类型列表 [OP, IMAGE, VIDEO]
    Note over 前端: 根据返回决定展示<br/>图文/线上入口

    Note over 前端,后端: 【选择就诊类型后】
    前端->>后端: 1. GetRegLocList
    后端-->>前端: 返回科室列表

    Note over 前端,后端: 【选择科室后】
    前端->>后端: 2. GetSchedulingData (resourceType)
    后端-->>前端: 返回排班号源

    Note over 前端,后端: 【选择医生/日期后】
    前端->>后端: 3. GetRegTimedata
    后端-->>前端: 返回时段及费用预览

    Note over 前端,后端: 【刷卡/输号】
    前端->>后端: 4. GetPatientInfo (patCardNo)
    后端-->>前端: 返回患者信息

    Note over 前端,后端: 【确认挂号前】
    前端->>后端: 5. GetRegistFee
    后端-->>前端: 返回费用明细

    Note over 前端,后端: 【提交挂号】
    alt 图文咨询
        前端->>后端: 6. ImageConsultRegister
    else 线上门诊
        前端->>后端: 7. VideoConsultRegister
    end
    后端-->>前端: 挂号成功

    Note over 前端,后端: 【退号（独立分支）】
    前端->>后端: 8. CancleRegist
    后端-->>前端: 退号成功
```

**说明**：
- 步骤 0-5 为三种就诊类型（线下门诊/图文咨询/线上门诊）的公共流程
- 步骤 2 `GetSchedulingData` 需要传入 `resourceType` 区分排班类型
- 步骤 6/7 分别对应图文咨询和线上门诊的挂号提交，互斥
- 步骤 8 退号为独立操作，不依赖 `resourceType`

---

## 0. GetHBResTypeLinkHospId — 查询医院资源类型

**接口码**：`01040160`

根据医院 ID 查询该院已配置的资源类型（线下门诊 `OP`、图文咨询 `IMAGE`、线上门诊 `VIDEO`），前端可用于判断当前医院是否支持图文咨询/线上门诊入口。

**请求参数**：

```json
{
  "params": [{
    "hospID": "91",
    "active": "Y"
  }],
  "pagination": [{
    "pageSize": 10,
    "currentPage": 1
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "91",
    "hospCode": "H23"
  }]
}
```

| 字段 | 层级 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| `hospID` | `params[0]` | String | 是 | 医院 ID |
| `active` | `params[0]` | String | 否 | `"Y"` 仅返回生效，`"N"` 仅返回失效，不传则全返回 |
| `pageSize` | `pagination[0]` | Integer | 否 | 每页条数 |
| `currentPage` | `pagination[0]` | Integer | 否 | 当前页码 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "result": {
    "TotalCount": 3,
    "data": [
      {
        "id": 1,
        "code": "OP",
        "descripts": "线下门诊",
        "enDescripts": "Outpatient",
        "startDate": "2024-01-01",
        "status": "生效"
      },
      {
        "id": 2,
        "code": "IMAGE",
        "descripts": "图文咨询",
        "enDescripts": "Image Consultation",
        "startDate": "2024-01-01",
        "status": "生效"
      },
      {
        "id": 3,
        "code": "VIDEO",
        "descripts": "线上门诊",
        "enDescripts": "Video Consultation",
        "startDate": "2024-01-01",
        "status": "生效"
      }
    ]
  }
}
```

| 字段 | 层级 | 类型 | 说明 |
|------|------|------|------|
| `errorCode` | — | String | `"0"` 成功 |
| `TotalCount` | `result` | Integer | 符合条件总记录数 |
| `id` | `result.data[]` | Integer | 资源类型 ID |
| `code` | `result.data[]` | String | 资源类型编码：`OP` / `IMAGE` / `VIDEO` |
| `descripts` | `result.data[]` | String | 中文描述 |
| `enDescripts` | `result.data[]` | String | 英文描述 |
| `startDate` | `result.data[]` | String | 生效日期 |
| `status` | `result.data[]` | String | `"生效"` / `"失效"` |

**前端使用说明**：挂号页初始化时调用此接口，根据返回的 `code` 列表决定是否展示「图文咨询」「线上门诊」入口；`OP` 始终对应线下门诊。

---

## 1. GetRegLocList — 获取挂号科室列表

**接口码**：`03040005`

沿用线下门诊的科室列表，无需区分 ResourceType。同一科室可同时配置线下门诊、图文咨询、线上门诊三种排班。

**请求参数**：

```json
{
  "params": [{
    "locID": "",
    "detailFlag": "1",
    "docFlag": "1"
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67",
    "hospCode": "H23"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].locID` | String | 否 | 指定科室 ID，不传则返回全部有权限的科室 |
| `params[0].detailFlag` | String | 否 | `"1"` 返回详细信息 |
| `params[0].docFlag` | String | 否 | `"1"` 返回科室下医生信息 |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "result": {
    "TotalCount": 5,
    "Data": [
      {
        "id": "448",
        "descripts": "内科门诊",
        "locType": "O",
        "doctorList": [
          { "id": "946", "name": "张三", "title": "主任医师" }
        ]
      }
    ]
  }
}
```

---

## 2. GetSchedulingData — 获取排班号源

**接口码**：03040002

与线下门诊排班查询的核心区别：需传入 `resourceType` 参数，区分 OP / IMAGE / VIDEO。

**请求参数**：

```json
{
  "params": [{
    "date": "2026-08-03",
    "locID": "448",
    "docID": "946",
    "resourceType": "IMAGE",
    "timeRangeID": "1"
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67",
    "hospCode": "H23"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].date` | String | 是 | 排班日期，格式 `yyyy-MM-dd` |
| `params[0].locID` | String | 否 | 科室 ID |
| `params[0].docID` | String | 否 | 医生 ID |
| `params[0].resourceType` | String | 否 | 资源类型。`"OP"`(线下) / `"IMAGE"`(图文) / `"VIDEO"`(线上)。不传默认 `"OP"` |
| `params[0].timeRangeID` | String | 否 | 时段 ID，不传取当前时段 |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "result": {
    "totalCount": 1,
    "data": [
      {
        "resDetailID": "448||68971||1",
        "locID": "448",
        "locDesc": "内科门诊",
        "docID": "946",
        "docName": "张三",
        "title": "主任医师",
        "resDate": "2026-08-03",
        "timeRangeList": [
          {
            "id": "448||68971||1||1",
            "timeRangeDesc": "上午",
            "timeDetail": "08:00-12:00",
            "totalNum": 30,
            "regNum": 5,
            "usableNum": 25,
            "workStatusCode": "N"
          }
        ]
      }
    ]
  }
}
```

| 字段 | 说明 |
|------|------|
| `resDetailID` | 排班明细 ID，挂号提交时需要 |
| `timeRangeList[].id` | 时段 ID（即 `timeRangeID`），挂号提交和费用计算时需要 |
| `timeRangeList[].totalNum` | 总号源数 |
| `timeRangeList[].regNum` | 已挂号数 |
| `timeRangeList[].usableNum` | 可用号源数 |
| `timeRangeList[].workStatusCode` | `"N"`=正常，`"F"`=约满 |

---

## 3. GetRegTimedata — 获取时段详情及费用预览

**接口码**：03040018

入参无需改造，传入排班查询返回的 `resDetailID` 即可。

**请求参数**：

```json
{
  "params": [{
    "patID": "36214",
    "resDetailID": "448||68971||1"
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].patID` | String | 否 | 患者 ID，用于展示患者简要信息 |
| `params[0].resDetailID` | String | 是 | 排班明细 ID |
| `params[0].chooseRegTitleID` | String | 否 | 多号源职称 ID（按职称区分的号源配置） |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "data": {
    "patInfo": {
      "patNo": "P2023001",
      "patName": "李四",
      "patSexDesc": "男",
      "patBirthDate": "1990-05-20",
      "patCredNo": "3201**********1234",
      "patMobile": "138****5678",
      "patAge": "36"
    },
    "resDetail": [
      {
        "id": "448||68971||1||1",
        "locDescripts": "内科门诊",
        "docName": "张三",
        "bookDate": "2026-08-03",
        "sumAmt": "25.00",
        "price": "25.00",
        "resDetailID": "448||68971||1",
        "timeRange": "上午",
        "timeDetail": "08:00-12:00",
        "regResources": "5/30",
        "workStatusCode": "N",
        "usableNum": 25
      }
    ]
  }
}
```

---

## 4. GetPatientInfo — 查询患者信息

**接口码**：`03040004`

通用接口，三种就诊类型共用。

**请求参数**：

```json
{
  "params": [{
    "cardTypeID": "1",
    "cardNo": "0000123456",
    "number": ""
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].cardTypeID` | String | 否 | 卡类型 ID，与 `cardNo` 配合使用 |
| `params[0].cardNo` | String | 否 | 卡号（最高优先级） |
| `params[0].number` | String | 否 | 登记号 / 身份证号 / 医保号，`cardNo` 为空时使用 |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "data": {
    "patID": "36214",
    "patNo": "P2023001",
    "patName": "李四",
    "patSexDesc": "男",
    "patCredNo": "3201**********1234",
    "patBirthDate": "1990-05-20",
    "patAge": "36",
    "patMobile": "138****5678",
    "patTypeDesc": "自费",
    "patTypeID": "1",
    "accountBalance": "150.00",
    "admReason": [
      { "id": "123", "descripts": "自费", "defaultFlag": "Y" }
    ],
    "cardFlag": "1",
    "cardID": "5001",
    "patCardNo": "0000123456",
    "visitedFlag": "N"
  }
}
```

| 主要字段 | 说明 |
|------|------|
| `patID` | 患者 ID，挂号提交时使用 |
| `admReason` | 费别列表，`defaultFlag="Y"` 的是默认费别 |
| `cardFlag` | `"1"` 表示存在有效卡 |

---

## 5. GetRegistFee — 计算挂号费用

**接口码**：03040008

通用接口，三种就诊类型共用。

**请求参数**：

```json
{
  "params": [{
    "patID": "36214",
    "resDetailID": "448||68971||1",
    "admReasonID": "123",
    "greenFlag": "N",
    "visitFlag": "N",
    "bookFlag": "N"
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].patID` | String | 是 | 患者 ID |
| `params[0].resDetailID` | String | 是 | 排班明细 ID |
| `params[0].admReasonID` | String | 是 | 费别 ID，取自 `GetPatientInfo.admReason[].id` |
| `params[0].greenFlag` | String | 否 | 绿色号 `"Y"`，图文/线上通常为 `"N"` |
| `params[0].visitFlag` | String | 否 | 复诊号 `"Y"` |
| `params[0].bookFlag` | String | 否 | 病历本 `"Y"` |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "data": {
    "price": "25.00",
    "discount": "0.00",
    "accountBalance": "150.00",
    "insuSum": "0.00",
    "insuBalance": "0.00",
    "shareFee": "25.00",
    "paywCASHID": "1",
    "paywACCID": "2",
    "accountFee": "0.00"
  }
}
```

| 字段 | 说明 |
|------|------|
| `price` | 总费用（挂号费+诊查费） |
| `discount` | 优惠金额 |
| `shareFee` | 应收金额（自付部分） |
| `paywCASHID` | 现金支付方式 ID |
| `paywACCID` | 院内账户支付方式 ID |

---

## 6. ImageConsultRegister — 提交图文咨询挂号

**接口码**：03040051

新增接口。挂号成功后自动写入 `BS_ConsultRecord` 图文咨询记录。

**请求参数**：

```json
{
  "params": [{
    "patID": "36214",
    "resDetailID": "448||68971||1",
    "timeRangeID": "448||68971||1||1",
    "admReasonID": "123",
    "paywStr": "[{\"payWay\":\"1\",\"amt\":\"25.00\"}]"
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67",
    "hospCode": "H23"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].patID` | String | **是** | 患者 ID，来自 `GetPatientInfo.data.patID` |
| `params[0].resDetailID` | String | **是** | 排班明细 ID，来自 `GetSchedulingData.result.data[].resDetailID` |
| `params[0].timeRangeID` | String | **是** | 时段 ID，来自 `GetSchedulingData.result.data[].timeRangeList[].id` |
| `params[0].admReasonID` | String | 否 | 费别 ID，不传则自动取患者默认费别 |
| `params[0].paywStr` | String | 否 | 支付方式，格式 `[{"payWay":"支付方式ID","amt":"金额"}]` |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "挂号成功",
  "result": {
    "admID": "123456"
  }
}
```

| 字段 | 说明 |
|------|------|
| `errorCode` | `"0"` 成功，非 `"0"` 失败 |
| `result.admID` | 就诊 ID，用于退号 |

**常见错误**：

| errorCode | errorMessage | 原因 |
|-----------|-------------|------|
| `-1` | 请选择患者！ | patID 为空 |
| `-1` | 请选择排班信息！ | resDetailID 为空 |
| 其他 | 号源已满 / 排班不存在…… | 见系统错误提示 |

---

## 7. VideoConsultRegister — 提交线上门诊挂号

**接口码**：03040052

新增接口。挂号成功后自动写入 `BS_ConsultRecord` + `BS_VideoConsultRecord` 线上门诊咨询记录。

**入参 / 出参与 `ImageConsultRegister` 完全一致**，参见上节。

---

## 8. CancleRegist — 退号

**接口码**：无

通用接口，不依赖 ResourceType，三种就诊类型共用。

**请求参数**：

```json
{
  "params": [{
    "admID": "123456",
    "pcFlag": "Y"
  }],
  "session": [{
    "userID": "946",
    "locID": "448",
    "groupID": "307",
    "hospID": "67"
  }]
}
```

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `params[0].admID` | String | **是** | 就诊 ID，挂号成功后返回 |
| `params[0].pcFlag` | String | 否 | PC 端退号传 `"Y"`，控制结算校验 |
| `session[0]` | Object | 是 | 登录信息 |

**返回结果**：

```json
{
  "errorCode": "0",
  "errorMessage": "",
  "result": {
    "payMentID": "退费交易记录ID"
  }
}
```

**限制条件**（以下任一满足则退号失败）：
- 已就诊（队列状态为 A/F）
- 已有诊断记录
- 存在非挂号费类的医嘱
- PC 端且挂号费已结算

---

## 附录：三种就诊类型对比

| 维度 | 线下门诊 | 图文咨询 | 线上门诊 |
|------|----------|----------|----------|
| 排班 ResourceType | `OP` | `IMAGE` | `VIDEO` |
| 挂号提交接口 | `DoctorRegister`（03040050） | `ImageConsultRegister`（未分配） | `VideoConsultRegister`（未分配） |
| 咨询记录 | 无 | `BS_ConsultRecord` | `BS_ConsultRecord` + `BS_VideoConsultRecord` |
| 排班查询 resourceType | `"OP"` | `"IMAGE"` | `"VIDEO"` |
| 科室列表 | 共用 | 共用 | 共用 |
| 患者查询 | 共用 | 共用 | 共用 |
| 费用计算 | 共用 | 共用 | 共用 |
| 退号 | 共用 | 共用 | 共用 |

## 附录：后端改造状态

| 接口 | 状态 | 说明 |
|------|------|------|
| `ImageConsultRegister` | 已新增 | `src.Doctor.Interface` + `src.Doctor.reg` |
| `VideoConsultRegister` | 已新增 | 同上 |
| `GetHBResTypeLinkHospId` | 已新增 | `src\DocCure\Interface.cls` + `src\DocCure\HBResTypeLinkHosp.cls`，前置查询医院资源类型 |
| `GetSchedulingData` | 已改造 | `src\Doctor\reg.cls` 第 144 行，`resourceType` 参数默认 `"OP"`，支持传入 `"IMAGE"` / `"VIDEO"` |
| 其余接口 | 无需改造 | 公共逻辑，不依赖 ResourceType |
*（内容由AI生成，仅供参考）*
