Parcourir la source

Merge branch 'sts_api' into pre

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/service/grok/impl/GrokServiceImpl.java
zoujiajian il y a 1 mois
Parent
commit
592acbd1fa

+ 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";
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserActivity.java

@@ -50,6 +50,11 @@ public class UserActivity extends BaseEntity {
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String couponIds;
 
+	/**
+	 * 是否发放API站额度券
+	 */
+	private Boolean apiQuotaCouponEnabled;
+
 	/**
 	 * 图片
 	 */

+ 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;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserActivityView.java

@@ -50,6 +50,12 @@ public class UserActivityView {
 	@DbField("ua.coupon_ids")
 	private String couponIds;
 
+	/**
+	 * 是否发放API站额度券
+	 */
+	@DbField("ua.api_quota_coupon_enabled")
+	private Boolean apiQuotaCouponEnabled;
+
 	@DbField("ua.img")
 	private String img;
 

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/grok/impl/GrokServiceImpl.java

@@ -152,7 +152,7 @@ public class GrokServiceImpl implements GrokService {
 
             String DOMAIN = domain;
             if (StrUtil.isEmpty(DOMAIN)) {
-                DOMAIN = "https://groknode.nf.video";
+                DOMAIN = "https://groknode.goodwillus.org";
                 try {
                     SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "mirror_xy_grok_domain"));
                     if (sysConfig != null) {
@@ -308,7 +308,7 @@ public class GrokServiceImpl implements GrokService {
 
     public JSONObject getConversationCount(String userToken) {
         try {
-            String res = HttpUtil.get("http://64.32.11.94:9611/grok/getConversationCount?userToken=" + userToken);
+            String res = HttpUtil.get("http://208.98.56.214:9611/grok/getConversationCount?userToken=" + userToken);
             return new JSONObject(res);
         }catch (Exception e){
             return new JSONObject("{\"count\": 0}");

+ 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;

+ 17 - 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,24 @@ public class UserActivityServiceImpl extends ServiceImpl<UserActivityMapper, Use
 				couponCommonService.sendCouponToUser(sendUserId, couponId, 0l, 0l, 0l, CouponUser.Channel.student_cert);
 			}
 		}
+		ReceiveGptActivityTicketResp apiQuotaTicketResp = null;
+		if (Boolean.TRUE.equals(activity.getApiQuotaCouponEnabled())) {
+			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;
 	}
 

+ 9 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -27,6 +27,7 @@ import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.UserPayEquipmentAvailableBenefitsMapper;
 import com.cyksj.mapper.channel.UserPayEquipmentReceiveBenefitsRecordMapper;
 import com.cyksj.mapper.claudecode.ClaudeCodeDeductOrderRelateMapper;
+import com.cyksj.mapper.codex.CodexDeductRecordMapper;
 import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
@@ -147,6 +148,8 @@ public class CmsOrderController {
 
     private final GoodsClickUserOrderRecordMapper goodsClickUserOrderRecordMapper;
 
+    private final CodexDeductRecordMapper codexDeductRecordMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@GetMapping("/get")
@@ -360,6 +363,12 @@ public class CmsOrderController {
 					data.setDeductMoney(claudeCodeDeductOrderRelate.getDeductMoney());
 				}
 			}
+            if (data.getGoodsId() == Constant.CODEX_GOODS_ID) {
+                CodexDeductRecord codexDeductRecord = codexDeductRecordMapper.selectOne(Wrappers.lambdaQuery(CodexDeductRecord.class).eq(CodexDeductRecord::getOrderId, data.getId()).last("limit 1"));
+                if (codexDeductRecord != null) {
+                    data.setDeductMoney(codexDeductRecord.getDeductMoney());
+                }
+            }
             //购买须知
             Optional.ofNullable(goodsClickUserOrderRecordMapper.selectOne(Wrappers.lambdaQuery(GoodsClickUserOrderRecord.class).eq(GoodsClickUserOrderRecord::getOrderId, data.getId()).last("limit 1"))).ifPresent(c -> {
                 data.setPurchaseNotify(c.getPurchaseNotify());