zoujiajian 9 月之前
父節點
當前提交
57bd33d5a9

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -735,4 +735,9 @@ public interface Constant {
 	 * 实物支付商户id
 	 */
 	String REAL_GOODS_PAY_SHOP_ID = "real_goods_pay_shop_id";
+
+	/**
+	 * gpt team邀请人数限制key
+	 */
+	String GPT_TEAM_INVITE_NUM = "gptTeamInviteNum";
 }

+ 1 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GptTeamAccountMapper.java

@@ -8,4 +8,5 @@ import com.cyksj.model.entity.GptTeamAccount;
  */
 public interface GptTeamAccountMapper extends BaseMapper<GptTeamAccount> {
 
+	GptTeamAccount selecAvailableTeam(Integer maxNum);
 }

+ 4 - 4
netflix-dao/src/main/java/com/cyksj/model/entity/GptTeamAccount.java

@@ -2,7 +2,6 @@ package com.cyksj.model.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.cyksj.model.BaseEntity;
-import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -41,7 +40,8 @@ public class GptTeamAccount extends BaseEntity {
      */
     private String remark;
 
-    @TableField(exist = false)
-    @DbField("select count(1) from gpt_team_user_bind_record gbr where gbr.token = gta.token")
-    private Integer count;
+    /**
+     * 人数
+     */
+    private Integer totalNum;
 }

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

@@ -44,4 +44,9 @@ public class GptTeamUserBindRecord extends BaseEntity {
      * 换绑次数
      */
     private Integer changeNum;
+
+    /**
+     * 此时 加入人数
+     */
+    private Integer count;
 }

+ 12 - 0
netflix-dao/src/main/resources/mapper/GptTeamAccountMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.GptTeamAccountMapper">
+
+
+    <select id="selecAvailableTeam" resultType="com.cyksj.model.entity.GptTeamAccount">
+        select gta.* from gpt_team_account gta
+        where gta.status and (select count(1) from gpt_team_user_bind_record gbr where gbr.token = gta.token) &lt; #{maxNum}
+        order by rand() limit 1
+    </select>
+</mapper>

+ 49 - 30
netflix-service/src/main/java/com/cyksj/service/gpt/impl/GptTeamUserBindRecordServiceImpl.java

@@ -1,7 +1,7 @@
 package com.cyksj.service.gpt.impl;
 
 import cn.hutool.core.date.DateTime;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.hutool.core.lang.Validator;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -9,10 +9,8 @@ import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GptTeamAccountMapper;
 import com.cyksj.mapper.GptTeamUserBindRecordMapper;
 import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.model.entity.GoodsDonSku;
-import com.cyksj.model.entity.GptTeamAccount;
-import com.cyksj.model.entity.GptTeamUserBindRecord;
-import com.cyksj.model.entity.OrderDon;
+import com.cyksj.mapper.sys.SysConfigMapper;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.GptTeamBindRequest;
 import com.cyksj.service.gpt.GptTeamUserBindRecordService;
 import com.cyksj.service.user.UserBindRelationService;
@@ -42,6 +40,8 @@ public class GptTeamUserBindRecordServiceImpl implements GptTeamUserBindRecordSe
 
     private final GoodsDonSkuMapper goodsDonSkuMapper;
 
+    private final SysConfigMapper sysConfigMapper;
+
     @Override
     @Transactional(rollbackFor = Throwable.class)
     public void bindByOrderId(GptTeamBindRequest request) {
@@ -78,22 +78,23 @@ public class GptTeamUserBindRecordServiceImpl implements GptTeamUserBindRecordSe
         } catch (DuplicateKeyException e) {
             throw BusinessRuntimeException.getInstance("已有绑定的Team");
         }
-
-        // 3. 查找可用的GPT Team账号
-        LambdaQueryWrapper<GptTeamAccount> accountWrapper = new LambdaQueryWrapper<>();
-        accountWrapper.eq(GptTeamAccount::getStatus, true)
-                     .notExists("SELECT 1 FROM gpt_team_user_bind_record WHERE gpt_team_account_id = gpt_team_account.id AND bind_status = 1");
-        
-        List<GptTeamAccount> availableAccounts = gptTeamAccountMapper.selectList(accountWrapper);
-        if (availableAccounts.isEmpty()) {
-            throw new BusinessRuntimeException("暂无可用的GPT Team账号,请稍后再试");
+        Integer gptTeamInviteLimitNum = getGptTeamInviteLimitNum();
+        GptTeamAccount teamAccount = gptTeamAccountMapper.selecAvailableTeam(gptTeamInviteLimitNum);
+        if (teamAccount == null) {
+            throw BusinessRuntimeException.getInstance("加入Team失败,请联系客服配置Team后重新加入!");
         }
-
-        GptTeamAccount selectedAccount = availableAccounts.get(0);
-
-        //绑定 Team API
-        bindRecord.setToken("");
+        int update = gptTeamAccountMapper.update(null, Wrappers.lambdaUpdate(GptTeamAccount.class)
+                .set(GptTeamAccount::getTotalNum, teamAccount.getTotalNum() + 1)
+                .eq(GptTeamAccount::getId, teamAccount.getId())
+                .eq(GptTeamAccount::getTotalNum, teamAccount.getTotalNum())
+                .lt(GptTeamAccount::getTotalNum, gptTeamInviteLimitNum));
+        if (update == 0) {
+            throw BusinessRuntimeException.getInstance("系统繁忙,请重试!");
+        }
+        bindRecord.setToken(teamAccount.getToken());
         bindRecordMapper.updateById(bindRecord);
+        //绑定 Team API TODO
+
     }
 
     @Override
@@ -112,15 +113,13 @@ public class GptTeamUserBindRecordServiceImpl implements GptTeamUserBindRecordSe
         List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
         GptTeamUserBindRecord bindRecord = bindRecordMapper.selectOne(Wrappers.lambdaQuery(GptTeamUserBindRecord.class).eq(GptTeamUserBindRecord::getOrderId, orderId).in(GptTeamUserBindRecord::getUserId, userIdList).last("limit 1"));
         if (bindRecord == null) {
-            throw BusinessRuntimeException.getInstance("您还未假如Team");
+            throw BusinessRuntimeException.getInstance("您还未加入Team");
         }
-
-        // 1. 验证换绑次数
+        // 验证换绑次数
         Integer changeNum = bindRecord.getChangeNum();
         if (changeNum == 0) {
             throw new BusinessRuntimeException("仅可换绑一次");
         }
-
         int update = bindRecordMapper.update(null, Wrappers.lambdaUpdate(GptTeamUserBindRecord.class)
                 .set(GptTeamUserBindRecord::getChangeNum, 0)
                 .eq(GptTeamUserBindRecord::getId, bindRecord.getId())
@@ -130,14 +129,34 @@ public class GptTeamUserBindRecordServiceImpl implements GptTeamUserBindRecordSe
         }
         //换绑前的token
         String bfToken = bindRecord.getToken();
-        // 4. 查找新的可用账号
-        LambdaQueryWrapper<GptTeamAccount> accountWrapper = new LambdaQueryWrapper<>();
-        accountWrapper.eq(GptTeamAccount::getStatus, true)
-                     .ne(GptTeamAccount::getToken, bfToken)
-                     .notExists("SELECT 1 FROM gpt_team_user_bind_record WHERE gpt_team_account_id = gpt_team_account.id AND bind_status = 1");
-        //换绑其他Team API
-        bindRecord.setToken("");
+        // 查找新的可用账号
+        Integer gptTeamInviteLimitNum = getGptTeamInviteLimitNum();
+        GptTeamAccount teamAccount = gptTeamAccountMapper.selecAvailableTeam(gptTeamInviteLimitNum);
+        if (teamAccount == null) {
+            throw BusinessRuntimeException.getInstance("换绑其他Team失败,请联系客服配置Team后重新换绑!");
+        }
+        int updateTeamCount = gptTeamAccountMapper.update(null, Wrappers.lambdaUpdate(GptTeamAccount.class)
+                .set(GptTeamAccount::getTotalNum, teamAccount.getTotalNum() + 1)
+                .eq(GptTeamAccount::getId, teamAccount.getId())
+                .eq(GptTeamAccount::getTotalNum, teamAccount.getTotalNum())
+                .lt(GptTeamAccount::getTotalNum, gptTeamInviteLimitNum));
+        if (updateTeamCount == 0) {
+            throw BusinessRuntimeException.getInstance("系统繁忙,请重试!");
+        }
+        bindRecord.setToken(teamAccount.getToken());
         bindRecord.setBfToken(bfToken);
         bindRecordMapper.updateById(bindRecord);
+
+        //换绑其他Team API TODO
+    }
+
+    public Integer getGptTeamInviteLimitNum() {
+        //默认5
+        Integer inviteLimitNum = 5;
+        SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.GPT_TEAM_INVITE_NUM).last("limit 1"));
+        if (sysConfig != null && Validator.isNumber(sysConfig.getSysValue())) {
+            inviteLimitNum = Integer.parseInt(sysConfig.getSysValue());
+        }
+        return inviteLimitNum;
     }
 }

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/gpt/GptTeamUserBindRecordController.java

@@ -12,7 +12,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 /**
- * GPT Team用户绑定记录控制器
+ * server/GPT Team用户绑定记录控制器
  */
 @Slf4j
 @RestController