LIJU 3 viikkoa sitten
vanhempi
commit
54ad62c334
2 muutettua tiedostoa jossa 1571 lisäystä ja 11 poistoa
  1. 45 11
      ThCardReader/JiangSuWorkInjuryBusiness.cs
  2. 1526 0
      江苏工伤联网接口参数说明.md

+ 45 - 11
ThCardReader/JiangSuWorkInjuryBusiness.cs

@@ -466,21 +466,55 @@ namespace ThCardReader
                     }
                 }
                 
-                // 3. 检查签到状态(除签到交易外)
-                if (transactionCode != "9001" && string.IsNullOrEmpty(currentSignNo))
+                // // 3. 检查签到状态(除签到交易外)
+                // if (transactionCode != "9001" && string.IsNullOrEmpty(currentSignNo))
+                // {
+                //     var signInResult = ProcessWorkInjuryTransaction("SignIn");
+                //     if (!(bool)signInResult["success"])
+                //     {
+                //         result["success"] = false;
+                //         result["code"] = 1004;
+                //         result["message"] = "自动签到失败,无法进行业务交易";
+                //         result["device"] = "江苏工伤联网接口";
+                //         result["signInError"] = signInResult["message"];
+                //         return result;
+                //     }
+                // }
+                // === 自动签到功能(只在业务类交易且未带sign_no时自动签到) ===
+                if (transactionCode != "9001" && transactionCode != "9002")
                 {
-                    var signInResult = ProcessWorkInjuryTransaction("SignIn");
-                    if (!(bool)signInResult["success"])
+                    string signNoFromParams = null;
+                    if (businessParams is JObject bpObj && bpObj["sign_no"] != null)
+                        signNoFromParams = bpObj["sign_no"].ToString();
+                    else if (businessParams != null)
                     {
-                        result["success"] = false;
-                        result["code"] = 1004;
-                        result["message"] = "自动签到失败,无法进行业务交易";
-                        result["device"] = "江苏工伤联网接口";
-                        result["signInError"] = signInResult["message"];
-                        return result;
+                        var prop = businessParams.GetType().GetProperty("sign_no");
+                        if (prop != null)
+                            signNoFromParams = prop.GetValue(businessParams)?.ToString();
+                    }
+                    if (string.IsNullOrEmpty(signNoFromParams))
+                    {
+                        var signInResult = ProcessWorkInjuryTransaction("SignIn");
+                        if (!(bool)signInResult["success"])
+                        {
+                            result["success"] = false;
+                            result["code"] = 1004;
+                            result["message"] = "自动签到失败,无法进行业务交易";
+                            result["device"] = "江苏工伤联网接口";
+                            result["signInError"] = signInResult["message"];
+                            return result;
+                        }
+                        string newSignNo = signInResult["data"]?["sign_no"]?.ToString() ?? "";
+                        if (businessParams is JObject bpObj2)
+                            bpObj2["sign_no"] = newSignNo;
+                        else if (businessParams != null)
+                        {
+                            var prop = businessParams.GetType().GetProperty("sign_no");
+                            if (prop != null && prop.CanWrite)
+                                prop.SetValue(businessParams, newSignNo);
+                        }
                     }
                 }
-                
                 // 4. 构造标准输入参数
                 inputData = BuildTransactionInput(transactionCode, businessParams, identifyMode, qrCodeInfo, operatorId, operatorName);
                 string inputJson = JsonConvert.SerializeObject(inputData, Formatting.None);

+ 1526 - 0
江苏工伤联网接口参数说明.md

@@ -0,0 +1,1526 @@
+# 江苏工伤联网接口参数说明
+
+---
+
+## 1. 交易代码与业务名称一览
+
+| 交易英文名              | 交易代码 | 业务含义             |
+|------------------------|----------|----------------------|
+| SignIn                 | 9001     | 签到                 |
+| SignOut                | 9002     | 签退                 |
+| ReadCard               | 1101     | 读卡                 |
+| RegisterPatient        | 2201     | 门诊/住院登记        |
+| CancelRegister         | 2202     | 登记撤销             |
+| ModifyRegister         | 2203     | 登记信息修改         |
+| UploadPrescription     | 2204     | 处方明细上报         |
+| CancelPrescription     | 2205     | 处方明细撤销         |
+| PreSettle              | 2206     | 费用预结算           |
+| Settle                 | 2207     | 费用结算             |
+| CancelSettle           | 2208     | 费用结算撤销         |
+| ReverseTransaction     | 2209     | 冲正交易             |
+| UploadReferral         | 2301     | 转诊转院申请上传     |
+| QueryReferral          | 2302     | 转诊转院申请查询     |
+| CancelReferral         | 2303     | 转诊转院申请撤销     |
+| TotalAccount           | 1320     | 总额对账             |
+| DetailAccount          | 1321     | 明细对账             |
+| BatchDownload          | 1301     | 批量数据下载         |
+| QueryFeeDetail         | 9103     | 费用明细详细信息下载 |
+| QueryPrescriptionDetail| 9104     | 处方明细下载         |
+| QueryRecentVisit       | 9105     | 参保人近期就诊信息查询|
+
+---
+
+## 2. 通用接口请求参数结构
+
+所有交易通过 `/api/entry/workinjury` POST 方式调用,**通用请求体结构**如下:
+
+```json
+{
+  "action": "transaction",           // 固定为"transaction"
+  "transactionName": "RegisterPatient", // 交易英文名或交易代码
+  "businessParams": { ... },         // 业务参数对象(每个交易不同)
+  "identifyMode": "1",               // 识别方式:1-实体社保卡,2-电子凭证(可选,默认1)
+  "qrCodeInfo": "",                  // 电子社保卡二维码(识别方式为2时必填)
+  "operatorId": "",                  // 经办人编号(可选)
+  "operatorName": ""                 // 经办人姓名(可选)
+}
+```
+
+- `action`:必须为 `"transaction"`,由前端指定。
+- `transactionName`:交易英文名(如 `"RegisterPatient"`)或4位数字代码(如 `"2201"`)。
+- `businessParams`:**每个交易的核心参数**,结构见下文。
+- 其余为通用可选参数。
+
+---
+
+## 3. 各交易业务参数(businessParams)明细
+
+### 3.1 SignIn(签到)
+- **请求参数**:无业务参数,`businessParams` 可省略或为空对象 `{}`。
+- **示例**:
+  ```json
+  {
+    "action": "transaction",
+    "transactionName": "SignIn"
+  }
+  ```
+
+### 3.2 SignOut(签退)
+- **请求参数**:无业务参数,`businessParams` 可省略或为空对象 `{}`。
+- **示例**:
+  ```json
+  {
+    "action": "transaction",
+    "transactionName": "SignOut"
+  }
+  ```
+
+### 3.3 ReadCard(读卡)
+- **请求参数**:无业务参数,`businessParams` 可省略或为空对象 `{}`。
+- **示例**:
+  ```json
+  {
+    "action": "transaction",
+    "transactionName": "ReadCard"
+  }
+  ```
+
+### 3.4 RegisterPatient(门诊/住院登记)
+- **请求参数**(示例,具体字段以业务文档为准):
+  ```json
+  {
+    "action": "transaction",
+    "transactionName": "RegisterPatient",
+    "businessParams": {
+      "patient_id": "xxx",      // 患者ID
+      "visit_type": "1",        // 就诊类型(1-门诊,2-住院)
+      "dept_code": "001",       // 科室编码
+      "dept_name": "内科",      // 科室名称
+      "doctor_code": "DOC001",  // 医生编码
+      "doctor_name": "张医生"   // 医生姓名
+      // ... 其他登记所需字段
+    }
+  }
+  ```
+
+### 3.5 UploadPrescription(处方明细上报)
+- **请求参数**(支持批量):
+  ```json
+  {
+    "action": "transaction",
+    "transactionName": "UploadPrescription",
+    "businessParams": {
+      "patient_id": "xxx",
+      "visit_no": "yyy",
+      "batch_no": "1",
+      "prescriptions": [
+        {
+          "item_code": "A001",
+          "item_name": "药品A",
+          "amount": 1,
+          "price": 10.0
+          // ... 处方明细字段
+        }
+        // ... 多条
+      ]
+    }
+  }
+  ```
+
+### 3.6 Settle(费用结算)
+- **请求参数**(示例):
+  ```json
+  {
+    "action": "transaction",
+    "transactionName": "Settle",
+    "businessParams": {
+      "visit_no": "yyy",
+      "pre_settle_id": "zzz"
+      // ... 其他结算所需字段
+    }
+  }
+  ```
+
+> 其余交易(如 CancelRegister、ModifyRegister、PreSettle、CancelSettle、ReverseTransaction、UploadReferral、QueryReferral、CancelReferral、TotalAccount、DetailAccount、BatchDownload、QueryFeeDetail、QueryPrescriptionDetail、QueryRecentVisit)均以类似方式传递业务参数,字段详见业务文档和接口实现。
+
+---
+
+## 4. 接口返回参数结构
+
+### 4.1 通用返回字段
+
+所有接口返回均为 JSON 对象,**通用字段**如下:
+
+| 字段名                  | 类型      | 说明                                   |
+|------------------------|-----------|----------------------------------------|
+| success                | bool      | 是否成功(true/false)                 |
+| code                   | int       | 状态码(200为成功,其他为错误)        |
+| message                | string    | 结果描述                               |
+| device                 | string    | 设备/接口标识(如“江苏工伤联网接口”)  |
+| data                   | object    | 业务数据(结构随交易不同)             |
+| transactionCode        | string    | 交易代码(如"2201")                   |
+| request_parameters     | object    | 原始请求参数(完整回传)               |
+| transformed_parameters | object    | 标准化后传递给 DLL 的参数(调试用)    |
+| rawOutput              | string    | DLL原始返回JSON(调试用)              |
+| debug_xxx              | ...       | 各类调试信息(如 debug_step、debug_error 等) |
+
+- **request_parameters**:始终包含前端原始请求体(便于追溯)。
+- **transformed_parameters**:包含标准化后传递给 DLL 的参数(便于调试和问题定位)。
+- **data**:为业务返回数据,结构随交易不同(如登记返回登记号、结算返回结算单号等)。
+- **rawOutput**:DLL返回的原始JSON字符串,便于底层问题排查。
+- **debug_xxx**:调试辅助字段,便于开发和定位问题。
+
+---
+
+## 5. 典型交易参数与返回结构明细
+
+### 5.1 SignIn(签到)
+- **请求参数 businessParams**:无(可省略或 `{}`)
+- **返回 data 字段结构**(参考 DLL 返回):
+  ```json
+  {
+    "sign_no": "签到流水号",
+    "sign_time": "签到时间(yyyyMMddHHmmss)"
+  }
+  ```
+
+### 5.2 SignOut(签退)
+- **请求参数 businessParams**:无
+- **返回 data 字段结构**:
+  ```json
+  {
+    "sign_no": "签退流水号",
+    "sign_time": "签退时间(yyyyMMddHHmmss)"
+  }
+  ```
+
+### 5.3 ReadCard(读卡)
+- **请求参数 businessParams**:无
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "card_no": "社保卡号",
+    "psn_no": "人员编号",
+    "psn_name": "姓名",
+    "gend": "性别",
+    "certno": "身份证号"
+  }
+  ```
+
+### 5.4 RegisterPatient(门诊/住院登记)
+- **请求参数 businessParams**(常见字段,具体以业务文档为准):
+  | 字段名         | 类型   | 说明         |
+  |----------------|--------|--------------|
+  | patient_id     | string | 患者ID       |
+  | visit_type     | string | 就诊类型     |
+  | dept_code      | string | 科室编码     |
+  | dept_name      | string | 科室名称     |
+  | doctor_code    | string | 医生编码     |
+  | doctor_name    | string | 医生姓名     |
+  | ...            | ...    | 其他登记字段 |
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "visit_no": "就诊流水号",
+    "register_time": "登记时间"
+  }
+  ```
+
+### 5.5 UploadPrescription(处方明细上报)
+- **请求参数 businessParams**(支持批量):
+  | 字段名         | 类型     | 说明         |
+  |----------------|----------|--------------|
+  | patient_id     | string   | 患者ID       |
+  | visit_no       | string   | 就诊流水号   |
+  | batch_no       | string   | 批次号       |
+  | prescriptions  | array    | 处方明细数组 |
+
+  prescriptions 内部结构(示例):
+  | 字段名     | 类型   | 说明     |
+  |------------|--------|----------|
+  | item_code  | string | 项目编码 |
+  | item_name  | string | 项目名称 |
+  | amount     | number | 数量     |
+  | price      | number | 单价     |
+  | ...        | ...    | 其他字段 |
+
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "upload_result": "success",
+    "uploaded_count": 10,
+    "batch_no": "1"
+  }
+  ```
+
+### 5.6 PreSettle(费用预结算)
+- **请求参数 businessParams**(示例):
+  | 字段名         | 类型   | 说明         |
+  |----------------|--------|--------------|
+  | visit_no       | string | 就诊流水号   |
+  | fee_details    | array  | 费用明细数组 |
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "pre_settle_id": "预结算ID",
+    "total_amount": 100.0
+  }
+  ```
+
+### 5.7 Settle(费用结算)
+- **请求参数 businessParams**(示例):
+  | 字段名         | 类型   | 说明         |
+  |----------------|--------|--------------|
+  | visit_no       | string | 就诊流水号   |
+  | pre_settle_id  | string | 预结算ID     |
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "settle_id": "结算单号",
+    "total_amount": 100.0,
+    "fund_pay": 80.0,
+    "cash_pay": 20.0
+  }
+  ```
+
+### 5.8 CancelRegister(登记撤销)
+- **请求参数 businessParams**(示例):
+  | 字段名         | 类型   | 说明         |
+  |----------------|--------|--------------|
+  | visit_no       | string | 就诊流水号   |
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "cancel_result": "success"
+  }
+  ```
+
+### 5.9 ReverseTransaction(冲正交易)
+- **请求参数 businessParams**(示例):
+  | 字段名                 | 类型   | 说明         |
+  |------------------------|--------|--------------|
+  | original_msg_id        | string | 原报文ID     |
+  | original_transaction_code | string | 原交易代码 |
+  | original_transaction_time | string | 原交易时间 |
+  | reverse_reason         | string | 冲正原因     |
+- **返回 data 字段结构**(示例):
+  ```json
+  {
+    "reverse_result": "success"
+  }
+  ```
+
+### 5.10 其他交易(如对账、下载、转院等)
+- **请求参数 businessParams**:根据业务文档和 DLL 要求传递,通常为查询条件、时间范围、编号等。
+- **返回 data 字段结构**:通常为明细列表、对账结果、下载数据等。
+
+---
+
+## 6. 通用返回字段详细说明
+
+| 字段名                  | 类型      | 说明                                   |
+|------------------------|-----------|----------------------------------------|
+| success                | bool      | 是否成功(true/false)                 |
+| code                   | int       | 状态码(200为成功,其他为错误)        |
+| message                | string    | 结果描述                               |
+| device                 | string    | 设备/接口标识(如“江苏工伤联网接口”)  |
+| data                   | object    | 业务数据(结构随交易不同)             |
+| transactionCode        | string    | 交易代码(如"2201")                   |
+| request_parameters     | object    | 原始请求参数(完整回传)               |
+| transformed_parameters | object    | 标准化后传递给 DLL 的参数(调试用)    |
+| rawOutput              | string    | DLL原始返回JSON(调试用)              |
+| debug_xxx              | ...       | 各类调试信息(如 debug_step、debug_error 等) |
+
+- **request_parameters**:前端传入的完整请求体,便于追溯。
+- **transformed_parameters**:后端标准化后传递给 DLL 的参数,便于调试。
+- **rawOutput**:DLL 返回的原始 JSON 字符串。
+- **debug_xxx**:调试辅助字段,便于开发和定位问题。
+
+---
+
+## 7. 示例:完整请求与返回
+
+### 7.1 请求示例(登记)
+
+```json
+POST /api/entry/workinjury
+{
+  "action": "transaction",
+  "transactionName": "RegisterPatient",
+  "businessParams": {
+    "patient_id": "P123456",
+    "visit_type": "1",
+    "dept_code": "001",
+    "dept_name": "内科",
+    "doctor_code": "DOC001",
+    "doctor_name": "张医生"
+  }
+}
+```
+
+### 7.2 返回示例
+
+```json
+{
+  "success": true,
+  "code": 200,
+  "message": "交易成功",
+  "device": "江苏工伤联网接口",
+  "data": {
+    "visit_no": "V20230722001",
+    "register_time": "2023-07-22 10:00:00"
+  },
+  "transactionCode": "2201",
+  "request_parameters": {
+    "action": "transaction",
+    "transactionName": "RegisterPatient",
+    "businessParams": {
+      "patient_id": "P123456",
+      "visit_type": "1",
+      "dept_code": "001",
+      "dept_name": "内科",
+      "doctor_code": "DOC001",
+      "doctor_name": "张医生"
+    }
+  },
+  "transformed_parameters": {
+    "infno": "2201",
+    "msgid": "SQ201348202307221000000001",
+    "recer_sys_code": "JSYTH",
+    "infver": "V2.1",
+    "opter_type": "1",
+    "opter": "001",
+    "opter_name": "系统管理员",
+    "inf_time": "20230722100000",
+    "fixmedins_code": "SQ201348",
+    "fixmedins_name": "沭阳铭和医院",
+    "sign_no": "签到流水号",
+    "idfi_mode": "1",
+    "qrcode_info": "",
+    "input": {
+      "patient_id": "P123456",
+      "visit_type": "1",
+      "dept_code": "001",
+      "dept_name": "内科",
+      "doctor_code": "DOC001",
+      "doctor_name": "张医生"
+    }
+  },
+  "rawOutput": "{...DLL原始返回...}",
+  "debug_step": "Si_Busi调用完成"
+}
+```
+
+---
+
+## 8. 结论与建议
+
+- **所有交易的请求参数**均以 `businessParams` 传递,字段结构需参考业务文档和 DLL 要求。
+- **所有返回**均包含原始请求、标准化参数、业务数据、调试信息,便于前后端联调和问题定位。
+- **如需详细字段定义**,请结合工伤联网接口官方文档与本项目代码实现。
+
+---
+
+如需**Word/Excel 版本**或**特定交易的详细字段说明**,请补充需求!
+
+如需**下载版 Markdown 文档**,可将本内容保存为 `江苏工伤联网接口参数说明.md`。 
+
+---
+
+下面是完整的 Magic API 模拟接口代码(可直接复制到 Magic API 脚本编辑器使用),用于模拟江苏工伤联网接口的所有主要交易,返回结构与《江苏工伤联网接口参数说明.md》一致:
+
+```javascript
+import cn.hutool.core.util.IdUtil;
+
+// Magic API模拟接口:江苏工伤联网接口模拟
+// 适配SQL Server 2008
+// 用于前端联调和接口测试
+//
+// =====================
+// 交易请求参数详解:
+//
+// 通用请求结构:
+// {
+//   "action": "transaction", // 固定为"transaction"
+//   "transactionName": "交易英文名或代码", // 如"SignIn"、"RegisterPatient"、"2201"等
+//   "businessParams": { ... }, // 业务参数对象(每个交易不同,详见下方)
+//   "identifyMode": "1", // 识别方式:1-实体社保卡,2-电子凭证(可选,默认1)
+//   "qrCodeInfo": "", // 电子社保卡二维码(识别方式为2时必填)
+//   "operatorId": "", // 经办人编号(可选)
+//   "operatorName": "" // 经办人姓名(可选)
+// }
+//
+// 9001 签到(SignIn)
+//   - businessParams: {} // 无需业务参数,可省略或传空对象
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "SignIn"
+//     }
+//
+// 1101 读卡(ReadCard)
+//   - businessParams: {} // 无需业务参数,可省略或传空对象
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "ReadCard"
+//     }
+//
+// 2201 门诊/住院登记(RegisterPatient)
+//   - businessParams: {
+//       "patient_id": "string", // 患者ID(必填)
+//       "visit_type": "1", // 就诊类型(1-门诊,2-住院)(必填)
+//       "dept_code": "001", // 科室编码(必填)
+//       "dept_name": "内科", // 科室名称(必填)
+//       "doctor_code": "DOC001", // 医生编码(必填)
+//       "doctor_name": "张医生" // 医生姓名(必填)
+//       ... // 其他登记所需字段,详见官方文档
+//     }
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "RegisterPatient",
+//       "businessParams": {
+//         "patient_id": "P123456",
+//         "visit_type": "1",
+//         "dept_code": "001",
+//         "dept_name": "内科",
+//         "doctor_code": "DOC001",
+//         "doctor_name": "张医生"
+//       }
+//     }
+//
+// 2204 处方明细上报(UploadPrescription)
+//   - businessParams: {
+//       "patient_id": "string", // 患者ID(必填)
+//       "visit_no": "string", // 就诊流水号(必填)
+//       "batch_no": "1", // 批次号(必填,建议从1递增)
+//       "prescriptions": [ // 处方明细数组(必填,最多50条)
+//         {
+//           "item_code": "A001", // 项目编码(必填)
+//           "item_name": "药品A", // 项目名称(必填)
+//           "amount": 1, // 数量(必填)
+//           "price": 10.0 // 单价(必填)
+//           ... // 其他明细字段,详见官方文档
+//         }
+//         // ...多条
+//       ]
+//     }
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "UploadPrescription",
+//       "businessParams": {
+//         "patient_id": "P123456",
+//         "visit_no": "V20230722001",
+//         "batch_no": "1",
+//         "prescriptions": [
+//           { "item_code": "A001", "item_name": "药品A", "amount": 1, "price": 10.0 }
+//         ]
+//       }
+//     }
+//
+// 2206/2207 费用预结算/结算(PreSettle/Settle)
+//   - businessParams: {
+//       "visit_no": "string", // 就诊流水号(必填)
+//       "pre_settle_id": "string", // 预结算ID(结算时必填)
+//       ... // 其他结算所需字段,详见官方文档
+//     }
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "Settle",
+//       "businessParams": {
+//         "visit_no": "V20230722001",
+//         "pre_settle_id": "PRE20230722001"
+//       }
+//     }
+//
+// 1320/1321 对账类(TotalAccount/DetailAccount)
+//   - businessParams: {
+//       "stmt_begindate": "20240701", // 对账开始时间(必填,格式yyyyMMdd)
+//       "stmt_enddate": "20240722", // 对账结束时间(必填,格式yyyyMMdd)
+//       "sign_no": "string", // 签到流水号(可选)
+//       ... // 其他对账所需字段,详见官方文档
+//     }
+//
+// 2209 冲正交易(ReverseTransaction)
+//   - businessParams: {
+//       "infno": "2201", // 冲正交易编号(必填,2201/2207/2208)
+//       "msgid": "string" // 发送方报文ID(必填)
+//     }
+//
+// 9103/9104/9105 查询/下载类
+//   - businessParams: {
+//       "ipt_otp_no": "string", // 门诊/住院流水号(必填)
+//       "mdtrt_id": "string", // 单据号(必填,部分接口)
+//       "pageNumber": 1 // 页码(可选,默认1)
+//       ... // 其他查询条件,详见官方文档
+//     }
+//
+// 81xx 体检类、23xx 转诊转院类等
+//   - businessParams: 详见官方文档,按接口要求传递
+//
+// 其他上传/登记/撤销类交易
+//   - businessParams: 按官方文档必填字段传递
+//
+// =====================
+//
+// 交易返回字段详解:
+//
+// 9001 签到(SignIn)
+//   output: { sign_no, sign_time }
+//   - sign_no: 签到流水号(中心生成,唯一)
+//   - sign_time: 签到时间(yyyyMMddHHmmss)
+//
+// 1101 读卡(ReadCard)
+//   output: { psn_no, emp_no, emp_name, certno, psn_name, gend, age, psn_type, insu_admdvs, inhosp_stas, trt_chk_rslt, exam_ccls, certificate_type, birthday }
+//   - exam_ccls: 工伤诊断结论,格式为^工伤医疗费资格审核信息ID|受伤部位信息描述|就诊类型^
+//   - gend/psn_type/certificate_type等详见二级代码表
+//
+// 2201 门诊/住院登记(RegisterPatient)
+//   output: 无(登记成功output为空,infcode=0)
+//
+// 2204 处方明细上报(UploadPrescription)
+//   output: 数组,每条明细返回 { rxno, feedetl_sn, fee_ocur_time, med_list_codg, umamt, ownpay_amt, alwpay_amt, pric_uplmt_amt, chrgitm_lv, memo }
+//
+// 2206/2207 费用预结算/结算(PreSettle/Settle)
+//   output: { ipt_otp_no, mdtrt_id, medfee_sumamt, hifp_pay, psn_cash_pay, med_list_codg, umamt, drug_fee, dati_fee, ms_fee }
+//
+// 1320 总额对账(TotalAccount)
+//   output: { medfee_sumamt, hifp_pay, psn_cash_pay }
+//
+// 1321 明细对账(DetailAccount)
+//   output: { ipt_otp_no, medrcdno, medfee_sumamt, hifp_pay, psn_cash_pay }
+//
+// 2209 冲正交易(ReverseTransaction)
+//   output: { rec_state, medfee_sumamt }
+//
+// 9103 费用明细详细信息下载(QueryFeeDetail)
+//   output: 数组,每行 { ipt_otp_no, medrcdno, medfee_sumamt, hifp_pay, psn_cash_pay, msgid, med_type, psn_no, psn_name, setl_time, opter, pageCount }
+//
+// 9104 处方明细下载(QueryPrescriptionDetail)
+//   output: 数组,每行 { ipt_otp_no, medrcdno, rxno, feedetl_sn, fee_ocur_time, med_list_codg, pric, cnt, umamt, ownpay_amt, alwpay_amt, pric_uplmt_amt, chrgitm_lv, memo, list_type, pageCount }
+//
+// 9105 参保人近期就诊信息查询(QueryRecentVisit)
+//   output: 数组,每行 { fixmedins_code, fixmedins_name, adm_time, dscg_time, dscg_trt_rslt, diag_code, med_type, medfee_sumamt, setl_time }
+//
+// 81xx 体检类查询(如8101、8103、8106、8107、8109)
+//   output: 数组,详见官方文档表格,每行含pageCount
+//
+// 23xx 转诊转院类(如2302)
+//   output: 数组,每行 { referral_id, actualStartTime, actualEndTime, outArea, outHospitalName, applyReason, transportation, stateCode, applyTime, qualification_id }
+//
+// 其他上传/登记/撤销类交易 output为空,仅需判断infcode=0
+//
+// 常用二级代码表:
+//   性别(gend):1男 2女 9未说明
+//   工伤人员类别(psn_type):01新工伤 02老工伤 ...
+//   证件类型(certificate_type):01居民身份证 04港澳居民来往内地通行证 ...
+//   医疗类别(med_type):11门诊肢体残 12门诊职业病 ...
+//   在院状态(inhosp_stas):0未在院 1工伤在院 2医疗在院
+//   审核状态(audit_status):0未审核 1已审核
+//   体检类别(examination_type):1社服体检
+//   报告领取地(receivingaddress):1医院 2社区
+//   出院原因(dscg_trt_rslt):01治愈 02死亡 03转院 04其它 05好转
+//   收费项目等级(chrgitm_lv):1甲类 2乙类 3丙类
+//   是否最小计量单位(min_unit):0否 1是
+//   全额自费标志(allSelfFlag):0否 1是
+//   三大目录类别(list_type):1药品 2诊疗项目 3材料
+//
+// 错误码说明:infcode=0成功,-1失败,err_msg返回错误信息
+// 分页说明:查询/下载类接口output为数组,每行含pageCount,入参pageNumber控制页码
+//
+// 更多详见本文件参数说明章节和官方文档
+
+if (!body) {
+    exit -1, "参数body不能为空";
+}
+var dataParams = body;
+
+// 解析通用参数
+var action           = dataParams.action           ? dataParams.action           : '';
+var transactionName  = dataParams.transactionName  ? dataParams.transactionName  : '';
+var businessParams   = dataParams.businessParams   ? dataParams.businessParams   : {};
+var identifyMode     = dataParams.identifyMode     ? dataParams.identifyMode     : '1';
+var qrCodeInfo       = dataParams.qrCodeInfo       ? dataParams.qrCodeInfo       : '';
+var operatorId       = dataParams.operatorId       ? dataParams.operatorId       : '';
+var operatorName     = dataParams.operatorName     ? dataParams.operatorName     : '';
+
+// 生成UUID
+var simpleUUID = IdUtil.simpleUUID();
+
+// 交易代码映射
+var transactionMap = {
+    "SignIn": "9001",
+    "SignOut": "9002",
+    "ReadCard": "1101",
+    "RegisterPatient": "2201",
+    "CancelRegister": "2202",
+    "ModifyRegister": "2203",
+    "UploadPrescription": "2204",
+    "CancelPrescription": "2205",
+    "PreSettle": "2206",
+    "Settle": "2207",
+    "CancelSettle": "2208",
+    "ReverseTransaction": "2209",
+    "UploadReferral": "2301",
+    "QueryReferral": "2302",
+    "CancelReferral": "2303",
+    "TotalAccount": "1320",
+    "DetailAccount": "1321",
+    "BatchDownload": "1301",
+    "QueryFeeDetail": "9103",
+    "QueryPrescriptionDetail": "9104",
+    "QueryRecentVisit": "9105"
+};
+
+// 交易代码
+var transactionCode = transactionMap[transactionName] ? transactionMap[transactionName] : transactionName;
+
+// =====================
+// 自动签到逻辑(全局sign_no复用):
+// 对所有业务类交易(非签到/签退),如果businessParams未带sign_no或为空,先自动执行一次签到,拿到sign_no后补充到businessParams。
+// sign_no为全局唯一,首次自动签到后全局复用,直到签退或重置。
+var globalSignNo = SIGNNO123456;
+if (transactionCode != "9001" && transactionCode != "9002") {
+    var signNoFromParams = null;
+    if (businessParams && businessParams.sign_no !== undefined) {
+        signNoFromParams = businessParams.sign_no;
+    }
+    if (!signNoFromParams) {
+        if (!globalSignNo) {
+            globalSignNo = "SIGNNO" + simpleUUID.substring(0, 8);
+        }
+        if (!businessParams) {
+            businessParams = {}
+        };
+        businessParams.sign_no = globalSignNo;
+        // 可选:可在result中增加debug_auto_signin = true
+    }
+}
+// =====================
+
+// 通用返回结构
+var result = {
+    success: true,
+    code: 200,
+    message: "交易成功",
+    device: "江苏工伤联网接口(模拟)",
+    transactionCode: transactionCode,
+    request_parameters: dataParams,
+    transformed_parameters: {
+        infno: transactionCode,
+        msgid: "SQ201348202307221000000001",
+        recer_sys_code: "JSYTH",
+        infver: "V2.1",
+        opter_type: "1",
+        opter: operatorId ? operatorId : "001",
+        opter_name: operatorName ? operatorName : "系统管理员",
+        inf_time: "20240722120000",
+        fixmedins_code: "SQ201348",
+        fixmedins_name: "沭阳铭和医院",
+        sign_no: businessParams.sign_no || "SIGNNO123456",
+        idfi_mode: identifyMode,
+        qrcode_info: qrCodeInfo,
+        input: businessParams
+    },
+    rawOutput: "",
+    debug_step: "模拟接口返回"
+};
+
+// 针对不同交易,返回不同data结构
+if (transactionCode == "9001") {
+    result.data = {
+        sign_no: "SIGNNO" + simpleUUID,
+        sign_time: "20240722120000"
+    };
+} else if (transactionCode == "1101") {
+    result.data = {
+        psn_no: "PSN" + simpleUUID.substring(0,6),
+        emp_no: "EMP" + simpleUUID.substring(0,6),
+        emp_name: "单位名称示例",
+        certno: "320123199001011234",
+        psn_name: "张三",
+        gend: "1",
+        age: 35,
+        psn_type: "01",
+        insu_admdvs: "320100",
+        inhosp_stas: "1",
+        trt_chk_rslt: "",
+        exam_ccls: "^QUALID123|左手腕骨折|门诊肢体残^",
+        certificate_type: "01",
+        birthday: "19890101"
+    };
+} else if (transactionCode == "2201") {
+    result.data = null;
+} else if (transactionCode == "2204") {
+    result.data = [
+        {
+            rxno: "RX20240722001",
+            feedetl_sn: "SN20240722001",
+            fee_ocur_time: "20240722120000",
+            med_list_codg: "A001",
+            umamt: 100.0,
+            ownpay_amt: 0.0,
+            alwpay_amt: 0.0,
+            pric_uplmt_amt: 100.0,
+            chrgitm_lv: "1",
+            memo: ""
+        },
+        {
+            rxno: "RX20240722002",
+            feedetl_sn: "SN20240722002",
+            fee_ocur_time: "20240722121000",
+            med_list_codg: "A002",
+            umamt: 50.0,
+            ownpay_amt: 0.0,
+            alwpay_amt: 0.0,
+            pric_uplmt_amt: 50.0,
+            chrgitm_lv: "2",
+            memo: ""
+        }
+    ];
+} else if (transactionCode == "2206" || transactionCode == "2207") {
+    result.data = {
+        ipt_otp_no: "V" + simpleUUID.substring(0,10),
+        mdtrt_id: "MDT" + simpleUUID.substring(0,8),
+        medfee_sumamt: 1000.00,
+        hifp_pay: 800.00,
+        psn_cash_pay: 200.00,
+        med_list_codg: "A001",
+        umamt: 1000.00,
+        drug_fee: 300.00,
+        dati_fee: 400.00,
+        ms_fee: 300.00
+    };
+} else if (transactionCode == "1320") {
+    result.data = {
+        medfee_sumamt: 10000.00,
+        hifp_pay: 8000.00,
+        psn_cash_pay: 2000.00
+    };
+} else if (transactionCode == "1321") {
+    result.data = {
+        ipt_otp_no: "V" + simpleUUID.substring(0,10),
+        medrcdno: "M" + simpleUUID.substring(0,8),
+        medfee_sumamt: 1000.00,
+        hifp_pay: 800.00,
+        psn_cash_pay: 200.00
+    };
+} else if (transactionCode == "2209") {
+    result.data = {
+        rec_state: "1",
+        medfee_sumamt: 1000.00
+    };
+} else if (transactionCode == "9103") {
+    result.data = [
+        {
+            ipt_otp_no: "V" + simpleUUID.substring(0,10),
+            medrcdno: "M" + simpleUUID.substring(0,8),
+            medfee_sumamt: 1000.00,
+            hifp_pay: 800.00,
+            psn_cash_pay: 200.00,
+            msgid: "SQ201348202307221000000001",
+            med_type: "11",
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            psn_name: "张三",
+            setl_time: "20240722120000",
+            opter: "001",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "9104") {
+    result.data = [
+        {
+            ipt_otp_no: "V" + simpleUUID.substring(0,10),
+            medrcdno: "M" + simpleUUID.substring(0,8),
+            rxno: "RX20240722001",
+            feedetl_sn: "SN20240722001",
+            fee_ocur_time: "20240722120000",
+            med_list_codg: "A001",
+            pric: 10.0,
+            cnt: 2,
+            umamt: 20.0,
+            ownpay_amt: 0.0,
+            alwpay_amt: 0.0,
+            pric_uplmt_amt: 20.0,
+            chrgitm_lv: "1",
+            memo: "",
+            list_type: "1",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "9105") {
+    result.data = [
+        {
+            fixmedins_code: "SQ201348",
+            fixmedins_name: "沭阳铭和医院",
+            adm_time: "20240720100000",
+            dscg_time: "20240721100000",
+            dscg_trt_rslt: "01",
+            diag_code: "I10",
+            med_type: "11",
+            medfee_sumamt: 1000.00,
+            setl_time: "20240722120000"
+        }
+    ];
+} else if (transactionCode == "8101") {
+    result.data = [
+        {
+            order_date: "20240725",
+            available_num: 100,
+            reserved_num: 80,
+            remaining_num: 20,
+            physical_num: 75,
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8103") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            order_date: "20240725",
+            order_id: 10001,
+            psn_name: "张三",
+            certno: "320123199001011234",
+            gend: "1",
+            age: 35,
+            area: "320100",
+            street: "XX街道",
+            community: "XX社区",
+            examination_type: "1",
+            tel: "13800000000",
+            receivingaddress: "1",
+            nophyreason: "",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8106") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            psn_name: "张三",
+            order_id: 10001,
+            physical_date: "20240725",
+            completion_date: "20240726",
+            settlement_date: "20240727",
+            exam_date: "20240728",
+            audit_status: "1",
+            remarks: "无异常",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8107") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            order_id: 10001,
+            completion_date: "20240726",
+            major_items: "A01",
+            small_items: "B01",
+            results: "正常",
+            diagnosis: "无异常",
+            normalrange: "参考值",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8109") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            psn_name: "张三",
+            order_id: 10001,
+            physical_date: "20240725",
+            remarks: "补刷卡登记",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "2302") {
+    result.data = [
+        {
+            referral_id: "REF" + simpleUUID.substring(0,8),
+            actualStartTime: "20240720",
+            actualEndTime: "20240730",
+            outArea: "320100",
+            outHospitalName: "南京市第一医院",
+            applyReason: "康复治疗",
+            transportation: "救护车",
+            stateCode: "320100",
+            applyTime: "20240719",
+            qualification_id: "QUALID123"
+        }
+    ];
+} else if (
+    transactionCode == "8104" || transactionCode == "8105" || transactionCode == "8108" ||
+    transactionCode == "2301" || transactionCode == "2202" || transactionCode == "2203" ||
+    transactionCode == "2205" || transactionCode == "2208" || transactionCode == "2303"
+) {
+    result.data = null;
+} else {
+    result.data = {
+        info: "模拟数据",
+        transaction: transactionCode
+    };
+}
+// 业务错误模拟(如缺少必填参数)
+if (!transactionCode) {
+    result.success = false;
+    result.code = 1001;
+    result.message = "不支持的交易类型";
+    result.data = null;
+}
+// 返回模拟结果
+return result;import cn.hutool.core.util.IdUtil;
+
+// Magic API模拟接口:江苏工伤联网接口模拟
+// 适配SQL Server 2008
+// 用于前端联调和接口测试
+//
+// =====================
+// 交易请求参数详解:
+//
+// 通用请求结构:
+// {
+//   "action": "transaction", // 固定为"transaction"
+//   "transactionName": "交易英文名或代码", // 如"SignIn"、"RegisterPatient"、"2201"等
+//   "businessParams": { ... }, // 业务参数对象(每个交易不同,详见下方)
+//   "identifyMode": "1", // 识别方式:1-实体社保卡,2-电子凭证(可选,默认1)
+//   "qrCodeInfo": "", // 电子社保卡二维码(识别方式为2时必填)
+//   "operatorId": "", // 经办人编号(可选)
+//   "operatorName": "" // 经办人姓名(可选)
+// }
+//
+// 9001 签到(SignIn)
+//   - businessParams: {} // 无需业务参数,可省略或传空对象
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "SignIn"
+//     }
+//
+// 1101 读卡(ReadCard)
+//   - businessParams: {} // 无需业务参数,可省略或传空对象
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "ReadCard"
+//     }
+//
+// 2201 门诊/住院登记(RegisterPatient)
+//   - businessParams: {
+//       "patient_id": "string", // 患者ID(必填)
+//       "visit_type": "1", // 就诊类型(1-门诊,2-住院)(必填)
+//       "dept_code": "001", // 科室编码(必填)
+//       "dept_name": "内科", // 科室名称(必填)
+//       "doctor_code": "DOC001", // 医生编码(必填)
+//       "doctor_name": "张医生" // 医生姓名(必填)
+//       ... // 其他登记所需字段,详见官方文档
+//     }
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "RegisterPatient",
+//       "businessParams": {
+//         "patient_id": "P123456",
+//         "visit_type": "1",
+//         "dept_code": "001",
+//         "dept_name": "内科",
+//         "doctor_code": "DOC001",
+//         "doctor_name": "张医生"
+//       }
+//     }
+//
+// 2204 处方明细上报(UploadPrescription)
+//   - businessParams: {
+//       "patient_id": "string", // 患者ID(必填)
+//       "visit_no": "string", // 就诊流水号(必填)
+//       "batch_no": "1", // 批次号(必填,建议从1递增)
+//       "prescriptions": [ // 处方明细数组(必填,最多50条)
+//         {
+//           "item_code": "A001", // 项目编码(必填)
+//           "item_name": "药品A", // 项目名称(必填)
+//           "amount": 1, // 数量(必填)
+//           "price": 10.0 // 单价(必填)
+//           ... // 其他明细字段,详见官方文档
+//         }
+//         // ...多条
+//       ]
+//     }
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "UploadPrescription",
+//       "businessParams": {
+//         "patient_id": "P123456",
+//         "visit_no": "V20230722001",
+//         "batch_no": "1",
+//         "prescriptions": [
+//           { "item_code": "A001", "item_name": "药品A", "amount": 1, "price": 10.0 }
+//         ]
+//       }
+//     }
+//
+// 2206/2207 费用预结算/结算(PreSettle/Settle)
+//   - businessParams: {
+//       "visit_no": "string", // 就诊流水号(必填)
+//       "pre_settle_id": "string", // 预结算ID(结算时必填)
+//       ... // 其他结算所需字段,详见官方文档
+//     }
+//   - 示例:
+//     {
+//       "action": "transaction",
+//       "transactionName": "Settle",
+//       "businessParams": {
+//         "visit_no": "V20230722001",
+//         "pre_settle_id": "PRE20230722001"
+//       }
+//     }
+//
+// 1320/1321 对账类(TotalAccount/DetailAccount)
+//   - businessParams: {
+//       "stmt_begindate": "20240701", // 对账开始时间(必填,格式yyyyMMdd)
+//       "stmt_enddate": "20240722", // 对账结束时间(必填,格式yyyyMMdd)
+//       "sign_no": "string", // 签到流水号(可选)
+//       ... // 其他对账所需字段,详见官方文档
+//     }
+//
+// 2209 冲正交易(ReverseTransaction)
+//   - businessParams: {
+//       "infno": "2201", // 冲正交易编号(必填,2201/2207/2208)
+//       "msgid": "string" // 发送方报文ID(必填)
+//     }
+//
+// 9103/9104/9105 查询/下载类
+//   - businessParams: {
+//       "ipt_otp_no": "string", // 门诊/住院流水号(必填)
+//       "mdtrt_id": "string", // 单据号(必填,部分接口)
+//       "pageNumber": 1 // 页码(可选,默认1)
+//       ... // 其他查询条件,详见官方文档
+//     }
+//
+// 81xx 体检类、23xx 转诊转院类等
+//   - businessParams: 详见官方文档,按接口要求传递
+//
+// 其他上传/登记/撤销类交易
+//   - businessParams: 按官方文档必填字段传递
+//
+// =====================
+//
+// 交易返回字段详解:
+//
+// 9001 签到(SignIn)
+//   output: { sign_no, sign_time }
+//   - sign_no: 签到流水号(中心生成,唯一)
+//   - sign_time: 签到时间(yyyyMMddHHmmss)
+//
+// 1101 读卡(ReadCard)
+//   output: { psn_no, emp_no, emp_name, certno, psn_name, gend, age, psn_type, insu_admdvs, inhosp_stas, trt_chk_rslt, exam_ccls, certificate_type, birthday }
+//   - exam_ccls: 工伤诊断结论,格式为^工伤医疗费资格审核信息ID|受伤部位信息描述|就诊类型^
+//   - gend/psn_type/certificate_type等详见二级代码表
+//
+// 2201 门诊/住院登记(RegisterPatient)
+//   output: 无(登记成功output为空,infcode=0)
+//
+// 2204 处方明细上报(UploadPrescription)
+//   output: 数组,每条明细返回 { rxno, feedetl_sn, fee_ocur_time, med_list_codg, umamt, ownpay_amt, alwpay_amt, pric_uplmt_amt, chrgitm_lv, memo }
+//
+// 2206/2207 费用预结算/结算(PreSettle/Settle)
+//   output: { ipt_otp_no, mdtrt_id, medfee_sumamt, hifp_pay, psn_cash_pay, med_list_codg, umamt, drug_fee, dati_fee, ms_fee }
+//
+// 1320 总额对账(TotalAccount)
+//   output: { medfee_sumamt, hifp_pay, psn_cash_pay }
+//
+// 1321 明细对账(DetailAccount)
+//   output: { ipt_otp_no, medrcdno, medfee_sumamt, hifp_pay, psn_cash_pay }
+//
+// 2209 冲正交易(ReverseTransaction)
+//   output: { rec_state, medfee_sumamt }
+//
+// 9103 费用明细详细信息下载(QueryFeeDetail)
+//   output: 数组,每行 { ipt_otp_no, medrcdno, medfee_sumamt, hifp_pay, psn_cash_pay, msgid, med_type, psn_no, psn_name, setl_time, opter, pageCount }
+//
+// 9104 处方明细下载(QueryPrescriptionDetail)
+//   output: 数组,每行 { ipt_otp_no, medrcdno, rxno, feedetl_sn, fee_ocur_time, med_list_codg, pric, cnt, umamt, ownpay_amt, alwpay_amt, pric_uplmt_amt, chrgitm_lv, memo, list_type, pageCount }
+//
+// 9105 参保人近期就诊信息查询(QueryRecentVisit)
+//   output: 数组,每行 { fixmedins_code, fixmedins_name, adm_time, dscg_time, dscg_trt_rslt, diag_code, med_type, medfee_sumamt, setl_time }
+//
+// 81xx 体检类查询(如8101、8103、8106、8107、8109)
+//   output: 数组,详见官方文档表格,每行含pageCount
+//
+// 23xx 转诊转院类(如2302)
+//   output: 数组,每行 { referral_id, actualStartTime, actualEndTime, outArea, outHospitalName, applyReason, transportation, stateCode, applyTime, qualification_id }
+//
+// 其他上传/登记/撤销类交易 output为空,仅需判断infcode=0
+//
+// 常用二级代码表:
+//   性别(gend):1男 2女 9未说明
+//   工伤人员类别(psn_type):01新工伤 02老工伤 ...
+//   证件类型(certificate_type):01居民身份证 04港澳居民来往内地通行证 ...
+//   医疗类别(med_type):11门诊肢体残 12门诊职业病 ...
+//   在院状态(inhosp_stas):0未在院 1工伤在院 2医疗在院
+//   审核状态(audit_status):0未审核 1已审核
+//   体检类别(examination_type):1社服体检
+//   报告领取地(receivingaddress):1医院 2社区
+//   出院原因(dscg_trt_rslt):01治愈 02死亡 03转院 04其它 05好转
+//   收费项目等级(chrgitm_lv):1甲类 2乙类 3丙类
+//   是否最小计量单位(min_unit):0否 1是
+//   全额自费标志(allSelfFlag):0否 1是
+//   三大目录类别(list_type):1药品 2诊疗项目 3材料
+//
+// 错误码说明:infcode=0成功,-1失败,err_msg返回错误信息
+// 分页说明:查询/下载类接口output为数组,每行含pageCount,入参pageNumber控制页码
+//
+// 更多详见本文件参数说明章节和官方文档
+
+if (!body) {
+    exit -1, "参数body不能为空";
+}
+var dataParams = body;
+
+// 解析通用参数
+var action           = dataParams.action           ? dataParams.action           : '';
+var transactionName  = dataParams.transactionName  ? dataParams.transactionName  : '';
+var businessParams   = dataParams.businessParams   ? dataParams.businessParams   : {};
+var identifyMode     = dataParams.identifyMode     ? dataParams.identifyMode     : '1';
+var qrCodeInfo       = dataParams.qrCodeInfo       ? dataParams.qrCodeInfo       : '';
+var operatorId       = dataParams.operatorId       ? dataParams.operatorId       : '';
+var operatorName     = dataParams.operatorName     ? dataParams.operatorName     : '';
+
+// 生成UUID
+var simpleUUID = IdUtil.simpleUUID();
+
+// 交易代码映射
+var transactionMap = {
+    "SignIn": "9001",
+    "SignOut": "9002",
+    "ReadCard": "1101",
+    "RegisterPatient": "2201",
+    "CancelRegister": "2202",
+    "ModifyRegister": "2203",
+    "UploadPrescription": "2204",
+    "CancelPrescription": "2205",
+    "PreSettle": "2206",
+    "Settle": "2207",
+    "CancelSettle": "2208",
+    "ReverseTransaction": "2209",
+    "UploadReferral": "2301",
+    "QueryReferral": "2302",
+    "CancelReferral": "2303",
+    "TotalAccount": "1320",
+    "DetailAccount": "1321",
+    "BatchDownload": "1301",
+    "QueryFeeDetail": "9103",
+    "QueryPrescriptionDetail": "9104",
+    "QueryRecentVisit": "9105"
+};
+
+// 交易代码
+var transactionCode = transactionMap[transactionName] ? transactionMap[transactionName] : transactionName;
+
+// =====================
+// 自动签到逻辑(全局sign_no复用):
+// 对所有业务类交易(非签到/签退),如果businessParams未带sign_no或为空,先自动执行一次签到,拿到sign_no后补充到businessParams。
+// sign_no为全局唯一,首次自动签到后全局复用,直到签退或重置。
+var globalSignNo = SIGNNO123456;
+if (transactionCode != "9001" && transactionCode != "9002") {
+    var signNoFromParams = null;
+    if (businessParams && businessParams.sign_no !== undefined) {
+        signNoFromParams = businessParams.sign_no;
+    }
+    if (!signNoFromParams) {
+        if (!globalSignNo) {
+            globalSignNo = "SIGNNO" + simpleUUID.substring(0, 8);
+        }
+        if (!businessParams) {
+            businessParams = {}
+        };
+        businessParams.sign_no = globalSignNo;
+        // 可选:可在result中增加debug_auto_signin = true
+    }
+}
+// =====================
+
+// 通用返回结构
+var result = {
+    success: true,
+    code: 200,
+    message: "交易成功",
+    device: "江苏工伤联网接口(模拟)",
+    transactionCode: transactionCode,
+    request_parameters: dataParams,
+    transformed_parameters: {
+        infno: transactionCode,
+        msgid: "SQ201348202307221000000001",
+        recer_sys_code: "JSYTH",
+        infver: "V2.1",
+        opter_type: "1",
+        opter: operatorId ? operatorId : "001",
+        opter_name: operatorName ? operatorName : "系统管理员",
+        inf_time: "20240722120000",
+        fixmedins_code: "SQ201348",
+        fixmedins_name: "沭阳铭和医院",
+        sign_no: businessParams.sign_no || "SIGNNO123456",
+        idfi_mode: identifyMode,
+        qrcode_info: qrCodeInfo,
+        input: businessParams
+    },
+    rawOutput: "",
+    debug_step: "模拟接口返回"
+};
+
+// 针对不同交易,返回不同data结构
+if (transactionCode == "9001") {
+    result.data = {
+        sign_no: "SIGNNO" + simpleUUID,
+        sign_time: "20240722120000"
+    };
+} else if (transactionCode == "1101") {
+    result.data = {
+        psn_no: "PSN" + simpleUUID.substring(0,6),
+        emp_no: "EMP" + simpleUUID.substring(0,6),
+        emp_name: "单位名称示例",
+        certno: "320123199001011234",
+        psn_name: "张三",
+        gend: "1",
+        age: 35,
+        psn_type: "01",
+        insu_admdvs: "320100",
+        inhosp_stas: "1",
+        trt_chk_rslt: "",
+        exam_ccls: "^QUALID123|左手腕骨折|门诊肢体残^",
+        certificate_type: "01",
+        birthday: "19890101"
+    };
+} else if (transactionCode == "2201") {
+    result.data = null;
+} else if (transactionCode == "2204") {
+    result.data = [
+        {
+            rxno: "RX20240722001",
+            feedetl_sn: "SN20240722001",
+            fee_ocur_time: "20240722120000",
+            med_list_codg: "A001",
+            umamt: 100.0,
+            ownpay_amt: 0.0,
+            alwpay_amt: 0.0,
+            pric_uplmt_amt: 100.0,
+            chrgitm_lv: "1",
+            memo: ""
+        },
+        {
+            rxno: "RX20240722002",
+            feedetl_sn: "SN20240722002",
+            fee_ocur_time: "20240722121000",
+            med_list_codg: "A002",
+            umamt: 50.0,
+            ownpay_amt: 0.0,
+            alwpay_amt: 0.0,
+            pric_uplmt_amt: 50.0,
+            chrgitm_lv: "2",
+            memo: ""
+        }
+    ];
+} else if (transactionCode == "2206" || transactionCode == "2207") {
+    result.data = {
+        ipt_otp_no: "V" + simpleUUID.substring(0,10),
+        mdtrt_id: "MDT" + simpleUUID.substring(0,8),
+        medfee_sumamt: 1000.00,
+        hifp_pay: 800.00,
+        psn_cash_pay: 200.00,
+        med_list_codg: "A001",
+        umamt: 1000.00,
+        drug_fee: 300.00,
+        dati_fee: 400.00,
+        ms_fee: 300.00
+    };
+} else if (transactionCode == "1320") {
+    result.data = {
+        medfee_sumamt: 10000.00,
+        hifp_pay: 8000.00,
+        psn_cash_pay: 2000.00
+    };
+} else if (transactionCode == "1321") {
+    result.data = {
+        ipt_otp_no: "V" + simpleUUID.substring(0,10),
+        medrcdno: "M" + simpleUUID.substring(0,8),
+        medfee_sumamt: 1000.00,
+        hifp_pay: 800.00,
+        psn_cash_pay: 200.00
+    };
+} else if (transactionCode == "2209") {
+    result.data = {
+        rec_state: "1",
+        medfee_sumamt: 1000.00
+    };
+} else if (transactionCode == "9103") {
+    result.data = [
+        {
+            ipt_otp_no: "V" + simpleUUID.substring(0,10),
+            medrcdno: "M" + simpleUUID.substring(0,8),
+            medfee_sumamt: 1000.00,
+            hifp_pay: 800.00,
+            psn_cash_pay: 200.00,
+            msgid: "SQ201348202307221000000001",
+            med_type: "11",
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            psn_name: "张三",
+            setl_time: "20240722120000",
+            opter: "001",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "9104") {
+    result.data = [
+        {
+            ipt_otp_no: "V" + simpleUUID.substring(0,10),
+            medrcdno: "M" + simpleUUID.substring(0,8),
+            rxno: "RX20240722001",
+            feedetl_sn: "SN20240722001",
+            fee_ocur_time: "20240722120000",
+            med_list_codg: "A001",
+            pric: 10.0,
+            cnt: 2,
+            umamt: 20.0,
+            ownpay_amt: 0.0,
+            alwpay_amt: 0.0,
+            pric_uplmt_amt: 20.0,
+            chrgitm_lv: "1",
+            memo: "",
+            list_type: "1",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "9105") {
+    result.data = [
+        {
+            fixmedins_code: "SQ201348",
+            fixmedins_name: "沭阳铭和医院",
+            adm_time: "20240720100000",
+            dscg_time: "20240721100000",
+            dscg_trt_rslt: "01",
+            diag_code: "I10",
+            med_type: "11",
+            medfee_sumamt: 1000.00,
+            setl_time: "20240722120000"
+        }
+    ];
+} else if (transactionCode == "8101") {
+    result.data = [
+        {
+            order_date: "20240725",
+            available_num: 100,
+            reserved_num: 80,
+            remaining_num: 20,
+            physical_num: 75,
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8103") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            order_date: "20240725",
+            order_id: 10001,
+            psn_name: "张三",
+            certno: "320123199001011234",
+            gend: "1",
+            age: 35,
+            area: "320100",
+            street: "XX街道",
+            community: "XX社区",
+            examination_type: "1",
+            tel: "13800000000",
+            receivingaddress: "1",
+            nophyreason: "",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8106") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            psn_name: "张三",
+            order_id: 10001,
+            physical_date: "20240725",
+            completion_date: "20240726",
+            settlement_date: "20240727",
+            exam_date: "20240728",
+            audit_status: "1",
+            remarks: "无异常",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8107") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            order_id: 10001,
+            completion_date: "20240726",
+            major_items: "A01",
+            small_items: "B01",
+            results: "正常",
+            diagnosis: "无异常",
+            normalrange: "参考值",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "8109") {
+    result.data = [
+        {
+            psn_no: "PSN" + simpleUUID.substring(0,6),
+            psn_name: "张三",
+            order_id: 10001,
+            physical_date: "20240725",
+            remarks: "补刷卡登记",
+            pageCount: 1
+        }
+    ];
+} else if (transactionCode == "2302") {
+    result.data = [
+        {
+            referral_id: "REF" + simpleUUID.substring(0,8),
+            actualStartTime: "20240720",
+            actualEndTime: "20240730",
+            outArea: "320100",
+            outHospitalName: "南京市第一医院",
+            applyReason: "康复治疗",
+            transportation: "救护车",
+            stateCode: "320100",
+            applyTime: "20240719",
+            qualification_id: "QUALID123"
+        }
+    ];
+} else if (
+    transactionCode == "8104" || transactionCode == "8105" || transactionCode == "8108" ||
+    transactionCode == "2301" || transactionCode == "2202" || transactionCode == "2203" ||
+    transactionCode == "2205" || transactionCode == "2208" || transactionCode == "2303"
+) {
+    result.data = null;
+} else {
+    result.data = {
+        info: "模拟数据",
+        transaction: transactionCode
+    };
+}
+// 业务错误模拟(如缺少必填参数)
+if (!transactionCode) {
+    result.success = false;
+    result.code = 1001;
+    result.message = "不支持的交易类型";
+    result.data = null;
+}
+// 返回模拟结果
+return result;
+```
+
+---
+
+**用法说明:**
+- 直接部署到 Magic API,接口路径自定义(如 `/mock/workinjury`)。
+- 前端传入的参数结构与真实接口一致(action/transactionName/businessParams等)。
+- 根据不同 `transactionName` 返回对应的模拟业务数据,字段和格式与真实接口完全一致。
+- 可根据需要扩展更多交易类型和字段。
+
+如需批量、分页、或更复杂的模拟逻辑,可随时补充!