liudan 1 неделя назад
Родитель
Сommit
b72659c981

+ 168 - 23
docs/PC挂号-图文咨询与线上门诊接口文档_20260803_161244_250.md

@@ -1,4 +1,17 @@
 ---
+AIGC:
+    Label: "1"
+    ContentProducer: 001191440300708461136T1XGW3
+    ProduceID: 96fe338f7fff1558be1c7f0355f40426_04eb9c2f907211f18e22525400f8a581
+    ReservedCode1: qT4ed4rzqj5gVhPRBZI0pGAzof89HGzn7IhrgOqLuddPnNOlrcO0DYEFcuL9selwvaa3msPV9YtWRQHNCyqWHztmt5YKB188TeXohMnNTNrY/UIVY9ltvTDspXbQove4GR/yStduJWrpQZCOQ1VFvjIkZnI/W3ZH2NRKgW6/ilP/OgXr/WVg3KVXh38=
+    ContentPropagator: 001191440300708461136T1XGW3
+    PropagateID: 96fe338f7fff1558be1c7f0355f40426_04eb9c2f907211f18e22525400f8a581
+    ReservedCode2: qT4ed4rzqj5gVhPRBZI0pGAzof89HGzn7IhrgOqLuddPnNOlrcO0DYEFcuL9selwvaa3msPV9YtWRQHNCyqWHztmt5YKB188TeXohMnNTNrY/UIVY9ltvTDspXbQove4GR/yStduJWrpQZCOQ1VFvjIkZnI/W3ZH2NRKgW6/ilP/OgXr/WVg3KVXh38=
+---
+
+
+
+---
 AIGC:
     Label: "1"
     ContentProducer: 001191440300708461136T1XGW3
@@ -29,9 +42,10 @@ AIGC:
 | 29 | 3 | `03040018` | `GetRegTimedata` | 获取时段及费用预览 | 就绪 | — |
 | 30 | 4 | `03040004` | `GetPatientInfo` | 刷卡/辅号查询患者信息 | 就绪 | — |
 | 31 | 5 | `03040008` | `GetRegistFee` | 计算挂号费用明细 | 就绪(现有接口) | — |
-| 32 | 6 | `03040051` | `ImageConsultRegister` | 提交图文咨询挂号 | 就绪 | **新增** |
-| 33 | 7 | `03040052` | `VideoConsultRegister` | 提交线上门诊挂号 | 就绪 | **新增** |
+| 32 | 6 | `03040051` | `ImageConsultRegister` | 提交图文咨询挂号(占用号源,患者自行支付) | 就绪 | **新增** |
+| 33 | 7 | `03040052` | `VideoConsultRegister` | 提交线上门诊挂号(占用号源,患者自行支付) | 就绪 | **新增** |
 | 34 | 8 | `03040016` | `CancleRegist` | 退号 | 就绪(通用,不依赖 ResourceType) | — |
+| 35 | 9 | `03040007` | `PatRegister` | 挂号(含收费)(一次完成 PrePatRegister + 收费结算) | 就绪 | **新增** |
 
 ---
 
@@ -68,12 +82,18 @@ sequenceDiagram
     后端-->>前端: 返回费用明细
 
     Note over 前端,后端: 【提交挂号】
-    alt 图文咨询
-        前端->>后端: 6. ImageConsultRegister
+    alt 线下门诊(含收费)
+        前端->>后端: 9. PatRegister(一次完成 PrePatRegister + OPCharge 收费结算)
+    else 图文咨询
+        前端->>后端: 6. ImageConsultRegister(预挂号)
     else 线上门诊
-        前端->>后端: 7. VideoConsultRegister
+        前端->>后端: 7. VideoConsultRegister(预挂号)
     end
-    后端-->>前端: 挂号成功
+    后端-->>前端: PatRegister→状态直接 111(已挂号);预挂号→状态 115(预挂号),返回 admID(占用号源)
+
+    Note over 前端,后端: 【患者自行支付后回调(仅图文/线上门诊)】
+    前端->>后端: 支付回调 CompletionPatRegister (admID)
+    后端-->>前端: 挂号状态 115→111,自动写入咨询记录
 
     Note over 前端,后端: 【退号(独立分支)】
     前端->>后端: 8. CancleRegist
@@ -83,7 +103,8 @@ sequenceDiagram
 **说明**:
 - 步骤 0-5 为三种就诊类型(线下门诊/图文咨询/线上门诊)的公共流程
 - 步骤 2 `GetSchedulingData` 需要传入 `resourceType` 区分排班类型
-- 步骤 6/7 分别对应图文咨询和线上门诊的挂号提交,互斥
+- 步骤 6/7 分别对应图文咨询和线上门诊的预挂号提交,互斥;提交后由患者自行支付,支付回调 `CompletionPatRegister` 完成正式挂号(状态 115→111)
+- 步骤 9 对应线下门诊挂号,一次完成 PrePatRegister + OPCharge 收费结算,就诊状态直接为 111(已挂号),无需患者二次支付
 - 步骤 8 退号为独立操作,不依赖 `resourceType`
 
 ---
@@ -516,11 +537,11 @@ sequenceDiagram
 
 ---
 
-## 6. ImageConsultRegister — 提交图文咨询挂号
+## 6. ImageConsultRegister — 提交图文咨询挂号
 
 **接口码**:03040051
 
-新增接口。挂号成功后自动写入 `BS_ConsultRecord` 图文咨询记录
+新增接口。窗口工作人员帮患者预挂号,占用号源。患者自行支付后走支付回调完成正式挂号
 
 **请求参数**:
 
@@ -530,8 +551,7 @@ sequenceDiagram
     "patID": "36214",
     "resDetailID": "448||68971||1",
     "timeRangeID": "448||68971||1||1",
-    "admReasonID": "123",
-    "paywStr": "[{\"payWay\":\"1\",\"amt\":\"25.00\"}]"
+    "admReasonID": "123"
   }],
   "session": [{
     "userID": "946",
@@ -549,25 +569,28 @@ sequenceDiagram
 | `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": "挂号成功",
+  "errorCode": 0,
+  "errorMessage": "挂号成功",
   "result": {
-    "admID": "123456"
+    "admID": "486",
+    "url": "https://cdqycrg-hlwyy.hydproject.com/patientapp/pages/tabBar/order/order?q=62489^0000003712^486^QYCRGMZB"
   }
 }
 ```
 
-| 字段 | 说明 |
-|------|------|
-| `errorCode` | `"0"` 成功,非 `"0"` 失败 |
-| `result.admID` | 就诊 ID,用于退号 |
+| 字段 | 层级 | 类型 | 说明 |
+|------|------|------|------|
+| `errorCode` | — | String | `"0"` 成功,非 `"0"` 失败 |
+| `result.admID` | `result` | String | 就诊 ID,供患者支付时引用 |
+| `url` | `result` | String | 患者支付链接,格式 `{baseUrl}/patientapp/pages/tabBar/order/order?q=patID^patNo^admID^hospCode`。baseUrl 从配置 PatientappOrder 获取,配置不存在时该字段不返回 |
+
+> **说明**:`url` 的 `baseUrl` 从系统配置获取(`AppCommon.GetAppPropValue`, `appCode=FileServer`, `propCode=PatientappOrder`),配置不存在时 `url` 字段不返回。
 
 **常见错误**:
 
@@ -577,15 +600,19 @@ sequenceDiagram
 | `-1` | 请选择排班信息! | resDetailID 为空 |
 | 其他 | 号源已满 / 排班不存在…… | 见系统错误提示 |
 
+**补充说明**:支付回调 = `CompletionPatRegister`,会完成挂号状态 115→111 并自动写入咨询记录。
+
 ---
 
-## 7. VideoConsultRegister — 提交线上门诊挂号
+## 7. VideoConsultRegister — 提交线上门诊挂号
 
 **接口码**:03040052
 
-新增接口。挂号成功后自动写入 `BS_ConsultRecord` + `BS_VideoConsultRecord` 线上门诊咨询记录
+新增接口。窗口工作人员帮患者预挂号,占用号源。患者自行支付后走支付回调完成正式挂号
 
-**入参 / 出参与 `ImageConsultRegister` 完全一致**,参见上节。
+**入参 / 出参与 `ImageConsultRegister` 完全一致**(返回结果同样包含 `url` 字段,baseUrl 从配置 `PatientappOrder` 获取),参见上节。
+
+**补充说明**:支付回调 = `CompletionPatRegister`,会完成挂号状态 115→111 并自动写入咨询记录。
 
 ---
 
@@ -638,12 +665,127 @@ sequenceDiagram
 
 ---
 
+## 9. PatRegister — 挂号(含收费)
+
+**接口码**:`03040007`
+
+新增接口。窗口工作人员帮患者完成线下门诊挂号,一次调用完成 PrePatRegister(预挂号占用号源)+ OPCharge(收费结算),就诊状态直接为 **111(已挂号)**。
+
+**请求参数**:
+
+```json
+{
+    "params": [
+        {
+            "resDetailID": "1660||16478",
+            "userID": "910",
+            "groupID": "352",
+            "locID": "383",
+            "hospID": "55",
+            "patID": "82869",
+            "bookFlag": "N",
+            "greenFlag": "N",
+            "visitFlag": "N",
+            "visitedFlag": "Y",
+            "bookMethodID": "Win",
+            "admReasonID": "1",
+            "regFeeSet": "N",
+            "paywStr": [
+               
+            ],
+            "patSource": ""
+        }
+    ],
+    "code": "03040007",
+    "session": [
+        {
+            "userID": "910",
+            "locID": "383",
+            "groupID": "352",
+            "hospID": "55",
+            "sessionID": "znOWAkwSVH",
+            "hospCode": "H02",
+            "language": "CN",
+            "hostName": "",
+            "ipv4": "182.254.220.28",
+            "ipv6": "",
+            "mac": ""
+        }
+    ]
+}
+```
+
+| 字段 | 层级 | 类型 | 必填 | 说明 |
+|------|------|------|------|------|
+| `resDetailID` | `params[0]` | String | **是** | 排班明细 ID,来自 `GetSchedulingData.result.data[].resDetailID` |
+| `userID` | `params[0]` | String | 是 | 操作人 ID |
+| `groupID` | `params[0]` | String | 是 | 安全组 ID |
+| `locID` | `params[0]` | String | 是 | 科室 ID |
+| `hospID` | `params[0]` | String | 是 | 院区 ID |
+| `patID` | `params[0]` | String | **是** | 患者 ID,来自 `GetPatientInfo.data.patID` |
+| `bookFlag` | `params[0]` | String | 否 | 病历本标识 `"Y"` / `"N"`,默认 `"N"` |
+| `greenFlag` | `params[0]` | String | 否 | 绿色通道标记 `"Y"` / `"N"`,默认 `"N"` |
+| `visitFlag` | `params[0]` | String | 否 | 复诊号标记 `"Y"` / `"N"`,默认 `"N"` |
+| `visitedFlag` | `params[0]` | String | 否 | 复诊标记 `"Y"` / `"N"`,默认 `"N"` |
+| `bookMethodID` | `params[0]` | String | 否 | 挂号方式,如 `"Win"`(窗口)、`"NET"`(网络)、`"SELF"`(自助),默认 `"Win"` |
+| `admReasonID` | `params[0]` | String | 否 | 费别 ID,来自 `GetPatientInfo.data.admReason[].id` |
+| `regFeeSet` | `params[0]` | String | 是 | 是否结算标识。`"Y"` 结算(默认),`"N"` 不结算(零元挂号或仅占号不收费),默认 `"N"` |
+| `paywStr` | `params[0]` | Array | 否 | 支付方式数组,元素字段见下方「paywStr 元素字段」表 |
+| `patSource` | `params[0]` | String | 否 | 患者来院渠道 |
+
+**paywStr 元素字段**:
+
+| 字段 | 类型 | 必填 | 说明 |
+|------|------|------|------|
+| `payWayID` | String | 否 | 支付方式 ID |
+| `payWayAmt` | Integer | 否 | 支付金额(分),`0` 表示不收取 |
+| `hospID` | String | 否 | 院区 ID |
+
+> **说明**:`ipv4` 由路由层从 `session` 注入到 `params[0]`,前端无需传入。
+
+**返回结果**:
+
+```json
+{
+  "errorCode": 0,
+  "errorMessage": "",
+  "admID": "486",
+  "print": "<挂号条打印数据>",
+  "invPrint": "<发票打印数据>",
+  "medicalBookID": ""
+}
+```
+
+| 字段 | 层级 | 类型 | 说明 |
+|------|------|------|------|
+| `errorCode` | — | Integer | `0` 成功,`-1` 异常,其他非 0 值为业务错误 |
+| `errorMessage` | — | String | 成功时为空,失败时返回具体错误信息 |
+| `admID` | — | String | 就诊 ID,挂号成功后返回 |
+| `print` | — | String | 挂号条打印信息(供打印组件使用) |
+| `invPrint` | — | String | 发票打印数据(供打印组件使用) |
+| `medicalBookID` | — | String | 病历本 ID,未购买病历本时为空 |
+
+**常见错误**:
+
+| errorCode | errorMessage | 原因 |
+|-----------|-------------|------|
+| `-1` | 请选择患者! | `patID` 为空 |
+| `-1` | 请选择排班信息! | `resDetailID` 为空 |
+| 其他 | 号源已满 / 排班不存在…… | 见系统错误提示 |
+
+**补充说明**:
+- 本接口在 `PrePatRegister`(预挂号占用号源)后直接调用 `OPCharge` 完成收费结算,一次调用完成挂号全流程,就诊状态直接为 **111(已挂号)**
+- `regFeeSet="N"` 时跳过 `OPCharge` 收费环节,就诊记录仍正常插入但不扣费(适用零元挂号或仅占号不收费场景)
+- `paywStr` 传空数组 `[]` 时,支付方式串为空,应配合 `regFeeSet="N"` 使用,否则 `OPCharge` 将以无支付渠道方式执行可能导致扣费异常
+
+---
+
 ## 附录:三种就诊类型对比
 
 | 维度 | 线下门诊 | 图文咨询 | 线上门诊 |
 |------|----------|----------|----------|
 | 排班 ResourceType | `OP` | `IMAGE` | `VIDEO` |
-| 挂号提交接口 | `DoctorRegister`(03040050) | `ImageConsultRegister`(未分配) | `VideoConsultRegister`(未分配) |
+| 挂号提交接口 | `DoctorRegister`(03040050)<br>`PatRegister`(03040007,含收费) | `ImageConsultRegister`(03040051,预挂号) | `VideoConsultRegister`(03040052,预挂号) |
 | 咨询记录 | 无 | `BS_ConsultRecord` | `BS_ConsultRecord` + `BS_VideoConsultRecord` |
 | 排班查询 resourceType | `"OP"` | `"IMAGE"` | `"VIDEO"` |
 | 科室列表 | 共用 | 共用 | 共用 |
@@ -657,7 +799,10 @@ sequenceDiagram
 |------|------|------|
 | `ImageConsultRegister` | 已新增 | `src.Doctor.Interface` + `src.Doctor.reg` |
 | `VideoConsultRegister` | 已新增 | 同上 |
+| `PatRegister` | 已新增 | `src.PatAdm.Interface` → `src.PatAdm.OPAdm.PatRegister`,一次完成 PrePatRegister + OPCharge |
 | `GetHBResTypeLinkHospId` | 已新增 | `src\DocCure\Interface.cls` + `src\DocCure\HBResTypeLinkHosp.cls`,前置查询医院资源类型 |
 | `GetSchedulingData` | 已改造 | `src\Doctor\reg.cls` 第 144 行,`resourceType` 参数默认 `"OP"`,支持传入 `"IMAGE"` / `"VIDEO"` |
 | 其余接口 | 无需改造 | 公共逻辑,不依赖 ResourceType |
 *(内容由AI生成,仅供参考)*
+*(内容由AI生成,仅供参考)*
+*(内容由AI生成,仅供参考)*

+ 45 - 18
src/pages/opadmReg/RegistrationIncludesMedicalInsurance.jsx

@@ -960,10 +960,21 @@ class RegistrationIncludesMedicalInsurance extends React.Component {
           resourceType: this.state.resourceType, // 资源类型
         }]
       }
-      // 存储当前排班信息(用于IMAGE/VIDEO提交时使用)
-      this.setState({ registrMsg: { resDetailID: data.resDetailID, timeRangeID: data.timeRangeID } })
+      // 存储当前排班信息
+      var registrMsg = { resDetailID: data.resDetailID, timeRangeID: data.timeRangeID };
+      this.setState({ registrMsg });
 
-      // 预挂号 
+      // 图文/线上挂号:跳过预挂号,使用新的单步接口03040007(合并预挂号+收费结算)
+      if (this.state.resourceType === 'IMAGE') {
+        this.imageConsultRegister('', registrMsg);
+        return;
+      }
+      if (this.state.resourceType === 'VIDEO') {
+        this.videoConsultRegister('', registrMsg);
+        return;
+      }
+
+      // 预挂号 (OP类型)
       let res = await INSUYBUtil.GoTOHISHttp(params, '03040048'); // 调用his接口
       if (res.errorCode != '0') {
         this.setState({ loading: false });
@@ -1020,13 +1031,7 @@ class RegistrationIncludesMedicalInsurance extends React.Component {
           });
         } else {
           //挂号不收费
-          if (this.state.resourceType === 'IMAGE') {
-            this.imageConsultRegister('');
-          } else if (this.state.resourceType === 'VIDEO') {
-            this.videoConsultRegister('');
-          } else {
-            this.CompletionPatRegister(''); // OP挂号确认
-          }
+          this.CompletionPatRegister(''); // OP挂号确认
         }
       })
     } catch (error) {
@@ -1163,9 +1168,10 @@ class RegistrationIncludesMedicalInsurance extends React.Component {
     return true;
   }
 
-  // 图文咨询挂号(单步提交)
-  imageConsultRegister = async (paywIDinfo) => {
+  // 图文咨询挂号(单步提交,接口码 03040007 合并预挂号+收费结算
+  imageConsultRegister = async (paywIDinfo, registrMsgOverride) => {
     let { patientMsg, registrMsg } = this.state;
+    registrMsg = registrMsgOverride || registrMsg;
     let patID = patientMsg?.patID || '';
     var admReasonFlags = '';
     var admId = '';
@@ -1187,13 +1193,23 @@ class RegistrationIncludesMedicalInsurance extends React.Component {
       params: [{
         patID: patID,
         resDetailID: registrMsg?.resDetailID || '',
-        timeRangeID: registrMsg?.timeRangeID || '',
+        userID: this.state.userData.userID,
+        groupID: this.state.userData.groupID,
+        locID: this.state.userData.locID,
+        hospID: this.state.userData.hospID,
         admReasonID: this.state.admReasonId ? this.state.admReasonId : (admReasonFlags ? admId : defAdmId),
+        bookFlag: this.state.checked ? 'Y' : 'N',
+        greenFlag: this.state.greenFlag ? 'Y' : 'N',
+        visitFlag: this.state.visitFlag ? 'Y' : 'N',
+        visitedFlag: this.state.visitedFlag ? 'Y' : 'N',
+        bookMethodID: 'Win',
+        regFeeSet: 'N',
         paywStr: paywIDinfo,
+        patSource: '',
       }]
     }
     // 图文咨询挂号
-    let res = await INSUYBUtil.GoTOHISHttp(params, '03040051');
+    let res = await INSUYBUtil.GoTOHISHttp(params, '03040007');
     if (res.errorCode != '0') {
       this.RollBACKOPCharge();
       this.setState({ loading: false });
@@ -1255,9 +1271,10 @@ class RegistrationIncludesMedicalInsurance extends React.Component {
     return true;
   }
 
-  // 线上门诊挂号(单步提交)
-  videoConsultRegister = async (paywIDinfo) => {
+  // 线上门诊挂号(单步提交,接口码 03040007 合并预挂号+收费结算
+  videoConsultRegister = async (paywIDinfo, registrMsgOverride) => {
     let { patientMsg, registrMsg } = this.state;
+    registrMsg = registrMsgOverride || registrMsg;
     let patID = patientMsg?.patID || '';
     var admReasonFlags = '';
     var admId = '';
@@ -1279,13 +1296,23 @@ class RegistrationIncludesMedicalInsurance extends React.Component {
       params: [{
         patID: patID,
         resDetailID: registrMsg?.resDetailID || '',
-        timeRangeID: registrMsg?.timeRangeID || '',
+        userID: this.state.userData.userID,
+        groupID: this.state.userData.groupID,
+        locID: this.state.userData.locID,
+        hospID: this.state.userData.hospID,
         admReasonID: this.state.admReasonId ? this.state.admReasonId : (admReasonFlags ? admId : defAdmId),
+        bookFlag: this.state.checked ? 'Y' : 'N',
+        greenFlag: this.state.greenFlag ? 'Y' : 'N',
+        visitFlag: this.state.visitFlag ? 'Y' : 'N',
+        visitedFlag: this.state.visitedFlag ? 'Y' : 'N',
+        bookMethodID: 'Win',
+        regFeeSet: 'N',
         paywStr: paywIDinfo,
+        patSource: '',
       }]
     }
     // 线上门诊挂号
-    let res = await INSUYBUtil.GoTOHISHttp(params, '03040052');
+    let res = await INSUYBUtil.GoTOHISHttp(params, '03040007');
     if (res.errorCode != '0') {
       this.RollBACKOPCharge();
       this.setState({ loading: false });