diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java index 3f181357..aac722ee 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java @@ -69,7 +69,7 @@ public class OrderPayedListener { String dataStr = new String(data, StandardCharsets.UTF_8); listener(dataStr, channel, message); } - + public void listener(String data, Channel channel, Message message) throws IOException, InterruptedException { // String messageId = message.getMessageProperties().getMessageId(); if (StrUtil.isBlank(data)) { @@ -154,7 +154,7 @@ public class OrderPayedListener { && !isBookingOrder) { // 如果是立即下单,将触发顺丰同城下单,否则(预约下单) redis+cron 定时触发顺丰同城下单 - Pair pairCreateSfOrder = sfExpressApiService.innerCreateSfExpressOrder(orderId, orderPickupNum); + Pair pairCreateSfOrder = sfExpressApiService.innerCreateSfExpressOrder(orderId, orderPickupNum, false); if (pairCreateSfOrder == null) { logger.error("[订单支付监听] 顺丰同城下单失败,无返回值 订单ID: {}", orderId); continue; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java index 08801155..f9beecc9 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderInfoServiceImpl.java @@ -907,7 +907,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl sfResult = sfExpressApiService.innerCreateSfExpressOrder(orderId, 0L); + Pair sfResult = sfExpressApiService.innerCreateSfExpressOrder(orderId, 0L, false); if (sfResult == null) { logger.error("[预约订单顺丰下单] 调用顺丰接口无返回值, orderId={}", orderId); throw new RuntimeException("预约订单顺丰下单失败,接口无响应"); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java index 1113041e..9c99e91e 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/controller/admin/SFExpressAdminController.java @@ -44,7 +44,7 @@ public class SFExpressAdminController { } - @ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺") + @ApiOperation(value = "【测试补偿】创建顺丰同城店铺", notes = "创建顺丰同城店铺") @RequestMapping(value = "/create-shop-inner", method = RequestMethod.POST) public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) { Pair result = sfExpressApiService.createSfExpressShopInner( @@ -64,4 +64,12 @@ public class SFExpressAdminController { } return CommonResult.failed(result.getSecond()); } + + @ApiOperation(value = "重新创建顺丰订单(重新派发)", notes = "重新创建顺丰订单(重新派发)") + @RequestMapping(value = "/recreate-order", method = RequestMethod.POST) + public CommonResult recreateOrder(@RequestBody JSONObject requestBody) { + return sfExpressApiService.recreateOrder( + requestBody.getStr("order_id") + ); + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java index 73f6e8d2..ec0068d6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java @@ -70,8 +70,23 @@ public interface SFExpressApiService { ThirdApiRes createSfExpressShopNotify(String jsonData, String sign); + /** + * 创建顺丰同城订单 + * + * @param shopOrderId + * @return + */ ThirdApiRes createOrder(String shopOrderId); + + /** + * 重新创建顺丰同城订单 + * + * @param shopOrderId + * @return + */ + CommonResult recreateOrder(String shopOrderId); + /** * 获取顺丰同城店铺信息 * @@ -85,9 +100,10 @@ public interface SFExpressApiService { * * @param orderId * @param orderPickupNum + * @param ignoreExists 是否忽略已存在本地订单 * @return */ - Pair innerCreateSfExpressOrder(String orderId, Long orderPickupNum); + Pair innerCreateSfExpressOrder(String orderId, Long orderPickupNum, Boolean ignoreExists); /** * 取消订单,当商家处发生异常需要取消配送时,可调用此接口对订单进行取消操作,同步返回结果。 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index ac0eaf46..fb49d08a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -105,7 +105,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { @Autowired private ShopMchEntryService shopMchEntryService; - @Lazy @Autowired private PushMessageService pushMessageService; @@ -553,6 +552,60 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return JsonUtil.json2object(retRespStr, ThirdApiRes.class); } + /** + * 重新创建顺丰同城订单 + * 1、先获取顺丰同城订单的当前状态,如果没有取消的订单,则取消该订单 + * 2、取消成功,则重新创建顺丰同城订单,取消失败,则返回错误信息 + * 3、重新创建订单成功,更新订单轨迹 + * + * @param shopOrderId 商城订单ID + * @return CommonResult 操作结果 + */ + @Override + public CommonResult recreateOrder(String shopOrderId) { + logger.info("[顺丰] 开始重新创建订单: shopOrderId={}", shopOrderId); + + // 参数校验 + if (StrUtil.isBlank(shopOrderId)) { + logger.warn("[顺丰] 重新创建订单失败: 订单ID为空"); + return CommonResult.failed("订单ID不能为空"); + } + + // 获取顺丰订单ID + String sfOrderId = shopStoreSfOrderService.getSfOrderIdByShopOrderId(shopOrderId); + if (StrUtil.isBlank(sfOrderId)) { + logger.warn("[顺丰] 重新创建订单失败: 未找到对应的顺丰订单, shopOrderId={}", shopOrderId); + return CommonResult.failed("未找到对应的顺丰订单"); + } + + try { + // 取消原订单 + Map params = new HashMap<>(); + params.put("order_id", sfOrderId); + ThirdApiRes cancelOrderRes = cancelOrder(params); + if (cancelOrderRes != null && !ObjectUtil.equal(cancelOrderRes.getError_code(), 0)) { + logger.error("[顺丰] 取消原订单失败: errorCode={}, errorMsg={}", + cancelOrderRes.getError_code(), cancelOrderRes.getError_msg()); + return CommonResult.failed(cancelOrderRes.getError_msg()); + } + + // 重新创建订单,传递默认取货号1 + Pair createOrderRes = innerCreateSfExpressOrder(shopOrderId, 0L, true); + if (createOrderRes.getFirst()) { + logger.info("[顺丰] 重新创建订单成功: shopOrderId={}", shopOrderId); + return CommonResult.success(); + } + + logger.error("[顺丰] 重新创建订单失败: {}", createOrderRes.getSecond()); + return CommonResult.failed(createOrderRes.getSecond()); + + } catch (Exception e) { + logger.error("[顺丰] 重新创建订单过程中发生异常: shopOrderId={}", shopOrderId, e); + return CommonResult.failed("系统异常: " + e.getMessage()); + } + } + + /** * 获取顺丰同城店铺信息 * @@ -592,18 +645,19 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { * * @param shopOrderId * @param orderPickupNum + * @param ignoreExists * @return */ @Transactional @Override - public Pair innerCreateSfExpressOrder(String shopOrderId, Long orderPickupNum) { + public Pair innerCreateSfExpressOrder(String shopOrderId, Long orderPickupNum, Boolean ignoreExists) { logger.info("开始顺丰同城下单"); - if (StrUtil.isBlank(shopOrderId) || orderPickupNum == null) { + if (StrUtil.isBlank(shopOrderId) || CheckUtil.isEmpty(orderPickupNum)) { return Pair.of(false, "顺丰同城下单时,缺少必要参数!"); } // 检查 shop_store_sf_order 订单是否已存在? - if (shopStoreSfOrderService.exists(devId, shopOrderId)) { + if (!ignoreExists && shopStoreSfOrderService.exists(devId, shopOrderId)) { return Pair.of(true, "顺丰同城已下单过!"); } @@ -645,7 +699,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { shopStoreSfOrder.setStatus_desc("已创建顺丰同城订单"); // 下单成功,保存顺丰同城订单记录到 shop_store_sf_order 表里 - Boolean success = shopStoreSfOrderService.insertShopStoreSfOrder(shopStoreSfOrder); + Boolean success = shopStoreSfOrderService.saveShopStoreSfOrder(shopStoreSfOrder); if (!success) { logger.error("顺丰下单返回的结果:{}", sfExpressApiRes.get("result").toString()); return Pair.of(false, "保存顺丰同城下单失败!"); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java index 892e1841..f5f65fe1 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopStoreSfOrderService.java @@ -31,12 +31,12 @@ public interface ShopStoreSfOrderService extends IBaseService String getSfOrderIdByShopOrderId(String shopOrderId); /** - * 新增一个顺丰同城订单记录 + * 保存(新增或更新)一个顺丰同城订单记录 * * @param record * @return */ - Boolean insertShopStoreSfOrder(ShopStoreSfOrder record); + Boolean saveShopStoreSfOrder(ShopStoreSfOrder record); /** diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java index f40f1e8a..8929021d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreSfOrderServiceImpl.java @@ -92,7 +92,7 @@ public class ShopStoreSfOrderServiceImpl extends BaseServiceImpl