Răsfoiți Sursa

续费升级

zoujiajian 2 ani în urmă
părinte
comite
3158c0676f
23 a modificat fișierele cu 901 adăugiri și 39 ștergeri
  1. 19 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonRenewRecordMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/renew/RenewUpgradePackageMapper.java
  3. 11 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUser.java
  4. 1 1
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  5. 24 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonRenewRecord.java
  6. 76 0
      netflix-dao/src/main/java/com/cyksj/model/entity/RenewUpgradePackage.java
  7. 79 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/RenewUpgradeOrderDonView.java
  8. 1 3
      netflix-dao/src/main/java/com/cyksj/model/manage/views/UpgradeOrderDonBackView.java
  9. 0 5
      netflix-dao/src/main/java/com/cyksj/model/manage/views/UpgradeOrderDonView.java
  10. 61 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewUpgradePackageFrontView.java
  11. 80 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewUpgradePackageView.java
  12. 17 0
      netflix-dao/src/main/resources/mapper/OrderDonRenewRecordMapper.xml
  13. 8 0
      netflix-service/src/main/java/com/cyksj/service/mange/MirrorUserCleatService.java
  14. 25 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  15. 92 4
      netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java
  16. 11 0
      netflix-service/src/main/java/com/cyksj/service/mange/renew/RenewUpgradePackageService.java
  17. 19 0
      netflix-service/src/main/java/com/cyksj/service/mange/renew/impl/RenewUpgradePackageServiceImpl.java
  18. 2 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  19. 116 25
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  20. 56 0
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  21. 135 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/renew/RenewUpgradePackageController.java
  22. 20 1
      netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
  23. 35 0
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonRenewRecordMapper.java

@@ -0,0 +1,19 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.OrderDonRenewRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonRenewRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/7/19 11:45
+ */
+public interface OrderDonRenewRecordMapper extends BaseMapper<OrderDonRenewRecord> {
+
+	GoodsDonSku getOtherRenewSku(@Param("orderId") Long orderId, @Param("months") Integer months, @Param("userIds") List<Long> userIds);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/renew/RenewUpgradePackageMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.renew;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.RenewUpgradePackage;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RenewUpgradePackageMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/7/18 16:56
+ */
+public interface RenewUpgradePackageMapper extends BaseMapper<RenewUpgradePackage> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUser.java

@@ -87,4 +87,15 @@ public class ChatgptUser extends BaseEntity {
      */
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Date clearPackageTime;
+
+    /**
+     * 目前续费规格id
+     */
+    private Long renewSkuId;
+
+    /**
+     * 续费升级过期时间
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Date renewExpiryTime;
 }

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -72,7 +72,7 @@ public class OrderDon extends BaseEntity implements Serializable {
     private BigDecimal dpMoney;
 
     /**
-     * 主平台订单金额
+     * 主平台订单金额 用于加购订单分销
      */
     private BigDecimal oriMoney;
 

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonRenewRecord.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonRenewRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/7/19 11:45
+ */
+@Getter
+@Setter
+public class OrderDonRenewRecord extends BaseEntity{
+	private Long orderId;
+
+	private Long userId;
+
+	private Long packageId;
+
+	private BigDecimal discount;
+}

+ 76 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RenewUpgradePackage.java

@@ -0,0 +1,76 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zwhui
+ * @date 2024/4/24 14:54
+ */
+@Data
+public class RenewUpgradePackage extends BaseEntity{
+
+    /**
+     * 套餐名称
+     */
+    private String name;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 商品规格id
+     */
+    private String skuId;
+
+    /**
+     * 续费升级规格
+     */
+    private String upgradeSkuIds;
+
+    /**
+     * gpt类型,0.车票套餐
+     */
+    private Integer gptType;
+
+    /**
+     * 套餐价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 时间限制
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long time;
+
+    /**
+     * 数量
+     */
+    private Integer num;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 折扣
+     */
+    private BigDecimal discount;
+
+    /**
+     * true 上架 / false 下架
+     */
+    private Boolean status;
+
+    /**
+     * true 存在 / false 删除
+     */
+    private Boolean deleted;
+}

+ 79 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/RenewUpgradeOrderDonView.java

@@ -0,0 +1,79 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.UpgradeOrderDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author chan
+ * @date 2022/9/27 6:56 PM
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don_renew_record orr left join order_don o on o.id = orr.order_id" +
+        "left join goods_don g on g.id = o.goods_id " +
+        "left join goods_don_sku sku on o.sku_id = sku.id ")
+public class RenewUpgradeOrderDonView {
+
+    @DbField("o.id")
+    private Long id;
+
+    @DbField("o.relation_id")
+    private Long relationId;
+
+    @DbField("o.order_no")
+    private String orderNo;
+
+    @DbField("o.transaction_id")
+    private String transactionId;
+
+    @DbField("g.title")
+    private String title;
+
+    @DbField("sku.spec_val")
+    private String specVal;
+
+    @DbField("g.id")
+    private Long goodsId;
+
+    @DbField("g.logo")
+    private String logo;
+
+
+    @DbField("o.user_id")
+    @JsonIgnore
+    private Long userId;
+
+    @DbField("o.money")
+    private BigDecimal money;
+
+    @DbField("o.refund_money")
+    @JsonIgnore
+    private BigDecimal refundMoney;
+
+    @DbField("o.balance")
+    private BigDecimal balance;
+
+    @DbField("o.refund_desc")
+    private String refundDesc;
+
+    @DbField("o.status")
+    private OrderDon.Status status;
+
+    @DbField("o.type")
+    private UpgradeOrderDon.Type type;
+
+    @DbField("o.created_time")
+    private Date createdTime;
+
+    @DbField("o.pay_time")
+    private Date payTime;
+
+}

+ 1 - 3
netflix-dao/src/main/java/com/cyksj/model/manage/views/UpgradeOrderDonBackView.java

@@ -1,7 +1,6 @@
 package com.cyksj.model.manage.views;
 
-import com.cyksj.model.entity.*;
-import com.cyksj.model.views.GoodsDonSkuView;
+import com.cyksj.model.entity.UpgradeOrderDon;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
@@ -10,7 +9,6 @@ import lombok.Setter;
 
 import java.math.BigDecimal;
 import java.util.Date;
-import java.util.List;
 
 /*
  *项目名: netflix

+ 0 - 5
netflix-dao/src/main/java/com/cyksj/model/manage/views/UpgradeOrderDonView.java

@@ -1,12 +1,8 @@
 package com.cyksj.model.manage.views;
 
-import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.OrderDon;
-import com.cyksj.model.entity.OrderDonWaybill;
 import com.cyksj.model.entity.UpgradeOrderDon;
-import com.cyksj.model.views.GoodsDonSkuView;
 import com.ejlchina.searcher.bean.DbField;
-import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
@@ -14,7 +10,6 @@ import lombok.Setter;
 
 import java.math.BigDecimal;
 import java.util.Date;
-import java.util.List;
 
 /**
  * @author chan

+ 61 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewUpgradePackageFrontView.java

@@ -0,0 +1,61 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RenewUpgradePackageFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/7/19 15:19
+ */
+@Getter
+@Setter
+@SearchBean(tables = "renew_upgrade_package rup" +
+		" inner join goods_don g on g.id = rup.goods_id",
+		where = "g.status is true and rup.status is true and rup.deleted is true")
+public class RenewUpgradePackageFrontView {
+	@DbField("rup.id")
+	private Long packageId;
+
+	@DbField("rup.discount")
+	private BigDecimal discount;
+
+	@DbField("rup.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("rup.sku_id")
+	private Long skuId;
+
+	@DbField("rup.upgrade_sku_ids")
+	private String upgradeSkuIds;
+
+	@DbIgnore
+	private List<RenewSkuView> renewSkus;
+
+	@Getter
+	@Setter
+	@SearchBean(tables = "goods_don_sku", where = "status is true")
+	public class RenewSkuView {
+		private Long skuId;
+
+		private Integer months;
+
+		private Integer gptLimitNum;
+
+		private Long gptLimitTime;
+
+		private String specVal;
+
+		private BigDecimal price;
+	}
+}

+ 80 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewUpgradePackageView.java

@@ -0,0 +1,80 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zwhui
+ * @date 2024/4/24 15:20
+ */
+@Data
+@SearchBean(tables = "renew_upgrade_package up left join goods_don g on up.goods_id = g.id "
+        , where = "up.deleted = true :sku:",
+        orderBy = "up.num asc")
+public class RenewUpgradePackageView {
+    @DbField("up.id")
+    private Long id;
+
+    /**
+     * 套餐名称
+     */
+    @DbField("up.name")
+    private String name;
+
+    /**
+     * 商品id
+     */
+    @DbField("up.goods_id")
+    private Long goodsId;
+
+    /**
+     * 商品名称
+     */
+    @DbField("g.title")
+    private String goodsName;
+
+    /**
+     * 商品规格id
+     */
+    @DbField("up.sku_ids")
+    private String skuIds;
+
+    /**
+     * 升级规格
+     */
+    @DbField("up.upgrade_sku_id")
+    private Long upgradeSkuId;
+
+    /**
+     * 商品规格名称
+     */
+    @DbIgnore
+    private String specVal;
+
+
+    /**
+     * 备注
+     */
+    @DbField("up.remark")
+    private String remark;
+
+
+    @DbField("up.discount")
+    private BigDecimal discount;
+
+    /**
+     * true 上架 / false 下架
+     */
+    @DbField("up.status")
+    private Boolean status;
+
+    /**
+     * true 存在 / false 删除
+     */
+    @DbField("up.deleted")
+    private Boolean deleted;
+}

+ 17 - 0
netflix-dao/src/main/resources/mapper/OrderDonRenewRecordMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.OrderDonRenewRecordMapper">
+
+
+    <select id="getOtherRenewSku" resultType="com.cyksj.model.entity.GoodsDonSku">
+        select sku.* from (select order_id from order_don_renew_record where id != #{id}
+        and user_id in
+        <foreach collection="userIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>) orr inner join order_don o on o.id = orr.order_id
+        and o.status not in ('close','noPayment','refund')
+        and o.order_type = 2
+
+        inner join goods_don_sku sku on sku.id = o.sku_id
+    </select>
+</mapper>

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/mange/MirrorUserCleatService.java

@@ -1,5 +1,7 @@
 package com.cyksj.service.mange;
 
+import com.cyksj.model.entity.OrderDon;
+
 /**
  * 项目名: yhlxj
  * 文件名: MirrorUserCleatService
@@ -8,4 +10,10 @@ package com.cyksj.service.mange;
  */
 public interface MirrorUserCleatService {
 	void delMirrorUser(Long goodsId, Long relationId);
+
+	/**
+	 * 处理续费升级订单,将镜像车票还原
+	 * @param orderDon
+	 */
+	void handleRenewUpgradeOrders(OrderDon orderDon);
 }

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

@@ -461,9 +461,29 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         .lt(UpgradeOrderDon::getNum, orderDon.getNum())
                         .eq(UpgradeOrderDon::getStatus, UpgradeOrderDon.Status.complete)
                         .last("limit 1"));
+                Long renewSkuId = chatgptUser.getRenewSkuId();
+
+                //续费升级
+                GoodsDonSku renewSku = null;
+                if (renewSkuId != null) {
+                    renewSku = goodsDonSkuMapper.selectById(renewSkuId);
+                    gptLimitTime = renewSku.getGptLimitTime();
+                    gptLimitNum = renewSku.getGptLimitNum();
+                }
+
                 if (secondUpgrade != null) {
                     gptLimitTime = secondUpgrade.getTime();
                     gptLimitNum = secondUpgrade.getNum();
+
+                    if (renewSku != null) {
+                        //低级套餐
+                        GoodsDonSku secondSkuUpGrade = goodsDonSkuMapper.selectById(secondUpgrade.getSkuId());
+                        //续费升级套餐更高
+                        if (renewSku.getMonths() >= secondSkuUpGrade.getMonths() && renewSku.getNum() >= secondSkuUpGrade.getNum()) {
+                            gptLimitTime = renewSku.getGptLimitTime();
+                            gptLimitNum = renewSku.getGptLimitNum();
+                        }
+                    }
                 }
                 Long packageId = 0l;
                 //降级套餐
@@ -1059,6 +1079,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (orderDon.getOrderType() == 1) {
                 mirrorUserCleatService.delMirrorUser(orderDon.getGoodsId(), orderDon.getRelationId());
             }
+            //续费升级订单
+            if (orderDon.getOrderType() == 2 && sku.getIsMirror()) {
+                mirrorUserCleatService.handleRenewUpgradeOrders(orderDon);
+            }
             //是否是分销订单
             //处理下级渠道分销提成
             handleSubRewards(orderDon);
@@ -1335,4 +1359,5 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         }
         return relation;
     }
+
 }

+ 92 - 4
netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java

@@ -1,15 +1,22 @@
 package com.cyksj.service.mange.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.cyksj.mapper.ChatgptUserMapper;
-import com.cyksj.mapper.MidjourneyUserMapper;
-import com.cyksj.model.entity.ChatgptUser;
-import com.cyksj.model.entity.MidjourneyUser;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.*;
+import com.cyksj.model.entity.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mange.MirrorUserCleatService;
+import com.cyksj.service.user.UserBindRelationService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
 /**
  * 项目名: yhlxj
  * 文件名: MirrorUserCleatServiceImpl
@@ -18,12 +25,26 @@ import org.springframework.stereotype.Service;
  */
 @Service
 @RequiredArgsConstructor
+@Slf4j
 public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 	private final ChatgptUserMapper chatgptUserMapper;
 
 	private final MidjourneyUserMapper midjourneyUserMapper;
 
 	private final RedisService redisService;
+
+	private final OrderDonRenewRecordMapper orderDonRenewRecordMapper;
+
+	private final GoodsDonSkuMapper skuMapper;
+
+	private final UserBindRelationService userBindRelationService;
+
+	private final UpgradeOrderDonMapper upgradeOrderDonMapper;
+
+	private final GroupsRelationMapper groupsRelationMapper;
+
+	private final GroupsMapper groupsMapper;
+
 	@Override
 	public void delMirrorUser(Long goodsId, Long relationId) {
 		//gpt镜像
@@ -46,4 +67,71 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 			}
 		}
 	}
+
+	@Override
+	public void handleRenewUpgradeOrders(OrderDon orderDon) {
+		Long skuId = orderDon.getSkuId();
+		Long orderId = orderDon.getId();
+		OrderDonRenewRecord orderDonRenewRecord = orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)
+				.eq(OrderDonRenewRecord::getOrderId, orderId)
+				.last("limit 1"));
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+		if (orderDonRenewRecord != null) {
+			ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
+					.eq(ChatgptUser::getRelationId, orderDon.getRelationId())
+					.last("limit 1"));
+			Long presentRenewSkuId = chatgptUser.getRenewSkuId();
+			//存在不同升级套餐
+			GoodsDonSku presentRenewSku = skuMapper.selectById(presentRenewSkuId);
+			if (!ObjectUtil.equal(presentRenewSkuId, skuId)) {
+				throw BusinessRuntimeException.getInstance("请先退掉用户目前续费升级的{}规格", presentRenewSku.getSpecVal());
+			} else {
+				GroupsRelation relation = groupsRelationMapper.selectById(Wrappers.lambdaQuery(GroupsRelation.class)
+						.eq(GroupsRelation::getId, orderDon.getRelationId()));
+				GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+				GoodsDonSku finalSku = skuMapper.selectById(groupsTrips.getSkuId());
+				//是否存在其他续费升级
+				GoodsDonSku otherRenewSku = orderDonRenewRecordMapper.getOtherRenewSku(orderDon.getId(), presentRenewSku.getMonths(), userIdList);
+				GoodsDonSku upgradeOrderDonSku = null;
+				Date renewExpiryTime = null;
+				//是否存在套餐升级包
+				Long packageId = chatgptUser.getPackageId();
+				if (packageId != null && packageId != 0) {
+					UpgradeOrderDon upgradeOrderDon = upgradeOrderDonMapper.selectOne(Wrappers.lambdaQuery(UpgradeOrderDon.class)
+							.eq(UpgradeOrderDon::getRelationId, chatgptUser.getRelationId())
+							.in(UpgradeOrderDon::getUserId, userIdList)
+							.eq(UpgradeOrderDon::getPackageId, chatgptUser.getPackageId())
+							.orderByDesc(UpgradeOrderDon::getId)
+							.last("limit 1"));
+					Long upgradeOrderDonSkuId = upgradeOrderDon.getSkuId();
+					upgradeOrderDonSku = skuMapper.selectById(upgradeOrderDonSkuId);
+				}
+				//套餐升级
+				if (upgradeOrderDonSku != null) {
+					log.info("续费升级订单退款,relation_id:{}存在套餐升级", orderDon.getUserId());
+					finalSku = upgradeOrderDonSku;
+				}
+				//续费升级
+				if (otherRenewSku != null) {
+					finalSku = otherRenewSku;
+					log.info("续费升级订单退款,relation_id:{}存在次级续费升级订单", orderDon.getUserId());
+					if (upgradeOrderDonSku != null) {
+						//套餐升级高于其他续费升级
+						if (upgradeOrderDonSku.getMonths() >= otherRenewSku.getMonths() && upgradeOrderDonSku.getNum() >= otherRenewSku.getNum()) {
+							log.info("续费升级订单退款,relation_id:{}存在更高级套餐升级", orderDon.getUserId());
+							finalSku = upgradeOrderDonSku;
+						}
+					}
+					Date payTime = Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime());
+					renewExpiryTime = DateUtil.offsetMonth(payTime, otherRenewSku.getMonths());
+				}
+				//还原镜像user
+				chatgptUser.setLimitTime(finalSku.getGptLimitTime());
+				chatgptUser.setLimitNum(finalSku.getGptLimitNum());
+				chatgptUser.setRenewExpiryTime(renewExpiryTime);
+				chatgptUserMapper.updateById(chatgptUser);
+				log.info("还原镜像gptuser套餐成功");
+			}
+		}
+	}
 }

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mange/renew/RenewUpgradePackageService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.mange.renew;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.RenewUpgradePackage;
+
+/**
+ * @author zwhui
+ * @date 2024/4/24 15:04
+ */
+public interface RenewUpgradePackageService extends IService<RenewUpgradePackage> {
+}

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/mange/renew/impl/RenewUpgradePackageServiceImpl.java

@@ -0,0 +1,19 @@
+package com.cyksj.service.mange.renew.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
+import com.cyksj.model.entity.RenewUpgradePackage;
+import com.cyksj.service.mange.renew.RenewUpgradePackageService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zwhui
+ * @date 2024/4/24 15:05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class RenewUpgradePackageServiceImpl extends ServiceImpl<RenewUpgradePackageMapper, RenewUpgradePackage> implements RenewUpgradePackageService {
+}

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -104,4 +104,6 @@ public interface OrderDonService extends IService<OrderDon> {
     void closeUpgradeOrder(Long orderId, Long userId);
 
     UpgradeOrderDetailView getUpgradeOrderDetail(Long orderId, Long userId);
+
+	OrderDon submitRenewUpgrade(OrderPayRequest payRequest);
 }

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

@@ -57,6 +57,7 @@ import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubRewardsMapper;
 import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubWaitingMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
+import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
 import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
@@ -317,6 +318,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final DistributeGeneralSkuRateMapper distributeGeneralSkuRateMapper;
 
+	private final RenewUpgradePackageMapper renewUpgradePackageMapper;
+
+	private final OrderDonRenewRecordMapper orderDonRenewRecordMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1444,6 +1449,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					}
 					relation.setExpiryTime(newDate);
 					relation.setStartTime(relation.getStartTime() == null ? new Date() : null);
+
+					//镜像续费升级
+					handleMirrorRenew(sku, order, groupsTrips, relation.getId(), newDate);
 				} else if (GroupsTrips.Status.waiting.equals(groupsTrips.getStatus())) {
 					log.info("车位groupsId:{}未发车,修改订单号orderNo:{}订单为已付款状态:{}", groupsTrips.getId(), order.getOrderNo());
 					order.setStatus(OrderDon.Status.hasPayment);
@@ -1486,31 +1494,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 			}
 		}
-
-//		//新订单产生 发送模板消息给用户、客服
-//		User user = userMapper.selectById(order.getUserId());
-//		if (user != null) {
-//			THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-//				try {
-//					//发送至用户消息
-//					templateCommonService.newOderSendMsgByType(order, goodsDon, user, user.getOpenId(), false);
-//				} catch (Exception e) {
-//					log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
-//				}
-//			});
-//		}
-//		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-//			try {
-//				//发送至客服消息
-//				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
-//				for (CustomerService customerService : customerServices) {
-//					log.info("向客服{}发送新订单消息通知..", customerService.getNickName());
-//					templateCommonService.newOderSendMsgByType(order, goodsDon, user, customerService.getOpenId(), true);
-//				}
-//			} catch (Exception e) {
-//				log.error("向客服发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
-//			}
-//		});
 	}
 
 	/**
@@ -3685,6 +3668,75 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
         return beanSearcher.searchFirst(UpgradeOrderDetailView.class, builder.build());
 	}
 
+
+	@Override
+	public OrderDon submitRenewUpgrade(OrderPayRequest payRequest) {
+		Long packageId = payRequest.getPackageId();
+		Long relationId = payRequest.getRelationId();
+		if (relationId == null) {
+			throw BusinessRuntimeException.getInstance("系统异常");
+		}
+		Long userId = payRequest.getUserId();
+		User user = userMapper.selectById(userId);
+		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
+		int noPayCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+				.in(OrderDon::getUserId, userIdList)
+				.eq(OrderDon::getRelationId, payRequest.getRelationId())
+				.eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
+		if (noPayCount > 0) {
+			throw new BusinessRuntimeException("您有未支付订单.");
+		}
+		GroupsRelation groupsRelation = getGroupsRelation(payRequest.getUserId(), payRequest.getRelationId());
+		GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
+		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(groupsTrips.getSkuId());
+		GoodsDon goodsDon = goodsDonMapper.selectById(goodsDonSku.getGoodsId());
+		if (!goodsDonSku.getIsMirror()) {
+			throw BusinessRuntimeException.getInstance("系统异常");
+		}
+		Long renewSkuId = payRequest.getSkuId();
+		GoodsDonSku renewSku = goodsDonSkuMapper.selectById(renewSkuId);
+		//校验同规格
+		if (!ObjectUtil.equal(goodsDonSku.getGoodsId(), renewSku.getGoodsId())) {
+			throw BusinessRuntimeException.getInstance("系统异常");
+		}
+
+		OrderDon orderDon = new OrderDon();
+		orderDon.setUserId(userId);
+		orderDon.setGoodsId(goodsDonSku.getGoodsId());
+		orderDon.setRelationId(relationId);
+		//续费订单
+		orderDon.setOrderType(2);
+		RenewUpgradePackage renewUpgradePackage = renewUpgradePackageMapper.selectOne(Wrappers.lambdaQuery(RenewUpgradePackage.class)
+				.eq(RenewUpgradePackage::getId, packageId)
+				.eq(RenewUpgradePackage::getStatus, 1)
+				.eq(RenewUpgradePackage::getDeleted, 1));
+		if (renewUpgradePackage == null) {
+			throw BusinessRuntimeException.getInstance("续费升级套餐不存在");
+		}
+		BigDecimal price = renewSku.getPrice();
+		orderDon.setOriMoney(price);
+		orderDon.setRealMoney(price);
+		BigDecimal discountPrice = price.multiply(renewUpgradePackage.getDiscount());
+		orderDon.setMoney(discountPrice);
+
+		StringBuilder payTitle = new StringBuilder();
+		payTitle.append(goodsDon.getTitle()).append(renewSku.getSpecVal());
+		orderDon.setPayTitle(payTitle.toString());
+		String donNo = SEQUENCE.nextId().toString();
+		orderDon.setOrderNo(donNo);
+
+		//虚拟商品订单,是否是分销订单
+		setDistributeOrderMark(orderDon, goodsDon.getType(), user.getId());
+
+		orderDonMapper.insert(orderDon);
+		//记录续费升级的规格
+		recordRenewOrderDon(orderDon, renewUpgradePackage);
+
+		return orderDon;
+	}
+
 	/**
 	 * 试用车票跳转购买正式车票订单记录
 	 */
@@ -3695,4 +3747,43 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			userTrialTicketJumpPayRecordMapper.insert(userTrialTicketJumpPayRecord);
 		}
 	}
+
+	/**
+	 * 记录续费升级的规格
+	 */
+	private void recordRenewOrderDon(OrderDon orderDon, RenewUpgradePackage renewUpgradePackage) {
+		OrderDonRenewRecord orderDonRenewRecord = new OrderDonRenewRecord();
+		orderDonRenewRecord.setOrderId(orderDon.getId());
+		orderDonRenewRecord.setUserId(orderDon.getUserId());
+		orderDonRenewRecord.setPackageId(renewUpgradePackage.getId());
+		orderDonRenewRecord.setDiscount(renewUpgradePackage.getDiscount());
+		orderDonRenewRecordMapper.insert(orderDonRenewRecord);
+	}
+
+	//镜像续费升级
+	private void handleMirrorRenew(GoodsDonSku sku, OrderDon order, GroupsTrips groupsTrips, Long relationId, Date newDate) {
+		if (sku.getIsMirror() && order.getOrderType() == 2) {
+			OrderDonRenewRecord orderDonRenewRecord = orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)
+					.eq(OrderDonRenewRecord::getOrderId, order.getId())
+					.last("limit 1"));
+			if (orderDonRenewRecord != null) {
+				orderDonRenewRecordMapper.updateById(orderDonRenewRecord);
+				//同规格续费无需更新
+				if (!ObjectUtil.equal(groupsTrips.getSkuId(), order.getSkuId())) {
+					//升级gptUser次数
+					ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
+							.eq(ChatgptUser::getRelationId, relationId)
+							.last("limit 1"));
+					if (chatgptUser != null) {
+						chatgptUser.setLimitTime(sku.getGptLimitTime());
+						chatgptUser.setLimitNum(sku.getGptLimitNum());
+						//记录续费升级过期的时间
+						chatgptUser.setRenewExpiryTime(newDate);
+						chatgptUser.setRenewSkuId(order.getSkuId());
+						chatgptUserMapper.updateById(chatgptUser);
+					}
+				}
+			}
+		}
+	}
 }

+ 56 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -60,6 +60,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -126,6 +127,10 @@ public class GroupRelationController {
 
     private final GroupsRelationNetflixService groupsRelationNetflixService;
 
+    private final ChatgptUserMapper chatgptUserMapper;
+
+    private final UpgradeOrderDonMapper upgradeOrderDonMapper;
+
     private final static Sequence SEQUENCE = new Sequence(0);
 
     @RequestMapping("/get/renewal")
@@ -874,4 +879,55 @@ public class GroupRelationController {
     public Result<Integer> getPinStatus(@PathVariable String taskId) throws Exception {
         return GatewayResponse.SUCCESS.newBuilder().toResult(groupsRelationNetflixService.getPinStatus(taskId));
     }
+
+    /**
+     * 可选 续费升级车票
+     */
+    @GetMapping("/get/renew/skus/{relationId}/{skuId}")
+    public Result<List<RenewUpgradePackageFrontView>> getRenewSkus(@PathVariable Long relationId, @PathVariable Long skuId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+        ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
+                .eq(ChatgptUser::getRelationId, relationId));
+        if (chatgptUser == null) return GatewayResponse.SUCCESS.newBuilder().toResult();
+        //目前续费升级的规格
+        Long renewSkuId = chatgptUser.getRenewSkuId();
+        GoodsDonSku sku = goodsDonSkuMapper.selectById(skuId);
+        AtomicInteger minMonths = new AtomicInteger(sku.getMonths());
+        AtomicInteger minNum = new AtomicInteger(sku.getNum());
+        if (renewSkuId != null) {
+            GoodsDonSku presentRenew = goodsDonSkuMapper.selectById(renewSkuId);
+            minMonths.set(presentRenew.getMonths());
+        }
+        if (chatgptUser.getPackageId() != 0) {
+            Long packageId = chatgptUser.getPackageId();
+            UpgradeOrderDon upgradeOrderDon = upgradeOrderDonMapper.selectOne(Wrappers.lambdaQuery(UpgradeOrderDon.class)
+                    .eq(UpgradeOrderDon::getPackageId, packageId)
+                    .eq(UpgradeOrderDon::getRelationId, relationId)
+                    .in(UpgradeOrderDon::getUserId, userIdList)
+                    .last("limit 1"));
+            Long upgradeOrderDonSkuId = upgradeOrderDon.getSkuId();
+            GoodsDonSku upgradeSku = goodsDonSkuMapper.selectById(upgradeOrderDonSkuId);
+            if (upgradeSku != null) {
+                if (upgradeSku.getMonths() > minMonths.get()) {
+                    minMonths.set(upgradeSku.getMonths());
+                }
+                if (upgradeSku.getNum() > minNum.get()) {
+                    minNum.set(upgradeSku.getNum());
+                }
+            }
+        }
+        List<RenewUpgradePackageFrontView> renewUpgradePackageFrontViews = beanSearcher.searchAll(RenewUpgradePackageFrontView.class, MapUtils.builder().field(RenewUpgradePackageFrontView::getSkuId, skuId).build());
+        renewUpgradePackageFrontViews.forEach(renew -> {
+            try {
+                renew.setRenewSkus(beanSearcher.searchAll(RenewUpgradePackageFrontView.RenewSkuView.class, MapUtils.builder()
+                        .field(RenewUpgradePackageFrontView.RenewSkuView::getMonths, minMonths.get()).op(Operator.GreaterEqual)
+                        .field(RenewUpgradePackageFrontView.RenewSkuView::getGptLimitNum, minNum.get()).op(Operator.GreaterEqual)
+                        .field(RenewUpgradePackageFrontView.RenewSkuView::getSkuId, Jsons.parseList(renew.getUpgradeSkuIds(), Long.class)).op(Operator.InList)
+                        .build()));
+            } catch (Exception e) {
+            }
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(renewUpgradePackageFrontViews);
+    }
 }

+ 135 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/renew/RenewUpgradePackageController.java

@@ -0,0 +1,135 @@
+package com.cyksj.web.controller.manage.renew;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.annotation.Log;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.BusinessType;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.RenewUpgradePackage;
+import com.cyksj.model.views.RenewUpgradePackageView;
+import com.cyksj.service.mange.renew.RenewUpgradePackageService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: RenewUpgradePackageController
+ * 创建者: JavaZou
+ * 创建时间:2024/7/18 16:59
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/renew/upgrade")
+public class RenewUpgradePackageController {
+	private final RenewUpgradePackageService renewUpgradePackageService;
+
+	private final HttpServletRequest request;
+
+	private final BeanSearcher beanSearcher;
+
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
+	/**
+	 * 新增套餐
+	 */
+	@PostMapping
+	@SaCheckPermission("upgrade:add")
+	@Log(module = "套餐管理/新增套餐", businessType = BusinessType.POST, isSaveRequestData = true)
+	public Result<String> post(@RequestBody RenewUpgradePackage upgradePackage){
+		log.info("新增套餐:{}", upgradePackage);
+		renewUpgradePackageService.save(upgradePackage);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 修改套餐
+	 */
+	@PutMapping
+	@SaCheckPermission("upgrade:edit")
+	@Log(module = "套餐管理/修改套餐", businessType = BusinessType.PUT, isSaveRequestData = true)
+	public Result<String> put(@RequestBody RenewUpgradePackage upgradePackage){
+		log.info("修改套餐:{}", upgradePackage);
+		renewUpgradePackageService.updateById(upgradePackage);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除套餐
+	 */
+	@DeleteMapping("/{id}")
+	@SaCheckPermission("upgrade:delete")
+	@Log(module = "套餐管理/删除套餐", businessType = BusinessType.DELETE, isSaveRequestData = true)
+	public Result<String> delete(@PathVariable Long id){
+		log.info("删除套餐:{}", id);
+		RenewUpgradePackage byId = renewUpgradePackageService.getById(id);
+		if (byId == null){
+			throw BusinessRuntimeException.getInstance("套餐不存在");
+		}
+		byId.setDeleted(false);
+		renewUpgradePackageService.updateById(byId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 上下架套餐
+	 */
+	@PutMapping("/put/status/{id}")
+	@SaCheckPermission("upgrade:putStatus")
+	@Log(module = "套餐管理/上下架套餐", businessType = BusinessType.PUT, isSaveRequestData = true)
+	public Result<Boolean> putStatus(@PathVariable Long id){
+		log.info("上下架套餐:{}", id);
+		RenewUpgradePackage byId = renewUpgradePackageService.getById(id);
+		if (byId == null){
+			throw BusinessRuntimeException.getInstance("套餐不存在");
+		}
+		byId.setStatus(!byId.getStatus());
+		renewUpgradePackageService.updateById(byId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(byId.getStatus());
+	}
+
+	/**
+	 * 获取套餐
+	 */
+	@GetMapping("/{id}")
+	public Result<RenewUpgradePackage> get(@PathVariable Long id){
+		log.info("获取套餐:{}", id);
+		RenewUpgradePackage byId = renewUpgradePackageService.getById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(byId);
+	}
+
+	/**
+	 * 获取套餐列表
+	 */
+	@GetMapping
+	public Result<SearchResult<RenewUpgradePackageView>> list(Long skuId) {
+		log.info("获取套餐列表");
+		Map<String, Object> build = MapUtils.flatBuilder(request.getParameterMap()).build();
+		if (skuId != null) {
+			build.put("sku", String.format(" and JSON_CONTAINS(up.sku_ids,'\"%s\"')", skuId));
+		}
+		SearchResult<RenewUpgradePackageView> search = beanSearcher.search(RenewUpgradePackageView.class, build);
+		search.getDataList().forEach(upgradePackageView -> {
+			try {
+				String specVal = goodsDonSkuMapper.selectList(Wrappers.lambdaQuery(GoodsDonSku.class).in(GoodsDonSku::getId, Jsons.parseList(upgradePackageView.getSkuIds(), Long.class))).stream().map(GoodsDonSku::getSpecVal).collect(Collectors.joining(","));
+				upgradePackageView.setSpecVal(specVal);
+			} catch (Exception e) {
+				throw BusinessRuntimeException.getInstance("获取套餐规格失败");
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}

+ 20 - 1
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -1,14 +1,17 @@
 package com.cyksj.web.controller.mirror;
 
 import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
 import com.cyksj.model.entity.ChatgptSession;
 import com.cyksj.model.entity.ChatgptUser;
 import com.cyksj.model.entity.MidjourneyUser;
+import com.cyksj.model.entity.RenewUpgradePackage;
 import com.cyksj.model.request.gpt.ConversationRequest;
 import com.cyksj.model.response.ConversationLimitResponse;
 import com.cyksj.model.views.ChatGptUserConversationRecordHistoryView;
@@ -37,7 +40,6 @@ import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
-import java.util.Set;
 
 /**
  * /server/镜像服务
@@ -71,6 +73,8 @@ public class MirrorController {
     @Value("${midjourney.drawUrl}")
     private String midjourneyDrawUrl;
 
+    private final RenewUpgradePackageMapper renewUpgradePackageMapper;
+
 
     /**
      * GPT车票跳转登录
@@ -355,4 +359,19 @@ public class MirrorController {
         response.addCookie(cookie);
         response.sendRedirect(midjourneyDrawUrl);
     }
+
+    /**
+     * gpt续费广告弹窗
+     */
+    @GetMapping("/get/gpt/renew/discount")
+    public Result<RenewUpgradePackage> getGptRenewDiscount() {
+        RenewUpgradePackage renewUpgradePackage = renewUpgradePackageMapper.selectOne(Wrappers.lambdaQuery(RenewUpgradePackage.class)
+                .eq(RenewUpgradePackage::getGoodsId, 18)
+                .eq(RenewUpgradePackage::getStatus, 1)
+                .eq(RenewUpgradePackage::getDeleted, 1)
+                .orderByAsc(RenewUpgradePackage::getDiscount)
+                .last("limit 1")
+                .select(RenewUpgradePackage::getId, RenewUpgradePackage::getDiscount));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(renewUpgradePackage);
+    }
 }

+ 35 - 0
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -809,4 +809,39 @@ public class OrderController {
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
+
+    /**
+     * 续费升级提交支付
+     */
+    @PostMapping("/post/renew/upgrade/submit")
+    public Result<OrderDon> submitRenewUpgrade(@Validated @RequestBody OrderPayRequest payRequest) throws Exception {
+        final String methodName = "续费升级吊起支付";
+        //无需免登录
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        payRequest.setUserId(userId);
+        log.info("{}[start] params:{}", methodName, payRequest);
+
+        String ip = ServletUtil.getClientIP(request);
+
+        payRequest.setIp(ip);
+
+        OrderDon orderDon = orderDonService.submitRenewUpgrade(payRequest);
+
+        return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
+    }
+
+    /**
+     * 获取套餐订单列表
+     */
+    @GetMapping("/renew/get")
+    public Result<SearchResult<RenewUpgradeOrderDonView>> listRenewOrders(){
+        long userId = StpUserUtil.getLoginIdAsLong();
+        MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+        List<Long> userIds = UserBindRelationService.getRelationUserIdList(userId, null);
+        SearchResult<RenewUpgradeOrderDonView> search = beanSearcher.search(RenewUpgradeOrderDonView.class, builder
+                .field(UpgradeOrderDonView::getUserId, userIds).op(Operator.InList)
+                .orderBy(UpgradeOrderDonView::getId).desc()
+                .build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }