package com.yeshi.fanli.service.impl.shop;
|
|
import java.math.BigDecimal;
|
import java.util.Date;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.exception.WXOrderException;
|
|
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.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.exception.redpack.RedPackBalanceException;
|
import com.yeshi.fanli.exception.redpack.RedPackDetailException;
|
import com.yeshi.fanli.exception.shop.BanLiShopOrderException;
|
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
|
import com.yeshi.fanli.service.inter.redpack.RedPackDetailService;
|
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsClassService;
|
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsService;
|
import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsSetService;
|
import com.yeshi.fanli.service.inter.shop.BanLiShopOrderPayService;
|
import com.yeshi.fanli.service.inter.shop.BanLiShopOrderService;
|
import com.yeshi.fanli.util.factory.RedPackDetailFactory;
|
import com.yeshi.fanli.util.rocketmq.MQTopicName;
|
import com.yeshi.fanli.util.wx.BanLiShopWXPayUtil;
|
|
@Service
|
public class BanLiShopOrderPayServiceImpl implements BanLiShopOrderPayService {
|
@Resource
|
private BanLiShopGoodsSetService banLiShopGoodsSetService;
|
|
@Resource
|
private BanLiShopGoodsService banLiShopGoodsService;
|
|
@Resource
|
private BanLiShopGoodsClassService banLiShopGoodsClassService;
|
|
@Resource
|
private RedPackBalanceService redPackBalanceService;
|
|
@Resource
|
private BanLiShopOrderService banLiShopOrderService;
|
|
@Resource
|
private RedPackDetailService redPackDetailService;
|
|
@Resource(name = "producer")
|
private Producer producer;
|
|
@Transactional
|
@Override
|
public void payOrderByHongBao(Long orderId) throws BanLiShopOrderException, RedPackBalanceException {
|
BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId);
|
if (order == null) {
|
throw new BanLiShopOrderException(1, "订单不存在");
|
}
|
if (order.getHongBaoPayment() == null)
|
return;
|
|
if (order.getHongBaoPaymentState() != null && order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_PAID) {
|
throw new BanLiShopOrderException(3, "重复支付");
|
}
|
|
BanLiShopGoods goods = banLiShopGoodsService.selectByPrimaryKey(order.getGoods().getId());
|
BanLiShopGoodsClass goodsClass = banLiShopGoodsClassService.selectByPrimaryKey(goods.getGoodsClass().getId());
|
BanLiShopGoodsSets set = banLiShopGoodsSetService.selectByPrimaryKey(order.getGoodsSet().getId());
|
RedPackDetail detail = null;
|
try {
|
detail = RedPackDetailFactory.createUseByShopOrder(orderId, order.getUid(), goodsClass.getName(),
|
set.getName(), order.getHongBaoPayment());
|
} catch (RedPackDetailException e) {
|
e.printStackTrace();
|
}
|
|
if (detail == null)
|
throw new RedPackBalanceException(4, "红包详情失败");
|
redPackBalanceService.subRedPack(order.getUid(), order.getHongBaoPayment(), detail);
|
|
BanLiShopOrder update = new BanLiShopOrder();
|
update.setId(order.getId());
|
update.setHongBaoPaymentState(BanLiShopOrder.PAY_STATE_PAID);
|
// 判断其他待支付项是否已经支付
|
update.setUpdateTime(new Date());
|
if (order.getState() == BanLiShopOrder.STATE_NO_PAY)
|
if ((order.getBalancePaymentState() == null
|
|| order.getBalancePaymentState() == BanLiShopOrder.PAY_STATE_PAID)
|
&& (order.getMoneyPaymentState() == null
|
|| order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_PAID))// 其他待支付项已经支付
|
update.setState(BanLiShopOrder.STATE_PAID);
|
banLiShopOrderService.udpateSelectiveByPrimaryKey(update);
|
if (update.getState() != null && update.getState() == BanLiShopOrder.STATE_PAID) {
|
paySuccess(order);
|
}
|
}
|
|
@Transactional
|
@Override
|
public void payOrderByMoney(Long orderId, BigDecimal money) throws BanLiShopOrderException {
|
BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId);
|
if (order == null) {
|
throw new BanLiShopOrderException(1, "订单不存在");
|
}
|
if (order.getMoneyPayment() == null)
|
throw new BanLiShopOrderException(2, "不需要采用现金支付");
|
|
if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() != BanLiShopOrder.PAY_STATE_NOPAY) {
|
throw new BanLiShopOrderException(3, "重复支付");
|
}
|
|
if (order.getMoneyPayment().compareTo(money) > 0) {
|
throw new BanLiShopOrderException(4, "支付金额不够");
|
}
|
|
// 支付成功
|
BanLiShopOrder update = new BanLiShopOrder();
|
update.setId(order.getId());
|
update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_PAID);
|
// 判断其他待支付项是否已经支付
|
update.setUpdateTime(new Date());
|
if (order.getState() == BanLiShopOrder.STATE_NO_PAY)
|
if ((order.getBalancePaymentState() == null
|
|| order.getBalancePaymentState() == BanLiShopOrder.PAY_STATE_PAID)
|
&& (order.getHongBaoPaymentState() == null
|
|| order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_PAID))// 其他待支付项已经支付
|
update.setState(BanLiShopOrder.STATE_PAID);
|
banLiShopOrderService.udpateSelectiveByPrimaryKey(update);
|
if (update.getState() != null && update.getState() == BanLiShopOrder.STATE_PAID) {
|
paySuccess(order);
|
}
|
}
|
|
/**
|
* 支付成功
|
*/
|
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);
|
}
|
}
|
|
@Transactional
|
@Override
|
public void refund(Long orderId) throws BanLiShopOrderException {
|
// 订单退款
|
// 查询订单是否已经被拒绝
|
BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId);
|
if (order == null)
|
throw new BanLiShopOrderException(1, "订单不存在");
|
if (order.getState() == BanLiShopOrder.STATE_REJECT_REFUND_FAIL
|
|| order.getState() == BanLiShopOrder.STATE_REJECT_REFUND_SUCCESS)
|
throw new BanLiShopOrderException(2, "订单未被拒绝/订单已退款");
|
|
BanLiShopOrder update = new BanLiShopOrder();
|
update.setId(order.getId());
|
if (order.getHongBaoPaymentState() != null && order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_PAID) {
|
BanLiShopGoods goods = banLiShopGoodsService.selectByPrimaryKey(order.getGoods().getId());
|
BanLiShopGoodsClass goodsClass = banLiShopGoodsClassService
|
.selectByPrimaryKey(goods.getGoodsClass().getId());
|
BanLiShopGoodsSets set = banLiShopGoodsSetService.selectByPrimaryKey(order.getGoodsSet().getId());
|
// 红包退款
|
RedPackDetail detail = null;
|
try {
|
detail = RedPackDetailFactory.createShopOrderDrawBack(orderId, order.getUid(), goodsClass.getName(),
|
set.getName(), order.getHongBaoPayment());
|
} catch (RedPackDetailException e) {
|
e.printStackTrace();
|
}
|
|
if (detail == null)
|
throw new BanLiShopOrderException(4, "红包详情失败");
|
try {
|
redPackBalanceService.addRedPack(order.getUid(), order.getHongBaoPayment(), detail);
|
} catch (RedPackBalanceException e) {
|
throw new BanLiShopOrderException(5, "红包退款失败");
|
}
|
update.setHongBaoPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
|
order.setHongBaoPaymentState(BanLiShopOrder.PAY_STATE_REFUND);
|
}
|
|
if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_PAID) {
|
try {
|
boolean success = BanLiShopWXPayUtil.refund(order.getOrderNo(), order.getMoneyPayment());
|
if (success) {
|
update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUNDING);
|
order.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUNDING);
|
// 发送退款消息
|
BanLiShopOrderMQMsg msg = new BanLiShopOrderMQMsg(order.getId(), order.getUid());
|
Message message = new Message(MQTopicName.TOPIC_ORDER.name(),
|
OrderTopicTagEnum.banLiShopOrderRefund.name(), new Gson().toJson(msg).getBytes());
|
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 (update.getMoneyPaymentState() != null
|
&& update.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;// 部分退款成功
|
}
|
}
|
|
}
|