Authored by chenchao

buyer overseas order cancel

1 package com.yohoufo.order.controller; 1 package com.yohoufo.order.controller;
2 2
3 import com.yohobuy.ufo.model.order.common.OrderListType; 3 import com.yohobuy.ufo.model.order.common.OrderListType;
  4 +import com.yohobuy.ufo.model.order.common.OrderStatus;
4 import com.yohobuy.ufo.model.order.common.SellerOrderListType; 5 import com.yohobuy.ufo.model.order.common.SellerOrderListType;
5 import com.yohobuy.ufo.model.order.common.TabType; 6 import com.yohobuy.ufo.model.order.common.TabType;
6 import com.yohobuy.ufo.model.order.req.BuyerOrderCancelReq; 7 import com.yohobuy.ufo.model.order.req.BuyerOrderCancelReq;
@@ -11,11 +12,13 @@ import com.yohobuy.ufo.model.order.resp.PageResp; @@ -11,11 +12,13 @@ import com.yohobuy.ufo.model.order.resp.PageResp;
11 import com.yohoufo.common.ApiResponse; 12 import com.yohoufo.common.ApiResponse;
12 import com.yohoufo.common.annotation.IgnoreSession; 13 import com.yohoufo.common.annotation.IgnoreSession;
13 import com.yohoufo.common.annotation.IgnoreSignature; 14 import com.yohoufo.common.annotation.IgnoreSignature;
  15 +import com.yohoufo.order.constants.CutomsClearanceFailType;
14 import com.yohoufo.order.model.request.OrderListRequest; 16 import com.yohoufo.order.model.request.OrderListRequest;
15 import com.yohoufo.order.model.request.OrderRequest; 17 import com.yohoufo.order.model.request.OrderRequest;
16 import com.yohoufo.order.model.request.SaveQualityCheckInfoRequest; 18 import com.yohoufo.order.model.request.SaveQualityCheckInfoRequest;
17 import com.yohoufo.order.service.IBuyerOrderService; 19 import com.yohoufo.order.service.IBuyerOrderService;
18 import com.yohoufo.order.service.IPaymentService; 20 import com.yohoufo.order.service.IPaymentService;
  21 +import com.yohoufo.order.service.impl.BuyerOrderCancelService;
19 import com.yohoufo.order.service.impl.SellerOrderService; 22 import com.yohoufo.order.service.impl.SellerOrderService;
20 import com.yohoufo.order.utils.LoggerUtils; 23 import com.yohoufo.order.utils.LoggerUtils;
21 import org.slf4j.Logger; 24 import org.slf4j.Logger;
@@ -39,6 +42,10 @@ public class ErpGWOrderController { @@ -39,6 +42,10 @@ public class ErpGWOrderController {
39 @Autowired 42 @Autowired
40 SellerOrderService sellerOrderService; 43 SellerOrderService sellerOrderService;
41 44
  45 +
  46 + @Autowired
  47 + BuyerOrderCancelService buyerOrderCancelService;
  48 +
42 @RequestMapping(params = "method=ufo.buyer.orderNums") 49 @RequestMapping(params = "method=ufo.buyer.orderNums")
43 @IgnoreSession 50 @IgnoreSession
44 public BuyerOrderNums getBuyerOrderNums(@RequestParam("uid") int uid){ 51 public BuyerOrderNums getBuyerOrderNums(@RequestParam("uid") int uid){
@@ -148,4 +155,33 @@ public class ErpGWOrderController { @@ -148,4 +155,33 @@ public class ErpGWOrderController {
148 LOG.info("method ufo.depot.confirmReceive out, req is {}", request); 155 LOG.info("method ufo.depot.confirmReceive out, req is {}", request);
149 return new ApiResponse.ApiResponseBuilder().code(200).message("鉴定中心确认收货成功").build(); 156 return new ApiResponse.ApiResponseBuilder().code(200).message("鉴定中心确认收货成功").build();
150 } 157 }
  158 +
  159 +
  160 + /**
  161 + * 平台确认收货
  162 + */
  163 + @IgnoreSession
  164 + @IgnoreSignature
  165 + @RequestMapping(value = "/cancelOverseasOrder")
  166 + public ApiResponse cancelOverseasOrder(@RequestBody BuyerOrderCancelReq request) {
  167 + LOG.info("api cancelOverseasOrder in, req is {}", request);
  168 + int cancelType = request.getCancelType();
  169 + final OrderStatus orderStatus = OrderStatus.getOrderStatus(cancelType);
  170 + CutomsClearanceFailType ccft = null;
  171 + switch (orderStatus){
  172 + case PLATFORM_BLOWN_CUSTOMS_CLEARANCE:
  173 + ccft = CutomsClearanceFailType.PLATFORM;
  174 + break;
  175 + case BUYER_BLOWN_CUSTOMS_CLEARANCE:
  176 + ccft = CutomsClearanceFailType.BUYER;
  177 + break;
  178 + }
  179 + if (ccft == null){
  180 + LOG.warn("in api cancelOverseasOrder CutomsClearanceFailType null, req {}", request);
  181 + return new ApiResponse.ApiResponseBuilder().code(400).message("param cancelType wrong").build();
  182 + }
  183 + buyerOrderCancelService.cancelOverseasOrder(request.getOrderCode(), ccft);
  184 + LOG.info("api cancelOverseasOrder out, req is {}", request);
  185 + return new ApiResponse.ApiResponseBuilder().code(200).message("取消海外直邮订单成功").build();
  186 + }
151 } 187 }
@@ -15,7 +15,22 @@ import lombok.Builder; @@ -15,7 +15,22 @@ import lombok.Builder;
15 @AllArgsConstructor 15 @AllArgsConstructor
16 public class BuyerRefundCouponEvent extends Event { 16 public class BuyerRefundCouponEvent extends Event {
17 public enum BizCase{ 17 public enum BizCase{
18 - APPRAISE_FAIL, APPRAISE_UNSURE,SELLER_DELIVER_TIMEOUT, SELLER_PLAY_BUYER, BUYER_CANCEL_BSD, BUYER_CANCEL_BDR, SELLER_SHAM_SEND_OUT 18 + APPRAISE_FAIL,
  19 + APPRAISE_UNSURE,
  20 + SELLER_DELIVER_TIMEOUT,
  21 + SELLER_PLAY_BUYER,
  22 + /**
  23 + * 卖家发货前
  24 + * BSC: before seller delivery
  25 + */
  26 + BUYER_CANCEL_BSD,
  27 + /**
  28 + * 鉴定中心收货钱
  29 + * BDR:before depot receive
  30 + */
  31 + BUYER_CANCEL_BDR,
  32 + SELLER_SHAM_SEND_OUT,
  33 + PLATFORM_BLOWN_CUSTOMS_CLEARANCE
19 } 34 }
20 Integer uid; 35 Integer uid;
21 36
@@ -40,7 +40,10 @@ import com.yohoufo.order.service.seller.support.SkupTypeCodeSupport; @@ -40,7 +40,10 @@ import com.yohoufo.order.service.seller.support.SkupTypeCodeSupport;
40 import com.yohoufo.order.utils.LoggerUtils; 40 import com.yohoufo.order.utils.LoggerUtils;
41 import com.yohoufo.order.utils.OrderAssist; 41 import com.yohoufo.order.utils.OrderAssist;
42 import com.yohoufo.order.utils.PaymentHelper; 42 import com.yohoufo.order.utils.PaymentHelper;
  43 +import lombok.Builder;
  44 +import lombok.Data;
43 import lombok.Setter; 45 import lombok.Setter;
  46 +import lombok.val;
44 import org.apache.commons.collections.CollectionUtils; 47 import org.apache.commons.collections.CollectionUtils;
45 import org.slf4j.Logger; 48 import org.slf4j.Logger;
46 import org.springframework.beans.factory.annotation.Autowired; 49 import org.springframework.beans.factory.annotation.Autowired;
@@ -137,7 +140,7 @@ public class BuyerOrderCancelService { @@ -137,7 +140,7 @@ public class BuyerOrderCancelService {
137 boolean noResponsibility = Objects.isNull(penaltyAmount) 140 boolean noResponsibility = Objects.isNull(penaltyAmount)
138 || BigDecimal.ZERO.compareTo(penaltyAmount) == 0; 141 || BigDecimal.ZERO.compareTo(penaltyAmount) == 0;
139 //退还优惠券 142 //退还优惠券
140 - refundCouponIfNeed(buyerUid, orderCode); 143 + asyncRefundCoupon(buyerUid, orderCode, BuyerRefundCouponEvent.BizCase.BUYER_CANCEL_BSD);
141 int skup = bsdEvent.getSkup(); 144 int skup = bsdEvent.getSkup();
142 SellerOrderGoods psog = sellerOrderGoodsMapper.selectByPrimaryKey(skup); 145 SellerOrderGoods psog = sellerOrderGoodsMapper.selectByPrimaryKey(skup);
143 int targetGoodsStatus = SkupStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER.getCode(); 146 int targetGoodsStatus = SkupStatus.BUYER_CANCEL_BEFORE_SELLER_DELIVER.getCode();
@@ -275,7 +278,7 @@ public class BuyerOrderCancelService { @@ -275,7 +278,7 @@ public class BuyerOrderCancelService {
275 boolean noResponsibility = Objects.isNull(penaltyAmount) 278 boolean noResponsibility = Objects.isNull(penaltyAmount)
276 || BigDecimal.ZERO.compareTo(penaltyAmount) == 0; 279 || BigDecimal.ZERO.compareTo(penaltyAmount) == 0;
277 //退还优惠券 280 //退还优惠券
278 - refundCouponIfNeed(buyerUid, orderCode); 281 + asyncRefundCoupon(buyerUid, orderCode, BuyerRefundCouponEvent.BizCase.BUYER_CANCEL_BDR);
279 282
280 int skup = bdrEvent.getSkup(); 283 int skup = bdrEvent.getSkup();
281 SellerOrderGoods targetGoods = new SellerOrderGoods(); 284 SellerOrderGoods targetGoods = new SellerOrderGoods();
@@ -346,10 +349,12 @@ public class BuyerOrderCancelService { @@ -346,10 +349,12 @@ public class BuyerOrderCancelService {
346 return; 349 return;
347 } 350 }
348 OrderStatus targetStatus = null; 351 OrderStatus targetStatus = null;
349 - Consumer<BuyerOrder> consumer = null; 352 + Consumer<RefundGoodsAmoutNode> consumer = null;
  353 + boolean needCompensateCoupon = false;
350 switch (failType){ 354 switch (failType){
351 case PLATFORM: 355 case PLATFORM:
352 targetStatus = OrderStatus.PLATFORM_BLOWN_CUSTOMS_CLEARANCE; 356 targetStatus = OrderStatus.PLATFORM_BLOWN_CUSTOMS_CLEARANCE;
  357 + needCompensateCoupon = true;
353 consumer = (buyerOrder1) -> cancelOverseasOrderByPlatform(buyerOrder1); 358 consumer = (buyerOrder1) -> cancelOverseasOrderByPlatform(buyerOrder1);
354 break; 359 break;
355 case BUYER: 360 case BUYER:
@@ -372,9 +377,23 @@ public class BuyerOrderCancelService { @@ -372,9 +377,23 @@ public class BuyerOrderCancelService {
372 logger.warn("cancelOverseasOrder fail -> buyerOrderMapper.updateStatusByOrderCode, orderCode {}", orderCode); 377 logger.warn("cancelOverseasOrder fail -> buyerOrderMapper.updateStatusByOrderCode, orderCode {}", orderCode);
373 return; 378 return;
374 } 379 }
  380 + BigDecimal leftGoodsMoney = buyerOrder.getAmount();
  381 +
  382 + BuyerOrderGoods pbog = buyerOrderGoodsMapper.selectOnlyByOrderCode(orderCode);
  383 + Integer skup = pbog.getSkup();
375 // 384 //
376 buyerOrder.setStatus(targetStatus.getCode()); 385 buyerOrder.setStatus(targetStatus.getCode());
377 - consumer.accept(buyerOrder); 386 +
  387 + RefundGoodsAmoutNode rgaNode = RefundGoodsAmoutNode.builder()
  388 + .buyerOrder(buyerOrder)
  389 + .skup(skup)
  390 + .targetOrderStatus(targetStatus)
  391 + .leftBuyerMoney(leftGoodsMoney)
  392 + .needCompensateCoupon(needCompensateCoupon)
  393 + .build();
  394 +
  395 + //
  396 + consumer.accept(rgaNode);
378 // 397 //
379 orderStatusFlowService.addAsy(orderCode,targetStatus.getCode()); 398 orderStatusFlowService.addAsy(orderCode,targetStatus.getCode());
380 } 399 }
@@ -384,20 +403,42 @@ public class BuyerOrderCancelService { @@ -384,20 +403,42 @@ public class BuyerOrderCancelService {
384 * 货品平台自己吃了 403 * 货品平台自己吃了
385 * 买家钱退给买家 404 * 买家钱退给买家
386 * 赔偿卖家ufo券 券金额还未定 405 * 赔偿卖家ufo券 券金额还未定
387 - * @param buyerOrder 406 + * @param rgaNode
388 */ 407 */
389 - private void cancelOverseasOrderByPlatform(BuyerOrder buyerOrder){ 408 + private void cancelOverseasOrderByPlatform(RefundGoodsAmoutNode rgaNode){
  409 + BuyerOrder buyerOrder = rgaNode.buyerOrder;
  410 + int skup = rgaNode.skup;
  411 + OrderStatus targetOrderStatus = rgaNode.targetOrderStatus;
  412 + BigDecimal leftBuyerMoney = rgaNode.leftBuyerMoney;
  413 + boolean needCompensateCoupon = rgaNode.needCompensateCoupon;
  414 + if (needCompensateCoupon){
  415 + asyncRefundCoupon(buyerOrder.getUid(), buyerOrder.getOrderCode(), BuyerRefundCouponEvent.BizCase.PLATFORM_BLOWN_CUSTOMS_CLEARANCE);
  416 + }
390 417
  418 + refundGoodsAmount(buyerOrder, skup, targetOrderStatus, leftBuyerMoney);
391 } 419 }
392 420
393 /** 421 /**
394 * 买家原因失败 422 * 买家原因失败
395 * 货品平台自己吃了 423 * 货品平台自己吃了
396 * 货款钱退给买家 424 * 货款钱退给买家
397 - * @param buyerOrder 425 + * @param rgaNode
398 */ 426 */
399 - private void cancelOverseasOrderByBuyer(BuyerOrder buyerOrder){ 427 + private void cancelOverseasOrderByBuyer(RefundGoodsAmoutNode rgaNode){
  428 + BuyerOrder buyerOrder = rgaNode.buyerOrder;
  429 + int skup = rgaNode.skup;
  430 + OrderStatus targetOrderStatus = rgaNode.targetOrderStatus;
  431 + BigDecimal leftBuyerMoney = rgaNode.leftBuyerMoney;
  432 + refundGoodsAmount(buyerOrder, skup, targetOrderStatus, leftBuyerMoney);
  433 + }
400 434
  435 + @Data@Builder
  436 + private static class RefundGoodsAmoutNode{
  437 + BuyerOrder buyerOrder;
  438 + int skup;
  439 + OrderStatus targetOrderStatus;
  440 + BigDecimal leftBuyerMoney;
  441 + boolean needCompensateCoupon;
401 } 442 }
402 443
403 private void refundGoodsAmount(BuyerOrder buyerOrder,int skup, OrderStatus targetOrderStatus, BigDecimal leftBuyerMoney){ 444 private void refundGoodsAmount(BuyerOrder buyerOrder,int skup, OrderStatus targetOrderStatus, BigDecimal leftBuyerMoney){
@@ -428,7 +469,8 @@ public class BuyerOrderCancelService { @@ -428,7 +469,8 @@ public class BuyerOrderCancelService {
428 BuyerOrder buyerOrder; 469 BuyerOrder buyerOrder;
429 TransferCase transferCase; 470 TransferCase transferCase;
430 OrderStatus targetOrderStatus; 471 OrderStatus targetOrderStatus;
431 - boolean reSellFlag;//重新上架标志,重新上架则不退保证金了 472 + //重新上架标志,重新上架则不退保证金了
  473 + boolean reSellFlag;
432 474
433 @Setter 475 @Setter
434 SellerWalletDetail.Type swdType; 476 SellerWalletDetail.Type swdType;
@@ -578,4 +620,14 @@ public class BuyerOrderCancelService { @@ -578,4 +620,14 @@ public class BuyerOrderCancelService {
578 logger.warn("refund coupon error,uid:{},orderCode:{}", uid, orderCode, ex); 620 logger.warn("refund coupon error,uid:{},orderCode:{}", uid, orderCode, ex);
579 } 621 }
580 } 622 }
  623 +
  624 + public void asyncRefundCoupon(int uid, long orderCode, BuyerRefundCouponEvent.BizCase refundCouponCase) {
  625 + val buyerRefundCouponEvent = BuyerRefundCouponEvent.builder()
  626 + .bizCase(refundCouponCase)
  627 + .uid(uid)
  628 + .orderCode(orderCode)
  629 + .build();
  630 + logger.info("async refund coupon by order {} request is {}", orderCode, buyerRefundCouponEvent);
  631 + EventBusPublisher.publishEvent(buyerRefundCouponEvent);
  632 + }
581 } 633 }