ChatGptAccountServiceImpl.java 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. package com.cyksj.service.chatgpt.impl;
  2. import cn.hutool.core.date.DateField;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUnit;
  5. import cn.hutool.core.date.DateUtil;
  6. import cn.hutool.core.io.FileUtil;
  7. import cn.hutool.core.lang.UUID;
  8. import cn.hutool.core.util.RandomUtil;
  9. import cn.hutool.core.util.StrUtil;
  10. import cn.hutool.http.HttpRequest;
  11. import cn.hutool.http.HttpResponse;
  12. import cn.hutool.http.HttpUtil;
  13. import cn.hutool.http.Method;
  14. import cn.hutool.json.JSONObject;
  15. import cn.hutool.json.JSONUtil;
  16. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  17. import com.cyksj.common.constant.Constant;
  18. import com.cyksj.common.exception.BusinessRuntimeException;
  19. import com.cyksj.common.snowflake.Sequence;
  20. import com.cyksj.common.util.Jsons;
  21. import com.cyksj.common.util.SmsUtil;
  22. import com.cyksj.common.util.StringUtil;
  23. import com.cyksj.dto.RedisKey;
  24. import com.cyksj.mapper.*;
  25. import com.cyksj.mapper.station.CollegeStudentStationUseTicketRecordMapper;
  26. import com.cyksj.model.dto.ChatgptUserVerifyDto;
  27. import com.cyksj.model.entity.*;
  28. import com.cyksj.model.views.ChatGptUserView;
  29. import com.cyksj.model.views.ChatgptCarInfoView;
  30. import com.cyksj.redis.RedisService;
  31. import com.cyksj.service.chatgpt.ChatGptAccountService;
  32. import com.cyksj.service.sys.SysConfigService;
  33. import com.cyksj.service.user.UserBindRelationService;
  34. import com.ejlchina.searcher.BeanSearcher;
  35. import com.ejlchina.searcher.SearchResult;
  36. import com.ejlchina.searcher.util.MapUtils;
  37. import lombok.RequiredArgsConstructor;
  38. import lombok.extern.slf4j.Slf4j;
  39. import org.apache.commons.lang3.StringUtils;
  40. import org.springframework.beans.factory.annotation.Value;
  41. import org.springframework.dao.DuplicateKeyException;
  42. import org.springframework.stereotype.Service;
  43. import org.springframework.transaction.annotation.Transactional;
  44. import javax.imageio.stream.FileImageOutputStream;
  45. import javax.servlet.http.HttpServletRequest;
  46. import java.math.BigDecimal;
  47. import java.math.RoundingMode;
  48. import java.nio.file.Files;
  49. import java.nio.file.Path;
  50. import java.time.LocalDateTime;
  51. import java.util.*;
  52. /**
  53. * @author chan
  54. * @date 2024/3/19 11:01
  55. */
  56. @Service
  57. @Slf4j
  58. @RequiredArgsConstructor
  59. public class ChatGptAccountServiceImpl implements ChatGptAccountService {
  60. @Value("${chatgpt.domain}")
  61. private String GPT_DOMAIN;
  62. @Value("${chatgpt.car.domain}")
  63. private String CAR_GPT_DOMAIN;
  64. private static final String GPT_PROXY = "https://chat-chan-87jztgkf257d.xyhelper.org";
  65. private static final String RESTRICTION_URL = "https://nf.video/bind/web/validating";
  66. private final static Sequence SEQUENCE = new Sequence(0);
  67. private final RedisService redisService;
  68. private final ChatgptUserMapper chatgptUserMapper;
  69. private final ChatgptSessionMapper chatgptSessionMapper;
  70. private final GroupsRelationMapper groupsRelationMapper;
  71. private final GroupsMapper groupsMapper;
  72. private final GoodsDonSkuMapper skuMapper;
  73. private final UserMapper userMapper;
  74. private final UserBindRelationService userBindRelationService;
  75. private final AccountMapper accountMapper;
  76. private final BeanSearcher beanSearcher;
  77. private final ChatgptUserTokenPrepareMapper chatgptUserTokenPrepareMapper;
  78. private final CollegeStudentStationUseTicketRecordMapper collegeStudentStationUseTicketRecordMapper;
  79. private final UpgradePackageMapper upgradePackageMapper;
  80. private final OrderDonMapper orderDonMapper;
  81. private final SysConfigService sysConfigService;
  82. private final HttpServletRequest request;
  83. private final ChatgptTrialRecordMapper chatgptTrialRecordMapper;
  84. private final ChatgptUserRestrictionMapper chatgptUserRestrictionMapper;
  85. private final MidjourneyUserMapper midjourneyUserMapper;
  86. private final ClaudeUserMapper claudeUserMapper;
  87. private final LumaUserMapper lumaUserMapper;
  88. private final GrokUserMapper grokUserMapper;
  89. @Override
  90. public String getGptSession(String account, String password) {
  91. String officialSession = "";
  92. try {
  93. Account at = new Account();
  94. at.setAccount(account);
  95. at.setPassword(password);
  96. JSONObject loginResult = getLoginResult(at);
  97. String str = loginResult.getStr("detail");
  98. if (StringUtils.isNotBlank(str)) {
  99. throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + str);
  100. }
  101. officialSession = loginResult.toString();
  102. } catch (Exception e) {
  103. throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + e.getMessage());
  104. }
  105. return officialSession;
  106. }
  107. @Override
  108. public void clearGptNum(Long relationId) throws Exception {
  109. HttpRequest request = new HttpRequest("https://saas.galaxyva.com/cleanUserTokenLimit?relationId=" + relationId);
  110. HttpResponse execute = request.method(Method.GET).setConnectionTimeout(3000).timeout(3000).execute();
  111. String body = execute.body();
  112. JSONObject re = Jsons.parseObject(body, JSONObject.class);
  113. if (!body.contains("成功")) {
  114. throw BusinessRuntimeException.getInstance(re.getStr("message"));
  115. }
  116. }
  117. @Override
  118. public void gptSwitchModel(long userId, Long relationId) {
  119. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  120. Integer count = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
  121. .in(GroupsRelation::getUserId, userIdList)
  122. .eq(GroupsRelation::getId, relationId));
  123. if (count > 0) {
  124. Optional.ofNullable(chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
  125. .eq(ChatgptUser::getRelationId, relationId)
  126. .last("limit 1"))).ifPresent(cu -> {
  127. cu.setModel(cu.getModel() == 0 ? 1 : 0);
  128. chatgptUserMapper.updateById(cu);
  129. });
  130. }
  131. }
  132. /**
  133. * 获取登录结果
  134. *
  135. * @param account
  136. * @return
  137. * @throws Exception
  138. */
  139. private JSONObject getLoginResult(Account account) throws Exception {
  140. HttpRequest request = new HttpRequest(GPT_PROXY + "/applelogin");
  141. request.form("username", account.getAccount());
  142. request.form("password", account.getPassword());
  143. request.header("Content-Type", "application/x-www-form-urlencoded");
  144. request.header("X-Requested-With", "xyhelper");
  145. HttpResponse execute = request.method(Method.POST).execute();
  146. String body = execute.body();
  147. log.info("登录返回token res:{}", body);
  148. return new JSONObject(body);
  149. }
  150. /**
  151. * 获取登录url
  152. *
  153. * @param userId
  154. * @param relationId
  155. * @return
  156. */
  157. @Override
  158. public String getLoginUrl(Long userId, Long relationId) {
  159. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  160. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  161. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  162. log.info("用户:{},所在车次:{},座位id:{},在{}获取跳转GPT镜像的登录url", userId, groupsTrips.getId(), relationId, DateTime.now());
  163. if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
  164. ChatgptUser chatgptUser = getChatgptUser(userId, relationId, groupsRelation, groupsTrips, goodsDonSku);
  165. if (214610L == relationId) {
  166. return "https://cdn.galaxydvd.com/login_token?access_token=" + chatgptUser.getUserToken();
  167. }
  168. return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
  169. } else {
  170. throw BusinessRuntimeException.getInstance("服务器出了点问题");
  171. }
  172. }
  173. /**
  174. * 获取车队登录url
  175. *
  176. * @param userId
  177. * @param carId
  178. * @return
  179. */
  180. @Override
  181. public String getCarLoginUrl(String domain, Long userId, Long relationId, String carId) {
  182. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  183. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  184. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  185. if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  186. ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
  187. String DOMAIN = getGptDomain(domain, goodsDonSku);
  188. log.info("domain:{},用户:{},所在车次:{},座位id:{},在{}获取跳转GPT镜像的登录url", DOMAIN, userId, groupsTrips.getId(), relationId, DateTime.now());
  189. //另外一版镜像gpt
  190. SysConfig gptNewDomain = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
  191. .eq(SysConfig::getSysKey, "mirror_gpt_new_domain")
  192. .last("limit 1"));
  193. Boolean isNewGptDomain = false;
  194. if (gptNewDomain != null) {
  195. String sysValue = gptNewDomain.getSysValue();
  196. if (JSONUtil.isJsonArray(sysValue)) {
  197. List<String> domainList = JSONUtil.parseArray(sysValue).toList(String.class);
  198. if (domainList.contains(DOMAIN)) {
  199. isNewGptDomain = true;
  200. }
  201. }
  202. }
  203. return DOMAIN + (isNewGptDomain || DOMAIN.equals("https://gpt.bestaistore.com") || DOMAIN.equals("https://oai.liuliangbang.vip") ? "/codetoken?logintoken=" + chatgptUser.getUserToken() : "/auth/logintoken?carid=" + carId + "&usertoken=" + chatgptUser.getUserToken() );
  204. } else {
  205. throw BusinessRuntimeException.getInstance("服务器出了点问题");
  206. }
  207. }
  208. /**
  209. * 根据userToken获取车队登录url
  210. */
  211. @Override
  212. public String getCarLoginUrlWithToken(String domain, String userToken, String carId) {
  213. ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
  214. if (chatgptUser != null) {
  215. ChatgptUserTokenPrepare chatgptUserTokenPrepare = chatgptUserTokenPrepareMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserTokenPrepare.class)
  216. .eq(ChatgptUserTokenPrepare::getUserToken, userToken)
  217. .last("limit 1"));
  218. Long skuId = chatgptUserTokenPrepare.getSkuId();
  219. GoodsDonSku goodsDonSku = skuMapper.selectById(skuId);
  220. String DOMAIN = getGptDomain(domain, goodsDonSku);
  221. log.info("domain:{},渠道用户:{},在{}获取跳转GPT镜像的登录url", DOMAIN, userToken, DateTime.now());
  222. return DOMAIN + "/auth/logintoken?carid=" + carId + "&usertoken=" + chatgptUser.getUserToken();
  223. } else {
  224. throw BusinessRuntimeException.getInstance("服务出了点问题");
  225. }
  226. }
  227. /**
  228. * 获取车位信息
  229. *
  230. * @param userId
  231. * @param relationId
  232. * @return
  233. */
  234. private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
  235. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  236. GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
  237. if (groupsRelation == null) {
  238. throw BusinessRuntimeException.getInstance("车票不存在");
  239. }
  240. return groupsRelation;
  241. }
  242. /**
  243. * 获取车队信息
  244. *
  245. * @param groupsRelation
  246. * @return
  247. */
  248. private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
  249. GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
  250. if (groupsTrips == null) {
  251. throw BusinessRuntimeException.getInstance("车队异常");
  252. }
  253. return groupsTrips;
  254. }
  255. private ChatgptUser getChatgptUser(Long userId, Long relationId, GroupsRelation groupsRelation, GroupsTrips groupsTrips, GoodsDonSku goodsDonSku) {
  256. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
  257. User user = userMapper.selectById(userId);
  258. if (chatgptUser == null) {
  259. chatgptUser = createChatgptUser(groupsRelation, groupsTrips, user, goodsDonSku);
  260. } else {
  261. updateChatgptUser(groupsRelation, user, chatgptUser);
  262. }
  263. return chatgptUser;
  264. }
  265. private ChatgptUser getChatgptCarUser(Long userId, Long relationId, GroupsRelation groupsRelation, GoodsDonSku goodsDonSku) {
  266. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
  267. User user = userMapper.selectById(userId);
  268. if (chatgptUser == null) {
  269. chatgptUser = createChatgptUser(groupsRelation, null, user, goodsDonSku);
  270. } else {
  271. updateChatgptUser(groupsRelation, user, chatgptUser);
  272. }
  273. return chatgptUser;
  274. }
  275. /**
  276. * 创建chatgptUser
  277. */
  278. private synchronized ChatgptUser createChatgptUser(GroupsRelation groupsRelation, GroupsTrips groupsTrips, User user, GoodsDonSku goodsDonSku) {
  279. ChatgptUser chatgptUser = new ChatgptUser();
  280. if (goodsDonSku.getIsCar()) {
  281. chatgptUser.setIsCar(true);
  282. chatgptUser.setLimitNum(goodsDonSku.getGptLimitNum());
  283. chatgptUser.setLimitTime(goodsDonSku.getGptLimitTime());
  284. chatgptUser.setDsLimitTime(goodsDonSku.getDsLimitTime());
  285. chatgptUser.setDsLimitNum(goodsDonSku.getDsLimitNum());
  286. chatgptUser.setOtherLimitNum(goodsDonSku.getOtherLimitNum());
  287. chatgptUser.setOtherLimitTime(goodsDonSku.getOtherLimitTime());
  288. chatgptUser.setGptThink(goodsDonSku.getGptThink());
  289. chatgptUser.setGptThinkLimitTime(goodsDonSku.getGptThinkLimitTime());
  290. chatgptUser.setGptPro(goodsDonSku.getGptPro());
  291. chatgptUser.setGptProLimitTime(goodsDonSku.getGptProLimitTime());
  292. chatgptUser.setGptDeepStyleLimit(goodsDonSku.getGptDeepStyleLimit());
  293. chatgptUser.setGptDeepStyleLimitTime(goodsDonSku.getGptDeepStyleLimitTime());
  294. }
  295. try {
  296. chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
  297. chatgptUser.setIsPlus(1);
  298. chatgptUser.setName(user.getNickname());
  299. chatgptUser.setImg(getWxImg(user.getHeadimgurl(), user));
  300. chatgptUser.setRelationId(groupsRelation.getId());
  301. chatgptUser.setUserToken(UUID.randomUUID().toString());
  302. chatgptUserMapper.insert(chatgptUser);
  303. //是否是大学生限时车队
  304. Date expiryTime = groupsRelation.getExpiryTime();
  305. Date startTime = groupsRelation.getStartTime();
  306. //大学生站 1天免费试用
  307. if (DateUtil.between(startTime, expiryTime, DateUnit.DAY) <= 1) {
  308. CollegeStudentStationUseTicketRecord useTicketRecord = new CollegeStudentStationUseTicketRecord();
  309. useTicketRecord.setUserId(user.getId());
  310. useTicketRecord.setUserToken(chatgptUser.getUserToken());
  311. collegeStudentStationUseTicketRecordMapper.insert(useTicketRecord);
  312. }
  313. } catch (DuplicateKeyException e) {
  314. log.error("重复插入镜像用户:{}token,errmsg:{}", user.getNickname(), StringUtil.getErrorText(e));
  315. }
  316. return chatgptUser;
  317. }
  318. /**
  319. * 创建chatgptUser 无需车队
  320. */
  321. public ChatgptUser generateChatGptUserUnderPrepare(ChatgptUserTokenPrepare prepare) {
  322. ChatgptUser chatgptUser = new ChatgptUser();
  323. GoodsDonSku goodsDonSku = skuMapper.selectById(prepare.getSkuId());
  324. if (goodsDonSku == null) {
  325. throw BusinessRuntimeException.getInstance("车队规格不存在,请联系客服..");
  326. }
  327. if (goodsDonSku.getIsCar()) {
  328. chatgptUser.setIsCar(true);
  329. chatgptUser.setLimitNum(goodsDonSku.getGptLimitNum());
  330. chatgptUser.setLimitTime(goodsDonSku.getGptLimitTime());
  331. chatgptUser.setDsLimitNum(goodsDonSku.getDsLimitNum());
  332. chatgptUser.setDsLimitTime(goodsDonSku.getDsLimitTime());
  333. chatgptUser.setOtherLimitNum(goodsDonSku.getOtherLimitNum());
  334. chatgptUser.setOtherLimitTime(goodsDonSku.getOtherLimitTime());
  335. chatgptUser.setGptThink(goodsDonSku.getGptThink());
  336. chatgptUser.setGptThinkLimitTime(goodsDonSku.getGptThinkLimitTime());
  337. chatgptUser.setGptPro(goodsDonSku.getGptPro());
  338. chatgptUser.setGptProLimitTime(goodsDonSku.getGptProLimitTime());
  339. chatgptUser.setGptDeepStyleLimit(goodsDonSku.getGptDeepStyleLimit());
  340. chatgptUser.setGptDeepStyleLimitTime(goodsDonSku.getGptDeepStyleLimitTime());
  341. }
  342. try {
  343. chatgptUser.setExpireTime(DateUtil.offsetMonth(DateTime.now(), goodsDonSku.getMonths()));
  344. chatgptUser.setIsPlus(1);
  345. chatgptUser.setName(prepare.getName());
  346. chatgptUser.setImg(prepare.getImg());
  347. chatgptUser.setUserToken(prepare.getUserToken());
  348. chatgptUserMapper.insert(chatgptUser);
  349. prepare.setStatus(true);
  350. chatgptUserTokenPrepareMapper.updateById(prepare);
  351. log.info("用户激活userToken:{}成功", prepare.getUserToken());
  352. } catch (DuplicateKeyException e) {
  353. log.error("重复插入镜像车队用户:{}token,errmsg:{}" + chatgptUser.getId(), StringUtil.getErrorText(e));
  354. }
  355. return chatgptUser;
  356. }
  357. private void updateChatgptUser(GroupsRelation groupsRelation, User user, ChatgptUser chatgptUser) {
  358. chatgptUserMapper.update(null, Wrappers.lambdaUpdate(ChatgptUser.class)
  359. .set(ChatgptUser::getName, user.getNickname())
  360. .set(ChatgptUser::getImg, getWxImg(user.getHeadimgurl(), user))
  361. .set(ChatgptUser::getExpireTime, groupsRelation.getExpiryTime())
  362. .eq(ChatgptUser::getId, chatgptUser.getId())
  363. .eq(ChatgptUser::getRelationId, chatgptUser.getRelationId()));
  364. }
  365. /**
  366. * 更换wx头像至oss
  367. */
  368. private String getWxImg(String headimgurl, User user) {
  369. if (headimgurl.contains("thirdwx.qlogo.cn")) {
  370. try {
  371. byte[] body = HttpUtil.downloadBytes(headimgurl);
  372. Path tempFile = Files.createTempFile("wxheadimg-" + user.getId(), ".jpeg");
  373. try (FileImageOutputStream imageOutput = new FileImageOutputStream(tempFile.toFile())) {
  374. imageOutput.write(body, 0, body.length);
  375. }
  376. Map<String, Object> paramMap = new HashMap<>();
  377. paramMap.put("file", tempFile.toFile());
  378. JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
  379. FileUtil.del(tempFile);
  380. return result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl");
  381. } catch (Exception ex) {
  382. log.error("上传微信头像错误!msg:{}", StringUtil.getErrorText(ex));
  383. return "./avatars.png";
  384. }
  385. } else {
  386. return user.getHeadimgurl();
  387. }
  388. }
  389. @Override
  390. public ChatgptUser findByUserTokenAndExpireTimeAfter(String userToken, LocalDateTime now) {
  391. return chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken).gt(ChatgptUser::getExpireTime, now));
  392. }
  393. /**
  394. * 获取指定用户ID在滑动窗口内的提问次数
  395. *
  396. * @param userToken 用户token
  397. * @return 滑动窗口内的请求次数
  398. */
  399. @Override
  400. public Long getConversationCount(String userToken, Long limitTime) {
  401. try {
  402. String res = HttpUtil.get("http://154.198.213.52:9611/getConversationCount?userToken=" + userToken);
  403. return new JSONObject(res).getLong("count");
  404. }catch (Exception e){
  405. return 0L;
  406. }
  407. }
  408. public JSONObject getConversationCount(String userToken) {
  409. try {
  410. String res = HttpUtil.get("https://saas.galaxyva.com/getConversationCount?userToken=" + userToken, 5000);
  411. return new JSONObject(res);
  412. }catch (Exception e){
  413. return new JSONObject("{\"count\": 0,\"o1_mini\": 0,\"o1_p\": 0}");
  414. }
  415. }
  416. @Override
  417. public ChatgptSession checkSession(String carId) {
  418. ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getCarId, carId).eq(ChatgptSession::getIsCar, true).last(" limit 1"));
  419. if (chatgptSession == null) {
  420. throw BusinessRuntimeException.getInstance("车队不存在");
  421. }
  422. return chatgptSession;
  423. }
  424. private Long carOaiLimit(String carId, Boolean isTeam) {
  425. if(isTeam && redisService.hasKey("chatgpt:team:clears_in:" + carId)){
  426. return redisService.getExpire("chatgpt:team:clears_in:" + carId);
  427. }
  428. if (redisService.hasKey("chatgpt:clears_in:" + carId)) {
  429. return redisService.getExpire("chatgpt:clears_in:" + carId);
  430. }
  431. return 0L;
  432. }
  433. @Override
  434. public Boolean checkCarAccount(long userId, Long relationId) {
  435. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  436. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  437. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  438. if (goodsDonSku != null && goodsDonSku.getGoodsId() == 18 && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  439. ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
  440. return true;
  441. } else {
  442. return false;
  443. }
  444. }
  445. @Override
  446. public Boolean checkCarAccountWithToken(String userToken) {
  447. ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
  448. return chatgptUser != null;
  449. }
  450. @Override
  451. public ChatgptUser getCarChatGptUser(long userId, Long relationId) {
  452. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  453. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  454. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  455. if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  456. return getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
  457. }
  458. return null;
  459. }
  460. @Override
  461. public ChatgptUser getCarChatGptUserWithToken(String userToken) {
  462. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken).last(" limit 1"));
  463. if (chatgptUser == null) {
  464. //是否是用户token预备账号
  465. ChatgptUserTokenPrepare chatgptUserTokenPrepare = chatgptUserTokenPrepareMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserTokenPrepare.class)
  466. .eq(ChatgptUserTokenPrepare::getUserToken, userToken).last("limit 1"));
  467. if (chatgptUserTokenPrepare != null) {
  468. chatgptUser = generateChatGptUserUnderPrepare(chatgptUserTokenPrepare);
  469. }
  470. }
  471. if (chatgptUser != null) {
  472. if(!chatgptUser.getIsCar()){
  473. throw BusinessRuntimeException.getInstance("您非车队用户,请购买车队套餐");
  474. }
  475. if (chatgptUser.getRelationId() != null) {
  476. throw BusinessRuntimeException.getInstance("非渠道用户,请通过官网登录!");
  477. }
  478. return chatgptUser;
  479. }
  480. return null;
  481. }
  482. /**
  483. * 获取车队分页信息
  484. */
  485. @Override
  486. public SearchResult<ChatgptCarInfoView> getCarInfoPage(String userToken, Integer limit) {
  487. SearchResult<ChatgptCarInfoView> chatgptCarInfoViews = beanSearcher.search(ChatgptCarInfoView.class, MapUtils.flatBuilder(request.getParameterMap())
  488. .orderBy(ChatgptCarInfoView::getSort).asc()
  489. .orderBy(ChatgptCarInfoView::getTeamClearsIn).asc()
  490. .orderBy(ChatgptCarInfoView::getClearsIn).asc().orderBy(ChatgptCarInfoView::getScore).asc().build());
  491. if (chatgptCarInfoViews != null) {
  492. chatgptCarInfoViews.getDataList().forEach(this::buildChatgptCarInfoView);
  493. }
  494. return chatgptCarInfoViews;
  495. }
  496. /**
  497. * 获取车队信息
  498. */
  499. @Override
  500. public List<ChatgptCarInfoView> getCarInfoList(String userToken, Integer limit, Boolean isPlus) {
  501. List<ChatgptCarInfoView> lowestScoreFleets = getLowestScoreFleets(limit, isPlus);
  502. return lowestScoreFleets;
  503. }
  504. // 获取得分最低的N个车队的方法
  505. public List<ChatgptCarInfoView> getLowestScoreFleets(int count, Boolean isPlus) {
  506. List<ChatgptCarInfoView> chatgptCarInfoViews = beanSearcher.searchList(ChatgptCarInfoView.class, MapUtils.builder().field(ChatgptCarInfoView::getIsPlus, isPlus).orderBy(ChatgptCarInfoView::getScore).asc().limit(0, count).build());
  507. chatgptCarInfoViews.forEach(this::buildChatgptCarInfoView);
  508. return chatgptCarInfoViews;
  509. }
  510. // 构建ChatgptCarInfoView对象
  511. private ChatgptCarInfoView buildChatgptCarInfoView(ChatgptCarInfoView view) {
  512. // 在这里根据carId获取相关信息并填充到ChatgptCarInfoView对象中
  513. view.setStatus(view.getScore() >= 100 ? "繁忙" : "空闲"); // 或“繁忙”
  514. if(view.getCarName().contains("T")){
  515. view.setType("Team");
  516. Long team = view.getTeamClearsIn();
  517. if (team != 0L) {
  518. view.setTeamExpTime(new DateTime(System.currentTimeMillis() + team * 1000));
  519. }
  520. Long aLong = view.getClearsIn();
  521. if (aLong != 0L) {
  522. view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
  523. }
  524. if (view.getExpTime() != null && view.getTeamExpTime() != null) {
  525. view.setStatus("全部停运");
  526. }else if(view.getExpTime() != null || view.getTeamExpTime() != null) {
  527. view.setStatus("部分停运");
  528. }
  529. }else {
  530. view.setType("Plus");
  531. Long aLong = view.getClearsIn();
  532. if (aLong != 0L) {
  533. view.setStatus("停运");
  534. view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
  535. }
  536. }
  537. view.setScore(Math.min(BigDecimal.valueOf(view.getScore()).multiply(BigDecimal.valueOf(0.5)).setScale(0, RoundingMode.DOWN).doubleValue(), 200));
  538. return view;
  539. }
  540. @Override
  541. public ChatGptUserView getUserInfo(long userId, Long relationId) {
  542. if (checkCarAccount(userId, relationId)) {
  543. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  544. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  545. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  546. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
  547. Integer count = upgradePackageMapper.selectCount(Wrappers.lambdaQuery(UpgradePackage.class).apply("JSON_CONTAINS(sku_ids,'\"" + groupsTrips.getSkuId() + "\"')")
  548. .gt(UpgradePackage::getNum, chatgptUser.getLimitNum())
  549. .eq(UpgradePackage::getStatus, Boolean.TRUE)
  550. .eq(UpgradePackage::getGptType, 0)
  551. .eq(UpgradePackage::getDeleted, Boolean.TRUE));
  552. Boolean upgrade = count > 0 ? true : false;
  553. OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
  554. .eq(OrderDon::getRelationId, relationId)
  555. .eq(OrderDon::getUserId, groupsRelation.getUserId())
  556. .eq(OrderDon::getOrderType, 1)
  557. .notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
  558. .orderByDesc(OrderDon::getId)
  559. .last("limit 1"));
  560. Long orderId = null;
  561. if (orderDon != null) {
  562. orderId = orderDon.getId();
  563. }
  564. BigDecimal packagePrice = null;
  565. if (chatgptUser.getPackageId() != 0) {
  566. UpgradePackage upgradePackage = upgradePackageMapper.selectById(chatgptUser.getPackageId());
  567. packagePrice = upgradePackage.getPrice();
  568. }
  569. JSONObject conversationCount = getConversationCount(chatgptUser.getUserToken());
  570. ChatGptUserView view = ChatGptUserView.builder()
  571. .skuName(goodsDonSku.getSubTitle())
  572. .specVal(goodsDonSku.getSpecVal())
  573. .expireTime(chatgptUser.getExpireTime())
  574. .limitNum(chatgptUser.getLimitNum())
  575. .limitTime(chatgptUser.getLimitTime())
  576. .dsLimitNum(chatgptUser.getDsLimitNum())
  577. .dsLimitTime(chatgptUser.getDsLimitTime())
  578. .otherLimitNum(chatgptUser.getOtherLimitNum())
  579. .otherLimitTime(chatgptUser.getOtherLimitTime())
  580. .gptThink(chatgptUser.getGptThink())
  581. .gptThinkLimitTime(chatgptUser.getGptThinkLimitTime())
  582. .gptPro(chatgptUser.getGptPro())
  583. .gptProLimitTime(chatgptUser.getGptProLimitTime())
  584. .gptDeepStyleLimit(chatgptUser.getGptDeepStyleLimit())
  585. .gptDeepStyleLimitTime(chatgptUser.getGptDeepStyleLimitTime())
  586. .upgrade(upgrade)
  587. .orderId(orderId)
  588. .goodsId(goodsDonSku.getGoodsId())
  589. .skuId(goodsDonSku.getId())
  590. .months(goodsDonSku.getMonths())
  591. .use(Math.min(chatgptUser.getLimitNum(), Optional.ofNullable(conversationCount.getLong("count")).orElse(0L)))
  592. .packageId(chatgptUser.getPackageId())
  593. .packagePrice(packagePrice)
  594. .isRenewPackage(chatgptUser.getRenewOrderId() != null ? true : false)
  595. .renewSkuId(chatgptUser.getRenewSkuId())
  596. .renewOrderId(chatgptUser.getRenewOrderId())
  597. .model(chatgptUser.getModel())
  598. .userToken(chatgptUser.getUserToken())
  599. .build();
  600. if (view.getRenewSkuId() != null) {
  601. Optional.ofNullable(skuMapper.selectById(view.getRenewSkuId())).ifPresent(renewSuu -> view.setRenewSpecVal(renewSuu.getSpecVal()));
  602. }
  603. view.setOtherUse(Optional.ofNullable(conversationCount.getLong("other")).orElse(0L));
  604. view.setDpsUse(Optional.ofNullable(conversationCount.getLong("dps")).orElse(0L));
  605. //gpt think已使用次数
  606. view.setGptThinkUse(Optional.ofNullable(conversationCount.getLong("gptThinkCount")).orElse(0L));
  607. view.setGptDeepStyleUse(Optional.ofNullable(conversationCount.getLong("deepResearchCount")).orElse(0L));
  608. view.setGptDeepStyleUse(Optional.ofNullable(conversationCount.getLong("gptProCount")).orElse(0L));
  609. return view;
  610. } else {
  611. throw BusinessRuntimeException.getInstance("您还未购买该车票");
  612. }
  613. }
  614. @Override
  615. public ChatGptUserView getUserInfoWithToken(String userToken) {
  616. if (checkCarAccountWithToken(userToken)) {
  617. ChatgptUser chatgptUser = getCarChatGptUserWithToken(userToken);
  618. return ChatGptUserView.builder()
  619. .skuName("")
  620. .expireTime(chatgptUser.getExpireTime())
  621. .limitNum(chatgptUser.getLimitNum())
  622. .limitTime(chatgptUser.getLimitTime())
  623. .dsLimitNum(chatgptUser.getDsLimitNum())
  624. .dsLimitTime(chatgptUser.getDsLimitTime())
  625. .otherLimitNum(chatgptUser.getOtherLimitNum())
  626. .otherLimitTime(chatgptUser.getOtherLimitTime())
  627. .gptThink(chatgptUser.getGptThink())
  628. .gptThinkLimitTime(chatgptUser.getGptThinkLimitTime())
  629. .gptDeepStyleLimit(chatgptUser.getGptDeepStyleLimit())
  630. .gptDeepStyleLimitTime(chatgptUser.getGptDeepStyleLimitTime())
  631. .use(getConversationCount(chatgptUser.getUserToken(), chatgptUser.getLimitTime()))
  632. .build();
  633. } else {
  634. throw BusinessRuntimeException.getInstance("您还未购买该车票");
  635. }
  636. }
  637. public String getGptDomain(String domain, GoodsDonSku goodsDonSku) {
  638. String DOMAIN = domain;
  639. if (StrUtil.isEmpty(DOMAIN)) {
  640. DOMAIN = "https://chat.galaxydvd.com";
  641. try {
  642. SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, goodsDonSku != null && goodsDonSku.getId() == 444 ? "zhihu_gpt_domain" : "mirror_gpt_domain"));
  643. if (sysConfig != null) {
  644. String sysValue = sysConfig.getSysValue();
  645. if (JSONUtil.isJsonArray(sysValue)) {
  646. List<String> domainList = JSONUtil.parseArray(sysValue).toList(String.class);
  647. DOMAIN = domainList.get(RandomUtil.randomInt(domainList.size()));
  648. }
  649. }
  650. } catch (Exception e) {
  651. log.error("随机抽取域名错误. msg:{}", StringUtil.getErrorText(e));
  652. }
  653. }
  654. return DOMAIN;
  655. }
  656. @Override
  657. public String isRestrictions(String userToken, String referer, String userAgent) {
  658. //从redis 中查询该usertoken 当日使用次数
  659. DateTime now = DateTime.now();
  660. DateTime dateTime = DateUtil.beginOfDay(now.toJdkDate());
  661. DateTime endOfDayTime = DateUtil.endOfDay(now.toJdkDate());
  662. DateTime twelveHoursAgo = DateUtil.offset(now, DateField.HOUR, -6);
  663. ChatgptUserRestriction chatgptUserRestriction = chatgptUserRestrictionMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserRestriction.class)
  664. .eq(ChatgptUserRestriction::getUserToken, userToken)
  665. .ge(ChatgptUserRestriction::getCreatedTime, twelveHoursAgo.toString()).eq(ChatgptUserRestriction::getSuccess, false).last(" limit 1"));
  666. if (chatgptUserRestriction != null) {
  667. JSONObject result = new JSONObject();
  668. result.putOpt("url",chatgptUserRestriction.getUrl());
  669. result.putOpt("code",1);
  670. return result.toString();
  671. }
  672. String numStr = redisService.getStr(RedisKey.CHATGPT_USER_RESTRICTION + userToken);
  673. if (StringUtils.isNotBlank(numStr) && StringUtils.isNumeric(numStr)) {
  674. long num = Long.parseLong(numStr);
  675. if (num >= 150) {
  676. //触发限制,需要人机验证
  677. Integer count = chatgptUserRestrictionMapper.selectCount(Wrappers.lambdaQuery(ChatgptUserRestriction.class).eq(ChatgptUserRestriction::getUserToken, userToken)
  678. .ge(ChatgptUserRestriction::getCreatedTime, dateTime.toString()));
  679. if (count > 10) {
  680. chatgptUserMapper.update(null, Wrappers.lambdaUpdate(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken).set(ChatgptUser::getIsBlock, 1));
  681. }
  682. ChatgptUserRestriction restriction = new ChatgptUserRestriction();
  683. restriction.setRestrictionId(SEQUENCE.nextId().toString());
  684. restriction.setUrl(RESTRICTION_URL + "?restrictionId=" + restriction.getRestrictionId() + "&userToken=" + userToken);
  685. restriction.setUserToken(userToken);
  686. restriction.setUserAgent(userAgent);
  687. restriction.setReferer(referer);
  688. chatgptUserRestrictionMapper.insert(restriction);
  689. JSONObject result = new JSONObject();
  690. result.putOpt("url",restriction.getUrl());
  691. result.putOpt("code",1);
  692. return result.toString();
  693. }
  694. }
  695. JSONObject result = new JSONObject();
  696. result.putOpt("code",0);
  697. redisService.incr(RedisKey.CHATGPT_USER_RESTRICTION + userToken, 1L);
  698. long between = DateUtil.between(now, endOfDayTime, DateUnit.SECOND, true);
  699. redisService.expire(RedisKey.CHATGPT_USER_RESTRICTION + userToken, between);
  700. return result.toString();
  701. }
  702. @Override
  703. public Boolean gptRestrictionStatus(String userToken, String restrictionId) {
  704. ChatgptUserRestriction chatgptUserRestriction = chatgptUserRestrictionMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserRestriction.class)
  705. .eq(ChatgptUserRestriction::getUserToken, userToken)
  706. .eq(ChatgptUserRestriction::getRestrictionId, restrictionId)
  707. .last(" limit 1"));
  708. if (chatgptUserRestriction == null) {
  709. throw BusinessRuntimeException.getInstance("该验证异常.");
  710. }else {
  711. return chatgptUserRestriction.getSuccess();
  712. }
  713. }
  714. @Override
  715. public Boolean verifyRestriction(ChatgptUserVerifyDto chatgptUserVerifyDto) {
  716. SmsUtil.checkTencentCaptcha(chatgptUserVerifyDto.getTicket(), chatgptUserVerifyDto.getIp(), chatgptUserVerifyDto.getRandStr());
  717. // 清除一定次数,以及修改验证状态
  718. ChatgptUserRestriction chatgptUserRestriction = chatgptUserRestrictionMapper.selectOne(Wrappers.lambdaQuery(ChatgptUserRestriction.class)
  719. .eq(ChatgptUserRestriction::getUserToken, chatgptUserVerifyDto.getUserToken())
  720. .eq(ChatgptUserRestriction::getRestrictionId, chatgptUserVerifyDto.getRestrictionId())
  721. .eq(ChatgptUserRestriction::getSuccess, false)
  722. .last(" limit 1"));
  723. if (chatgptUserRestriction != null) {
  724. chatgptUserRestriction.setSuccess(true);
  725. chatgptUserRestriction.setVerifyUserAgent(chatgptUserVerifyDto.getUserAgent());
  726. chatgptUserRestriction.setSuccessTime(new Date());
  727. chatgptUserRestrictionMapper.updateById(chatgptUserRestriction);
  728. redisService.decr(RedisKey.CHATGPT_USER_RESTRICTION + chatgptUserVerifyDto.getUserToken(), 50L);
  729. }
  730. return true;
  731. }
  732. @Override
  733. @Transactional(rollbackFor = Exception.class)
  734. public String trialGpt(String clientIP, String trialToken, String userAgent) {
  735. if (StringUtils.isNotBlank(trialToken)) {
  736. ChatgptTrialRecord chatgptTrialRecord = chatgptTrialRecordMapper.selectOne(Wrappers.lambdaQuery(ChatgptTrialRecord.class).eq(ChatgptTrialRecord::getUserToken, trialToken).last(" limit 1"));
  737. if (chatgptTrialRecord != null) {
  738. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, trialToken));
  739. if (chatgptUser == null) {
  740. return "";
  741. }else {
  742. return chatgptUser.getUserToken();
  743. }
  744. }else {
  745. ChatgptUser chatgptUser = createTrialUser(clientIP);
  746. if(StringUtils.isBlank(chatgptUser.getUserToken())){
  747. return "";
  748. }
  749. chatgptTrialRecord = new ChatgptTrialRecord();
  750. chatgptTrialRecord.setIp(clientIP);
  751. chatgptTrialRecord.setUserToken(chatgptUser.getUserToken());
  752. chatgptTrialRecordMapper.insert(chatgptTrialRecord);
  753. return chatgptUser.getUserToken();
  754. }
  755. }
  756. ChatgptUser chatgptUser = createTrialUser(clientIP);
  757. if(StringUtils.isBlank(chatgptUser.getUserToken())){
  758. return "";
  759. }
  760. ChatgptTrialRecord chatgptTrialRecord = new ChatgptTrialRecord();
  761. chatgptTrialRecord.setIp(clientIP);
  762. chatgptTrialRecord.setUserToken(chatgptUser.getUserToken());
  763. chatgptTrialRecordMapper.insert(chatgptTrialRecord);
  764. return chatgptUser.getUserToken();
  765. }
  766. @Override
  767. public JSONObject getGptUseInfo(String userToken) {
  768. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
  769. .eq(ChatgptUser::getUserToken, userToken)
  770. .last("limit 1"));
  771. if (chatgptUser == null) {
  772. throw BusinessRuntimeException.getInstance("车票不存在");
  773. }
  774. Long relationId = chatgptUser.getRelationId();
  775. GroupsRelation relation = groupsRelationMapper.selectById(relationId);
  776. if (relation == null) {
  777. throw BusinessRuntimeException.getInstance("车票不存在");
  778. }
  779. try {
  780. String res = HttpUtil.get(String.format("https://image.yhlxj.com/api/getCount?usertoken=%s&limit=%s&time=%s&isVip=%s", userToken, chatgptUser.getLimitNum(), chatgptUser.getLimitTime(), relation.getIsVip()), 5000);
  781. return new JSONObject(res);
  782. }catch (Exception e){
  783. return new JSONObject("{\"count\": 0,\"o1_mini\": 0,\"o1_p\": 0}");
  784. }
  785. }
  786. @Override
  787. public String getMirrorToken(long userId, Long relationId) {
  788. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  789. GroupsRelation relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
  790. .eq(GroupsRelation::getId, relationId)
  791. .gt(GroupsRelation::getExpiryTime, DateTime.now())
  792. .in(GroupsRelation::getUserId, userIdList)
  793. .last("limit 1"));
  794. if (relation == null) {
  795. throw BusinessRuntimeException.getInstance("车票不存在");
  796. }
  797. GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
  798. GoodsDonSku sku = skuMapper.selectById(groupsTrips.getSkuId());
  799. Long goodsId = sku.getGoodsId();
  800. if (goodsId == Constant.MJ_GID) {
  801. MidjourneyUser user = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class)
  802. .eq(MidjourneyUser::getRelationId, relationId)
  803. .last("limit 1"));
  804. if (user != null) {
  805. return user.getUserToken();
  806. }
  807. }
  808. if (goodsId == Constant.GPT_PLUS_GID) {
  809. ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class)
  810. .eq(ChatgptUser::getRelationId, relationId)
  811. .last("limit 1"));
  812. if (chatgptUser != null) {
  813. chatgptUser.setExpireTime(relation.getExpiryTime());
  814. chatgptUserMapper.updateById(chatgptUser);
  815. return chatgptUser.getUserToken();
  816. }
  817. }
  818. if (goodsId == Constant.CALUDE_GOODS_ID) {
  819. ClaudeUser claudeUser = claudeUserMapper.selectOne(Wrappers.lambdaQuery(ClaudeUser.class)
  820. .eq(ClaudeUser::getRelationId, relationId)
  821. .last("limit 1"));
  822. if (claudeUser != null) {
  823. return claudeUser.getUserToken();
  824. }
  825. }
  826. if (goodsId == Constant.GROK_GOODS_ID) {
  827. GrokUser grokUser = grokUserMapper.selectOne(Wrappers.lambdaQuery(GrokUser.class)
  828. .eq(GrokUser::getRelationId, relationId)
  829. .last("limit 1"));
  830. if (grokUser != null) {
  831. return grokUser.getUserToken();
  832. }
  833. }
  834. if (goodsId == Constant.LUMA_GOODS_ID) {
  835. LumaUser lumaUser = lumaUserMapper.selectOne(Wrappers.lambdaQuery(LumaUser.class)
  836. .eq(LumaUser::getRelationId, relationId)
  837. .last("limit 1"));
  838. if (lumaUser != null) {
  839. return lumaUser.getUserToken();
  840. }
  841. }
  842. throw BusinessRuntimeException.getInstance("车票不存在");
  843. }
  844. private synchronized ChatgptUser createTrialUser(String clientIP) {
  845. //固定 sku id
  846. GoodsDonSku goodsDonSku = skuMapper.selectById(535L);
  847. //新增体验卡
  848. ChatgptUser chatgptUser = new ChatgptUser();
  849. if (goodsDonSku.getIsCar()) {
  850. chatgptUser.setIsCar(true);
  851. chatgptUser.setLimitNum(goodsDonSku.getGptLimitNum());
  852. chatgptUser.setLimitTime(goodsDonSku.getGptLimitTime());
  853. chatgptUser.setDsLimitNum(goodsDonSku.getDsLimitNum());
  854. chatgptUser.setDsLimitTime(goodsDonSku.getDsLimitTime());
  855. chatgptUser.setOtherLimitNum(goodsDonSku.getOtherLimitNum());
  856. chatgptUser.setOtherLimitTime(goodsDonSku.getOtherLimitTime());
  857. chatgptUser.setGptThink(goodsDonSku.getGptThink());
  858. chatgptUser.setGptThinkLimitTime(goodsDonSku.getGptThinkLimitTime());
  859. chatgptUser.setGptPro(goodsDonSku.getGptPro());
  860. chatgptUser.setGptProLimitTime(goodsDonSku.getGptProLimitTime());
  861. chatgptUser.setGptDeepStyleLimit(goodsDonSku.getGptDeepStyleLimit());
  862. chatgptUser.setGptDeepStyleLimitTime(goodsDonSku.getGptDeepStyleLimitTime());
  863. }
  864. try {
  865. DateTime dateTime = DateUtil.offsetMonth(new Date(), 1);
  866. chatgptUser.setExpireTime(dateTime.toJdkDate());
  867. chatgptUser.setIsPlus(1);
  868. chatgptUser.setName("银河体验卡用户");
  869. chatgptUser.setImg("https://cdn2.yicanggongyi.com/yinhe/icon/index/avatar.png");
  870. chatgptUser.setUserToken(UUID.randomUUID().toString());
  871. chatgptUserMapper.insert(chatgptUser);
  872. } catch (DuplicateKeyException e) {
  873. log.error("重复插入镜像体验用户ip :{},errmsg:{}",clientIP , StringUtil.getErrorText(e));
  874. }
  875. return chatgptUser;
  876. }
  877. }