本文档基于《医疗保障信息平台定点基线版医药机构接口规范 v0.9.9.15》中的1.14.6电子凭证解码接口,结合现有泰和医院业务流程,制定江苏医保电子凭证查询的标准业务流程。
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端HIS系统 │────│ ThCardReader │────│ 江苏医保DLL │
│ │ │ 读卡服务 │ │ HeaSecReadInfo │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────────┐
│ 医保平台服务 │
│ (江苏省) │
└─────────────────┘
http://localhost:8321/api/entry?param=qrcode_[业务代码]
EcQuery(char* pInData, char* pOutData)
// 前端调用示例
const requestUrl = 'http://localhost:8321/api/entry?param=qrcode_01101'
// 其中 01101 为业务类型编码(门诊挂号)
axios.get(requestUrl)
.then(response => {
// 处理返回结果
handleQrCodeResult(response.data)
})
.catch(error => {
// 错误处理
handleError(error)
})
// EntryController.cs 中的处理逻辑
public JObject Get(string param)
{
// 1. 解析参数
string[] temps = param.Split('_');
string type = temps[0]; // qrcode
string businessCode = temps.Length > 1 ? temps[1] : "01101";
// 2. 验证业务代码
if (!IsValidBusinessCode(businessCode)) {
return CreateErrorResponse(1001, "无效的业务代码");
}
// 3. 调用江苏医保电子凭证查询
return ProcessEcQuery(businessCode);
}
private JObject ProcessEcQuery(string businessCode)
{
try
{
// 1. 构建输入参数
var inputData = new
{
data = new
{
orgId = "[医保定点编号]", // 定点编号
businessType = businessCode, // 业务类型
operatorId = "system001", // 操作员编号
operatorName = "系统管理员", // 操作员姓名
officeId = "32760", // 科室编号
officeName = GetDepartmentName(businessCode) // 科室名称
},
transType = "ec.query",
orgId = "[医保定点编号]"
};
// 2. JSON序列化
string jsonInput = JsonConvert.SerializeObject(inputData);
// 3. 调用DLL函数
StringBuilder outputBuffer = new StringBuilder(8192);
int result = EcQuery(jsonInput, outputBuffer);
// 4. 处理返回结果
if (result == 0)
{
return ProcessEcQuerySuccess(outputBuffer.ToString());
}
else
{
return CreateErrorResponse(result, "电子凭证查询失败");
}
}
catch (Exception ex)
{
return CreateErrorResponse(1001, $"电子凭证查询异常: {ex.Message}");
}
}
private JObject ProcessEcQuerySuccess(string jiangsuResponse)
{
try
{
// 1. 解析江苏医保返回数据
var jiangsuData = JsonConvert.DeserializeObject<JObject>(jiangsuResponse);
if ((int)jiangsuData["code"] != 0)
{
return CreateErrorResponse((int)jiangsuData["code"],
jiangsuData["message"]?.ToString() ?? "电子凭证查询失败");
}
// 2. 提取患者信息
var patientData = jiangsuData["data"];
// 3. 转换为泰和医院期望的格式
var taiheData = new
{
idNo = patientData["idNo"]?.ToString() ?? "",
userName = patientData["userName"]?.ToString() ?? "",
idType = patientData["idType"]?.ToString() ?? "",
ecToken = patientData["ecToken"]?.ToString() ?? "",
insuOrg = patientData["insuOrg"]?.ToString() ?? "",
gender = patientData["gender"]?.ToString() ?? "",
birthday = patientData["birthday"]?.ToString() ?? ""
};
// 4. 构建标准返回格式
return new JObject
{
["code"] = 200,
["message"] = "电子凭证查询成功",
["data"] = JsonConvert.SerializeObject(taiheData),
["type"] = "qrcode",
["device"] = "江苏医保电子凭证",
["originalType"] = "jiangsu_ec"
};
}
catch (Exception ex)
{
return CreateErrorResponse(1001, $"数据转换异常: {ex.Message}");
}
}
function handleQrCodeResult(response) {
if (response.code === 200) {
// 成功处理
const patientInfo = JSON.parse(response.data);
// 填充患者信息到表单
fillPatientForm({
idNo: patientInfo.idNo,
userName: patientInfo.userName,
gender: patientInfo.gender,
birthday: patientInfo.birthday,
insuOrg: patientInfo.insuOrg,
ecToken: patientInfo.ecToken // 保存令牌用于后续医保交易
});
// 显示成功提示
showSuccessMessage('电子凭证读取成功');
} else {
// 错误处理
showErrorMessage(response.message || '电子凭证读取失败');
}
}
患者展示电子凭证 → 扫描二维码 → 获取患者信息 →
自动填充挂号单 → 确认信息 → 完成挂号 → 打印凭条
患者展示电子凭证 → 扫描二维码 → 获取医保信息 →
调用医保结算接口 → 使用ecToken进行认证 → 完成结算
患者展示电子凭证 → 扫描二维码 → 获取身份信息 →
创建住院档案 → 绑定电子凭证 → 住院期间免卡使用
患者展示电子凭证 → 扫描二维码 → 验证参保信息 →
药品销售 → 医保结算 → 完成购药
function handleQrCodeError(error) {
const errorMap = {
1001: '系统错误,请联系管理员',
1002: '网络连接失败,请稍后重试',
1003: '电子凭证已过期,请刷新后重试',
1004: '参保地不匹配,请咨询医保办'
};
const errorCode = error.code || 1001;
const errorMessage = errorMap[errorCode] || error.message || '未知错误';
// 显示用户友好的错误提示
ElMessageBox.alert(errorMessage, '电子凭证读取失败', {
type: 'error',
showCancelButton: false
});
}
# Config.ini 配置示例
[MEDICAL_INSURANCE]
ORG_ID=[医保定点编号] # 定点编号
API_NAME=api-powersi-test-pri # CSB API名称
API_VERSION=1.0.0 # API版本
ACCESS_KEY=your_access_key_here
SECRET_KEY=your_secret_key_here
AREA_CODE=320100 # 行政区划代码
[NETWORK]
IP=192.168.100.100 # 服务端IP
PORT=8080 # 服务端端口
TIMEOUT=120 # 超时时间(秒)
[SYSTEM]
LOG_PATH=C:\\NEULOGS\\ # 日志路径
CARD_PASSTYPE=1 # 密码验证方式
<!-- App.config -->
<appSettings>
<add key="JiangSuDllPath" value="HeaSecReadInfo.dll" />
<add key="DefaultOrgId" value="[医保定点编号]" />
<add key="DefaultOperatorId" value="system001" />
<add key="DefaultOfficeId" value="32760" />
<add key="LogLevel" value="Info" />
</appSettings>