zoujiajian vor 1 Monat
Ursprung
Commit
76f9037a55

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

@@ -13,6 +13,7 @@ import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.constant.Constant;
@@ -440,7 +441,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 					}
 				}
                 if (isGptApiQuotaSourceTicket(orderDon, ticket.getGoodsId(), ticket.getSkuNum())) {
-                    markGptApiQuotaReceiveStatus(userIds, ticket);
+                    markGptApiQuotaReceiveStatus(userIds, ticket, orderDon);
                 }
 				if (lang != null && !StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
 					String languageSpecVal = backInfoTranslationsFrontService.getLanguageSpecVal(zhSkuId, lang);
@@ -594,15 +595,48 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		return true;
 	}
 
-	private void markGptApiQuotaReceiveStatus(List<Long> userIds, RenewalView ticket) {
-        Integer successCount = ticketRedemptionCodeRecordMapper.selectCount(Wrappers.lambdaQuery(TicketRedemptionCodeRecord.class)
+	private void markGptApiQuotaReceiveStatus(List<Long> userIds, RenewalView ticket, OrderDon sourceOrder) {
+        boolean yearQuota = isYearRechargeSku(ticket.getGoodsId(), ticket.getMonths(), ticket.getSkuNum());
+        ticket.setCanReceiveGptApiQuota(!hasReceivedGptApiQuota(userIds, ticket.getGoodsId(), yearQuota)
+                && (!yearQuota || hasNewGptApiQuotaPurchase(userIds, ticket.getGoodsId(), sourceOrder)));
+	}
+
+    private boolean hasReceivedGptApiQuota(List<Long> userIds, Long sourceGoodsId, boolean yearQuota) {
+        LambdaQueryWrapper<TicketRedemptionCodeRecord> query = Wrappers.lambdaQuery(TicketRedemptionCodeRecord.class)
                 .in(TicketRedemptionCodeRecord::getUserId, userIds)
-                .eq(TicketRedemptionCodeRecord::getSourceGoodsId, ticket.getGoodsId())
                 .eq(TicketRedemptionCodeRecord::getSkuId, Constant.GPT_ACTIVITY_GIFT_SKU_ID)
                 .eq(TicketRedemptionCodeRecord::getSourceType, RedisKey.GPT_API_QUOTA_KEY)
-                .eq(TicketRedemptionCodeRecord::getStatus, "success"));
-        ticket.setCanReceiveGptApiQuota(successCount == 0);
-	}
+                .eq(TicketRedemptionCodeRecord::getStatus, "success");
+        if (yearQuota) {
+            // 两种年付共享一次50元资格;原5元不占用,历史已发50元仍计入。
+            query.in(TicketRedemptionCodeRecord::getSourceGoodsId, Constant.GPT_RECHARGE_GOODS_ID, Constant.GPT_PLUS_GID)
+                    .ge(TicketRedemptionCodeRecord::getQuota, YEAR_RECHARGE_API_QUOTA);
+        } else {
+            // 普通规格保持原有按商品限制一次的规则。
+            query.eq(TicketRedemptionCodeRecord::getSourceGoodsId, sourceGoodsId);
+        }
+        return ticketRedemptionCodeRecordMapper.selectCount(query) > 0;
+    }
+
+    private boolean hasNewGptApiQuotaPurchase(List<Long> userIds, Long sourceGoodsId, OrderDon sourceOrder) {
+        Date purchaseTime = sourceOrder == null ? null
+                : Optional.ofNullable(sourceOrder.getPayTime()).orElse(sourceOrder.getCreatedTime());
+        if (purchaseTime == null) {
+            return false;
+        }
+        // 历史记录的relationId指向赠品车票;用领取时间排除已领5元的旧订单。
+        Integer previousClaims = ticketRedemptionCodeRecordMapper.selectCount(Wrappers.lambdaQuery(TicketRedemptionCodeRecord.class)
+                .in(TicketRedemptionCodeRecord::getUserId, userIds)
+                .eq(TicketRedemptionCodeRecord::getSkuId, Constant.GPT_ACTIVITY_GIFT_SKU_ID)
+                .eq(TicketRedemptionCodeRecord::getSourceType, RedisKey.GPT_API_QUOTA_KEY)
+                .eq(TicketRedemptionCodeRecord::getSourceGoodsId, sourceGoodsId)
+                .eq(TicketRedemptionCodeRecord::getStatus, "success")
+                .and(wrapper -> wrapper.lt(TicketRedemptionCodeRecord::getQuota, YEAR_RECHARGE_API_QUOTA)
+                        .or().isNull(TicketRedemptionCodeRecord::getQuota))
+                .and(wrapper -> wrapper.ge(TicketRedemptionCodeRecord::getCreatedTime, purchaseTime)
+                        .or().isNull(TicketRedemptionCodeRecord::getCreatedTime)));
+        return previousClaims == 0;
+    }
 
 	@Override
 	public GroupsRelation getSimilarExpiredGroupRelation(GoodsDonSku sku, List<Long> errorsRelationIds, String ip) {
@@ -2865,16 +2899,13 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
             if (!isGptApiQuotaSourceTicket(sourceOrder, sourceGoodsId, sourceSku.getNum())) {
                 throw BusinessRuntimeException.getInstance("当前车票不符合领取条件");
             }
-			Integer quota = isYearRechargeSku(sourceGoodsId, sourceSku.getMonths(), sourceSku.getNum()) ? YEAR_RECHARGE_API_QUOTA : DEFAULT_API_QUOTA;
-
-            Integer receivedCount = ticketRedemptionCodeRecordMapper.selectCount(Wrappers.lambdaQuery(TicketRedemptionCodeRecord.class)
-                    .in(TicketRedemptionCodeRecord::getUserId, userIds)
-                    .eq(TicketRedemptionCodeRecord::getSkuId, Constant.GPT_ACTIVITY_GIFT_SKU_ID)
-                    .eq(TicketRedemptionCodeRecord::getSourceType, RedisKey.GPT_API_QUOTA_KEY)
-                    .eq(TicketRedemptionCodeRecord::getSourceGoodsId, sourceGoodsId)
-                    .eq(TicketRedemptionCodeRecord::getStatus, "success"));
-			if (receivedCount > 0) {
-				throw BusinessRuntimeException.getInstance("您已领取");
+			boolean yearQuota = isYearRechargeSku(sourceGoodsId, sourceSku.getMonths(), sourceSku.getNum());
+			Integer quota = yearQuota ? YEAR_RECHARGE_API_QUOTA : DEFAULT_API_QUOTA;
+			if (hasReceivedGptApiQuota(userIds, sourceGoodsId, yearQuota)) {
+				throw BusinessRuntimeException.getInstance(yearQuota ? "您已领取50元API额度" : "您已领取");
+			}
+			if (yearQuota && !hasNewGptApiQuotaPurchase(userIds, sourceGoodsId, sourceOrder)) {
+				throw BusinessRuntimeException.getInstance("请再次购买年付后领取50元API额度");
 			}
 
 			TicketRedemptionCodeRecord record = new TicketRedemptionCodeRecord();