378 lines
8.5 KiB
Markdown
378 lines
8.5 KiB
Markdown
# HospitalPay-Go Socket 服务器接口文档
|
||
|
||
## 1. 概述
|
||
|
||
HospitalPay-Go Socket 服务器是一个基于TCP协议的医院支付系统服务器,提供病人入院、出院、消费记录、余额查询等功能。
|
||
|
||
### 1.1 服务器信息
|
||
- **协议**: TCP Socket
|
||
- **端口**: 配置文件中指定
|
||
- **编码**: UTF-8
|
||
- **数据格式**: JSON
|
||
|
||
### 1.2 消息格式
|
||
|
||
所有请求和响应都遵循以下格式:
|
||
|
||
```
|
||
[长度(4位)][功能码(4位)][医院编码(4位)][时间戳(19位)][JSON数据]
|
||
```
|
||
|
||
- **长度**: 4位数字,表示整个消息的长度
|
||
- **功能码**: 4位数字,标识请求的功能类型
|
||
- **医院编码**: 4位字符,医院标识码
|
||
- **时间戳**: 19位时间戳,格式为 `yyyy-MM-dd HH:mm:ss`
|
||
- **JSON数据**: 具体的请求或响应数据
|
||
|
||
### 1.3 响应格式
|
||
|
||
所有响应都包含以下基础结构:
|
||
|
||
```json
|
||
{
|
||
"ResultCode": "string", // 结果代码
|
||
"ResultData": object, // 响应数据(可选)
|
||
"ResultMsg": "string" // 结果消息(可选)
|
||
}
|
||
```
|
||
|
||
## 2. 错误码说明
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 0000 | 成功 |
|
||
| 0005 | 未找到病人信息 |
|
||
| 0006 | 入院处理失败 |
|
||
| 0007 | 病人已入院 |
|
||
| 0008 | 系统异常 |
|
||
| 0009 | 请求参数错误 |
|
||
| 1001 | 出院处理失败 |
|
||
| 1002 | 消费额度查询失败 |
|
||
| 1003 | 消费记录保存失败 |
|
||
| 1004 | 实时余额查询失败 |
|
||
| 1005 | 发票同步失败 |
|
||
|
||
## 3. 接口详情
|
||
|
||
### 3.1 入院登记
|
||
|
||
**功能码**: `0001`
|
||
|
||
**功能说明**: 病人入院时的登记处理
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"FCode": "string" // 病人编号,必填
|
||
}
|
||
```
|
||
|
||
**响应参数**:
|
||
```json
|
||
{
|
||
"ResultCode": "0000",
|
||
"ResultData": {
|
||
"FCode": "string", // 病人编号
|
||
"FName": "string", // 病人姓名
|
||
"AmountA": 100.00, // A类金额
|
||
"AmountB": 50.00, // B类金额
|
||
"AmountC": 150.00, // C类金额
|
||
"BankAccNo": "string", // 银行账号
|
||
"BankAmount": 1000.00, // 银行余额
|
||
"Fflag": 0, // 状态标志 (0:正常, 1:已入院)
|
||
"Flimitflag": 0, // 限制标志
|
||
"Flimitamt": 0.00 // 限制金额
|
||
}
|
||
}
|
||
```
|
||
|
||
**示例**:
|
||
```
|
||
请求: 0001{"FCode":"3516022343"}
|
||
响应: {"ResultCode":"0000","ResultData":{"FCode":"3516022343","FName":"测试病人","AmountA":100.00,"AmountB":50.00,"AmountC":150.00,"BankAccNo":"6222021234567890","BankAmount":1000.00,"Fflag":0,"Flimitflag":0,"Flimitamt":0}}
|
||
```
|
||
|
||
### 3.2 消费额度查询
|
||
|
||
**功能码**: `0002`
|
||
|
||
**功能说明**: 查询病人当月消费额度信息
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"FCode": "string" // 病人编号,必填
|
||
}
|
||
```
|
||
|
||
**响应参数**:
|
||
```json
|
||
{
|
||
"ResultCode": "0000",
|
||
"ResultData": {
|
||
"AmountA": 50.00, // A类消费金额
|
||
"AmountB": 30.00, // B类消费金额
|
||
"FreeAmountA": 0.00, // A类可用金额
|
||
"FreeAmountB": 0.00, // B类可用金额
|
||
"Checkflag": 0, // 检查标志
|
||
"FCode": "string", // 病人编号
|
||
"FCriminal": "string", // 病人姓名
|
||
"Flag": 0 // 状态标志
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3.3 出院处理
|
||
|
||
**功能码**: `0003`
|
||
|
||
**功能说明**: 病人出院时的处理
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"FCode": "string" // 病人编号,必填
|
||
}
|
||
```
|
||
|
||
**响应参数**:
|
||
```json
|
||
{
|
||
"ResultCode": "0000",
|
||
"ResultMsg": "出院处理成功"
|
||
}
|
||
```
|
||
|
||
### 3.4 消费记录
|
||
|
||
**功能码**: `0004`
|
||
|
||
**功能说明**: 记录病人消费信息
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"FCode": "string", // 病人编号,必填
|
||
"InvoiceNo": "string", // 发票号,必填
|
||
"AmountA": 50.00, // A类金额
|
||
"AmountB": 30.00, // B类金额
|
||
"Amount": 80.00, // 总金额
|
||
"FreeAmountA": 0.00, // A类可用金额
|
||
"FreeAmountB": 0.00, // B类可用金额
|
||
"CrtDate": "2024-01-01T10:00:00Z", // 创建日期
|
||
"FCriminal": "string", // 病人姓名
|
||
"CardCode": "string", // 卡号
|
||
"OrderId": 123456 // 订单ID
|
||
}
|
||
```
|
||
|
||
**响应参数**:
|
||
```json
|
||
{
|
||
"ResultCode": "0000",
|
||
"ResultMsg": "消费记录保存成功"
|
||
}
|
||
```
|
||
|
||
### 3.5 实时余额查询
|
||
|
||
**功能码**: `0005`
|
||
|
||
**功能说明**: 查询病人实时余额信息
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"FCode": "string" // 病人编号,必填
|
||
}
|
||
```
|
||
|
||
**响应参数**: 与入院登记响应格式相同
|
||
|
||
### 3.6 发票同步
|
||
|
||
**功能码**: `0006`
|
||
|
||
**功能说明**: 同步发票信息到系统
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"InvoiceList": [
|
||
"INV001",
|
||
"INV002",
|
||
"INV003"
|
||
]
|
||
}
|
||
```
|
||
|
||
**响应参数**:
|
||
```json
|
||
{
|
||
"ResultCode": "0000",
|
||
"ResultData": [
|
||
{
|
||
"BankFlag": 2, // 银行标志
|
||
"CAmount": 100.00, // 金额
|
||
"FCode": "3516022343", // 病人编号
|
||
"Origid": "INV001", // 原始发票号
|
||
"SendDate": "2024-01-01T10:00:00Z" // 发送日期
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 4. 连接管理
|
||
|
||
### 4.1 连接限制
|
||
- 最大并发连接数:配置文件中指定
|
||
- 连接超时时间:配置文件中指定
|
||
- 读取超时时间:配置文件中指定
|
||
- 写入超时时间:配置文件中指定
|
||
|
||
### 4.2 连接流程
|
||
1. 客户端建立TCP连接
|
||
2. 发送请求消息(按照消息格式)
|
||
3. 服务器验证医院编码
|
||
4. 处理业务逻辑
|
||
5. 返回响应消息
|
||
6. 关闭连接
|
||
|
||
## 5. 安全说明
|
||
|
||
### 5.1 医院编码验证
|
||
所有请求必须包含正确的医院编码,否则返回"无效的医院编码"错误。
|
||
|
||
### 5.2 超时控制
|
||
- 连接建立后有读取超时限制
|
||
- 响应发送有写入超时限制
|
||
- 业务处理有上下文超时控制(10秒)
|
||
|
||
## 6. 监控指标
|
||
|
||
系统提供以下监控指标:
|
||
- 活跃连接数
|
||
- 请求计数(按功能码分类)
|
||
- 请求处理时间(按功能码分类)
|
||
- 错误计数(按功能码和错误码分类)
|
||
|
||
## 7. 示例代码
|
||
|
||
### 7.1 Go 客户端示例
|
||
|
||
```go
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"net"
|
||
"time"
|
||
)
|
||
|
||
func main() {
|
||
conn, err := net.Dial("tcp", "localhost:8080")
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
defer conn.Close()
|
||
|
||
// 构造请求消息
|
||
functionCode := "0001"
|
||
hospitalCode := "H001"
|
||
timestamp := time.Now().Format("2006-01-02 15:04:05")
|
||
data := `{"FCode":"3516022343"}`
|
||
|
||
message := fmt.Sprintf("%s%s%s%s", functionCode, hospitalCode, timestamp, data)
|
||
fullMessage := fmt.Sprintf("%04d%s", len(message), message)
|
||
|
||
// 发送请求
|
||
_, err = conn.Write([]byte(fullMessage))
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
// 读取响应
|
||
buffer := make([]byte, 4096)
|
||
n, err := conn.Read(buffer)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
response := string(buffer[:n])
|
||
fmt.Printf("Response: %s\n", response)
|
||
}
|
||
```
|
||
|
||
### 7.2 Python 客户端示例
|
||
|
||
```python
|
||
import socket
|
||
import json
|
||
import time
|
||
|
||
def send_request(host, port, function_code, hospital_code, data):
|
||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
try:
|
||
sock.connect((host, port))
|
||
|
||
# 构造消息
|
||
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
|
||
json_data = json.dumps(data)
|
||
message = f"{function_code}{hospital_code}{timestamp}{json_data}"
|
||
full_message = f"{len(message):04d}{message}"
|
||
|
||
# 发送请求
|
||
sock.send(full_message.encode('utf-8'))
|
||
|
||
# 接收响应
|
||
response = sock.recv(4096).decode('utf-8')
|
||
|
||
# 解析响应
|
||
length = int(response[:4])
|
||
json_response = response[4:4+length]
|
||
|
||
return json.loads(json_response)
|
||
|
||
finally:
|
||
sock.close()
|
||
|
||
# 使用示例
|
||
if __name__ == "__main__":
|
||
result = send_request(
|
||
"localhost", 8080,
|
||
"0001", "H001",
|
||
{"FCode": "3516022343"}
|
||
)
|
||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||
```
|
||
|
||
## 8. 常见问题
|
||
|
||
### 8.1 连接被拒绝
|
||
- 检查服务器是否启动
|
||
- 检查端口是否正确
|
||
- 检查是否达到最大连接数限制
|
||
|
||
### 8.2 医院编码错误
|
||
- 确认医院编码配置正确
|
||
- 检查请求消息格式是否正确
|
||
|
||
### 8.3 请求超时
|
||
- 检查网络连接
|
||
- 确认服务器负载情况
|
||
- 检查请求数据格式是否正确
|
||
|
||
### 8.4 数据格式错误
|
||
- 确认JSON格式正确
|
||
- 检查必填字段是否完整
|
||
- 验证数据类型是否匹配
|
||
|
||
## 9. 版本历史
|
||
|
||
| 版本 | 日期 | 说明 |
|
||
|------|------|------|
|
||
| 1.0.0 | 2024-01-01 | 初始版本,支持基础的6个功能接口 |
|
||
|
||
## 10. 联系方式
|
||
|
||
如有问题请联系开发团队。 |