diff --git a/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java b/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java index bc52f3a3e..44a96a203 100644 --- a/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java +++ b/mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + import springfox.documentation.swagger2.annotations.EnableSwagger2; /** @@ -18,6 +20,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; @EnableSwagger2 @EnableRocketMQ @EnableEncryptableProperties +@EnableAspectJAutoProxy(exposeProxy = true) public class ScheduleApplication { @Value("${fm.exception}") diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java index 172354dd6..224a6239c 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCardInfo.java @@ -16,6 +16,8 @@ import java.util.Date; @EqualsAndHashCode(callSuper = true) public class WxCardInfo extends TenantEntity { + private static final long serialVersionUID = 2974374593127477999L; + @Excel(name = "卡号", width = 20, orderNum = "1") @io.swagger.annotations.ApiModelProperty(value="主键ID-与coupon_order_id一致",name="id") protected Long id; diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java index 7d4be7a49..ded5eae3d 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCardInfoMapper.java @@ -11,5 +11,7 @@ public interface WxCardInfoMapper extends CommonMapper { List findVoList(WxCardVo wxCardVo); void updateTransferStatusByCouponId(Long couponId); + + List findList(WxCardInfo wxCardInfo); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 28ecccc3c..0a781820a 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -226,5 +226,8 @@ public interface WxOrderService { * H5支付后, 券再注入 */ Long saveOuterOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId); + + + int countGroupOrder(Long groupId); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java index 491adc7d6..eeeffe592 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderGroupServiceImpl.java @@ -84,15 +84,26 @@ public class WxOrderGroupServiceImpl implements WxOrderGroupService { //错误,更新状态,定时任务会发起退款 order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); wxOrderMapper.updateById(order); + wxOrderGroup.setStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); + wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团人数已满,将稍后退款。"); } - Integer remainPeople = wxOrderGroup.getRemainPeople()-1; + + //此处拼团数量应从订单总数查询 + int ordercount = wxOrderService.countGroupOrder(orderGroupId); + 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) { - //TODO 这个时候应该要发起异步退款。 + //这个时候应该要发起异步退款。 + wxOrderGroup.setStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()); + order.setOrderStatus(wxOrderGroup.getStatus()); + wxOrderMapper.updateById(order); + wxOrderGroupMapper.updateOrderGroup(wxOrderGroup); throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FAILD.getCode(),"参团失败,将稍后退款."); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 84882f22b..1a5772189 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -28,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -1006,86 +1007,102 @@ public class WxOrderServiceImpl implements WxOrderService { if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { isCard = true; } - final IdWorker idWorker = IdWorker.get(); - - WxCouponOrder couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.updateTenantInfo(order); - couponOrder.setCouponId(order.getProductId()); - couponOrder.setCouponType(coupon.getType()); - couponOrder.setCUserId(user.getId()); - couponOrder.setOwnerId(user.getId()); - couponOrder.setAutoRefund(coupon.getAutoRefund()); - couponOrder.setOrderId(order.getOrderNumber()); - couponOrder.setExpiredTime(valid_date); - if (!isCard) { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } else { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); + + //TODO 如果orderId已经存在,则不再添加 + WxCouponOrder couponOrderQ = new WxCouponOrder(); + couponOrderQ.setOrderId(order.getId()); + WxCouponOrder couponOrder = null; + List couponorderlist = wxCouponOrderMapper.findList(couponOrderQ); + if (null != couponorderlist && couponorderlist.size() > 0 ) { + couponOrder = couponorderlist.get(0); + }else { + final IdWorker idWorker = IdWorker.get(); + couponOrder = new WxCouponOrder(); + couponOrder.setId(idWorker.nextId()); + couponOrder.updateTenantInfo(order); + couponOrder.setCouponId(order.getProductId()); + couponOrder.setCouponType(coupon.getType()); + couponOrder.setCUserId(user.getId()); + couponOrder.setOwnerId(user.getId()); + couponOrder.setAutoRefund(coupon.getAutoRefund()); + couponOrder.setOrderId(order.getOrderNumber()); + couponOrder.setExpiredTime(valid_date); + if (!isCard) { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + } else { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); + } + couponOrder.setCreateDate(curr); + couponOrder.setUpdateDate(curr); + couponOrder.setCouponPrice(order.getPayment()); + wxCouponOrderMapper.insert(couponOrder); } - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(order.getPayment()); - - wxCouponOrderMapper.insert(couponOrder); /// 储值卡信息添加 if (isCard) { - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - if (!coupon.checkIsFree()) { - // 有价卡 - cardInfo.setTransactionId(payOrder.getTransactionId()); - if (payOrder.getShareAmount() != null) { - // 开启分账 - fee = payOrder.getPayAmount() - payOrder.getShareAmount(); - cardInfo.setShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRateAmount(payOrder.getRateAmount()); - } else { - // 未开启分账 - fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); - Integer shareAmount = payOrder.getPayAmount() - fee; - cardInfo.setShareFeeAmount(shareAmount); - cardInfo.setRemainingShareFeeAmount(shareAmount); - if (payAccount.getRealRate() != null) { - int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); - if (fee > iRealChargeFee) { - cardInfo.setRateAmount(fee - iRealChargeFee); - } - } - } - } else { - // 免费卡 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); + //判断该transctionId是否已经存在,如果存在,则不添加 + WxCardInfo cardInfoq = new WxCardInfo(); + cardInfoq.setTransactionId(payOrder.getTransactionId()); + List cardInfoList = wxCardInfoMapper.findList(cardInfoq); + if (null != cardInfoList && cardInfoList.size() > 0) { + //do nothing + }else { + Integer fee = 0; + WxCardInfo cardInfo = new WxCardInfo(); + cardInfo.setId(couponOrder.getId()); + cardInfo.updateTenantInfo(order); + cardInfo.setCouponId(order.getProductId()); + cardInfo.setAmount(coupon.getPrice()); + cardInfo.setSaleAmount(coupon.getSalePrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); + if (!coupon.checkIsFree()) { + // 有价卡 + cardInfo.setTransactionId(payOrder.getTransactionId()); + if (payOrder.getShareAmount() != null) { + // 开启分账 + fee = payOrder.getPayAmount() - payOrder.getShareAmount(); + cardInfo.setShareFeeAmount(payOrder.getShareAmount()); + cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); + cardInfo.setRateAmount(payOrder.getRateAmount()); + } else { + // 未开启分账 + fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); + Integer shareAmount = payOrder.getPayAmount() - fee; + cardInfo.setShareFeeAmount(shareAmount); + cardInfo.setRemainingShareFeeAmount(shareAmount); + if (payAccount.getRealRate() != null) { + int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); + if (fee > iRealChargeFee) { + cardInfo.setRateAmount(fee - iRealChargeFee); + } + } + } + } else { + // 免费卡 + cardInfo.setShareFeeAmount(0); + cardInfo.setRemainingShareFeeAmount(0); + cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPasswordId); + updateCPwd.setCardId(cardInfo.getId()); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } + } + + cardInfo.setServiceFeeAmount(fee); + cardInfo.setCreateDate(curr); + cardInfo.setUpdateDate(curr); + cardInfo.setSupportTransfer(coupon.getSupportTransfer()); + + //检查卡是否下架,如果是,不可转赠 + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId()); + if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { + cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); + } + wxCardInfoMapper.insert(cardInfo); + } } return couponOrder; } @@ -2261,5 +2278,18 @@ public class WxOrderServiceImpl implements WxOrderService { return orderGroupId != null && !orderGroupId.equals(0L); } + @Override + public int countGroupOrder(Long groupId) { + WxOrder query = new WxOrder(); + query.setOrderGroupId(groupId); + List statusS = new ArrayList(); + statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + //statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + query.setStatusS(statusS); + return wxOrderMapper.countList(query); + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 206ea7065..30e94abf0 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -124,6 +124,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { public void handleSuccessOrder(WxPayOrder oldRecord,WxOrder order,Map retMap) { Date curDate = new Date(); if (oldRecord.getPayOrderStatus() != EnumPayStatus.PAY_STATUS_SUCCESS.getCode()) { + //因为此处是处理订单支付成功了但是订单状态为未支付成功的异常状态,库存不应该再扣减 //更新wxPayOrder oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); String timEndStr = retMap.get("time_end"); @@ -200,12 +201,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { if (repeatPay) { if (oldRecord.getPayOrderStatus()!=EnumPayStatus.PAY_STATUS_WAIT.getCode()) { oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - Long payno = idworker.nextId(); - if (null == payno || payno.longValue() <=0) { - throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单支付流水号生成失败!handleWxOrderQuery:oldRecord:"+oldRecord+":wxstatus:"+wxpaystatus); - } - oldRecord.setPayOrderNo(String.valueOf(payno)); - int sqlRow0 =wxPayOrderMapper.updateById(oldRecord); if (sqlRow0 != 1) { logger.error("pay order update error: " + oldRecord.toString()); @@ -349,12 +344,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { }else if(oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_FAIL.getCode()|| oldRecord.getPayOrderStatus()==EnumPayStatus.PAY_STATUS_NOTPAY.getCode()) { oldRecord.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - //重新设置支付no - Long payno = idworker.nextId(); - if (null == payno || payno.longValue() <=0) { - throw new MallinkException(ErrorCode.PAY_ORDER_PAYING.getCode(),"订单支付流水号生成失败!service oldRecord:"+oldRecord); - } - oldRecord.setPayOrderNo(String.valueOf(payno)); int sqlRow0 = wxPayOrderMapper.updateById(oldRecord); if (sqlRow0 != 1) { logger.error("pay order update error: " + record.toString()); diff --git a/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml b/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml index 06df2ba06..2eeaaf5ba 100644 --- a/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCardInfoMapper.xml @@ -25,7 +25,7 @@ `share_fee_amount`,`remaining_share_fee_amount`, `rate_amount`, `create_date`,`update_date`,`support_transfer` - + where 1 = 1 @@ -211,4 +211,10 @@ update wx_card_info set support_transfer=0,update_date=now() where support_transfer=1 and coupon_id=#{couponId} + + diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index 7e0e59b89..2576e5576 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -133,7 +133,7 @@