本文档详细对比分析项目中现有的长沙医保系统(SSCard.dll)与即将集成的江苏医保系统的差异,为系统集成提供技术参考。
对比项 | 长沙医保 | 江苏医保 |
---|---|---|
主要DLL | SSCard.dll | 预计:JSMedInsurance.dll 或 NationECCode_JS.dll |
辅助DLL | 可能有读卡器驱动 | 预计:多个DLL(加密、网络、读卡器等) |
部署复杂度 | 简单 | 复杂,需要多个文件 |
依赖关系 | 较少 | 复杂的依赖链 |
长沙医保:
[DllImport("SSCard.dll", EntryPoint = "Init", CharSet = CharSet.Ansi)]
private extern static Int32 Init(string pUrl, string pUser);
[DllImport("SSCard.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi)]
private extern static Int32 ReadCardBas(StringBuilder pOutBuff, int nOutBuffLen,
StringBuilder pSignBuff, int nSignBuffLen);
江苏医保(预期):
[DllImport("JSMedInsurance.dll", EntryPoint = "Init", CharSet = CharSet.Ansi)]
private extern static Int32 Init(string pInitInfo, StringBuilder pErrMsg);
[DllImport("JSMedInsurance.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi)]
private extern static Int32 ReadCardBas(StringBuilder pCardInfo, StringBuilder pBusiCardInfo);
[DllImport("JSMedInsurance.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi)]
private extern static Int32 VerifyPIN(StringBuilder pOutBuff);
[DllImport("JSMedInsurance.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi)]
private extern static Int32 ChangePIN(StringBuilder pOutBuff);
[DllImport("JSMedInsurance.dll", EntryPoint = "GetPersonInfo", CharSet = CharSet.Ansi)]
private extern static Int32 GetPersonInfo(string pInData, StringBuilder pOutData);
对比项 | 长沙医保 | 江苏医保 |
---|---|---|
参数数量 | 2个 | 13个 |
参数格式 | 简单字符串 | JSON格式 |
配置复杂度 | 低 | 高 |
网络依赖 | 无 | 需要医保平台连接 |
长沙医保:
public string InitSSCard(string url, string user)
{
int result = Init(url, user);
return result == 0 ? "初始化成功" : "初始化失败";
}
江苏医保(预期):
public string InitJiangSuMedInsurance(JiangSuConfig config)
{
StringBuilder errMsg = new StringBuilder(2048);
string jsonConfig = config.ToJson();
int result = Init(jsonConfig, errMsg);
if (result == 0)
return "初始化成功";
else
return $"初始化失败: {errMsg.ToString()}";
}
对比项 | 长沙医保 | 江苏医保 |
---|---|---|
参数数量 | 4个 | 2个 |
缓冲区管理 | 手动指定长度 | 自动分配 |
输出格式 | 自定义格式 | 标准38号文格式 |
业务卡串 | 简单格式 | Base64加密格式 |
长沙医保数据格式(推测):
自定义格式,具体结构需要查看实际输出
江苏医保数据格式:
标准38号文格式:
639900|111111198101011110|X00000019|639900D15600000500BF7C7A48FB4966|张三|00814E43238697159900BF7C7A|1.00|20101001|20201001|410100813475|终端设备号|
字段说明:
1. 发卡地区行政区划代码(卡识别码前6位)
2. 社会保障号码
3. 卡号
4. 卡识别码
5. 姓名
6. 卡复位信息(仅取历史字节)
7. 规范版本
8. 发卡日期
9. 卡有效期
10. 终端机编号
11. 终端设备号
功能 | 长沙医保 | 江苏医保 | 备注 |
---|---|---|---|
初始化 | ✅ | ✅ | 江苏医保更复杂 |
读社保卡 | ✅ | ✅ | 数据格式不同 |
错误处理 | 基础 | 详细 | 江苏医保提供详细错误信息 |
日志记录 | 不确定 | ✅ | 江苏医保强制要求日志 |
功能 | 长沙医保 | 江苏医保 | 备注 |
---|---|---|---|
PIN码验证 | ❌ | ✅ | 江苏医保支持密码管理 |
PIN码修改 | ❌ | ✅ | 江苏医保支持密码修改 |
读身份证 | ❌ | ✅ | 江苏医保支持身份证读取 |
电子凭证 | ❌ | ✅ | 江苏医保支持电子凭证解码 |
电子社保卡 | ❌ | ✅ | 江苏医保支持电子社保卡 |
四合一介质 | ❌ | ✅ | 江苏医保支持多种介质 |
处方信息 | ❌ | ✅ | 江苏医保支持处方读取 |
日签到 | ❌ | ✅ | 江苏医保需要每日签到 |
长沙医保架构:
前端请求 → EntryController → SsCardBusiness → SSCard.dll → 读卡器硬件
江苏医保架构(预期):
前端请求 → EntryController → JiangSuMedInsuranceBusiness → 主DLL + 辅助DLLs → 读卡器硬件 + 网络服务
长沙医保数据流:
graph LR
A[前端] --> B[EntryController]
B --> C[SsCardBusiness]
C --> D[SSCard.dll]
D --> E[读卡器]
E --> D
D --> C
C --> B
B --> A
江苏医保数据流:
graph LR
A[前端] --> B[EntryController]
B --> C[JiangSuBusiness]
C --> D[主DLL]
D --> E[辅助DLLs]
E --> F[读卡器]
E --> G[网络服务]
F --> E
G --> E
E --> D
D --> C
C --> B
B --> A
保持长沙医保系统不变
新增江苏医保模块
统一入口管理
{
"MedInsuranceConfig": {
"CurrentRegion": "JiangSu", // 或 "ChangSha"
"ChangSha": {
"Url": "http://localhost:8080",
"User": "admin"
},
"JiangSu": {
"IP": "192.168.100.100",
"PORT": 8080,
"TIMEOUT": 120,
"LOG_PATH": "C:\\logs\\jiangsu\\",
"CARD_PASSTYPE": "1",
"EC_URL": "https://fuwu-test.nhsa.gov.cn/localcfc/api/hsecfc/localQrCodeQuery",
"API_NAME": "api-powersi-test-pri",
"API_VERSION": "1.0.0",
"ACCESS_KEY": "your_access_key",
"SECRETKEY": "your_secret_key",
"ORG_ID": "your_org_id",
"AREA_CODE": "320100"
}
}
}
创建统一的读卡结果类:
public class UnifiedCardInfo
{
public string Region { get; set; } // 地区标识
public string Name { get; set; } // 姓名
public string IdNumber { get; set; } // 身份证号
public string SocialSecurityNumber { get; set; } // 社保号
public string CardNumber { get; set; } // 卡号
public string IssueDate { get; set; } // 发卡日期
public string ValidDate { get; set; } // 有效期
public string BusiCardInfo { get; set; } // 业务卡串
public string RawData { get; set; } // 原始数据
// 从长沙医保数据转换
public static UnifiedCardInfo FromChangShaData(string rawData) { }
// 从江苏医保数据转换
public static UnifiedCardInfo FromJiangSuData(string cardInfo, string busiInfo) { }
}
public class MedInsuranceException : Exception
{
public string Region { get; set; }
public int ErrorCode { get; set; }
public string DetailMessage { get; set; }
public MedInsuranceException(string region, int errorCode, string message)
: base($"[{region}] {message}")
{
Region = region;
ErrorCode = errorCode;
DetailMessage = message;
}
}
长沙医保测试
江苏医保测试
路由测试
数据格式测试
风险项 | 概率 | 影响 | 缓解措施 |
---|---|---|---|
DLL名称未知 | 高 | 中 | 提前确认真实DLL文件名 |
函数签名差异 | 中 | 高 | 仔细对照文档实现P/Invoke |
网络连接问题 | 中 | 高 | 实现网络状态检测和重试机制 |
数据格式解析错误 | 低 | 高 | 充分测试各种数据情况 |
风险项 | 概率 | 影响 | 缓解措施 |
---|---|---|---|
现有系统受影响 | 低 | 高 | 严格隔离新旧系统 |
配置错误 | 中 | 中 | 提供配置验证工具 |
证书过期 | 低 | 中 | 实现证书监控机制 |
第一阶段 (1-2周)
第二阶段 (2-3周)
第三阶段 (1-2周)
第四阶段 (1周)