ChatGptAccountServiceImpl.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. package com.cyksj.service.chatgpt.impl;
  2. import cn.hutool.core.date.DateTime;
  3. import cn.hutool.core.date.DateUnit;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.lang.UUID;
  6. import cn.hutool.core.util.RandomUtil;
  7. import cn.hutool.core.util.StrUtil;
  8. import cn.hutool.http.HttpRequest;
  9. import cn.hutool.http.HttpResponse;
  10. import cn.hutool.http.HttpUtil;
  11. import cn.hutool.http.Method;
  12. import cn.hutool.json.JSONObject;
  13. import cn.hutool.json.JSONUtil;
  14. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  15. import com.cyksj.common.constant.Constant;
  16. import com.cyksj.common.exception.BusinessRuntimeException;
  17. import com.cyksj.common.util.StringUtil;
  18. import com.cyksj.mapper.*;
  19. import com.cyksj.mapper.station.CollegeStudentStationUseTicketRecordMapper;
  20. import com.cyksj.model.entity.*;
  21. import com.cyksj.model.views.ChatGptUserView;
  22. import com.cyksj.model.views.ChatgptCarInfoView;
  23. import com.cyksj.redis.RedisService;
  24. import com.cyksj.service.chatgpt.ChatGptAccountService;
  25. import com.cyksj.service.sys.SysConfigService;
  26. import com.cyksj.service.user.UserBindRelationService;
  27. import com.ejlchina.searcher.BeanSearcher;
  28. import com.ejlchina.searcher.SearchResult;
  29. import com.ejlchina.searcher.util.MapUtils;
  30. import lombok.RequiredArgsConstructor;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.apache.commons.lang3.StringUtils;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.dao.DuplicateKeyException;
  35. import org.springframework.stereotype.Service;
  36. import javax.imageio.stream.FileImageOutputStream;
  37. import javax.servlet.http.HttpServletRequest;
  38. import java.math.BigDecimal;
  39. import java.math.RoundingMode;
  40. import java.nio.file.Files;
  41. import java.nio.file.Path;
  42. import java.time.LocalDateTime;
  43. import java.util.*;
  44. /**
  45. * @author chan
  46. * @date 2024/3/19 11:01
  47. */
  48. @Service
  49. @Slf4j
  50. @RequiredArgsConstructor
  51. public class ChatGptAccountServiceImpl implements ChatGptAccountService {
  52. @Value("${chatgpt.domain}")
  53. private String GPT_DOMAIN;
  54. @Value("${chatgpt.car.domain}")
  55. private String CAR_GPT_DOMAIN;
  56. private static final String GPT_PROXY = "https://chat-chan-87jztgkf257d.xyhelper.org";
  57. private final RedisService redisService;
  58. private final ChatgptUserMapper chatgptUserMapper;
  59. private final ChatgptSessionMapper chatgptSessionMapper;
  60. private final GroupsRelationMapper groupsRelationMapper;
  61. private final GroupsMapper groupsMapper;
  62. private final GoodsDonSkuMapper skuMapper;
  63. private final UserMapper userMapper;
  64. private final UserBindRelationService userBindRelationService;
  65. private final AccountMapper accountMapper;
  66. private final BeanSearcher beanSearcher;
  67. private final ChatgptUserTokenPrepareMapper chatgptUserTokenPrepareMapper;
  68. private final CollegeStudentStationUseTicketRecordMapper collegeStudentStationUseTicketRecordMapper;
  69. private final UpgradePackageMapper upgradePackageMapper;
  70. private final OrderDonMapper orderDonMapper;
  71. private final SysConfigService sysConfigService;
  72. private final HttpServletRequest request;
  73. @Override
  74. public String getGptSession(String account, String password) {
  75. String officialSession = "";
  76. try {
  77. Account at = new Account();
  78. at.setAccount(account);
  79. at.setPassword(password);
  80. JSONObject loginResult = getLoginResult(at);
  81. String str = loginResult.getStr("detail");
  82. if (StringUtils.isNotBlank(str)) {
  83. throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + str);
  84. }
  85. officialSession = loginResult.toString();
  86. } catch (Exception e) {
  87. throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + e.getMessage());
  88. }
  89. return officialSession;
  90. }
  91. /**
  92. * 获取登录结果
  93. *
  94. * @param account
  95. * @return
  96. * @throws Exception
  97. */
  98. private JSONObject getLoginResult(Account account) throws Exception {
  99. HttpRequest request = new HttpRequest(GPT_PROXY + "/applelogin");
  100. request.form("username", account.getAccount());
  101. request.form("password", account.getPassword());
  102. request.header("Content-Type", "application/x-www-form-urlencoded");
  103. request.header("X-Requested-With", "xyhelper");
  104. HttpResponse execute = request.method(Method.POST).execute();
  105. String body = execute.body();
  106. log.info("登录返回token res:{}", body);
  107. return new JSONObject(body);
  108. }
  109. /**
  110. * 获取登录url
  111. *
  112. * @param userId
  113. * @param relationId
  114. * @return
  115. */
  116. @Override
  117. public String getLoginUrl(Long userId, Long relationId) {
  118. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  119. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  120. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  121. log.info("用户:{},所在车次:{},座位id:{},在{}获取跳转GPT镜像的登录url", userId, groupsTrips.getId(), relationId, DateTime.now());
  122. if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
  123. ChatgptUser chatgptUser = getChatgptUser(userId, relationId, groupsRelation, groupsTrips, goodsDonSku);
  124. if (214610L == relationId) {
  125. return "https://cdn.galaxydvd.com/login_token?access_token=" + chatgptUser.getUserToken();
  126. }
  127. return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
  128. } else {
  129. throw BusinessRuntimeException.getInstance("服务器出了点问题");
  130. }
  131. }
  132. /**
  133. * 获取车队登录url
  134. *
  135. * @param userId
  136. * @param carId
  137. * @return
  138. */
  139. @Override
  140. public String getCarLoginUrl(String domain, Long userId, Long relationId, String carId) {
  141. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  142. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  143. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  144. if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  145. ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
  146. String DOMAIN = getGptDomain(domain, goodsDonSku);
  147. log.info("domain:{},用户:{},所在车次:{},座位id:{},在{}获取跳转GPT镜像的登录url", DOMAIN, userId, groupsTrips.getId(), relationId, DateTime.now());
  148. return DOMAIN + "/auth/logintoken?carid=" + carId + "&usertoken=" + chatgptUser.getUserToken();
  149. } else {
  150. throw BusinessRuntimeException.getInstance("服务器出了点问题");
  151. }
  152. }
  153. /**
  154. * 根据userToken获取车队登录url
  155. */
  156. @Override
  157. public String getCarLoginUrlWithToken(String domain, String userToken, String carId) {
  158. ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
  159. if (chatgptUser != null) {
  160. ChatgptUserTokenPrepare chatgptUserTokenPrepare = chatgptUserTokenPrepareMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserTokenPrepare.class)
  161. .eq(ChatgptUserTokenPrepare::getUserToken, userToken)
  162. .last("limit 1"));
  163. Long skuId = chatgptUserTokenPrepare.getSkuId();
  164. GoodsDonSku goodsDonSku = skuMapper.selectById(skuId);
  165. String DOMAIN = getGptDomain(domain, goodsDonSku);
  166. log.info("domain:{},渠道用户:{},在{}获取跳转GPT镜像的登录url", DOMAIN, userToken, DateTime.now());
  167. return DOMAIN + "/auth/logintoken?carid=" + carId + "&usertoken=" + chatgptUser.getUserToken();
  168. } else {
  169. throw BusinessRuntimeException.getInstance("服务出了点问题");
  170. }
  171. }
  172. /**
  173. * 获取车位信息
  174. *
  175. * @param userId
  176. * @param relationId
  177. * @return
  178. */
  179. private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
  180. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  181. GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
  182. if (groupsRelation == null) {
  183. throw BusinessRuntimeException.getInstance("车票不存在");
  184. }
  185. return groupsRelation;
  186. }
  187. /**
  188. * 获取车队信息
  189. *
  190. * @param groupsRelation
  191. * @return
  192. */
  193. private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
  194. GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
  195. if (groupsTrips == null) {
  196. throw BusinessRuntimeException.getInstance("车队异常");
  197. }
  198. return groupsTrips;
  199. }
  200. private ChatgptUser getChatgptUser(Long userId, Long relationId, GroupsRelation groupsRelation, GroupsTrips groupsTrips, GoodsDonSku goodsDonSku) {
  201. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
  202. User user = userMapper.selectById(userId);
  203. if (chatgptUser == null) {
  204. chatgptUser = createChatgptUser(groupsRelation, groupsTrips, user, goodsDonSku);
  205. } else {
  206. updateChatgptUser(groupsRelation, user, chatgptUser);
  207. }
  208. return chatgptUser;
  209. }
  210. private ChatgptUser getChatgptCarUser(Long userId, Long relationId, GroupsRelation groupsRelation, GoodsDonSku goodsDonSku) {
  211. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
  212. User user = userMapper.selectById(userId);
  213. if (chatgptUser == null) {
  214. chatgptUser = createChatgptUser(groupsRelation, null, user, goodsDonSku);
  215. } else {
  216. updateChatgptUser(groupsRelation, user, chatgptUser);
  217. }
  218. return chatgptUser;
  219. }
  220. /**
  221. * 创建chatgptUser
  222. */
  223. private synchronized ChatgptUser createChatgptUser(GroupsRelation groupsRelation, GroupsTrips groupsTrips, User user, GoodsDonSku goodsDonSku) {
  224. ChatgptUser chatgptUser = new ChatgptUser();
  225. if (goodsDonSku.getIsCar()) {
  226. chatgptUser.setIsCar(true);
  227. chatgptUser.setLimitNum(goodsDonSku.getGptLimitNum());
  228. chatgptUser.setLimitTime(goodsDonSku.getGptLimitTime());
  229. }
  230. try {
  231. chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
  232. chatgptUser.setIsPlus(1);
  233. chatgptUser.setName(user.getNickname());
  234. chatgptUser.setImg(getWxImg(user.getHeadimgurl(), user));
  235. chatgptUser.setRelationId(groupsRelation.getId());
  236. chatgptUser.setUserToken(UUID.randomUUID().toString());
  237. chatgptUserMapper.insert(chatgptUser);
  238. //是否是大学生限时车队
  239. Date expiryTime = groupsRelation.getExpiryTime();
  240. Date startTime = groupsRelation.getStartTime();
  241. //大学生站 1天免费试用
  242. if (DateUtil.between(startTime, expiryTime, DateUnit.DAY) <= 1) {
  243. CollegeStudentStationUseTicketRecord useTicketRecord = new CollegeStudentStationUseTicketRecord();
  244. useTicketRecord.setUserId(user.getId());
  245. useTicketRecord.setUserToken(chatgptUser.getUserToken());
  246. collegeStudentStationUseTicketRecordMapper.insert(useTicketRecord);
  247. }
  248. } catch (DuplicateKeyException e) {
  249. log.error("重复插入镜像用户:{}token,errmsg:{}", user.getNickname(), StringUtil.getErrorText(e));
  250. }
  251. return chatgptUser;
  252. }
  253. /**
  254. * 创建chatgptUser 无需车队
  255. */
  256. public ChatgptUser generateChatGptUserUnderPrepare(ChatgptUserTokenPrepare prepare) {
  257. ChatgptUser chatgptUser = new ChatgptUser();
  258. GoodsDonSku goodsDonSku = skuMapper.selectById(prepare.getSkuId());
  259. if (goodsDonSku == null) {
  260. throw BusinessRuntimeException.getInstance("车队规格不存在,请联系客服..");
  261. }
  262. if (goodsDonSku.getIsCar()) {
  263. chatgptUser.setIsCar(true);
  264. chatgptUser.setLimitNum(goodsDonSku.getGptLimitNum());
  265. chatgptUser.setLimitTime(goodsDonSku.getGptLimitTime());
  266. }
  267. try {
  268. chatgptUser.setExpireTime(DateUtil.offsetMonth(DateTime.now(), goodsDonSku.getMonths()));
  269. chatgptUser.setIsPlus(1);
  270. chatgptUser.setName(prepare.getName());
  271. chatgptUser.setImg(prepare.getImg());
  272. chatgptUser.setUserToken(prepare.getUserToken());
  273. chatgptUserMapper.insert(chatgptUser);
  274. prepare.setStatus(true);
  275. chatgptUserTokenPrepareMapper.updateById(prepare);
  276. log.info("用户激活userToken:{}成功", prepare.getUserToken());
  277. } catch (DuplicateKeyException e) {
  278. log.error("重复插入镜像车队用户:{}token,errmsg:{}" + chatgptUser.getId(), StringUtil.getErrorText(e));
  279. }
  280. return chatgptUser;
  281. }
  282. private void updateChatgptUser(GroupsRelation groupsRelation, User user, ChatgptUser chatgptUser) {
  283. chatgptUser.setName(user.getNickname());
  284. chatgptUser.setImg(getWxImg(user.getHeadimgurl(), user));
  285. chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
  286. chatgptUserMapper.updateById(chatgptUser);
  287. }
  288. /**
  289. * 更换wx头像至oss
  290. */
  291. private String getWxImg(String headimgurl, User user) {
  292. if (headimgurl.contains("thirdwx.qlogo.cn")) {
  293. try {
  294. byte[] body = HttpUtil.downloadBytes(headimgurl);
  295. Path tempFile = Files.createTempFile("wxheadimg-" + user.getId(), ".jpeg");
  296. try (FileImageOutputStream imageOutput = new FileImageOutputStream(tempFile.toFile())) {
  297. imageOutput.write(body, 0, body.length);
  298. }
  299. Map<String, Object> paramMap = new HashMap<>();
  300. paramMap.put("file", tempFile.toFile());
  301. JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
  302. return result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl");
  303. } catch (Exception ex) {
  304. log.error("上传微信头像错误!msg:{}", StringUtil.getErrorText(ex));
  305. return "./avatars.png";
  306. }
  307. } else {
  308. return user.getHeadimgurl();
  309. }
  310. }
  311. @Override
  312. public ChatgptUser findByUserTokenAndExpireTimeAfter(String userToken, LocalDateTime now) {
  313. return chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken).gt(ChatgptUser::getExpireTime, now));
  314. }
  315. /**
  316. * 获取指定用户ID在滑动窗口内的提问次数
  317. *
  318. * @param userToken 用户token
  319. * @return 滑动窗口内的请求次数
  320. */
  321. @Override
  322. public Long getConversationCount(String userToken, Long limitTime) {
  323. try {
  324. String res = HttpUtil.get("http://154.198.213.52:9611/getConversationCount?userToken=" + userToken);
  325. return new JSONObject(res).getLong("count");
  326. }catch (Exception e){
  327. return 0L;
  328. }
  329. }
  330. public JSONObject getConversationCount(String userToken) {
  331. try {
  332. String res = HttpUtil.get("http://154.198.213.52:9611/getConversationCount?userToken=" + userToken);
  333. return new JSONObject(res);
  334. }catch (Exception e){
  335. return new JSONObject("{\"count\": 0,\"o1_mini\": 0,\"o1_p\": 0}");
  336. }
  337. }
  338. @Override
  339. public ChatgptSession checkSession(String carId) {
  340. ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getCarId, carId).eq(ChatgptSession::getIsCar, true).last(" limit 1"));
  341. if (chatgptSession == null) {
  342. throw BusinessRuntimeException.getInstance("车队不存在");
  343. }
  344. return chatgptSession;
  345. }
  346. private Long carOaiLimit(String carId, Boolean isTeam) {
  347. if(isTeam && redisService.hasKey("chatgpt:team:clears_in:" + carId)){
  348. return redisService.getExpire("chatgpt:team:clears_in:" + carId);
  349. }
  350. if (redisService.hasKey("chatgpt:clears_in:" + carId)) {
  351. return redisService.getExpire("chatgpt:clears_in:" + carId);
  352. }
  353. return 0L;
  354. }
  355. @Override
  356. public Boolean checkCarAccount(long userId, Long relationId) {
  357. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  358. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  359. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  360. if (goodsDonSku != null && goodsDonSku.getGoodsId() == 18 && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  361. ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
  362. return true;
  363. } else {
  364. return false;
  365. }
  366. }
  367. @Override
  368. public Boolean checkCarAccountWithToken(String userToken) {
  369. ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
  370. return chatgptUser != null;
  371. }
  372. @Override
  373. public ChatgptUser getCarChatGptUser(long userId, Long relationId) {
  374. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  375. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  376. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  377. if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  378. return getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
  379. }
  380. return null;
  381. }
  382. @Override
  383. public ChatgptUser getCarChatGptUserWithToken(String userToken) {
  384. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken).last(" limit 1"));
  385. if (chatgptUser == null) {
  386. //是否是用户token预备账号
  387. ChatgptUserTokenPrepare chatgptUserTokenPrepare = chatgptUserTokenPrepareMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserTokenPrepare.class)
  388. .eq(ChatgptUserTokenPrepare::getUserToken, userToken).last("limit 1"));
  389. if (chatgptUserTokenPrepare != null) {
  390. chatgptUser = generateChatGptUserUnderPrepare(chatgptUserTokenPrepare);
  391. }
  392. }
  393. if (chatgptUser != null) {
  394. if(!chatgptUser.getIsCar()){
  395. throw BusinessRuntimeException.getInstance("您非车队用户,请购买车队套餐");
  396. }
  397. if (chatgptUser.getRelationId() != null) {
  398. throw BusinessRuntimeException.getInstance("非渠道用户,请通过官网登录!");
  399. }
  400. return chatgptUser;
  401. }
  402. return null;
  403. }
  404. /**
  405. * 获取车队分页信息
  406. */
  407. @Override
  408. public SearchResult<ChatgptCarInfoView> getCarInfoPage(String userToken, Integer limit) {
  409. SearchResult<ChatgptCarInfoView> chatgptCarInfoViews = beanSearcher.search(ChatgptCarInfoView.class, MapUtils.flatBuilder(request.getParameterMap())
  410. .orderBy(ChatgptCarInfoView::getSort).asc()
  411. .orderBy(ChatgptCarInfoView::getTeamClearsIn).asc()
  412. .orderBy(ChatgptCarInfoView::getClearsIn).asc().orderBy(ChatgptCarInfoView::getScore).asc().build());
  413. if (chatgptCarInfoViews != null) {
  414. chatgptCarInfoViews.getDataList().forEach(this::buildChatgptCarInfoView);
  415. }
  416. return chatgptCarInfoViews;
  417. }
  418. /**
  419. * 获取车队信息
  420. */
  421. @Override
  422. public List<ChatgptCarInfoView> getCarInfoList(String userToken, Integer limit, Boolean isPlus) {
  423. List<ChatgptCarInfoView> lowestScoreFleets = getLowestScoreFleets(limit, isPlus);
  424. return lowestScoreFleets;
  425. }
  426. // 获取得分最低的N个车队的方法
  427. public List<ChatgptCarInfoView> getLowestScoreFleets(int count, Boolean isPlus) {
  428. List<ChatgptCarInfoView> chatgptCarInfoViews = beanSearcher.searchList(ChatgptCarInfoView.class, MapUtils.builder().field(ChatgptCarInfoView::getIsPlus, isPlus).orderBy(ChatgptCarInfoView::getScore).asc().limit(0, count).build());
  429. chatgptCarInfoViews.forEach(this::buildChatgptCarInfoView);
  430. return chatgptCarInfoViews;
  431. }
  432. // 构建ChatgptCarInfoView对象
  433. private ChatgptCarInfoView buildChatgptCarInfoView(ChatgptCarInfoView view) {
  434. // 在这里根据carId获取相关信息并填充到ChatgptCarInfoView对象中
  435. view.setStatus(view.getScore() >= 100 ? "繁忙" : "空闲"); // 或“繁忙”
  436. if(view.getCarName().contains("T")){
  437. view.setType("Team");
  438. Long team = view.getTeamClearsIn();
  439. if (team != 0L) {
  440. view.setTeamExpTime(new DateTime(System.currentTimeMillis() + team * 1000));
  441. }
  442. Long aLong = view.getClearsIn();
  443. if (aLong != 0L) {
  444. view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
  445. }
  446. if (view.getExpTime() != null && view.getTeamExpTime() != null) {
  447. view.setStatus("全部停运");
  448. }else if(view.getExpTime() != null || view.getTeamExpTime() != null) {
  449. view.setStatus("部分停运");
  450. }
  451. }else {
  452. view.setType("Plus");
  453. Long aLong = view.getClearsIn();
  454. if (aLong != 0L) {
  455. view.setStatus("停运");
  456. view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
  457. }
  458. }
  459. view.setScore(Math.min(BigDecimal.valueOf(view.getScore()).multiply(BigDecimal.valueOf(0.5)).setScale(0, RoundingMode.DOWN).doubleValue(), 200));
  460. return view;
  461. }
  462. @Override
  463. public ChatGptUserView getUserInfo(long userId, Long relationId) {
  464. if (checkCarAccount(userId, relationId)) {
  465. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  466. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  467. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  468. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
  469. Integer count = upgradePackageMapper.selectCount(Wrappers.lambdaQuery(UpgradePackage.class).apply("JSON_CONTAINS(sku_ids,'\"" + groupsTrips.getSkuId() + "\"')")
  470. .gt(UpgradePackage::getNum, chatgptUser.getLimitNum())
  471. .eq(UpgradePackage::getStatus, Boolean.TRUE)
  472. .eq(UpgradePackage::getGptType, 0)
  473. .eq(UpgradePackage::getDeleted, Boolean.TRUE));
  474. Boolean upgrade = count > 0 ? true : false;
  475. OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
  476. .eq(OrderDon::getRelationId, relationId)
  477. .eq(OrderDon::getUserId, groupsRelation.getUserId())
  478. .eq(OrderDon::getOrderType, 1)
  479. .notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
  480. .orderByDesc(OrderDon::getId)
  481. .last("limit 1"));
  482. Long orderId = null;
  483. if (orderDon != null) {
  484. orderId = orderDon.getId();
  485. }
  486. BigDecimal packagePrice = null;
  487. if (chatgptUser.getPackageId() != 0) {
  488. UpgradePackage upgradePackage = upgradePackageMapper.selectById(chatgptUser.getPackageId());
  489. packagePrice = upgradePackage.getPrice();
  490. }
  491. JSONObject conversationCount = getConversationCount(chatgptUser.getUserToken());
  492. ChatGptUserView view = ChatGptUserView.builder()
  493. .skuName(goodsDonSku.getSubTitle())
  494. .specVal(goodsDonSku.getSpecVal())
  495. .expireTime(chatgptUser.getExpireTime())
  496. .limitNum(chatgptUser.getLimitNum())
  497. .limitTime(chatgptUser.getLimitTime())
  498. .upgrade(upgrade)
  499. .orderId(orderId)
  500. .goodsId(goodsDonSku.getGoodsId())
  501. .skuId(goodsDonSku.getId())
  502. .months(goodsDonSku.getMonths())
  503. .use(Math.min(chatgptUser.getLimitNum(), Optional.ofNullable(conversationCount.getLong("count")).orElse(0L)))
  504. .packageId(chatgptUser.getPackageId())
  505. .packagePrice(packagePrice)
  506. .isRenewPackage(chatgptUser.getRenewOrderId() != null ? true : false)
  507. .renewSkuId(chatgptUser.getRenewSkuId())
  508. .renewOrderId(chatgptUser.getRenewOrderId())
  509. .build();
  510. if (chatgptUser.getLimitNum() > 20) {
  511. view.setO1PUse(Optional.ofNullable(conversationCount.getLong("o1_p")).orElse(0L));
  512. view.setO1MiniUse(Optional.ofNullable(conversationCount.getLong("o1_mini")).orElse(0L));
  513. }
  514. return view;
  515. } else {
  516. throw BusinessRuntimeException.getInstance("您还未购买该车票");
  517. }
  518. }
  519. @Override
  520. public ChatGptUserView getUserInfoWithToken(String userToken) {
  521. if (checkCarAccountWithToken(userToken)) {
  522. ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
  523. return ChatGptUserView.builder()
  524. .skuName("")
  525. .expireTime(chatgptUser.getExpireTime())
  526. .limitNum(chatgptUser.getLimitNum())
  527. .limitTime(chatgptUser.getLimitTime())
  528. .use(getConversationCount(chatgptUser.getUserToken(), chatgptUser.getLimitTime()))
  529. .build();
  530. } else {
  531. throw BusinessRuntimeException.getInstance("您还未购买该车票");
  532. }
  533. }
  534. public String getGptDomain(String domain, GoodsDonSku goodsDonSku) {
  535. String DOMAIN = domain;
  536. if (StrUtil.isEmpty(DOMAIN)) {
  537. DOMAIN = "https://chat.galaxydvd.com";
  538. try {
  539. SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, goodsDonSku != null && goodsDonSku.getId() == 444 ? "zhihu_gpt_domain" : "mirror_gpt_domain"));
  540. if (sysConfig != null) {
  541. String sysValue = sysConfig.getSysValue();
  542. if (JSONUtil.isJsonArray(sysValue)) {
  543. List<String> domainList = JSONUtil.parseArray(sysValue).toList(String.class);
  544. DOMAIN = domainList.get(RandomUtil.randomInt(domainList.size()));
  545. }
  546. }
  547. } catch (Exception e) {
  548. log.error("随机抽取域名错误. msg:{}", StringUtil.getErrorText(e));
  549. }
  550. }
  551. return DOMAIN;
  552. }
  553. }