技术文档
方法相同入参 AOP 使用说明
Shopee 刊登业务梳理文档
亚马逊刊登相关业务知识
刊登监控设计方案
亚马逊跟卖设计
Fanno 刊登业务梳理文档
日志收集 方案设计
PIB 刊登方案设计
Temu 刊登方案设计
ShopTokenInfo Aop集成MBC方案
香港定时卡刊登任务方案
push-message 、receive-message 省流方案
OZON 刊登方案设计
Lazada视频上传方案
广州同步店铺框架搭建
Shopify翻版
Amazon交接
TikTok 由global模式切换replicate模式调研
tiktok 折扣活动对接方案
Target 初期调研
本文档使用 MrDoc 发布
-
+
首页
Fanno 刊登业务梳理文档
### # 官方文档地址 ``` https://bytedance.feishu.cn/docs/doccn2WsZGsJpk5T8ALpVL9dZPh?appStyle=UI4&domain=www.feishu.cn&locale=zh-CN&refresh=1&tabName=space&theme=light&userId=7004642702407057436 https://bytedance.feishu.cn/docs/doccnp9gDal0wq7PJZTCAuEqOJd ``` ### # 刊登商品业务方式 > Fanno 刊登分为 ```Global 店铺刊登``` 、```发布到 Local 店铺```两种。 >```Global 刊登```: Fanno 的商品都只能先刊登到 Global 店铺,每个用户都有一个 Global 店铺。Global 店铺只用于管理商品的 Listing,买家对该店铺的商品是不可见的,也就是说 Global 店铺的商品是无法下单的。Global 商品的编辑```会同步```给 已经发布到 Local 店铺的该商品。 > ```发布到 Local 店铺```: 用户可能在不同的站点拥有不用的 Local 店铺,这些店铺的商品只能从 Global 店铺发布过来,Local 店铺的商品是买家可见的,可以下单购买的。Local 店铺可以单独编辑商品、编辑库存、编辑价格等。但```不会同步```给 Global 店铺商品。 ### # 调度中心架构方式  # 关于 mdc-open-api-×× > ```【重要】```我们对外只暴露 open-api 的接口,无论是异步还是直调任务功能,我们的入口都是 open-api ,此方式架构便于管理全平台接口和核心服务的安全性,以及功能的解耦合。 > ```【重要】```我们所有的对外接口只提供 POST 方式的调用。这是由于各平台业务的复杂性导致的,我们很难使用 REST 方式或常规方式来因为业务迭代导致入参的可变性,因此强制所有入参使用 Body 中的 Json 对象方式传递。 > ```【重要】```我们所有的入参需要使用 ```@Validated``` 来校验入参参数的合理性和规范性。以此强制性校验方法减少入参数据因格式问题带来的刊登失败概率。 > ```【重要】```我们所有的对外接口都使用 ```RestResultVo``` 对象 Json 格式返回。 # 关于 mdc-open-api-publish > ```【重要】```mdc-open-api-publish 存放刊登相关的接口,Fanno 对应的刊登接口位于 ```com.mabang.open.controller.fanno.FannoPublishGlobalController```下,其中还有刊登前置操作的接口比如上传图片,和获取刊登结果的接口。 # 关于 mdc-open-api-product > ```【重要】```mdc-open-api-product 存放在线商品相关的接口,Fanno 对应的在线商品接口位于 ```com.mabang.open.controller.fanno.FannoProductGlobalController```和```com.mabang.open.controller.fanno.FannoProductLocalController```下,一个是Global的,一个是Local的。 # 关于 mdc-open-api-information > ```【重要】```mdc-open-api-product 存放基础信息相关的接口,基础信息包含刊登使用的类目、类目属性等数据,Fanno 对应的在线商品接口位于 ```com.mabang.open.controller.fanno.impl.FannoBaseInformationGlobalController```下,其中有获取类目、类目属性的接口。 # 关于 mdc-product-fanno > 所有的消息消费者都在 ```com.mabang.product.consumer```下。 ```FannoPublishConsumer```: 刊登的消费者 ```FannoSyncCategoryAttributeGlobalConsumer```: Global 属性拉取和推送的消费者 ```FannoSyncCategoryGlobalConsumer```: Global 类目拉取和推送消费者 ```FannoSyncProductGlobalConsumer```: Global 同步商品消费者 ```FannoSyncProductLocalConsumer```: Local 同步商品消费者 ```FannoSyncShopProductGlobalConsumer```: Global 同步店铺商品消费者 ```FannoSyncShopProductLocalConsumer```: Local 同步店铺商品消费者 > 平台直调接口都在 ```com.mabang.product.controller```下。 ```FannoProductController```: 在线商品操作直调接口(编辑商品、编辑价格、编辑库存、删除商品等) ```FannoPublishController```: 刊登商品操作相关直调接口(发布到子站点、上传图片) > 刊登商品流程: 1、从任务表查出待刊登的数据(表 ```mdc-product-task.t_fanno_global_task``` ) 2、组装刊登到平台的数据 -> FannoAddProductBo 3、提交刊登数据到平台,这个过程中还有生成签名等,生成签名的工具类是```SignatureUtil``` 4、解析返回的结果为对象```CreateProductResult``` 5、保存刊登的新商品的商品 ID 6、判断是否存在发布任务,有的话开始发布到 Local 店铺 7、获取发布的结果,记录发布到 Local 店铺的商品 ID。 8、保存刊登结果,记录成功或者失败到表,推送结果给 PHP。 tips: 刊登服务的入口```com.mabang.product.service.consumer.FannoConsumerService.addProductGlobal()``` > 店铺商品同步流程: Fanno 店铺商品同步目前是全量同步 1、查询本地的商品缓存,从平台查询店铺商品总数并推送。 ```java /** * 查询并推送total */ @Log(funt = "查询并推送total") private void selectTotal() { FannoSyncShopProductBo fannoAddProductBo = new FannoSyncShopProductBo().setPage_number(1).setPage_size(1); fannoService.syncShopProductGlobal(fannoAddProductBo, // 总数回调 total - > { // 推送总数 pushGlobalShopStatus(2, "拉取中", total); }, globalProduct - > {}, globalProduct - > {}); } ``` > 2、循环遍历商品状态(1-5)再循环分页拉取商品,拉到最后一页时记录最后一个商品。 ```java // 遍历商品状态 for(int productStatus = 1; productStatus < 5; productStatus++) { int pageNumber = 1; int pageSize = 50; while(true) { FannoSyncShopProductBo fannoAddProductBo = new FannoSyncShopProductBo().setPage_number(pageNumber++).setStatus(productStatus).setPage_size(pageSize); ProductListGlobalResult productListGlobalResult = null; try { int finalProductStatus = productStatus; productListGlobalResult = fannoService.syncShopProductGlobal(fannoAddProductBo, // 但状态总数回调 total - > {}, // 商品回调 globalProduct - > { productHashMap.remove(globalProduct.getId()); pushSyncProductGlobal(globalProduct, String.valueOf(finalProductStatus), null); }, // 最后一个商品回调 globalProduct - > { productHashMap.remove(globalProduct.getId()); lastGlobalProduct.set(globalProduct); lastProductStatus.set(finalProductStatus); }); } catch(Exception e) { if(e instanceof ShopProductPullCompleteException) { log.info("global店铺商品拉取完成。"); } else { log.error("商品列表拉取失败 => " + JSONObject.toJSONString(fannoAddProductBo) + " => " + ExceptionUtils.getStackTrace(e) + " : " + e.getMessage()); } break; } } } ``` > 3、修改店铺拉取状态 ```java // 修改店铺状态 updateShopItemStatus(shopTokenInfoThreadLocal.get().getShopId(), shopStatus, resultMessage); ``` > 4、处理已经不存在的商品,并推送 ```java // 处理已经不存在的商品 deleteAndPushDeletedProduct(productHashMap); ``` > 5、拉取站点子店铺商品(同步完 Global 的商品,关联的 Local 店铺也要同步) ```java // 拉取站点子店铺商品 pushSyncSiteProduct(consumerBaseBo); ``` > 6、最后一个商品携带店铺状态,如果最后一个商品不存在则直接推送状态。 ```java // 推送最后一个商品,并携带店铺状态 if(lastGlobalProduct.get() != null) { SyncProductConsumerBaseBo.ShopStatus shopStatus1 = new SyncProductConsumerBaseBo.ShopStatus(); shopStatus1.setShopStatus(shopStatus); shopStatus1.setResultMessage(resultMessage); pushSyncProductGlobal(lastGlobalProduct.get(), String.valueOf(lastProductStatus.get()), shopStatus1); } else { // 最后一个商品不存在 就直接推状态 pushGlobalShopStatus(shopStatus, resultMessage, null); } ``` > tips: 店铺商品同步服务的入口:```com.mabang.product.service.consumer.FannoConsumerService.syncShopProductGlobal()``` 和 ```com.mabang.product.service.consumer.FannoConsumerService.syncShopProductLocal()```
chenjunan
2022年8月30日 18:38
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码