Просмотр исходного кода

更新拼团库存bug

release_toaliyun_real
xiaohanzi 6 лет назад
Родитель
Сommit
272e04bfbf
9 измененных файлов: 62 добавлений и 23 удалений
  1. +18
    -10
      mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java
  2. +12
    -1
      mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java
  3. +2
    -2
      mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java
  4. +1
    -1
      mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java
  5. +2
    -0
      mallinkService/src/main/java/com/iformall/service/WxOrderService.java
  6. +1
    -1
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  7. +10
    -4
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java
  8. +12
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  9. +4
    -4
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java

+ 18
- 10
mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java Просмотреть файл

@@ -84,6 +84,23 @@ public class WxOrderController extends BaseController {
return new ResultData(ErrorCode.MEMBER_IS_LOCKED);
}

WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId());
if (null == coupon) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
}
if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) {
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF);
}
//判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (null != orderSaveDto.getOrderGroupId() && !orderSaveDto.getOrderGroupId().equals(0L)) {
int ordercount = wxOrderService.countUserCouponGroupOrder(user.getId(),coupon.getId());
if (ordercount>=coupon.getUseLimitQuantity()) {
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。");
}
}
}
WxCouponCVo wxCouponCVo = null;

String key = "cc:" + orderSaveDto.getCouponChannelId();
@@ -108,7 +125,7 @@ public class WxOrderController extends BaseController {
//此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。
boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId());
if (!hascache) {
redisLock.setCouponStock(wxCouponCVo.getCouponId(), wxCouponCVo.getRemainInventory());
redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory());
}
resultData = couponUserCheck(user, wxCouponCVo);
@@ -123,15 +140,6 @@ public class WxOrderController extends BaseController {
boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false;

try {

WxCoupon coupon = wxCouponService.getById(couponId);
if (coupon == null) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
}
if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) {
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF);
}
WxOrder order = wxOrderService.saveOrderForCoupon(user, coupon, orderSaveDto, isPress);
return new ResultData(order);
} catch (MallinkException e) {


+ 12
- 1
mallinkSchedule/src/main/java/com/iformall/schedule/OrderExpiringSchedule.java Просмотреть файл

@@ -174,6 +174,17 @@ public class OrderExpiringSchedule {
}
});

//无需查询付款状态的订单-退款,回滚库存
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode());
wxOrderMapper.selectList(new QueryWrapper(order)).stream().forEach(o -> {
try {
wxOrderService.stockBack(order);
proxy.returnMoney((WxOrder) o);
} catch (Exception e) {
logger.error("参团失败退款失败" + e.getMessage());
}
});

}

@@ -208,7 +219,7 @@ public class OrderExpiringSchedule {
int status = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, wxpayOrder.getPayOrderNo());
//如果是支付成功,则更新信息
if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode() == status) {
wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap);
wxPayOrderService.handleSuccessOrder(wxpayOrder, order, retMap,true);
return true;
}
return false;


+ 2
- 2
mallinkService/src/main/java/com/iformall/enums/EnumOrderStatus.java Просмотреть файл

@@ -23,9 +23,9 @@ public enum EnumOrderStatus {
ORDER_STATUS_COOPERATING_CANCEL(13, "拼团失败"),
ORDER_STATUS_COOPERATING_FAILD(14, "参团失败"),
ORDER_STATUS_COOPERATING_UNPAID(15, "拼团待付款"),//占库存
ORDER_STATUS_COOPERATING_BREAK(16, "拼团取消")
ORDER_STATUS_COOPERATING_BREAK(16, "拼团取消"),
ORDER_STATUS_COOPERATING_SCHEDU_REFUND(99,"订单定时状态-需要返款和回滚库存,无需再次查询真实支付状态")
;

public static EnumOrderStatus getEnum(Integer code) {
for (EnumOrderStatus value : values()) {
if (value.getCode().equals(code)) {


+ 1
- 1
mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java Просмотреть файл

@@ -15,7 +15,7 @@ import java.util.Map;
*/
public interface WxOrderGroupService {

void createOrderGroup(WxOrder order, WxCoupon wxCoupon);
void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask);

ResultData queryRemainOne(WxOrderGroup wxOrderGroup, Long userId);



+ 2
- 0
mallinkService/src/main/java/com/iformall/service/WxOrderService.java Просмотреть файл

@@ -229,5 +229,7 @@ public interface WxOrderService {
int countGroupOrder(Long groupId,boolean ignoreUnPay);
int countUserCouponGroupOrder(Long cuserId,Long couponId);

}

+ 1
- 1
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java Просмотреть файл

@@ -16,7 +16,7 @@ import com.iformall.enums.EnumPayWay;

public interface WxPayOrderService {

public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap);
public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap,boolean isScheduleTask);
public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay);


+ 10
- 4
mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java Просмотреть файл

@@ -96,7 +96,7 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService {
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
public void createOrderGroup(WxOrder order, WxCoupon wxCoupon) {
public void createOrderGroup(WxOrder order, WxCoupon wxCoupon,boolean isScheduleTask) {
Long orderGroupId = order.getOrderGroupId();
//查看是否首次拼团,orderGroupId不等于0代表不是首次拼团,因为第二个加入的拼团者肯定有团单号
if (!orderGroupId.equals(0L)) {
@@ -110,9 +110,15 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+orderGroupId);
}
if(wxOrderGroup.getRemainPeople()<1) {
//错误,更新状态,定时任务会发起退款,回滚库存
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode());
wxOrderMapper.updateById(order);
//如果是定时任务处理订单时候补程序发现拼团已满,则此时发起退款,回滚库存, 不能设置为未付款,回引起死循环
if(isScheduleTask) {
//错误,更新状态,定时任务会发起退款,回滚库存
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode());
wxOrderMapper.updateById(order);
}else {
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode());
wxOrderMapper.updateById(order);
}
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团人数已满,将稍后退款。");
}


+ 12
- 0
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java Просмотреть файл

@@ -2304,5 +2304,17 @@ public class WxOrderServiceImpl implements WxOrderService {
return wxOrderMapper.countList(query);
}

@Override
public int countUserCouponGroupOrder(Long cuserId, Long couponId) {
WxOrder query = new WxOrder();
query.setCUserId(cuserId);
query.setProductId(couponId);
List<Integer> statusS = new ArrayList<Integer>();
statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode());
query.setStatusS(statusS);
return wxOrderMapper.countList(query);
}


}

+ 4
- 4
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java Просмотреть файл

@@ -121,7 +121,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
//方法必须为public AopContext.currentProxy()
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
@Override
public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap) {
public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map<String, String> retMap,boolean isScheduleTask) {
Date curDate = new Date();
if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) {
//因为此处是处理订单支付成功了但是订单状态为未支付成功的异常状态,库存不应该再扣减
@@ -148,7 +148,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
if (isOrderGroupCoupon(oldRecord, wxCoupon)) {
// 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER
try {
wxOrderGroupService.createOrderGroup(order, wxCoupon);
wxOrderGroupService.createOrderGroup(order, wxCoupon,isScheduleTask);
} catch (Exception e) {
logger.error("参团失败" + e.getMessage());
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode());
@@ -189,7 +189,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) {
//直接调用不会触发事务,spring事务基于AOP代理
WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy();
proxy.handleSuccessOrder(oldRecord,order,retMap);
proxy.handleSuccessOrder(oldRecord,order,retMap,false);
throw new MallinkException(ErrorCode.PAY_ORDER_EXIST.getCode(),"该订单已经支付,请勿重复支付!");
}else if (EnumPayStatus.PAY_STATUS_REFUND.getCode()==wxpaystatus) {
throw new MallinkException(ErrorCode.PAY_ORDER_REFUND.getCode(),"该订单已经退款,无法支付!");
@@ -1384,7 +1384,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
if (isOrderGroupCoupon(record, wxCoupon)) {
// 如果是Coupon是拼团, 创建拼团信息, 不创建COUPON_ORDER
try {
wxOrderGroupService.createOrderGroup(order, wxCoupon);
wxOrderGroupService.createOrderGroup(order, wxCoupon,false);
} catch (Exception e) {
logger.error("参团失败" + e.getMessage());
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode());


Загрузка…
Отмена
Сохранить