|
|
@@ -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();
|