zoujiajian 10 months ago
parent
commit
d646272162

+ 3 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -103,6 +103,7 @@ import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.relation.GroupsRelationNetflixService;
 import com.cyksj.service.shop.YhShopDistributeService;
 import com.cyksj.service.shop.YhShopFrontService;
+import com.cyksj.service.sora.SoraCodeFrontService;
 import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.telegram.TelegramService;
 import com.cyksj.service.template.TemplateCommonService;
@@ -404,7 +405,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final CodexUserMapper codexUserMapper;
 
-	private final SoraCodeService soraCodeService;
+	private final SoraCodeFrontService soraCodeFrontService;
 
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
@@ -3293,7 +3294,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			
 			// GPT独立会员购买,赠送sora邀请码
 			try {
-				soraCodeService.grantSoraCodeForGptMember(orderDon.getUserId(), orderDon.getId());
+				soraCodeFrontService.grantSoraCodeForGptMember(orderDon.getUserId(), orderDon.getId());
 			} catch (Exception e) {
 				log.error("为GPT独立会员用户{}订单{}赠送sora邀请码失败", orderDon.getUserId(), orderDon.getId(), e);
 			}

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -117,4 +117,6 @@ public interface GroupRelationFrontService {
 	TicketRenewUpgradeView getRenewUpgradeInfo(long userId, Long relationId);
 
 	void netflixSubmitFrozen(ErrorNetflixChangeReq req);
+
+	String getSoraCode(Long userId, Long relationId);
 }

+ 52 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -59,6 +59,7 @@ import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationChangeService;
+import com.cyksj.service.sora.SoraCodeFrontService;
 import com.cyksj.service.translations.BackInfoTranslationsFrontService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.user.UserBindRelationService;
@@ -223,6 +224,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final AccountNetflixFrozenTicketReceivedRecordMapper accountNetflixFrozenTicketReceivedRecordMapper;
 
+	private final SoraCodeMapper soraCodeMapper;
+
+	private final SoraCodeFrontService soraCodeFrontService;
+
 	@Override
 	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account, String orderNo, Integer cmt) {
 		User u = userMapper.selectById(userId);
@@ -2145,6 +2150,53 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		}
 	}
 
+	@Override
+	public String getSoraCode(Long userId, Long relationId) {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+		if (relation == null) {
+			throw BusinessRuntimeException.getInstance("车票不存在");
+		}
+		if (!userIdList.contains(relation.getUserId())) {
+			throw BusinessRuntimeException.getInstance("车票不存在");
+		}
+		if (relation.getStatus() != GroupsRelation.Status.validity) {
+			throw BusinessRuntimeException.getInstance("车票不存在");
+		}
+		if (relation.getExpiryTime() != null && relation.getExpiryTime().before(DateTime.now())) {
+			throw BusinessRuntimeException.getInstance("车票已过期");
+		}
+
+		GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(groupsTrips.getSkuId());
+
+		//非GPT独立
+		if (sku.getGoodsId() != Constant.GPT_PLUS_GID || sku.getNum() != 1) {
+			throw BusinessRuntimeException.getInstance("非GPT独立会员车票");
+		}
+
+		OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class).in(OrderDon::getUserId, userIdList).eq(OrderDon::getRelationId, relationId).notIn(OrderDon::getStatus, Constant.noOrderAllStatus).orderByDesc(OrderDon::getId).last("limit 1"));
+
+		if (orderDon.getCreatedTime().before(DateUtil.parse("2025-10-24 19:00:00"))) {
+			throw BusinessRuntimeException.getInstance("系统异常");
+		}
+
+		SoraCode soraCode = soraCodeMapper.selectOne(Wrappers.lambdaQuery(SoraCode.class).eq(SoraCode::getOrderId, orderDon.getId()).last("limit 1"));
+		if (soraCode == null) {
+			try {
+				soraCodeFrontService.grantSoraCodeForGptMember(relation.getUserId(), orderDon.getId());
+				soraCode = soraCodeMapper.selectOne(Wrappers.lambdaQuery(SoraCode.class).eq(SoraCode::getOrderId, orderDon.getId()).last("limit 1"));
+			} catch (Exception e) {
+
+			}
+		}
+		if (soraCode == null) {
+			throw BusinessRuntimeException.getInstance("暂无可用sora邀请码,请联系客服");
+		}
+		return soraCode.getCode();
+	}
+
 	private DistributePosterGoodsDetailView setGoodsPoster(RenewalView ticket, User user, List<Long> userIds) {
 		DistributePosterGoodsDetailView distributePosterGoodsDetailView = beanSearcher.searchFirst(DistributePosterGoodsDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.field(DistributePosterGoodsFrontView::getGoodsId, ticket.getGoodsId()).build());

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/sora/SoraCodeFrontService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.sora;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: SoraCodeFrontService
+ * 创建者: JavaZou
+ * 创建时间:2025/10/14 10:39
+ */
+public interface SoraCodeFrontService {
+	/**
+	 * 为GPT独立会员用户赠送sora邀请码
+	 *
+	 * @param userId 用户ID
+	 * @param orderId 订单ID
+	 */
+	void grantSoraCodeForGptMember(Long userId, Long orderId);
+}

+ 0 - 8
netflix-service/src/main/java/com/cyksj/service/sora/SoraCodeService.java

@@ -25,12 +25,4 @@ public interface SoraCodeService {
      * 删除Sora邀请码
      */
     void deleteSoraCode(Long id);
-
-    /**
-     * 为GPT独立会员用户赠送sora邀请码
-     * 
-     * @param userId 用户ID
-     * @param orderId 订单ID
-     */
-    void grantSoraCodeForGptMember(Long userId, Long orderId);
 }

+ 72 - 0
netflix-service/src/main/java/com/cyksj/service/sora/impl/SoraCodeFrontServiceImpl.java

@@ -0,0 +1,72 @@
+package com.cyksj.service.sora.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.SoraCodeMapper;
+import com.cyksj.model.entity.SoraCode;
+import com.cyksj.service.sora.SoraCodeFrontService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: SoraCodeFrontServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2025/10/14 10:40
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class SoraCodeFrontServiceImpl implements SoraCodeFrontService {
+	private final SoraCodeMapper soraCodeMapper;
+
+	@Override
+	@Transactional
+	public void grantSoraCodeForGptMember(Long userId, Long orderId) {
+		// 检查该用户是否已经通过此订单获得过sora邀请码
+		Integer existCount = soraCodeMapper.selectCount(
+				new LambdaQueryWrapper<SoraCode>()
+						.eq(SoraCode::getUserId, userId)
+						.eq(SoraCode::getOrderId, orderId)
+		);
+
+		if (existCount > 0) {
+			log.warn("用户{}订单{}已赠送过sora邀请码,跳过重复赠送", userId, orderId);
+			return;
+		}
+
+		while (true) {
+			// 查找一个未使用的sora邀请码
+			SoraCode availableCode = soraCodeMapper.selectOne(
+					new LambdaQueryWrapper<SoraCode>()
+							.eq(SoraCode::getStatus, false)
+							.isNull(SoraCode::getUserId)
+							.isNull(SoraCode::getOrderId)
+							.last("limit 1")
+			);
+
+			if (availableCode == null) {
+				log.error("没有可用的sora邀请码赠送给用户{},订单{}", userId, orderId);
+				throw new BusinessRuntimeException("暂无可用的sora邀请码");
+			}
+
+			// 将邀请码绑定给用户和订单
+			availableCode.setUserId(userId);
+			availableCode.setOrderId(orderId);
+			availableCode.setStatus(Boolean.TRUE);
+
+			try {
+				int updateResult = soraCodeMapper.update(availableCode, Wrappers.lambdaUpdate(SoraCode.class).eq(SoraCode::getId, availableCode.getId()).eq(SoraCode::getStatus, Boolean.FALSE));
+				if (updateResult > 0) {
+					log.info("成功为用户{}订单{}赠送sora邀请码:{}", userId, orderId, availableCode.getCode());
+					break;
+				}
+			} catch (Exception e) {
+				throw BusinessRuntimeException.getInstance("");
+			}
+		}
+	}
+}

+ 0 - 45
netflix-service/src/main/java/com/cyksj/service/sora/impl/SoraCodeServiceImpl.java

@@ -2,7 +2,6 @@ package com.cyksj.service.sora.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.SoraCodeMapper;
 import com.cyksj.model.entity.SoraCode;
@@ -13,7 +12,6 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DataAccessException;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * Sora邀请码Service实现类
@@ -89,47 +87,4 @@ public class SoraCodeServiceImpl implements SoraCodeService {
         }
         soraCodeMapper.deleteById(id);
     }
-
-    @Override
-    @Transactional
-    public void grantSoraCodeForGptMember(Long userId, Long orderId) {
-        // 检查该用户是否已经通过此订单获得过sora邀请码
-        Integer existCount = soraCodeMapper.selectCount(
-                new LambdaQueryWrapper<SoraCode>()
-                        .eq(SoraCode::getUserId, userId)
-                        .eq(SoraCode::getOrderId, orderId)
-        );
-
-        if (existCount > 0) {
-            log.warn("用户{}订单{}已赠送过sora邀请码,跳过重复赠送", userId, orderId);
-            return;
-        }
-
-        while (true) {
-            // 查找一个未使用的sora邀请码
-            SoraCode availableCode = soraCodeMapper.selectOne(
-                    new LambdaQueryWrapper<SoraCode>()
-                            .eq(SoraCode::getStatus, false)
-                            .isNull(SoraCode::getUserId)
-                            .isNull(SoraCode::getOrderId)
-                            .last("limit 1")
-            );
-
-            if (availableCode == null) {
-                log.error("没有可用的sora邀请码赠送给用户{},订单{}", userId, orderId);
-                throw new BusinessRuntimeException("暂无可用的sora邀请码");
-            }
-
-            // 将邀请码绑定给用户和订单
-            availableCode.setUserId(userId);
-            availableCode.setOrderId(orderId);
-            availableCode.setStatus(Boolean.TRUE);
-
-            int updateResult = soraCodeMapper.update(availableCode, Wrappers.lambdaUpdate(SoraCode.class).eq(SoraCode::getId, availableCode.getId()).eq(SoraCode::getStatus, Boolean.FALSE));
-            if (updateResult > 0) {
-                log.info("成功为用户{}订单{}赠送sora邀请码:{}", userId, orderId, availableCode.getCode());
-                break;
-            }
-        }
-    }
 }

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -1538,4 +1538,14 @@ public class GroupRelationController {
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult(sysLogs);
     }
+
+    /**
+     * 查看sora邀请码
+     */
+    @GetMapping("/get/sora/code/{relationId}")
+    public Result<String> getSoraCode(@PathVariable Long relationId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        String soraCode = groupRelationFrontService.getSoraCode(userId, relationId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(soraCode);
+    }
 }