合作商家拥有门店打印小票设备、门店拣打作业一系列管理流程和系统保障。并且商家期望保持原有门店作业流,为此同城零售共享库存方案为商家提供店仓作业开放能力。
商家店仓系统可承接同城零售作业任务。
场景:
1、REX履约中台下发外部仓拣货作业任务,仓接收任务后进行拣货、打包 并回传履约中台状态。
2、仓内作业取消:在仓内作业未完成前,用户取消订单,履约下发仓作业取消。
3、仓逆向:仓打包出库后的逆向退货退仓,REX履约中台会下发退仓单,商家仓进行库存入库,并回执结果。
作业下发、取消、退仓下发三个接口,是REX中台通过奇门调用商家,商家接收任务消息
商家必须进入奇门关联场景“五道口履约场景” 并完成平台接口配置
奇门入驻配置手册:https://hema.open.taobao.com/doc?docId=108926&docType=1
关联场景(奇门官方老场景): 五道口履约场景
TOP网关权限:
作业单回传、退仓单回传两个接口,是商家门店作业处理完成后调用TOP接口同步REX平台。开发接口前联系开放技术支持开通权限包。
APPKEY应用权限扩包“五道口履约域”--------用于回传接口
业务提醒:
半日达奇门防止订单丢失方案:
sourceOrderIds 猫超主订单,因为上线门店多的话同个物流点有多个门店,业务上可能会出现,用户一个订单买了两个或多个门店的商品,
就会有 一个用户主订单,子单被拆分成多个作业单下发给门店。
如果以作业单中同城令牌workOrderUnitId 作为记录,是不会有问题的,一个作业单,对应一个同城令牌。
不建议使用,用户主订单(猫超主订单)sourceOrderIds 做记录或幂等,容易丢失后面的作业信息。
履约小票样式(保证小票实例上的参数信息必须存在):
小时达小票模板
业务 |
接口名称 |
api |
网关 |
履约 |
仓作业单下发接口 |
奇门 |
|
仓作业单-回传接口 |
TOP |
||
仓作业取消单下发接口 |
奇门 |
||
仓退仓单下发接口 |
奇门 |
||
仓退仓单-回传接口 |
alibaba.wdk.fulfill.bill.return.warehouse.on.task.status.changed |
TOP |
接口名称:qimen.alibaba.wdk.fulfill.warehouse.order.dispatch
接口用途:履约已完成集批动作,同步通知作业单内容到外部仓储进行门店作业.
请求参数:
名称 |
参数类型 |
是否必须 |
示例值 |
描述 |
workOrder |
WorkOrder |
可选 |
|
作业单 |
└ workOrderId |
String |
必须 |
34354354353 |
作业单号(履约批次号) |
└ workOrderName |
String |
必须 |
171215-中一区B-08:00-08:30 |
作业单名称 |
└ merchantCode |
String |
必须 |
TCCSSJ |
商户编码 |
└ nodeCode |
String |
必须 |
UDTCCSSJ |
节点编码(店仓编码) |
└ earliestArriveTime |
String |
必须 |
2017-04-26 19:17:55 |
作业单最早送达时间,格式: yyyy-MM-dd HH:mm:ss |
└ latestArriveTime |
String |
必须 |
2017-04-26 19:47:55 |
作业单最晚送达时间,格式: yyyy-MM-dd HH:mm:ss |
└ isTest |
Boolean |
必须 |
TRUE |
是否测试单 |
└ workOrderUnits |
WorkOrderUnit[] |
必须 |
|
作业单元;fulfillOrderList最大列表长度:100 |
└ workOrderUnitId |
String |
必须 |
半日达:204564536545231 |
半日达下发“”同城令牌号 小时达下发:履约主单号 |
└ sourceFrom |
String |
必须 |
TC |
订单来源:MEITUAN("美团"),ELEME("饿了么"),TDD("淘点点"),BAIDU("百度"),WEIXIN("微信"),TC("自营"),DAILY_FRESH("每日优鲜") |
└ earliestArriveTime |
String |
必须 |
2017-04-26 19:17:55 |
最早开始时间 |
└ latestArriveTime |
String |
必须 |
2017-04-26 19:47:55 |
最晚送达时间 |
└ orderTime |
String |
必须 |
2017-04-26 10:15:00 |
下单时间 |
└ receiver |
Receiver |
必须 |
|
收货人对象 |
└ receiverName |
String |
必须 |
张三 |
收货人姓名 |
└ receiverPhone |
String |
必须 |
1341432334 |
收货人电话 |
└ receiverAddress |
String |
必须 |
上海市长宁区新兴路1号 |
收货人地址 |
└ workOrderUnitContents |
WorkOrderUnitContent[] |
必须 |
|
作业内容;最大列表长度:999999 |
└ workUnitContentId |
String |
必须 |
645234534 |
作业内容单号(fulfillSubOrderId作业子单号) |
└ subSourceOrderId |
String |
必须 |
7685678 |
外部子单号(猫超子订单号) |
└ skuCode |
String |
必须 |
465465 |
REX平台商品编码 |
└ skuName |
String |
必须 |
可口可乐 |
商品名称 |
└ saleUnit |
String |
必须 |
瓶 |
销售单位 |
└ stockUnit |
String |
必须 |
箱 |
库存单位 |
└ expectSaleQuantity |
String |
必须 |
1 |
销售单位购买数量 |
└ expectStockQuantity |
String |
必须 |
1 |
库存单位购买库数量 |
└ isStandardSku |
Boolean |
必须 |
TRUE |
是否是标品 |
└ isGift |
Boolean |
必须 |
TRUE |
是否赠品 |
└ status |
String |
可选 |
CANCELED |
状态: CANCELED("取消"),为空该商品可以正常捡货 |
└ operationalRequirement |
OperationalRequirement |
可选 |
|
作业要求 |
└ processService |
String |
可选 |
宰杀 |
加工服务 |
└ thermosphere |
String |
可选 |
常温 |
温层要求 |
└ attribute |
String |
可选 |
{ } |
预留扩展 |
└ shopCode |
String |
必须 |
1234 |
前端销售门店编码 |
└ sourceOrderIds |
String [] |
必须 |
45364565 |
外部订单号集合,可能1对多(猫超主订单号,一单一批或多单一批) |
└ attribute |
String |
可选 |
{"pickupCode":"123","containerCodes":["123","456"]," businessSourceFrom":"MAOCHOA_SELLER", "batchStrategy":"O2O/O2O_HALF_DAY"}; |
扩展字段Map。取件码key是pickupCode;业务来源key是businessSourceFrom,value取值MAOCHOA_SELLER代表猫超共享库存,value取值TAOBAO_SELLER代表淘鲜达;batchStrategy是作业策略,O2O代表小时达,O2O_SELF_TAKE_AT_SHOP代表自提 O2O_HALF_DAY半日达 |
└ attribute |
String |
可选 |
{ } |
预留扩展 |
API出参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
success |
Boolean |
必须 |
ture |
是否成功 |
respCode |
String |
必须 |
SUCCESS |
响应code |
respMessage |
String |
必须 |
下发成功 |
响应提示信息 |
接口名称:alibaba.wdk.fulfill.warehouse.work.order.callback
接口用途:由仓系统将作业节点状态拣货完成、打包完成回传到履约中心,包括缺货出情况。
注意:拣货完成和打包完成是必须回传的节点 PICK_FINISH(“拣货完成”),PACKAGE_FINISH(“打包完成”);
提醒:加上重试机制,避免因为接口异常情况返回错误无法正常回传任务。重试需要识别 is_success 进行重试为false业务处理失败需要重试
请求参数:
callback_order |
DrfHalfDayCcCallbackOrder |
可选 |
作业单回传对象 |
|
└status_change_time |
String |
必须 |
2017/4/2619:17 |
作业状态变更时间 |
└status_change_type |
String |
必须 |
START_PICK |
作业状态变更类型:START_PICK(“开始拣货”), PICK_FINISH(“拣货完成”),START_PACKAGE(“开始打包”), PACKAGE_FINISH(“打包完成”); 拣货完成和打包完成必传,拣货在前打包在后 |
└node_code |
String |
必须 |
ERPCSMD |
店/仓编码 |
└work_order_type |
String |
必须 |
BATCH |
作业单类型:BATCH("批次"),ORDER("物流单 默认传:BATCH |
└work_order_id |
String |
必须 |
450834096721030400 |
作业单号 |
└callback_units |
DrfHalfDayCcCallBackUnit[] |
必须 |
作业单元最大列表长度:100 |
|
└callback_contents |
DrfHalfDayCcCallBackContent[] |
必须 |
作业内容最大列表长度:100 |
|
└is_shortage |
Boolean |
必须 |
false |
是否缺货出 缺货;true 不缺:false |
└sku_name |
String |
必须 |
帝王蟹 |
商品名称 |
└sku_code |
String |
必须 |
1231213 |
商品编码 |
└out_of_stock_stock_quantity |
String |
必须 |
0 |
缺货出库存数量 |
└out_of_stock_sale_quantity |
String |
必须 |
0 |
缺货出销售数量 |
└actual_stock_quantity |
String |
必须 |
1 |
实际库存拣货数量 |
└actual_sale_quantity |
String |
必须 |
1 |
实际销售拣货数量 |
└work_unit_content_id |
String |
必须 |
252927176121030420 |
作业内容单号,履约子单号 |
└attribute |
String |
可选 |
{"exchangeGoods":[ {"skuCode":"122","skuname":"商品名称","actualSaleQuantity":1,"actualStockQuantity":1}], "containerType":"1","containerCodes":["123","456"]} |
作业内容扩展属性 |
└same_town_packages |
SameTownPackage[] |
可选 |
子单出库关联的同城令牌最大列表长度:999 |
|
└token_code |
String |
可选 |
2.11235E+17 |
令牌号 |
└pickup_code |
String |
可选 |
124567 |
6位交接码 |
└actual_sale_quantity |
String |
可选 |
1 |
包裹中商品出库销售数量 |
└actual_stock_quantity |
String |
可选 |
1.2 |
包裹中商品出库库存数量 |
└container |
Container |
可选 |
|
周转箱 |
└container_type |
String |
可选 |
NORMAL_BOX("周转箱"),INSULATION_BOX("保温箱") ,SKU_PACK("异形件sku捆绑,不能装入箱子,需要另外打包") |
容器类型 |
└container_code |
String |
可选 |
DRF12345678 |
容器编码 |
└work_order_unit_id |
String |
可选 |
56876877 |
半日达传同城令牌号) 小时达传:履约主单号 对应字段:workOrderUnitId |
└attribute |
String |
可选 |
{"exchangeGoods": [{"skuCode":"122","skuname":"商品名称","actualSaleQuantity":1,"actualStockQuantity":1}], "containerType":"1","containerCodes":["123","456"]} |
作业单元扩展属性 |
└is_final |
Boolean |
必须 |
false |
是否作业节点终态 正常或部分缺作业:拣货回false;打包回true; 全缺货:拣货回true
|
└operator |
Operator |
必须 |
操作员 |
|
└operator_code |
String |
必须 |
8888 |
操作员编码 |
└operator_name |
String |
必须 |
李四 |
操作员姓名 |
containers |
Container[] |
必须 |
|
容器列表,最大列表长度:200。波次达必须,小时达不必须 |
└ container_type |
String |
必须 |
NORMAL_BOX("周转箱"),INSULATION_BOX("保温箱"),SKU_PACK("异形件sku捆绑,不能装入箱子,需要另外打包") |
容器类型,默认传SKU_PACK |
└ container_code |
String |
必须 |
|
容器编码半日达传同城令牌号) 小时达传:履约主单号 对应字段:workOrderUnitId |
接口响应
名称 | 参数类型/SDK类型 | 是否必须 | 示例值 | 描述 |
is_success | Boolean | 必须 |
true |
是否成功 成功:true 失败false |
resp_message | String | 否 |
回传成功 | 响应提示信息 |
resp_code | String | 否 |
SUCCESS | 响应code |
接口名称:qimen.alibaba.wdk.fulfill.work.order.cancel.by.unit.content
接口描述:履约取消子作业单,同步给仓系统,需要仓系统对相关取消子作业单进行拦截。
提醒:小时达按照商品维度下发取消单:例如5个商品取消就是5个取消单,半日达所有商品一起下发
API 出参需要以子单维度处理 data字段 需要包含子单数据
接口参数:
API入参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
cancelRequest |
CancelRequest |
必须 |
|
取消请求 |
└ workOrderId |
String |
必须 |
42543513 |
作业单号(履约批次号) |
└ nodeCode |
String |
必须 |
65787 |
作业节点编码 |
└ workOrderUnitId |
String |
必须 |
32534252132 |
作业单元单号(履约单号) 半日达下发“”同城令牌号 小时达下发:履约主单号 |
└ workUnitContentIds |
String [] |
必须 |
|
作业内容号列表(fulfillSubOrderId履约子单号);最大列表长度:999 |
API出参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
success |
Boolean |
必须 |
TRUE |
是否成功 |
respCode |
String |
必须 |
SUCCESS |
响应code |
respMessage |
String |
必须 |
下发成功 |
响应提示信息 |
data |
ResultDetail[] |
必须 |
|
单据取消结果列表 |
└ bizNo |
String |
必须 |
2521868216312 |
业务单据号(作业单元Id;履约子订单) |
└ resultCode |
String |
必须 |
SUCCESS |
单据操作结果:SUCCESS 已拦截(仓内作业不出库,配送作业不配送到客户); FAILURE:未拦截 |
└ resultDesc |
String |
必须 |
已拦截 |
返回码含义描述 |
接口名称:qimen.alibaba.wdk.fulfill.do.return.warehouse.task
接口用途:当订单打包出库之后发生售中取消,拒收,及售后退货时,由履约下发退仓单,通知仓系统完成入库。
提醒;因为退仓单是配送创建,如果有多单一个门店会合在一起处理下发,需要商家系统支持识别到正向单号进行处理
请求参数:
API入参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
returnWarehouseBill |
ReturnWarehouseBill |
必须 |
|
退仓单 |
└ returnWarehouseBillId |
String |
必须 |
2343243241 |
退仓单号 |
└ warehouseCode |
String |
必须 |
DRF1102 |
仓编码 |
└ sourceMerchantCode |
String |
必须 |
DARUNFA |
来源商家编码 |
└ sourceNodeCode |
String |
必须 |
UDDRF1001 |
来源配送站编码\仓编码(若存在配送站,给配送站编码;若不存在配送站,给仓编码) |
└ contactInfo |
String |
可选 |
手机号:3334443434 |
联系方式 |
└ remark |
String |
可选 |
退仓 |
备注 |
└ isTest |
Boolean |
必须 |
TRUE |
是否测试单 |
└ containerList |
String [] |
必须 |
|
容器列表;最大列表长度:999 |
└ isVirtual |
Boolean |
必须 |
FALSE |
是否是虚拟退仓单 |
└ skuInfoList |
ReverseSkuInfo[] |
必须 |
|
子单列表;最大列表长度:999 |
└ reverseFulfillOrderId |
String |
必须 |
4352345 |
逆向履约主单号 |
└ reverseFulfillSubOrderId |
String |
必须 |
2341241324 |
逆向履约子单号 |
└ relatedFulfillOrderId |
String |
必须 |
13423324 |
关联的正向履约单号:workOrderUnitId |
└ relatedFulfillSubOrderId |
String |
必须 |
2435345345 |
关联的正向履约子单号: |
└ relatedSourceOrderId |
String |
必须 |
4563345654 |
关联的正向淘系交易主单号: |
└ relatedSubSourceOrderId |
String |
必须 |
34546436 |
关联的正向淘系交易子单号 |
└ relatedBizOrderId |
String |
可选 |
3454354 |
关联的正向REX交易主单号 |
└ relatedSubBizOrderId |
String |
必须 |
324535345 |
关联的正向REX交易子单号 |
└ reverseSaleOrderCode |
String |
可选 |
5464536345 |
REX逆向退货单号 |
└ refundId |
String |
可选 |
43534 |
退款单号 |
└ orderChannel |
String |
必须 |
APP |
销售渠道:"POS","APP" |
└ reverseOrderSource |
String |
必须 |
AFTER_SALE |
逆向单来源: 1,AFTER_SALE (售后退货); 2,IN_SALE(售中取消); |
└ skuCode |
String |
必须 |
100344 |
商品编码 |
└ skuName |
String |
必须 |
可口可乐 |
商品名称 |
└ stockUnit |
String |
必须 |
瓶 |
库存单位 |
└ isStandardSku |
Boolean |
必须 |
TRUE |
是否是标品:true(“标品”),false(“非标品”) |
└ refundStockQuantity |
String |
必须 |
10 |
退款数量(库存单位) |
└ shouldFetchStockQuantity |
String |
必须 |
10 |
应取数量(库存单位) |
└ enterDockStockQuantity |
String |
必须 |
8 |
入站数量(库存单位) |
└ returnBoundStockQuantity |
String |
必须 |
6 |
退仓数量(库存单位) |
└ customerLossStockQuantity |
String |
必须 |
0 |
客损数量(库存单位):退款数量-应取数量 |
└ riderLossStockQuantity |
String |
必须 |
2 |
骑手损数量(库存单位):应取数量-入站数量 |
└ deliveryLossStockQuantity |
String |
必须 |
2 |
站损数量(库存单位): 入站数量-退仓数量 |
└ sourceSellerId |
String |
可选 |
725677994 |
卖家id |
API出参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
success |
Boolean |
否 |
TRUE |
调用是否成功 |
errorCode |
String |
否 |
SYSTEM_ERROR |
错误码 |
errorDesc |
String |
否 |
系统异常 |
返回码含义描述 |
接口名称:alibaba.wdk.fulfill.bill.return.warehouse.on.task.status.changed
接口用途:仓系统将退仓入站结果回传通知履约。
请求参数:
API入参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
return_warehouse_result |
ReturnWarehouseResult |
必须 |
|
退仓结果 |
└warehouse_code |
String |
必须 |
ERPCSMD |
店/仓编码, |
└return_warehouse_bill_id |
String |
必须 |
427123432421352 |
退仓单号 |
└sku_info_list |
ReverseSkuInfo[] |
必须 |
|
子订单信息列表;最大列表长度:999 |
└warehouse_loss_stock_quantity |
String |
必须 |
2 |
仓内报损数量(退仓数量-实际入库数量) |
└actual_in_bound_stock_quantity |
String |
必须 |
4 |
实际入库数量(库存单位) |
└sku_code |
String |
必须 |
102010001 |
商品编码 |
└reverse_fulfill_order_id |
String |
必须 |
34453543 |
逆向履约单号 |
└reverse_fulfill_sub_order_id |
String |
必须 |
456345643 |
逆向履约子单号 |
└warehouse_loss_reason_list |
WarehouseLossReason[] |
可选 |
|
仓内报损原因列表;最大列表长度:20 若有报损以下信息必须回传 |
└warehouse_loss_reason |
String |
可选 |
商品破损 |
报损原因描述 |
└warehouse_loss_reason_code |
String |
可选 |
001 |
报损原因编码 001:商品破损 002:商品过期 |
└warehouse_loss_stock_quantity |
String |
可选 |
2 |
仓内报损数量 |
└related_fulfill_order_id |
String |
必须 |
345435345 |
关联的正向(同城令牌) |
└related_fulfill_sub_order_id |
String |
必须 |
234234324 |
关联的正向履约子单号 |
API出参 |
||||
名称 |
参数类型/SDK类型 |
是否必须 |
示例值 |
描述 |
result |
FulfillVoidResult |
必须 |
|
fulfillVoidResult |
└error_desc |
String |
可选 |
系统异常 |
返回码含义描述 |
└error_code |
String |
可选 |
SYSTEM_ERROR |
返回码(success=false时不能为空):SYSTEM_ERROR:系统异常(指令可重发)PARAM_ERROR:参数错误(指令不可重发,监控报警)BUSINESS_ERROR:业务异常(指令不可重发,监控报警) |
└success |
Boolean |
必须 |
FALSE |
true调用成功false调用失败 |
提醒:下发接口会重试吗?
作业下发:1分钟一次,24小时内循环, 取消下发失败,重试18次,18次后不再重试。 退仓单下发重试60次,1分钟一次。