# 消息推送

消息推送由企得宝ERP系统主动向开发者配置的推送地址推送消息，共 **8** 种推送类型。

---

## 推送说明

### 推送方式

- **请求方式：** HTTP POST
- **Content-Type：** `application/json;charset=UTF-8`

### 推送签名规则

1. 所有参数（除 sign）按照字典序排列
2. 排序好的参数（除 sign）根据参数名称+参数值直接拼接（key1value1key2value2）
3. 拼接完成后字符串两端加上当前企业的 `secret` 进行 MD5 加密并转小写

### 返回结果

接收方处理完成后，返回字符串 `success` 认为推送成功，返回其他认为失败。

---

## 推送类型列表

| 序号 | 推送类型 | 说明 |
|------|----------|------|
| 1 | [库存推送](#1-库存推送) | 库存变更时触发 |
| 2 | [发货推送（旧版）](#2-发货推送旧版) | 发货时触发 |
| 3 | [发货推送（新）](#3-发货推送新) | 发货时触发（需联系开启） |
| 4 | [路由推送](#4-路由推送) | 物流路由更新时触发 |
| 5 | [入库推送](#5-入库推送) | 退货入库时触发 |
| 6 | [订单流程消息推送](#6-订单流程消息推送) | 订单流程状态变更时触发 |
| 7 | [发货单推送](#7-发货单推送) | 发货单创建或状态变更时触发 |
| 8 | [退货单推送](#8-退货单推送) | 退货单创建或状态变更时触发 |

---

## 1. 库存推送

**推送时机：** ERP系统中商品库存发生变更时触发

### 请求参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| productId | 否 | String | 平台商品Id |
| skuId | 否 | String | 平台商品SkuId |
| skuCode | 否 | String | 平台商品Sku编码 |
| shopId | 否 | String | 当前商品所属店铺ID |
| quantity | 否 | String | 根据店铺选择的上传类型×上传比例 |
| modifyDate | 否 | String | 库存变更时间 |
| timestamp | 否 | String | 时间戳（毫秒） |
| sign | 否 | String | 签名 |

### 响应参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| state | 否 | boolean | 响应结果：true-成功；false-失败 |
| code | 否 | int | 响应码：0-成功；1-错误 |
| message | 否 | String | 错误信息 |

---

## 2. 发货推送（旧版）

**推送时机：** 发货时触发

**推送须知：** 推送成功后，如果当前订单在对方系统是整单发货，请调用 `foonsu.erp.orders.save` 接口同步当前订单为已发货；如果是部分发货可同步成部分发货。

### 请求参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| orderKind | 否 | String | 订单类别 |
| logisticsCompanyCode | 否 | String | 物流公司编码 |
| tradeNo | 否 | String | 交易单号 |
| logisticsNo | 否 | String | 运单号 |
| timestamp | 否 | String | 时间戳（毫秒） |
| sign | 否 | String | 签名 |

**返回结果：** 返回 `success` 认为推送成功。

---

## 3. 发货推送（新）

**推送时机：** 发货时触发（对接此推送方式需要联系对接负责人员为企业开启）

**推送须知：** 推送成功后，如果当前订单在对方系统是整单发货，请调用 `foonsu.erp.orders.save` 接口同步当前订单为已发货。

### 请求参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| pushJson | 否 | String | 推送内容Json字符串 |
| timestamp | 否 | String | 时间戳（毫秒） |
| sign | 否 | String | 签名 |

### pushJson 推送内容参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| logisticsCompanyCode | 否 | String | 物流公司编码 |
| externalStorageCode | 否 | String | 外部仓库编码 |
| tradeNo | 否 | String | 交易单号 |
| logisticsNo | 否 | String | 运单号 |
| orderKind | 否 | String | 订单类别 |
| addLogistcisNo | 否 | String | 追加运单号 |
| subLogistcisNo | 否 | String | 子运单号 |
| payAmount | 否 | BigDecimal | 付款金额 |
| postAmount | 否 | BigDecimal | 运费 |
| deliveryOrderParentGoodsList | 否 | List[Object] | 发货父商品列表 |
| deliveryOrderGoodsList | 否 | List[Object] | 发货商品列表 |
| packages | 否 | List[Object] | 订单包裹信息 |

### deliveryOrderParentGoodsList 参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| goodsId | String | 商品id |
| goodsCode | String | 系统商品编码 |
| goodsName | String | 商品名称 |
| goodsQuantity | BigDecimal | 商品数量 |
| goodsUnit | String | 商品单位 |
| goodsPlatformCode | String | 平台商品编码 |
| platformGoodsCode | String | 平台商品id |
| platformQuantity | BigDecimal | 平台数量 |
| payAmount | BigDecimal | 付款金额 |
| batchList | String | 唯一码/序列号列表，多个逗号隔开 |

### deliveryOrderGoodsList 参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| goodsId | String | 商品id |
| parentGoodsId | String | 父商品id |
| goodsCode | String | 商品编码 |
| goodsName | String | 商品名称 |
| goodsQuantity | BigDecimal | 商品数量 |
| goodsUnit | String | 商品单位 |
| goodsPlatformCode | String | 平台商品编码 |
| platformGoodsCode | String | 平台商品id |
| platformQuantity | BigDecimal | 平台数量 |
| payAmount | BigDecimal | 付款金额 |
| batchList | String | 唯一码/序列号列表，多个逗号隔开 |

### packages 参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| expressCode | String | 运单号 |
| items | List[Object] | 商品列表 |
| packageCode | BigDecimal | 包裹编号 |
| batchCode | String | 唯一码/序列号列表，多个逗号隔开 |

### items 参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| itemCode | String | 商品编码 |
| itemId | String | 商品仓储系统编码 |
| quantity | Long | 包裹内该商品的数量 |

### 推送示例

```json
{
  "pushJson": "{\"addLogistcisNo\":\"SF1040358886694,SF1040358886709,SF1310010989521\",\"deliveryOrderGoodsList\":[{\"goodsCode\":\"S1110\",\"goodsName\":\"测试商品\",\"goodsQuantity\":2.4,\"batchList\":\"A0001,A0002\"}],\"logisticsCompanyCode\":\"01\",\"logisticsNo\":\"SF1310010946622\",\"subLogistcisNo\":\"\",\"tradeNo\":\"2999\",\"packages\":[{\"expressCode\":\"fake_data\",\"items\":[{\"itemCode\":\"fake_data\",\"itemId\":\"fake_data\",\"quantity\":66}],\"packageCode\":\"fake_data\",\"batchCode\":\"A0001,A0002\"}],\"externalStorageCode\":\"121212\"}",
  "sign": "58c3f00cc3792c9ad6f0c7575154a518",
  "timestamp": "1611562103183"
}
```

---

## 4. 路由推送

**推送时机：** 物流路由信息更新时触发（如揽件、中转、派送、签收等）

### 请求参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| routePushList | 否 | String | 路由消息集合（JSON数组字符串） |
| timestamp | 否 | String | 时间戳（毫秒） |
| sign | 否 | String | 签名 |

### routePushList 对象参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| acceptAddress | String | 路由发生的地点 |
| acceptTime | Date | 路由发生的时间 |
| exceptionType | String | 路由异常状态：0-正常；1-揽件超时；2-中转超时；3-派送超时；4-虚假签收；5-问题件；6-退件；7-拒收 |
| logisticsNo | String | 运单号 |
| parcelType | String | 路由包裹状态：1-已发货未揽件；2-已揽收未中转；3-已中转未派送；4-已派送未签收；5-已派送已签收；6-异常单；7-拒收；8-已送达 |
| remark | String | 备注 |
| expressman | String | 派送员姓名（目前只有顺丰路由才有该字段） |
| expressmanMobile | String | 派送员电话（目前只有顺丰路由才有该字段） |
| tradeNo | String | 交易单号 |

### 请求示例

```json
{
  "sign": "695eca7dcadd9fac7cc678f284553862",
  "routePushList": "[{\"acceptAddress\":\"深圳市\",\"acceptTime\":\"2020-04-15 21:50:18\",\"exceptionType\":\"0\",\"logisticsNo\":\"SF1011737074881\",\"parcelType\":\"5\",\"remark\":\"已派送已签收\"},{\"acceptAddress\":\"深圳市\",\"acceptTime\":\"2020-04-15 20:50:18\",\"exceptionType\":\"0\",\"logisticsNo\":\"SF1011737074881\",\"parcelType\":\"4\",\"remark\":\"已派送未签收\"}]",
  "timestamp": "1590042103647"
}
```

---

## 5. 入库推送

**推送时机：** 退货商品入库时触发

### 请求参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| orderNo | 否 | String | 退货单编号 |
| afterSaleOrderId | **是** | String | 平台售后单号（平台退货单编号） |
| tradeNo | **是** | String | 平台交易单号 |
| warehouseId | 否 | Long | 仓库ID |
| warehouseName | 否 | String | 仓库名称 |
| stockType | 否 | String | 入库类型：1-退货入库 |
| statusDate | 否 | String | 入库时间 |
| timestamp | 否 | String | 时间戳（毫秒） |
| sign | 否 | String | 签名 |

### 请求示例

```json
{
  "orderNo": "DRO274201560000",
  "warehouseId": "9900100000000082",
  "stockType": "1",
  "sign": "2f045f4e12b37bb8bafc5f4785f36f56",
  "warehouseName": "深圳仓",
  "timestamp": "1655284940722"
}
```

---

## 6. 订单流程消息推送

**推送时机：** 订单流程状态变更时触发（接单、客审、打印物流单、打印发货单、外仓操作等）

### 请求参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| shopId | 否 | String | 店铺Id |
| tradeNo | 否 | String | 交易单号 |
| status | 否 | String | 状态：1-已接单；2-已客审；3-已打印物流单；4-已打印发货单；5-外仓已接单；6-外仓已拣货；7-外仓已打包；8-外仓已发货；9-订单已同步外仓；10-订单已从外仓取消；11-订单异常；12-订单已作废 |
| exceptionMessage | 否 | String | 订单异常信息 |
| operationDate | 否 | String | 操作时间 |
| operationTimestamp | 否 | String | 操作时间戳（毫秒级） |
| timestamp | 否 | String | 当前时间戳（毫秒） |
| sign | 否 | String | 签名 |

### 响应参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| state | 否 | boolean | 响应结果：true-成功；false-失败 |
| code | 否 | int | 响应码：0-成功；1-错误 |
| message | 否 | String | 错误信息 |

---

## 7. 发货单推送

**推送时机：** 发货单创建或状态变更时触发

### 请求参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| deliveryOrdersId | String | 发货单ID |
| deliverOrderNo | String | 发货单号 |
| orderNo | String | 订单编号 |
| shopId | String | 当前商品所属店铺ID |
| outShopId | String | 外部店铺ID |
| tradeNo | String | 平台交易单号 |
| deliveryDate | String | 发货时间 |
| sourceCreateDate | String | 订单创建时间 |
| postAmount | BigDecimal | 运费 |
| goodsWeight | BigDecimal | 重量 |
| systemLogisticsCompanyCode | String | 快递公司编码 |
| logisticsNo | String | 快递单号（运单号） |
| logisticsCompanyNameZh | String | 快递公司 |
| orderKind | String | 订单类别 |
| expressType | String | 业务类型 |
| payAmount | BigDecimal | 付款金额 |
| platformPromotionAmount | BigDecimal | 店铺让利金额 |
| orderAgioAmount | BigDecimal | 平台让利金额 |
| shopArrivalAmount | BigDecimal | 店铺到账金额 |
| receiverName | String | 收件人名称 |
| receiverMobile | String | 收件人手机 |
| receiverPhone | String | 收件人电话 |
| receiverProvince | String | 收件人省份 |
| receiverCity | String | 收件人城市 |
| receiverDistrict | String | 收件人区/县级市 |
| receiverAddress | String | 收件人地址 |
| payDate | String | 付款时间 |
| operationDate | String | 操作时间 |
| orderStatus | String | 单据状态 |
| platformCode | String | 平台编号 |
| deliveryStatus | String | 发货状态 |
| warehouseName | String | 发货仓库 |
| warehouseId | Long | 发货仓库id |
| outWarehouseId | Long | 外部仓库ID |
| oriChangeOrderNo | String | 当前发货单原换货单号 |
| remark | String | 系统备注 |
| sellerMessage | String | 卖家留言 |
| buyerMessage | String | 买家留言 |
| sendName | String | 发件人名称 |
| sendProvince | String | 发件人省份 |
| sendCity | String | 发件人城市 |
| sendDistrict | String | 发件人区/县级市 |
| sendAddress | String | 发件人地址 |
| sendMobile | String | 发件人手机 |
| sendPhone | String | 发件人电话 |
| sendZipCode | String | 发件人邮编 |
| bicOrderCode | String | BIC订单码 |
| shopCode | String | 店铺编码 |
| platformWarehouseCode | String | 平台仓库编码 |
| externalStorageCode | String | 仓储仓库代码 |
| desensitizeReceiverName | String | 脱敏后的收件人名称 |
| desensitizeReceiverMobile | String | 脱敏后的收件人手机 |
| desensitizeReceiverPhone | String | 脱敏后的收件人电话 |
| desensitizeReceiverAddress | String | 脱敏后的收件人地址 |
| merchantSubsidyAmount | String | 卖家承担的优惠金额 |
| enterpriseId | String | 企业号 |
| shopName | String | 店铺名称 |
| logisticsCompanyCode | String | 物流公司编码 |
| insuranceType | String | 保价类型 |
| insureFlag | String | 是否保价 |
| insuranceAmount | BigDecimal | 保价金额 |
| postAmountPromotion | BigDecimal | 运费优惠 |
| deliveryOrdersGoodsList | array | 发货订单商品明细列表 |
| ordersPayList | array | 发货单支付方式列表 |
| ordersInvoice | array | 订单发票明细列表 |

### 发货订单商品明细参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| outGoodsId | Long | 外部商品ID |
| outKindId | Long | 外部类别ID |
| outUnitId | Long | 外部单位ID |
| goodsCode | String | 商品编码 |
| goodsName | String | 商品名称 |
| unit | String | 商品单位 |
| goodsSpecs | String | 商品规格 |
| quantity | BigDecimal | 购买数量 |
| realPrice | BigDecimal | 实际售价 |
| payAmount | BigDecimal | 实际金额 |
| taxRate | BigDecimal | 税率 |
| taxType | String | 税率类型：0-含税；1-免税；2-未税 |
| combinationFlag | String | 商品组合类型：0-普通商品；1-组合父商品；2-组合子商品 |
| tradeNo | String | 交易单号 |
| deliverOrderNo | String | 发货单号 |
| agioAmount | BigDecimal | 折扣金额 |
| afterAgioAmount | BigDecimal | 让利后金额 |
| platformGoodsName | String | 平台商品名称 |
| platformGoodsSpecs | String | 平台商品规格 |
| gift | String | 是否赠品：1-赠品；0-不是赠品 |
| authorId | String | 直播主播id（达人id） |
| authorName | String | 直播主播名称（达人姓名） |
| picUrl | String | 图片链接 |
| ordersBatchs | List[String] | 商品唯一码列表 |
| useGovSubsidy | String | 是否使用国补：0-否；1-是 |
| ordersBatchsAndSn | array | 商品唯一码和SN码列表 |
| supplierShopId | String | 销售公司ID |
| supplierShopName | String | 销售公司名称 |
| platformPromotionAmount | BigDecimal | 平台优惠金额 |
| shopPromotionAmount | BigDecimal | 店铺优惠金额 |
| govPromotionAmount | BigDecimal | 电商国补金额 |
| paymentPromotionAmount | BigDecimal | 支付渠道国补金额 |
| platformPaymentPromotionAmount | BigDecimal | 支付渠道优惠（平台承担） |
| shopPaymentPromotionAmount | BigDecimal | 支付渠道优惠（商家承担） |
| externalDetailNo | String | 外部系统单据行号 |

### 订单发票明细参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| invoiceKind | String | 发票种类：1-增值专用发票；2-增值普通发票 |
| invoiceTitleKind | String | 发票种类：1-个人；2-企业 |
| invoiceTitleType | String | 发票类型：1-纸质发票；2-电子发票 |
| invoiceTitle | String | 发票抬头 |
| invoiceContent | String | 发票内容 |
| taxpayerNumber | String | 纳税人识别号 |
| depositBank | String | 开户行 |
| invoiceAmount | BigDecimal | 发票金额 |
| phone | String | 电话 |
| address | String | 地址 |
| remark | String | 备注 |
| unvoiceAmount | BigDecimal | 未开票金额 |
| accounts | String | 帐号 |

### 支付方式参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| payTypeCode | String | 支付方式编码：1-支付宝；2-微信；3-线下支付；4-在线支付；5-代收货款；6-银行转账 |
| payTypeName | String | 支付方式名称 |
| orderNo | String | 订单编号 |

### 商品唯一码和SN码列表明细

| 参数名 | 类型 | 说明 |
|--------|------|------|
| batchNo | String | 唯一码 |
| sn | String | sn码 |

---

## 8. 退货单推送

**推送时机：** 退货单创建或状态变更时触发

### 请求参数

| 参数名 | 类型 | 说明 |
|--------|------|------|
| shopPlatformCode | String | 平台编码 |
| deliverReturnOrderId | String | 退货单ID |
| deliverOrderNo | String | 发货单号 |
| deliverReturnOrderNo | String | 退货单号 |
| orderNo | String | 订单编号 |
| tradeNo | String | 平台交易单号 |
| shopId | String | 当前商品所属店铺ID |
| outShopId | String | 外部店铺ID |
| shopName | String | 店铺名称 |
| platformReturnNo | String | 平台退货单号 |
| orderSourceCode | String | 建单类型：1-手工建单；2-平台单 |
| returnWarehouseId | String | 退回仓库id |
| returnWarehouseName | String | 退回仓库 |
| changeWarehouseId | String | 换货的仓库id |
| changeWarehouseName | String | 换货仓库 |
| returnLogisticsCompanyId | String | 退回物流公司Id |
| changeLogisticsCompanyId | String | 换出物流公司id |
| returnLogisticsNo | String | 退回运单号 |
| refundAmount | String | 退款金额 |
| returnDate | String | 退回入仓时间 |
| remark | String | 备注 |
| receiverName | String | 收件人名称 |
| receiverMobile | String | 收件人手机 |
| receiverPhone | String | 收件人电话 |
| receiverProvince | String | 收件人省份 |
| receiverCity | String | 收件人城市 |
| receiverDistrict | String | 收件人区/县级市 |
| receiverAddress | String | 收件人地址 |
| encryptReceiverCode | String | 加密收件人编码 |
| refundReason | String | 退款原因 |
| agreeToReturn | String | 审核状态 |
| urgentOrder | String | 加急订单 |
| status | String | 收货入仓状态 |
| createDate | String | 创建时间 |
| statusDate | String | 收货入仓时间 |
| agreeDate | String | 审核时间 |
| creator | String | 创建人 |
| returnType | String | 退货类别 |
| shopCode | String | 店铺编码 |
| platformWarehouseCode | String | 平台仓库编码 |
| externalStorageCode | String | 仓储仓库代码 |
| returnKind | String | 退货类别 |
| platformReturnStatus | String | 平台退货状态 |
| refundableAmount | String | 应退金额 |
| returnOrdersGoodsList | array | 退回商品列表 |
| changeOrdersGoodsList | array | 换出商品列表 |

### 退货/换货商品明细

| 参数名 | 类型 | 说明 |
|--------|------|------|
| tradeNo | String(50) | 交易单号 |
| goodsCode | String(50) | 商品编码 |
| outGoodsId | Long(20) | 外部商品ID |
| goodsName | String(400) | 商品名称 |
| unit | String(100) | 商品单位 |
| goodsSpecs | String(100) | 规格名称 |
| quantity | BigDecimal | 商品数量 |
| price | BigDecimal | 标准售价 |
| amount | BigDecimal | 标准金额 |
| realPrice | BigDecimal | 实际售价 |
| payAmount | BigDecimal | 实际金额 |
| agioAmount | BigDecimal | 折扣金额 |
| taxRate | BigDecimal | 税率 |
| taxType | String | 税率类型：0-含税；1-免税；2-未税 |
| remark | String(100) | 备注 |
| ordersBatchs | List[String] | 商品唯一码列表 |
| useGovSubsidy | String | 是否使用国补：0-否；1-是 |
| ordersBatchsAndSn | array | 商品唯一码和SN码列表 |

### 响应参数

| 参数名 | 必选 | 类型 | 说明 |
|--------|------|------|------|
| state | 否 | boolean | 响应结果：true-成功；false-失败 |
| code | 否 | int | 响应码：0-成功；1-错误 |
| message | 否 | String | 错误信息 |
