Authored by Lixiaodi

Merge branch 'dev' of http://git.yoho.cn/ufo/yohoufo-fore into dev

... ... @@ -11,7 +11,7 @@ import java.util.List;
public class ActionStatusHold {
public static List<Integer> getSellerCanRefundStatus(){
public static List<Integer> getSellerCanCancelStatus(){
List<Integer> sellerCanCancelStatus;
sellerCanCancelStatus = Arrays.asList(SellerOrderStatus.WAITING_PAY.getCode(),
SellerOrderStatus.HAS_PAYED.getCode());
... ... @@ -22,8 +22,7 @@ public class ActionStatusHold {
static List<Integer> sellerCanRefundStatus;
static {
sellerCanRefundStatus = Arrays.asList(
SellerOrderStatus.YOHO_CANCEL_SELL.getCode(),
SellerOrderStatus.FINISH.getCode());
SellerOrderStatus.HAS_PAYED.getCode());
}
public static List<Integer> getSellerCanRefundEarnestMoneyStatus(){
... ...
package com.yohoufo.order.common;
/**
* 1:鉴定通过(货款-->卖家);
* 2:鉴定不通过(保证金 --> 买家);
* 3:有买家时卖家不卖了(保证金 --> 买家)
* Created by chenchao on 2018/10/9.
*/
public enum TransferCase {
APPRAISE_SUCCESS(1),
APPRAISE_FAIL(2),
SELLER_PLAY_BUYER(3);
private int code;
TransferCase(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
... ...
package com.yohoufo.order.controller;
import com.yoho.core.rest.annotation.ServiceDesc;
import com.yohobuy.ufo.model.order.bo.AppraiseExpressInfoBo;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.annotation.IgnoreSession;
import com.yohoufo.common.annotation.IgnoreSignature;
import com.yohoufo.order.service.impl.AppraiseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
... ... @@ -14,8 +17,12 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2018/9/25
*/
@RestController
@RequestMapping(value="/order/appraise")
@ServiceDesc("orderAppraise")
public class AppraiseController {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private AppraiseService appraiseService;
... ... @@ -24,10 +31,11 @@ public class AppraiseController {
* 提供给运营平台使用
* @return
*/
@RequestMapping(params = "method=ufo.order.appraiseFail")
@RequestMapping(value="/reject")
@IgnoreSession
@IgnoreSignature
public ApiResponse appraiseFail(AppraiseExpressInfoBo appraiseExpressInfoBo) {
logger.info("in appraise Fail, req {}", appraiseExpressInfoBo);
boolean result = appraiseService.appraiseFail(appraiseExpressInfoBo.getExpressCompanyId(), appraiseExpressInfoBo.getOrderCode(), appraiseExpressInfoBo.getWayBillCode());
return new ApiResponse.ApiResponseBuilder().code(200)
.data(result).message("").build();
... ... @@ -37,10 +45,11 @@ public class AppraiseController {
* 鉴定通过,鉴定中心发货给买家
* @return
*/
@RequestMapping(params = "method=ufo.order.appraiseSuccess")
@RequestMapping(value="/pass")
@IgnoreSession
@IgnoreSignature
public ApiResponse appraiseSuccess(AppraiseExpressInfoBo appraiseExpressInfoBo) {
logger.info("in appraiseSuccess, req {}", appraiseExpressInfoBo);
boolean result = appraiseService.appraiseSuccess(appraiseExpressInfoBo.getExpressCompanyId(), appraiseExpressInfoBo.getOrderCode(), appraiseExpressInfoBo.getWayBillCode());
return new ApiResponse.ApiResponseBuilder().code(200)
.data(result).message("").build();
... ...
... ... @@ -50,6 +50,9 @@ public final class SellerOrderConvertor {
public static String formatFee(BigDecimal fee){
if (null == fee){
return null;
}
return PriceFormater.addCnCurrencySymbol(BigDecimalHelper.formatNumber(fee, BigDecimalHelper.FORMAT_TWOBITAFTERPOINT));
}
}
... ...
package com.yohoufo.order.model;
import com.yohobuy.ufo.model.order.resp.ExpressInfoDetail;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.common.utils.TimeUtils;
import com.yohoufo.order.common.OrderCodeType;
... ... @@ -49,6 +50,11 @@ public class OrderInfo {
private Integer createTime;
/**
* 最新物流
*/
private ExpressInfoDetail lastExpressInfo;
/**
* 获取实付金额分
* @return
*/
... ...
... ... @@ -11,9 +11,11 @@ import com.yohoufo.dal.order.model.BuyerOrderGoods;
import com.yohoufo.dal.order.model.SellerOrder;
import com.yohoufo.order.common.OrderStatus;
import com.yohoufo.order.common.SellerOrderStatus;
import com.yohoufo.order.common.TransferCase;
import com.yohoufo.order.event.BuyerConfirmEvent;
import com.yohoufo.order.event.EventBusPublisher;
import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.model.request.TransferMoneyRequest;
import com.yohoufo.order.service.IExpressInfoService;
import com.yohoufo.order.service.IPaymentService;
import org.slf4j.Logger;
... ... @@ -58,6 +60,32 @@ public class AppraiseService {
//记录物流信息
expressInfoService.appraiseSuccess(buyerUid=buyerOrder.getUid(),expressCompanyId, orderCode, wayBillCode);
BuyerOrderGoods bog = buyerOrderGoodsMapper.selectByOrderCode(buyerUid, orderCode);
int skup = bog.getSkup();
SellerOrder sellerOrder = sellerOrderMapper.selectBySkup(skup);
final SellerOrderStatus expectSOStatus = SellerOrderStatus.HAS_PAYED;
final SellerOrderStatus targetSoStatus = SellerOrderStatus.FINISH;
if (!expectSOStatus.equals(sellerOrder.getStatus())){
LOGGER.warn("in appraiseSuccess, seller Order pstatus {}, expect Seller Order Status {}",
sellerOrder.getStatus(), expectSOStatus);
throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE);
}
final Integer sellerUid = sellerOrder.getUid();
final Long sellerOrderCode = sellerOrder.getOrderCode();
/**
* 退保证金给卖家
*/
//refund earnestMoney
BigDecimal earnestMoney = sellerOrder.getEarnestMoney();
PaymentRequest req = PaymentRequest.builder().uid(sellerUid)
.orderCode(sellerOrderCode).refundAmount(earnestMoney.doubleValue())
.build();
paymentService.refund(req);
//分账
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;
... ... @@ -70,52 +98,34 @@ public class AppraiseService {
* 退款给卖家(仅退一次)
*
*/
// 退保证金给卖家
if (updateBuyerCnt == 1){
BuyerOrderGoods bog = buyerOrderGoodsMapper.selectByOrderCode(buyerUid, orderCode);
int skup = bog.getSkup();
SellerOrder sellerOrder = sellerOrderMapper.selectBySkup(skup);
final SellerOrderStatus expectSOStatus = SellerOrderStatus.HAS_PAYED;
final SellerOrderStatus targetSoStatus = SellerOrderStatus.FINISH;
if (!expectSOStatus.equals(sellerOrder.getStatus())){
LOGGER.warn("in appraiseSuccess, seller Order pstatus {}, expect Seller Order Status {}",
sellerOrder.getStatus(), expectSOStatus);
throw new ServiceException(ServiceError.ORDER_STATUS_INVALIDATE);
}
final Integer sellerUid = sellerOrder.getUid();
final Long sellerOrderCode = sellerOrder.getOrderCode();
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){
//refund earnestMoney
BigDecimal earnestMoney = sellerOrder.getEarnestMoney();
PaymentRequest req = PaymentRequest.builder().uid(sellerUid)
.orderCode(sellerOrderCode).refundAmount(earnestMoney.doubleValue())
.build();
paymentService.refund(req);
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);
}
//TODO 通知买家发货
//通知卖家退还保证金
BuyerConfirmEvent buyerConfirmEvent = BuyerConfirmEvent.builder().uid(buyerUid).orderCode(orderCode).build();
EventBusPublisher.publishEvent(buyerConfirmEvent);
}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);
}
//TODO 通知买家发货
//通知卖家退还保证金
BuyerConfirmEvent buyerConfirmEvent = BuyerConfirmEvent.builder().uid(buyerUid).orderCode(orderCode).build();
EventBusPublisher.publishEvent(buyerConfirmEvent);
return true;
}
... ... @@ -130,15 +140,15 @@ public class AppraiseService {
//更新物流信息
expressInfoService.appraiseFail(buyerOrder.getSellerUid(),expressCompanyId, orderCode, wayBillCode);
//分账
TransferMoneyRequest tmReq = TransferMoneyRequest.builder().buyerOrderCode(orderCode)
.type(TransferCase.APPRAISE_FAIL.getCode()).build();
paymentService.transferMon(tmReq);
// 更新买家订单状态
buyerOrder.setStatus(OrderStatus.CHECKING_FAKE.getCode());
buyerOrder.setUpdateTime(DateUtil.getCurrentTimeSecond());
LOGGER.info("appraiseFail update buyer order {} ", buyerOrder);
buyerOrderMapper.updateByPrimaryKeySelective(buyerOrder);
//TODO 开始分账
return true;
}
}
... ...
... ... @@ -15,6 +15,7 @@ import com.yohoufo.order.common.*;
import com.yohoufo.order.event.ErpCancelSellerOrderEvent;
import com.yohoufo.order.event.OrderCancelEvent;
import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.model.request.TransferMoneyRequest;
import com.yohoufo.order.mq.TopicConstants;
import com.yohoufo.order.mq.producer.TradeMqSender;
import com.yohoufo.order.service.IPaymentService;
... ... @@ -27,7 +28,6 @@ import com.yohoufo.order.service.support.codegenerator.bean.CodeMeta;
import com.yohoufo.order.utils.LoggerUtils;
import lombok.experimental.Builder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ... @@ -115,7 +115,7 @@ public class SellerOrderCancelService {
if (Objects.isNull(status)){
return result;
}
List<Integer> sellerCanCancelStatus = ActionStatusHold.getSellerCanRefundStatus();
List<Integer> sellerCanCancelStatus = ActionStatusHold.getSellerCanCancelStatus();
if (!sellerCanCancelStatus.contains(status)){
logger.warn("seller cancel can not execute in this status, uid {} orderCode {}, status {}", uid, orderCode, status);
throw new ServiceException(ServiceError.ORDER_REQUEST_PARM_IS_EMPTY);
... ... @@ -226,26 +226,30 @@ public class SellerOrderCancelService {
*/
final int sellerUid = sellerOrder.getUid();
final long orderCode = sellerOrder.getOrderCode();
int skup = sellerOrder.getSkup();
logger.info("in seller cancel when Seller Pay But Not Buy Action, uid {}, orderCode {}",
sellerUid, orderCode);
double earnestMoney = sellerOrder.getEarnestMoney().doubleValue();
PaymentRequest refundReq = PaymentRequest.builder().uid(sellerUid)
.orderCode(orderCode)
.refundAmount(earnestMoney).build();
paymentService.refund(refundReq);
logger.info("in cancelAfterPayButNotBuyAction, refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney );
int result = 0;
SellerOrderStatus targetSOStatus;
targetSOStatus = SellerOrderStatus.PLAY_SELF;
SellerOrderStatus expectStatus = SellerOrderStatus.HAS_PAYED;
int skup = sellerOrder.getSkup();
SellerOrderStatusNode statusNode = SellerOrderStatusNode.builder().targetStatus(targetSOStatus)
.exceptStatus(expectStatus).build();
result = cancelBeforePayAction(sellerUid, orderCode, skup, statusNode);
//refund earnestMoney
if (result>0){
double earnestMoney = sellerOrder.getEarnestMoney().doubleValue();
PaymentRequest refundReq = PaymentRequest.builder().uid(sellerUid)
.orderCode(orderCode)
.refundAmount(earnestMoney).build();
paymentService.refund(refundReq);
logger.info("in cancelAfterPayButNotBuyAction, refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney );
}
return result;
}
... ... @@ -264,6 +268,11 @@ 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);
int result = 0;
//actions of buyer order and related
... ... @@ -290,10 +299,8 @@ public class SellerOrderCancelService {
target.setExceptStatus(SellerOrderStatus.HAS_PAYED.getCode());
result += sellerOrderMapper.updateByOrderCode(target);
//TODO 分赃(分账) 有待考虑使用2比对
if(result == 2){
}
return result;
}
... ... @@ -307,8 +314,6 @@ public class SellerOrderCancelService {
int buyOrderCnt = buyerOrder== null ? 0 : 1;
if (buyOrderCnt == 0){
/**case 2: 支付完成,没有买家下单
* actions as blow:
... ... @@ -388,6 +393,16 @@ public class SellerOrderCancelService {
logger.warn("in offShelveCancelCase, SellerOrderGoods status illegal, skup {}, status {}", skup, skupStatus);
return;
}
SellerOrder sellerOrder = sellerOrderMapper.selectBySkup(skup);
Integer sellerUid = sellerOrder.getUid();
Long orderCode = sellerOrder.getOrderCode();
double earnestMoney = sellerOrder.getEarnestMoney().doubleValue();
PaymentRequest refundReq = PaymentRequest.builder().uid(sellerOrder.getUid())
.orderCode(sellerOrder.getOrderCode())
.refundAmount(earnestMoney).build();
paymentService.refund(refundReq);
logger.info("in yoho Off Shelve Cancel , refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney );
final SellerOrderStatus targetSellerOrderStatus = SellerOrderStatus.YOHO_CANCEL_SELL;
//TODO check skup is buy away
... ... @@ -401,9 +416,6 @@ public class SellerOrderCancelService {
return;
}
SellerOrder sellerOrder = sellerOrderMapper.selectBySkup(skup);
Integer sellerUid = sellerOrder.getUid();
Long orderCode = sellerOrder.getOrderCode();
SellerOrder tso = new SellerOrder();
tso.setOrderCode(sellerOrder.getOrderCode());
tso.setExceptStatus(sellerOrder.getStatus());
... ... @@ -413,13 +425,7 @@ public class SellerOrderCancelService {
result = sellerOrderMapper.updateByOrderCode(tso);
//refund earnestMoney only has payed
if (isPayEarnestMoney && result > 0) {
double earnestMoney = sellerOrder.getEarnestMoney().doubleValue();
PaymentRequest refundReq = PaymentRequest.builder().uid(sellerOrder.getUid())
.orderCode(sellerOrder.getOrderCode())
.refundAmount(earnestMoney).build();
paymentService.refund(refundReq);
logger.info("in yoho Off Shelve Cancel , refund earnestMoney finish, seller {}, order code {}, skup {}, earnestMoney {}",
sellerUid, orderCode, skup, earnestMoney );
}
}
... ...