小包模块提供了一系列RESTful API接口,用于标签替换、扫描记录管理以及相关操作。本文档详细描述了这些接口的使用方法、请求参数和响应格式。
测试环境请求地址:http://172.232.21.79:5002
正式环境请求地址:https://lr.tooexp.com
http://{服务器地址}:{端口}/api/Label| 状态码 | 描述 |
|---|---|
| 200 | 操作成功 |
| 400 | 请求参数错误或操作失败 |
| 401 | 身份验证失败 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
接口路径:/label-replace/tracking/{trackingNumber}
请求方法:GET
功能描述:根据跟踪单号获取标签替换请求记录
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| trackingNumber | string | 是 | 跟踪单号 | "1Z999AA10123456789" |
GET /api/Label/label-replace/tracking/1Z999AA10123456789
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "trackingNumber": "1Z999AA10123456789", "count": 1, "data": [{"Id": 1, "NeutralWaybillNumber": "TEST001", "FinalMileTrackingNumber": "1Z999AA10123456789", "ReplaceStatus": "Y", "CreatedAt": "2026-03-30T10:00:00Z"}]}
失败响应:
{"status": "error", "message": "Tracking number is required"}
接口路径:/label-replace/waybill/{waybillNumber}
请求方法:GET
功能描述:根据中性面单单号获取标签替换请求记录
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| waybillNumber | string | 是 | 中性面单单号 | "TEST001" |
GET /api/Label/label-replace/waybill/TEST001
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "waybillNumber": "TEST001", "data": {"Id": 1, "NeutralWaybillNumber": "TEST001", "FinalMileTrackingNumber": "1Z999AA10123456789", "ReplaceStatus": "Y", "CreatedAt": "2026-03-30T10:00:00Z"}}
失败响应:
{"status": "error", "message": "Waybill number is required"}
接口路径:/label-replace/waybill/{waybillNumber}/download
请求方法:GET
功能描述:根据中性面单单号获取标签文件并返回字节流
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| waybillNumber | string | 是 | 中性面单单号 | "TEST001" |
GET /api/Label/label-replace/waybill/TEST001/download
成功响应:
application/pdflabel_TEST001.pdf失败响应:
{"status": "error", "message": "Label replace request not found for the provided waybill number"}
接口路径:/print-preview
请求方法:GET
功能描述:获取打印预览页面
无
GET /api/Label/print-preview
成功响应:
text/html失败响应:
接口路径:/label-scan/test-xuntong-webhook
请求方法:POST
功能描述:测试讯通回传接口
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| WaybillNumber | string | 是 | 中性面单单号 | "TEST001" |
| Success | bool | 否 | 是否成功,默认true | true |
| Description | string | 否 | 描述 | "Test webhook" |
{"WaybillNumber": "TEST001", "Success": true, "Description": "Test webhook"}
成功响应:
{"status": "ok", "message": "Test webhook sent successfully"}
失败响应:
{"status": "error", "message": "Waybill number is required"}
接口路径:/label-scan/record
请求方法:POST
功能描述:记录标签扫描
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| CustomerId | int | 否 | 客户ID | 1 |
| NeutralWaybillNumber | string | 是 | 中性面单单号 | "TEST001" |
| Result | int | 是 | 扫描结果 | 0 |
| CreatedBy | string | 是 | 创建人 | "system" |
| ReferenceNumber | string | 否 | 参考号 | "REF001" |
| FinalMileTrackingNumber | string | 否 | 尾程跟踪单号 | "1Z999AA10123456789" |
| Description | string | 否 | 描述 | "标签扫描" |
{"CustomerId": 1, "NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system", "ReferenceNumber": "REF001", "FinalMileTrackingNumber": "1Z999AA10123456789", "Description": "标签扫描"}
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "scanRecord": {"Id": 1, "NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system", "CreatedAt": "2026-03-30T12:00:00Z"}}
失败响应:
{"status": "error", "message": "Neutral waybill number is required"}
接口路径:/label-scan/waybill/{waybillNumber}
请求方法:GET
功能描述:根据中性面单查询扫描记录列表
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| waybillNumber | string | 是 | 中性面单单号 | "TEST001" |
GET /api/Label/label-scan/waybill/TEST001
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "waybillNumber": "TEST001", "count": 1, "data": [{"Id": 1, "NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system", "CreatedAt": "2026-03-30T10:00:00Z"}]}
失败响应:
{"status": "error", "message": "Waybill number is required"}
接口路径:/label-scan/customer/{customerId}
请求方法:GET
功能描述:根据客户ID查询扫描记录列表
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| customerId | int | 是 | 客户ID | 1 |
GET /api/Label/label-scan/customer/1
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "customerId": 1, "count": 2, "data": [{"Id": 1, "NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system", "CreatedAt": "2026-03-30T10:00:00Z"}, {"Id": 2, "NeutralWaybillNumber": "TEST002", "Result": 0, "CreatedBy": "system", "CreatedAt": "2026-03-30T11:00:00Z"}]}
失败响应:
{"status": "error", "message": "An unexpected error occurred during scan record retrieval.", "errorDetails": "错误信息"}
接口路径:/label-scan/stats/customer/{customerId}
请求方法:GET
功能描述:获取客户的扫描记录统计
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| customerId | int | 是 | 客户ID | 1 |
GET /api/Label/label-scan/stats/customer/1
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "customerId": 1, "stats": {"totalScans": 10, "successfulScans": 8, "failedScans": 2}}
失败响应:
{"status": "error", "message": "An unexpected error occurred during scan statistics retrieval.", "errorDetails": "错误信息"}
接口路径:/label-replace/batch
请求方法:GET
功能描述:批量查询标签替换请求
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| page | int | 否 | 页码,默认1 | 1 |
| pageSize | int | 否 | 每页数量,默认10 | 10 |
| sortBy | string | 否 | 排序字段,默认CreatedAt | "CreatedAt" |
| sortOrder | string | 否 | 排序方向,默认desc | "desc" |
| billOfLadingNumber | string | 否 | 提单号 | "BOL001" |
| masterPackageNumber | string | 否 | 大包号 | "MP001" |
| referenceNumber | string | 否 | 参考号 | "REF001" |
| neutralWaybillNumber | string | 否 | 中性面单单号 | "TEST001" |
| finalMileTrackingNumber | string | 否 | 尾程跟踪单号 | "1Z999AA10123456789" |
| replaceStatus | string | 否 | 换单状态 | "Y" |
| customerId | int | 否 | 客户ID | 1 |
| callback | string | 否 | JSONP回调函数名 | "callback" |
GET /api/Label/label-replace/batch?page=1&pageSize=10&sortBy=CreatedAt&sortOrder=desc
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "totalCount": 100, "page": 1, "pageSize": 10, "totalPages": 10, "data": [{"Id": 1, "NeutralWaybillNumber": "TEST001", "FinalMileTrackingNumber": "1Z999AA10123456789", "ReplaceStatus": "Y", "CreatedAt": "2026-03-30T10:00:00Z"}, ...]}
失败响应:
{"status": "error", "message": "An unexpected error occurred during batch retrieval.", "errorDetails": "错误信息"}
接口路径:/label-scan/batch
请求方法:GET
功能描述:批量查询标签扫描记录
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| page | int | 否 | 页码,默认1 | 1 |
| pageSize | int | 否 | 每页数量,默认10 | 10 |
| sortBy | string | 否 | 排序字段,默认CreatedAt | "CreatedAt" |
| sortOrder | string | 否 | 排序方向,默认desc | "desc" |
| customerId | int | 否 | 客户ID | 1 |
| referenceNumber | string | 否 | 参考号 | "REF001" |
| neutralWaybillNumber | string | 否 | 中性面单单号 | "TEST001" |
| finalMileTrackingNumber | string | 否 | 尾程跟踪单号 | "1Z999AA10123456789" |
| result | int | 否 | 扫描结果 | 0 |
| callback | string | 否 | JSONP回调函数名 | "callback" |
GET /api/Label/label-scan/batch?page=1&pageSize=10&sortBy=CreatedAt&sortOrder=desc
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "totalCount": 50, "page": 1, "pageSize": 10, "totalPages": 5, "data": [{"Id": 1, "NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system", "CreatedAt": "2026-03-30T10:00:00Z"}, ...]}
失败响应:
{"status": "error", "message": "An unexpected error occurred during batch retrieval.", "errorDetails": "错误信息"}
接口路径:/label-replace/export-excel
请求方法:GET
功能描述:导出标签替换请求为Excel
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| billOfLadingNumber | string | 否 | 提单号 | "BOL001" |
| masterPackageNumber | string | 否 | 大包号 | "MP001" |
| referenceNumber | string | 否 | 参考号 | "REF001" |
| neutralWaybillNumber | string | 否 | 中性面单单号 | "TEST001" |
| finalMileTrackingNumber | string | 否 | 尾程跟踪单号 | "1Z999AA10123456789" |
| replaceStatus | string | 否 | 换单状态 | "Y" |
| customerId | int | 否 | 客户ID | 1 |
GET /api/Label/label-replace/export-excel?customerId=1&replaceStatus=Y
成功响应:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetLabelReplaceRequests_20260330_120000.xlsx失败响应:
{"status": "error", "message": "An unexpected error occurred during export.", "errorDetails": "错误信息"}
接口路径:/label-replace/batch-cancel
请求方法:POST
功能描述:批量取消订单
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| CustomerCode | string | 是 | 客户代码 | "TEST" |
| ApiKey | string | 是 | API密钥 | "api_key_123" |
| WaybillNumbers | array | 是 | 中性面单单号列表 | ["TEST001", "TEST002"] |
{"CustomerCode": "TEST", "ApiKey": "api_key_123", "WaybillNumbers": ["TEST001", "TEST002"]}
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "successCount": 2, "failedCount": 0, "failedItems": [], "message": "Batch cancel completed successfully"}
失败响应:
{"status": "error", "message": "Waybill numbers are required"}
接口路径:/label-scan/export-excel
请求方法:GET
功能描述:导出标签扫描记录为Excel
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| customerId | int | 否 | 客户ID | 1 |
| referenceNumber | string | 否 | 参考号 | "REF001" |
| neutralWaybillNumber | string | 否 | 中性面单单号 | "TEST001" |
| finalMileTrackingNumber | string | 否 | 尾程跟踪单号 | "1Z999AA10123456789" |
| result | int | 否 | 扫描结果 | 0 |
GET /api/Label/label-scan/export-excel?customerId=1&result=0
成功响应:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetLabelScanRecords_20260330_120000.xlsx失败响应:
{"status": "error", "message": "An unexpected error occurred during export.", "errorDetails": "错误信息"}
接口路径:/customers
请求方法:GET
功能描述:获取客户列表
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| callback | string | 否 | JSONP回调函数名 | "callback" |
GET /api/Label/customers
成功响应:
{"status": "ok", "timestamp": "2026-03-30T12:00:00Z", "data": [{"Id": 1, "CustomerCode": "TEST", "CustomerName": "测试客户"}, ...]}
失败响应:
{"status": "error", "message": "An unexpected error occurred during customers retrieval.", "errorDetails": "错误信息"}
接口路径:/label-replace/status
请求方法:POST
功能描述:批量查询换单状态
请求头:
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| customerCode | string | 是 | 客户代码 | "TEST" |
| apiKey | string | 是 | API密钥 | "api_key_123" |
请求体:
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|---|---|---|---|---|
| numbers | array | 是 | 单号列表(中性面单或尾程单号) | ["TEST001", "1Z999AA10123456789"] |
{"numbers": ["TEST001", "1Z999AA10123456789"]}
成功响应:
{"code": 200, "timestamp": "2026-03-30T12:00:00Z", "count": 2, "data": [{"number": "TEST001", "status": "Y", "message": "Success"}, {"number": "1Z999AA10123456789", "status": "Y", "message": "Success"}]}
失败响应:
{"code": 400, "message": "customerCode and apiKey are required in headers"}
curl -X GET "http://localhost:5002/api/Label/label-replace/tracking/1Z999AA10123456789"
curl -X GET "http://localhost:5002/api/Label/label-replace/waybill/TEST001/download" -o "label_TEST001.pdf"
curl -X POST "http://localhost:5002/api/Label/label-scan/record" \
-H "Content-Type: application/json" \
-d '{"NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system"}'
curl -X POST "http://localhost:5002/api/Label/label-replace/status" \
-H "Content-Type: application/json" \
-H "customerCode: TEST" \
-H "apiKey: api_key_123" \
-d '{"numbers": ["TEST001", "1Z999AA10123456789"]}'
Invoke-RestMethod -Uri "http://localhost:5002/api/Label/label-replace/tracking/1Z999AA10123456789" `
-Method GET
Invoke-WebRequest -Uri "http://localhost:5002/api/Label/label-replace/waybill/TEST001/download" `
-Method GET `
-OutFile "label_TEST001.pdf"
Invoke-RestMethod -Uri "http://localhost:5002/api/Label/label-scan/record" `
-Method POST `
-ContentType "application/json" `
-Body '{"NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system"}'
Invoke-RestMethod -Uri "http://localhost:5002/api/Label/label-replace/status" `
-Method POST `
-ContentType "application/json" `
-Headers @{"customerCode"="TEST"; "apiKey"="api_key_123"} `
-Body '{"numbers": ["TEST001", "1Z999AA10123456789"]}'
# 1. 查询标签替换记录
GET /api/Label/label-replace/waybill/TEST001
# 2. 下载标签文件
GET /api/Label/label-replace/waybill/TEST001/download
# 3. 记录扫描
POST /api/Label/label-scan/record
{"NeutralWaybillNumber": "TEST001", "Result": 0, "CreatedBy": "system"}
可能原因:
解决方案:
可能原因:
解决方案:
可能原因:
解决方案:
| 版本 | 变更内容 | 发布日期 |
|---|---|---|
| v1.0 | 初始版本,包含所有基础接口 | 2026-03-30 |
如有接口使用问题,请联系系统管理员或开发团队。