Authored by chenchao

fix bug seller cancel concurrent buyer submit

@@ -104,12 +104,12 @@ public class SellerOrderCancelService { @@ -104,12 +104,12 @@ public class SellerOrderCancelService {
104 logger.warn("seller cancel orderCode illegal, req {}", event); 104 logger.warn("seller cancel orderCode illegal, req {}", event);
105 throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY); 105 throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
106 } 106 }
107 - OrderCodeType actor = OrderCodeType.getOrderCodeType(codeMeta.getType());  
108 - logger.info("in cancel uid {},orderCode {}, actor {}", uid, orderCode, actor); 107 + OrderCodeType codeType = OrderCodeType.getOrderCodeType(codeMeta.getType());
  108 + logger.info("in cancel uid {},orderCode {}, actor {}", uid, orderCode, codeType);
109 //case 1: 未支付时 109 //case 1: 未支付时
110 //case 2: 支付完成,没有买家下单 110 //case 2: 支付完成,没有买家下单
111 //case 3: 支付完成,有买家下单 111 //case 3: 支付完成,有买家下单
112 - cancel(uid, orderCode, actor); 112 + cancel(uid, orderCode, codeType);
113 } 113 }
114 114
115 private final static List<Integer> relatedBuyerStatusList = Arrays.asList(OrderStatus.WAITING_PAY.getCode(), 115 private final static List<Integer> relatedBuyerStatusList = Arrays.asList(OrderStatus.WAITING_PAY.getCode(),
@@ -134,22 +134,22 @@ public class SellerOrderCancelService { @@ -134,22 +134,22 @@ public class SellerOrderCancelService {
134 return buyerOrder; 134 return buyerOrder;
135 } 135 }
136 136
137 - public int cancel(int uid, long orderCode, OrderCodeType actor){ 137 + public int cancel(int uid, long orderCode, OrderCodeType codeType){
138 int result = 0; 138 int result = 0;
139 SellerOrder sellerOrder = null; 139 SellerOrder sellerOrder = null;
140 BuyerOrder buyerOrder = null; 140 BuyerOrder buyerOrder = null;
141 Integer skup=null; 141 Integer skup=null;
142 //seller order code 142 //seller order code
143 - if (OrderCodeType.SELLER_TYPE.equals(actor)){ 143 + if (OrderCodeType.SELLER_TYPE.equals(codeType)){
144 sellerOrder = sellerOrderMapper.selectByOrderCodeUid(orderCode, uid); 144 sellerOrder = sellerOrderMapper.selectByOrderCodeUid(orderCode, uid);
145 if (Objects.isNull(sellerOrder)){ 145 if (Objects.isNull(sellerOrder)){
146 return result; 146 return result;
147 } 147 }
148 skup = sellerOrder.getSkup(); 148 skup = sellerOrder.getSkup();
149 - buyerOrder = getBuyerOrderBySkup(skup, uid, orderCode, actor); 149 + buyerOrder = getBuyerOrderBySkup(skup, uid, orderCode, codeType);
150 } 150 }
151 //buyer order code 151 //buyer order code
152 - if (OrderCodeType.BUYER_TYPE.equals(actor)){ 152 + if (OrderCodeType.BUYER_TYPE.equals(codeType)){
153 buyerOrder = buyerOrderMapper.selectByOrderCode(orderCode); 153 buyerOrder = buyerOrderMapper.selectByOrderCode(orderCode);
154 BuyerOrderGoods buyerOrderGoods = buyerOrderGoodsMapper.selectByOrderCode(buyerOrder.getUid(), orderCode); 154 BuyerOrderGoods buyerOrderGoods = buyerOrderGoodsMapper.selectByOrderCode(buyerOrder.getUid(), orderCode);
155 sellerOrder = sellerOrderMapper.selectBySkup(buyerOrderGoods.getSkup()); 155 sellerOrder = sellerOrderMapper.selectBySkup(buyerOrderGoods.getSkup());
@@ -187,7 +187,7 @@ public class SellerOrderCancelService { @@ -187,7 +187,7 @@ public class SellerOrderCancelService {
187 //case 3: 支付完成,有买家下单 187 //case 3: 支付完成,有买家下单
188 if (SellerOrderStatus.HAS_PAYED.getCode() == status){ 188 if (SellerOrderStatus.HAS_PAYED.getCode() == status){
189 logger.info("in seller cancel after paid, uid {} skup {} orderCode {}", uid, skup, orderCode); 189 logger.info("in seller cancel after paid, uid {} skup {} orderCode {}", uid, skup, orderCode);
190 - result = cancelAfterPayAction(sellerOrder, buyerOrder); 190 + result = cancelAfterPayAction(sellerOrder, buyerOrder, codeType);
191 } 191 }
192 192
193 return result; 193 return result;
@@ -344,9 +344,15 @@ public class SellerOrderCancelService { @@ -344,9 +344,15 @@ public class SellerOrderCancelService {
344 return result; 344 return result;
345 } 345 }
346 346
347 -  
348 -  
349 - private int cancelAfterPayExistBuyAction(SellerOrder sellerOrder, BuyerOrder buyerOrder){ 347 + /**
  348 + * 卖家支付完成(上架成功),买家下单(状态未知)
  349 + *
  350 + * @param sellerOrder
  351 + * @param buyerOrder
  352 + * @param codeType
  353 + * @return
  354 + */
  355 + private int cancelAfterPayExistBuyAction(SellerOrder sellerOrder, BuyerOrder buyerOrder, OrderCodeType codeType){
350 /** 356 /**
351 * case 3: 支付完成,有买家下单 357 * case 3: 支付完成,有买家下单
352 * actions as blow: 358 * actions as blow:
@@ -356,16 +362,26 @@ public class SellerOrderCancelService { @@ -356,16 +362,26 @@ public class SellerOrderCancelService {
356 * 4. 瓜分保证金 退货款 362 * 4. 瓜分保证金 退货款
357 */ 363 */
358 Integer buyerOrderStatus = buyerOrder.getStatus(); 364 Integer buyerOrderStatus = buyerOrder.getStatus();
359 - if (Objects.isNull(buyerOrderStatus) || !ActionStatusHold.sellerCanCancelBuyerOrder(buyerOrderStatus)){  
360 - throw new UfoServiceException(501, "买家支付中,不能取消");  
361 - }  
362 -  
363 final int sellerUid = sellerOrder.getUid(), buyerUid = buyerOrder.getUid(); 365 final int sellerUid = sellerOrder.getUid(), buyerUid = buyerOrder.getUid();
364 final long sellerOrderCode = sellerOrder.getOrderCode(), buyerOrderCode = buyerOrder.getOrderCode(); 366 final long sellerOrderCode = sellerOrder.getOrderCode(), buyerOrderCode = buyerOrder.getOrderCode();
365 -  
366 logger.info("in seller cancel After Paid while Exist Buy Action, uid {}, orderCode {}, buyerOrderCode {}", 367 logger.info("in seller cancel After Paid while Exist Buy Action, uid {}, orderCode {}, buyerOrderCode {}",
367 sellerUid, sellerOrderCode, buyerOrderCode); 368 sellerUid, sellerOrderCode, buyerOrderCode);
368 - 369 + if (Objects.equals(buyerOrderStatus, OrderStatus.WAITING_PAY.getCode())){
  370 + logger.warn("cancelAfterPayExistBuyAction canceling order is waiting buyer pay, seller [uid:{} orderCode:{}],buyer [uid:{} orderCode:{}],buyerOrderStatus {}",
  371 + sellerUid, sellerOrderCode, buyerUid, buyerOrderCode, buyerOrderStatus);
  372 + throw new UfoServiceException(501, "买家支付中,不能取消");
  373 + }
  374 + /**
  375 + * 这种操作主要是买家下单 卖家停留在出售列表时的场景,
  376 + * 此时此刻卖家不感知买家下单,不买了的入参是卖家订单号
  377 + * 根据codeType判断即可
  378 + */
  379 + if (OrderCodeType.getSellerTypes().contains(codeType)){
  380 + logger.warn("cancelAfterPayExistBuyAction canceling order buyer operated, seller [uid:{} orderCode:{}],buyer [uid:{} orderCode:{}] codeType {} buyerOrderStatus {}",
  381 + sellerUid, sellerOrderCode, buyerUid, buyerOrderCode, codeType, buyerOrderStatus);
  382 + String errorMsg = "您的商品已经被购买,不能下架该商品!";
  383 + throw new UfoServiceException(501, errorMsg);
  384 + }
369 int result = 0; 385 int result = 0;
370 //actions of buyer order and related 386 //actions of buyer order and related
371 //update buyer Order 387 //update buyer Order
@@ -433,7 +449,7 @@ public class SellerOrderCancelService { @@ -433,7 +449,7 @@ public class SellerOrderCancelService {
433 return result; 449 return result;
434 } 450 }
435 451
436 - private int cancelAfterPayAction(SellerOrder sellerOrder, BuyerOrder buyerOrder){ 452 + private int cancelAfterPayAction(SellerOrder sellerOrder, BuyerOrder buyerOrder, OrderCodeType codeType){
437 453
438 final int sellerUid = sellerOrder.getUid(); 454 final int sellerUid = sellerOrder.getUid();
439 final long orderCode = sellerOrder.getOrderCode(); 455 final long orderCode = sellerOrder.getOrderCode();
@@ -463,8 +479,9 @@ public class SellerOrderCancelService { @@ -463,8 +479,9 @@ public class SellerOrderCancelService {
463 * 4. 瓜分保证金 退货款给买家 479 * 4. 瓜分保证金 退货款给买家
464 */ 480 */
465 //查询买家订单,状态是支付成功的 481 //查询买家订单,状态是支付成功的
466 -  
467 - result = cancelAfterPayExistBuyAction(sellerOrder, buyerOrder); 482 + if (buyOrderCnt>0){
  483 + result = cancelAfterPayExistBuyAction(sellerOrder, buyerOrder, codeType);
  484 + }
468 return result; 485 return result;
469 } 486 }
470 487