Browse Source

更新库存bug

release_toaliyun_real
xiaohanzi 6 years ago
parent
commit
114e4f8b52
5 changed files with 78 additions and 85 deletions
  1. +43
    -29
      mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java
  2. +0
    -5
      mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java
  3. +3
    -0
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  4. +26
    -50
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java
  5. +6
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java

+ 43
- 29
mallinkCApi/src/main/java/com/iformall/controller/WxPayOrderController.java View File

@@ -24,15 +24,17 @@ import com.iformall.common.ResultData;
import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayAccount;
import com.iformall.domain.po.WxPayOrder; import com.iformall.domain.po.WxPayOrder;
import com.iformall.enums.EnumCreditLockedStatus; import com.iformall.enums.EnumCreditLockedStatus;
import com.iformall.enums.EnumOrderStatus;
import com.iformall.enums.EnumPayStatus; import com.iformall.enums.EnumPayStatus;
import com.iformall.enums.EnumPayWay; import com.iformall.enums.EnumPayWay;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.WxCUserBasicInfoService;
import com.iformall.service.WxOrderGroupService;
import com.iformall.service.WxCouponService;
import com.iformall.service.WxOrderService; import com.iformall.service.WxOrderService;
import com.iformall.service.WxPayAccountService; import com.iformall.service.WxPayAccountService;
import com.iformall.service.WxPayOrderService; import com.iformall.service.WxPayOrderService;
@@ -62,8 +64,9 @@ public class WxPayOrderController extends BaseController {
private WxPayAccountService wxPayAccountService; private WxPayAccountService wxPayAccountService;
@Autowired @Autowired
private WxOrderGroupService orderGroupService;

private WxCouponService wxCouponService;
//@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}")
@RequestMapping(value = "/create", method = RequestMethod.POST) @RequestMapping(value = "/create", method = RequestMethod.POST)
public ResultData _create(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws Exception { public ResultData _create(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws Exception {
@@ -143,8 +146,6 @@ public class WxPayOrderController extends BaseController {
payOrder.setPayOrderStatus(status); payOrder.setPayOrderStatus(status);
payOrder.setFailReason(reasonStr); payOrder.setFailReason(reasonStr);


WxOrder order = null;

try { try {
//有价券支付成功 //有价券支付成功
if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
@@ -158,34 +159,47 @@ public class WxPayOrderController extends BaseController {
if (null == payOrder) { if (null == payOrder) {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder.");
} }
if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) {
order = wxOrderService.getById(orderId);
//如果是拼团,需要处理拼团状态和人数
if(order.getOrderGroupId() != null && !order.getOrderGroupId().equals(0L)) {
orderGroupService.afterPaySuccessUpdate(order);
}
return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
} else{
//查询微信订单状态并更新
WxCUser user = getUser();
WxAppinfo appInfo = getAppInfo(user.getAppId());
if (null == appInfo) {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo");
WxOrder order = wxOrderService.getById(orderId);
if (null == order) {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到Order["+orderId+"].");
}
WxCoupon wxCoupon = wxCouponService.getById(order.getProductId());
if (null == wxCoupon) {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到优惠券[orderId:"+orderId+"].");
}
//拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息
if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) {
if (order.getOrderStatus()!=EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()) {
return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
} }
WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId());
order = wxOrderService.getById(orderId);
try {
WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false);
if (null != wo) {
return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
}
}catch(MallinkException e) {
//已经同步了微信的支付状态,表示已经更新
}else {
//非拼团的订单,支付成功,关闭订单,撤销支付订单,支付转退款的,直接返回订单信息,其他需要查询真实支付状态
if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())||
payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_CLOSE.getCode())||
payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REVERSE.getCode())||
payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REFUND.getCode())) {
return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
}
}
//查询微信订单状态并更新
WxCUser user = getUser();
WxAppinfo appInfo = getAppInfo(user.getAppId());
if (null == appInfo) {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前用户appId["+user.getAppId()+"]找不到appInfo");
}
WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId());
try {
WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false);
if (null != wo) {
return new ResultData(Result.SUCCESS, "支付状态更新成功", order); return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
} }
}catch(MallinkException e) {
//已经同步了微信的支付状态,表示已经更新
return new ResultData(Result.SUCCESS, "支付状态更新成功", order);
}


return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!");
}
return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!");
} else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) {
// 有价券支付失败 // 有价券支付失败
wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode());


+ 0
- 5
mallinkService/src/main/java/com/iformall/service/WxOrderGroupService.java View File

@@ -33,9 +33,4 @@ public interface WxOrderGroupService {


PageInfo<WxOrderGroupMarketing> queryOrderGroupMarketingList(WxOrderGroupMarketing marketing, Integer pageNum, Integer pageSize); PageInfo<WxOrderGroupMarketing> queryOrderGroupMarketingList(WxOrderGroupMarketing marketing, Integer pageNum, Integer pageSize);
/**
* 支付成功之后,更新接口调用
*/
void afterPaySuccessUpdate(WxOrder order);

} }

+ 3
- 0
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java View File

@@ -7,6 +7,7 @@ import com.iformall.common.IdWorker;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxMerchantBUser; import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.WxPayAccount; import com.iformall.domain.po.WxPayAccount;
@@ -144,6 +145,8 @@ public interface WxPayOrderService {
* @param id * @param id
*/ */
void deleteById(Long id); void deleteById(Long id);
public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon);




} }

+ 26
- 50
mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java View File

@@ -65,57 +65,33 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService {
@Autowired @Autowired
WxCouponChannelMapper wxCouponChannelMapper; WxCouponChannelMapper wxCouponChannelMapper;


@Override
public void afterPaySuccessUpdate(WxOrder order) {
// 参与拼团
WxOrderGroup wxOrderGroup = wxOrderGroupMapper.selectById(order.getOrderGroupId());
if (null == wxOrderGroup) {
//错误,更新状态,定时任务会发起退款,回滚库存
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode());
wxOrderMapper.updateById(order);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxOrderGroup is null."+order.getOrderGroupId());
}
WxCoupon wxCoupon = wxCouponMapper.selectById(order.getProductId());
if (null == wxCoupon) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"WxCoupon is null. orderId:"+order.getId());
}
if (wxOrderGroup.getStatus() == EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) {
return;
}
int remainPeople = updateOrderGroup(wxOrderGroup,order,wxCoupon);
if (remainPeople == 0) {
actionAfterOrderGroupSuccess(order, order.getOrderGroupId());
}
}
private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) { private int updateOrderGroup(WxOrderGroup wxOrderGroup,WxOrder order, WxCoupon wxCoupon) {
//锁住人数
long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT;
String timeStr = String.valueOf(time);
boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
if (!grouppeopleLock) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。");
}
//此处拼团数量应从订单总数查询
int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true);
Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount;
//Integer remainPeople = wxOrderGroup.getRemainPeople()-1;
wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus());
wxOrderGroup.setUpdateDate(new Date());
wxOrderGroup.setRemainPeople(remainPeople);
logger.info("非首次拼团,更新拼团信息, 剩余人数-1");
int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup);
if (row != 1) {
//错误,更新状态,定时任务会发起退款,回滚库存
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode());
wxOrderMapper.updateById(order);
redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款.");
}else {
redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
}
return remainPeople;
//锁住人数
long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT;
String timeStr = String.valueOf(time);
boolean grouppeopleLock = redisLock.lock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
if (!grouppeopleLock) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团锁定失败,请稍后再试。");
}
//此处拼团数量应从订单总数查询,支付成功的就算一个,没支付成功的不算
int ordercount = wxOrderService.countGroupOrder(order.getOrderGroupId(),true);
Integer remainPeople = wxCoupon.getPressLimitNum()-ordercount-1;
//Integer remainPeople = wxOrderGroup.getRemainPeople()-1;
wxOrderGroup.setStatus(remainPeople <= 0 ? EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode() : wxOrderGroup.getStatus());
wxOrderGroup.setUpdateDate(new Date());
wxOrderGroup.setRemainPeople(remainPeople);
logger.info("非首次拼团,更新拼团信息, 剩余人数-1");
int row = wxOrderGroupMapper.updateOrderGroup(wxOrderGroup);
if (row != 1) {
//错误,更新状态,定时任务会发起退款,回滚库存
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode());
wxOrderMapper.updateById(order);
redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款.");
}else {
redisLock.unlock("grouppeopleLock_"+order.getOrderGroupId(), timeStr);
}
return remainPeople;
} }
@Override @Override


+ 6
- 1
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java View File

@@ -182,6 +182,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) { public WxPayOrder handleWxOrderQuery(WxPayOrder oldRecord,WxOrder order,WxAppinfo appInfo,WxPayAccount payAccount,IdWorker idworker,boolean repeatPay) {
Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount); Map<String, String> retMap = WxPayOrderServiceHelper.wxOrderPayStatusMap(oldRecord, order, appInfo, payAccount);
int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo()); int wxpaystatus = WxPayOrderServiceHelper.getPayStatusFromMap(retMap, oldRecord.getPayOrderNo());
//Map<String, String> retMap = new HashMap<String, String>();
//retMap.put("time_end","2020-6-18 10:48:20");
//retMap.put("transaction_id","asdasdasdasdasd");
//int wxpaystatus = EnumPayStatus.PAY_STATUS_SUCCESS.getCode();
if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) { if (EnumPayStatus.PAY_STATUS_SUCCESS.getCode()==wxpaystatus) {
//直接调用不会触发事务,spring事务基于AOP代理 //直接调用不会触发事务,spring事务基于AOP代理
WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy(); WxPayOrderServiceImpl proxy = (WxPayOrderServiceImpl) AopContext.currentProxy();
@@ -1407,7 +1411,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
} }


private boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) {
@Override
public boolean isOrderGroupCoupon(WxPayOrder record, WxCoupon wxCoupon) {
return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount()); return wxCoupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode()) && wxCoupon.getSalePrice().equals(record.getPayAmount());
} }




Loading…
Cancel
Save