Răsfoiți Sursa

学生认证赠送api额度

zoujiajian 2 luni în urmă
părinte
comite
5a1c967cb6

+ 2 - 0
netflix-common/src/main/java/com/cyksj/dto/RedisKey.java

@@ -76,4 +76,6 @@ public class RedisKey {
     public static String GOODS_SUBSCRIBE_ALERT_KEY = "goods_subscribe_alert_key:";
 
     public static String GPT_API_QUOTA_KEY = "gpt_pay";
+
+    public static String STUDENT_CERT_GPT_API_QUOTA_KEY = "student_cert_gpt_pay";
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserStudentCertRecord.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -15,4 +16,16 @@ public class UserStudentCertRecord extends BaseEntity{
 	private Long userId;
 
 	private String school;
+
+	@TableField(exist = false)
+	private Long apiQuotaRecordId;
+
+	@TableField(exist = false)
+	private Long apiQuotaRelationId;
+
+	@TableField(exist = false)
+	private String apiQuotaRedeemCode;
+
+	@TableField(exist = false)
+	private Integer apiQuota;
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -140,4 +140,6 @@ public interface GroupRelationFrontService {
     String getEmailCode(long userId, Long relationId) throws Exception;
 
 	ReceiveGptActivityTicketResp receiveGptActivityTicket(long userId, Long relationId) throws Exception;
+
+	ReceiveGptActivityTicketResp receiveStudentCertGptApiQuotaTicket(long userId) throws Exception;
 }

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

@@ -2862,6 +2862,88 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		}
 	}
 
+	@Override
+	public ReceiveGptActivityTicketResp receiveStudentCertGptApiQuotaTicket(long userId) throws Exception {
+		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
+		if (CollUtil.isEmpty(userIds)) {
+			userIds = List.of(userId);
+		}
+		String lockKey = String.format("%s:%s", RedisKey.STUDENT_CERT_GPT_API_QUOTA_KEY, Collections.min(userIds));
+		if (!redisService.setNx(lockKey, userId, 60L)) {
+			throw BusinessRuntimeException.getInstance("领取中,请稍后再试");
+		}
+		try {
+			TicketRedemptionCodeRecord existRecord = ticketRedemptionCodeRecordMapper.selectOne(Wrappers.lambdaQuery(TicketRedemptionCodeRecord.class)
+					.in(TicketRedemptionCodeRecord::getUserId, userIds)
+					.eq(TicketRedemptionCodeRecord::getSkuId, Constant.GPT_ACTIVITY_GIFT_SKU_ID)
+					.eq(TicketRedemptionCodeRecord::getSourceType, RedisKey.STUDENT_CERT_GPT_API_QUOTA_KEY)
+					.eq(TicketRedemptionCodeRecord::getStatus, "success")
+					.orderByDesc(TicketRedemptionCodeRecord::getId)
+					.last("limit 1"));
+			if (existRecord != null) {
+				ReceiveGptActivityTicketResp resp = new ReceiveGptActivityTicketResp();
+				resp.setRelationId(existRecord.getRelationId());
+				resp.setRedeemCode(existRecord.getRedeemCode());
+				return resp;
+			}
+
+			TicketRedemptionCodeRecord record = new TicketRedemptionCodeRecord();
+			record.setUserId(userId);
+			record.setSkuId(Constant.GPT_ACTIVITY_GIFT_SKU_ID);
+			record.setSourceType(RedisKey.STUDENT_CERT_GPT_API_QUOTA_KEY);
+			record.setRedeemName("大学生认证API站额度券");
+			record.setStatus("processing");
+			ticketRedemptionCodeRecordMapper.insert(record);
+
+			GoodsDonSku giftSku = goodsDonSkuMapper.selectById(Constant.GPT_ACTIVITY_GIFT_SKU_ID);
+			GroupsRelation giftRelation = null;
+			try {
+				if (giftSku == null) {
+					throw BusinessRuntimeException.getInstance("系统繁忙,请重新领取");
+				}
+				Long giftRelationId = getTicket(userId, giftSku.getId(), Boolean.FALSE);
+				if (giftRelationId == null) {
+					throw BusinessRuntimeException.getInstance("系统繁忙,请重新领取");
+				}
+				giftRelation = groupsRelationMapper.selectById(giftRelationId);
+				if (giftRelation == null) {
+					throw BusinessRuntimeException.getInstance("系统繁忙,请重新领取");
+				}
+
+				GptActivityRedeemResult redeemResult = requestGptActivityRedeemCode(Constant.AI_API_SVC_DOMAIN, giftRelation, giftSku);
+				record.setRelationId(giftRelation.getId());
+				record.setGoodsId(giftSku.getGoodsId());
+				record.setRedeemCode(redeemResult.getRedeemCode());
+				record.setQuota(redeemResult.getQuota());
+				record.setRedeemCount(0);
+				record.setExpiredTime(redeemResult.getExpiredTime());
+				record.setStatus("success");
+				record.setRelationExpiryTime(giftRelation.getExpiryTime());
+				record.setApiResponse(redeemResult.getApiResponse());
+				ticketRedemptionCodeRecordMapper.updateById(record);
+
+				ReceiveGptActivityTicketResp resp = new ReceiveGptActivityTicketResp();
+				resp.setRelationId(giftRelation.getId());
+				resp.setRedeemCode(redeemResult.getRedeemCode());
+				return resp;
+			} catch (Exception e) {
+				if (giftSku != null) {
+					record.setGoodsId(giftSku.getGoodsId());
+				}
+				record.setStatus("error");
+				record.setErrorMsg(StringUtil.getErrorText(e));
+				if (giftRelation != null) {
+					record.setRelationId(giftRelation.getId());
+					record.setRelationExpiryTime(giftRelation.getExpiryTime());
+				}
+				ticketRedemptionCodeRecordMapper.updateById(record);
+				throw e;
+			}
+		} finally {
+			redisService.del(lockKey);
+		}
+	}
+
     private boolean isGptApiQuotaSourceTicket(OrderDon orderDon, Long goodsId, Integer skuNum) {
         if (orderDon == null) {
             return false;

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserActivityServiceImpl.java

@@ -10,7 +10,9 @@ import com.cyksj.mapper.UserActivityRankRobotMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.UserStudentCertRecordMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.response.ReceiveGptActivityTicketResp;
 import com.cyksj.service.mange.coupon.CouponCommonService;
+import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.user.UserActivityService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -37,6 +39,8 @@ public class UserActivityServiceImpl extends ServiceImpl<UserActivityMapper, Use
 	private final UserStudentCertRecordMapper userStudentCertRecordMapper;
 
 	private final UserActivityRankRobotMapper UserActivityRankRobotMapper;
+
+	private final GroupRelationFrontService groupRelationFrontService;
 	@Override
 	public void sendStudentCertActivity(User user, String dsCode, String school) throws Exception {
 		UserActivity activity = getById(1);
@@ -56,11 +60,22 @@ public class UserActivityServiceImpl extends ServiceImpl<UserActivityMapper, Use
 				couponCommonService.sendCouponToUser(sendUserId, couponId, 0l, 0l, 0l, CouponUser.Channel.student_cert);
 			}
 		}
+		ReceiveGptActivityTicketResp apiQuotaTicketResp = null;
+		try {
+			apiQuotaTicketResp = groupRelationFrontService.receiveStudentCertGptApiQuotaTicket(sendUserId);
+			log.info("uid:{}大学生认证成功,发放API站额度券:{}", sendUserId, apiQuotaTicketResp.getRedeemCode());
+		} catch (Exception e) {
+			log.error("uid:{}大学生认证发放API站额度券失败", sendUserId, e);
+		}
 		try {
 			UserStudentCertRecord record = new UserStudentCertRecord();
 			//记录发送用户
 			record.setUserId(sendUserId);
 			record.setSchool(school);
+			if (apiQuotaTicketResp != null) {
+				record.setApiQuotaRelationId(apiQuotaTicketResp.getRelationId());
+				record.setApiQuotaRedeemCode(apiQuotaTicketResp.getRedeemCode());
+			}
 			userStudentCertRecordMapper.insert(record);
 		} catch (DuplicateKeyException e) {
 		}

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserIdentCertServiceImpl.java

@@ -4,13 +4,17 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
+import com.cyksj.dto.RedisKey;
+import com.cyksj.mapper.TicketRedemptionCodeRecordMapper;
 import com.cyksj.mapper.UserCertRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.UserStudentCertRecordMapper;
+import com.cyksj.model.entity.TicketRedemptionCodeRecord;
 import com.cyksj.model.dto.UserWxIndentDto;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.UserCertRecord;
@@ -47,6 +51,8 @@ public class UserIdentCertServiceImpl implements UserIdentCertService {
 
 	private final UserStudentCertRecordMapper userStudentCertRecordMapper;
 
+	private final TicketRedemptionCodeRecordMapper ticketRedemptionCodeRecordMapper;
+
 	private final UserMapper userMapper;
 
 	private final RedisService redisService;
@@ -107,6 +113,19 @@ public class UserIdentCertServiceImpl implements UserIdentCertService {
 		if (record == null) {
 			return null;
 		}
+		TicketRedemptionCodeRecord apiQuotaRecord = ticketRedemptionCodeRecordMapper.selectOne(Wrappers.lambdaQuery(TicketRedemptionCodeRecord.class)
+				.in(TicketRedemptionCodeRecord::getUserId, userIdList)
+				.eq(TicketRedemptionCodeRecord::getSkuId, Constant.GPT_ACTIVITY_GIFT_SKU_ID)
+				.eq(TicketRedemptionCodeRecord::getSourceType, RedisKey.STUDENT_CERT_GPT_API_QUOTA_KEY)
+				.eq(TicketRedemptionCodeRecord::getStatus, "success")
+				.orderByDesc(TicketRedemptionCodeRecord::getId)
+				.last("limit 1"));
+		if (apiQuotaRecord != null) {
+			record.setApiQuotaRecordId(apiQuotaRecord.getId());
+			record.setApiQuotaRelationId(apiQuotaRecord.getRelationId());
+			record.setApiQuotaRedeemCode(apiQuotaRecord.getRedeemCode());
+			record.setApiQuota(apiQuotaRecord.getQuota());
+		}
 		return record;
 	}