Authored by wujiexiang

求购商品状态

Showing 32 changed files with 302 additions and 238 deletions
... ... @@ -209,7 +209,7 @@ public class BuyerOrder {
*
* @return
*/
public boolean isBuyerBidOrder() {
public boolean isBidOrder() {
return bidType == OrderConstant.BUYER_BID_TYPE;
}
... ...
... ... @@ -8,5 +8,12 @@ public interface BidStoragePriceMapper {
BidStoragePrice selectBySkup(int skup);
/**
*
* @param skup
* @param sourceStatus
* @param targetStatus
* @return
*/
int updateStatus(@Param("skup") int skup, @Param("sourceStatus") int sourceStatus, @Param("targetStatus") int targetStatus);
}
... ...
package com.yohoufo.dal.product.model;
import com.yohobuy.ufo.model.order.common.SkupStatus;
import com.yohobuy.ufo.model.order.constants.OrderConstant;
import com.yohobuy.ufo.model.order.common.BidSkupStatus;
import lombok.Data;
import lombok.ToString;
... ... @@ -31,7 +30,9 @@ public class BidStoragePrice {
private Integer attribute;
//0:未上架,1:上架
/**
* @see com.yohobuy.ufo.model.order.common.BidSkupStatus
*/
private Integer status;
/**
... ... @@ -40,10 +41,14 @@ public class BidStoragePrice {
* @return
*/
public boolean isCanceled() {
return status != null && status == SkupStatus.SELLER_CANCEL_SELL.getCode();
return status != null && BidSkupStatus.isCancelStatus(status);
}
/**
* 可售状态
* @return
*/
public boolean isSaleable() {
return status != null && status == SkupStatus.CAN_SELL.getCode();
return status != null && status == BidSkupStatus.BIDING.getCode();
}
}
... ...
... ... @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;
import java.math.BigDecimal;
import java.util.Objects;
/**
* 出购价
... ... @@ -25,9 +26,15 @@ public class BidAndSuggestPrice {
Assert.notNull(prdPrice, "prdPrice must not be null");
Assert.notNull(prdPrice, "buyerBidConfig must not be null");
validateBase(prdPrice, prdPriceRange);
validateBidPriceConfig(prdPrice, BigDecimal.valueOf(bidAndSuggestConfig.getMinBidPrice()));
BigDecimal minBidPrice = BigDecimal.valueOf(bidAndSuggestConfig.getMinBidPrice());
validateBidPriceConfig(prdPrice, minBidPrice);
this.price = prdPrice;
this.suggestPrice = calculateSuggestPrice(prdPriceRange.getLeastPrice(), bidAndSuggestConfig.getSuggestRate());
//leastPrice 现货最低价,如果为null,则赋值为系统要求的最小求购价
BigDecimal leastPrice;
if (Objects.isNull(leastPrice = prdPriceRange.getLeastPrice())) {
leastPrice = minBidPrice;
}
this.suggestPrice = calculateSuggestPrice(leastPrice, bidAndSuggestConfig.getSuggestRate());
}
/**
... ... @@ -65,7 +72,7 @@ public class BidAndSuggestPrice {
* @param leastPrice 现货最低价
* @param suggestRate 建议比例
*/
public BigDecimal calculateSuggestPrice(BigDecimal leastPrice, double suggestRate) {
public BigDecimal calculateSuggestPrice(BigDecimal leastPrice,double suggestRate) {
log.info("in BidAndSuggestPrice, leastPrice:{}, suggestRate:{}", leastPrice, suggestRate);
String priceText = leastPrice.multiply(BigDecimal.valueOf(suggestRate)).setScale(0, BigDecimal.ROUND_DOWN).toPlainString();
String endNumber = "9";
... ...
package com.yohoufo.order.model.request;
import com.yohobuy.ufo.model.order.common.TabType;
import com.yohoufo.order.common.Operator;
import com.yohoufo.order.event.OrderCancelEvent;
import lombok.AllArgsConstructor;
import lombok.Data;
... ... @@ -27,4 +28,7 @@ public class OrderRequest {
String appVersion;
//操作者
Operator operator;
}
... ...
... ... @@ -11,6 +11,8 @@ public interface DelayTime {
int BUYER_ORDER_WAITING_PAY = 10;
int BUYER_ORDER_WAITING_PAY_DEPOSIT = 15;
int MINUTES_36_HOURS = 36*60;
... ...
... ... @@ -12,6 +12,10 @@ public interface TopicConstants {
String BUYER_ORDER_AUTO_CANCEL = "buyerOrder.autoCancel";
String BUYER_ORDER_AUTO_CANCEL_AFTER_N_DAY = "buyerOrder.autoCancelAfterNDay";
/**
* 买家订单自动确认
* 7天自动确认
... ...
package com.yohoufo.order.mq.consumer;
import com.yohoufo.order.event.OrderCancelEvent;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.service.IBuyerOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BuyerOrderAutoCancelDelay15DayMsgConsumer extends AbsOrderAutoCancelDelayMsgConsumer {
@Autowired
private IBuyerOrderService buyerOrderService;
@Override
public String getTopic() {
return "buyerOrder.autoCancelAfter15Day";
}
@Override
public void cancel(OrderCancelEvent event) {
int uid = event.getUid();
long orderCode = event.getOrderCode();
OrderRequest req = OrderRequest.builder().uid(uid).orderCode(orderCode).build();
buyerOrderService.cancelBidByAuto(req);
}
@Override
public void sendAgain(OrderCancelEvent cancelBean) {
}
}
package com.yohoufo.order.mq.consumer;
import com.yohoufo.order.event.OrderCancelEvent;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.service.IBuyerOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BuyerOrderAutoCancelDelay30DayMsgConsumer extends AbsOrderAutoCancelDelayMsgConsumer {
@Autowired
private IBuyerOrderService buyerOrderService;
@Override
public String getTopic() {
return "buyerOrder.autoCancelAfter30Day";
}
@Override
public void cancel(OrderCancelEvent event) {
int uid = event.getUid();
long orderCode = event.getOrderCode();
OrderRequest req = OrderRequest.builder().uid(uid).orderCode(orderCode).build();
buyerOrderService.cancelBidByAuto(req);
}
@Override
public void sendAgain(OrderCancelEvent cancelBean) {
}
}
package com.yohoufo.order.mq.consumer;
import com.yohoufo.order.event.OrderCancelEvent;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.service.IBuyerOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BuyerOrderAutoCancelDelay3DayMsgConsumer extends AbsOrderAutoCancelDelayMsgConsumer {
@Autowired
private IBuyerOrderService buyerOrderService;
@Override
public String getTopic() {
return "buyerOrder.autoCancelAfter3Day";
}
@Override
public void cancel(OrderCancelEvent event) {
int uid = event.getUid();
long orderCode = event.getOrderCode();
OrderRequest req = OrderRequest.builder().uid(uid).orderCode(orderCode).build();
buyerOrderService.cancelBidByAuto(req);
}
@Override
public void sendAgain(OrderCancelEvent cancelBean) {
}
}
package com.yohoufo.order.mq.consumer;
import com.yohoufo.order.event.OrderCancelEvent;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.service.IBuyerOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BuyerOrderAutoCancelDelay7DayMsgConsumer extends AbsOrderAutoCancelDelayMsgConsumer {
@Autowired
private IBuyerOrderService buyerOrderService;
@Override
public String getTopic() {
return "buyerOrder.autoCancelAfter7Day";
}
@Override
public void cancel(OrderCancelEvent event) {
int uid = event.getUid();
long orderCode = event.getOrderCode();
OrderRequest req = OrderRequest.builder().uid(uid).orderCode(orderCode).build();
buyerOrderService.cancelBidByAuto(req);
}
@Override
public void sendAgain(OrderCancelEvent cancelBean) {
}
}
package com.yohoufo.order.mq.consumer;
import com.yohoufo.order.common.Operator;
import com.yohoufo.order.event.OrderCancelEvent;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.mq.TopicConstants;
import com.yohoufo.order.service.IBuyerOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BuyerOrderAutoCancelDelay1DayMsgConsumer extends AbsOrderAutoCancelDelayMsgConsumer {
public class BuyerOrderAutoCancelDelayNDayMsgConsumer extends AbsOrderAutoCancelDelayMsgConsumer {
@Autowired
private IBuyerOrderService buyerOrderService;
@Override
public String getTopic() {
return "buyerOrder.autoCancelAfter1Day";
return TopicConstants.BUYER_ORDER_AUTO_CANCEL_AFTER_N_DAY;
}
@Override
public void cancel(OrderCancelEvent event) {
int uid = event.getUid();
long orderCode = event.getOrderCode();
OrderRequest req = OrderRequest.builder().uid(uid).orderCode(orderCode).build();
buyerOrderService.cancelBidByAuto(req);
OrderRequest req = OrderRequest.builder().uid(uid).orderCode(orderCode).operator(Operator.SYSTEM).build();
buyerOrderService.cancelBiding(req);
}
@Override
... ...
... ... @@ -97,7 +97,6 @@ public abstract class AbstractBuyerOrderStateChanger<T extends RequestedStatusCh
if (beforeChange(statusChangeBuyerOrder)) {
if (doChange(statusChangeBuyerOrder)) {
afterChange(statusChangeBuyerOrder);
logger.info("[{}] status changed success", buyerOrder.getOrderCode());
//清理缓存
cacheCleaner.cleanList(buyerOrder.getUid(), TabType.BUY.getValue());
} else {
... ... @@ -147,6 +146,7 @@ public abstract class AbstractBuyerOrderStateChanger<T extends RequestedStatusCh
);
boolean success = rows > 0;
if (success) {
logger.info("[{}] status was changed in db", buyerOrder.getOrderCode());
try {
orderStatusFlowService.addAsy(orderCode, targetStatus.getCode());
} catch (Exception ex) {
... ...
... ... @@ -35,10 +35,10 @@ public interface IBuyerOrderService {
void cancelByAuto(OrderRequest orderRequest);
/**
* 取消求购订单
* 取消求购中的订单
* @param orderRequest
*/
void cancelBidByAuto(OrderRequest orderRequest);
void cancelBiding(OrderRequest orderRequest);
/**
* 提交订单
... ...
... ... @@ -107,7 +107,7 @@ public class BuyerBidPriceService {
logger.info("[{}] will change price,orderCode:{},oldSkup:{}", uid, context.buyerOrder.getOrderCode(), oldSkup);
//调价前将原skup取消,若生成新skup失败,则需要手动恢复原skup
bidProductProxyService.tryCancelSale(oldSkup);
bidProductProxyService.cancelSaleByUser(oldSkup);
logger.info("[{}] was canceled success", oldSkup);
//构建参数
... ...
... ... @@ -340,7 +340,7 @@ public class BuyerBidPublishService {
BuyerOrderDelayCancelEvent buyerCancelEvent = BuyerOrderDelayCancelEvent.builder().uid(uid)
.orderCode(bidPublishResult.getOrderCode())
.topic(TopicConstants.BUYER_ORDER_AUTO_CANCEL)
.delayTime(DelayTime.BUYER_ORDER_WAITING_PAY)
.delayTime(DelayTime.BUYER_ORDER_WAITING_PAY_DEPOSIT)
.build();
EventBusPublisher.publishEvent(buyerCancelEvent);
}
... ...
... ... @@ -161,11 +161,11 @@ public class BuyerOrderDetailService extends AbsOrderDetailService implements IO
String detailDesc = temp;
Integer orderStatus = buyerOrder.getStatus();
try {
if (buyerOrder.isBuyerBidOrder() && orderStatus == OrderStatus.BIDING.getCode()) {
if (buyerOrder.isBidOrder() && orderStatus == OrderStatus.BIDING.getCode()) {
//求购中状态
BidOrderMetaBo bidOrderMetaBo = buyerOrderMetaMapperSupport.selectByMetaKey(buyerOrder.getUid(), buyerOrder.getOrderCode(), MetaKey.BID_KEY, BidOrderMetaBo.class);
detailDesc = String.format(temp, bidOrderMetaBo.getDay());
} else if (buyerOrder.isBuyerBidOrder() && orderStatus == OrderStatus.WAITING_PAY.getCode()) {
} else if (buyerOrder.isBidOrder() && orderStatus == OrderStatus.WAITING_PAY.getCode()) {
//求购 待付尾款
detailDesc = OrderDetailDesc.BID_NO_PAY;
} else if (orderStatus == OrderStatus.BUYER_CANCEL_BEFORE_DEPOT_RECEIVE.getCode()
... ...
... ... @@ -28,7 +28,6 @@ import com.yohoufo.order.event.*;
import com.yohoufo.order.model.OperateTransferExpressInfo;
import com.yohoufo.order.model.PayQueryBo;
import com.yohoufo.order.model.RequestedCancelEventStatusChangeBuyerOrder;
import com.yohoufo.order.model.RequestedStatusChangeBuyerOrder;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.model.request.SaveQualityCheckInfoRequest;
import com.yohoufo.order.model.response.OrderSummaryResp;
... ... @@ -51,7 +50,6 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Objects;
... ... @@ -389,8 +387,24 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
logger.info("Buyer Order cancel time out ,(OrderRequest) {}", orderRequest);
DataNode node = checkBase(orderRequest);
BuyerOrder buyerOrder = node.buyerOrderInDB;
if (buyerOrder.isBuyerBidOrder()) {
doCancelBidByAuto(buyerOrder, orderRequest.getOrderCancelEvent(), OrderStatus.getOrderStatus(buyerOrder.getStatus()), OrderStatus.BUYER_CANCEL_TIMEOUT);
if (buyerOrder.isBidOrder()) {
//1.待付定金
//3.待付款
OrderStatus expectStatus = OrderStatus.getOrderStatus(buyerOrder.getStatus());
OrderStatus targetStatus;
switch (expectStatus) {
case WAITING_PAY_DEPOSIT:
case WAITING_PAY:
targetStatus = OrderStatus.BUYER_CANCEL_TIMEOUT;
break;
default:
logger.warn("in buyer auto cancel fail uid {} order code {} expectStatus {}",
buyerOrder.getUid(), buyerOrder.getOrderCode(), expectStatus);
throw new UfoServiceException(401, "订单状态已变更,不能自动取消");
}
doCancelBidByAuto(buyerOrder, orderRequest.getOrderCancelEvent(), expectStatus, targetStatus);
} else {
doCancelByAuto(orderRequest, node);
}
... ... @@ -408,9 +422,14 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
orderStatusFlowService.addAsy(orderRequest.getOrderCode(), targetStatus.getCode());
}
/**
* 取消求购订单
*
* @param orderRequest
*/
@Override
public void cancelBidByAuto(OrderRequest orderRequest) {
buyerOrderStateChangers.selectOneToChange(orderRequest.getUid(), orderRequest.getOrderCode(), OrderStatus.BIDING, OrderStatus.BUYER_CANCEL_TIMEOUT, Operator.SYSTEM);
public void cancelBiding(OrderRequest orderRequest) {
buyerOrderStateChangers.selectOneToChange(orderRequest.getUid(), orderRequest.getOrderCode(), OrderStatus.BIDING, OrderStatus.BUYER_BID_CLOSE, orderRequest.getOperator());
}
private void doCancelBidByAuto(BuyerOrder buyerOrder, OrderCancelEvent orderCancelEvent, OrderStatus sourceStatus, OrderStatus targetStatus) {
... ... @@ -459,26 +478,24 @@ public class BuyerOrderServiceImpl implements IBuyerOrderService {
boolean useDepositGoods = node.useDepositGoods;
switch (expectStatus){
case WAITING_PAY_DEPOSIT:
targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_PAY;
targetStatus = OrderStatus.BUYER_BID_CLOSE;
buyerOrderStateChangers.selectOneToChange(buyerOrder, OrderStatus.WAITING_PAY_DEPOSIT, targetStatus);
break;
case BIDING:
targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_PAY;
targetStatus = OrderStatus.BUYER_BID_CLOSE;
//求购中取消
buyerOrderStateChangers.selectOneToChange(buyerOrder, OrderStatus.BIDING, targetStatus);
break;
case WAITING_PAY:
targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_PAY;
if (buyerOrder.isBuyerBidOrder()) {
if (buyerOrder.isBidOrder()) {
RequestedCancelEventStatusChangeBuyerOrder statusChangeBuyerOrder = new RequestedCancelEventStatusChangeBuyerOrder(buyerOrder,
expectStatus,
OrderStatus.BUYER_CANCEL_BEFORE_PAY,
targetStatus,
Operator.USER,
orderRequest.getOrderCancelEvent());
buyerOrderStateChangers.selectOneToChange(statusChangeBuyerOrder);
} else {
targetStatus = OrderStatus.BUYER_CANCEL_BEFORE_PAY;
cancelBeforePaid(orderRequest, node, expectStatus, targetStatus);
//取消事件
orderChangeListenerContainer.fireAsyncEvent(new BuyerOrderChangeEvent(buyerOrder, BuyerOrderChangeEvent.BizCase.CANCEL_BYBUYER, targetStatus));
... ...
... ... @@ -521,7 +521,7 @@ public class SellerOrderDetailService extends AbsOrderDetailService implements I
}else{
detailDesc = String.format(detailDesc, skupType == SkupType.FAST_DELIVERY ? 24 :72);
}
} else if (buyerOrder.isBuyerBidOrder() && orderStatus.getCode() == OrderStatus.WAITING_PAY.getCode()) {
} else if (buyerOrder.isBidOrder() && orderStatus.getCode() == OrderStatus.WAITING_PAY.getCode()) {
detailDesc = OrderDetailDesc.Seller.BID_BUYER_NO_PAY;
}
... ...
... ... @@ -43,7 +43,7 @@ public class BuyerOrderBidingCancelChanger extends AbstractBuyerOrderStateChange
* 调价时,原skup已经取消,但原订单是在新订单定金支付完后再取消
*/
int skup = sellerOrderGoods.getId();
boolean result = bidProductProxyService.isCanceled(skup) || bidProductProxyService.tryCancelSale(skup);
boolean result = bidProductProxyService.isCanceled(skup) || bidProductProxyService.cancelSale(skup, statusChangeBuyerOrder.getOperator());
logger.info("[{}] bid skup was canceled,result:{}", sellerOrderGoods.getId(), result);
return result;
}
... ... @@ -76,7 +76,6 @@ public class BuyerOrderBidingCancelChanger extends AbstractBuyerOrderStateChange
public boolean isSupport(RequestedStatusChangeBuyerOrder statusChangeBuyerOrder) {
OrderStatus sourceStatus = statusChangeBuyerOrder.getSourceStatus();
OrderStatus targetStatus = statusChangeBuyerOrder.getTargetStatus();
return sourceStatus == BIDING
&& (targetStatus == BUYER_CANCEL_BEFORE_PAY || targetStatus == BUYER_CANCEL_TIMEOUT);
return sourceStatus == BIDING && targetStatus == BUYER_BID_CLOSE;
}
}
... ...
... ... @@ -6,6 +6,7 @@ import com.yohoufo.common.alarm.EventBusPublisher;
import com.yohoufo.dal.order.model.BuyerOrder;
import com.yohoufo.order.event.BuyerOrderDelayCancelEvent;
import com.yohoufo.order.model.RequestedStatusChangeBuyerOrder;
import com.yohoufo.order.mq.TopicConstants;
import com.yohoufo.order.service.AbstractBuyerOrderStateChanger;
import org.springframework.stereotype.Service;
... ... @@ -37,7 +38,7 @@ public class BuyerOrderBidingToWaitingPayChanger extends AbstractBuyerOrderState
//自动取消事件
BuyerOrderDelayCancelEvent buyerCancelEvent = BuyerOrderDelayCancelEvent.builder().uid(uid)
.orderCode(orderCode)
.topic("buyerOrder.autoCancelAfter1Day")
.topic(TopicConstants.BUYER_ORDER_AUTO_CANCEL)
.delayTime(1 * 24 * 60).build();
EventBusPublisher.publishEvent(buyerCancelEvent);
}
... ...
... ... @@ -13,6 +13,7 @@ import com.yohoufo.order.event.BuyerOrderDelayCancelEvent;
import com.yohoufo.order.model.RequestedStatusChangeBuyerOrder;
import com.yohoufo.order.model.bo.BidOrderMetaBo;
import com.yohoufo.order.model.request.OrderRequest;
import com.yohoufo.order.mq.TopicConstants;
import com.yohoufo.order.service.AbstractBuyerOrderStateChanger;
import com.yohoufo.order.service.IBuyerOrderService;
import com.yohoufo.order.service.impl.BuyerChangePriceRecordService;
... ... @@ -52,8 +53,8 @@ public class BuyerOrderPayDepositSuccessChanger extends AbstractBuyerOrderStateC
@Override
public boolean isSupport(RequestedStatusChangeBuyerOrder statusChangeBuyerOrder) {
return OrderStatus.WAITING_PAY_DEPOSIT.getCode() == statusChangeBuyerOrder.getSourceStatus().getCode()
&& OrderStatus.BIDING.getCode() == statusChangeBuyerOrder.getTargetStatus().getCode();
return OrderStatus.WAITING_PAY_DEPOSIT == statusChangeBuyerOrder.getSourceStatus()
&& OrderStatus.BIDING == statusChangeBuyerOrder.getTargetStatus();
}
... ... @@ -104,7 +105,7 @@ public class BuyerOrderPayDepositSuccessChanger extends AbstractBuyerOrderStateC
int day = bidOrderMetaBo.getDay();
BuyerOrderDelayCancelEvent buyerCancelEvent = BuyerOrderDelayCancelEvent.builder().uid(buyerOrder.getUid())
.orderCode(buyerOrder.getOrderCode())
.topic("buyerOrder.autoCancelAfter" + day + "Day")
.topic(TopicConstants.BUYER_ORDER_AUTO_CANCEL_AFTER_N_DAY)
.delayTime(day * 24 * 60).build();
EventBusPublisher.publishEvent(buyerCancelEvent);
}
... ...
... ... @@ -76,7 +76,7 @@ public class BuyerOrderWaitingPayCancelChanger extends AbstractBuyerOrderStateCh
protected Collection<Statement> afterStatements(RequestedCancelEventStatusChangeBuyerOrder statusChangeBuyerOrder) {
BuyerOrder buyerOrder = statusChangeBuyerOrder.getBuyerOrder();
List<Statement> statements = new ArrayList<>();
if (buyerOrder.isBuyerBidOrder()) {
if (buyerOrder.isBidOrder()) {
statements.add(() -> bidOrderAfterStatement(buyerOrder));
} else {
//nothing
... ...
... ... @@ -37,8 +37,7 @@ public class BuyerOrderWaitingPayDepositCancelChanger extends AbstractBuyerOrder
public boolean isSupport(RequestedStatusChangeBuyerOrder statusChangeBuyerOrder) {
OrderStatus sourceStatus = statusChangeBuyerOrder.getSourceStatus();
OrderStatus targetStatus = statusChangeBuyerOrder.getTargetStatus();
return sourceStatus == WAITING_PAY_DEPOSIT
&& (targetStatus == BUYER_CANCEL_BEFORE_PAY || targetStatus == BUYER_CANCEL_TIMEOUT);
return sourceStatus == WAITING_PAY_DEPOSIT && targetStatus == BUYER_BID_CLOSE ;
}
private void processIfExistChangePriceRecord(long orderCode, Operator operator) {
... ... @@ -60,7 +59,7 @@ public class BuyerOrderWaitingPayDepositCancelChanger extends AbstractBuyerOrder
//还原原skup为可售状态
logger.info("[{}] bid skup need to be reset saleable status", buyerChangePriceRecord.getPreSkup());
bidProductProxyService.resetSaleable(buyerChangePriceRecord.getPreSkup());
bidProductProxyService.resetSaleableFromUserCancel(buyerChangePriceRecord.getPreSkup());
}
private BuyerChangePriceRecord getWaitingDealBuyerChangePriceRecord(long orderCode) {
... ...
... ... @@ -18,7 +18,6 @@ import com.yohoufo.dal.order.model.*;
import com.yohoufo.order.constants.ActivityTypeEnum;
import com.yohoufo.order.constants.MetaKey;
import com.yohoufo.order.model.bo.ActivityBo;
import com.yohoufo.order.model.bo.AmountDetailBo;
import com.yohoufo.order.model.bo.BidOrderMetaBo;
import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.service.IPaymentService;
... ... @@ -313,7 +312,7 @@ public class BuyerOrderChangeBusinessPostProcessor {
*/
private boolean shouldRefundDeposit(BuyerOrder buyerOrder) {
//求购订单且以支付
return buyerOrder.isBuyerBidOrder() && buyerOrder.getStatus().intValue() == OrderStatus.HAS_PAYED.getCode();
return buyerOrder.isBidOrder() && buyerOrder.getStatus().intValue() == OrderStatus.HAS_PAYED.getCode();
}
private void refundBidDeposit(BuyerOrder buyerOrder) {
... ...
... ... @@ -3,6 +3,7 @@ package com.yohoufo.order.service.proxy;
import com.yohobuy.ufo.model.BidStoragePriceVo;
import com.yohobuy.ufo.model.order.common.OrderAttributes;
import com.yohoufo.dal.order.model.SellerOrderGoods;
import com.yohoufo.order.common.Operator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
... ... @@ -14,7 +15,11 @@ public class BidProductProxyService extends AbsProxyService {
private final static String CREATE_API = "ufo.product.bid.createSkup";
private final static String CANCEL_SALE_API = "ufo.product.bid.cancelSale";
private final static String CANCEL_SALE_BY_USER_API = "ufo.product.bid.cancelSaleByUser";
private final static String CANCEL_SALE_BY_SYSTEM_API = "ufo.product.bid.cancelSaleBySystem";
private final static String CANCEL_SALE_BY_CS_API = "ufo.product.bid.cancelSaleByCS";
private final static String SALE_API = "ufo.product.bid.sale";
... ... @@ -22,7 +27,9 @@ public class BidProductProxyService extends AbsProxyService {
private final static String GET_SALEABLE_API = "ufo.product.bid.getSaleable";
private final static String RESET_SALEABLE_API = "ufo.product.bid.resetSaleable";
private final static String RESET_SALEABLE_FROM_USERCANCEL_API = "ufo.product.bid.resetSaleableFromUserCancel";
private final static String RESET_SALEABLE_FROM_BIDFINISHED_API = "ufo.product.bid.resetSaleableFromBidFinished";
public void createSkup(int bidUid, SellerOrderGoods goods) {
BidStoragePriceVo bidStoragePriceBo = BidStoragePriceVo.builder().skup(goods.getId())
... ... @@ -36,12 +43,33 @@ public class BidProductProxyService extends AbsProxyService {
ufoServiceCaller.call(CREATE_API, bidStoragePriceBo);
}
public boolean tryCancelSale(int skup) {
logger.info("tryCancelSale,skup:{}", skup);
ufoServiceCaller.call(CANCEL_SALE_API, skup);
public boolean cancelSale(int skup, Operator operator) {
logger.info("cancelSale,skup:{},operator:{}", skup, operator);
String api;
switch (operator) {
case USER:
api = CANCEL_SALE_BY_USER_API;
break;
case SYSTEM:
api = CANCEL_SALE_BY_SYSTEM_API;
break;
case CS:
api = CANCEL_SALE_BY_CS_API;
break;
default:
api = null;
}
ufoServiceCaller.call(api, skup);
return true;
}
public boolean cancelSaleByUser(int skup) {
logger.info("cancelSaleByUser,skup:{}", skup);
return cancelSale(skup, Operator.USER);
}
public boolean trySale(int productId, int skup) {
logger.info("trySale,productId:{},skup:{}", productId, skup);
ufoServiceCaller.call(SALE_API, productId, skup);
... ... @@ -63,10 +91,21 @@ public class BidProductProxyService extends AbsProxyService {
return ufoServiceCaller.call(GET_SALEABLE_API, skup);
}
public boolean resetSaleable(int skup) {
logger.info("resetSaleable,skup:{}", skup);
public boolean resetSaleableFromUserCancel(int skup) {
logger.info("resetSaleableFromUserCancel,skup:{}", skup);
try {
ufoServiceCaller.call(RESET_SALEABLE_FROM_USERCANCEL_API, skup);
return true;
} catch (Exception ex) {
logger.warn("exception happened when reset saleable,skup:{}", skup);
return false;
}
}
public boolean resetSaleableFromBidFinished(int skup) {
logger.info("resetSaleableFromBidFinished,skup:{}", skup);
try {
ufoServiceCaller.call(RESET_SALEABLE_API, skup);
ufoServiceCaller.call(RESET_SALEABLE_FROM_BIDFINISHED_API, skup);
return true;
} catch (Exception ex) {
logger.warn("exception happened when reset saleable,skup:{}", skup);
... ...
... ... @@ -439,7 +439,7 @@ public class SellerOrderCancelService {
SellerOrderGoods tsog = new SellerOrderGoods();
tsog.setId(skup);
try {
bidProductProxyService.resetSaleable(skup);
bidProductProxyService.resetSaleableFromBidFinished(skup);
} catch (Exception ex) {
logger.warn("in seller cancel waiting pay and then reset saleable skup fail, uid {}, skup {}", uid, skup, ex);
}
... ...
... ... @@ -4,31 +4,37 @@ consumer:
password: yoho
consumers:
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay1DayMsgConsumer
topic: buyerOrder.autoCancelAfter1Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayMsgConsumer
topic: buyerOrder.autoCancel
delay:
interval: 1440
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 1440
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay3DayMsgConsumer
topic: buyerOrder.autoCancelAfter3Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 4320
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay7DayMsgConsumer
topic: buyerOrder.autoCancelAfter7Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 10080
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay15DayMsgConsumer
topic: buyerOrder.autoCancelAfter15Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 21600
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay30DayMsgConsumer
topic: buyerOrder.autoCancelAfter30Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 43200
- class: com.yohoufo.order.mq.consumer.SellerOrderAutoCancelDelayMsgConsumer
topic: sellerOrder.autoCancel
delay:
... ...
... ... @@ -44,11 +44,11 @@ public class BidProductController {
* @param skup
* @return
*/
@RequestMapping(params = "method=ufo.product.bid.cancelSale")
public ApiResponse cancelSale(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.cancelSale, skup = {}", skup);
bidProductService.cancelSale(skup);
logger.info("cancelSale success, skup = {}", skup);
@RequestMapping(params = "method=ufo.product.bid.cancelSaleByUser")
public ApiResponse cancelSaleByUser(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.cancelSaleByUser, skup = {}", skup);
bidProductService.cancelSaleByUser(skup);
logger.info("cancelSaleByUser success, skup = {}", skup);
return new ApiResponse(200, "ok", Boolean.TRUE);
}
... ... @@ -56,10 +56,46 @@ public class BidProductController {
* @param skup
* @return
*/
@RequestMapping(params = "method=ufo.product.bid.resetSaleable")
public ApiResponse resetSaleable(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.resetSaleable, skup = {}", skup);
bidProductService.resetSaleable(skup);
@RequestMapping(params = "method=ufo.product.bid.cancelSaleBySystem")
public ApiResponse cancelSaleBySystem(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.cancelSaleBySystem, skup = {}", skup);
bidProductService.cancelSaleBySystem(skup);
logger.info("cancelSaleBySystem success, skup = {}", skup);
return new ApiResponse(200, "ok", Boolean.TRUE);
}
/**
* @param skup
* @return
*/
@RequestMapping(params = "method=ufo.product.bid.cancelSaleByCS")
public ApiResponse cancelSaleByCS(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.cancelSaleByCS, skup = {}", skup);
bidProductService.cancelSaleByPlatform(skup);
logger.info("cancelSaleByCS success, skup = {}", skup);
return new ApiResponse(200, "ok", Boolean.TRUE);
}
/**
* @param skup
* @return
*/
@RequestMapping(params = "method=ufo.product.bid.resetSaleableFromUserCancel")
public ApiResponse resetSaleableFromUserCancel(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.resetSaleableFromUserCancel, skup = {}", skup);
bidProductService.resetSaleableFromUserCancel(skup);
logger.info("resetSaleable success, skup = {}", skup);
return new ApiResponse(200, "ok", Boolean.TRUE);
}
/**
* @param skup
* @return
*/
@RequestMapping(params = "method=ufo.product.bid.resetSaleableFromBidFinished")
public ApiResponse resetSaleableFromBidFinished(@RequestParam(value = "skup") int skup) {
logger.info("in method=ufo.product.bid.resetSaleableFromBidFinished, skup = {}", skup);
bidProductService.resetSaleableFromBidFinished(skup);
logger.info("resetSaleable success, skup = {}", skup);
return new ApiResponse(200, "ok", Boolean.TRUE);
}
... ...
... ... @@ -3,7 +3,7 @@ package com.yohoufo.product.service.impl;
import com.yoho.core.dal.datasource.annotation.Database;
import com.yoho.error.exception.ServiceException;
import com.yohobuy.ufo.model.BidStoragePriceVo;
import com.yohobuy.ufo.model.order.common.SkupStatus;
import com.yohobuy.ufo.model.order.common.BidSkupStatus;
import com.yohoufo.dal.product.BidStoragePriceMapper;
import com.yohoufo.dal.product.ProductMapper;
import com.yohoufo.dal.product.model.BidStoragePrice;
... ... @@ -50,33 +50,77 @@ public class BidProductService {
}
/**
* 取消销售
* 用户取消
*
* @param skup
* @return
*/
public void cancelSale(int skup) {
logger.info("cancelSale, skup:{}", skup);
public void cancelSaleByUser(int skup) {
logger.info("cancelSaleByUser, skup:{}", skup);
//检测一下skup是否存在
checkAndGetSkup(skup);
if (!doCancelSale(skup)) {
throw new ServiceException(500, "商品(skup)取消变现失败:" + skup);
if (!doCancelSale(skup, BidSkupStatus.USER_CANCEL)) {
throw new ServiceException(500, "商品(skup)取消失败:" + skup);
}
}
/**
* 重置可
* 系统取消销
*
* @param skup
* @return
*/
public void resetSaleable(int skup) {
logger.info("resetSaleable, skup:{}", skup);
if (!doResetSaleable(skup)) {
public void cancelSaleBySystem(int skup) {
logger.info("cancelSaleBySystem, skup:{}", skup);
//检测一下skup是否存在
checkAndGetSkup(skup);
if (!doCancelSale(skup, BidSkupStatus.SYS_CANCEL)) {
throw new ServiceException(500, "商品(skup)取消失败:" + skup);
}
}
/**
* 平台取消销售
*
* @param skup
* @return
*/
public void cancelSaleByPlatform(int skup) {
logger.info("cancelSaleByPlatform, skup:{}", skup);
//检测一下skup是否存在
checkAndGetSkup(skup);
if (!doCancelSale(skup, BidSkupStatus.PLATFORM_CANCEL)) {
throw new ServiceException(500, "商品(skup)取消失败:" + skup);
}
}
/**
* 从用户取消状态或求购成功 才能重置为 可售
*
* @param skup
* @return
*/
public void resetSaleableFromUserCancel(int skup) {
logger.info("resetSaleableFromUserCancel, skup:{}", skup);
if (!doResetSaleable(skup, BidSkupStatus.USER_CANCEL)) {
throw new ServiceException(500, "商品(skup)恢复到可售状态失败:" + skup);
}
}
/**
* 从用户取消状态或求购成功 才能重置为 可售
*
* @param skup
* @return
*/
public void resetSaleableFromBidFinished(int skup) {
logger.info("resetSaleableFromBidFinished, skup:{}", skup);
if (!doResetSaleable(skup, BidSkupStatus.BID_FINISHED)) {
throw new ServiceException(500, "商品(skup)恢复到可售状态失败:" + skup);
}
}
/**
* 出售
*
... ... @@ -93,16 +137,24 @@ public class BidProductService {
}
}
private boolean doCancelSale(int skup) {
return bidStoragePriceMapper.updateStatus(skup, SkupStatus.CAN_SELL.getCode(), SkupStatus.SELLER_CANCEL_SELL.getCode()) > 0;
private boolean doCancelSale(int skup, BidSkupStatus targetStatus) {
if (targetStatus == BidSkupStatus.BIDING) {
logger.warn("[{}] can't cancel,because target status must not be biding status", skup);
throw new ServiceException(500, "操作失败");
}
return bidStoragePriceMapper.updateStatus(skup, BidSkupStatus.BIDING.getCode(), targetStatus.getCode()) > 0;
}
private boolean doSale(int skup) {
return bidStoragePriceMapper.updateStatus(skup, SkupStatus.CAN_SELL.getCode(), SkupStatus.SELL_OUT.getCode()) > 0;
return bidStoragePriceMapper.updateStatus(skup, BidSkupStatus.BIDING.getCode(), BidSkupStatus.BID_FINISHED.getCode()) > 0;
}
private boolean doResetSaleable(int skup) {
return bidStoragePriceMapper.updateStatus(skup, 0, SkupStatus.CAN_SELL.getCode()) > 0;
private boolean doResetSaleable(int skup, BidSkupStatus sourceStatus) {
if (sourceStatus == BidSkupStatus.BIDING) {
logger.warn("[{}] can't resetSaleable,because source status must not be biding status", skup);
throw new ServiceException(500, "操作失败");
}
return bidStoragePriceMapper.updateStatus(skup, sourceStatus.getCode(), BidSkupStatus.BIDING.getCode()) > 0;
}
/**
... ... @@ -166,7 +218,7 @@ public class BidProductService {
sp.setStorageId(storageId);
sp.setPrice(price);
sp.setBidUid(bidUid);
sp.setStatus(SkupStatus.CAN_SELL.getCode());//默认上架
sp.setStatus(BidSkupStatus.BIDING.getCode());//默认上架
sp.setSkup(skup);
sp.setCreateTime((int) (System.currentTimeMillis() / 1000));
sp.setUpdateTime(0);
... ...
... ... @@ -3,28 +3,33 @@ consumer:
username: yoho
password: yoho
consumers:
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay1DayMsgConsumer
topic: buyerOrder.autoCancelAfter1Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayMsgConsumer
topic: buyerOrder.autoCancel
delay:
interval: 1440
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 1440
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay3DayMsgConsumer
topic: buyerOrder.autoCancelAfter3Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 4320
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay7DayMsgConsumer
topic: buyerOrder.autoCancelAfter7Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 10080
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay15DayMsgConsumer
topic: buyerOrder.autoCancelAfter15Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 21600
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay30DayMsgConsumer
topic: buyerOrder.autoCancelAfter30Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 43200
... ...
... ... @@ -4,30 +4,35 @@ consumer:
password: ${rabbit_ufo_password}
consumers:
# order
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay1DayMsgConsumer
topic: buyerOrder.autoCancelAfter1Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayMsgConsumer
topic: buyerOrder.autoCancel
delay:
interval: 1440
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay3DayMsgConsumer
topic: buyerOrder.autoCancelAfter3Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 1440
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 4320
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay7DayMsgConsumer
topic: buyerOrder.autoCancelAfter7Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 10080
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay15DayMsgConsumer
topic: buyerOrder.autoCancelAfter15Day
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 21600
#- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelay30DayMsgConsumer
# topic: buyerOrder.autoCancelAfter30Day
# delay:
# interval: 43200
- class: com.yohoufo.order.mq.consumer.BuyerOrderAutoCancelDelayNDayMsgConsumer
topic: buyerOrder.autoCancelAfterNDay
delay:
interval: 43200
- class: com.yohoufo.order.mq.consumer.SellerOrderAutoCancelDelayMsgConsumer
topic: sellerOrder.autoCancel
... ...