瀏覽代碼

Merge branch 'chatgpt_car_loginwithtoken' into dev

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsPopularizeServiceImpl.java
#	netflix-service/src/main/java/com/cyksj/service/user/BadIntentionOpService.java
#	netflix-service/src/main/java/com/cyksj/service/user/impl/BadIntentionOpServiceImpl.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsGptCarController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java
chenbiao 2 年之前
父節點
當前提交
9fd59ec2a0

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpCustomerAcquisitionLinkMapper.java

@@ -18,5 +18,5 @@ public interface CorpCustomerAcquisitionLinkMapper extends BaseMapper<CorpCustom
 
 	List<CorpCustomerAcquisitionLink> selectActiveCodeByFollowIndx(@Param("list") List<Integer> updateFollowIndx);
 
-	List<Long> selectAcLinkCorpTemplateCouponIdsByTagIds(@Param("tagIds") List<Long> tagIds);
+	List<String> selectAcLinkCorpTemplateCouponIdsByTagIds(@Param("tagIds") List<Long> tagIds);
 }

+ 4 - 1
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java

@@ -1,6 +1,5 @@
 package com.cyksj.model.views;
 
-import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -140,4 +139,8 @@ public class GoodsDonSkuFrontView {
 	 * 限制时间
 	 */
 	private Long gptLimitTime;
+
+	private Boolean isCar;
+
+	private Boolean isMirror;
 }

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

@@ -136,4 +136,10 @@ public class YhShopGoodsSkuFrontView {
 	 */
 	@DbField("sku.gpt_limit_time")
 	private Long gptLimitTime;
+
+	@DbField("sku.is_car")
+	private Boolean isCar;
+
+	@DbField("sku.is_mirror")
+	private Boolean isMirror;
 }

+ 1 - 1
netflix-dao/src/main/resources/mapper/CorpCustomerAcquisitionLinkMapper.xml

@@ -12,7 +12,7 @@
         </foreach>
     </select>
 
-    <select id="selectAcLinkCorpTemplateCouponIdsByTagIds" resultType="java.lang.Long">
+    <select id="selectAcLinkCorpTemplateCouponIdsByTagIds" resultType="java.lang.String">
         select distinct ct.coupon_ids from (select msg_id from corp_customer_acquisition_link
         where msg_id != 0 and tags != '[]' and
         <foreach collection="tagIds" item="item" open="(" separator="OR" close=")">

+ 12 - 2
netflix-service/src/main/java/com/cyksj/service/chatgpt/ChatGptAccountService.java

@@ -23,13 +23,15 @@ public interface ChatGptAccountService {
     String getLoginUrl(Long userId, Long relationId);
 
     String getCarLoginUrl(Long userId, Long relationId, String carId);
+    String getCarLoginUrlWithToken(String userToken, String carId);
 
     ChatgptUser findByUserTokenAndExpireTimeAfter(String userToken, LocalDateTime now);
 
     /**
      * 对话限制
+     *
      * @param userToken 用户token
-     * @param model 对话模型
+     * @param model     对话模型
      * @return 是否限制
      */
     ConversationLimitResponse conversationLimit(String userToken, String model, String carId, ChatgptUser user, Boolean isCar);
@@ -38,6 +40,7 @@ public interface ChatGptAccountService {
 
     /**
      * 获取对话次数
+     *
      * @param userToken 用户token
      * @param limitTime 限制时间
      * @return
@@ -48,12 +51,18 @@ public interface ChatGptAccountService {
 
     Boolean checkCarAccount(long userId, Long relationId);
 
+    Boolean checkCarAccountWithToken(String userToken);
+
     ChatgptUser getCarChatGptUser(long userId, Long relationId);
 
+    ChatgptUser getCarChatGptUserWithToken(String userToken);
+
     Set<ChatgptCarInfoView> getCarInfoList(String userToken);
 
     ChatGptUserView getUserInfo(long userId, Long relationId);
 
+    ChatGptUserView getUserInfoWithToken(String userToken);
+
     void genTitleSync(String messageId, String carid, String userToken);
 
     /**
@@ -64,5 +73,6 @@ public interface ChatGptAccountService {
     /**
      * 获取GPT session
      */
-   String getGptSession(String account, String password);
+    String getGptSession(String account, String password);
+
 }

+ 59 - 11
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -211,6 +211,9 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
         if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
             ChatgptUser chatgptUser = getChatgptUser(userId, relationId, groupsRelation, groupsTrips, goodsDonSku);
+            if (214610L == relationId) {
+                return "https://cdn.galaxydvd.com/login_token?access_token=" + chatgptUser.getUserToken();
+            }
             return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
         } else {
             throw BusinessRuntimeException.getInstance("服务器出了点问题");
@@ -236,6 +239,18 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
             throw BusinessRuntimeException.getInstance("服务器出了点问题");
         }
     }
+    /**
+     * 根据userToken获取车队登录url
+     */
+    @Override
+    public String getCarLoginUrlWithToken(String userToken, String carId) {
+        ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
+        if (chatgptUser != null) {
+            return CAR_GPT_DOMAIN + "/auth/logintoken?carid=" + carId + "&usertoken=" + chatgptUser.getUserToken();
+        } else {
+            throw BusinessRuntimeException.getInstance("服务出了点问题");
+        }
+    }
 
     /**
      * 获取车位信息
@@ -374,9 +389,9 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
     public void saveConversationRecord(String userToken, ConversationRequest conversationRequest) {
         LambdaQueryWrapper<ChatgptSession> wrapper = Wrappers.lambdaQuery(ChatgptSession.class);
 
-        if(StringUtils.isNotBlank(conversationRequest.getCarId())){
+        if (StringUtils.isNotBlank(conversationRequest.getCarId())) {
             wrapper.eq(ChatgptSession::getCarId, conversationRequest.getCarId());
-        }else {
+        } else {
             ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken));
             if (chatgptUser.getSessionId() != null) {
                 wrapper.eq(ChatgptSession::getId, chatgptUser.getSessionId());
@@ -396,7 +411,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         chatgptUserConversationRecord.setModel(conversationRequest.getModel());
         chatgptUserConversationRecordMapper.insert(chatgptUserConversationRecord);
 
-        if(StringUtils.isNotBlank(chatgptSession.getCarId())){
+        if (StringUtils.isNotBlank(chatgptSession.getCarId())) {
             updateExperienceAndScore(chatgptSession.getCarId(), !"text-davinci-002-render-sha".equals(conversationRequest.getModel()), System.currentTimeMillis());
         }
 
@@ -455,7 +470,6 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
     }
 
 
-
     /**
      * 获取指定用户ID在滑动窗口内的提问次数
      *
@@ -486,8 +500,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         // 定义键名
         String key = RedisService.key.CHATGPT_CAR_HIGH_CHAT.getName() + carId;
         long timestamp = System.currentTimeMillis();
-        // 更新体验数据
-        redisService.zAdd(key, timestamp, String.valueOf(timestamp));
+
         long windowStartMillis = timestamp - (limitTime * 60 * 60 * 1000);
 
         // 清除时间窗口之前的请求记录(可选,根据需要决定是否在此处清理过期记录)
@@ -530,6 +543,15 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         }
     }
 
+    @Override
+    public Boolean checkCarAccountWithToken(String userToken) {
+
+        ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
+
+        return chatgptUser != null;
+
+    }
+
     @Override
     public ChatgptUser getCarChatGptUser(long userId, Long relationId) {
         GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
@@ -537,7 +559,18 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
 
         if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
-            ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
+            return getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
+        }
+        return null;
+    }
+
+    @Override
+    public ChatgptUser getCarChatGptUserWithToken(String userToken) {
+        ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken).last(" limit 1"));
+        if (chatgptUser != null) {
+            if(!chatgptUser.getIsCar()){
+                throw BusinessRuntimeException.getInstance("您非车队用户,请购买车队套餐");
+            }
             return chatgptUser;
         }
         return null;
@@ -622,7 +655,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         lowestScorecarIds = redisService.zRangeWithScores(RedisService.key.CHATGPT_CAR_SCORES.getName(), 0L, count - 1);
         Map<Object, Double> collect = lowestScorecarIds.stream().collect(Collectors.toMap(ZSetOperations.TypedTuple::getValue, ZSetOperations.TypedTuple::getScore));
         List<ChatgptSession> chatgptSessions = chatgptSessionMapper.selectList(Wrappers.lambdaQuery(ChatgptSession.class).in(ChatgptSession::getCarId, collect.keySet()));
-        return chatgptSessions.stream().map((chatgptSession)-> buildChatgptCarInfoView(chatgptSession.getCarId(),chatgptSession.getCarName(), chatgptSession.getIsPlus(), collect.get(chatgptSession.getCarId())))
+        return chatgptSessions.stream().map((chatgptSession) -> buildChatgptCarInfoView(chatgptSession.getCarId(), chatgptSession.getCarName(), chatgptSession.getIsPlus(), collect.get(chatgptSession.getCarId())))
                 .sorted(Comparator.comparing(ChatgptCarInfoView::getScore)).collect(Collectors.toCollection(LinkedHashSet::new));
     }
 
@@ -651,7 +684,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         ChatgptCarInfoView view = new ChatgptCarInfoView();
         view.setCarId(carId);
         // 假设以下方法从Redis或其他服务获取数据
-        view.setScore(Math.min(score,100));
+        view.setScore(Math.min(score, 100));
         view.setStatus(score >= 50 ? "繁忙" : "空闲"); // 或“繁忙”
 
         view.setType(isPlus == 1 ? "plus" : "3.5");
@@ -685,6 +718,21 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
             throw BusinessRuntimeException.getInstance("您还未购买该车票");
         }
     }
+    @Override
+    public ChatGptUserView getUserInfoWithToken(String userToken) {
+        if (checkCarAccountWithToken(userToken)) {
+            ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
+            return ChatGptUserView.builder()
+                    .skuName("")
+                    .expireTime(chatgptUser.getExpireTime())
+                    .limitNum(chatgptUser.getLimitNum())
+                    .limitTime(chatgptUser.getLimitTime())
+                    .use(getConversationCount(chatgptUser.getUserToken(), chatgptUser.getLimitTime()))
+                    .build();
+        } else {
+            throw BusinessRuntimeException.getInstance("您还未购买该车票");
+        }
+    }
 
     @Override
     public void genTitleSync(String conversationId, String carid, String userToken) {
@@ -703,12 +751,12 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
     @Override
     public void carLimited(String carId, String userToken, Long expTime) {
-        if(carId == null){
+        if (carId == null) {
             if (StringUtils.isNotBlank(userToken)) {
                 ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken));
                 if (chatgptUser != null && chatgptUser.getSessionId() != null) {
                     ChatgptSession chatgptSession = chatgptSessionMapper.selectById(chatgptUser.getSessionId());
-                    if(chatgptSession != null){
+                    if (chatgptSession != null) {
                         carId = chatgptSession.getCarId();
                     }
                 }

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpWelcomeTemplateServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.corp.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;

+ 8 - 3
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -701,10 +701,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 			//是否有对应获客链接的标签
 			List<Long> tagIds = corpUserTagMapper.getTagIdByCorpUserId(corpUser.getId());
 			if (CollUtil.isNotEmpty(tagIds)) {
-				List<Long> couponIds = corpCustomerAcquisitionLinkMapper.selectAcLinkCorpTemplateCouponIdsByTagIds(tagIds);
-				if (CollUtil.isNotEmpty(couponIds)) {
+				List<String> couponIdsStrList = corpCustomerAcquisitionLinkMapper.selectAcLinkCorpTemplateCouponIdsByTagIds(tagIds);
+				if (CollUtil.isNotEmpty(couponIdsStrList)) {
 					log.info("用户userId:{}存在获客链接标记的标签:{}", fUid, tagIds);
-					couponIds.forEach(couponId -> couponCommonService.sendCouponToUser(fUid, couponId, 0l, 0l, 0l, CouponUser.Channel.customer_link));
+					couponIdsStrList.forEach(couponIdsStr -> {
+						try {
+							Jsons.parseList(couponIdsStr, Long.class).forEach(couponId -> couponCommonService.sendCouponToUser(fUid, couponId, 0l, 0l, 0l, CouponUser.Channel.customer_link));
+						} catch (Exception e) {
+						}
+					});
 				}
 			}
 		}

+ 0 - 6
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsDistribtueDataController.java

@@ -6,8 +6,6 @@ import cn.hutool.core.util.StrUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
-import com.cyksj.mapper.UserMapper;
-import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.model.entity.DistributeMoneyApply;
 import com.cyksj.model.entity.DistributeWaitingSendPoints;
@@ -55,10 +53,6 @@ public class CpsDistribtueDataController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
-	private final UserMapper userMapper;
-
-	private final DistributeMoneyApplyMapper distributeMoneyApplyMapper;
-
 	/**
 	 * 个人分销平台数据详情
 	 */

+ 1 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsGptCarController.java

@@ -85,6 +85,7 @@ public class CmsGptCarController {
 					String carId = e.getCarId();
 					if (StrUtil.isNotBlank(carId)) {
 						chatgptSessionMapper.deleteById(e.getId());
+
 						String highCarChatKey = RedisService.key.CHATGPT_CAR_HIGH_CHAT.getName() + carId;
 						String lowCarChatKey = RedisService.key.CHATGPT_CAR_LOW_CHAT.getName() + carId;
 						//从zSet中删除车队

+ 11 - 0
netflix-web/src/main/java/com/cyksj/web/controller/market/TaskFrontController.java

@@ -12,13 +12,16 @@ import com.cyksj.model.request.UserBindInfoReq;
 import com.cyksj.model.views.TaskFrontView;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.service.market.task.BindTaskService;
+import com.cyksj.service.user.BadIntentionOpService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
+import com.ejlchina.searcher.util.StringUtils;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -31,6 +34,7 @@ import javax.servlet.http.HttpServletResponse;
  *创建者: JavaZou
  *创建时间:2022/12/28 13:51
  */
+@Slf4j
 @RestController
 @RequestMapping("/applets/market/task")
 @RequiredArgsConstructor
@@ -48,6 +52,9 @@ public class TaskFrontController {
 
 	private final UserBindRelationService userBindRelationService;
 
+	private final BadIntentionOpService badIntentionOpService;
+
+	private final HttpServletRequest request;
 	/**
 	 * 任务列表
 	 */
@@ -82,6 +89,10 @@ public class TaskFrontController {
 	@Deprecated
 	public Result<String> bindPhone(@RequestBody LoginReq phoneReq) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
+		log.info("绑定手机号 userId:{}, params:{}", userId, phoneReq);
+		if(StringUtils.isNotBlank(phoneReq.getPhone())){
+			badIntentionOpService.isBadOpLoginPhone(request, phoneReq.getPhone());
+		}
 		User user = userMapper.selectById(userId);
 		bindTaskService.bindPhone(user, phoneReq.getPhone(), phoneReq.getCode());
 		return GatewayResponse.SUCCESS.newBuilder().toResult("绑定手机号成功");

+ 39 - 0
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -238,4 +238,43 @@ public class MirrorController {
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+
+    /**
+     * 根据userToken获取gpt车票信息
+     */
+    @GetMapping("/gpt/userInfoWithToken")
+    public Result<ChatGptUserView> getUserInfoWithToken(String userToken) {
+        ChatGptUserView user = chatGptAccountService.getUserInfoWithToken(userToken);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(user);
+    }
+
+    /**
+     * 根据userToken GPT车队跳转登录
+     *
+     * @param carId 车队id
+     */
+    @GetMapping("/chatGptMirrorWithToken/{userToken}/{carId}")
+    public Result<String> chatGPtCarLoginWithToken(@PathVariable String userToken, @PathVariable String carId) {
+        chatGptAccountService.checkCarAccountWithToken(userToken);
+        String url = chatGptAccountService.getCarLoginUrlWithToken(userToken, carId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(url);
+    }
+
+    /**
+     * 根据userToken获取车队列表
+     */
+    @GetMapping("/gpt/cars/withToken")
+    public Result<Set<ChatgptCarInfoView>> getCarInfoListWithToken(String userToken) {
+        //查看用户是否存在车票
+        ChatgptUser carChatGptUser = chatGptAccountService.getCarChatGptUserWithToken(userToken);
+        if (carChatGptUser == null) {
+            throw BusinessRuntimeException.getInstance("您还未购买车票");
+        }
+
+        Set<ChatgptCarInfoView> carInfoList = chatGptAccountService.getCarInfoList(carChatGptUser.getUserToken());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(carInfoList);
+    }
+
+
+
 }