# 业务代码URL处理修复说明
## 📋 问题分析
### 原始问题
在EntryController.cs中,当URL格式为 `huashi_01101` 或 `jiangsu_01101` 时,代码会将业务代码(如`01101`)误认为是操作动作(action),导致以下错误:
```
华视读卡器操作【01101】错误!允许的操作为【init、readcard、continuous、status、close】
江苏医保操作【01101】错误!允许的操作为【init、readcard、readcard_pin、verifypin、changepin、status、reset、getpersoninfo、checkdll】
```
### 根本原因
```csharp
// 问题代码逻辑
string[] temps = param.Split(new char[] { '_' });
string type = temps[0];
string action = temps.Length > 1 ? temps[1] : "readcard";
// 当param="huashi_01101"时:
// type = "huashi"
// action = "01101" ← 这里把业务代码当作了操作动作
```
### URL调用模式分析
| URL格式 | 期望行为 | 实际行为 | 问题 |
|---------|----------|----------|------|
| `huashi_readcard` | ✅ 读取身份证 | ✅ 正常工作 | 无 |
| `huashi_01101` | ✅ 读取身份证(忽略业务代码) | ❌ 报错"操作01101错误" | **需要修复** |
| `jiangsu_readcard` | ✅ 读取社保卡 | ✅ 正常工作 | 无 |
| `jiangsu_01101` | ✅ 读取社保卡(忽略业务代码) | ❌ 报错"操作01101错误" | **需要修复** |
| `qrcode_01101` | ✅ 电子凭证+业务代码 | ✅ 正常工作 | 无 |
| `sicard` | ✅ 读取社保卡 | ✅ 正常工作 | 无 |
## 🔧 修复方案
### 1. 添加业务代码检测方法
```csharp
///
/// 判断字符串是否是业务代码格式(5位数字)
///
/// 要检查的字符串
/// 是否是业务代码
private bool IsBusinessCode(string code)
{
if (string.IsNullOrEmpty(code) || code.Length != 5)
{
return false;
}
// 检查是否是5位数字
foreach (char c in code)
{
if (!char.IsDigit(c))
{
return false;
}
}
return true;
}
```
### 2. 修改华视读卡器处理逻辑
```csharp
else if (type.Equals("huashi"))
{
// 华视读卡器调用
string action = temps.Length > 1 ? temps[1] : "readcard";
// 检查是否是业务代码格式(5位数字),如果是则默认为readcard操作
if (temps.Length > 1 && IsBusinessCode(temps[1]))
{
action = "readcard"; // 业务代码不影响华视读卡器操作,默认读卡
}
// ... 其余逻辑保持不变
}
```
### 3. 修改江苏医保处理逻辑
```csharp
else if (type.Equals("jiangsu"))
{
// 江苏医保社保卡读取
string action = temps.Length > 1 ? temps[1] : "readcard";
// 检查是否是业务代码格式(5位数字),如果是则默认为readcard操作
if (temps.Length > 1 && IsBusinessCode(temps[1]))
{
action = "readcard"; // 业务代码不影响江苏医保读卡操作,默认读卡
}
// ... 其余逻辑保持不变
}
```
## ✅ 修复效果
### 修复前 vs 修复后
| URL | 修复前 | 修复后 |
|-----|--------|--------|
| `huashi_01101` | ❌ 报错"操作01101错误" | ✅ 等效于 `huashi_readcard` |
| `huashi_01201` | ❌ 报错"操作01201错误" | ✅ 等效于 `huashi_readcard` |
| `jiangsu_01101` | ❌ 报错"操作01101错误" | ✅ 等效于 `jiangsu_readcard` |
| `jiangsu_01201` | ❌ 报错"操作01201错误" | ✅ 等效于 `jiangsu_readcard` |
### 业务代码识别规则
| 输入 | 是否业务代码 | 处理方式 |
|------|-------------|----------|
| `01101` | ✅ 是(5位数字) | 转为默认操作 `readcard` |
| `01201` | ✅ 是(5位数字) | 转为默认操作 `readcard` |
| `readcard` | ❌ 否(非5位数字) | 作为操作动作处理 |
| `init` | ❌ 否(非5位数字) | 作为操作动作处理 |
| `12345a` | ❌ 否(包含字母) | 作为操作动作处理(会报错) |
| `123456` | ❌ 否(6位数字) | 作为操作动作处理(会报错) |
## 🛡️ 向后兼容性
### ✅ 保持正常的调用方式
- `huashi_readcard` → 继续正常工作
- `huashi_init_1001` → 继续正常工作
- `jiangsu_readcard` → 继续正常工作
- `jiangsu_status` → 继续正常工作
### ✅ 保持其他功能不受影响
- `sicard` → 继续正常工作
- `idcard` → 继续正常工作
- `qrcode_01101` → 继续正常工作(电子凭证正确传递业务代码)
- `idcard2_01101` → 继续正常工作
### ✅ 错误处理仍然有效
- `huashi_invalid` → 继续报错(友好的错误信息)
- `jiangsu_invalid` → 继续报错(友好的错误信息)
## 🧪 测试验证
### 测试页面
创建了 `test_businesscode_fix.html` 测试页面,包含:
1. **正常功能测试**:验证现有功能没有被破坏
2. **修复功能测试**:验证业务代码URL现在可以正常工作
3. **错误处理测试**:验证无效操作仍然报错
4. **其他功能测试**:验证不相关的功能保持正常
### 测试用例
```javascript
// 1. 华视读卡器
testUrl('huashi_readcard'); // ✅ 应该成功
testUrl('huashi_01101'); // ✅ 应该成功(修复的)
testUrl('huashi_invalid'); // ❌ 应该报错
// 2. 江苏医保
testUrl('jiangsu_readcard'); // ✅ 应该成功
testUrl('jiangsu_01101'); // ✅ 应该成功(修复的)
testUrl('jiangsu_invalid'); // ❌ 应该报错
// 3. 其他功能
testUrl('sicard'); // ✅ 应该成功
testUrl('qrcode_01101'); // ✅ 应该成功
```
## 📊 技术细节
### 修改的文件
- `ThCardReader/EntryController.cs`
### 新增的方法
- `IsBusinessCode(string code)` - 检测5位数字业务代码
### 修改的逻辑
- 华视读卡器URL处理逻辑
- 江苏医保URL处理逻辑
### 代码行数变化
- 新增约 20 行代码
- 主要是业务代码检测逻辑
## 🎯 业务价值
### 解决的问题
1. **API兼容性**:支持标准的 `{type}_{bizcode}` URL格式
2. **用户体验**:减少因URL格式导致的错误
3. **前端集成**:简化前端调用逻辑,不需要区分不同类型的URL格式
### 带来的好处
1. **统一的URL格式**:所有读卡功能都支持 `{type}_{bizcode}` 格式
2. **更好的容错性**:业务代码参数不会导致系统报错
3. **向后兼容**:不影响现有的任何功能
4. **代码健壮性**:增强了系统的稳定性
## 🔍 使用示例
### 前端JavaScript调用
```javascript
// 现在这些调用都能正常工作:
// 华视读卡器
fetch('http://localhost:8321/readcard/entry?param=huashi_readcard')
fetch('http://localhost:8321/readcard/entry?param=huashi_01101') // ← 修复的
fetch('http://localhost:8321/readcard/entry?param=huashi_01201') // ← 修复的
// 江苏医保
fetch('http://localhost:8321/readcard/entry?param=jiangsu_readcard')
fetch('http://localhost:8321/readcard/entry?param=jiangsu_01101') // ← 修复的
fetch('http://localhost:8321/readcard/entry?param=jiangsu_01201') // ← 修复的
// 电子凭证(业务代码正确传递,保持不变)
fetch('http://localhost:8321/readcard/entry?param=qrcode_01101')
```
### C# 调用示例
```csharp
// 这些调用现在都能正常工作
var result1 = await CallApi("huashi_readcard");
var result2 = await CallApi("huashi_01101"); // ← 修复的,等效于上面
var result3 = await CallApi("jiangsu_01101"); // ← 修复的
```
---
**总结**:本次修复通过智能识别5位数字业务代码,使华视读卡器和江苏医保功能能够正确处理标准的URL格式,提高了系统的兼容性和用户体验,同时保持了完全的向后兼容性。