Эх сурвалжийг харах

套餐升级银河币使用

zoujiajian 1 жил өмнө
parent
commit
aaa89fc4b8

+ 16 - 2
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonGalaxyCoinRecord.java

@@ -27,7 +27,21 @@ public class OrderDonGalaxyCoinRecord extends BaseEntity{
 	private BigDecimal refundGalaxyCoin;
 
 	/**
-	 * 是否是会员订单 默认false
+	 * 0.普通订单 1.会员订单 2.套餐升级订单
 	 */
-	private Boolean isVip;
+	private Integer source;
+
+
+	@Getter
+	public enum Source{
+		ordinary("普通订单"),
+		vip("会员订单"),
+		upgrade("套餐升级订单"),
+		;
+		String desc;
+
+		Source(String desc) {
+			this.desc = desc;
+		}
+	}
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserGalaxyCoinRecord.java

@@ -36,5 +36,10 @@ public class UserGalaxyCoinRecord extends BaseEntity{
 	 */
 	private Date expiryTime;
 
+	/**
+	 *  0.普通订单 1.会员订单 2.套餐升级订单
+	 */
+	private Integer source;
+
 	private String remark;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonView.java

@@ -52,6 +52,12 @@ public class RefundOrderDonView {
 	@DbField("rd.refund_fee")
 	private BigDecimal refundMoney;
 
+	/**
+	 * 退款余额
+	 */
+	@DbField("rd.refund_balance")
+	private BigDecimal refundBalance;
+
 	@DbField("rd.goods_id")
 	private Long goodsId;
 

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RefundUpdradeOrderDonView.java

@@ -56,6 +56,12 @@ public class RefundUpdradeOrderDonView {
 	@DbField("rd.refund_fee")
 	private BigDecimal refundMoney;
 
+	/**
+	 * 退款余额
+	 */
+	@DbField("rd.refund_balance")
+	private BigDecimal refund_balance;
+
 	@DbField("rd.package_id")
 	private Long packageId;
 

+ 7 - 5
netflix-service/src/main/java/com/cyksj/service/coin/UserGalaxyCoinService.java

@@ -1,5 +1,7 @@
 package com.cyksj.service.coin;
 
+import com.cyksj.model.entity.OrderDonGalaxyCoinRecord;
+
 import java.math.BigDecimal;
 
 /**
@@ -12,13 +14,13 @@ public interface UserGalaxyCoinService {
 
 	void sendGalaxyCoinRecord(Long userId, Integer galaxyCoin, String remark, Boolean isLottery);
 
-	void recordUseRecord(Long orderId, Long userId, BigDecimal galaxyCoin, String remark, Boolean available);
+	void recordUseRecord(Long orderId, Long userId, BigDecimal galaxyCoin, String remark, Boolean available, OrderDonGalaxyCoinRecord.Source source);
 
-	void recordOrderRefundGalaxyCoinIfValid(Long orderId, Long userId, BigDecimal galaxyCoin);
+	void recordOrderRefundGalaxyCoinIfValid(Long orderId, Long userId, BigDecimal galaxyCoin, OrderDonGalaxyCoinRecord.Source source);
 
-	void subOrderGenerateGalaxyCoin(Long orderId);
+	void subOrderGenerateGalaxyCoin(Long orderId, OrderDonGalaxyCoinRecord.Source source);
 
-	void handleUserGalaxyCoinOrderNotify(Long orderId, Long userId, String orderNo, Boolean ivVip);
+	void handleUserGalaxyCoinOrderNotify(Long orderId, Long userId, String orderNo, OrderDonGalaxyCoinRecord.Source source);
 
-	void sendOrderCashback(Long orderId, Long userId, Integer galaxyCoin, String remark);
+	void sendOrderCashback(Long orderId, Long userId, Integer galaxyCoin, String remark, OrderDonGalaxyCoinRecord.Source source);
 }

+ 22 - 19
netflix-service/src/main/java/com/cyksj/service/coin/impl/UserGalaxyCoinServiceImpl.java

@@ -37,20 +37,15 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 	@Override
 	public void sendGalaxyCoinRecord(Long userId, Integer galaxyCoin, String remark, Boolean isLottery) {
 		if (!isLottery) {
-			sendGalaxyCoinHandle(userId, null, galaxyCoin, remark, true, true);
+			sendGalaxyCoinHandle(userId, null, galaxyCoin, remark, true, true, null);
 		}
 	}
 
 	/**
-	 *
-	 * @param userId
-	 * @param orderId
-	 * @param galaxyCoin
-	 * @param remark
-	 * @param isRecord 是否记录
+	 * @param isRecord  是否记录
 	 * @param available 该笔银河币是否可用
 	 */
-	public void sendGalaxyCoinHandle(Long userId, Long orderId, Integer galaxyCoin, String remark, Boolean isRecord, Boolean available) {
+	public void sendGalaxyCoinHandle(Long userId, Long orderId, Integer galaxyCoin, String remark, Boolean isRecord, Boolean available, OrderDonGalaxyCoinRecord.Source source) {
 		if (galaxyCoin <= 0) {
 			return;
 		}
@@ -67,7 +62,7 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 					.eq(User::getGalaxyCoin, userGalaxyCoin));
 			if (update == 1) {
 				if (isRecord) {
-					recordUseRecord(orderId, userId, BigDecimal.valueOf(galaxyCoin), remark, available);
+					recordUseRecord(orderId, userId, BigDecimal.valueOf(galaxyCoin), remark, available, source);
 				}
 				break;
 			}
@@ -78,7 +73,7 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 	 * 记录银河币详情
 	 */
 	@Override
-	public void recordUseRecord(Long orderId, Long userId, BigDecimal galaxyCoin, String remark, Boolean available) {
+	public void recordUseRecord(Long orderId, Long userId, BigDecimal galaxyCoin, String remark, Boolean available, OrderDonGalaxyCoinRecord.Source source) {
 		UserGalaxyCoinRecord userGalaxyCoinRecord = new UserGalaxyCoinRecord();
 		userGalaxyCoinRecord.setOrderId(orderId);
 		userGalaxyCoinRecord.setUserId(userId);
@@ -99,12 +94,13 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 			//下单时,剩余是0
 			userGalaxyCoinRecord.setRemainGalaxyCoin(BigDecimal.ZERO);
 		}
+		userGalaxyCoinRecord.setSource(source.ordinal());
 		userGalaxyCoinRecord.setRemark(remark);
 		userGalaxyCoinRecordMapper.insert(userGalaxyCoinRecord);
 	}
 
 	@Override
-	public void recordOrderRefundGalaxyCoinIfValid(Long orderId, Long userId, BigDecimal galaxyCoin) {
+	public void recordOrderRefundGalaxyCoinIfValid(Long orderId, Long userId, BigDecimal galaxyCoin, OrderDonGalaxyCoinRecord.Source source) {
 		UserGalaxyCoinRecord userGalaxyCoinRecord = userGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
 				.eq(UserGalaxyCoinRecord::getOrderId, orderId)
 				.eq(UserGalaxyCoinRecord::getRemark, PointsRecordConst.ORDER)
@@ -118,20 +114,21 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 			return;
 		}
 		//发送银河币
-		sendGalaxyCoinHandle(userId, orderId, galaxyCoin.intValue(), PointsRecordConst.ORDER_REFUND, true, true);
+		sendGalaxyCoinHandle(userId, orderId, galaxyCoin.intValue(), PointsRecordConst.ORDER_REFUND, true, true, source);
 	}
 
 	@Override
-	public void subOrderGenerateGalaxyCoin(Long orderId) {
+	public void subOrderGenerateGalaxyCoin(Long orderId, OrderDonGalaxyCoinRecord.Source source) {
 		UserGalaxyCoinRecord userGalaxyCoinRecord = userGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
 				.eq(UserGalaxyCoinRecord::getOrderId, orderId)
+				.eq(UserGalaxyCoinRecord::getSource, source.ordinal())
 				.eq(UserGalaxyCoinRecord::getRemark, PointsRecordConst.ORDER_CASHBACK)
 				.last("limit 1"));
 		if (userGalaxyCoinRecord != null) {
 			BigDecimal remainGalaxyCoin = userGalaxyCoinRecord.getRemainGalaxyCoin();
 			if (remainGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
 				//扣除记录 对应的银河币不可用
-				sendGalaxyCoinHandle(userGalaxyCoinRecord.getUserId(), orderId, remainGalaxyCoin.negate().intValue(), PointsRecordConst.ORDER_REFUND_SUB, true, false);
+				sendGalaxyCoinHandle(userGalaxyCoinRecord.getUserId(), orderId, remainGalaxyCoin.negate().intValue(), PointsRecordConst.ORDER_REFUND_SUB, true, false, source);
 				userGalaxyCoinRecord.setRemainGalaxyCoin(BigDecimal.ZERO);
 				userGalaxyCoinRecord.setIsUsed(Boolean.TRUE);
 				userGalaxyCoinRecordMapper.updateById(userGalaxyCoinRecord);
@@ -139,24 +136,30 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 		}
 	}
 
+	/**
+	 * 订单回调时,扣除已使用的银河币 并记录使用记录
+	 */
 	@Override
-	public void handleUserGalaxyCoinOrderNotify(Long orderId, Long userId, String orderNo, Boolean ivVip) {
+	public void handleUserGalaxyCoinOrderNotify(Long orderId, Long userId, String orderNo, OrderDonGalaxyCoinRecord.Source source) {
 		//银河币使用记录
 		OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
 				.eq(OrderDonGalaxyCoinRecord::getOrderNo, orderNo)
-				.eq(OrderDonGalaxyCoinRecord::getIsVip, ivVip)
+				.eq(OrderDonGalaxyCoinRecord::getSource, source.ordinal())
 				.last("limit 1"));
 		if (orderDonGalaxyCoinRecord != null) {
 			//使用记录
-			recordUseRecord(orderId,userId, orderDonGalaxyCoinRecord.getGalaxyCoin(), PointsRecordConst.ORDER, false);
+			recordUseRecord(orderId, userId, orderDonGalaxyCoinRecord.getGalaxyCoin(), PointsRecordConst.ORDER, false, source);
 			orderDonGalaxyCoinRecord.setRefundGalaxyCoin(orderDonGalaxyCoinRecord.getGalaxyCoin());
 			orderDonGalaxyCoinRecord.setOrderId(orderId);
 			orderDonGalaxyCoinRecordMapper.updateById(orderDonGalaxyCoinRecord);
 		}
 	}
 
+	/**
+	 * 订单支付成功 返银河币
+	 */
 	@Override
-	public void sendOrderCashback(Long orderId, Long userId, Integer galaxyCoin, String remark) {
-		sendGalaxyCoinHandle(userId, orderId, galaxyCoin, remark, true, true);
+	public void sendOrderCashback(Long orderId, Long userId, Integer galaxyCoin, String remark, OrderDonGalaxyCoinRecord.Source source) {
+		sendGalaxyCoinHandle(userId, orderId, galaxyCoin, remark, true, true, source);
 	}
 }

+ 25 - 5
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -571,9 +571,28 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 orderDon.setRefundBalance(orderDonRefundBalance.add(refundBalance));
             }
 
-            //若存在余额支付,退还余额
-            if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-                userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.refund, 0L, orderDon.getId(), upgradePackage.getName() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
+//            //若存在余额支付,退还余额
+//            if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+//                userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.refund, 0L, orderDon.getId(), upgradePackage.getName() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
+//            }
+
+            //是否全额退款
+            BigDecimal orderDonRefundMoney = Optional.ofNullable(orderDon.getRefundMoney()).orElse(BigDecimal.ZERO);
+            BigDecimal orderDonRefundBalance = Optional.ofNullable(orderDon.getRefundBalance()).orElse(BigDecimal.ZERO);
+            if (orderDonRefundMoney.add(orderDonRefundBalance).compareTo(orderDon.getMoney().add(Optional.ofNullable(orderDon.getBalance()).orElse(BigDecimal.ZERO))) == 0) {
+                //是否使用银河币支付
+                OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
+                        .eq(OrderDonGalaxyCoinRecord::getOrderId, orderDon.getId())
+                        .eq(OrderDonGalaxyCoinRecord::getSource, OrderDonGalaxyCoinRecord.Source.upgrade.ordinal())
+                        .last("limit 1"));
+                if (orderDonGalaxyCoinRecord != null) {
+                    //有效时,返还银河币 并记录
+                    userGalaxyCoinService.recordOrderRefundGalaxyCoinIfValid(orderDon.getId(), orderDonGalaxyCoinRecord.getUserId(), orderDonGalaxyCoinRecord.getGalaxyCoin(), OrderDonGalaxyCoinRecord.Source.upgrade);
+                }
+            }
+            //扣除 该笔订单产生的返现银河币
+            if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
+                userGalaxyCoinService.subOrderGenerateGalaxyCoin(orderDon.getId(), OrderDonGalaxyCoinRecord.Source.upgrade);
             }
 
             if (UpgradeOrderDon.Type.BALANCE.getType().equals(refundType)) {
@@ -1057,17 +1076,18 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         if (orderDonRefundMoney.add(orderDonRefundBalance).compareTo(orderDon.getMoney().add(Optional.ofNullable(orderDon.getBalance()).orElse(BigDecimal.ZERO))) == 0) {
             //是否使用银河币支付
             OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
+                    .eq(OrderDonGalaxyCoinRecord::getSource, OrderDonGalaxyCoinRecord.Source.ordinary.ordinal())
                     .eq(OrderDonGalaxyCoinRecord::getOrderId, orderDon.getId())
                     .last("limit 1"));
             if (orderDonGalaxyCoinRecord != null) {
                 //有效时,返还银河币 并记录
-                userGalaxyCoinService.recordOrderRefundGalaxyCoinIfValid(orderDon.getId(), orderDonGalaxyCoinRecord.getUserId(), orderDonGalaxyCoinRecord.getGalaxyCoin());
+                userGalaxyCoinService.recordOrderRefundGalaxyCoinIfValid(orderDon.getId(), orderDonGalaxyCoinRecord.getUserId(), orderDonGalaxyCoinRecord.getGalaxyCoin(), OrderDonGalaxyCoinRecord.Source.ordinary);
             }
         }
 
         //扣除 该笔订单产生的返现银河币
         if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
-            userGalaxyCoinService.subOrderGenerateGalaxyCoin(orderDon.getId());
+            userGalaxyCoinService.subOrderGenerateGalaxyCoin(orderDon.getId(), OrderDonGalaxyCoinRecord.Source.ordinary);
         }
 
         try {

+ 31 - 6
netflix-service/src/main/java/com/cyksj/service/mange/vip/impl/CmsVipOrderServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.mapper.OrderDonGalaxyCoinRecordMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.vip.RefundVipOrderDonMapper;
@@ -13,6 +14,7 @@ import com.cyksj.mapper.vip.VipOrderDonMapper;
 import com.cyksj.mapper.vip.VipUserMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.OrderRefundReq;
+import com.cyksj.service.coin.UserGalaxyCoinService;
 import com.cyksj.service.mange.vip.CmsVipOrderService;
 import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.relation.GroupRelationClearService;
@@ -56,6 +58,10 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final OrderDonGalaxyCoinRecordMapper orderDonGalaxyCoinRecordMapper;
+
+	private final UserGalaxyCoinService userGalaxyCoinService;
+
 	@Override
 	public void refundOrders(OrderRefundReq refundReq) throws Exception {
 		VipOrderDon orderDon = vipOrderDonMapper.selectById(refundReq.getOrderId());
@@ -88,14 +94,33 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 			orderDon.setRefundBalance(orderDonRefundBalance.add(refundBalance));
 		}
 		//若存在余额支付,退还余额
-		if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-			BigDecimal addBalance = orderDon.getBalance();
-			//需额外扣除余额
-			if (deductBalance != null && deductBalance.compareTo(BigDecimal.ZERO) > 0) {
-				addBalance = addBalance.subtract(deductBalance);
+//		if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+//			BigDecimal addBalance = orderDon.getBalance();
+//			//需额外扣除余额
+//			if (deductBalance != null && deductBalance.compareTo(BigDecimal.ZERO) > 0) {
+//				addBalance = addBalance.subtract(deductBalance);
+//			}
+//			userBenefitsService.addUserBalance(orderDon.getUserId(), addBalance, UserBalanceSourceRecord.Source.vip_refund, null, orderDon.getId(), orderDon.getPayTitle() + UserBalanceSourceRecord.Source.vip_refund.getDesc(), true);
+//		}
+		//是否全额退款
+		BigDecimal orderDonRefundMoney = Optional.ofNullable(orderDon.getRefundMoney()).orElse(BigDecimal.ZERO);
+		BigDecimal orderDonRefundBalance = Optional.ofNullable(orderDon.getRefundBalance()).orElse(BigDecimal.ZERO);
+		if (orderDonRefundMoney.add(orderDonRefundBalance).compareTo(orderDon.getMoney().add(Optional.ofNullable(orderDon.getBalance()).orElse(BigDecimal.ZERO))) == 0) {
+			//是否使用银河币支付
+			OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
+					.eq(OrderDonGalaxyCoinRecord::getSource, OrderDonGalaxyCoinRecord.Source.vip.ordinal())
+					.eq(OrderDonGalaxyCoinRecord::getOrderId, orderDon.getId())
+					.last("limit 1"));
+			if (orderDonGalaxyCoinRecord != null) {
+				//有效时,返还银河币 并记录
+				userGalaxyCoinService.recordOrderRefundGalaxyCoinIfValid(orderDon.getId(), orderDonGalaxyCoinRecord.getUserId(), orderDonGalaxyCoinRecord.getGalaxyCoin(), OrderDonGalaxyCoinRecord.Source.vip);
 			}
-			userBenefitsService.addUserBalance(orderDon.getUserId(), addBalance, UserBalanceSourceRecord.Source.vip_refund, null, orderDon.getId(), orderDon.getPayTitle() + UserBalanceSourceRecord.Source.vip_refund.getDesc(), true);
 		}
+		//扣除 该笔订单产生的返现银河币
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
+			userGalaxyCoinService.subOrderGenerateGalaxyCoin(orderDon.getId(), OrderDonGalaxyCoinRecord.Source.vip);
+		}
+
 		//扣除会员时长
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
 		VipUser vipUser = vipUserMapper.selectOne(Wrappers.lambdaQuery(VipUser.class)

+ 130 - 4
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -3098,7 +3098,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		//银河币使用记录
 		//扣除下单银河币
-		userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), Boolean.FALSE);
+		userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), OrderDonGalaxyCoinRecord.Source.ordinary);
 		//银河币返回
 		returnGalaxyCoin(orderDon);
 	}
@@ -4014,7 +4014,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			upgradeOrderDon.setType(UpgradeOrderDon.Type.ALI_PAY);
 			upgradeOrderDonMapper.insert(upgradeOrderDon);
 
-			deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest.getBalance(),user);
+			deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest,user);
 			Long orderId = upgradeOrderDon.getId();
 			if (upgradeOrderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
 				upgradeOrderDon = upgradeOrderDonMapper.selectById(orderId);
@@ -4030,7 +4030,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		return null;
 	}
 
-	public void deductUpgradeBalancePayOrderMoney(UpgradeOrderDon orderDon, BigDecimal balance, User user) {
+	public void deductUpgradeBalancePayOrderMoney(UpgradeOrderDon orderDon, OrderPayRequest payRequest, User user) {
+		BigDecimal galaxyCoin = payRequest.getGalaxyCoin();
+		//存在银河币
+		deductGalaxyCoinPayUpgradeOrderMoney(orderDon, orderDon.getMoney(), galaxyCoin, user);
+
+		BigDecimal balance = payRequest.getBalance();
 		//存在余额
 		if (balance != null && balance.compareTo(BigDecimal.ZERO) > 0) {
 			BigDecimal money = orderDon.getMoney();
@@ -4214,6 +4219,37 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 			}
 		}
+
+		//银河币使用记录
+		//扣除下单银河币
+		userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), OrderDonGalaxyCoinRecord.Source.upgrade);
+		//银河币返回
+		returnUpgradeGalaxyCoin(orderDon);
+	}
+
+	private void returnUpgradeGalaxyCoin(UpgradeOrderDon orderDon) {
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
+			Long userId = orderDon.getUserId();
+			BigDecimal money = orderDon.getMoney();
+			SysConfig galaxyCoinConsumeReturnRateConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.GALAXY_COIN_CONSUME_RETURN_RATE_KEY)
+					.last("limit 1"));
+			BigDecimal retrunGalaxyCoin = BigDecimal.ZERO;
+			if (galaxyCoinConsumeReturnRateConfig != null && StrUtil.isNotEmpty(galaxyCoinConsumeReturnRateConfig.getSysValue())) {
+				try {
+					GalaxyCoinConsumeRateDto galaxyCoinConsumeRateDto = Jsons.parseObject(galaxyCoinConsumeReturnRateConfig.getSysValue(), GalaxyCoinConsumeRateDto.class);
+					BigDecimal moneyAvg = galaxyCoinConsumeRateDto.getMoney();
+					//返回银河币倍数
+					BigDecimal number = money.divide(moneyAvg, 0);
+					retrunGalaxyCoin = number.multiply(galaxyCoinConsumeRateDto.getGalaxyCoin());
+					//发送银河币并记录
+					userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK, OrderDonGalaxyCoinRecord.Source.upgrade);
+				} catch (Exception e) {
+					log.error("发送用户:{}银河币points:{}套餐升级错误:{}", userId, retrunGalaxyCoin, StringUtil.getErrorText(e));
+				}
+
+			}
+		}
 	}
 
 
@@ -4973,7 +5009,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					BigDecimal number = money.divide(moneyAvg, 0);
 					retrunGalaxyCoin = number.multiply(galaxyCoinConsumeRateDto.getGalaxyCoin());
 					//发送银河币并记录
-					userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK);
+					userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK, OrderDonGalaxyCoinRecord.Source.ordinary);
 				} catch (Exception e) {
 					log.error("发送用户:{}银河币points:{}错误:{}", userId, retrunGalaxyCoin, StringUtil.getErrorText(e));
 				}
@@ -4981,4 +5017,94 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	public void deductGalaxyCoinPayUpgradeOrderMoney(UpgradeOrderDon orderDon, BigDecimal discountPrice, BigDecimal toUseGalaxyCoin, User user) {
+		//存在银河币
+		if (toUseGalaxyCoin != null && toUseGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
+			BigDecimal userGalaxyCoin = user.getGalaxyCoin();
+			if (userGalaxyCoin.compareTo(toUseGalaxyCoin) < 0) {
+				throw BusinessRuntimeException.getInstance("您的银河币不足!");
+			}
+			BigDecimal orderMoney = orderDon.getMoney();
+			//订单金额不大于0
+			if (orderMoney.compareTo(BigDecimal.ZERO) == 0) {
+				return;
+			}
+			//去掉余额 多出的部分
+			BigDecimal subGalxyCoin;
+			SysConfig galaxyCoinPayConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.GALAXY_COIN_PAY_DEDUCT_KEY).last("limit 1"));
+			GalaxyCoinPayConfigDto galaxyCoinPayConfigDto = null;
+			if (galaxyCoinPayConfig != null && StrUtil.isNotEmpty(galaxyCoinPayConfig.getSysValue())) {
+				try {
+					galaxyCoinPayConfigDto = Jsons.parseObject(galaxyCoinPayConfig.getSysValue(), GalaxyCoinPayConfigDto.class);
+				} catch (Exception e) {
+				}
+				if (galaxyCoinPayConfigDto == null) {
+					throw BusinessRuntimeException.getInstance("银河币抵扣系统错误,请联系客服");
+				}
+				//每个银河币可抵扣金额
+				BigDecimal deductMoneyEachCoin = galaxyCoinPayConfigDto.getMoney().divide(galaxyCoinPayConfigDto.getGalaxyCoin());
+				//此次使用抵扣金额
+				BigDecimal thisDeductMoney = toUseGalaxyCoin.multiply(deductMoneyEachCoin);
+				//该笔平台最高可抵扣金额
+				BigDecimal maxDeductMoney = discountPrice.multiply(galaxyCoinPayConfigDto.getMaxRate());
+				if (thisDeductMoney.compareTo(maxDeductMoney) > 0) {
+					thisDeductMoney = maxDeductMoney;
+				}
+				//此次使用的银河币超过订单金额
+				if (thisDeductMoney.compareTo(orderMoney) > 0) {
+					thisDeductMoney = orderMoney;
+				}
+				//此时需要扣除的银河币
+				subGalxyCoin = thisDeductMoney.divide(deductMoneyEachCoin);
+				//银河币抵扣
+				List<UserGalaxyCoinRecord> availableGalaxyCoinList = userGalaxyCoinRecordMapper.selectList(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
+						.eq(UserGalaxyCoinRecord::getUserId, orderDon.getUserId())
+						.eq(UserGalaxyCoinRecord::getIsUsed, Boolean.FALSE)
+						.gt(UserGalaxyCoinRecord::getExpiryTime, DateTime.now())
+						.gt(UserGalaxyCoinRecord::getRemainGalaxyCoin, 0));
+				//需要使用的银河币
+				BigDecimal userFinalUseGalaxyCoin = subGalxyCoin;
+				for (UserGalaxyCoinRecord galaxyCoinRecord : availableGalaxyCoinList) {
+					if (userFinalUseGalaxyCoin.compareTo(BigDecimal.ZERO) <= 0) {
+						break;
+					}
+					BigDecimal remainGalaxyCoin = galaxyCoinRecord.getRemainGalaxyCoin();
+					Long galaxyCoinRecordId = galaxyCoinRecord.getId();
+					//扣完
+					if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) == 0) {
+						//完全抵扣
+						deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
+						userFinalUseGalaxyCoin = BigDecimal.ZERO;
+					} else if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) < 0) {
+						//不足以抵扣
+						deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
+						userFinalUseGalaxyCoin = userFinalUseGalaxyCoin.subtract(remainGalaxyCoin);
+					} else if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) > 0) {
+						//足以抵扣
+						deductUserGalaxyCoin(galaxyCoinRecordId, userFinalUseGalaxyCoin, remainGalaxyCoin, false);
+						userFinalUseGalaxyCoin = BigDecimal.ZERO;
+					}
+				}
+				//最终消耗的银河币需要为0 大于0则说明抵扣失败
+				if (userFinalUseGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
+					throw BusinessRuntimeException.getInstance("您的银河币不足!");
+				}
+				//扣除银河币 是否成功
+				Integer success = userMapper.subUserGalaxyCoin(user.getId(), subGalxyCoin, userGalaxyCoin);
+				if (success != 1) throw BusinessRuntimeException.getInstance("您的银河币不足!");
+				//记录使用详情
+				OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = new OrderDonGalaxyCoinRecord();
+				orderDonGalaxyCoinRecord.setUserId(user.getId());
+				orderDonGalaxyCoinRecord.setOrderNo(orderDon.getOrderNo());
+				orderDonGalaxyCoinRecord.setGalaxyCoin(subGalxyCoin);
+				orderDonGalaxyCoinRecord.setDeductMoney(thisDeductMoney);
+				//套餐升级来源
+				orderDonGalaxyCoinRecord.setSource(OrderDonGalaxyCoinRecord.Source.upgrade.ordinal());
+				orderDonGalaxyCoinRecordMapper.insert(orderDonGalaxyCoinRecord);
+				orderDon.setMoney(orderMoney.subtract(thisDeductMoney));
+			}
+		}
+	}
 }

+ 3 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/VipOrderDonServiceImpl.java

@@ -427,7 +427,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		}
 
 		//扣除下单银河币
-		userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), Boolean.TRUE);
+		userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), OrderDonGalaxyCoinRecord.Source.vip);
 		//银河币返回
 		returnGalaxyCoin(orderDon);
 	}
@@ -561,7 +561,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 				orderDonGalaxyCoinRecord.setOrderNo(orderDon.getOrderNo());
 				orderDonGalaxyCoinRecord.setGalaxyCoin(subGalxyCoin);
 				orderDonGalaxyCoinRecord.setDeductMoney(thisDeductMoney);
-				orderDonGalaxyCoinRecord.setIsVip(Boolean.TRUE);
+				orderDonGalaxyCoinRecord.setSource(OrderDonGalaxyCoinRecord.Source.vip.ordinal());
 				orderDonGalaxyCoinRecordMapper.insert(orderDonGalaxyCoinRecord);
 				orderDon.setMoney(orderMoney.subtract(thisDeductMoney));
 				if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
@@ -873,7 +873,7 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 					BigDecimal number = money.divide(moneyAvg, 0);
 					retrunGalaxyCoin = number.multiply(galaxyCoinConsumeRateDto.getGalaxyCoin());
 					//发送银河币并记录
-					userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK);
+					userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK, OrderDonGalaxyCoinRecord.Source.vip);
 				} catch (Exception e) {
 					log.error("发送会员用户:{}银河币points:{}错误:{}", userId, retrunGalaxyCoin, StringUtil.getErrorText(e));
 				}