Kaynağa Gözat

Merge branch 'mirror_expiry'

zoujiajian 1 yıl önce
ebeveyn
işleme
90fb1869bc

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationMapper.java

@@ -10,6 +10,7 @@ import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.GroupsRelationUserView;
 import com.cyksj.model.views.RenewalView;
 import com.cyksj.model.views.UserRecommendGoodsFrontView;
+import com.cyksj.model.views.UserTicketView;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
 
@@ -80,4 +81,7 @@ public interface GroupsRelationMapper extends BaseMapper<GroupsRelation> {
 	List<GroupsRelation> selectExtraRelation(@Param("userId") Long userId, @Param("skuId") Long skuId, @Param("relationId") Long relationId);
 
 	void incrExpiryTime(@Param("relationId") Long relationId, @Param("userId") Long userId);
+
+	List<UserTicketView> selectUserTickets(@Param("userIds") List<Long> userIds, @Param("goodsId") Long goodsId, @Param("skuId") Long skuId);
+
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.MirrorExpiryRenewOrderRelate;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorExpiryRenewOrderRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/12/4 17:02
+ */
+public interface MirrorExpiryRenewOrderRelateMapper extends BaseMapper<MirrorExpiryRenewOrderRelate> {
+}

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/MirrorExpiryRenewOrderRelate.java

@@ -0,0 +1,16 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorExpiryRenewOrderRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/12/4 17:02
+ */
+@Getter
+@Setter
+public class MirrorExpiryRenewOrderRelate extends BaseEntity {
+	private Long orderId;
+}

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

@@ -58,6 +58,7 @@ public class UserTicketClearedRecord extends BaseEntity{
 		abnormal("异常订单"),
 		dp("优惠加购订单退款"),
 		manual("手动清除"),
+		refund("退款")
 		;
 		String desc;
 

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

@@ -101,4 +101,9 @@ public class ChatGptUserView {
      * 续费升级订单id
      */
     private Long renewOrderId;
+
+    /**
+     * 续费升级规格
+     */
+    private String renewSpecVal;
 }

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

@@ -52,4 +52,9 @@ public class ClaudeUserView {
      * 续费升级订单id
      */
     private Long renewOrderId;
+
+    /**
+     * 续费升级规格
+     */
+    private String renewSpecVal;
 }

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserTicketView.java

@@ -49,4 +49,19 @@ public class UserTicketView {
 
 	@DbField("gr.cmt")
 	private Integer cmt;
+
+	@DbField("gdk.is_mirror")
+	private Boolean isMirror;
+
+	/**
+	 * gpt 镜像限制次数
+	 */
+	@DbField("sku.gpt_limit_num")
+	private Integer gptUserLimitNum;
+
+	/**
+	 * gpt 镜像限制时间
+	 */
+	@DbField("sku.gpt_limit_time")
+	private Long gptUserLimitTime;
 }

+ 27 - 7
netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml

@@ -345,14 +345,16 @@
     </select>
 
     <select id="getUserHasPayGoods" resultType="com.cyksj.model.views.RenewalView">
-        select g.id as goods_id,g.title,g.logo from (select distinct groups_id from groups_relation where status in
-        ('validity', 'outside') and cmt != 2 and (expiry_time is null
-        or
-        expiry_time > #{now}) and user_id != 0 and user_id in <foreach
-            collection="list" item="item" open="(" separator="," close=")">
-        #{item}
-    </foreach> ) gr inner join groups_trips gt on gt.id = gr.groups_id
+        select g.id as goods_id,g.title,g.logo from groups_relation gr inner join groups_trips gt on gt.id = gr.groups_id
         inner join goods_don_sku sku on sku.id = gt.sku_id inner join goods_don g on g.id = sku.goods_id
+        where gr.status in ('validity', 'outside')
+        and gr.cmt != 2
+        and (gr.expiry_time is null or gr.expiry_time > #{now} or (sku.is_mirror and gr.expiry_time > DATE_ADD(#{now},interval -7 day)))
+        and gr.user_id != 0
+        and gr.user_id in
+        <foreach collection="list" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
         group by g.id,g.title,g.logo
         order by goods_id
     </select>
@@ -393,4 +395,22 @@
             and gt.sku_id = #{skuId}
             and not exists (select 1 from order_don o where o.user_id = gr.user_id and o.relation_id = gr.id and o.status not in ('close','noPayment','refund'))
     </select>
+
+    <select id="selectUserTickets" resultType="com.cyksj.model.views.UserTicketView">
+        select gr.id as relation_id,gr.user_id,g.id as goods_id,gt.sku_id,g.title,gdk.spec_val,gr.expiry_time,gdk.is_mirror,gdk.gpt_limit_num as gptUserLimitNum,gdk.gpt_limit_time as gptUserLimitTime from groups_relation gr left join groups_trips gt on gt.id = gr.groups_id
+        left join goods_don_sku gdk on gdk.id = gt.sku_id left join goods_don g on g.id = gdk.goods_id
+        where gr.user_id in
+        <foreach collection="userIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        and gr.status in ('validity','outside')
+        and gr.cmt != 2
+        and (gr.expiry_time is null or gr.expiry_time > now() or (gdk.is_mirror and gr.expiry_time > DATE_ADD(now(),interval -7 day)))
+        <if test="goodsId != null">
+            and g.id = #{goodsId}
+        </if>
+        <if test="skuId != null">
+            and gt.sku_id = #{skuId}
+        </if>
+    </select>
 </mapper>

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -585,6 +585,9 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
                     .renewSkuId(chatgptUser.getRenewSkuId())
                     .renewOrderId(chatgptUser.getRenewOrderId())
                     .build();
+            if (view.getRenewSkuId() != null) {
+                Optional.ofNullable(skuMapper.selectById(view.getRenewSkuId())).ifPresent(renewSuu -> view.setRenewSpecVal(renewSuu.getSpecVal()));
+            }
             if (chatgptUser.getLimitNum() > 20) {
                 view.setO1PUse(Optional.ofNullable(conversationCount.getLong("o1_p")).orElse(0L));
                 view.setO1MiniUse(Optional.ofNullable(conversationCount.getLong("o1_mini")).orElse(0L));

+ 6 - 1
netflix-service/src/main/java/com/cyksj/service/claude/impl/ClaudeServiceImpl.java

@@ -25,6 +25,7 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -65,7 +66,7 @@ public class ClaudeServiceImpl implements ClaudeService {
             GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
             GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
 
-            return ClaudeUserView.builder()
+            ClaudeUserView view = ClaudeUserView.builder()
                     .skuName(goodsDonSku.getSubTitle())
                     .expireTime(claudeUser.getExpireTime())
                     .limitNum(claudeUser.getLimitNum())
@@ -75,6 +76,10 @@ public class ClaudeServiceImpl implements ClaudeService {
                     .renewOrderId(claudeUser.getRenewOrderId())
                     .use(Math.min(claudeUser.getLimitNum(), getConversationCount(claudeUser.getUserToken(), claudeUser.getLimitTime())))
                     .build();
+            if (view.getRenewSkuId() != null) {
+                Optional.ofNullable(skuMapper.selectById(view.getRenewSkuId())).ifPresent(renewSku -> view.setRenewSpecVal(renewSku.getSpecVal()));
+            }
+            return view;
         } else {
             throw BusinessRuntimeException.getInstance("您还未购买该车票");
         }

+ 7 - 13
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderCommonServiceImpl.java

@@ -10,6 +10,7 @@ import com.cyksj.mapper.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.order.OrderCommonService;
+import com.cyksj.service.relation.GroupRelationClearService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -42,6 +43,8 @@ public class OrderCommonServiceImpl implements OrderCommonService {
 
 	private final RedisService redisService;
 
+	private final GroupRelationClearService clearService;
+
 	@Override
 	public void clearUnrealGoodsDetail(OrderDon orderDon, Integer goodsType, GoodsDonSku sku) {
 		if (goodsType == 1 && sku != null) {
@@ -117,19 +120,7 @@ public class OrderCommonServiceImpl implements OrderCommonService {
 					}
 				}
 				if (isFlag) {
-					relation.setUserId(0l);
-					if (relation.getStatus() != GroupsRelation.Status.outside) {
-						relation.setStatus(GroupsRelation.Status.none);
-					}
-					relation.setStartTime(null);
-					relation.setExpiryTime(null);
-					relation.setIsHandle(false);
-					relation.setRenewStatus(false);
-					relation.setAccount(null);
-					groupsRelationMapper.updateExpiryTime(relation, expiryTime);
-					if (relation.getStatus() != GroupsRelation.Status.outside) {
-						delRelation(relation);
-					}
+					clearService.clearTicket(relation, UserTicketClearedRecord.Source.refund);
 				} else {
 					if (expiryTime != null) {
 						if (sku.getDays() != null && sku.getDays() > 0) {
@@ -143,6 +134,9 @@ public class OrderCommonServiceImpl implements OrderCommonService {
 						}
 						relation.setExpiryTime(expiryTime);
 						groupsRelationMapper.updateById(relation);
+						if (expiryTime.compareTo(now) <= 0) {
+							clearService.clearTicket(relation, UserTicketClearedRecord.Source.refund);
+						}
 					}
 				}
 				orderDon.setIsKickOut(true);

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

@@ -360,6 +360,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final ClaudeUserMapper claudeUserMapper;
 
+	private final MirrorExpiryRenewOrderRelateMapper mirrorExpiryRenewOrderRelateMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -1218,6 +1220,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				closeOrder(orderId, null);
 			});
 		}
+		//记录镜像过期车票 续费订单关联
+		if (relation.getExpiryTime() != null && relation.getExpiryTime().compareTo(DateTime.now()) <= 0) {
+			MirrorExpiryRenewOrderRelate mirrorExpiryRenewOrderRelate = new MirrorExpiryRenewOrderRelate();
+			mirrorExpiryRenewOrderRelate.setOrderId(orderId);
+			mirrorExpiryRenewOrderRelateMapper.insert(mirrorExpiryRenewOrderRelate);
+		}
 		return orderDon;
 	}
 
@@ -1655,7 +1663,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 							skuNewExpiryTime = DateUtil.offset(DateTime.now(), DateField.MONTH, donSku.getMonths() * order.getNum());
 						}
 					}
-					relation.setExpiryTime(newDate);
+					//若车票已过期 镜像车票续费
+					if (sku.getIsMirror() && relation.getExpiryTime() != null && relation.getExpiryTime().compareTo(DateTime.now()) <= 0) {
+						relation.setExpiryTime(skuNewExpiryTime);
+					} else {
+						relation.setExpiryTime(newDate);
+					}
 					relation.setStartTime(relation.getStartTime() == null ? new Date() : null);
 
 					//镜像续费升级
@@ -4147,6 +4160,13 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		//记录用户镜像店铺订单
 		recordUserMirrorShopOrderRelate(orderDon.getId(), payRequest.getUserId(), payRequest.getCmt(), payRequest.getCustomId());
+
+		//记录镜像过期车票 续费订单关联
+		if (groupsRelation.getExpiryTime() != null && groupsRelation.getExpiryTime().compareTo(DateTime.now()) <= 0) {
+			MirrorExpiryRenewOrderRelate mirrorExpiryRenewOrderRelate = new MirrorExpiryRenewOrderRelate();
+			mirrorExpiryRenewOrderRelate.setOrderId(orderId);
+			mirrorExpiryRenewOrderRelateMapper.insert(mirrorExpiryRenewOrderRelate);
+		}
 		return orderDon;
 	}
 

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

@@ -190,19 +190,24 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		if (cmt == null || cmt != 2) {
 			builder.field(RenewalView::getCmt, 2).op(Operator.NotEqual);
 		}
-		//Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
+//		Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
 		DateTime now = DateTime.now();
 		if (StrUtil.isNotBlank(account)) {
 			builder.field(RenewalView::getAccount, account).op(Operator.Contain);
 		}
-		String conditionSql = String.format("(gr.expiry_time is null or gr.expiry_time > '%s')", now);
+		String conditionSql = String.format("(gr.expiry_time is null or gr.expiry_time > '%s'", now);
+		//镜像车票 过期7天后清除
+		//个人店铺和AI店铺 暂不支持过期续费
+		if (cmt == null && StrUtil.isEmpty(customId)) {
+			conditionSql += String.format(" or (sku.is_mirror and gr.expiry_time > '%s')", DateUtil.offsetDay(now, -7));
+		}
+		conditionSql += ")";
 		if (StrUtil.isNotEmpty(orderNo)) {
 			conditionSql += String.format(" and exists(select 1 from order_don o where o.relation_id = gr.id and o.user_id = gr.user_id and o.order_no = %s and o.status not in ('close','noPayment','refund'))", orderNo);
 		}
 		SearchResult<RenewalView> list = beanSearcher.search(RenewalView.class, builder
 				.field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
 				.field(RenewalView::getUserId, userIds).op(Operator.InList)
-				//.field(RenewalView::getYhsId, yhsId)
 				.put("condition", conditionSql)
 				.field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
 				.orderBy(RenewalView::getExpiryTime).asc()
@@ -320,8 +325,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			//设置镜像车票信息
 			setMirrorTicketInfo(ticket);
 
-			List<GroupsRelationUserView> relationUserViews = groupsRelationMapper.getUserRelationUserViews(ticket.getGroupId(), ticket.getRelationId(), ticket.getUserId(), List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside));
-			ticket.setRelationViews(relationUserViews);
+//			List<GroupsRelationUserView> relationUserViews = groupsRelationMapper.getUserRelationUserViews(ticket.getGroupId(), ticket.getRelationId(), ticket.getUserId(), List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside));
+//			ticket.setRelationViews(relationUserViews);
 			if (ticket.getExpiryTime() != null) {
 				ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
 			}

+ 9 - 16
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -141,12 +141,12 @@ public class GroupRelationController {
 
     private final static Sequence SEQUENCE = new Sequence(0);
 
-	@RequestMapping("/get/renewal")
-	public Result<SearchResult<RenewalView>> get(Boolean isLoginPopularize, String customId, String account, String orderNo, Integer cmt) {
-		long userId = StpUserUtil.getLoginIdAsLong();
-		SearchResult<RenewalView> list = groupRelationFrontService.getMyTicket(userId, isLoginPopularize, customId, account, orderNo, cmt);
-		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
-	}
+    @RequestMapping("/get/renewal")
+    public Result<SearchResult<RenewalView>> get(Boolean isLoginPopularize, String customId, String account, String orderNo, Integer cmt) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        SearchResult<RenewalView> list = groupRelationFrontService.getMyTicket(userId, isLoginPopularize, customId, account, orderNo, cmt);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    }
 
     @GetMapping("/get/pay/goods")
     public Result<List<RenewalView>> getHasPayGoods() {
@@ -211,18 +211,11 @@ public class GroupRelationController {
      * 获取全部车票
      */
     @GetMapping("/get")
-    public Result<List<UserTicketView>> getUserTicketView() {
+    public Result<List<UserTicketView>> getUserTicketView(Long goodsId, Long skuId) {
         long userId = StpUserUtil.getLoginIdAsLong();
         List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
-        List<UserTicketView> ticketViews = beanSearcher.searchAll(UserTicketView.class, MapUtils.flatBuilder(request.getParameterMap())
-                .field(UserTicketView::getUserId, userIds).op(Operator.InList)
-                .field(UserTicketView::getStatus, List.of("validity", "outside")).op(Operator.InList)
-                .field(UserTicketView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan)
-                //过滤镜像店铺车票
-                .field(UserTicketView::getCmt, 2).op(Operator.NotEqual)
-                .orderBy(UserTicketView::getRelationId).asc()
-                .build());
-        return GatewayResponse.SUCCESS.newBuilder().toResult(ticketViews);
+        List<UserTicketView> tickets = relationMapper.selectUserTickets(userIds, goodsId, skuId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(tickets);
     }
 
     /**