admin
2019-10-30 b674cf50a368d005c9321fcf2989d7aa9a4a05c7
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -12,13 +12,16 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.core.task.TaskExecutor;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.entity.DateInfo;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.transaction.LocalTransactionExecuter;
import com.aliyun.openservices.ons.api.transaction.TransactionProducer;
import com.aliyun.openservices.ons.api.transaction.TransactionStatus;
@@ -160,6 +163,9 @@
   @Resource
   private TokenRecordService tokenRecordService;
   @Resource(name = "transactionManager")
   private DataSourceTransactionManager transactionManager;
   @Resource(name = "orderTransactionProducer")
   private TransactionProducer orderTransactionProducer;
@@ -880,78 +886,92 @@
         UserSystemCouponUseMQMsgDTO mqMsg = new UserSystemCouponUseMQMsgDTO(userSystemCoupon.getId(),
               order.getOrderId(), sourceType);
         // 事务消息
         Message msg = new Message(MQTopicName.TOPIC_SYSTEM_COUPON_USE.name(),systemCoupon.getType().name(),
         Message msg = new Message(MQTopicName.TOPIC_SYSTEM_COUPON_USE.name(), systemCoupon.getType().name(),
               new Gson().toJson(mqMsg).getBytes());
         orderTransactionProducer.send(msg, new LocalTransactionExecuter() {
            @Override
            public TransactionStatus execute(Message arg0, Object arg1) {
               try {
                  useRewardCouponCore(userSystemCoupon, money, hongBao, uid, order);
                  return TransactionStatus.CommitTransaction;
               } catch (UserMoneyDetailException e) {
                  return TransactionStatus.RollbackTransaction;
         try {
            SendResult result = orderTransactionProducer.send(msg, new LocalTransactionExecuter() {
               @Override
               public TransactionStatus execute(Message arg0, Object arg1) {
                  try {
                     useRewardCouponCore(userSystemCoupon, money, hongBao, uid, order);
                     return TransactionStatus.CommitTransaction;
                  } catch (Exception e) {
                     return TransactionStatus.RollbackTransaction;
                  }
               }
            }
         }, null);
            }, null);
            System.out.println(result);
         } catch (Exception e) {
            throw new Exception();
         }
      }
   }
   @Transactional
   private void useRewardCouponCore(UserSystemCoupon userSystemCoupon, BigDecimal money, BigDecimal hongBao, Long uid,
         Order order) throws UserMoneyDetailException {
      // 1、插入红包数据
      HongBaoV2 hongBaoV2 = new HongBaoV2();
      hongBaoV2.setMoney(money);
      hongBaoV2.setType(HongBaoV2.TYPE_COUPON);
      hongBaoV2.setState(HongBaoV2.STATE_YILINGQU);
      hongBaoV2.setVersion(2);
      hongBaoV2.setCreateTime(new Date());
      hongBaoV2.setUpdateTime(new Date());
      hongBaoV2.setUserInfo(new UserInfo(uid));
      hongBaoV2.setPreGetTime(new Date());
      hongBaoV2.setGetTime(new Date());
      hongBaoV2Service.insertSelective(hongBaoV2);
      // 2.插入关联
      orderHongBaoMapService.addOrderHongBaoMap(hongBaoV2, order);
      // 3.插入资金明细,用户余额
      UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(order.getOrderId(),
            order.getOrderType(), money, new UserInfo(uid));
      userMoneyDetailService.addUserMoneyDetail(userMoneyDetail);
      userInfoService.addMoney(new UserInfo(uid), money);
      // 插入资金通知
      userMoneyMsgNotificationService.orderReward(uid, order.getOrderId(), order.getOrderType(), money,
            userInfoService.selectByPKey(uid).getMyHongBao());
      /* 用户券信息状态及记录处理 */
      Date date = new Date();
      // 更新券状态:已使用
      userSystemCoupon.setState(UserSystemCoupon.STATE_END_USE);
      userSystemCoupon.setUseTime(date);
      userSystemCoupon.setUpdateTime(date);
      userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon);
      // 插入使用券记录
      UserSystemCouponRecord couponRecord = new UserSystemCouponRecord();
      couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS);
      couponRecord.setGoodSource(order.getOrderType());
      couponRecord.setOrderNo(order.getOrderId());
      couponRecord.setUserSystemCoupon(userSystemCoupon);
      couponRecord.setCouponType(userSystemCoupon.getSystemCoupon().getType().name());
      couponRecord.setCreateTime(date);
      couponRecord.setUpdateTime(date);
      userSystemCouponRecordService.insertSelective(couponRecord);
      // 消息推送
   public void useRewardCouponCore(UserSystemCoupon userSystemCoupon, BigDecimal money, BigDecimal hongBao, Long uid,
         Order order) throws Exception {
      org.springframework.transaction.TransactionStatus transactionStatus = transactionManager
            .getTransaction(new DefaultTransactionDefinition());
      try {
         userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, order.getOrderId());
         // 1、插入红包数据
         HongBaoV2 hongBaoV2 = new HongBaoV2();
         hongBaoV2.setMoney(money);
         hongBaoV2.setType(HongBaoV2.TYPE_COUPON);
         hongBaoV2.setState(HongBaoV2.STATE_YILINGQU);
         hongBaoV2.setVersion(2);
         hongBaoV2.setCreateTime(new Date());
         hongBaoV2.setUpdateTime(new Date());
         hongBaoV2.setUserInfo(new UserInfo(uid));
         hongBaoV2.setPreGetTime(new Date());
         hongBaoV2.setGetTime(new Date());
         hongBaoV2Service.insertSelective(hongBaoV2);
         // 2.插入关联
         orderHongBaoMapService.addOrderHongBaoMap(hongBaoV2, order);
         // 3.插入资金明细,用户余额
         UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(order.getOrderId(),
               order.getOrderType(), money, new UserInfo(uid));
         userMoneyDetailService.addUserMoneyDetail(userMoneyDetail);
         userInfoService.addMoney(new UserInfo(uid), money);
         /* 用户券信息状态及记录处理 */
         Date date = new Date();
         // 更新券状态:已使用
         userSystemCoupon.setState(UserSystemCoupon.STATE_END_USE);
         userSystemCoupon.setUseTime(date);
         userSystemCoupon.setUpdateTime(date);
         userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon);
         SystemCoupon coupon = systemCouponService.selectByPrimaryKey(userSystemCoupon.getSystemCoupon().getId());
         // 插入使用券记录
         UserSystemCouponRecord couponRecord = new UserSystemCouponRecord();
         couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS);
         couponRecord.setGoodSource(order.getOrderType());
         couponRecord.setOrderNo(order.getOrderId());
         couponRecord.setUserSystemCoupon(userSystemCoupon);
         couponRecord.setCouponType(coupon.getType().name());
         couponRecord.setCreateTime(date);
         couponRecord.setUpdateTime(date);
         userSystemCouponRecordService.insertSelective(couponRecord);
         // 插入资金通知
         userMoneyMsgNotificationService.orderReward(uid, order.getOrderId(), order.getOrderType(), money,
               userInfoService.selectByPKey(uid).getMyHongBao());
         // 消息推送
         try {
            userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, order.getOrderId());
         } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
         }
         transactionManager.commit(transactionStatus);
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
         e.printStackTrace();
         transactionManager.rollback(transactionStatus);
         throw new Exception();
      }
   }