Bladeren bron

Merge remote-tracking branch 'origin/chatgpt_car_loginwithtoken'

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java
chenbiao 2 jaren geleden
bovenliggende
commit
899e595f3c

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

@@ -17,6 +17,8 @@ public interface Constant {
 
 	String DEFAULT_NAME = "银河用户";
 
+	String YH_GPT_USER_NAME = "银河录像局";
+
 	List<String> noOrderStatus = List.of("close", "noPayment");
 
 	List<String> noOrderAllStatus = List.of("noPayment", "close", "refund");

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/ChatgptUserTokenPrepareMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChatgptUserTokenPrepare;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: ChatgptUserTokenPrepareMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/4/18 17:58
+ */
+public interface ChatgptUserTokenPrepareMapper extends BaseMapper<ChatgptUserTokenPrepare> {
+	void batchInsert(@Param("list") List<ChatgptUserTokenPrepare> list);
+}

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUserTokenPrepare.java

@@ -0,0 +1,36 @@
+package com.cyksj.model.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: chatgpt_user_token_papre
+ * 创建者: JavaZou
+ * 创建时间:2024/4/18 17:56
+ */
+@TableName("chatgpt_user_token_prepare")
+@Getter
+@Setter
+@ExcelIgnoreUnannotated
+public class ChatgptUserTokenPrepare extends BaseEntity{
+	private Long skuId;
+
+	private String name;
+
+	@TableField(exist = false)
+	@ExcelProperty("规格")
+	private String skuName;
+
+	private String img;
+
+	@TableField("userToken")
+	@ExcelProperty("用户token")
+	private String userToken;
+
+	private Boolean status;
+}

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/request/ChatGptUserTokenGenerateReq.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: ChatGptUserTokenGenerateReq
+ * 创建者: JavaZou
+ * 创建时间:2024/4/18 17:49
+ */
+@Getter
+@Setter
+public class ChatGptUserTokenGenerateReq {
+	/**
+	 * 生成数量
+	 */
+	private Integer num;
+
+	/**
+	 * 名称
+	 */
+	private String name;
+
+	/**
+	 * logo
+	 */
+	private String img;
+
+	/**
+	 * 生成镜像规格
+	 */
+	private Long skuId;
+}

+ 14 - 0
netflix-dao/src/main/resources/mapper/ChatgptUserTokenPrepareMapper.xml

@@ -0,0 +1,14 @@
+<?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.ChatgptUserTokenPrepareMapper">
+
+    <insert id="batchInsert">
+        insert into
+        chatgpt_user_token_prepare(`name`,`img`,`userToken`,`sku_id`,`created_time`,`update_time`)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.name},#{item.img},#{item.userToken},#{item.skuId},now(),now())
+        </foreach>
+    </insert>
+</mapper>

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

+ 102 - 12
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.chatgpt.impl;
 
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
@@ -89,6 +90,8 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
     private final BeanSearcher beanSearcher;
 
+    private final ChatgptUserTokenPrepareMapper chatgptUserTokenPrepareMapper;
+
     @Override
     public String addAccount(Account account) {
         if (isAccountExists(account)) {
@@ -211,8 +214,8 @@ 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();
+            if (214610L == relationId) {
+                return "https://cdn.galaxydvd.com/login_token?access_token=" + chatgptUser.getUserToken();
             }
             return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
         } else {
@@ -239,6 +242,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("服务出了点问题");
+        }
+    }
 
     /**
      * 获取车位信息
@@ -337,6 +352,36 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         return chatgptUser;
     }
 
+    /**
+     * 创建chatgptUser 无需车队
+     */
+    public ChatgptUser generateChatGptUserUnderPrepare(ChatgptUserTokenPrepare prepare) {
+        ChatgptUser chatgptUser = new ChatgptUser();
+        GoodsDonSku goodsDonSku = skuMapper.selectById(prepare.getSkuId());
+        if (goodsDonSku == null) {
+            throw BusinessRuntimeException.getInstance("车队规格不存在,请联系客服..");
+        }
+        if (goodsDonSku.getIsCar()) {
+            chatgptUser.setIsCar(true);
+            chatgptUser.setLimitNum(goodsDonSku.getGptLimitNum());
+            chatgptUser.setLimitTime(goodsDonSku.getGptLimitTime());
+        }
+        try {
+            chatgptUser.setExpireTime(DateUtil.offsetMonth(DateTime.now(), goodsDonSku.getMonths()));
+            chatgptUser.setIsPlus(1);
+            chatgptUser.setName(prepare.getName());
+            chatgptUser.setImg(prepare.getImg());
+            chatgptUser.setUserToken(prepare.getUserToken());
+            chatgptUserMapper.insert(chatgptUser);
+
+            prepare.setStatus(true);
+            chatgptUserTokenPrepareMapper.updateById(prepare);
+            log.info("用户激活userToken:{}成功", prepare.getUserToken());
+        } catch (DuplicateKeyException e) {
+        }
+        return chatgptUser;
+    }
+
     private void updateChatgptUser(GroupsRelation groupsRelation, User user, ChatgptUser chatgptUser) {
         chatgptUser.setName(user.getNickname());
         chatgptUser.setImg(getWxImg(user.getHeadimgurl(), user));
@@ -377,9 +422,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());
@@ -399,7 +444,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());
         }
 
@@ -458,7 +503,6 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
     }
 
 
-
     /**
      * 获取指定用户ID在滑动窗口内的提问次数
      *
@@ -532,6 +576,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);
@@ -539,7 +592,29 @@ 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) {
+            //是否是用户token预备账号
+            ChatgptUserTokenPrepare chatgptUserTokenPrepare = chatgptUserTokenPrepareMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserTokenPrepare.class)
+                    .eq(ChatgptUserTokenPrepare::getUserToken, userToken).last("limit 1"));
+            if (chatgptUserTokenPrepare != null) {
+                chatgptUser = generateChatGptUserUnderPrepare(chatgptUserTokenPrepare);
+            }
+        }
+        if (chatgptUser != null) {
+            if(!chatgptUser.getIsCar()){
+                throw BusinessRuntimeException.getInstance("您非车队用户,请购买车队套餐");
+            }
+            if (chatgptUser.getRelationId() != null) {
+                throw BusinessRuntimeException.getInstance("非渠道用户,请通过官网登录!");
+            }
             return chatgptUser;
         }
         return null;
@@ -621,9 +696,9 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         } else {
             initFleets(false);
         }
-        lowestScorecarIds = redisService.zRangeWithScores(RedisService.key.CHATGPT_CAR_SCORES.getName(), 0L, 20 - 1);
+        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).eq(ChatgptSession::getIsPlus,1).in(ChatgptSession::getCarId, collect.keySet()));
+        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())))
                 .sorted(Comparator.comparing(ChatgptCarInfoView::getScore)).collect(Collectors.toCollection(LinkedHashSet::new));
     }
@@ -653,7 +728,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");
@@ -687,6 +762,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) {
@@ -705,12 +795,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();
                     }
                 }

+ 78 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirror/CmsMirrorController.java

@@ -0,0 +1,78 @@
+package com.cyksj.web.controller.manage.mirror;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.UUID;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.mapper.ChatgptUserTokenPrepareMapper;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.model.entity.ChatgptUserTokenPrepare;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.request.ChatGptUserTokenGenerateReq;
+import com.cyksj.web.util.EasyExcelUtils;
+import com.google.common.collect.Lists;
+import lombok.RequiredArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsMirrorController
+ * 创建者: JavaZou
+ * 创建时间:2024/4/18 17:45
+ */
+@RestController
+@RequestMapping("/manage/mirror/gpt")
+@RequiredArgsConstructor
+public class CmsMirrorController {
+
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
+	private final ChatgptUserTokenPrepareMapper chatgptUserTokenPrepareMapper;
+
+	/**
+	 * 生成并导出gpt会话
+	 */
+	@PostMapping("/generateAndExport/gpt/session")
+	@Transactional(rollbackFor = Exception.class)
+	public void generateAndExportGptSession(@RequestBody ChatGptUserTokenGenerateReq gptUserTokenGenerateReq, HttpServletResponse response) {
+		Integer num = gptUserTokenGenerateReq.getNum();
+		if (num == null || num <= 0) {
+			throw new IllegalArgumentException("生成数量必须大于0");
+		}
+		Long skuId = gptUserTokenGenerateReq.getSkuId();
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(skuId);
+		if (sku == null) {
+			throw new IllegalArgumentException("镜像规格不存在");
+		}
+		if (!sku.getIsCar()) {
+			throw new IllegalArgumentException("不是gpt车队规格");
+		}
+		String name = Optional.ofNullable(gptUserTokenGenerateReq.getName()).orElse(Constant.YH_GPT_USER_NAME);
+		String img = Optional.ofNullable(gptUserTokenGenerateReq.getName()).orElse(Constant.DEFAULT_HEAD_IMG);
+		List<ChatgptUserTokenPrepare> prepares = new ArrayList<>(num);
+		ChatgptUserTokenPrepare chatgptUserTokenPrepare = null;
+
+		for (int i = 0; i < num; i++) {
+			chatgptUserTokenPrepare = new ChatgptUserTokenPrepare();
+			chatgptUserTokenPrepare.setUserToken(UUID.randomUUID().toString());
+			chatgptUserTokenPrepare.setName(name);
+			chatgptUserTokenPrepare.setImg(img);
+			chatgptUserTokenPrepare.setSkuId(skuId);
+			chatgptUserTokenPrepare.setSkuName(sku.getSpecVal());
+			prepares.add(chatgptUserTokenPrepare);
+		}
+		if (CollUtil.isNotEmpty(prepares)) {
+			Lists.partition(prepares, 500).forEach(e -> chatgptUserTokenPrepareMapper.batchInsert(e));
+		}
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ChatgptUserTokenPrepare.class, prepares, "用户token","用户token", ExcelTypeEnum.XLSX, null);
+	}
+}

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

@@ -238,4 +238,57 @@ 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);
+    }
+
+    /**
+     * 根据userToken获取车队历史记录
+     */
+    @GetMapping("/gpt/car/history/withToken")
+    public Result<SearchResult<ChatGptUserConversationRecordHistoryView>> getCarHistory(String userToken) {
+        ChatgptUser carChatGptUser = chatGptAccountService.getCarChatGptUserWithToken(userToken);
+        if (carChatGptUser == null) {
+            throw BusinessRuntimeException.getInstance("车票出现了异常.");
+        }
+        MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap()).field("userToken", carChatGptUser.getUserToken());
+        SearchResult<ChatGptUserConversationRecordHistoryView> search = beanSearcher.search(ChatGptUserConversationRecordHistoryView.class, builder.build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+
+
+
 }