MidjourneyServiceImpl.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package com.cyksj.service.midjourney.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  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.lang.UUID;
  7. import cn.hutool.core.map.MapUtil;
  8. import cn.hutool.core.util.RandomUtil;
  9. import cn.hutool.http.HttpRequest;
  10. import cn.hutool.http.HttpUtil;
  11. import cn.hutool.json.JSONArray;
  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.exception.BusinessRuntimeException;
  16. import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
  17. import com.cyksj.common.util.Jsons;
  18. import com.cyksj.common.util.StringUtil;
  19. import com.cyksj.mapper.*;
  20. import com.cyksj.model.dto.BlendDimensions;
  21. import com.cyksj.model.dto.MessageButton;
  22. import com.cyksj.model.entity.*;
  23. import com.cyksj.model.response.SubmitResult;
  24. import com.cyksj.redis.RedisService;
  25. import com.cyksj.service.midjourney.MidjourneyService;
  26. import com.cyksj.service.sys.SysConfigService;
  27. import com.cyksj.service.user.UserBindRelationService;
  28. import com.ejlchina.searcher.BeanSearcher;
  29. import lombok.RequiredArgsConstructor;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.springframework.dao.DuplicateKeyException;
  33. import org.springframework.stereotype.Service;
  34. import javax.imageio.stream.FileImageOutputStream;
  35. import java.io.IOException;
  36. import java.nio.file.Files;
  37. import java.nio.file.Path;
  38. import java.util.*;
  39. import java.util.concurrent.atomic.AtomicBoolean;
  40. import java.util.stream.Collectors;
  41. /**
  42. * @author zwhui
  43. * @date 2024/4/23 15:44
  44. */
  45. @Service
  46. @Slf4j
  47. @RequiredArgsConstructor
  48. public class MidjourneyServiceImpl implements MidjourneyService {
  49. private final MidjourneyUserMapper midjourneyUserMapper;
  50. private final GroupsRelationMapper groupsRelationMapper;
  51. private final BeanSearcher beanSearcher;
  52. private final UserBindRelationService userBindRelationService;
  53. private final GroupsMapper groupsMapper;
  54. private final UserMapper userMapper;
  55. private final RedisService redisService;
  56. private final GoodsDonSkuMapper skuMapper;
  57. private final SysConfigService sysConfigService;
  58. @Override
  59. public MidjourneyUser getUser(long userId, Long relationId) {
  60. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  61. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  62. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  63. if (goodsDonSku != null && goodsDonSku.getGoodsId() == 26 && goodsDonSku.getIsMirror()) {
  64. return getMidjourneyUser(userId, relationId, groupsRelation, goodsDonSku);
  65. } else {
  66. throw BusinessRuntimeException.getInstance("服务器出了点问题");
  67. }
  68. }
  69. @Override
  70. public String getCarLoginUrl(Long userId, Long relationId, String carId) {
  71. GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
  72. GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
  73. GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
  74. if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
  75. MidjourneyUser midjourneyUser = getMidjourneyUser(userId, relationId, groupsRelation, goodsDonSku);
  76. String DOMAIN = "https://mj.yinhedvd.com";
  77. try {
  78. SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "mirror_mj_domain"));
  79. if (sysConfig != null) {
  80. String sysValue = sysConfig.getSysValue();
  81. if (JSONUtil.isJsonArray(sysValue)) {
  82. List<String> domainList = JSONUtil.parseArray(sysValue).toList(String.class);
  83. DOMAIN = domainList.get(RandomUtil.randomInt(domainList.size()));
  84. }
  85. }
  86. } catch (Exception e) {
  87. log.error("随机抽取域名错误. msg:{}", StringUtil.getErrorText(e));
  88. }
  89. log.info("domain:{},用户:{},所在车次:{},座位id:{},在{}获取跳转Midjourney镜像的登录url", DOMAIN, userId, groupsTrips.getId(), relationId, DateTime.now());
  90. return DOMAIN + "/auth/logintoken?carid=" + carId + "&usertoken=" + midjourneyUser.getUserToken();
  91. } else {
  92. throw BusinessRuntimeException.getInstance("服务器出了点问题");
  93. }
  94. }
  95. /**
  96. * 获取车位信息
  97. *
  98. * @param userId
  99. * @param relationId
  100. * @return
  101. */
  102. private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
  103. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  104. GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
  105. if (groupsRelation == null) {
  106. throw BusinessRuntimeException.getInstance("车票不存在");
  107. }
  108. return groupsRelation;
  109. }
  110. /**
  111. * 获取车队信息
  112. *
  113. * @param groupsRelation
  114. * @return
  115. */
  116. private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
  117. GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
  118. if (groupsTrips == null) {
  119. throw BusinessRuntimeException.getInstance("车队异常");
  120. }
  121. return groupsTrips;
  122. }
  123. private MidjourneyUser getMidjourneyUser(Long userId, Long relationId, GroupsRelation groupsRelation, GoodsDonSku goodsDonSku) {
  124. MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, relationId));
  125. User user = userMapper.selectById(userId);
  126. if (midjourneyUser == null) {
  127. midjourneyUser = createMidjourneyUser(groupsRelation, user, goodsDonSku);
  128. } else {
  129. updateMidjourneyUser(groupsRelation, user, midjourneyUser);
  130. }
  131. return midjourneyUser;
  132. }
  133. /**
  134. * 创建MidjourneyUser
  135. */
  136. private synchronized MidjourneyUser createMidjourneyUser(GroupsRelation groupsRelation, User user, GoodsDonSku goodsDonSku) {
  137. MidjourneyUser midjourneyUser = new MidjourneyUser();
  138. midjourneyUser.setExpireTime(groupsRelation.getExpiryTime());
  139. midjourneyUser.setName(user.getNickname());
  140. midjourneyUser.setImg("https://cdn.sxfoundation.com/picture/f6ee11101c4f5f0bc48d88aca7a5dbfd-1666945673391.png");
  141. midjourneyUser.setRelationId(groupsRelation.getId());
  142. midjourneyUser.setUserToken(UUID.randomUUID().toString());
  143. if (groupsRelation.getAqType() == 2) {
  144. //fast模式 5次
  145. midjourneyUser.setMjFastNum(5);
  146. midjourneyUser.setMjRelaxNum(0);
  147. } else {
  148. midjourneyUser.setMjFastNum(goodsDonSku.getMjFastNum());
  149. midjourneyUser.setMjRelaxNum((goodsDonSku.getMjRelaxNum() == null || goodsDonSku.getMjRelaxNum() == 0) ? null : goodsDonSku.getMjRelaxNum());
  150. }
  151. midjourneyUser.setAqType(groupsRelation.getAqType());
  152. try {
  153. midjourneyUserMapper.insert(midjourneyUser);
  154. } catch (DuplicateKeyException e) {
  155. }
  156. redisService.set(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(), midjourneyUser.getMjFastNum(), RedisService.key.MIDJOURNEY_FAST_LIMIT.getTimeout());
  157. redisService.set(RedisService.key.MIDJOURNEY_USER.getName() + midjourneyUser.getUserToken(), midjourneyUser, RedisService.key.MIDJOURNEY_USER.getTimeout());
  158. if (midjourneyUser.getMjRelaxNum() != null) {
  159. redisService.set(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId(), midjourneyUser.getMjRelaxNum(), RedisService.key.MIDJOURNEY_RELAX_LIMIT.getTimeout());
  160. }
  161. return midjourneyUser;
  162. }
  163. private void updateMidjourneyUser(GroupsRelation groupsRelation, User user, MidjourneyUser midjourneyUser) {
  164. midjourneyUser.setName(user.getNickname());
  165. midjourneyUser.setImg("https://cdn.sxfoundation.com/picture/f6ee11101c4f5f0bc48d88aca7a5dbfd-1666945673391.png");
  166. midjourneyUser.setExpireTime(groupsRelation.getExpiryTime());
  167. midjourneyUserMapper.updateById(midjourneyUser);
  168. midjourneyUser.setAqType(groupsRelation.getAqType());
  169. redisService.set(RedisService.key.MIDJOURNEY_USER.getName() + midjourneyUser.getUserToken(), midjourneyUser, RedisService.key.MIDJOURNEY_USER.getTimeout());
  170. }
  171. }