|
|
@@ -0,0 +1,148 @@
|
|
|
+package com.cyksj.service.ticket.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
+import com.cyksj.common.util.StringUtil;
|
|
|
+import com.cyksj.mapper.*;
|
|
|
+import com.cyksj.model.entity.GoodsDonSku;
|
|
|
+import com.cyksj.model.entity.GroupsRelation;
|
|
|
+import com.cyksj.model.entity.GroupsTrips;
|
|
|
+import com.cyksj.model.entity.UserReceiveTrialTicketRecord;
|
|
|
+import com.cyksj.service.groups.GroupsFuncService;
|
|
|
+import com.cyksj.service.ticket.UserReceiveTrialTicketRecordService;
|
|
|
+import com.cyksj.service.user.UserBindRelationService;
|
|
|
+import com.github.rholder.retry.*;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.dao.DuplicateKeyException;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.ExecutionException;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 项目名: yhlxj
|
|
|
+ * 文件名: UserReceiveTrialTicketRecordServiceImpl
|
|
|
+ * 创建者: JavaZou
|
|
|
+ * 创建时间:2024/6/3 17:55
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Slf4j
|
|
|
+public class UserReceiveTrialTicketRecordServiceImpl implements UserReceiveTrialTicketRecordService {
|
|
|
+ private final UserBindRelationService userBindRelationService;
|
|
|
+
|
|
|
+ private final UserReceiveTrialTicketRecordMapper userReceiveTrialTicketRecordMapper;
|
|
|
+
|
|
|
+ private final GroupsMapper groupsMapper;
|
|
|
+
|
|
|
+ private final GroupsRelationMapper groupsRelationMapper;
|
|
|
+
|
|
|
+ private final GoodsDonSkuMapper goodsDonSkuMapper;
|
|
|
+
|
|
|
+ private final GroupsFuncService groupsFuncService;
|
|
|
+
|
|
|
+ private final OrderDonMapper orderDonMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void sendTicketAndRecord(Long userId, Long trialSkuId) {
|
|
|
+ List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
|
|
|
+ GoodsDonSku sku = goodsDonSkuMapper.selectById(trialSkuId);
|
|
|
+ if (sku == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("系统异常,请联系客服..");
|
|
|
+ }
|
|
|
+ Long goodsId = sku.getGoodsId();
|
|
|
+ //是否购买过mj镜像
|
|
|
+ Integer count = orderDonMapper.checkUserHasPaidMjMirror(userIdList);
|
|
|
+ if (count > 0) {
|
|
|
+ throw BusinessRuntimeException.getInstance("您不符合领取条件");
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer selectCount = userReceiveTrialTicketRecordMapper.selectCount(Wrappers.lambdaQuery(UserReceiveTrialTicketRecord.class)
|
|
|
+ .in(UserReceiveTrialTicketRecord::getUserId, userIdList)
|
|
|
+ .eq(UserReceiveTrialTicketRecord::getSkuId, trialSkuId));
|
|
|
+ if (selectCount > 0) {
|
|
|
+ throw BusinessRuntimeException.getInstance("您已领取该试用车票");
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ UserReceiveTrialTicketRecord userReceiveTrialTicketRecord = new UserReceiveTrialTicketRecord();
|
|
|
+ userReceiveTrialTicketRecord.setUserId(userId);
|
|
|
+ userReceiveTrialTicketRecord.setGoodsId(goodsId);
|
|
|
+ userReceiveTrialTicketRecord.setSkuId(trialSkuId);
|
|
|
+
|
|
|
+ userReceiveTrialTicketRecordMapper.insert(userReceiveTrialTicketRecord);
|
|
|
+
|
|
|
+ Long relationId = getTrialTicketByUserIdAndGoodsId(userId, trialSkuId);
|
|
|
+ userReceiveTrialTicketRecord.setRelationId(relationId);
|
|
|
+ userReceiveTrialTicketRecordMapper.updateById(userReceiveTrialTicketRecord);
|
|
|
+
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ throw BusinessRuntimeException.getInstance("您已领取该试用车票");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean isReceiveTrialTicket(long userId, Long trialSkuId) {
|
|
|
+ List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
|
|
|
+ //是否购买过mj镜像
|
|
|
+ Integer count = orderDonMapper.checkUserHasPaidMjMirror(userIdList);
|
|
|
+ if (count > 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ Integer selectCount = userReceiveTrialTicketRecordMapper.selectCount(Wrappers.lambdaQuery(UserReceiveTrialTicketRecord.class)
|
|
|
+ .in(UserReceiveTrialTicketRecord::getUserId, userIdList)
|
|
|
+ .eq(UserReceiveTrialTicketRecord::getSkuId, trialSkuId));
|
|
|
+ return selectCount > 0 ? true : false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Long getTrialTicketByUserIdAndGoodsId(Long userId, Long trialSkuId) {
|
|
|
+ Retryer<Long> build = RetryerBuilder.<Long>newBuilder()
|
|
|
+ .retryIfException()
|
|
|
+ //运行时异常重试
|
|
|
+ .retryIfRuntimeException()
|
|
|
+ //false重试
|
|
|
+ .retryIfResult(res -> res == null)
|
|
|
+ //1s 间隔
|
|
|
+ .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))
|
|
|
+ //停止策略 : 尝试请求3次
|
|
|
+ .withStopStrategy(StopStrategies.stopAfterAttempt(3)).build();
|
|
|
+ try {
|
|
|
+ return build.call(() -> {
|
|
|
+ //体验规格
|
|
|
+ GroupsTrips groups = groupsMapper.selectCollegeStudentUserGptTicket(trialSkuId);
|
|
|
+ GroupsRelation relation = null;
|
|
|
+ if (groups != null) {
|
|
|
+ relation = groupsRelationMapper.selectRandomOneRelationByGroupsId(groups.getId());
|
|
|
+ }
|
|
|
+ if (relation == null) {
|
|
|
+ //生成空车队
|
|
|
+ GoodsDonSku sku = goodsDonSkuMapper.selectById(trialSkuId);
|
|
|
+ relation = groupsFuncService.createNewGroupsTrips(sku);
|
|
|
+ }
|
|
|
+ DateTime startTime = DateTime.now();
|
|
|
+ DateTime expiryTime = DateUtil.offsetDay(startTime, 1);
|
|
|
+ int update = groupsRelationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)
|
|
|
+ .set(GroupsRelation::getUserId, userId)
|
|
|
+ .set(GroupsRelation::getStartTime, startTime)
|
|
|
+ .set(GroupsRelation::getExpiryTime, expiryTime)
|
|
|
+ .set(GroupsRelation::getStatus, GroupsRelation.Status.validity)
|
|
|
+ .set(GroupsRelation::getAqType, 2)
|
|
|
+ .eq(GroupsRelation::getId, relation.getId())
|
|
|
+ .eq(GroupsRelation::getUserId, 0));
|
|
|
+ if (update > 0) {
|
|
|
+ groupsMapper.decrAvailableNum(groups.getId());
|
|
|
+ return relation.getId();
|
|
|
+ }
|
|
|
+ log.error("发送用户:{} GPT镜像车票体验失败,进行重试", userId);
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ } catch (ExecutionException | RetryException e) {
|
|
|
+ log.error("发送用户GPT镜像体验失败:{}", StringUtil.getErrorText(e));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|