Files
LabelChange-server/到货及出库模块接口对接文档.md
2026-06-01 16:30:29 +08:00

805 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 到货及出库模块接口对接文档
## 1. 接口概述
到货及出库模块提供了一系列RESTful API接口用于到货交接单和出库交接单的创建、查询、更新以及与袋牌的关联操作。本文档详细描述了这些接口的使用方法、请求参数和响应格式。
**测试环境请求地址http://172.232.21.79:5002**
**正式环境请求地址https://lr.tooexp.com**
### 1.1 接口基础信息
- **到货交接单基础URL**`http://{服务器地址}:{端口}/api/arrival-handover`
- **出库交接单基础URL**`http://{服务器地址}:{端口}/api/shipping-handover`
- **请求方式**POST/GET
- **数据格式**JSON
- **响应格式**JSON
### 1.2 状态码说明
| 状态码 | 描述 |
| --- | ----------- |
| 200 | 操作成功 |
| 400 | 请求参数错误或操作失败 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
## 2. 接口详细说明
### 2.1 到货交接单模块
#### 2.1.1 查询到货交接单信息
**接口路径**`/receipt-query`
**请求方法**POST
**功能描述**:根据到货编号查询到货交接单详细信息,包括包裹数、已有标签率、到货时间等
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ------------- | ------ | -- | ------------- | ------------------------ |
| arrivalNumber | string | 是 | 到货编号(提单号或大箱号) | "TEST1ZX30Y730494260906" |
| callback | string | 否 | JSONP回调函数 | "callback" |
请求体示例:
```json
{
"arrivalNumber": "TEST1ZX30Y730494260906",
"callback": null
}
```
##### Mock数据
| 到货编号 | 包裹数 | 已有标签率 | 到货时间 | 提单号 | 大箱号 |
| ---------------------- | ---- | ----- | ---------- | ------------------------ | ----------------- |
| TEST1ZX30Y730494260906 | 1200 | 0.8 | 1744032000000 | TEST1ZX30Y730494260906 | testS169-3-20-2-1 |
| TEST1ZX30Y730494260907 | - | - | - | TEST1ZX30Y730494260907 | - |
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": {
"packageCount": 1200,
"labelRate": 0.8,
"arrivalTime": 1744032000000,
"billOfLadingNumber": "TEST1ZX30Y730494260906",
"masterPackageNumber": "testS169-3-20-2-1"
}
}
```
响应字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| packageCount | int | 包裹总数 |
| labelRate | double | 已有标签率 |
| arrivalTime | long? | 到货时间戳毫秒UTC |
| billOfLadingNumber | string | 提单号 |
| masterPackageNumber | string | 大箱号 |
**失败响应**
```json
{
"code": 9999,
"message": "无预报数据",
"data": {
"billOfLadingNumber": "TEST1ZX30Y730494260907",
"masterPackageNumber": ""
}
}
```
### 2.2 出库交接单模块
#### 2.2.1 查询出库交接单详细信息
**接口路径**`/details/{handoverNumber}`
**请求方法**GET
**功能描述**根据出库交接单号查询详细信息包括BOL单号、渠道商、袋牌数量和总包裹数
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| -------------- | ------ | -- | ------------ | ------------ |
| handoverNumber | string | 是 | 出库交接单号(路径参数) | "TESTBOL001" |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### Mock数据
| 出库交接单号 | 渠道商 | 袋牌数量 | 总包裹数 |
| ------------ | ---- | ---- | ---- |
| TESTBOL001 | GOFO | 3 | 150 |
| TESTBOL002 | USPS | 5 | 250 |
| TESTBOL003 | UPS | 0 | 0 |
##### 请求示例
```
GET /api/shipping-handover/details/TESTBOL001
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": {
"handoverNumber": "TESTBOL001",
"channel": "GOFO",
"bagTagCount": 3,
"totalPackageCount": 150,
"status": "Draft"
}
}
```
响应字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| handoverNumber | string | 交接单号 |
| channel | string | 渠道商 |
| bagTagCount | int | 袋牌数量 |
| totalPackageCount | int | 总包裹数 |
| status | string | 状态 |
**失败响应**
```json
{
"code": 9999,
"message": "Shipping handover form not found"
}
```
#### 2.2.2 确认出库交接单
**接口路径**`/confirm`
**请求方法**POST
**功能描述**:确认出库交接单,将状态从草稿修改为已出库
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| -------------- | -------- | -- | ---------------------- | ------------------------------------------------------------- |
| handoverNumber | string | 是 | 出库交接单号 | "TESTBOL001" |
| deliveryTime | long? | 否 | 出货时间戳毫秒UTC | 1744032000000 |
| pod | string | 是 | POD图片链接至少包含两张图片用逗号分隔 | "https://example.com/pod1.jpg,https://example.com/pod2.jpg" |
| callback | string | 否 | JSONP回调函数 | "callback" |
请求体示例:
```json
{
"handoverNumber": "TESTBOL001",
"deliveryTime": 1744032000000,
"pod": "https://example.com/pod1.jpg,https://example.com/pod2.jpg",
"callback": null
}
```
##### Mock数据
| 出库交接单号 | 操作结果 |
| ------------ | ---- |
| TESTBOL001 | 成功 |
| TESTBOL002 | 成功 |
| TESTBOL003 | 成功 |
##### 请求示例
```
POST /api/shipping-handover/confirm
Content-Type: application/json
{
"handoverNumber": "TESTBOL001",
"deliveryTime": 1744032000000,
"pod": "https://example.com/pod1.jpg,https://example.com/pod2.jpg"
}
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": true
}
```
响应字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| data | bool | 操作结果 |
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
##### 业务规则
1. 一旦执行确认出库操作后,系统不允许对同一交接单再次执行出库操作
2. 每次出库操作至少关联一个袋牌信息
3. POD字段必须至少包含两张图片的S3链接
#### 2.2.3 创建出库交接单
**接口路径**`/create`
**请求方法**GET
**功能描述**:创建出库交接单
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| -------------- | -------- | -- | ------------ | ------------------------------------------------------------- |
| HandoverNumber | string | 否 | 交接单号,为空时自动生成 | "BOL-ORD-GOFO-20260325-001" |
| Channel | string | 是 | 渠道 | "GOFO" |
| DeliveryTime | long? | 否 | 交货时间戳毫秒UTC | 1744032000000 |
| POD | string | 否 | POD图片链接 | "https://example.com/pod1.jpg,https://example.com/pod2.jpg" |
| Remarks | string | 否 | 备注 | "测试备注" |
| Creator | string | 是 | 创建人 | "test_user" |
| TimeZone | string | 是 | 时区 | "America/New_York" |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/create?Channel=GOFO&Creator=test_user&TimeZone=America/New_York
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": 1
}
```
响应字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| data | int | 新增记录ID |
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.2.4 获取出库交接单列表
**接口路径**`/list`
**请求方法**GET
**功能描述**:获取出库交接单列表,支持分页和筛选
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ----------------- | -------- | -- | ---------------- | ------------------------- |
| page | int | 否 | 页码默认1 | 1 |
| pageSize | int | 否 | 每页数量默认10 | 10 |
| sortBy | string | 否 | 排序字段默认CreatedAt | "CreatedAt" |
| sortOrder | string | 否 | 排序方向默认desc | "desc" |
| handoverNumber | string | 否 | 交接单号 | "BOL-ORD-GOFO-20260325120000" |
| channel | string | 否 | 渠道 | "GOFO" |
| creator | string | 否 | 创建人 | "test_user" |
| startDeliveryTime | long? | 否 | 开始交货时间戳毫秒UTC| 1744032000000 |
| endDeliveryTime | long? | 否 | 结束交货时间戳毫秒UTC| 1744118400000 |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/list?page=1&pageSize=10&channel=GOFO
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": {
"forms": [
{
"Id": 1,
"HandoverNumber": "BOL-ORD-GOFO-20260325120000",
"BigBagCount": 3,
"SmallBagCount": 150,
"Channel": "GOFO",
"DeliveryTime": 1744032000000,
"POD": "https://example.com/pod1.jpg",
"Remarks": "测试备注",
"Creator": "test_user",
"CreatedAt": 1744032000000,
"UpdatedAt": 1744032000000,
"TimeZone": "America/New_York",
"Status": 0
}
],
"totalCount": 1
}
}
```
响应字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| forms | array | 交接单列表 |
| totalCount | int | 总记录数 |
ShippingHandoverFormEntity 字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| Id | int | 主键ID |
| HandoverNumber | string | 交接单号 |
| BigBagCount | int | 袋牌数量 |
| SmallBagCount | int | 包裹数量 |
| Channel | string | 渠道 |
| DeliveryTime | long? | 交货时间戳毫秒UTC |
| POD | string | POD图片链接 |
| Remarks | string | 备注 |
| Creator | string | 创建人 |
| CreatedAt | long | 创建时间戳毫秒UTC |
| UpdatedAt | long | 更新时间戳毫秒UTC |
| TimeZone | string | 时区 |
| Status | int | 状态0=草稿1=已出库) |
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
### 2.3 出库交接单与袋牌关联模块
#### 2.3.1 关联袋牌到出货交接单
**接口路径**`/bag-tag/associate/{shippingHandoverFormId}`
**请求方法**POST
**功能描述**:关联袋牌到出货交接单
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|-------|------|------|------|--------|
| shippingHandoverFormId | int | 是 | 出货交接单ID路径参数 | 1 |
| bagTagIds | List<int> | 是 | 袋牌ID列表请求体 | [1, 2, 3] |
##### 请求示例
```
POST /api/shipping-handover/bag-tag/associate/1
Content-Type: application/json
[1, 2, 3]
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": true
}
```
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.3.2 获取出货交接单关联的袋牌列表
**接口路径**`/bag-tag/list/{shippingHandoverFormId}`
**请求方法**GET
**功能描述**:获取出货交接单关联的袋牌列表
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ---------------------- | ------ | -- | ------------- | ---------- |
| shippingHandoverFormId | int | 是 | 出货交接单ID路径参数 | 1 |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/bag-tag/list/1
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": [
{
"Id": 1,
"TagNumber": "USPS202601271200000001",
"ChannelName": "USPS",
"Status": "Closed",
"Creator": "system",
"CreatedAt": 1706361600000,
"OpenedAt": 1706361900000,
"ClosedAt": 1706363400000
}
]
}
```
BagTagEntity 字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| Id | int | 主键ID |
| TagNumber | string | 袋牌号 |
| ChannelName | string | 渠道名 |
| Status | string | 状态 |
| Creator | string | 创建人 |
| CreatedAt | long | 创建时间戳毫秒UTC |
| OpenedAt | long? | 开袋时间戳毫秒UTC |
| ClosedAt | long? | 封袋时间戳毫秒UTC |
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.3.3 从出货交接单中移除袋牌
**接口路径**`/bag-tag/remove/{relationId}`
**请求方法**GET
**功能描述**:从出货交接单中移除袋牌
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ---------- | ------ | -- | ---------- | ---------- |
| relationId | int | 是 | 关联ID路径参数 | 1 |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/bag-tag/remove/1
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": true
}
```
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.3.4 清空出货交接单的所有袋牌关联
**接口路径**`/bag-tag/clear/{shippingHandoverFormId}`
**请求方法**GET
**功能描述**:清空出货交接单的所有袋牌关联
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ---------------------- | ------ | -- | ------------- | ---------- |
| shippingHandoverFormId | int | 是 | 出货交接单ID路径参数 | 1 |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/bag-tag/clear/1
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": true
}
```
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.3.5 统计出货交接单的袋牌数量和包裹数量
**接口路径**`/bag-tag/count/{shippingHandoverFormId}`
**请求方法**GET
**功能描述**:统计出货交接单的袋牌数量和包裹数量
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ---------------------- | ------ | -- | ------------- | ---------- |
| shippingHandoverFormId | int | 是 | 出货交接单ID路径参数 | 1 |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/bag-tag/count/1
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": {
"bagTagCount": 3,
"packageCount": 150
}
}
```
响应字段说明:
| 字段名 | 类型 | 描述 |
| --- | --- | --- |
| bagTagCount | int | 袋牌数量 |
| packageCount | int | 包裹数量 |
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.3.6 检查袋牌是否已关联到出货交接单
**接口路径**`/bag-tag/check/{bagTagId}`
**请求方法**GET
**功能描述**:检查袋牌是否已关联到出货交接单
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| -------- | ------ | -- | ---------- | ---------- |
| bagTagId | int | 是 | 袋牌ID路径参数 | 1 |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/bag-tag/check/1
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": true
}
```
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
#### 2.3.7 通过袋牌号关联袋牌到出货交接单
**接口路径**`/bag-tag/associate-by-number/{shippingHandoverFormId}`
**请求方法**GET
**功能描述**:通过袋牌号关联袋牌到出货交接单
##### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
| ---------------------- | ------ | -- | ------------- | ------------------------------------------------- |
| shippingHandoverFormId | int | 是 | 出货交接单ID路径参数 | 1 |
| bagTagNumbers | string | 是 | 袋牌号列表(逗号分隔) | "USPS202601271200000001,USPS202601271200000002" |
| callback | string | 否 | JSONP回调函数 | "callback" |
##### 请求示例
```
GET /api/shipping-handover/bag-tag/associate-by-number/1?bagTagNumbers=USPS202601271200000001,USPS202601271200000002
```
##### 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": true
}
```
**失败响应**
```json
{
"code": 9999,
"message": "错误信息"
}
```
## 3. 接口调用示例
### 3.1 使用cURL调用
#### 查询出库交接单详细信息
```bash
curl -X GET "http://localhost:5002/api/shipping-handover/details/TESTBOL001"
```
#### 创建出库交接单
```bash
curl -X GET "http://localhost:5002/api/shipping-handover/create?Channel=GOFO&Creator=test_user&TimeZone=America/New_York"
```
#### 查询到货交接单信息POST请求
```bash
curl -X POST "http://localhost:5002/api/arrival-handover/receipt-query" \
-H "Content-Type: application/json" \
-d '{"arrivalNumber": "TEST1ZX30Y730494260906"}'
```
### 3.2 使用PowerShell调用
#### 查询出库交接单详细信息
```powershell
Invoke-RestMethod -Uri "http://localhost:5002/api/shipping-handover/details/TESTBOL001" `
-Method GET
```
#### 创建出库交接单
```powershell
Invoke-RestMethod -Uri "http://localhost:5002/api/shipping-handover/create?Channel=GOFO&Creator=test_user&TimeZone=America/New_York" `
-Method GET
```
#### 查询到货交接单信息POST请求
```powershell
$body = @{
arrivalNumber = "TEST1ZX30Y730494260906"
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:5002/api/arrival-handover/receipt-query" `
-Method POST `
-Body $body `
-ContentType "application/json"
```
## 4. 注意事项
### 4.1 数据验证
- 渠道不能为空
- 创建人不能为空
- 时区不能为空
- 时间戳均使用UTC时间毫秒
### 4.2 性能考虑
- 批量操作时,建议合理控制数据量
- 频繁的接口调用可能会影响系统性能,建议合理控制调用频率
## 5. 常见问题
### 5.1 创建出库交接单失败
**可能原因**
- 渠道为空
- 创建人为空
- 时区为空
**解决方案**
- 确保必填参数不为空
### 5.2 查询出库交接单失败
**可能原因**
- 出库交接单号不存在
**解决方案**
- 检查出库交接单号是否正确
## 6. 接口版本管理
| 版本 | 变更内容 | 发布日期 |
| ---- | ------------- | ---------- |
| v1.4 | 恢复接口入参时间参数类型为DateTime/string返回值保持为long类型时间戳 | 2026-05-08 |
| v1.3 | 修改确认出库交接单接口为POST方法 | 2026-05-08 |
| v1.2 | 修改receipt-query接口为POST方法时间字段改为long类型时间戳增加响应字段类型说明 | 2026-05-08 |
| v1.1 | 新增查询到货交接单信息接口 | 2026-03-25 |
| v1.0 | 初始版本,包含所有基础接口 | 2026-03-25 |
## 7. 联系信息
如有接口使用问题,请联系系统管理员或开发团队。