java对接旺店通数据同步
生活随笔
收集整理的這篇文章主要介紹了
java对接旺店通数据同步
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
添加配置文件
erp:url: http://api.wangdian.cn/xxxx/sid: xxxxappkey: xxxxappsecret: xxxxxxxxxxxxxxxxxxxxxshopNo: 'xx' @Data @Configuration @ConfigurationProperties(prefix = "erp") public class ErpConfig {String url;String sid;String appkey;String appsecret;String shopNo; }業務實現
/*** 推送訂單到旺店通服務*/ @Slf4j @Component("wdtOrderLogisticsSyncTask") @AllArgsConstructor public class WdtOrderLogisticsSyncTask {@Autowiredprivate DeliveryService deliveryService;@Autowiredprivate DeliveryOrderService deliveryOrderService;@Autowiredprivate final OrderItemService orderItemService;@Autowiredprivate OrderService orderService;@Autowiredprivate final SysConfigMapper sysConfigMapper;//測試環境private final String baseUrl = "https://sandbox.wangdian.cn/openapi2/";//物流同步查詢private final String logisticsSyncQuery = "logistics_sync_query.php";//物流同步回寫private final String logisticsSyncAck = "logistics_sync_ack.php";/*** 獲取物流待同步的訂單*/public String wdtOrderLogisticsTask() {log.info("------- 推送訂單到旺店通服務 ----> 時間:" + DateUtils.dateToString(new Date()));SysConfig wdtParamKey = sysConfigMapper.queryByKey("WDT_PARAM_KEY");if(Validator.isEmpty(wdtParamKey) || Validator.isEmpty(wdtParamKey.getParamValue())){log.error("====== 推送訂單到旺店通失敗,旺店通賬戶參數配置異常!======>>>> ");return "";}Map<String,String> wdtParam = FastJsonHelper.stringToCollect(wdtParamKey.getParamValue());//查詢所有的未推送 且待發貨狀態的訂單列表String responseStr = selectLogisticsWdt(wdtParam);//解析響應參數JSONObject stringToMap = JSONObject.parseObject(responseStr);//狀態碼:0表示成功,其他表示失敗if(!Validator.equal(stringToMap.get("code").toString(),"0")){log.error("====== 查詢旺店通物流信息同步接口請求錯誤 ======>>>> 旺店通返回信息:{}",responseStr);return responseStr;}else {log.info("====== 查詢旺店通物流信息同步接口請求成功 ======>>>> {}",responseStr);//設置訂單發貨List<TreeMap<String, String>> logisticsList = orderDelivery(stringToMap);if(logisticsList.size() == 0){log.info("====== 旺店通物流信息同步完成,暫無訂單信息需要同步。 ======>>>>");return "";}//物流同步回寫請求參數TreeMap<String,String> mapParam = new TreeMap<>();mapParam.put("logistics_list",FastJsonHelper.toJSONString(logisticsList));//請求旺店通 物流同步回寫 接口String responseSyncStr = logisticsSyncAckWdt(mapParam,wdtParam);//解析響應參數JSONObject responseSyncMap = JSONObject.parseObject(responseSyncStr);//狀態碼:0表示成功,其他表示失敗if(Validator.equal(responseSyncMap.get("code").toString(),"0")){log.info("====== 旺店通物流信息同步回寫接口請求成功 ======>>>>");}else {log.error("====== 旺店通物流信息同步回寫接口請求失敗 ======>>>> 旺店通返回信息:{}",responseSyncStr);}return responseSyncStr;}}/*** 解析旺店通物流同步返回數據并處理本地本地訂單發貨* @param jsonObject*/private List<TreeMap<String,String>> orderDelivery(JSONObject jsonObject) {List<LogisticsSyncVO> trades = FastJsonHelper.toList(jsonObject.get("trades").toString(), LogisticsSyncVO.class);if(Validator.isEmpty(trades)){return new ArrayList<>();}//同步成功的物流回寫列表List<TreeMap<String,String>> logisticsList = new ArrayList<>();//遍歷待同步的物流信息for (LogisticsSyncVO trade : trades) {//單個物流同步回寫訂單信息TreeMap<String,String> logisticsSyncAckParam = new TreeMap<>();//回寫的記錄idlogisticsSyncAckParam.put("rec_id",trade.getRec_id());//判斷是否已發貨Order order = orderService.getOrderByOrderNumber(trade.getTid());if(Validator.isNotEmpty(order)){//訂單狀態 1:待付款 2:待發貨 3:待收貨 4:待評價 5:成功 6:失敗 7:待成團if(!Validator.equal(order.getStatus(),2)){//如果當前訂單不是代發貨狀態 回調旺店通 通知下次不用發送該訂單//回寫狀態 回寫狀態: 0成功 1失敗logisticsSyncAckParam.put("status","0");//保存到已更新列表里logisticsList.add(logisticsSyncAckParam);continue;}}else {// 如果該訂單查詢不到 則跳過本次循環// 回調旺店通 通知下次不用發送該訂單logisticsSyncAckParam.put("status","0");//保存到已更新列表里logisticsList.add(logisticsSyncAckParam);continue;}//獲取物流類型 具體類型詳見 旺鋪通-API文檔-物流代碼表String logisticsType = trade.getLogistics_type();//查詢本地物流表是否有該物流信息Delivery delivery = deliveryService.getOne(Wrappers.<Delivery>lambdaQuery().eq(Delivery::getLogisticsType, logisticsType).last(" LIMIT 1 "));//如果是空 則添加一條該物流信息if(Validator.isEmpty(delivery)){delivery = new Delivery();delivery.setLogisticsType(logisticsType);//類型delivery.setDvyName(trade.getLogistics_name());//物流名字//保存該條物流信息deliveryService.save(delivery);}//組裝訂單物流信息DeliveryOrderItemParam deliveryOrderParam = new DeliveryOrderItemParam();deliveryOrderParam.setOrderNumber(trade.getTid());deliveryOrderParam.setDvyId(delivery.getDvyId());deliveryOrderParam.setDvyFlowId(trade.getLogistics_no());// 1-自己聯系快遞 3-無需快遞 4-同城配送deliveryOrderParam.setDeliveryType(1);List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(trade.getTid(), 1);deliveryOrderParam.setSelectOrderItems(orderItemsByOrderNumber);//設置是旺店通發貨標識deliveryOrderParam.setIsWdt(1);//捕捉異常防止全部更新失敗try {//發貨操作deliveryOrderService.saveDeliveriesInfo(deliveryOrderParam);//回寫狀態 回寫狀態: 0成功 1失敗logisticsSyncAckParam.put("status","0");}catch (Exception e){log.error("====== 訂單物流同步本地更新失敗,訂單號:{} ======>>>> 錯誤信息:{}",trade.getTid(),e);//回寫狀態 回寫狀態: 0成功 1失敗logisticsSyncAckParam.put("status","1");}//保存到已更新列表里logisticsList.add(logisticsSyncAckParam);}return logisticsList;}/*** 查詢旺店通物流同步 PS:后臺發貨接口:/orderItemsDelivery* @return*/public String selectLogisticsWdt(Map<String,String> wdtParam) {log.info("進入查詢旺店通物流同步通方法============>>>>>>> 時間:" + DateUtils.dateToString(new Date()));try {TreeMap<String,String> mapParam = new TreeMap();//構建請求參數//獲取條數mapParam.put("limit","50");//店鋪編號mapParam.put("shop_no",wdtParam.get("shop_no"));//wdtParam.get()//構建請求對象WdtClient client = new WdtClient(wdtParam.get("sid"), wdtParam.get("appkey"), wdtParam.get("appsecret"), wdtParam.get("baseUrl"));// 發送HTTP請求...String response = client.execute(logisticsSyncQuery, mapParam);//格式化解析響應參數String responseStr = UnicodeUtil.toString(response);log.info("============ 查詢旺店通物流同步請求結果響應 ===========>>>>>>>>>>>> {}",responseStr);return responseStr;}catch (Exception e){log.error("====== 查詢旺店通物流同步失敗 ======>>>> 信息:{} ------->>>>:{}",e.getMessage());}return "";}/*** 旺店通物流同步回寫* @param mapParam 參數信息* @return*/public String logisticsSyncAckWdt(TreeMap<String,String> mapParam,Map<String,String> wdtParam) {try {//構建請求對象WdtClient client = new WdtClient(wdtParam.get("sid"), wdtParam.get("appkey"), wdtParam.get("appsecret"), wdtParam.get("baseUrl"));// 發送HTTP請求...String response = client.execute(logisticsSyncAck, mapParam);//格式化解析響應參數String responseStr = UnicodeUtil.toString(response);return responseStr;}catch (Exception e){log.error("====== 查詢旺店通物流同步失敗 ======>>>> 信息:{} ------->>>>:{}",e.getMessage());}return "";}/*** 手動訂單發貨 !!臨時方法*/@Transactional(rollbackFor = Exception.class)public void manualOrderShipment(){List<OrderLogistics> orderLogistics = orderService.queryAllOrderLogistics();log.error("======= 查詢到需要手動發貨的訂單數量:{}條 ======>>>>",orderLogistics.size());if(orderLogistics.size() == 0){log.error("======= 暫未查詢到需要手動發貨的訂單 ======>>>>");return;}//待發貨訂單數據列表List<DeliveryOrderItemParam> orderItemParams = new ArrayList<>();//遍歷所有信息for (OrderLogistics orderLogistic : orderLogistics) {if(Validator.isEmpty(orderLogistic.getOrderNumber())){continue;}//是否是多個訂單if(!orderLogistic.getOrderNumber().contains(";")){//判斷是否已發貨Order order = orderService.getOrderByOrderNumber(orderLogistic.getOrderNumber());if(Validator.isEmpty(order)){continue;}//訂單狀態 1:待付款 2:待發貨 3:待收貨 4:待評價 5:成功 6:失敗 7:待成團if(!Validator.equal(order.getStatus(),2)){continue;}//獲取物流類型 具體類型詳見 旺鋪通-API文檔-物流代碼表String logisticsName = orderLogistic.getLogisticsName();//查詢本地物流表是否有該物流信息Delivery delivery = deliveryService.getOne(Wrappers.<Delivery>lambdaQuery().eq(Delivery::getDvyName, logisticsName).last(" LIMIT 1 "));//如果是空 則添加一條該物流信息if(Validator.isEmpty(delivery)){delivery = new Delivery();delivery.setLogisticsType("");//類型delivery.setDvyName(logisticsName);//物流名字//保存該條物流信息deliveryService.save(delivery);}//組裝訂單物流信息DeliveryOrderItemParam deliveryOrderParam = new DeliveryOrderItemParam();deliveryOrderParam.setOrderNumber(orderLogistic.getOrderNumber());deliveryOrderParam.setDvyId(delivery.getDvyId());deliveryOrderParam.setDvyFlowId(orderLogistic.getLogisticsNumber());// 1-自己聯系快遞 3-無需快遞 4-同城配送deliveryOrderParam.setDeliveryType(1);List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(orderLogistic.getOrderNumber(), 1);deliveryOrderParam.setSelectOrderItems(orderItemsByOrderNumber);//設置是旺店通發貨標識deliveryOrderParam.setIsWdt(1);//保存到集合里orderItemParams.add(deliveryOrderParam);}else {//存在多個訂單List<String> orderNumbers = Arrays.asList(orderLogistic.getOrderNumber().split(";"));if(Validator.isEmpty(orderNumbers)){continue;}//獲取物流類型 具體類型詳見 旺鋪通-API文檔-物流代碼表String logisticsName = orderLogistic.getLogisticsName();//查詢本地物流表是否有該物流信息Delivery delivery = deliveryService.getOne(Wrappers.<Delivery>lambdaQuery().eq(Delivery::getDvyName, logisticsName).last(" LIMIT 1 "));//如果是空 則添加一條該物流信息if(Validator.isEmpty(delivery)){delivery = new Delivery();delivery.setLogisticsType("");//類型delivery.setDvyName(logisticsName);//物流名字//保存該條物流信息deliveryService.save(delivery);}//遍歷訂單編號列表numberIds : for (String number : orderNumbers) {//判斷是否已發貨Order order = orderService.getOrderByOrderNumber(number);if(Validator.isEmpty(order)){continue numberIds;}//訂單狀態 1:待付款 2:待發貨 3:待收貨 4:待評價 5:成功 6:失敗 7:待成團if(!Validator.equal(order.getStatus(),2)){continue numberIds;}//組裝訂單物流信息DeliveryOrderItemParam deliveryOrderParam = new DeliveryOrderItemParam();deliveryOrderParam.setOrderNumber(number);deliveryOrderParam.setDvyId(delivery.getDvyId());deliveryOrderParam.setDvyFlowId(orderLogistic.getLogisticsNumber());// 1-自己聯系快遞 3-無需快遞 4-同城配送deliveryOrderParam.setDeliveryType(1);List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(number, 1);deliveryOrderParam.setSelectOrderItems(orderItemsByOrderNumber);//設置是旺店通發貨標識deliveryOrderParam.setIsWdt(1);//保存到集合里orderItemParams.add(deliveryOrderParam);}}}log.info("================待手動發貨訂單共計:{} 個=============>>>>>>>>>>",orderItemParams.size());//發貨操作for (DeliveryOrderItemParam orderItemParam : orderItemParams) {deliveryOrderService.saveDeliveriesInfo(orderItemParam);}}}旺店物流同步進階版
由于業務原因 一個回傳的物流字段是多個子物流單號拼接起來的 這個時候同步回傳就不適用了 同步回傳會把下面的子訂單號給回傳掉 旺店通會默認將當前訂單默認為已處理掉的
@Slf4j @Component("erpTask") public class ErpInfoTask {@AutowiredErpConfig erpConfig;@AutowiredITbOrderService orderService;@AutowiredJedisClusterUtils jedisClusterUtils;//測試環境private final String baseUrl = "https://sandbox.wangdian.cn/openapi2/";//查詢銷售出庫單private final String stockoutOrderQuery = "stockout_order_query_trade.php";private final String COUNT = "Erp_Info_Task_Count";private final String TIME = "ERP_PAGE_TIME";private final String TIME_END = "ERP_PAGE_TIME_END";private final String format = "yyyy-MM-dd HH:mm:ss";public void getErpInfoTask() {getStockoutOrder(0);}public void getStockoutOrder(int i) {WdtClient client = new WdtClient(erpConfig.getSid(), erpConfig.getAppkey(), erpConfig.getAppsecret(), erpConfig.getUrl());Map<String, String> params = new HashMap<>();// 設置開始結束時間Date date = new Date();String begin = null;if(StringUtils.isBlank(jedisClusterUtils.getString(TIME))) {// 第一次啟動 從前一天查看begin = DateUtil.format(DateUtil.offsetDay(DateUtil.beginOfDay(date),-1), this.format);}else if (DateUtil.hour(date, true) == 17 && DateUtil.minute(date) <= 10 && DateUtil.minute(date) > 0 && i == 0){// 到今日發貨時間 查今日所有begin = DateUtil.format(DateUtil.offsetDay(DateUtil.beginOfDay(date),-2), this.format);} else {// 正常執行走上一次查詢結束時間begin = jedisClusterUtils.getString(TIME);}// 初始值 選用當前時間String end = null;if(StringUtils.isBlank(jedisClusterUtils.getString(TIME_END))){end = DateUtil.format(new Date(), this.format);}else {end = jedisClusterUtils.getString(TIME_END);}int size = 50;// 設置參數 查詢當天的 已發貨的params.put("shop_no", erpConfig.getShopNo());params.put("start_time", begin);params.put("end_time", end);params.put("page_size", Integer.toString(size));params.put("page_no", Integer.toString(i));params.put("status", "95");// 發送請求try {String execute = client.execute(stockoutOrderQuery, params);ErpOrderResult orderResult = JSONObject.parseObject(execute, ErpOrderResult.class);if (orderResult.getCode() == 0) {if (i == 0) {// 分頁總條數Integer count = orderResult.getTotalCount();// 剩余調用次數Integer pageCount = (count / 50) + 1;if (pageCount > 0) {jedisClusterUtils.deleteKey(COUNT);jedisClusterUtils.incrby(COUNT, pageCount);}}List<StockoutList> stockoutList = orderResult.getStockoutList();if (CollUtil.isEmpty(stockoutList)) {log.info("====== 暫無出庫訂單信息 ======>>>>");// 更新每次分頁請求時間 保證下一次開始時間的連貫性jedisClusterUtils.saveString(TIME,end);// 查詢次數用完移除分頁結束時間jedisClusterUtils.deleteKey(TIME_END);} else {log.info("====== 訂單信息 ======");for (StockoutList list : stockoutList) {log.info("list===>>>:{}", list);// 根據單號查詢數據log.info("====== 訂單已發貨 ======");StringBuilder no = new StringBuilder();TbOrder tbOrder = orderService.selectTbOrderById(list.getSrcTradeNo());log.info("tbOrder===>>>:{}", tbOrder);log.info("物流單號===>>>:{}", list.getLogisticsNo());if (StringUtils.isBlank(tbOrder.getSendOutBill())) {no.append(list.getLogisticsNo());} else {// 不包含就拼接if (!tbOrder.getSendOutBill().contains(list.getLogisticsNo())) {no.append(tbOrder.getSendOutBill()).append(",").append(list.getLogisticsNo());} else {continue;}}if (no.length() > 0&& !"null".equals(no.toString())&& !"".equals(no.toString())) {log.info("更新{}訂單物流===>>>:{}", no, list.getLogisticsNo());orderService.updateErpSendOutBill(no.toString(), list.getSrcTradeNo());}}// 調用分頁if (jedisClusterUtils.decrby(COUNT, 1) > 0) {if(i == 0) {// 保證這一批次時間的一直性 結束時間按照第一次的請求時間jedisClusterUtils.saveString(TIME_END,end);}log.info("count=====>>>{}",jedisClusterUtils.getString(COUNT));getStockoutOrder(i+1);}else {// 更新每次分頁請求時間 保證下一次開始時間的連貫性jedisClusterUtils.saveString(TIME,end);// 查詢次數用完移除分頁結束時間jedisClusterUtils.deleteKey(TIME_END);}}} else {log.info("======查詢失敗======>>>{}", orderResult.getMessage());}} catch (IOException e) {log.info("====請求旺店通查詢銷售出庫單接口失敗===>>{}", e.getMessage());}} }總結
以上是生活随笔為你收集整理的java对接旺店通数据同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 22 《巴黎文学散步地图》 -豆瓣评分7
- 下一篇: STC单片机驱动1.8‘TFT SPI屏