167 lines
4.9 KiB
Markdown
167 lines
4.9 KiB
Markdown
# HospitalPay-Go Socket 接口快速参考
|
|
|
|
## 消息格式
|
|
```
|
|
[长度(4位)][功能码(4位)][医院编码(4位)][时间戳(19位)][JSON数据]
|
|
```
|
|
|
|
## 功能码列表
|
|
|
|
| 功能码 | 功能名称 | 请求参数 | 响应数据 |
|
|
|--------|----------|----------|----------|
|
|
| 0001 | 入院登记 | `{"FCode":"string"}` | CriminalInfo |
|
|
| 0002 | 消费额度查询 | `{"FCode":"string"}` | ConsumeQuota |
|
|
| 0003 | 出院处理 | `{"FCode":"string"}` | 成功消息 |
|
|
| 0004 | 消费记录 | ConsumeRecord | 成功消息 |
|
|
| 0005 | 实时余额查询 | `{"FCode":"string"}` | CriminalInfo |
|
|
| 0006 | 发票同步 | `{"InvoiceList":["string"]}` | InvoiceSyncResult[] |
|
|
|
|
## 错误码
|
|
|
|
| 错误码 | 说明 |
|
|
|--------|------|
|
|
| 0000 | 成功 |
|
|
| 0005 | 未找到病人信息 |
|
|
| 0006 | 入院处理失败 |
|
|
| 0007 | 病人已入院 |
|
|
| 0008 | 系统异常 |
|
|
| 0009 | 请求参数错误 |
|
|
|
|
## 数据结构
|
|
|
|
### CriminalInfo (病人信息)
|
|
```json
|
|
{
|
|
"FCode": "string", // 病人编号
|
|
"FName": "string", // 病人姓名
|
|
"AmountA": 100.00, // A类金额
|
|
"AmountB": 50.00, // B类金额
|
|
"AmountC": 150.00, // C类金额
|
|
"BankAccNo": "string", // 银行账号
|
|
"BankAmount": 1000.00, // 银行余额
|
|
"Fflag": 0, // 状态标志
|
|
"Flimitflag": 0, // 限制标志
|
|
"Flimitamt": 0.00 // 限制金额
|
|
}
|
|
```
|
|
|
|
### ConsumeQuota (消费额度)
|
|
```json
|
|
{
|
|
"AmountA": 50.00, // A类消费金额
|
|
"AmountB": 30.00, // B类消费金额
|
|
"FreeAmountA": 0.00, // A类可用金额
|
|
"FreeAmountB": 0.00, // B类可用金额
|
|
"Checkflag": 0, // 检查标志
|
|
"FCode": "string", // 病人编号
|
|
"FCriminal": "string", // 病人姓名
|
|
"Flag": 0 // 状态标志
|
|
}
|
|
```
|
|
|
|
### ConsumeRecord (消费记录)
|
|
```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
|
|
}
|
|
```
|
|
|
|
### InvoiceSyncResult (发票同步结果)
|
|
```json
|
|
{
|
|
"BankFlag": 2, // 银行标志
|
|
"CAmount": 100.00, // 金额
|
|
"FCode": "3516022343", // 病人编号
|
|
"Origid": "INV001", // 原始发票号
|
|
"SendDate": "2024-01-01T10:00:00Z" // 发送日期
|
|
}
|
|
```
|
|
|
|
## 快速示例
|
|
|
|
### 入院登记
|
|
```
|
|
请求: 00540001H0012024-01-15 10:30:00{"FCode":"3516022343"}
|
|
响应: {"ResultCode":"0000","ResultData":{...}}
|
|
```
|
|
|
|
### 消费记录
|
|
```
|
|
请求: 01840004H0012024-01-15 10:30:00{"FCode":"3516022343","InvoiceNo":"INV001","AmountA":50.00,"AmountB":30.00,"Amount":80.00,"FreeAmountA":0.00,"FreeAmountB":0.00,"CrtDate":"2024-01-15T10:30:00Z","FCriminal":"测试病人","CardCode":"CARD001","OrderId":123456}
|
|
响应: {"ResultCode":"0000","ResultMsg":"消费记录保存成功"}
|
|
```
|
|
|
|
### 发票同步
|
|
```
|
|
请求: 00800006H0012024-01-15 10:30:00{"InvoiceList":["INV001","INV002"]}
|
|
响应: {"ResultCode":"0000","ResultData":[...]}
|
|
```
|
|
|
|
## 客户端代码模板
|
|
|
|
### Go 客户端
|
|
```go
|
|
func sendRequest(functionCode, hospitalCode, data string) (string, error) {
|
|
conn, err := net.Dial("tcp", "localhost:8080")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer conn.Close()
|
|
|
|
timestamp := time.Now().Format("2006-01-02 15:04:05")
|
|
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 {
|
|
return "", err
|
|
}
|
|
|
|
buffer := make([]byte, 4096)
|
|
n, err := conn.Read(buffer)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return string(buffer[:n]), nil
|
|
}
|
|
```
|
|
|
|
### Python 客户端
|
|
```python
|
|
def send_request(function_code, hospital_code, data):
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
try:
|
|
sock.connect(('localhost', 8080))
|
|
|
|
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()
|
|
```
|
|
|
|
## 常见问题
|
|
|
|
1. **连接被拒绝**: 检查服务器状态和端口
|
|
2. **医院编码错误**: 确认配置文件中的医院编码
|
|
3. **消息格式错误**: 检查长度计算和JSON格式
|
|
4. **超时**: 检查网络连接和服务器负载 |