Răsfoiți Sursa

超出会员抵扣金额,延长会员时长;订单退款

zoujiajian 1 an în urmă
părinte
comite
f61f70cd31
20 a modificat fișierele cu 233 adăugiri și 47 ștergeri
  1. 10 0
      netflix-dao/src/main/java/com/cyksj/model/dto/VipDeductDto.java
  2. 8 0
      netflix-dao/src/main/java/com/cyksj/model/entity/RefundOrderDon.java
  3. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/RefundUpgradeOrderDon.java
  4. 8 0
      netflix-dao/src/main/java/com/cyksj/model/entity/RefundVipOrderDon.java
  5. 15 0
      netflix-dao/src/main/java/com/cyksj/model/entity/VipOrderDon.java
  6. 14 1
      netflix-dao/src/main/java/com/cyksj/model/request/OrderRefundReq.java
  7. 8 0
      netflix-dao/src/main/java/com/cyksj/model/response/VipUserPageResp.java
  8. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/CmsVipOrderDonView.java
  9. 50 15
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  10. 51 13
      netflix-service/src/main/java/com/cyksj/service/mange/vip/impl/CmsVipOrderServiceImpl.java
  11. 3 2
      netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java
  12. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  13. 12 2
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java
  14. 10 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/VipOrderDonServiceImpl.java
  15. 1 1
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  16. 1 1
      netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java
  17. 21 7
      netflix-service/src/main/java/com/cyksj/service/vip/impl/VipFrontServiceImpl.java
  18. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/AccountTempController.java
  19. 4 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserBenefitsFrontController.java
  20. 3 1
      netflix-web/src/main/java/com/cyksj/web/controller/vip/VipController.java

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/VipDeductDto.java

@@ -26,6 +26,16 @@ public class VipDeductDto {
 	 */
 	private BigDecimal deductMoney;
 
+	/**
+	 * 实际可抵扣金额
+	 */
+	private BigDecimal actuallyDeDuctMoney;
+
+	/**
+	 * 超过抵扣金额可换延长会员多少天
+	 */
+	private Integer extendsDays = 0;
+
 	/**
 	 * 抵扣车票
 	 */

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RefundOrderDon.java

@@ -44,8 +44,16 @@ public class RefundOrderDon extends BaseEntity{
 	 */
 	private BigDecimal totalFee;
 
+	/**
+	 * 现金
+	 */
 	private BigDecimal refundFee;
 
+	/**
+	 * 余额
+	 */
+	private BigDecimal refundBalance;
+
 	private String refundDesc;
 
 	/**

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

@@ -38,6 +38,11 @@ public class RefundUpgradeOrderDon extends BaseEntity{
 
 	private BigDecimal refundFee;
 
+	/**
+	 * 退款余额
+	 */
+	private BigDecimal refundBalance;
+
 	private String refundDesc;
 
 	/**

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RefundVipOrderDon.java

@@ -30,8 +30,16 @@ public class RefundVipOrderDon extends BaseEntity{
 	 */
 	private BigDecimal totalFee;
 
+	/**
+	 * 退款现金
+	 */
 	private BigDecimal refundFee;
 
+	/**
+	 * 退款余额
+	 */
+	BigDecimal refundBalance;
+
 	private String refundDesc;
 
 	/**

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/VipOrderDon.java

@@ -58,6 +58,21 @@ public class VipOrderDon extends BaseEntity{
 	/** 金额 */
 	private BigDecimal money;
 
+	/**
+	 * 抵扣金额
+	 */
+	private BigDecimal deductMoney;
+
+	/**
+	 * 实际可抵扣金额(超过)
+	 */
+	private BigDecimal actuallyDeductMoney;
+
+	/**
+	 * 超出抵扣会员可延长多少天
+	 */
+	private Integer extendsDays;
+
 	/**
 	 * 海外支付金额
 	 */

+ 14 - 1
netflix-dao/src/main/java/com/cyksj/model/request/OrderRefundReq.java

@@ -32,7 +32,7 @@ public class OrderRefundReq {
 
 	/**
 	 * 退款类型
-	 * 订单金额、余额
+	 * 订单金额、余额、金额和余额混合bxj
 	 */
 	private String refundType;
 
@@ -69,4 +69,17 @@ public class OrderRefundReq {
 	 * 加购订单退款车票ids
 	 */
 	private List<Long> dpRelationIds;
+
+	@Getter
+	public enum RefundType {
+		balance("余额退款"),
+		money("现金退款"),
+		bxj("余额现金"),
+		;
+		String desc;
+
+		RefundType(String desc) {
+			this.desc = desc;
+		}
+	}
 }

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/response/VipUserPageResp.java

@@ -17,6 +17,9 @@ import java.util.List;
 @Getter
 @Setter
 public class VipUserPageResp {
+
+	private Integer months;
+
 	/**
 	 * 可抵扣金额
 	 */
@@ -36,4 +39,9 @@ public class VipUserPageResp {
 	 * 抵扣车票
 	 */
 	private List<GroupsRelationView> relationUserViews;
+
+	/**
+	 * 延长会员天数
+	 */
+	private Integer extendsDays;
 }

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

@@ -64,6 +64,12 @@ public class CmsVipOrderDonView {
 	@DbField("o.money")
 	private BigDecimal money;
 
+	/**
+	 * 实际抵扣金额
+	 */
+	@DbField("o.actually_deduct_money")
+	private BigDecimal actuallyDeductMoney = BigDecimal.ZERO;
+
 	@DbField("o.balance")
 	private BigDecimal balance;
 

+ 50 - 15
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -558,7 +558,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
      */
     public void commonUpgradeRefund(UpgradeOrderDon orderDon, BigDecimal refundMoney, String operator, UpgradePackage upgradePackage, String outNo, String refundType, Boolean isOnly, BigDecimal refundBalance, String chatImg) {
         TASK_POOL.execute(() -> {
-            orderRefundService.refundUpgradeRecord(orderDon, refundMoney,upgradePackage, operator, outNo, refundType, chatImg);
+            orderRefundService.refundUpgradeRecord(orderDon, refundMoney, refundBalance, upgradePackage, operator, outNo, refundType, chatImg);
             //退等比例
             if (isOnly != null && isOnly) {
                 userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.refund, 0L, orderDon.getId(),  upgradePackage.getName()+ UserBalanceSourceRecord.Source.refund.getDesc(), true);
@@ -566,8 +566,13 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 orderDon.setRefundBalance(orderDonRefundBalance.add(refundBalance));
             }
 
-            //若存在余额支付,退还余额
-            if (isOnly == null && orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+//            //若存在余额支付,退还余额
+//            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 (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
                 userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), UserBalanceSourceRecord.Source.refund, 0L, orderDon.getId(), upgradePackage.getName() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
             }
 
@@ -600,9 +605,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
         BigDecimal refundMoney = refundReq.getRefundMoney();
         BigDecimal money = orderDon.getMoney();
+        BigDecimal balance = orderDon.getBalance();
+        BigDecimal refundBalance = refundReq.getRefundBalance();
         //余额退款
         if (UpgradeOrderDon.Type.BALANCE.getType().equals(refundType)) {
-            BigDecimal balance = orderDon.getBalance();
             refundMoney = orderDonRefundBalance.add(refundMoney);
             if (UpgradeOrderDon.Type.BALANCE == orderDon.getType() && refundMoney.compareTo(balance) > 0) {
                 throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
@@ -612,6 +618,18 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             }
             orderDon.setRefundBalance(refundMoney);
             orderDon.setRefundMoney(BigDecimal.ZERO);
+        } else if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+            if (refundBalance.compareTo(balance) > 0) {
+                throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
+            }
+            refundBalance = refundBalance.add(orderDonRefundBalance);
+            orderDon.setRefundBalance(refundBalance);
+
+            refundMoney = orderDonRefundMoney.add(refundMoney);
+            if (refundMoney.compareTo(money) > 0) {
+                throw BusinessRuntimeException.getInstance("退款金额大于订单支付金额");
+            }
+            orderDon.setRefundMoney(refundMoney);
         } else {
             //退金额
             refundMoney = orderDonRefundMoney.add(refundMoney);
@@ -968,10 +986,11 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             }
         }
         BigDecimal refundMoney = refundReq.getRefundMoney();
+        BigDecimal refundBalance = refundReq.getRefundBalance();
         BigDecimal money = orderDon.getMoney();
+        BigDecimal balance = orderDon.getBalance();
         //余额退款
         if (OrderDon.Type.BALANCE.getType().equals(refundType)) {
-            BigDecimal balance = orderDon.getBalance();
             refundMoney = orderDonRefundBalance.add(refundMoney);
             if (OrderDon.Type.BALANCE == orderDon.getType() && refundMoney.compareTo(balance) > 0) {
                 throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
@@ -980,7 +999,18 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 throw BusinessRuntimeException.getInstance("退款余额大于订单支付金额");
             }
             orderDon.setRefundBalance(refundMoney);
-            orderDon.setRefundMoney(BigDecimal.ZERO);
+        } else if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+            if (refundBalance.compareTo(balance) > 0) {
+                throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
+            }
+            refundBalance = refundBalance.add(orderDonRefundBalance);
+            orderDon.setRefundBalance(refundBalance);
+
+            refundMoney = orderDonRefundMoney.add(refundMoney);
+            if (refundMoney.compareTo(money) > 0) {
+                throw BusinessRuntimeException.getInstance("退款金额大于订单支付金额");
+            }
+            orderDon.setRefundMoney(refundMoney);
         } else {
             //退金额
             refundMoney = orderDonRefundMoney.add(refundMoney);
@@ -1015,7 +1045,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
      * 退款后 处理关联
      */
     public void commonRefund(OrderDon orderDon, BigDecimal refundMoney, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outNo, String refundType, Boolean isOnly, BigDecimal refundBalance, String chatImg, BigDecimal deductBalance, List<Long> dpRelationIds) {
-        orderRefundService.refundRecord(orderDon, refundMoney, operator, goodsDon, sku, outNo, refundType, chatImg);
+        orderRefundService.refundRecord(orderDon, refundMoney, refundBalance, operator, goodsDon, sku, outNo, refundType, chatImg);
         //退款一次
         goodsDonStockService.upStockRelate(null, orderDon.getId(), "refund");
         try {
@@ -1038,13 +1068,18 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         }
 
         //若存在余额支付,退还余额
-        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.refund, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
+//        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.refund, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
+//        }
+
+        //余额现金混合退款
+        if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+            userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.refund, null, orderDon.getId(), orderDon.getPayTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
         }
 
         try {
@@ -1372,7 +1407,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             orderDonMapper.updateById(orderDon);
         }
 
-        orderRefundService.refundRecord(orderDon, refundMoney, orderRefundReq.getOperator(), goodsDon, sku, outNo, refundType, null);
+        orderRefundService.refundRecord(orderDon, refundMoney, orderRefundReq.getRefundBalance(), orderRefundReq.getOperator(), goodsDon, sku, outNo, refundType, null);
     }
 
     @Override

+ 51 - 13
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.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.vip.RefundVipOrderDonMapper;
@@ -56,12 +57,16 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final CmsUserMapper cmsUserMapper;
+
 	@Override
 	public void refundOrders(OrderRefundReq refundReq) throws Exception {
 		VipOrderDon orderDon = vipOrderDonMapper.selectById(refundReq.getOrderId());
 		if (StrUtil.isEmpty(refundReq.getRefundType())) {
 			refundReq.setRefundType("money");
 		}
+		Long adminId = refundReq.getAdminId();
+		Optional.ofNullable(cmsUserMapper.selectById(adminId)).ifPresent(cmsUser -> refundReq.setOperator(cmsUser.getNickname()));
 		String refundType = refundReq.getRefundType();
 		//校验订单是否符合退款
 		checkOrderRefund(orderDon, refundReq);
@@ -80,7 +85,7 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 
 	private void commonRefund(VipOrderDon orderDon, BigDecimal refundMoney, String operator, String outNo, String refundType, Boolean isOnly, BigDecimal refundBalance, String chatImg, BigDecimal deductBalance) {
 		//记录退款
-		recordRefundOrder(orderDon, outNo, refundMoney, operator, chatImg, refundType);
+		recordRefundOrder(orderDon, outNo, refundMoney, refundBalance, operator, chatImg, refundType);
 		//退等比例
 		if (isOnly != null && isOnly) {
 			userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.vip_refund, null, orderDon.getId(), orderDon.getPayTitle() + UserBalanceSourceRecord.Source.vip_refund.getDesc(), true);
@@ -88,13 +93,17 @@ 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);
-			}
-			userBenefitsService.addUserBalance(orderDon.getUserId(), addBalance, UserBalanceSourceRecord.Source.vip_refund, null, orderDon.getId(), orderDon.getPayTitle() + UserBalanceSourceRecord.Source.vip_refund.getDesc(), true);
+//		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);
+//		}
+		//余额现金混合退款
+		if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+			userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.vip_refund, null, orderDon.getId(), orderDon.getPayTitle() + UserBalanceSourceRecord.Source.vip_refund.getDesc(), true);
 		}
 		//扣除会员时长
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
@@ -105,8 +114,17 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 			int offsetMonths = orderDon.getNum();
 			Date expiryTime = vipUser.getExpiryTime();
 			DateTime subExpiryTime = DateUtil.offsetMonth(expiryTime, -offsetMonths);
-			vipUser.setExpiryTime(subExpiryTime);
+			//主订单退款
+			if (orderDon.getOrderType() == 1) {
+				Date remainExpiryTime = subExpiryTime;
+				Integer extendsDays = orderDon.getExtendsDays();
+				DateTime now = DateTime.now();
+				if (remainExpiryTime.compareTo(now) > 0 && extendsDays > 0) {
+					subExpiryTime = now;
+				}
+			}
 			//若会员过期清除镜像user
+			vipUser.setExpiryTime(subExpiryTime);
 			clearVipMirrorUser(vipUser.getUserId(), subExpiryTime);
 			vipUserMapper.updateById(vipUser);
 		}
@@ -181,7 +199,7 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 		}
 	}
 
-	private void recordRefundOrder(VipOrderDon orderDon, String outRefundNo, BigDecimal refundMoney, String operator, String chatImg, String refundType) {
+	private void recordRefundOrder(VipOrderDon orderDon, String outRefundNo, BigDecimal refundMoney, BigDecimal refundBalance, String operator, String chatImg, String refundType) {
 		RefundVipOrderDon refund = new RefundVipOrderDon();
 		refund.setOrderId(orderDon.getId());
 		refund.setOutRefundNo(outRefundNo);
@@ -199,6 +217,11 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 			refund.setRefundMethod(refundType);
 			refund.setRefundFee(orderDon.getRefundBalance());
 		}
+		//余额现金退款
+		if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+			refund.setRefundMethod(OrderRefundReq.RefundType.bxj.name());
+			refund.setRefundBalance(refundBalance);
+		}
 		refundVipOrderDonMapper.insert(refund);
 	}
 
@@ -218,12 +241,13 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 		}
 		String refundType = refundReq.getRefundType();
 		BigDecimal refundMoney = refundReq.getRefundMoney();
+		BigDecimal refundBalance = refundReq.getRefundBalance();
 		BigDecimal money = orderDon.getMoney();
+		BigDecimal balance = orderDon.getBalance();
 		BigDecimal orderDonRefundMoney = Optional.ofNullable(orderDon.getRefundMoney()).orElse(BigDecimal.ZERO);
 		BigDecimal orderDonRefundBalance = Optional.ofNullable(orderDon.getRefundBalance()).orElse(BigDecimal.ZERO);
 		//余额退款
 		if (OrderDon.Type.BALANCE.getType().equals(refundType)) {
-			BigDecimal balance = orderDon.getBalance();
 			refundMoney = orderDonRefundBalance.add(refundMoney);
 			if (VipOrderDon.Type.BALANCE == orderDon.getType() && refundMoney.compareTo(balance) > 0) {
 				throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
@@ -232,8 +256,22 @@ public class CmsVipOrderServiceImpl implements CmsVipOrderService {
 				throw BusinessRuntimeException.getInstance("退款余额大于订单支付金额");
 			}
 			orderDon.setRefundBalance(refundMoney);
-			orderDon.setRefundMoney(BigDecimal.ZERO);
-		} else {
+		} else if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+			//该订单实际可抵扣金额 可退成余额
+			BigDecimal actuallyDeductMoney = Optional.ofNullable(orderDon.getActuallyDeductMoney()).orElse(BigDecimal.ZERO);
+			balance = balance.add(actuallyDeductMoney);
+			refundBalance = refundBalance.add(orderDonRefundBalance);
+			if (refundBalance.compareTo(balance) > 0) {
+				throw BusinessRuntimeException.getInstance("退款余额大于订单支付余额");
+			}
+			orderDon.setRefundBalance(refundBalance);
+
+			refundMoney = orderDonRefundMoney.add(refundMoney);
+			if (refundMoney.compareTo(money) > 0) {
+				throw BusinessRuntimeException.getInstance("退款金额大于订单支付金额");
+			}
+			orderDon.setRefundMoney(refundMoney);
+		}else {
 			//退金额
 			refundMoney = orderDonRefundMoney.add(refundMoney);
 			if (refundMoney.compareTo(money) > 0) {

+ 3 - 2
netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java

@@ -19,11 +19,12 @@ public interface OrderRefundService {
 	/**
 	 * 退款记录
 	 */
-	void refundRecord(OrderDon orderDon, BigDecimal refundMoney, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType, String chatImg);
+	void refundRecord(OrderDon orderDon, BigDecimal refundMoney, BigDecimal refundBalance, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType, String chatImg);
+
 	/**
 	 * 套餐包退款记录
 	 */
-	void refundUpgradeRecord(UpgradeOrderDon orderDon, BigDecimal refundMoney, UpgradePackage upgradePackage, String operator, String outRefundNo, String refundType, String chatImg);
+	void refundUpgradeRecord(UpgradeOrderDon orderDon, BigDecimal refundMoney, BigDecimal refundBalance, UpgradePackage upgradePackage, String operator, String outRefundNo, String refundType, String chatImg);
 
 	String refundWholesaleUserDeposit(GoodsWholesaleUserDeposit goodsWholesaleUserDeposit) throws Exception;
 

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

@@ -3409,7 +3409,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		clearUserLockingRelation(groupsRelationMapper.selectById(orderDon.getRelationId()), orderDon);
 
 		//记录退款
-		orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), null, goodsDon, sku, outNo, orderDon.getType().getType(), null);
+		orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), orderRefundReq.getRefundBalance(), null, goodsDon, sku, outNo, orderDon.getType().getType(), null);
 		return;
 	}
 

+ 12 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java

@@ -102,7 +102,7 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 	}
 
 	@Override
-	public void refundRecord(OrderDon orderDon, BigDecimal refundMoney, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType, String chatImg) {
+	public void refundRecord(OrderDon orderDon, BigDecimal refundMoney, BigDecimal refundBalance, String operator, GoodsDon goodsDon, GoodsDonSku sku, String outRefundNo, String refundType, String chatImg) {
 		RefundOrderDon refund = new RefundOrderDon();
 		refund.setOrderId(orderDon.getId());
 		refund.setOutRefundNo(outRefundNo);
@@ -124,11 +124,16 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 			refund.setRefundMethod(refundType);
 			refund.setRefundFee(orderDon.getRefundBalance());
 		}
+		//余额现金退款
+		if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+			refund.setRefundMethod(OrderRefundReq.RefundType.bxj.name());
+			refund.setRefundBalance(refundBalance);
+		}
 		refundOrderDonMapper.insert(refund);
 	}
 
 	@Override
-	public void refundUpgradeRecord(UpgradeOrderDon orderDon, BigDecimal refundMoney, UpgradePackage upgradePackage,String operator, String outRefundNo, String refundType, String chatImg) {
+	public void refundUpgradeRecord(UpgradeOrderDon orderDon, BigDecimal refundMoney, BigDecimal refundBalance, UpgradePackage upgradePackage, String operator, String outRefundNo, String refundType, String chatImg) {
 		RefundUpgradeOrderDon refund = new RefundUpgradeOrderDon();
 		refund.setOrderId(orderDon.getId());
 		refund.setOutRefundNo(outRefundNo);
@@ -147,6 +152,11 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 			refund.setRefundMethod(refundType);
 			refund.setRefundFee(orderDon.getRefundBalance());
 		}
+		//余额现金退款
+		if (OrderRefundReq.RefundType.bxj.name().equals(refundType)) {
+			refund.setRefundMethod(OrderRefundReq.RefundType.bxj.name());
+			refund.setRefundBalance(refundBalance);
+		}
 		refundUpgradeOrderDonMapper.insert(refund);
 	}
 

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

@@ -167,6 +167,12 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		orderDon.setGoodsId(Constant.VIP_RELATE_GOODS_ID);
 		//购买月数
 		orderDon.setNum(payRequest.getNum());
+		if (vipMoneyIfDeduct != null) {
+			orderDon.setDeductMoney(vipMoneyIfDeduct.getDeductMoney());
+			orderDon.setActuallyDeductMoney(vipMoneyIfDeduct.getActuallyDeDuctMoney());
+			orderDon.setExtendsDays(vipMoneyIfDeduct.getExtendsDays());
+		}
+
 		this.saveOrUpdate(orderDon);
 
 		Long orderId = orderDon.getId();
@@ -372,6 +378,10 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		if (orderDon.getOrderType() == 1) {
 			vipUser.setStartTime(DateTime.now());
 			vipUser.setExpiryTime(DateUtil.offsetMonth(vipUser.getStartTime(), offsetMonths));
+			//延长用户会员时长
+			if (orderDon.getExtendsDays() > 0) {
+				vipUser.setExpiryTime(DateUtil.offsetDay(vipUser.getExpiryTime(), orderDon.getExtendsDays()));
+			}
 			if (vipUser.getId() == null) {
 				try {
 					vipUserMapper.insert(vipUser);

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -1760,7 +1760,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		orderDon.setRefundMoney(refundMoney);
 		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
 		orderDonMapper.updateById(orderDon);
-		orderRefundService.refundRecord(orderDon, refundMoney, "系统", goodsDon, sku, outNo, orderDon.getType().name(), null);
+		orderRefundService.refundRecord(orderDon, refundMoney, null, "系统", goodsDon, sku, outNo, orderDon.getType().name(), null);
 		//清除车票
 		GroupsRelation relation = groupsRelationMapper.selectById(relationId);
 		clearService.clearTicket(relation, UserTicketClearedRecord.Source.refund);

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/scheduler/impl/SchedulerServiceImpl.java

@@ -220,7 +220,7 @@ public class SchedulerServiceImpl implements SchedulerService {
 							if (sku == null) return;
 							skuMap.putIfAbsent(orderDon.getSkuId(), sku);
 						}
-						orderRefundService.refundRecord(orderDon, orderDon.getRefundMoney(), null, goodsDon, sku, StrUtil.EMPTY, "balance", null);
+						orderRefundService.refundRecord(orderDon, orderDon.getRefundMoney(), null, null, goodsDon, sku, StrUtil.EMPTY, "balance", null);
 						return;
 					}
 					changeTickerRelation(item_groupsId, relationView, source, relationView.getYhsId());

+ 21 - 7
netflix-service/src/main/java/com/cyksj/service/vip/impl/VipFrontServiceImpl.java

@@ -79,10 +79,16 @@ public class VipFrontServiceImpl implements VipFrontService {
 		Number count = beanSearcher.searchCount(GroupsRelationView.class, MapUtils.builder().field(GroupsRelationView::getUserId, userIdList).op(Operator.InList).field(GroupsRelationView::getGoodsId, goodsIds).op(Operator.InList).field(GroupsRelationView::getExpiryTime, now).op(Operator.GreaterThan).build());
 		//可抵扣车票
 		if (count.intValue() > 0) {
+			Integer months = vipUserPageResp.getMonths();
 			//处理vip抵扣金额
-			VipDeductDto vipDeductDto = commonHandleVipDeductMoney(userIdList, goodsIds, 12);
-			deductMoney = vipDeductDto.getDeductMoney();
+			VipDeductDto vipDeductDto = commonHandleVipDeductMoney(userIdList, goodsIds, months);
 			vipUserPageResp.setRelationUserViews(vipDeductDto.getRelationUserViews());
+			vipUserPageResp.setExtendsDays(vipDeductDto.getExtendsDays());
+			if (months != 12) {
+				//取出最大可抵扣info
+				vipDeductDto = commonHandleVipDeductMoney(userIdList, goodsIds, 12);
+			}
+			deductMoney = vipDeductDto.getDeductMoney();
 		}
 		vipUserPageResp.setDeductMoney(deductMoney);
 	}
@@ -178,13 +184,21 @@ public class VipFrontServiceImpl implements VipFrontService {
 			deductRelationIds.add(relationId);
 			//可抵扣车票
 			deductRelations.add(relation);
-			//超出可抵扣的金额 直接返回
-			if (deductMoney.compareTo(vipMoney) >= 0) {
-				deductMoney = vipMoney;
-				break;
-			}
 		}
+		//实际可抵扣金额
+		vipDeductDto.setActuallyDeDuctMoney(deductMoney);
 		vipDeductDto.setDeductMoney(deductMoney);
+		//超出可抵扣的金额 直接返回
+		if (deductMoney.compareTo(vipMoney) >= 0) {
+			BigDecimal overMoney = deductMoney.subtract(vipMoney);
+			//超过抵扣金额可换延长会员多少天
+			//每天单价
+			BigDecimal daySingle = vipMoney.divide(BigDecimal.valueOf(months)).divide(BigDecimal.valueOf(30), 0, RoundingMode.DOWN);
+			//超出部分可换取多少天 低于每天单价为0天
+			BigDecimal extendsDays = overMoney.divide(daySingle, 0, RoundingMode.UP);
+			vipDeductDto.setExtendsDays(extendsDays.intValue());
+			vipDeductDto.setDeductMoney(vipMoney);
+		}
 		vipDeductDto.setDeductRelationIds(deductRelationIds);
 		vipDeductDto.setRelationUserViews(deductRelations);
 		return vipDeductDto;

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/AccountTempController.java

@@ -231,7 +231,7 @@ public class AccountTempController {
 							orderDonMapper.updateById(orderDon);
 							clearUserLockingRelation(relationMapper.selectById(orderDon.getRelationId()), orderDon);
 							//记录退款
-							orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), null, goodsDon, sku, outNo, orderDon.getType().getType(), null);
+							orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), null, null, goodsDon, sku, outNo, orderDon.getType().getType(), null);
 						} catch (Exception e) {
 							orderRefundReq.setRefundType("balance");
 							userBenefitsService.addUserBalance(relation.getUserId(), refundMoney, UserBalanceSourceRecord.Source.clear_valid, relation.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.clear_valid.getDesc(), true);
@@ -240,7 +240,7 @@ public class AccountTempController {
 							orderDon.setRefundBalance(refundMoney);
 							orderDon.setRefundMoney(BigDecimal.ZERO);
 							orderDonMapper.updateById(orderDon);
-							orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), null, goodsDon, sku, outNo, "balance", null);
+							orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), null, null, goodsDon, sku, outNo, "balance", null);
 						}
 					});
 

+ 4 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/UserBenefitsFrontController.java

@@ -250,7 +250,10 @@ public class UserBenefitsFrontController {
 				.field(RenewalView::getUserId, userIdList).op(Operator.InList)
 				.field(RenewalView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan)
 				.build());
-		Integer renewCount = userBenefitsOrderRecordMapper.selectUseComboRecordByUid(userIdList, UserBenefits.Type.RENEW, renewalViews.getGoodsId(), renewalViews.getSkuId(), Constant.noOrderAllStatus, null, renewalViews.getStartTime(), renewalViews.getRelationId());
+		Integer renewCount = 0;
+		if (renewalViews != null) {
+			renewCount = userBenefitsOrderRecordMapper.selectUseComboRecordByUid(userIdList, UserBenefits.Type.RENEW, renewalViews.getGoodsId(), renewalViews.getSkuId(), Constant.noOrderAllStatus, null, renewalViews.getStartTime(), renewalViews.getRelationId());
+		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(renewCount);
 	}
 }

+ 3 - 1
netflix-web/src/main/java/com/cyksj/web/controller/vip/VipController.java

@@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
@@ -40,9 +41,10 @@ public class VipController {
 	 * 会员信息
 	 */
 	@GetMapping("/get/info")
-	public Result<VipUserPageResp> getVipInfo() {
+	public Result<VipUserPageResp> getVipInfo(@RequestParam(defaultValue = "1") Integer months) {
 		Long userId = StpUserUtil.getUserIdAfterLogin();
 		VipUserPageResp vipUserPageResp = new VipUserPageResp();
+		vipUserPageResp.setMonths(months);
 		//填充会员信息
 		vipFrontService.fillVipInfo(userId, vipUserPageResp);
 		List<VipGoodsSkuFrontView> vipGoodsSkuFrontViews = beanSearcher.searchAll(VipGoodsSkuFrontView.class, MapUtils.flatBuilder(request.getParameterMap()).orderBy(VipGoodsSkuFrontView::getGoodsId).build());