长沙vs江苏医保系统对比分析.md 9.5 KB

长沙医保 vs 江苏医保系统对比分析

概述

本文档详细对比分析项目中现有的长沙医保系统(SSCard.dll)与即将集成的江苏医保系统的差异,为系统集成提供技术参考。

1. 动态库对比

1.1 文件结构

对比项 长沙医保 江苏医保
主要DLL SSCard.dll 预计:JSMedInsurance.dll 或 NationECCode_JS.dll
辅助DLL 可能有读卡器驱动 预计:多个DLL(加密、网络、读卡器等)
部署复杂度 简单 复杂,需要多个文件
依赖关系 较少 复杂的依赖链

1.2 P/Invoke声明对比

长沙医保:

[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. 初始化对比

2.1 参数复杂度

对比项 长沙医保 江苏医保
参数数量 2个 13个
参数格式 简单字符串 JSON格式
配置复杂度
网络依赖 需要医保平台连接

2.2 初始化代码对比

长沙医保:

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()}";
}

3. 读卡功能对比

3.1 函数签名差异

对比项 长沙医保 江苏医保
参数数量 4个 2个
缓冲区管理 手动指定长度 自动分配
输出格式 自定义格式 标准38号文格式
业务卡串 简单格式 Base64加密格式

3.2 数据格式对比

长沙医保数据格式(推测):

自定义格式,具体结构需要查看实际输出

江苏医保数据格式:

标准38号文格式:
639900|111111198101011110|X00000019|639900D15600000500BF7C7A48FB4966|张三|00814E43238697159900BF7C7A|1.00|20101001|20201001|410100813475|终端设备号|

字段说明:
1. 发卡地区行政区划代码(卡识别码前6位)
2. 社会保障号码
3. 卡号
4. 卡识别码
5. 姓名
6. 卡复位信息(仅取历史字节)
7. 规范版本
8. 发卡日期
9. 卡有效期
10. 终端机编号
11. 终端设备号

4. 功能特性对比

4.1 基础功能

功能 长沙医保 江苏医保 备注
初始化 江苏医保更复杂
读社保卡 数据格式不同
错误处理 基础 详细 江苏医保提供详细错误信息
日志记录 不确定 江苏医保强制要求日志

4.2 扩展功能

功能 长沙医保 江苏医保 备注
PIN码验证 江苏医保支持密码管理
PIN码修改 江苏医保支持密码修改
读身份证 江苏医保支持身份证读取
电子凭证 江苏医保支持电子凭证解码
电子社保卡 江苏医保支持电子社保卡
四合一介质 江苏医保支持多种介质
处方信息 江苏医保支持处方读取
日签到 江苏医保需要每日签到

5. 技术架构对比

5.1 系统架构

长沙医保架构:

前端请求 → EntryController → SsCardBusiness → SSCard.dll → 读卡器硬件

江苏医保架构(预期):

前端请求 → EntryController → JiangSuMedInsuranceBusiness → 主DLL + 辅助DLLs → 读卡器硬件 + 网络服务

5.2 数据流对比

长沙医保数据流:

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

6. 集成实施建议

6.1 并行开发策略

  1. 保持长沙医保系统不变

    • 现有SSCard.dll功能继续工作
    • 不影响现有业务流程
  2. 新增江苏医保模块

    • 创建独立的JiangSuMedInsuranceBusiness类
    • 实现江苏医保专用的读卡逻辑
  3. 统一入口管理

    • 在EntryController中添加地区识别
    • 根据配置路由到不同的医保系统

6.2 配置管理

{
  "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"
    }
  }
}

6.3 数据格式统一

创建统一的读卡结果类:

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) { }
}

6.4 错误处理统一

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;
    }
}

7. 测试策略

7.1 单元测试

  1. 长沙医保测试

    • 确保现有功能不受影响
    • 验证数据格式转换正确性
  2. 江苏医保测试

    • 初始化功能测试
    • 读卡功能测试
    • PIN码管理测试
    • 错误处理测试

7.2 集成测试

  1. 路由测试

    • 验证根据配置正确路由到对应系统
    • 测试配置切换功能
  2. 数据格式测试

    • 验证统一数据格式转换
    • 测试前端兼容性

8. 风险评估

8.1 技术风险

风险项 概率 影响 缓解措施
DLL名称未知 提前确认真实DLL文件名
函数签名差异 仔细对照文档实现P/Invoke
网络连接问题 实现网络状态检测和重试机制
数据格式解析错误 充分测试各种数据情况

8.2 业务风险

风险项 概率 影响 缓解措施
现有系统受影响 严格隔离新旧系统
配置错误 提供配置验证工具
证书过期 实现证书监控机制

9. 实施时间线

  1. 第一阶段 (1-2周)

    • 确认江苏医保DLL文件和接口
    • 创建基础的JiangSuMedInsuranceBusiness类
    • 实现初始化和基础读卡功能
  2. 第二阶段 (2-3周)

    • 实现PIN码管理功能
    • 实现四合一介质支持
    • 创建统一数据格式转换
  3. 第三阶段 (1-2周)

    • 集成到EntryController
    • 完善错误处理和日志
    • 全面测试和优化
  4. 第四阶段 (1周)

    • 部署测试
    • 文档完善
    • 培训和交付