using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Web.Http;
namespace ThCardReader
{
///
/// 华视电子读卡器专用API控制器
/// 独立于现有的EntryController,不影响原有医保业务
///
public class HuaShiController : ApiController
{
///
/// 初始化华视读卡器
///
/// 端口号:1-16为串口,1001-1016为USB口
/// 初始化结果
[HttpPost]
[Route("readcard/huashi/init")]
public IHttpActionResult InitHuaShiReader([FromBody] dynamic request)
{
try
{
int port = 1001; // 默认USB端口1
if (request != null && request.port != null)
{
port = (int)request.port;
}
var result = HuaShiIdCardBusiness.Initialize(port);
if ((int)result["code"] == 200)
{
return Ok(result);
}
else
{
return BadRequest(result.ToString());
}
}
catch (Exception ex)
{
var errorResult = new JObject
{
["code"] = 1001,
["message"] = $"华视读卡器初始化异常: {ex.Message}",
["device"] = "华视电子身份证读卡器"
};
return BadRequest(errorResult.ToString());
}
}
///
/// 读取身份证信息
///
/// 身份证信息
[HttpPost]
[Route("readcard/huashi/readcard")]
public IHttpActionResult ReadIdCard([FromBody] dynamic request)
{
try
{
string savePath = "";
bool autoClose = false;
if (request != null)
{
if (request.savePath != null)
{
savePath = (string)request.savePath;
}
if (request.autoClose != null)
{
autoClose = (bool)request.autoClose;
}
}
var result = HuaShiIdCardBusiness.ReadIdCard(savePath, autoClose);
if ((int)result["code"] == 200)
{
return Ok(result);
}
else
{
return BadRequest(result.ToString());
}
}
catch (Exception ex)
{
var errorResult = new JObject
{
["code"] = 1001,
["message"] = $"华视读卡器读卡异常: {ex.Message}",
["device"] = "华视电子身份证读卡器"
};
return BadRequest(errorResult.ToString());
}
}
///
/// 连续读卡模式
///
/// 身份证信息
[HttpPost]
[Route("readcard/huashi/readcard/continuous")]
public IHttpActionResult ReadIdCardContinuous([FromBody] dynamic request)
{
try
{
string savePath = "";
bool autoClose = false;
if (request != null)
{
if (request.savePath != null)
{
savePath = (string)request.savePath;
}
if (request.autoClose != null)
{
autoClose = (bool)request.autoClose;
}
}
var result = HuaShiIdCardBusiness.ReadIdCardContinuous(savePath, autoClose);
if ((int)result["code"] == 200)
{
return Ok(result);
}
else
{
return BadRequest(result.ToString());
}
}
catch (Exception ex)
{
var errorResult = new JObject
{
["code"] = 1001,
["message"] = $"华视连续读卡异常: {ex.Message}",
["device"] = "华视电子身份证读卡器"
};
return BadRequest(errorResult.ToString());
}
}
///
/// 获取设备状态
///
/// 设备状态信息
[HttpGet]
[Route("readcard/huashi/status")]
public IHttpActionResult GetDeviceStatus()
{
try
{
var result = HuaShiIdCardBusiness.GetDeviceStatus();
if ((int)result["code"] == 200)
{
return Ok(result);
}
else
{
return BadRequest(result.ToString());
}
}
catch (Exception ex)
{
var errorResult = new JObject
{
["code"] = 1001,
["message"] = $"获取华视设备状态异常: {ex.Message}",
["device"] = "华视电子身份证读卡器"
};
return BadRequest(errorResult.ToString());
}
}
///
/// 关闭华视读卡器连接
///
/// 关闭结果
[HttpPost]
[Route("readcard/huashi/close")]
public IHttpActionResult CloseReader()
{
try
{
var result = HuaShiIdCardBusiness.Close();
return Ok(result);
}
catch (Exception ex)
{
var errorResult = new JObject
{
["code"] = 1001,
["message"] = $"关闭华视读卡器异常: {ex.Message}",
["device"] = "华视电子身份证读卡器"
};
return BadRequest(errorResult.ToString());
}
}
///
/// 获取华视API文档
///
/// API文档信息
[HttpGet]
[Route("readcard/huashi/help")]
public IHttpActionResult GetApiHelp()
{
var help = new JObject
{
["device"] = "华视电子身份证读卡器",
["version"] = "V3.3.0.7",
["manufacturer"] = "深圳华视电子读写设备有限公司",
["apis"] = new JArray
{
new JObject
{
["method"] = "POST",
["url"] = "/readcard/huashi/init",
["description"] = "初始化华视读卡器",
["parameters"] = new JObject
{
["port"] = "端口号:1-16为串口COM1-COM16,1001-1016为USB口1-16"
},
["example"] = new JObject
{
["port"] = 1001
}
},
new JObject
{
["method"] = "POST",
["url"] = "/readcard/huashi/readcard",
["description"] = "读取身份证信息",
["parameters"] = new JObject
{
["savePath"] = "照片保存路径(可选)",
["autoClose"] = "读卡后是否自动关闭连接(可选,默认false,URL调用建议true)"
},
["example"] = new JObject
{
["savePath"] = "C:/photos",
["autoClose"] = true
}
},
new JObject
{
["method"] = "POST",
["url"] = "/readcard/huashi/readcard/continuous",
["description"] = "连续读卡模式(不需要重新放置卡片)",
["parameters"] = new JObject
{
["savePath"] = "照片保存路径(可选)",
["autoClose"] = "读卡后是否自动关闭连接(可选,默认false,URL调用建议true)"
}
},
new JObject
{
["method"] = "GET",
["url"] = "/readcard/huashi/status",
["description"] = "获取设备状态"
},
new JObject
{
["method"] = "POST",
["url"] = "/readcard/huashi/close",
["description"] = "关闭读卡器连接"
}
},
["supportedCards"] = new JArray
{
"居民身份证",
"外国人永久居留证",
"港澳台居民居住证",
"新版外国人居留证"
},
["returnFields"] = new JObject
{
["name"] = "姓名",
["sex"] = "性别",
["nation"] = "民族",
["birthday"] = "出生日期",
["idCode"] = "身份证号",
["address"] = "地址",
["department"] = "签发机关",
["startDate"] = "有效开始日期",
["endDate"] = "有效截止日期",
["sexCode"] = "性别代码",
["nationCode"] = "民族代码",
["certType"] = "证件类别"
},
["notes"] = new JArray
{
"华视读卡器独立于医保业务,不影响SSCard.dll和NationECCode.dll的使用",
"支持自动初始化:首次调用readcard/continuous/status时会自动初始化设备",
"支持异常自愈:设备异常时会自动重置,下次调用时重新初始化",
"手动初始化:可选择手动调用init接口指定特定端口",
"需要部署termb.dll、sdtapi.dll、WltRs.dll、SysInfo.dll四个DLL文件",
"卡认证循环间隔建议大于300ms",
"查询卡片放置状态间隔建议大于600ms",
"连续读卡模式可避免频繁拿起放下卡片",
"现在使用起来和SSCard.dll一样简单:直接调用readcard即可"
}
};
return Ok(help);
}
///
/// 健康检查
///
/// 服务健康状态
[HttpGet]
[Route("readcard/huashi/health")]
public IHttpActionResult HealthCheck()
{
var health = new JObject
{
["service"] = "华视电子读卡器API",
["status"] = "运行中",
["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
["version"] = "1.0.0"
};
return Ok(health);
}
///
/// GET方式的简单调用接口(兼容现有URL调用模式)
///
/// 操作类型:init、readcard、continuous、status、close
/// 端口号(仅用于init操作)
/// 操作结果
[HttpGet]
[Route("readcard/huashi/simple")]
public IHttpActionResult SimpleCall(string action = "readcard", int port = 1001)
{
try
{
JObject result;
switch (action?.ToLower())
{
case "init":
result = HuaShiIdCardBusiness.Initialize(port);
break;
case "readcard":
result = HuaShiIdCardBusiness.ReadIdCard("", true);
break;
case "continuous":
// SimpleCall也是URL调用,应该启用自动关闭
result = HuaShiIdCardBusiness.ReadIdCardContinuous("", true);
break;
case "status":
result = HuaShiIdCardBusiness.GetDeviceStatus();
break;
case "close":
result = HuaShiIdCardBusiness.Close();
break;
default:
result = new JObject
{
["code"] = 1001,
["message"] = $"不支持的操作:{action},支持的操作:init、readcard、continuous、status、close",
["device"] = "华视电子身份证读卡器"
};
break;
}
if ((int)result["code"] == 200)
{
return Ok(result);
}
else
{
return BadRequest(result.ToString());
}
}
catch (Exception ex)
{
var errorResult = new JObject
{
["code"] = 1001,
["message"] = $"华视读卡器操作异常: {ex.Message}",
["device"] = "华视电子身份证读卡器"
};
return BadRequest(errorResult.ToString());
}
}
}
}