Authored by sailing-PC\sailing

optimize code

... ... @@ -172,4 +172,14 @@ public class BuyerOrderController {
return new ApiResponse.ApiResponseBuilder().code(200).message("确认收货成功").build();
}
@RequestMapping(value = "/confirmReceive", params = "method=ufo.depot.confirmReceive")
@ResponseBody
public ApiResponse confirmReceive(@RequestParam("orderCode") long orderCode) {
LOG.info("method ufo.depot.confirmReceive in, orderCode is {}", orderCode);
buyerOrderService.confirmReceive(orderCode);
LOG.info("method ufo.depot.confirmReceive out, orderCode is {}", orderCode);
return new ApiResponse.ApiResponseBuilder().code(200).message("鉴定中心确认收货成功").build();
}
}
... ...
... ... @@ -33,4 +33,7 @@ public interface IBuyerOrderService extends IOrderListService, IOrderDetailServi
boolean delete(int uid, long orderCode);
void confirmReceive(long orderCode);
}
... ...
... ... @@ -98,69 +98,62 @@ public class AppraiseService {
.skup(skup);
try {
paymentService.refund(req);
//分账
TransferMoneyRequest tmReq = TransferMoneyRequest.builder().buyerOrderCode(orderCode)
.type(TransferCase.APPRAISE_SUCCESS.getCode()).build();
paymentService.transferMon(tmReq);
//通知卖家退还保证金
BuyerConfirmEvent buyerConfirmEvent = BuyerConfirmEvent.builder().uid(buyerUid).orderCode(orderCode).build();
EventBusPublisher.publishEvent(buyerConfirmEvent);
}catch (Exception ex){
LOGGER.warn("in appraiseSuccess, refund fail, req {}", req, ex);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(200)
.build();
//流水
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(100).build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
return false;
}
//分账
TransferMoneyRequest tmReq = TransferMoneyRequest.builder().buyerOrderCode(orderCode)
.type(TransferCase.APPRAISE_SUCCESS.getCode()).build();
paymentService.transferMon(tmReq);
// 更新买家订单状态
LOGGER.info("appraiseSuccess update buyer order {} ", buyerOrder);
final OrderStatus expectOrderStatus = OrderStatus.PLATFORM_CHECKING;
final OrderStatus targetOrderStatus = OrderStatus.WAITING_RECEIVE;
int updateBuyerCnt = buyerOrderMapper.updateStatusByOrderCode(orderCode, buyerUid,
expectOrderStatus.getCode(), targetOrderStatus.getCode(), DateUtil.getCurrentTimeSecond());
/**
* 更新卖家订单状态,
* 退款给卖家(仅退一次)
*
*/
//记录物流信息
expressInfoService.appraiseSuccess(buyerUid, expressCompanyId, orderCode, wayBillCode, depotNum);
if (updateBuyerCnt == 1){
//平台已发货给买家
inBoxFacade.depotDeliver2Buyer(buyerUid, orderCode);
}else{
LOGGER.warn("in appraiseSuccess, buyer Order pstatus {}, expect expectOrderStatus {}",
buyerOrder.getStatus(), expectOrderStatus);
throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE);
}
SellerOrder tso = new SellerOrder();
tso.setUid(sellerUid);
tso.setOrderCode(sellerOrderCode);
tso.setStatus(targetSoStatus.getCode());
tso.setUpdateTime(DateUtil.getCurrentTimeSecond());
tso.setExceptStatus(expectSOStatus.getCode());
int soCnt = sellerOrderMapper.updateByOrderCode(tso);
if (soCnt == 1){
LOGGER.info("in appraiseSuccess, refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, sellerOrderCode, skup, earnestMoney );
}else{
LOGGER.warn("in appraiseSuccess, seller Order pstatus {}, expect Seller Order Status {}",
sellerOrder.getStatus(), expectSOStatus);
throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE);
}catch (Exception ex){
LOGGER.warn("in appraiseSuccess,transferMon or refund fail, req {}", req, ex);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(200)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
}finally {
// 更新买家订单状态
LOGGER.info("appraiseSuccess update buyer order {} ", buyerOrder);
final OrderStatus expectOrderStatus = OrderStatus.PLATFORM_CHECKING;
final OrderStatus targetOrderStatus = OrderStatus.WAITING_RECEIVE;
int updateBuyerCnt = buyerOrderMapper.updateStatusByOrderCode(orderCode, buyerUid,
expectOrderStatus.getCode(), targetOrderStatus.getCode(), DateUtil.getCurrentTimeSecond());
if (updateBuyerCnt != 1){
LOGGER.warn("in appraiseSuccess, buyer Order pstatus {}, expect expectOrderStatus {}",
buyerOrder.getStatus(), expectOrderStatus);
}
/**
* 更新卖家订单状态,
* 退款给卖家(仅退一次)
*
*/
SellerOrder tso = new SellerOrder();
tso.setUid(sellerUid);
tso.setOrderCode(sellerOrderCode);
tso.setStatus(targetSoStatus.getCode());
tso.setUpdateTime(DateUtil.getCurrentTimeSecond());
tso.setExceptStatus(expectSOStatus.getCode());
int soCnt = sellerOrderMapper.updateByOrderCode(tso);
if (soCnt == 1){
LOGGER.info("in appraiseSuccess, refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, sellerOrderCode, skup, earnestMoney );
}else{
LOGGER.warn("in appraiseSuccess, seller Order pstatus {}, expect Seller Order Status {}",
sellerOrder.getStatus(), expectSOStatus);
}
}
//TODO 通知买家发货
//通知卖家退还保证金
BuyerConfirmEvent buyerConfirmEvent = BuyerConfirmEvent.builder().uid(buyerUid).orderCode(orderCode).build();
EventBusPublisher.publishEvent(buyerConfirmEvent);
//流水
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
//记录物流信息
expressInfoService.appraiseSuccess(buyerUid, expressCompanyId, orderCode, wayBillCode, depotNum);
//
inBoxFacade.depotDeliver2Buyer(buyerUid, orderCode);
return true;
}
... ... @@ -222,26 +215,15 @@ public class AppraiseService {
.build();
EventBusPublisher.publishEvent(buyererBillLogEvent);
}finally {
// 更新买家订单状态 为鉴定不通过
OrderStatus targetStatus = OrderStatus.CHECKING_FAKE;
LOGGER.info("appraiseFail update buyer order {} ", buyerOrder);
// TODO 最好把其他不用更新的值置为null,以免并发修改其他无关此场景的字段
// TODO 通过修改记录状态来控制并发操作“鉴定不通过” 修改状态带上原始状态,成功修改完状态后再调用分账接口
buyerOrderMapper.updateStatusByOrderCode(orderCode, buyerUid, expectStatus.getCode(), targetStatus.getCode(),
DateUtil.getCurrentTimeSecond());
//更新物流信息,写到最后
expressInfoService.appraiseFail(sellerUid, expressCompanyId, orderCode, wayBillCode, depotNum);
return true;
}
}
}
... ...
... ... @@ -210,8 +210,18 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
}else{
logger.warn("buyer delete fail, order status {}", status);
}
return false;
}
@Override
public void confirmReceive(long orderCode) {
logger.info("in confirmReceive, orderCode {}", orderCode);
OrderStatus expectStatus = OrderStatus.SELLER_SEND_OUT;
OrderStatus targetStatus = OrderStatus.PLATFORM_CHECKING;
BuyerOrder buyerOrder = buyerOrderMapper.selectByOrderCode(orderCode);
if (buyerOrder != null && buyerOrder.getStatus() == expectStatus.getCode()){
buyerOrderMapper.updateStatusByOrderCode(orderCode, buyerOrder.getUid(), expectStatus.getCode(),
targetStatus.getCode(), DateUtil.getCurrentTimeSecond());
}
}
}
... ...
... ... @@ -211,16 +211,14 @@ public class SellerOrderCancelService {
//并发控制
//refund earnestMoney
//sync skup
if (result>0) {
SellerOrderGoods sogCondition = new SellerOrderGoods();
sogCondition.setId(skup);
sogCondition.setStatus(targetSOStatus.getSkupStatus().getCode());
sellerOrderGoodsMapper.updateByPrimaryKeySelective(sogCondition);
//sync skup
SellerOrderGoods tsog = new SellerOrderGoods();
tsog.setId(skup);
productProxyService.syncSkup(tsog, targetSOStatus.getSkupStatus());
}
SellerOrderGoods sogCondition = new SellerOrderGoods();
sogCondition.setId(skup);
sogCondition.setStatus(targetSOStatus.getSkupStatus().getCode());
result += sellerOrderGoodsMapper.updateByPrimaryKeySelective(sogCondition);
//sync skup
SellerOrderGoods tsog = new SellerOrderGoods();
tsog.setId(skup);
productProxyService.syncSkup(tsog, targetSOStatus.getSkupStatus());
return result;
}
... ... @@ -251,6 +249,11 @@ public class SellerOrderCancelService {
paymentService.refund(refundReq);
logger.info("in cancelAfterPayButNotBuyAction, refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
}catch (Exception ex){
logger.warn("in appraiseSuccess, refund fail, req {}", refundReq, ex);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(200)
... ... @@ -266,13 +269,6 @@ public class SellerOrderCancelService {
SellerOrderStatusNode statusNode = SellerOrderStatusNode.builder().targetStatus(targetSOStatus)
.exceptStatus(expectStatus).build();
result = cancelBeforePayAction(sellerUid, orderCode, skup, statusNode);
//refund earnestMoney
if (result>0){
}
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
return result;
}
... ... @@ -292,10 +288,7 @@ public class SellerOrderCancelService {
logger.info("in seller cancel After Pay while Exist Buy Action, uid {}, orderCode {}, buyerOrderCode {}",
sellerUid, sellerOrderCode, buyerOrderCode);
//TODO 分赃(分账) 有待考虑使用2比对
TransferMoneyRequest tmReq = TransferMoneyRequest.builder().buyerOrderCode(buyerOrderCode)
.type(TransferCase.SELLER_PLAY_BUYER.getCode()).build();
paymentService.transferMon(tmReq);
BigDecimal goodsMoney = buyerOrder.getAmount();
PaymentRequest req = PaymentRequest.builder().uid(buyerUid)
... ... @@ -307,51 +300,56 @@ public class SellerOrderCancelService {
.amount(goodsMoney)
.skup(sellerOrder.getSkup());
try{
//TODO 分赃(分账) 有待考虑使用2比对
TransferMoneyRequest tmReq = TransferMoneyRequest.builder().buyerOrderCode(buyerOrderCode)
.type(TransferCase.SELLER_PLAY_BUYER.getCode()).build();
paymentService.transferMon(tmReq);
paymentService.refund(req);
BillLogEvent buyererBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(buyererBillLogEvent);
//
inBoxFacade.noticeBuyerWhenSellerCancelAfterPaid(buyerUid, buyerOrderCode);
//TODO 异步
SellerOrderGoods psog = sellerOrderGoodsMapper.selectByPrimaryKey(sellerOrder.getSkup());
inBoxFacade.sellerCancelAfterBuyerPaid(sellerUid, psog.getProductName());
}catch (Exception ex){
logger.warn("in cancelAfterPayExistBuyAction , refund fail,req {}", req, ex);
BillLogEvent buyererBillLogEvent = bleb.tradeStatus(200)
.build();
EventBusPublisher.publishEvent(buyererBillLogEvent);
return 0;
}
int result = 0;
}finally{
int result = 0;
//actions of buyer order and related
//update buyer Order
//target Buyer Order Status
Integer targetBOStatus;
targetBOStatus = OrderStatus.SELLER_CANCEL_AFTER_PAY.getCode();
BuyerOrder tbo = new BuyerOrder();
tbo.setUid(buyerUid);
tbo.setOrderCode(buyerOrderCode);
tbo.setStatus(targetBOStatus);
tbo.setUpdateTime(DateUtil.getCurrentTimeSecond());
result += buyerOrderMapper.updateByOrderCode(tbo);
//update seller order
SellerOrderStatus targetSOStatus;
targetSOStatus = SellerOrderStatus.PLAY_BUYER;
SellerOrder target = new SellerOrder();
target.setOrderCode(sellerOrderCode);
target.setUid(sellerUid);
target.setStatus(targetSOStatus.getCode());
target.setUpdateTime(DateUtil.getCurrentTimeSecond());
target.setExceptStatus(SellerOrderStatus.HAS_PAYED.getCode());
result += sellerOrderMapper.updateByOrderCode(target);
//actions of buyer order and related
//update buyer Order
//target Buyer Order Status
Integer targetBOStatus;
targetBOStatus = OrderStatus.SELLER_CANCEL_AFTER_PAY.getCode();
BuyerOrder tbo = new BuyerOrder();
tbo.setUid(buyerUid);
tbo.setOrderCode(buyerOrderCode);
tbo.setStatus(targetBOStatus);
tbo.setUpdateTime(DateUtil.getCurrentTimeSecond());
result += buyerOrderMapper.updateByOrderCode(tbo);
return result;
}
//update seller order
SellerOrderStatus targetSOStatus;
targetSOStatus = SellerOrderStatus.PLAY_BUYER;
SellerOrder target = new SellerOrder();
target.setOrderCode(sellerOrderCode);
target.setUid(sellerUid);
target.setStatus(targetSOStatus.getCode());
target.setUpdateTime(DateUtil.getCurrentTimeSecond());
target.setExceptStatus(SellerOrderStatus.HAS_PAYED.getCode());
result += sellerOrderMapper.updateByOrderCode(target);
BillLogEvent buyererBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(buyererBillLogEvent);
//
inBoxFacade.noticeBuyerWhenSellerCancelAfterPaid(buyerUid, buyerOrderCode);
//TODO 异步
SellerOrderGoods psog = sellerOrderGoodsMapper.selectByPrimaryKey(sellerOrder.getSkup());
inBoxFacade.sellerCancelAfterBuyerPaid(sellerUid, psog.getProductName());
return result;
}
private int cancelAfterPayAction(SellerOrder sellerOrder, BuyerOrder buyerOrder){
... ... @@ -460,45 +458,38 @@ public class SellerOrderCancelService {
PayRefundBo payRefundBo = paymentService.refund(refundReq);
logger.info("in yoho Off Shelve Cancel , refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
inBoxFacade.notifyUnshelfCauseBySpecialReason(sellerUid, psog.getProductName());
}catch (Exception ex){
logger.warn("in yoho Off Shelve Cancel, refund earnestMoney fail, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney, ex);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(200)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
return;
}
final SellerOrderStatus targetSellerOrderStatus = SellerOrderStatus.YOHO_CANCEL_SELL;
//TODO check skup is buy away
SellerOrderGoods targetGoods = new SellerOrderGoods();
targetGoods.setId(skup);
targetGoods.setStatus(targetSellerOrderStatus.getSkupStatus().getCode());
targetGoods.setExceptStatus(skupStatus);
//利用数据库做并发控制
int result = sellerOrderGoodsMapper.updateStatusBySkpu(targetGoods);
if (result == 0) {
return;
}
SellerOrder tso = new SellerOrder();
tso.setOrderCode(sellerOrder.getOrderCode());
tso.setExceptStatus(sellerOrder.getStatus());
tso.setStatus(targetSellerOrderStatus.getCode());
tso.setUid(sellerUid);
tso.setUpdateTime(DateUtil.getCurrentTimeSecond());
result = sellerOrderMapper.updateByOrderCode(tso);
BillLogEvent sellerBillLogEvent = bleb.tradeStatus(100)
.build();
EventBusPublisher.publishEvent(sellerBillLogEvent);
//refund earnestMoney only has payed
if (isPayEarnestMoney && result > 0) {
}finally {
final SellerOrderStatus targetSellerOrderStatus = SellerOrderStatus.YOHO_CANCEL_SELL;
//TODO check skup is buy away
SellerOrderGoods targetGoods = new SellerOrderGoods();
targetGoods.setId(skup);
targetGoods.setStatus(targetSellerOrderStatus.getSkupStatus().getCode());
targetGoods.setExceptStatus(skupStatus);
//利用数据库做并发控制
int result = sellerOrderGoodsMapper.updateStatusBySkpu(targetGoods);
if (result == 0) {
return;
}
SellerOrder tso = new SellerOrder();
tso.setOrderCode(sellerOrder.getOrderCode());
tso.setExceptStatus(sellerOrder.getStatus());
tso.setStatus(targetSellerOrderStatus.getCode());
tso.setUid(sellerUid);
tso.setUpdateTime(DateUtil.getCurrentTimeSecond());
result = sellerOrderMapper.updateByOrderCode(tso);
}
inBoxFacade.notifyUnshelfCauseBySpecialReason(sellerUid, psog.getProductName());
}
}
... ...