yujian
2020-01-18 f4a0f2acc63d7785eab108419a4e16f5f688cb95
fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderPayServiceImpl.java
@@ -7,18 +7,33 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.entity.wx.WXAPPInfo;
import org.yeshi.utils.NumberUtil;
import org.yeshi.utils.exception.WXOrderException;
import org.yeshi.utils.wx.WXPayUtil;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.google.gson.Gson;
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.common.AdminUser;
import com.yeshi.fanli.entity.common.Config;
import com.yeshi.fanli.entity.redpack.RedPackDetail;
import com.yeshi.fanli.entity.shop.BanLiShopGoods;
import com.yeshi.fanli.entity.shop.BanLiShopGoodsClass;
import com.yeshi.fanli.entity.shop.BanLiShopGoodsSets;
import com.yeshi.fanli.entity.shop.BanLiShopOrder;
import com.yeshi.fanli.entity.shop.ChargeTypeEnum;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
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.exception.shop.FuLuChargeException;
import com.yeshi.fanli.service.AdminUserService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
import com.yeshi.fanli.service.inter.redpack.RedPackDetailService;
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsClassService;
@@ -27,7 +42,14 @@
import com.yeshi.fanli.service.inter.shop.BanLiShopOrderPayService;
import com.yeshi.fanli.service.inter.shop.BanLiShopOrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.charge.FuLuChargeApiUtil;
import com.yeshi.fanli.util.email.MailSenderUtil;
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.wx.BanLiShopWXPayUtil;
@Service
public class BanLiShopOrderPayServiceImpl implements BanLiShopOrderPayService {
@@ -49,7 +71,19 @@
   @Resource
   private RedPackDetailService redPackDetailService;
   @Transactional
   @Resource
   private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
   @Resource
   private ConfigService configService;
   @Resource
   private AdminUserService adminUserService;
   @Resource(name = "producer")
   private Producer producer;
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void payOrderByHongBao(Long orderId) throws BanLiShopOrderException, RedPackBalanceException {
      BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId);
@@ -57,7 +91,7 @@
         throw new BanLiShopOrderException(1, "订单不存在");
      }
      if (order.getHongBaoPayment() == null)
         throw new BanLiShopOrderException(2, "不需要采用红包支付");
         return;
      if (order.getHongBaoPaymentState() != null && order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_PAID) {
         throw new BanLiShopOrderException(3, "重复支付");
@@ -88,14 +122,17 @@
               || order.getBalancePaymentState() == BanLiShopOrder.PAY_STATE_PAID)
               && (order.getMoneyPaymentState() == null
                     || order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_PAID))// 其他待支付项已经支付
         {
            update.setState(BanLiShopOrder.STATE_PAID);
            update.setStateDesc("支付成功");
         }
      banLiShopOrderService.udpateSelectiveByPrimaryKey(update);
      if (update.getState() != null && update.getState() == BanLiShopOrder.STATE_PAID) {
         paySuccess(order);
      }
   }
   @Transactional
   @Transactional(rollbackFor=Exception.class)
   @Override
   public void payOrderByMoney(Long orderId, BigDecimal money) throws BanLiShopOrderException {
      BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId);
@@ -124,7 +161,10 @@
               || order.getBalancePaymentState() == BanLiShopOrder.PAY_STATE_PAID)
               && (order.getHongBaoPaymentState() == null
                     || order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_PAID))// 其他待支付项已经支付
         {
            update.setState(BanLiShopOrder.STATE_PAID);
            update.setStateDesc("支付成功");
         }
      banLiShopOrderService.udpateSelectiveByPrimaryKey(update);
      if (update.getState() != null && update.getState() == BanLiShopOrder.STATE_PAID) {
         paySuccess(order);
@@ -135,21 +175,27 @@
    * 支付成功
    */
   private void paySuccess(BanLiShopOrder order) {
      // 将红包明细外显
      RedPackDetail detail = null;
      try {
         detail = RedPackDetailFactory.createUseByShopOrder(order.getId(), order.getUid(), "", "",
               order.getHongBaoPayment());
      } catch (RedPackDetailException e) {
         e.printStackTrace();
      }
      if (detail != null) {
         redPackDetailService.changeDisplayByIdentifyCode(detail.getIdentifyCode(), true);
      }
      ThreadUtil.run(new Runnable() {
         @Override
         public void run() {
            long[] targetUids = new long[] { 3L, 4L };
            Config config = configService.getConfig(ConfigKeyEnum.extractCodeEmailFrom.getKey());
            String[] sts = config.getValue().split(",");
            String account = sts[0];
            String pwd = sts[1];
            for (long adminId : targetUids) {
               AdminUser adminUser = adminUserService.selectByPrimaryKey(adminId);
               String msg = "有新的红包商城订单";
               boolean isS = MailSenderUtil.sendEmail(adminUser.getEmail(), account, pwd, "有新的红包商城订单", msg);
            }
         }
      });
   }
   @Transactional
   @Transactional(rollbackFor=Exception.class)
   @Override
   public void refund(Long orderId) throws BanLiShopOrderException {
      // 订单退款
@@ -157,7 +203,8 @@
      BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId);
      if (order == null)
         throw new BanLiShopOrderException(1, "订单不存在");
      if (order.getState() != BanLiShopOrder.STATE_REJECT)
      if (order.getState() == BanLiShopOrder.STATE_REJECT_REFUND_FAIL
            || order.getState() == BanLiShopOrder.STATE_REJECT_REFUND_SUCCESS)
         throw new BanLiShopOrderException(2, "订单未被拒绝/订单已退款");
      BanLiShopOrder update = new BanLiShopOrder();
@@ -184,22 +231,165 @@
            throw new BanLiShopOrderException(5, "红包退款失败");
         }
         update.setHongBaoPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
         order.setHongBaoPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
      }
      // TODO 微信支付退款
      if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_PAID) {
         try {
            boolean success = WXPayUtil.refund(order.getOrderNo(), order.getMoneyPayment(), order.getMoneyPayment(),
                  null, new WXAPPInfo(), null, null);
            boolean success = BanLiShopWXPayUtil.refund(order.getOrderNo(), order.getMoneyPayment());
            if (success) {
               update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
               update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUNDING);
               order.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUNDING);
               // 发送退款消息
               BanLiShopOrderMQMsg msg = new BanLiShopOrderMQMsg(order.getId(), order.getUid());
               Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_ORDER,
                     OrderTopicTagEnum.banLiShopOrderRefund, msg);
               message.setStartDeliverTime(System.currentTimeMillis() + 1000 * 60 * 5L);// 延时24小时通知检测微信退款状态
               SendResult result = producer.send(message);
               if (result == null) {
                  throw new BanLiShopOrderException(8, "消息发送失败");
               }
            } else
               throw new BanLiShopOrderException(6, "微信支付退款失败");
         } catch (WXOrderException e) {
            throw new BanLiShopOrderException(6, "微信支付退款失败");
         }
      }
      // 检查 是否退款成功
      if (order.getMoneyPaymentState() != null
            && order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_REFUNDING) {
         try {
            boolean isS = BanLiShopWXPayUtil.isRefundSuccess(order.getOrderNo());
            if (isS) {
               update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
               order.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
            }
         } catch (WXOrderException e) {
            throw new BanLiShopOrderException(7, "微信支付退款查询失败");
         }
      }
      if (update.getHongBaoPaymentState() != null || update.getMoneyPaymentState() != null) {
         // 获取整个订单的退款状态
         int state = getRefundState(order);
         update.setState(state);
         update.setUpdateTime(new Date());
         banLiShopOrderService.udpateSelectiveByPrimaryKey(update);
      }
   }
   /**
    * 获取整个退款状态
    *
    * @param order
    * @return
    */
   private int getRefundState(BanLiShopOrder order) {
      int refundCount = 0;
      int refundSuccessCount = 0;
      if (order.getHongBaoPayment() != null) {
         refundCount++;
         if (order.getHongBaoPaymentState() != null
               && order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_REFUND)
            refundSuccessCount++;
      }
      if (order.getBalancePayment() != null) {
         refundCount++;
         if (order.getBalancePaymentState() != null
               && order.getBalancePaymentState() == BanLiShopOrder.PAY_STATE_REFUND)
            refundSuccessCount++;
      }
      if (order.getMoneyPayment() != null) {
         refundCount++;
         if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_REFUND)
            refundSuccessCount++;
      }
      if (refundCount == refundSuccessCount)
         return BanLiShopOrder.STATE_REJECT_REFUND_SUCCESS;// 退款成功
      else {
         if (refundSuccessCount == 0)
            return BanLiShopOrder.STATE_REJECT;// 退款中
         else
            return BanLiShopOrder.STATE_REJECT_REFUND_PART_SUCCESS;// 部分退款成功
      }
   }
   @Transactional(rollbackFor = Exception.class)
   @Override
   public void charge(Long orderId) throws BanLiShopOrderException {
      BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKey(orderId);
      if (order == null)
         throw new BanLiShopOrderException(1, "订单不存在");
      if (order.getState() != BanLiShopOrder.STATE_PAID) {
         throw new BanLiShopOrderException(100, "订单不是处于付款状态");
      }
      if (order.getChargeAccountType() == ChargeTypeEnum.phone) {
         if (!StringUtil.isMobile(order.getChargeAccount())) {
            throw new BanLiShopOrderException(101, "电话号码格式不正确");
         }
      } else if (order.getChargeAccountType() == ChargeTypeEnum.qq) {
         if (!NumberUtil.isNumeric(order.getChargeAccount())) {
            throw new BanLiShopOrderException(101, "QQ号格式错误");
         }
      } else {
         throw new BanLiShopOrderException(102, "非充值商品");
      }
      // 获取福禄的套餐
      BanLiShopGoodsSets set = banLiShopGoodsSetService.selectByPrimaryKey(order.getGoodsSet().getId());
      if (set == null) {
         throw new BanLiShopOrderException(104, "商品套餐已下线");
      }
      if (StringUtil.isNullOrEmpty(set.getChargeFuLuNum())) {
         throw new BanLiShopOrderException(105, "福禄充值ID为空");
      }
      // 改变状态为成功
      BanLiShopOrder update = new BanLiShopOrder(order.getId());
      update.setState(BanLiShopOrder.STATE_SUCCESS);
      update.setStateDesc("充值成功");
      update.setUpdateTime(new Date());
      update.setSuccessTime(new Date());
      banLiShopOrderService.udpateSelectiveByPrimaryKey(update);
      if (order.getHongBaoPayment() != null && order.getHongBaoPayment().compareTo(new BigDecimal(0)) > 0) {
         // 将红包明细外显
         RedPackDetail detail = null;
         try {
            detail = RedPackDetailFactory.createUseByShopOrder(order.getId(), order.getUid(), "", "",
                  order.getHongBaoPayment());
         } catch (RedPackDetailException e) {
            e.printStackTrace();
         }
         if (detail != null) {
            redPackDetailService.changeDisplayByIdentifyCode(detail.getIdentifyCode(), true);
         }
      }
      // 消息发送
      MsgRedPackUseContentDTO dto = new MsgRedPackUseContentDTO();
      dto.setGoodsSetName(order.getOrderGoods().getSetName());
      dto.setHongBao(order.getHongBaoPayment());
      dto.setMoney(order.getMoneyPayment());
      dto.setTime(new Date());
      userMoneyMsgNotificationService.redPackMsg(order.getUid(), MsgTypeMoneyTypeEnum.redPackUseSuccess,
            new Gson().toJson(dto), null);
      try {
         if (Constant.IS_TEST) {
            FuLuChargeApiUtil.shaXiangCharge(set.getChargeFuLuNum(), "banlishop" + order.getOrderNo(),
                  order.getChargeAccount());
         } else
            FuLuChargeApiUtil.charge(set.getChargeFuLuNum(), "banlishop" + order.getOrderNo(),
                  order.getChargeAccount());
      } catch (FuLuChargeException e) {
         throw new BanLiShopOrderException(e.getCode(), e.getMsg());
      }
   }
}