yujian
2020-01-18 f4a0f2acc63d7785eab108419a4e16f5f688cb95
fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderServiceImpl.java
@@ -10,6 +10,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.yeshi.utils.exception.WXOrderException;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
@@ -22,6 +23,8 @@
import com.yeshi.fanli.dao.mybatis.shop.BanLiShopOrderMapper;
import com.yeshi.fanli.dto.mq.order.OrderTopicTagEnum;
import com.yeshi.fanli.dto.mq.order.body.BanLiShopOrderMQMsg;
import com.yeshi.fanli.dto.msg.MsgRedPackUseContentDTO;
import com.yeshi.fanli.entity.bus.msg.MsgMoneyDetail.MsgTypeMoneyTypeEnum;
import com.yeshi.fanli.entity.mq.MQUnSendInfo;
import com.yeshi.fanli.entity.redpack.RedPackDetail;
import com.yeshi.fanli.entity.shop.BanLiShopGoods;
@@ -34,8 +37,10 @@
import com.yeshi.fanli.exception.redpack.RedPackBalanceException;
import com.yeshi.fanli.exception.redpack.RedPackDetailException;
import com.yeshi.fanli.exception.shop.BanLiShopOrderException;
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.mq.MQUnSendInfoService;
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
import com.yeshi.fanli.service.inter.redpack.RedPackForbidService;
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsClassService;
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsService;
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsSetPayService;
@@ -43,8 +48,10 @@
import com.yeshi.fanli.service.inter.shop.BanLiShopOrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.factory.RedPackDetailFactory;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import com.yeshi.fanli.util.shop.BanLiShopOrderUtil;
import com.yeshi.fanli.util.wx.BanLiShopWXPayUtil;
@Service
public class BanLiShopOrderServiceImpl implements BanLiShopOrderService {
@@ -82,7 +89,14 @@
   @Resource(name = "transactionManager")
   private DataSourceTransactionManager transactionManager;
   @Transactional
   @Resource
   private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
   @Resource
   private RedPackForbidService redPackForbidService;
   @Transactional(rollbackFor=Exception.class)
   @Override
   public void addOrder(BanLiShopOrder order) throws BanLiShopOrderException {
      // 查询必要的参数是否添加
@@ -135,7 +149,12 @@
      BanLiShopOrder update = new BanLiShopOrder();
      update.setId(order.getId());
      update.setOrderNo(orderNo);
      order.setOrderNo(orderNo);
      banLiShopOrderMapper.updateByPrimaryKeySelective(update);
      // 增加销量
      banLiShopGoodsSetService.addSalesCount(order.getGoodsSet().getId(), 1);
      banLiShopGoodsService.addSalesCount(order.getGoods().getId(), 1);
      // 订单添加成功 ,延时通知后续
      sendPlaceOrderMsg(order.getId(), order.getUid());
@@ -150,14 +169,15 @@
      orderGoods.setSetName(set.getName());
      orderGoods.setState(set.getState());
      orderGoods.setZkPrice(set.getZkPrice());
      orderGoods.setPicture(goods.getSquarePicture());
      banLiShopOrderGoodsMapper.insertSelective(orderGoods);
      return orderGoods;
   }
   private void sendPlaceOrderMsg(Long orderId, Long uid) {
      Message msg = new Message(MQTopicName.TOPIC_ORDER.name(), OrderTopicTagEnum.banLiShopOrderDelay.name(),
            new Gson().toJson(new BanLiShopOrderMQMsg(orderId, uid)).getBytes());
      Message msg = MQMsgBodyFactory.create(MQTopicName.TOPIC_ORDER, OrderTopicTagEnum.banLiShopOrderDelay,
            new BanLiShopOrderMQMsg(orderId, uid));
      msg.setKey(orderId + "");
      long delayTime = System.currentTimeMillis() + (Constant.IS_TEST ? 1000 * 30L : 1000 * 60 * 10);// 10分钟后通知
      msg.setStartDeliverTime(delayTime);
@@ -182,12 +202,12 @@
   @Override
   public List<BanLiShopOrder> listByUid(Long uid, int page, int pageSize) {
      return banLiShopOrderMapper.listByUid(null, uid, (page - 1) * pageSize, pageSize);
      return banLiShopOrderMapper.listByUidAndState(null, uid, (page - 1) * pageSize, pageSize);
   }
   @Override
   public long countByUid(Long uid) {
      return banLiShopOrderMapper.countByUid(null, uid);
      return banLiShopOrderMapper.countByUidAndState(null, uid);
   }
   @Override
@@ -204,7 +224,7 @@
      banLiShopOrderMapper.updateByPrimaryKeySelective(order);
   }
   @Transactional
   @Transactional(rollbackFor=Exception.class)
   @Override
   public void payOrderByHongBao(Long orderId) throws BanLiShopOrderException, RedPackBalanceException {
      BanLiShopOrder order = banLiShopOrderMapper.selectByPrimaryKeyForUpdate(orderId);
@@ -295,6 +315,7 @@
      // 支付成功
      BanLiShopOrder update = new BanLiShopOrder();
      update.setId(orderId);
      update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_PAID);
      // 判断其他待支付项是否已经支付
      update.setUpdateTime(new Date());
@@ -317,6 +338,28 @@
      // 判断是否处于未付款
      if (order.getState() == BanLiShopOrder.STATE_NO_PAY) {
         /**
          * 查询是否已经微信支付
          */
         if (order.getMoneyPayment() != null) {
            try {
               boolean isS = BanLiShopWXPayUtil.isPaySuccess(order.getOrderNo());
               if (isS)// 支付成功,重新发送支付成功消息
               {
                  BanLiShopOrderMQMsg msg = new BanLiShopOrderMQMsg(order.getId(), order.getUid());
                  Message message =MQMsgBodyFactory.create(MQTopicName.TOPIC_ORDER,
                        OrderTopicTagEnum.banLiShopOrderPaid,msg);
                  producer.send(message);
                  return;
               }
            } catch (WXOrderException e) {
               e.printStackTrace();
            } catch (Exception e) {
            }
         }
         BanLiShopOrder update = new BanLiShopOrder();
         update.setId(id);
         update.setStateDesc(desc);
@@ -336,8 +379,8 @@
      if (order.getState() != BanLiShopOrder.STATE_PAID)
         throw new BanLiShopOrderException(1, "订单未处于待审核状态");
      Message message = new Message(MQTopicName.TOPIC_ORDER.name(), OrderTopicTagEnum.banLiShopOrderRefund.name(),
            new Gson().toJson(new BanLiShopOrderMQMsg(order.getId(), order.getUid())).getBytes());
      Message message =MQMsgBodyFactory.create(MQTopicName.TOPIC_ORDER, OrderTopicTagEnum.banLiShopOrderRefund,
         new BanLiShopOrderMQMsg(order.getId(), order.getUid()));
      try {
         orderTransactionProducer.send(message, new LocalTransactionExecuter() {
            @Override
@@ -362,7 +405,17 @@
         update.setState(BanLiShopOrder.STATE_REJECT);
         update.setStateDesc(msg);
         update.setUpdateTime(new Date());
         update.setRejectTime(new Date());
         banLiShopOrderMapper.updateByPrimaryKeySelective(update);
         // 消息发送
         MsgRedPackUseContentDTO dto = new MsgRedPackUseContentDTO();
         dto.setGoodsSetName(order.getOrderGoods().getSetName());
         dto.setHongBao(order.getHongBaoPayment());
         dto.setMoney(order.getMoneyPayment());
         dto.setReason(msg);
         dto.setTime(new Date());
         userMoneyMsgNotificationService.redPackMsg(order.getUid(), MsgTypeMoneyTypeEnum.redPackUseFail,
               new Gson().toJson(dto), null);
         transactionManager.commit(transactionStatus);
      } catch (Exception e) {
         transactionManager.rollback(transactionStatus);
@@ -387,6 +440,9 @@
         throw new BanLiShopOrderException(22, "商品已下线");
      }
      if(redPackForbidService.verifyForbid(uid))
         throw new BanLiShopOrderException(25, "红包功能已被封禁");
      if (pay.getHongBaoPrice() != null && pay.getHongBaoPrice().compareTo(new BigDecimal(0)) > 0) {
         BigDecimal money = redPackBalanceService.getBalance(uid);
         if (money.compareTo(pay.getHongBaoPrice()) < 0) {
@@ -420,4 +476,19 @@
      return order;
   }
   @Override
   public BanLiShopOrder selectByOrderNo(String orderNo) {
      return banLiShopOrderMapper.selectByOrderNo(orderNo);
   }
   @Override
   public List<BanLiShopOrder> listByUidAndState(Long uid, List<Integer> stateList, int page, int pageSize) {
      return banLiShopOrderMapper.listByUidAndState(stateList, uid, (page - 1) * pageSize, pageSize);
   }
   @Override
   public long countByUidAndState(Long uid, List<Integer> stateList) {
      return banLiShopOrderMapper.countByUidAndState(stateList, uid);
   }
}