소스 검색

Merge branch 'gpt_car_list_up' into pre

# Conflicts:
#	netflix-web/src/main/java/com/cyksj/web/controller/sys/SysCorpFollowController.java
chenbiao 2 년 전
부모
커밋
a07d708b0c

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

@@ -146,6 +146,8 @@ public interface Constant {
 
 	String CORP_SERVICE_FOLLOWS_KEY = "corp_service_follows_key";
 
+	String CORP_SERVICE_GROUPS_RELATION_FOLLOWS_KEY = "corp_service_groups_relation_follows_key";
+
 	String NEW_USER_WELFARE_KEY = "new_user_welfare_key";
 
 	/**

+ 16 - 11
netflix-dao/src/main/java/com/cyksj/model/views/ChatgptCarInfoView.java

@@ -1,5 +1,8 @@
 package com.cyksj.model.views;
 
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Data;
 
 import java.util.Date;
@@ -10,61 +13,63 @@ import java.util.Objects;
  * @date 2024/4/8 17:02
  */
 @Data
+@SearchBean(
+        tables = "chatgpt_session cs"
+)
 public class ChatgptCarInfoView {
 
     /**
      * 车次id
      */
+    @DbField("cs.carId")
     private String carId;
 
     /**
      * 车次名称
      */
+    @DbField("cs.car_name")
     private String carName;
 
     /**
      * 车次状态 繁忙 空闲 停运
      */
-
+    @DbIgnore
     private String status;
 
 
     /**
      * 得分
      */
+    @DbField("cs.score")
     private Double score;
 
     /**
      * 可用时间
      */
+    @DbIgnore
     private Date expTime;
 
     /**
      * 车队可用时间
      */
+    @DbIgnore
     private Date teamExpTime;
 
     /**
      * 车次类型 team plus 3.5
      */
-
+    @DbIgnore
     private String type;
 
-    /**
-     * 限制次数
-     */
-    private Integer gptLimit;
-
     /**
      * 使用次数
      */
 
     private Integer use;
 
-    /**
-     * 是否为历史车次
-     */
-    private Boolean isHistory;
+    @DbField("cs.isPlus")
+    private Integer isPlus;
+
 
     @Override
     public boolean equals(Object o) {

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

@@ -9,6 +9,7 @@ import com.cyksj.model.views.ChatGptUserView;
 import com.cyksj.model.views.ChatgptCarInfoView;
 
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -57,7 +58,7 @@ public interface ChatGptAccountService {
 
     ChatgptUser getCarChatGptUserWithToken(String userToken);
 
-    Set<ChatgptCarInfoView> getCarInfoList(String userToken, Integer limit, Boolean isPlus);
+    List<ChatgptCarInfoView> getCarInfoList(String userToken, Integer limit, Boolean isPlus);
 
     ChatGptUserView getUserInfo(long userId, Long relationId);
 

+ 17 - 46
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -697,22 +697,9 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
      * 获取车队信息
      */
     @Override
-    public Set<ChatgptCarInfoView> getCarInfoList(String userToken, Integer limit, Boolean isPlus) {
-        SearchResult<ChatGptUserConversationRecordHistoryView> search = beanSearcher.search(ChatGptUserConversationRecordHistoryView.class, MapUtils.builder().field("userToken", userToken).limit(0, 2).build());
-        Set<ChatgptCarInfoView> res = search.getDataList().stream()
-                .map((historyView) -> {
-                    ChatgptCarInfoView chatgptCarInfoView = buildChatgptCarInfoView(historyView.getCarId(), historyView.getCarName(), historyView.getIsPLus(), redisService.zScore(RedisService.key.CHATGPT_CAR_SCORES.getName(), historyView.getCarId()));
-                    chatgptCarInfoView.setIsHistory(true);
-                    chatgptCarInfoView.setScore(Math.min(redisService.zScore(RedisService.key.CHATGPT_CAR_SCORES.getName(), historyView.getCarId()), 200));
-
-                    return chatgptCarInfoView;
-                }).collect(Collectors.toCollection(LinkedHashSet::new));
-
-        Set<ChatgptCarInfoView> lowestScoreFleets = getLowestScoreFleets(limit, isPlus);
-
-        res.addAll(lowestScoreFleets);
-
-        return res;
+    public List<ChatgptCarInfoView> getCarInfoList(String userToken, Integer limit, Boolean isPlus) {
+        List<ChatgptCarInfoView> lowestScoreFleets = getLowestScoreFleets(limit, isPlus);
+        return lowestScoreFleets;
     }
 
 
@@ -758,22 +745,11 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
 
     // 获取得分最低的N个车队的方法
-    public Set<ChatgptCarInfoView> getLowestScoreFleets(int count, Boolean isPlus) {
-        Set<ZSetOperations.TypedTuple<Object>> lowestScorecarIds;
-        Long fleetsSize = redisService.zCard(RedisService.key.CHATGPT_CAR_SCORES.getName());
-        // 构建ChatgptCarInfoView集合
-        if (fleetsSize != null && fleetsSize > 10) {
-            TASK_EXECUTOR.execute(() -> {
-                initFleets(true);
-            });
-        } else {
-            initFleets(false);
-        }
-        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()).eq(isPlus !=null && isPlus, ChatgptSession::getIsPlus, true));
-        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));
+    public List<ChatgptCarInfoView> getLowestScoreFleets(int count, Boolean isPlus) {
+        List<ChatgptCarInfoView> chatgptCarInfoViews = beanSearcher.searchList(ChatgptCarInfoView.class, MapUtils.builder().field(ChatgptCarInfoView::getIsPlus, isPlus).orderBy(ChatgptCarInfoView::getScore).desc().limit(0, count).build());
+
+        chatgptCarInfoViews.forEach(this::buildChatgptCarInfoView);
+        return chatgptCarInfoViews;
     }
 
     public void initFleets(Boolean flag) {
@@ -796,21 +772,18 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
 
     // 构建ChatgptCarInfoView对象
-    private ChatgptCarInfoView buildChatgptCarInfoView(String carId, String carName, Integer isPlus, Double score) {
+    private ChatgptCarInfoView buildChatgptCarInfoView(ChatgptCarInfoView view) {
         // 在这里根据carId获取相关信息并填充到ChatgptCarInfoView对象中
-        ChatgptCarInfoView view = new ChatgptCarInfoView();
-        view.setCarId(carId);
-        // 假设以下方法从Redis或其他服务获取数据
-        view.setScore(Math.min(score, 200));
-        view.setStatus(score >= 50 ? "繁忙" : "空闲"); // 或“繁忙”
 
-        if(carName.contains("T")){
+        view.setStatus(view.getScore() >= 50 ? "繁忙" : "空闲"); // 或“繁忙”
+
+        if(view.getCarName().contains("T") && view.getIsPlus() == 1){
             view.setType("Team");
-            Long team = carOaiLimit(carId, true);
+            Long team = carOaiLimit(view.getCarId(), true);
             if (team != 0L) {
                 view.setTeamExpTime(new DateTime(System.currentTimeMillis() + team * 1000));
             }
-            Long aLong = carOaiLimit(carId, false);
+            Long aLong = carOaiLimit(view.getCarId(), false);
             if (aLong != 0L) {
                 view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
             }
@@ -820,17 +793,15 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
                 view.setStatus("部分停运");
             }
         }else {
-            view.setType(isPlus == 1 ? "Plus" : "3.5");
-            Long aLong = carOaiLimit(carId, false);
+            view.setType(view.getIsPlus() == 1 ? "Plus" : "3.5");
+            Long aLong = carOaiLimit(view.getCarId(), false);
             if (aLong != 0L) {
                 view.setStatus("停运");
                 view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
             }
         }
-        int use = getCarConversationCount(carId, 3L).intValue();
+        int use = getCarConversationCount(view.getCarId(), 3L).intValue();
         view.setUse(use);
-
-        view.setCarName(carName);
         return view;
     }
 

+ 59 - 3
netflix-service/src/main/java/com/cyksj/service/sys/impl/SysCorpFollowServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.sys.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -8,11 +9,11 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.SysCorpFollowMapper;
 import com.cyksj.mapper.SysCorpFollowRelateMapper;
+import com.cyksj.mapper.corp.CorpFollowMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.dto.YhServiceDto;
-import com.cyksj.model.entity.SysConfig;
-import com.cyksj.model.entity.SysCorpFollow;
-import com.cyksj.model.entity.SysCorpFollowRelate;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.sys.SysCorpFollowReq;
 import com.cyksj.service.sys.SysConfigChangeRecordService;
 import com.cyksj.service.sys.SysCorpFollowService;
@@ -20,7 +21,9 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * 项目名: yhlxj
@@ -37,6 +40,10 @@ public class SysCorpFollowServiceImpl extends ServiceImpl<SysCorpFollowMapper, S
 
 	private final SysConfigChangeRecordService sysConfigChangeRecordService;
 
+	private final CorpFollowMapper corpFollowMapper;
+
+	private final CmsUserMapper cmsUserMapper;
+
 	@Override
 	public void saveOrUpdateFollow(SysCorpFollowReq req) throws Exception {
 		SysCorpFollow sysCorpFollow = new SysCorpFollow();
@@ -69,6 +76,55 @@ public class SysCorpFollowServiceImpl extends ServiceImpl<SysCorpFollowMapper, S
 			//更新客服图片
 			updateCorpFollowImg(sysCorpFollowRelate, req.getName());
 		}
+		//同步企业客服key
+		syncSysCorpUserKey();
+	}
+
+	private void syncSysCorpUserKey() {
+		//客服群发key
+		SysConfig corpSendMsg = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.CORP_SERVICE_FOLLOWS_KEY).last("limit 1"));
+
+		//客服跟进续费key
+		SysConfig corpDutyServices = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.CORP_SERVICE_GROUPS_RELATION_FOLLOWS_KEY).last("limit 1"));
+
+		//获取目前可用值班客服
+		List<SysCorpFollowRelate> sysCorpFollowRelates = sysCorpFollowRelateMapper.selectList(Wrappers.lambdaQuery(SysCorpFollowRelate.class)
+				.eq(SysCorpFollowRelate::getStatus, 1)
+				.eq(SysCorpFollowRelate::getDeleted, 1));
+		List<String> followIds = sysCorpFollowRelates.stream().map(SysCorpFollowRelate::getFollowId).collect(Collectors.toList());
+		if (CollUtil.isNotEmpty(followIds)) {
+			try {
+				String followIdsStr = Jsons.toJson(followIds);
+				corpSendMsg.setSysValue(followIdsStr);
+				sysConfigMapper.updateById(corpSendMsg);
+
+				corpDutyServices.setSysValue(followIdsStr);
+				sysConfigMapper.updateById(corpDutyServices);
+			} catch (Exception e) {
+			}
+
+			//同步企业客服对应后台客服关系
+			List<CorpFollow> corpFollows = corpFollowMapper.selectList(Wrappers.lambdaQuery(CorpFollow.class)
+					.in(CorpFollow::getUserid, followIds)
+					.isNull(CorpFollow::getCmsUserId));
+			if (CollUtil.isNotEmpty(corpFollows)) {
+				Map<String, List<SysCorpFollowRelate>> map = sysCorpFollowRelates.stream().collect(Collectors.groupingBy(SysCorpFollowRelate::getFollowId));
+				corpFollows.forEach(e -> {
+					List<SysCorpFollowRelate> sysCorpFollowRelates1 = map.get(e.getUserid());
+					if (CollUtil.isNotEmpty(sysCorpFollowRelates1)) {
+						SysCorpFollow sysCorpFollow = this.getById(sysCorpFollowRelates1.get(0).getMid());
+						CmsUser cmsUser = cmsUserMapper.selectOne(Wrappers.lambdaQuery(CmsUser.class)
+								.eq(CmsUser::getNickname, sysCorpFollow.getName()));
+						if (cmsUser != null) {
+							e.setCmsUserId(cmsUser.getId());
+							corpFollowMapper.updateById(e);
+						}
+					}
+				});
+			}
+		}
 	}
 
 	@Override

+ 5 - 4
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -36,6 +36,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -215,14 +216,14 @@ public class MirrorController {
      * @return
      */
     @GetMapping("/gpt/cars")
-    public Result<Set<ChatgptCarInfoView>> getCarInfoList(Long relationId,@RequestParam(defaultValue = "10") Integer limit,@RequestParam(defaultValue = "false") Boolean isPlus) {
+    public Result<List<ChatgptCarInfoView>> getCarInfoList(Long relationId,@RequestParam(defaultValue = "20") Integer limit,@RequestParam(defaultValue = "true") Boolean isPlus) {
         long userId = StpUserUtil.getLoginIdAsLong();
         //查看用户是否存在车票
         ChatgptUser carChatGptUser = chatGptAccountService.getCarChatGptUser(userId, relationId);
         if (carChatGptUser == null) {
             throw BusinessRuntimeException.getInstance("您还未购买车票");
         }
-        Set<ChatgptCarInfoView> carInfoList = chatGptAccountService.getCarInfoList(carChatGptUser.getUserToken(),10, isPlus);
+        List<ChatgptCarInfoView> carInfoList = chatGptAccountService.getCarInfoList(carChatGptUser.getUserToken(),limit, isPlus);
         for (ChatgptCarInfoView chatgptCarInfoView : carInfoList) {
             Double score = BigDecimal.valueOf(chatgptCarInfoView.getScore()).multiply(BigDecimal.valueOf(0.5)).setScale(0, RoundingMode.DOWN).doubleValue();
             chatgptCarInfoView.setScore(score);
@@ -308,13 +309,13 @@ public class MirrorController {
      * 根据userToken获取车队列表
      */
     @GetMapping("/gpt/cars/withToken")
-    public Result<Set<ChatgptCarInfoView>> getCarInfoListWithToken(String userToken,@RequestParam(defaultValue = "10") Integer limit, @RequestParam(defaultValue = "false") Boolean isPlus) {
+    public Result<List<ChatgptCarInfoView>> getCarInfoListWithToken(String userToken,@RequestParam(defaultValue = "10") Integer limit, @RequestParam(defaultValue = "false") Boolean isPlus) {
         //查看用户是否存在车票
         ChatgptUser carChatGptUser = chatGptAccountService.getCarChatGptUserWithToken(userToken);
         if (carChatGptUser == null) {
             throw BusinessRuntimeException.getInstance("您还未购买车票");
         }
-        Set<ChatgptCarInfoView> carInfoList = chatGptAccountService.getCarInfoList(carChatGptUser.getUserToken(), limit, isPlus);
+        List<ChatgptCarInfoView> carInfoList = chatGptAccountService.getCarInfoList(carChatGptUser.getUserToken(), limit, isPlus);
         return GatewayResponse.SUCCESS.newBuilder().toResult(carInfoList);
     }
 

+ 2 - 1
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -142,7 +142,8 @@ public class OrderController {
 
         String ip = ServletUtil.getClientIP(request);
         String address = StringUtil.getNewInternalAddressByIp(ip);
-        if (address.contains("柬埔寨") || address.contains("缅甸")) {
+        //address.contains("柬埔寨") ||
+        if (address.contains("缅甸")) {
             throw BusinessRuntimeException.getInstance("用户系统异常");
         }
         payRequest.setIp(ip);

+ 6 - 2
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysCorpFollowController.java

@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * 项目名: yhlxj
@@ -80,10 +81,10 @@ public class SysCorpFollowController {
 	 * 客服列表
 	 */
 	@GetMapping("/get")
-	public Result<List<SysCorpFollowView>> get() throws Exception {
+	public Result<List<SysCorpFollowView>> get(@RequestParam(required = false) Boolean isOpen) throws Exception {
 		List<String> res = wxCorpOps.getPermitUserList(corpConfig.getCorpId(), null);
 		List<SysCorpFollowView> sysCorpFollowViews = beanSearcher.searchAll(SysCorpFollowView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		sysCorpFollowViews.forEach(e->{
+		sysCorpFollowViews.forEach(e -> {
 			Integer num = corpUserFollowRelationMapper.selectNumOfCorpuserByFollowId(e.getFollowId());
 			e.setNumOfCorpUser(num);
 			//是否开启企业会话
@@ -91,6 +92,9 @@ public class SysCorpFollowController {
 				e.setIsOpen(true);
 			}
 		});
+		if (isOpen != null) {
+			sysCorpFollowViews = sysCorpFollowViews.stream().filter(e -> e.getIsOpen() == isOpen).collect(Collectors.toList());
+		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(sysCorpFollowViews);
 	}