GroupRelationFrontServiceImpl.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. package com.cyksj.service.relation.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import cn.hutool.core.date.BetweenFormater;
  5. import cn.hutool.core.date.DateTime;
  6. import cn.hutool.core.date.DateUtil;
  7. import cn.hutool.core.lang.Assert;
  8. import cn.hutool.core.lang.Validator;
  9. import cn.hutool.core.util.StrUtil;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  12. import com.cyksj.common.constant.Constant;
  13. import com.cyksj.common.exception.BusinessRuntimeException;
  14. import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
  15. import com.cyksj.common.util.Jsons;
  16. import com.cyksj.common.util.StringUtil;
  17. import com.cyksj.enums.GatewayApiCode;
  18. import com.cyksj.mapper.*;
  19. import com.cyksj.mapper.manage.distribute.DistributeGeneralSkuRateMapper;
  20. import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
  21. import com.cyksj.mapper.manage.distribute.UserPlatDistributeRateMapper;
  22. import com.cyksj.mapper.manage.distribute.UserPlatSkuDistributeRateMapper;
  23. import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
  24. import com.cyksj.mapper.sys.SysEmailMapper;
  25. import com.cyksj.model.entity.*;
  26. import com.cyksj.model.request.SpecialGoodsTicketReq;
  27. import com.cyksj.model.request.TicketLoginReq;
  28. import com.cyksj.model.views.*;
  29. import com.cyksj.redis.RedisService;
  30. import com.cyksj.service.chatgpt.ChatGptAccountService;
  31. import com.cyksj.service.chatgpt.ChatGptAuthService;
  32. import com.cyksj.service.claude.ClaudeService;
  33. import com.cyksj.service.groups.GroupsFuncService;
  34. import com.cyksj.service.luma.LumaService;
  35. import com.cyksj.service.mail.CuiQiuMailService;
  36. import com.cyksj.service.mail.MailService;
  37. import com.cyksj.service.mail.YhMailService;
  38. import com.cyksj.service.mange.coupon.CouponCommonService;
  39. import com.cyksj.service.midjourney.MidjourneyAccountService;
  40. import com.cyksj.service.relation.GroupRelationFrontService;
  41. import com.cyksj.service.relation.GroupsRelationNetflixService;
  42. import com.cyksj.service.user.UserBindRelationService;
  43. import com.cyksj.service.user.UserLoginRecordService;
  44. import com.ejlchina.searcher.BeanSearcher;
  45. import com.ejlchina.searcher.SearchResult;
  46. import com.ejlchina.searcher.param.Operator;
  47. import com.ejlchina.searcher.util.MapBuilder;
  48. import com.ejlchina.searcher.util.MapUtils;
  49. import com.github.rholder.retry.*;
  50. import lombok.RequiredArgsConstructor;
  51. import lombok.extern.slf4j.Slf4j;
  52. import org.springframework.stereotype.Service;
  53. import org.springframework.transaction.annotation.Transactional;
  54. import javax.servlet.http.HttpServletRequest;
  55. import java.math.BigDecimal;
  56. import java.math.RoundingMode;
  57. import java.util.Date;
  58. import java.util.List;
  59. import java.util.Objects;
  60. import java.util.Optional;
  61. import java.util.concurrent.ExecutionException;
  62. import java.util.concurrent.TimeUnit;
  63. import java.util.concurrent.atomic.AtomicInteger;
  64. import java.util.stream.Collectors;
  65. import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
  66. import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
  67. /*
  68. *项目名: netflix
  69. *文件名: GroupRelationFrontServiceImpl
  70. *创建者: JavaZou
  71. *创建时间:2022/12/29 15:42
  72. */
  73. @Service
  74. @RequiredArgsConstructor
  75. @Slf4j
  76. public class GroupRelationFrontServiceImpl implements GroupRelationFrontService {
  77. private final UserBindRelationService userBindRelationService;
  78. private final UserMapper userMapper;
  79. private final BeanSearcher beanSearcher;
  80. private final CouponCommonService couponCommonService;
  81. private final GroupsRelationMapper groupsRelationMapper;
  82. private final GroupsMapper groupsMapper;
  83. private final ChatGptAuthService chatGptAuthService;
  84. private final RedisService redisService;
  85. private final MailService mailService;
  86. private final OrderDonMapper orderDonMapper;
  87. private final GroupsRelationExpiryNotifyRecordMapper groupsRelationExpiryNotifyRecordMapper;
  88. private final HttpServletRequest request;
  89. private final GroupsFuncService groupsFuncService;
  90. private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
  91. private final GroupsRelationLoginCodeRecordMapper groupsRelationLoginCodeRecordMapper;
  92. private final SysEmailMapper sysEmailMapper;
  93. private final GoodsDonSkuMapper goodsDonSkuMapper;
  94. private final UserFuncPropertyMapper userFuncPropertyMapper;
  95. private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
  96. private final UserLoginRecordService userLoginRecordService;
  97. private final CuiQiuMailService cuiQiuMailService;
  98. private final UserCertRecordMapper userCertRecordMapper;
  99. private final MidjourneyAccountService midjourneyAccountService;
  100. private final ChatGptAccountService chatGptAccountService;
  101. private final UpgradePackageMapper upgradePackageMapper;
  102. private final LumaService lumaService;
  103. private final GroupsRelationNetflixService groupsRelationNetflixService;
  104. private final UserDistributeMapper userDistributeMapper;
  105. private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
  106. private final GoodsDonMapper goodsDonMapper;
  107. private final UserPlatSkuDistributeRateMapper userPlatSkuDistributeRateMapper;
  108. private final DistributeGeneralSkuRateMapper distributeGeneralSkuRateMapper;
  109. private final RenewUpgradePackageMapper renewUpgradePackageMapper;
  110. private final ClaudeService claudeService;
  111. private final YhMailService yhMailService;
  112. private final UserDistributePosterRecordMapper userDistributePosterRecordMapper;
  113. private final OrderDonRenewRecordMapper orderDonRenewRecordMapper;
  114. private final UpgradeOrderDonMapper upgradeOrderDonMapper;
  115. @Override
  116. public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account) {
  117. User u = userMapper.selectById(userId);
  118. if (u == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
  119. if (u.getIsBlack()) {
  120. return new SearchResult<>();
  121. }
  122. List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
  123. MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
  124. //Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
  125. DateTime now = DateTime.now();
  126. if (StrUtil.isNotBlank(account)) {
  127. builder.field(RenewalView::getAccount, account).op(Operator.Contain);
  128. }
  129. SearchResult<RenewalView> list = beanSearcher.search(RenewalView.class, builder
  130. .field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
  131. .field(RenewalView::getUserId, userIds).op(Operator.InList)
  132. //.field(RenewalView::getYhsId, yhsId)
  133. .put("condition", String.format("(gr.expiry_time is null or gr.expiry_time > '%s')", now))
  134. .field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
  135. .orderBy(RenewalView::getExpiryTime).asc()
  136. .build());
  137. //过滤邀请制、已失效的车位
  138. Integer size = list.getTotalCount().intValue();
  139. list.getDataList().forEach(ticket -> {
  140. if (ticket.getSkuId() == null || ticket.getGoodsId() == null) {
  141. return;
  142. }
  143. if (ticket.getGoodsId() == 18 && ticket.getSkuNum() > 1) {
  144. ticket.setPassword(null);
  145. }
  146. ticket.setIsMulti(false);
  147. if (ticket.getSkuNum() > 1) {
  148. ticket.setIsMulti(true);
  149. }
  150. //chatGPT直连
  151. if (ticket.getGoodsId().equals(42l)) {
  152. if (StrUtil.isNotBlank(ticket.getAccount())) {
  153. String accessToken;
  154. try {
  155. accessToken = chatGptAuthService.getAccessToken(ticket.getAccount());
  156. ticket.setGptRefreshToken(accessToken);
  157. } catch (Exception e) {
  158. redisService.set(RedisService.key.CHAT_GPT_TOKEN_EXCEPTION_KEY.getName() + ticket.getAccount(), ticket.getAccount());
  159. }
  160. }
  161. ticket.setAccount(null);
  162. ticket.setPassword(null);
  163. } else {
  164. ticket.setGptRefreshToken(null);
  165. }
  166. if (ticket.getSecondType() == 1) {
  167. ticket.setAccount(null);
  168. ticket.setPassword(null);
  169. }
  170. if (isLoginPopularize != null && isLoginPopularize) {
  171. GoodsDonViews views = beanSearcher.searchFirst(GoodsDonViews.class, MapUtils.builder().field(GoodsDonViews::getId, ticket.getGoodsId()).build());
  172. views.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
  173. views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, views.getId()).field(GoodsDonSkuFrontView::getStatus, true).build()));
  174. ticket.setGoodsDonViews(views);
  175. }
  176. if (ticket.getMonths() != null && ticket.getMonths() >= 300) {
  177. ticket.setExpiryTime(null);
  178. }
  179. if (ticket.getExpiryTime() != null && ticket.getGoodsType() == 1 && ticket.getSecondType() == 2) {
  180. String remainDays = DateUtil.formatBetween(now, ticket.getExpiryTime(), BetweenFormater.Level.DAY);
  181. if ("0天".equals(remainDays)) {
  182. remainDays = "小于1天";
  183. } else {
  184. //当天也算
  185. int days = Integer.parseInt(remainDays.substring(0, remainDays.indexOf("天")));
  186. remainDays = days + 1 + "天";
  187. }
  188. ticket.setRemainDays(remainDays);
  189. }
  190. OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
  191. .eq(OrderDon::getRelationId, ticket.getRelationId())
  192. .eq(OrderDon::getUserId, ticket.getUserId())
  193. .notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
  194. .orderByDesc(OrderDon::getId)
  195. .last("limit 1"));
  196. if (orderDon != null) {
  197. ticket.setOrderNo(orderDon.getOrderNo());
  198. ticket.setOrderId(orderDon.getId());
  199. ticket.setTransactionId(orderDon.getTransactionId());
  200. }
  201. if (size > 1 && ticket.getGoodsId() != 18) {
  202. Date payTime = null;
  203. if (orderDon != null) {
  204. payTime = Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime());
  205. }
  206. //加购订单
  207. if (orderDon == null) {
  208. List<OrderDiscountPlusPurchaseSkuRelation> plusPurchaseSkuRelations = orderDiscountPlusPurchaseSkuRelationMapper.selectPlusRelationByIdAndUserId(ticket.getRelationId(), ticket.getUserId());
  209. for (OrderDiscountPlusPurchaseSkuRelation data : plusPurchaseSkuRelations) {
  210. String relationIds = data.getRelationIds();
  211. if (StrUtil.isEmpty(relationIds)) {
  212. return;
  213. }
  214. try {
  215. List<Long> relationList = Jsons.parseList(relationIds, Long.class);
  216. if (relationList.contains(ticket.getRelationId())) {
  217. OrderDon plusOrder = orderDonMapper.selectById(data.getOrderId());
  218. if (plusOrder != null) {
  219. payTime = Optional.ofNullable(plusOrder.getPayTime()).orElse(plusOrder.getCreatedTime());
  220. }
  221. break;
  222. }
  223. } catch (Exception e) {
  224. }
  225. }
  226. }
  227. ticket.setPayTime(payTime);
  228. }
  229. if (ticket.getGoodsId() == 26 && ticket.getIsMirror()) {
  230. List<UpgradePackage> upgradePackages = upgradePackageMapper.selectList(Wrappers.lambdaQuery(UpgradePackage.class).apply("JSON_CONTAINS(sku_ids,'\"" + ticket.getSkuId() + "\"')").eq(UpgradePackage::getStatus, Boolean.TRUE).eq(UpgradePackage::getDeleted, Boolean.TRUE));
  231. if (CollectionUtil.isNotEmpty(upgradePackages)) {
  232. upgradePackages.stream().map(e -> e.getPrice().divide(BigDecimal.valueOf(e.getNum()), 2, RoundingMode.HALF_UP)).min(BigDecimal::compareTo).ifPresent(ticket::setMjPackagePrice);
  233. }
  234. try {
  235. MidjourneyUserView search = beanSearcher.searchFirst(MidjourneyUserView.class, MapUtils.flatBuilder(request.getParameterMap())
  236. .field(MidjourneyUserView::getUserId, ticket.getUserId()).field(MidjourneyUserView::getRelationId, ticket.getRelationId())
  237. .onlySelect(MidjourneyUserView::getMjUserRelaxNum, MidjourneyUserView::getMjUserFastNum, MidjourneyUserView::getIsCar)
  238. .build());
  239. if (search == null) {
  240. MidjourneyUser midjourneyUser = midjourneyAccountService.getMidjourneyUserToken(ticket.getUserId(), ticket.getRelationId());
  241. ticket.setMjUserFastNum(midjourneyUser.getMjFastNum());
  242. ticket.setMjUserRelaxNum(midjourneyUser.getMjRelaxNum());
  243. ticket.setIsCar(false);
  244. } else {
  245. ticket.setIsCar(search.getIsCar());
  246. ticket.setMjUserFastNum(search.getMjUserFastNum());
  247. ticket.setMjUserRelaxNum(search.getMjUserRelaxNum());
  248. }
  249. } catch (Exception e) {
  250. }
  251. }
  252. if (ticket.getGoodsId() == 18 && ticket.getIsCar() && ticket.getExpiryTime() != null) {
  253. try {
  254. //gpt用户镜像
  255. ChatGptUserView userInfo = chatGptAccountService.getUserInfo(userId, ticket.getRelationId());
  256. ticket.setGptUserLimitNum(userInfo.getLimitNum());
  257. ticket.setGptUserLimitTime(userInfo.getLimitTime());
  258. ticket.setUse(userInfo.getUse());
  259. Integer count = upgradePackageMapper.selectCount(Wrappers.lambdaQuery(UpgradePackage.class).apply("JSON_CONTAINS(sku_ids,'\"" + ticket.getSkuId() + "\"')")
  260. .gt(UpgradePackage::getNum, userInfo.getLimitNum())
  261. .eq(UpgradePackage::getStatus, Boolean.TRUE)
  262. .eq(UpgradePackage::getGptType, 0)
  263. .eq(UpgradePackage::getDeleted, Boolean.TRUE));
  264. ticket.setUpgrade(count > 0 ? true : false);
  265. ticket.setPackageId(userInfo.getPackageId());
  266. if (userInfo.getPackageId() != 0) {
  267. UpgradePackage upgradePackage = upgradePackageMapper.selectById(userInfo.getPackageId());
  268. ticket.setPackagePrice(upgradePackage.getPrice());
  269. Long upgradeOrderDonSkuId = upgradePackage.getUpgradeSkuId();
  270. GoodsDonSkuRenewView renewSku = beanSearcher.searchFirst(GoodsDonSkuRenewView.class, MapUtils.builder().field(GoodsDonSkuRenewView::getSkuId, upgradeOrderDonSkuId).build());
  271. renewSku.setPackageId(userInfo.getPackageId());
  272. ticket.setRenewSku(renewSku);
  273. }
  274. ticket.setIsRenewPackage(userInfo.getIsRenewPackage());
  275. Long renewSkuId = userInfo.getRenewSkuId();
  276. if (renewSkuId != null) {
  277. GoodsDonSkuRenewView upgradeSkuRenewView = ticket.getRenewSku();
  278. GoodsDonSkuRenewView renewSku = beanSearcher.searchFirst(GoodsDonSkuRenewView.class, MapUtils.builder().field(GoodsDonSkuRenewView::getSkuId, renewSkuId).build());
  279. //续费升级是更高级规格
  280. if (upgradeSkuRenewView == null || (renewSku.getGptUserLimitNum() >= upgradeSkuRenewView.getGptUserLimitNum() && renewSku.getMonths() >= userInfo.getMonths())) {
  281. Optional.ofNullable(orderDonRenewRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonRenewRecord.class)
  282. .eq(OrderDonRenewRecord::getOrderId, userInfo.getRenewOrderId())
  283. .last("limit 1"))).ifPresent(e -> renewSku.setOriginalOrderId(e.getOrderId()));
  284. ticket.setRenewSku(renewSku);
  285. }
  286. }
  287. } catch (Exception e) {
  288. }
  289. }
  290. if (ticket.getGoodsId() == 75l && ticket.getExpiryTime() != null) {
  291. try {
  292. ClaudeUserView userInfo = claudeService.getUserInfo(userId, ticket.getRelationId());
  293. ticket.setGptUserLimitNum(userInfo.getLimitNum());
  294. ticket.setGptUserLimitTime(userInfo.getLimitTime());
  295. ticket.setUse(userInfo.getUse());
  296. } catch (Exception e) {
  297. }
  298. }
  299. if (ticket.getGoodsId() == Constant.LUMA_GOODS_ID && ticket.getExpiryTime() != null) {
  300. try {
  301. List<UpgradePackage> upgradePackages = upgradePackageMapper.selectList(Wrappers.lambdaQuery(UpgradePackage.class).apply("JSON_CONTAINS(sku_ids,'\"" + ticket.getSkuId() + "\"')").eq(UpgradePackage::getStatus, Boolean.TRUE).eq(UpgradePackage::getDeleted, Boolean.TRUE));
  302. if (CollectionUtil.isNotEmpty(upgradePackages)){
  303. upgradePackages.stream().map(e -> e.getPrice().divide(BigDecimal.valueOf(e.getNum()), 2, RoundingMode.HALF_UP)).min(BigDecimal::compareTo).ifPresent(ticket::setLumaPackagePrice);
  304. }
  305. LumaUser lumaUser = lumaService.getLumaUser(userId, ticket.getRelationId());
  306. ticket.setLumaUserNum(lumaUser.getNum());
  307. } catch (Exception e) {
  308. }
  309. }
  310. List<GroupsRelationUserView> relationUserViews = groupsRelationMapper.getUserRelationUserViews(ticket.getGroupId(), ticket.getRelationId(), ticket.getUserId(), List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside));
  311. ticket.setRelationViews(relationUserViews);
  312. if (ticket.getExpiryTime() != null) {
  313. ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
  314. }
  315. //查看双重验证码
  316. if (StrUtil.isNotEmpty(ticket.getApiSecret())) {
  317. Boolean isHasVerifyCode = StrUtil.isNotBlank(ticket.getVerifyCode()) ? true : false;
  318. Integer codeNum = getUserCodeNumBySkuId(ticket.getUserId(), ticket.getSkuId(), isHasVerifyCode);
  319. ticket.setCodeNum(codeNum);
  320. }
  321. Long qaId = groupsRelationMapper.selectGoodsDonQaByGoodsId(ticket.getGoodsId());
  322. ticket.setQa(qaId > 0 ? true : false);
  323. //是否存在海报
  324. ticket.setPosterInfo(setGoodsPoster(ticket, u, userIds));
  325. //续费升级折扣
  326. setRenewDiscount(ticket);
  327. });
  328. userLoginRecordService.saveUserLoginDayRecord(userId);
  329. return list;
  330. }
  331. @Override
  332. public Boolean isJoinCorpWx(Long userId, Boolean isJoin, Boolean noCoupon) {
  333. if (!isJoin) {
  334. User user = userMapper.selectById(userId);
  335. if (user == null || StrUtil.isEmpty(user.getUnionid())) {
  336. return true;
  337. }
  338. // CorpUser corpUser = corpUserMapper.selectOne(Wrappers.lambdaQuery(CorpUser.class)
  339. // .ne(CorpUser::getUnionid, "")
  340. // .eq(CorpUser::getUnionid, user.getUnionid())
  341. // .last("limit 1")
  342. // .select(CorpUser::getId)
  343. // );
  344. CorpUserFollowView corpUserFollowView = beanSearcher.searchFirst(CorpUserFollowView.class, MapUtils.builder()
  345. .field(CorpUserFollowView::getUnionId, user.getUnionid())
  346. .field(CorpUserFollowView::getStatus, 1).build());
  347. if (corpUserFollowView == null) {
  348. return false;
  349. }
  350. }
  351. //用户是否买了奈飞车票
  352. Number number = beanSearcher.searchCount(RenewalView.class, MapUtils.builder()
  353. .field(RenewalView::getUserId, userId)
  354. .field(RenewalView::getGoodsId, 1)
  355. .field(RenewalView::getStatus, List.of("validity", "overdue")).op(Operator.InList)
  356. .build());
  357. if (number.intValue() > 0 && !noCoupon) {
  358. couponCommonService.sendCouponToUser(userId, 34l, 0l, 0l, 0l, CouponUser.Channel.wxCorp);
  359. }
  360. return true;
  361. }
  362. @Override
  363. public GroupsRelation getSimilarExpiredGroupRelation(GoodsDonSku sku, List<Long> errorsRelationIds, String ip) {
  364. Long skuId = sku.getId();
  365. Integer days = sku.getDays();
  366. Integer months = sku.getMonths();
  367. Integer maxNum = sku.getNum();
  368. DateTime expiryTime = null;
  369. if (days != null && days > 0) {
  370. expiryTime = DateUtil.offsetDay(DateTime.now(), days);
  371. } else {
  372. expiryTime = DateUtil.offsetMonth(DateTime.now(), months);
  373. }
  374. Integer extraNum = 5;
  375. if (sku.getId() == 178l) {
  376. extraNum = 2;
  377. }
  378. maxNum += extraNum;
  379. DateTime minExpiryTime = DateUtil.offsetDay(expiryTime, -5);
  380. Long groupsId = groupsRelationMapper.selectSimilarExpiredRelation(skuId, minExpiryTime, maxNum, ip);
  381. if (groupsId == null) {
  382. log.info("暂无相似过期时间车队");
  383. return null;
  384. }
  385. GroupsRelation relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
  386. .notIn(errorsRelationIds != null && errorsRelationIds.size() > 0, GroupsRelation::getId, errorsRelationIds)
  387. .eq(GroupsRelation::getGroupsId, groupsId)
  388. .eq(GroupsRelation::getStatus, GroupsRelation.Status.none)
  389. .eq(GroupsRelation::getUserId, 0)
  390. .orderByAsc(GroupsRelation::getNum)
  391. .last("limit 1"));
  392. if (relation != null) {
  393. log.info("用户userId:{},获取相似车队的车位relationId:{}", relation.getId());
  394. }
  395. return relation;
  396. }
  397. @Override
  398. public Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(Boolean isPayNf, List<Long> filter_goods_id, Boolean filterCourseGoods, Integer start, Integer limit) {
  399. return groupsRelationMapper.getRecommendGoodsViews(new Page<>(start, limit), filter_goods_id, isPayNf, filterCourseGoods);
  400. }
  401. @Override
  402. @Transactional(rollbackFor = Throwable.class)
  403. public void sendCourseWare(SpecialGoodsTicketReq request) throws Exception {
  404. Long userId = request.getUserId();
  405. Long relationId = request.getRelationId();
  406. String email = request.getEmail();
  407. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  408. RenewalView relation = beanSearcher.searchFirst(RenewalView.class, MapUtils.builder().field(RenewalView::getRelationId, relationId).build());
  409. Assert.notNull(relation, "您的车票不存在");
  410. Long relationUserId = relation.getUserId();
  411. if (!userIdList.contains(relationUserId)) {
  412. throw BusinessRuntimeException.getInstance("您的车票不存在");
  413. }
  414. if (relation.getSpecialType() != GoodsDon.SpecialType.courseware) {
  415. throw BusinessRuntimeException.getInstance("");
  416. }
  417. //是否已发送
  418. if (StrUtil.isNotBlank(relation.getGrAccount())) {
  419. throw BusinessRuntimeException.getInstance("已领取课件,请前往邮箱查看");
  420. }
  421. if (!Validator.isEmail(email)) {
  422. throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
  423. }
  424. int update = groupsRelationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
  425. .set(GroupsRelation::getAccount, email)
  426. .and(qr -> qr.isNull(GroupsRelation::getAccount).or().eq(GroupsRelation::getAccount, StrUtil.EMPTY))
  427. .eq(GroupsRelation::getId, relationId));
  428. if (update > 0) {
  429. orderDonMapper.update(null, Wrappers.lambdaUpdate(OrderDon.class)
  430. .set(OrderDon::getStatus, OrderDon.Status.complete)
  431. .eq(OrderDon::getRelationId, relationId)
  432. .eq(OrderDon::getUserId, userId)
  433. .eq(OrderDon::getStatus, OrderDon.Status.hasPayment));
  434. mailService.sendCoursewareByGoodsId(relation.getGoodsId(), relation.getRelationId(), relation.getUserId(), relation.getTitle(), email);
  435. }
  436. }
  437. @Override
  438. public GroupsRelation getRelation(Long payRelationId, Long userId, GoodsDonSku sku, String ip) {
  439. GroupsRelation relation = null;
  440. Integer maxNum = sku.getNum();
  441. if (payRelationId != null && payRelationId > 0) {
  442. relation = groupsRelationMapper.selectById(payRelationId);
  443. if (relation == null) {
  444. throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
  445. }
  446. if (relation.getUserId() != null && relation.getUserId() > 0L) {
  447. throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
  448. }
  449. } else {
  450. GroupsTrips groups = null;
  451. //ChatGpt Plus、Midjourney非独立规格 上车先获取硬塞座位 硬塞5个座位
  452. //主账号过期时间25天以外
  453. //23-12-06 MidJourney 不硬塞
  454. if (sku.getNum() > 1 && Constant.AI_goodsIds.get(0) == sku.getGoodsId()) {
  455. Integer extraNum = 5;
  456. if (sku.getId() == 178l || sku.getId() == 423l) {
  457. extraNum = 2;
  458. }
  459. maxNum += extraNum;
  460. DateTime time = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 25);
  461. //不塞存在该用户的车队
  462. Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), time, extraNum, userId, sku.getNum(), maxNum);
  463. if (groupsId != null) {
  464. relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
  465. .eq(GroupsRelation::getGroupsId, groupsId)
  466. .eq(GroupsRelation::getUserId, 0)
  467. .eq(GroupsRelation::getStatus, GroupsRelation.Status.outside)
  468. .last("limit 1"));
  469. if (relation == null) {
  470. relation = new GroupsRelation();
  471. relation.setStatus(GroupsRelation.Status.outside);
  472. relation.setUserId(userId);
  473. relation.setGroupsId(groupsId);
  474. GroupsRelation maxNumRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId, groupsId).orderByDesc(GroupsRelation::getNum).last("limit 1"));
  475. Integer nextNum = maxNumRelation.getNum() + 1;
  476. if (redisService.setNx(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, nextNum), nextNum, RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getTimeout())) {
  477. relation.setNum(nextNum);
  478. groupsRelationMapper.insert(relation);
  479. } else {
  480. throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
  481. }
  482. }
  483. groups = groupsMapper.selectById(groupsId);
  484. }
  485. }
  486. if (groups == null) {
  487. //寻找差不多过期时间规格的车位
  488. relation = getSimilarExpiredGroupRelation(sku, null, ip);
  489. if (relation == null) {
  490. //TODO 如果没指定座位,等待逻辑确认
  491. groups = groupsMapper.selectTicketGroups(sku.getId(), GroupsTrips.Status.validity, maxNum, ip);
  492. if (groups == null) {
  493. //待发车
  494. groups = groupsMapper.selectTicketGroups(sku.getId(), GroupsTrips.Status.waiting, maxNum, ip);
  495. }
  496. //新增空车队
  497. if (groups == null) {
  498. relation = groupsFuncService.createNewGroupsTrips(sku);
  499. }
  500. //获取车位
  501. if (relation == null) {
  502. //寻找快满编车队进行占座
  503. relation = groupsRelationMapper.selectRandomOneRelationByGroupsId(groups.getId());
  504. if (relation == null) {
  505. Long groupsId = groups.getId();
  506. TASK_EXECUTOR.execute(() -> groupsMapper.updateAvailableNum(groupsId));
  507. throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
  508. }
  509. }
  510. }
  511. }
  512. if (groups == null) {
  513. groups = groupsMapper.selectById(relation.getGroupsId());
  514. }
  515. //车队目前可用停车数
  516. relation.setGroupsAvailParkingNum(groups.getAvailableParkingNum());
  517. relation.setMaxNum(maxNum);
  518. }
  519. return relation;
  520. }
  521. @Override
  522. public String getAiVerifyCode(TicketLoginReq loginReq) throws Exception {
  523. Long userId = loginReq.getUserId();
  524. Long relationId = loginReq.getRelationId();
  525. Integer type = loginReq.getType();
  526. Boolean sync = loginReq.getSync();
  527. List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
  528. RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, MapUtils.builder().field(RenewalView::getUserId, relationUserIdList).op(Operator.InList)
  529. .field(RenewalView::getRelationId, relationId).build());
  530. if (renewalView == null) {
  531. throw BusinessRuntimeException.getInstance("您的车票不存在...");
  532. }
  533. if (StrUtil.isEmpty(renewalView.getAccount())) {
  534. throw BusinessRuntimeException.getInstance("车票未配置账号");
  535. }
  536. String account = renewalView.getAccount();
  537. String password = renewalView.getPassword();
  538. if (StrUtil.hasEmpty(account, password)) {
  539. throw BusinessRuntimeException.getInstance("您的车票账号密码异常,请联系客服...");
  540. }
  541. if (renewalView.getGoodsId() == 1l) {
  542. Integer linkType = loginReq.getLinkType();
  543. if (type == null && linkType == null) {
  544. throw BusinessRuntimeException.getInstance("系统异常");
  545. }
  546. String key = RedisService.key.NF_UPGRAD_USER_LIMIT_KEY.getNameFormat(DateUtil.hour(DateTime.now(), true), linkType, renewalView.getUserId());
  547. if (!redisService.hasKey(key)) {
  548. redisService.set(key, 1l, RedisService.key.NF_UPGRAD_USER_LIMIT_KEY.getTimeout());
  549. } else {
  550. Integer value = (Integer) redisService.get(key);
  551. if (value >= 5) {
  552. throw BusinessRuntimeException.getInstance("获取失败,请联系客服");
  553. }
  554. redisService.incr(key, 1L);
  555. }
  556. }
  557. if (cuiQiuMailService.isCuiQiuEmail(renewalView.getAccount())) {
  558. return cuiQiuMailService.getVerifyCode(renewalView.getAccount(), renewalView.getGoodsId(), type, loginReq.getLinkType());
  559. }
  560. //银河域名邮件
  561. String code = yhMailService.getVerifyCode(account, renewalView.getGoodsId(), type, loginReq.getLinkType());
  562. GroupsRelationLoginCodeRecord record = new GroupsRelationLoginCodeRecord();
  563. record.setUserId(userId);
  564. record.setRelationId(relationId);
  565. record.setAccount(renewalView.getAccount());
  566. record.setGoodsId(renewalView.getGoodsId());
  567. record.setSkuId(renewalView.getSkuId());
  568. groupsRelationLoginCodeRecordMapper.insert(record);
  569. return code;
  570. }
  571. @Override
  572. public void checkGroupsAvailParkingNum(Long skuId, Long groupsId, Integer availableParkingNum, Integer maxNum) {
  573. //GPT10人月付、4人月付
  574. if (skuId == 161l || skuId == 178l) {
  575. //为0时,不参与限制
  576. if (availableParkingNum == 0) {
  577. return;
  578. }
  579. //目前车队可用停车数
  580. //目前上车人数
  581. Integer currentParkingNum = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
  582. .eq(GroupsRelation::getGroupsId, groupsId)
  583. .ne(GroupsRelation::getUserId, 0)
  584. .le(GroupsRelation::getNum, maxNum));
  585. if (currentParkingNum > availableParkingNum) {
  586. throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
  587. }
  588. }
  589. }
  590. @Override
  591. public void adjustGroupsParkingTime(Long relationId, GoodsDonSku sku) {
  592. if (sku == null) {
  593. return;
  594. }
  595. Long skuId = sku.getId();
  596. //更新GPT Plus10人、4人月付车队状态 待优化
  597. if (skuId == 161l || skuId == 178l || skuId == 422l || skuId == 423l) {
  598. GroupsRelation relation = groupsRelationMapper.selectById(relationId);
  599. Long groupsId = relation.getGroupsId();
  600. GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
  601. Integer availableParkingNum = groupsTrips.getAvailableParkingNum();
  602. //为0时 不参与限制
  603. if (availableParkingNum == 0) {
  604. return;
  605. }
  606. Integer extraNum = 5;
  607. if (skuId == 178l || skuId == 423l) {
  608. extraNum = 2;
  609. }
  610. Integer maxNum = sku.getNum() + extraNum;
  611. if (availableParkingNum >= maxNum) {
  612. return;
  613. }
  614. //目前上车人数
  615. Integer currentParkingNum = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
  616. .eq(GroupsRelation::getGroupsId, groupsId)
  617. .ne(GroupsRelation::getUserId, 0)
  618. .le(GroupsRelation::getNum, maxNum));
  619. if (currentParkingNum >= availableParkingNum) {
  620. //锁住
  621. DateTime parkingTime = DateUtil.offsetDay(DateTime.now(), 1);
  622. groupsMapper.update(null, Wrappers.lambdaUpdate(GroupsTrips.class)
  623. .eq(GroupsTrips::getId, groupsTrips.getId())
  624. .set(GroupsTrips::getParkingTime, parkingTime)
  625. .isNull(GroupsTrips::getParkingTime));
  626. }
  627. }
  628. }
  629. @Override
  630. public void setGroupsTripsParkingTimeEmpty(GoodsDonSku sku, Long relationId) {
  631. Long skuId = sku.getId();
  632. if (skuId == 161l || skuId == 178l) {
  633. GroupsRelation relation = groupsRelationMapper.selectById(relationId);
  634. Long groupsId = relation.getGroupsId();
  635. GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
  636. Integer availableParkingNum = groupsTrips.getAvailableParkingNum();
  637. if (groupsTrips.getParkingTime() == null || availableParkingNum == 0) {
  638. return;
  639. }
  640. Integer extraNum = 5;
  641. if (skuId == 178l) {
  642. extraNum = 2;
  643. }
  644. Integer skuNum = sku.getNum();
  645. if (availableParkingNum >= skuNum + extraNum) {
  646. return;
  647. }
  648. //目前上车人数
  649. Integer currentParkingNum = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
  650. .eq(GroupsRelation::getGroupsId, groupsId)
  651. .ne(GroupsRelation::getUserId, 0));
  652. if (currentParkingNum < availableParkingNum) {
  653. groupsMapper.update(null, Wrappers.lambdaUpdate(GroupsTrips.class)
  654. .eq(GroupsTrips::getId, groupsTrips.getId())
  655. .set(GroupsTrips::getParkingTime, null)
  656. .isNotNull(GroupsTrips::getParkingTime));
  657. }
  658. }
  659. }
  660. @Override
  661. public Integer getUserCodeNumBySkuId(Long userId, Long skuId, Boolean isHasVerifyCode) {
  662. //查看双重验证码
  663. UserFuncProperty userFuncProperty = userFuncPropertyMapper.selectOne(Wrappers.lambdaQuery(UserFuncProperty.class).eq(UserFuncProperty::getUserId, userId).last("limit 1"));
  664. //默认2次
  665. int num = 2;
  666. //有安全码查看次数 置为0
  667. if (isHasVerifyCode) {
  668. num = 0;
  669. //存在身份实名认证有两次机会
  670. List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
  671. Integer selectCount = userCertRecordMapper.selectCount(Wrappers.lambdaQuery(UserCertRecord.class)
  672. .in(UserCertRecord::getUserId, userIdList));
  673. if (selectCount > 0) {
  674. num = 2;
  675. }
  676. return num;
  677. }
  678. //查看双重验证码次数
  679. GoodsDonSku sku = goodsDonSkuMapper.selectById(skuId);
  680. if (sku.getCodeNum() > 0) {
  681. num = sku.getCodeNum();
  682. }
  683. if (userFuncProperty != null) num = userFuncProperty.getVerifyCheckNum();
  684. return num;
  685. }
  686. @Override
  687. public List<RenewalView> getHasPayGoods(long userId) {
  688. User user = userMapper.selectById(userId);
  689. List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, user);
  690. DateTime now = DateTime.now();
  691. List<RenewalView> list = groupsRelationMapper.getUserHasPayGoods(userIds, now);
  692. return list;
  693. }
  694. @Override
  695. public List<RenewalView> getExpiryRenewalNotify(Long userId) {
  696. DateTime now = DateTime.now();
  697. DateTime thisZero = DateUtil.beginOfDay(now);
  698. String thisDate = thisZero.toDateStr();
  699. Object exists = redisService.get(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId));
  700. if (exists != null) {
  701. return null;
  702. }
  703. User u = userMapper.selectById(userId);
  704. if (u == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
  705. if (u.getIsBlack()) {
  706. redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
  707. return null;
  708. }
  709. List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
  710. MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
  711. List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, builder
  712. .field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
  713. .field(RenewalView::getUserId, userIds).op(Operator.InList)
  714. .field(RenewalView::getExpiryTime, now).op(Operator.GreaterThan)
  715. .field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
  716. .field(RenewalView::getAqType, 1)
  717. .orderBy(RenewalView::getExpiryTime).asc()
  718. .onlySelect(RenewalView::getMonths, RenewalView::getExpiryTime, RenewalView::getRelationId, RenewalView::getAccount, RenewalView::getGoodsId, RenewalView::getTitle, RenewalView::getLogo, RenewalView::getImg, RenewalView::getGroupId, RenewalView::getSkuId, RenewalView::getSpecVal, RenewalView::getGoodsStatus, RenewalView::getSkuStatus)
  719. .build());
  720. if (list.size() > 5) {
  721. redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
  722. return null;
  723. }
  724. //提前7天
  725. AtomicInteger day = new AtomicInteger(7);
  726. List<RenewalView> expiryTickets = list.stream().filter(ticket -> {
  727. //下架
  728. if (ticket.getGoodsStatus() == null || ticket.getSkuStatus() == null || !ticket.getGoodsStatus() || !ticket.getSkuStatus()) {
  729. return false;
  730. }
  731. Integer skuMonths = ticket.getMonths();
  732. if (skuMonths == null) {
  733. return false;
  734. }
  735. Date expiryTime = ticket.getExpiryTime();
  736. //年付 提前一个月
  737. if (skuMonths >= 12) {
  738. day.set(30);
  739. } else {
  740. day.set(7);
  741. }
  742. if (DateUtil.beginOfDay(expiryTime).compareTo(DateUtil.offsetDay(thisZero, day.get())) <= 0) {
  743. ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
  744. ticket.setExpiryTime(null);
  745. return true;
  746. }
  747. return false;
  748. }).collect(Collectors.toList());
  749. redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
  750. if (CollUtil.isNotEmpty(expiryTickets)) {
  751. groupsRelationExpiryNotifyRecordMapper.batchInsert(userId, expiryTickets);
  752. }
  753. return expiryTickets;
  754. }
  755. @Override
  756. public void getCollegeStudentUserGptTicket(Long userId) {
  757. Retryer<Boolean> build = RetryerBuilder.<Boolean>newBuilder()
  758. .retryIfException()
  759. //运行时异常重试
  760. .retryIfRuntimeException()
  761. //false重试
  762. .retryIfResult(res -> Objects.equals(res, false))
  763. //1s 间隔
  764. .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))
  765. //停止策略 : 尝试请求3次
  766. .withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();
  767. try {
  768. build.call(() -> {
  769. //体验规格
  770. Long gptMirrorSkuId = Constant.GPT_MIRROR_SKU_ID;
  771. GroupsTrips groups = groupsMapper.selectCollegeStudentUserGptTicket(gptMirrorSkuId);
  772. GroupsRelation relation = null;
  773. if (groups != null) {
  774. relation = groupsRelationMapper.selectRandomOneRelationByGroupsId(groups.getId());
  775. }
  776. if (relation == null) {
  777. //生成空车队
  778. GoodsDonSku sku = goodsDonSkuMapper.selectById(gptMirrorSkuId);
  779. relation = groupsFuncService.createNewGroupsTrips(sku);
  780. }
  781. DateTime startTime = DateTime.now();
  782. DateTime expiryTime = DateUtil.offsetDay(startTime, 1);
  783. int update = groupsRelationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
  784. .set(GroupsRelation::getUserId, userId)
  785. .set(GroupsRelation::getStartTime, startTime)
  786. .set(GroupsRelation::getExpiryTime, expiryTime)
  787. .set(GroupsRelation::getStatus, GroupsRelation.Status.validity)
  788. .set(GroupsRelation::getAqType, 2)
  789. .eq(GroupsRelation::getId, relation.getId())
  790. .eq(GroupsRelation::getUserId, 0));
  791. if (update > 0) {
  792. groupsMapper.decrAvailableNum(groups.getId());
  793. return true;
  794. }
  795. log.error("发送用户:{} GPT镜像车票体验失败,进行重试", userId);
  796. return false;
  797. });
  798. } catch (ExecutionException | RetryException e) {
  799. log.error("发送用户GPT镜像体验失败:{}", StringUtil.getErrorText(e));
  800. }
  801. }
  802. @Override
  803. public RenewalView getTicketDetail(long userId, Long relationId) {
  804. User u = userMapper.selectById(userId);
  805. List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
  806. MapBuilder builder = MapUtils.builder();
  807. RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, builder
  808. .field(RenewalView::getRelationId, relationId)
  809. .field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
  810. .field(RenewalView::getUserId, userIds).op(Operator.InList)
  811. .field("condition", String.format("(gr.expiry_time is null or gr.expiry_time > '%s')", DateTime.now()))
  812. .field(RenewalView::getStatus, List.of("validity", "outside")).op(Operator.InList)
  813. .orderBy(RenewalView::getExpiryTime).asc()
  814. .onlySelect(RenewalView::getRelationId, RenewalView::getExpiryTime, RenewalView::getTitle, RenewalView::getSpecVal, RenewalView::getGoodsId, RenewalView::getSkuId, RenewalView::getSkuNum, RenewalView::getSkuStatus, RenewalView::getGoodsStatus)
  815. .build());
  816. if (renewalView != null) {
  817. renewalView.setExpiryTimeStr(DateUtil.format(renewalView.getExpiryTime(), "yyyy-MM-dd"));
  818. }
  819. return renewalView;
  820. }
  821. @Override
  822. public GroupsRelation ticketLogin(TicketLoginReq loginReq) {
  823. String account = loginReq.getAccount();
  824. String password = loginReq.getPassword();
  825. Integer num = loginReq.getNum();
  826. Long goodsId = Optional.ofNullable(loginReq.getGoodsId()).orElse(1l);
  827. GroupsRelation relation = groupsRelationMapper.selectRelationByAccountAndNum(account, password, goodsId, num);
  828. if (relation == null) {
  829. log.info("外部入口使用账号account:{},pwd:{},座位num:{}登录失败...", account, password, num);
  830. if (StrUtil.equals(loginReq.getLang(), Constant.EN_US)) {
  831. throw BusinessRuntimeException.getInstance("Please enter the correct account information");
  832. }
  833. throw BusinessRuntimeException.getInstance("请输入正确的账号信息");
  834. }
  835. return relation;
  836. }
  837. @Override
  838. public String outsideTicketVerify(TicketLoginReq loginReq) {
  839. String account = loginReq.getAccount();
  840. String password = loginReq.getPassword();
  841. Integer num = loginReq.getNum();
  842. Long goodsId = Optional.ofNullable(loginReq.getGoodsId()).orElse(1l);
  843. GroupsRelation relation = groupsRelationMapper.selectRelationByAccountAndNum(account, password, goodsId, num);
  844. if (relation == null) {
  845. log.info("外部入口使用账号account:{},pwd:{},座位num:{}同步验证链接失败...", account, password, num);
  846. if (StrUtil.equals(loginReq.getLang(), Constant.EN_US)) {
  847. throw BusinessRuntimeException.getInstance("This account is no longer valid");
  848. }
  849. throw BusinessRuntimeException.getInstance("该账号已失效");
  850. }
  851. loginReq.setUserId(relation.getUserId());
  852. loginReq.setRelationId(relation.getId());
  853. loginReq.setGoodsId(goodsId);
  854. try {
  855. String aiVerifyCode = getAiVerifyCode(loginReq);
  856. if (StrUtil.isEmpty(aiVerifyCode)) {
  857. throw BusinessRuntimeException.getInstance("");
  858. }
  859. return aiVerifyCode;
  860. } catch (Exception e) {
  861. if (StrUtil.equals(loginReq.getLang(), Constant.EN_US)) {
  862. throw BusinessRuntimeException.getInstance("Please verify that the link was sent");
  863. }
  864. throw BusinessRuntimeException.getInstance("请校验链接是否已发送");
  865. }
  866. }
  867. private DistributePosterGoodsDetailView setGoodsPoster(RenewalView ticket, User user, List<Long> userIds) {
  868. DistributePosterGoodsDetailView distributePosterGoodsDetailView = beanSearcher.searchFirst(DistributePosterGoodsDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
  869. .field(DistributePosterGoodsFrontView::getGoodsId, ticket.getGoodsId()).build());
  870. if (distributePosterGoodsDetailView == null) {
  871. return null;
  872. }
  873. distributePosterGoodsDetailView.setNickname(user.getNickname());
  874. UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class)
  875. .eq(UserDistribute::getUserId, user.getId())
  876. .eq(UserDistribute::getDeleted, 1)
  877. .last("limit 1"));
  878. if (userDistribute != null) {
  879. UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
  880. .eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
  881. .eq(UserPlatDistributeRate::getGoodsId, ticket.getGoodsId())
  882. .last("limit 1"));
  883. if (userPlatDistributeRate != null) {
  884. distributePosterGoodsDetailView.setRate(userPlatDistributeRate.getRate());
  885. }
  886. }
  887. GoodsDon goodsDon = goodsDonMapper.selectById(ticket.getGoodsId());
  888. if (goodsDon.getIsSkuDistribute()) {
  889. if (userDistribute != null) {
  890. UserPlatSkuDistributeRate userPlatSkuDistributeRate = userPlatSkuDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
  891. .eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId())
  892. .eq(UserPlatSkuDistributeRate::getSkuId, ticket.getSkuId())
  893. .last("limit 1"));
  894. if (userPlatSkuDistributeRate != null) {
  895. distributePosterGoodsDetailView.setRate(userPlatSkuDistributeRate.getRate());
  896. }
  897. } else {
  898. DistributeGeneralSkuRate distributeGeneralSkuRate = distributeGeneralSkuRateMapper.selectOne(Wrappers.lambdaQuery(DistributeGeneralSkuRate.class)
  899. .eq(DistributeGeneralSkuRate::getSkuId, ticket.getSkuId())
  900. .last("limit 1"));
  901. if (distributeGeneralSkuRate != null) {
  902. distributePosterGoodsDetailView.setRate(distributeGeneralSkuRate.getRate());
  903. }
  904. }
  905. }
  906. //用户推广海报记录id
  907. Optional.ofNullable(userDistributePosterRecordMapper.selectOne(Wrappers.lambdaQuery(UserDistributePosterRecord.class)
  908. .eq(UserDistributePosterRecord::getPosterId, distributePosterGoodsDetailView.getId())
  909. .in(UserDistributePosterRecord::getUserId, userIds)
  910. .last("limit 1"))).ifPresent(re -> distributePosterGoodsDetailView.setRid(re.getId()));
  911. return distributePosterGoodsDetailView;
  912. }
  913. private void setRenewDiscount(RenewalView ticket) {
  914. if (ticket.getIsMirror()) {
  915. RenewUpgradePackage renewUpgradePackage = renewUpgradePackageMapper.selectOne(Wrappers.lambdaQuery(RenewUpgradePackage.class)
  916. .eq(RenewUpgradePackage::getGoodsId, ticket.getGoodsId())
  917. .eq(RenewUpgradePackage::getStatus, 1)
  918. .eq(RenewUpgradePackage::getDeleted, 1)
  919. .eq(RenewUpgradePackage::getSkuId, ticket.getSkuId())
  920. .orderByAsc(RenewUpgradePackage::getDiscount)
  921. .last("limit 1")
  922. .select(RenewUpgradePackage::getId, RenewUpgradePackage::getDiscount));
  923. if (renewUpgradePackage != null) {
  924. ticket.setDiscount(renewUpgradePackage.getDiscount());
  925. }
  926. }
  927. }
  928. }