Эх сурвалжийг харах

fix 修改获取车票额外硬塞座位规则

zoujiajian 2 жил өмнө
parent
commit
7d36069748

+ 5 - 131
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -21,7 +21,6 @@ import com.cyksj.mapper.manage.exchange.ExchangeCodeMapper;
 import com.cyksj.mapper.market.draw.LuckyDrawRecordMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelExchangeCodeData;
-import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.request.ExchangeCodeReq;
 import com.cyksj.model.request.ExchangeCodeTicket;
 import com.cyksj.redis.RedisService;
@@ -30,7 +29,6 @@ import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.shop.YhShopFrontService;
 import com.ejlchina.searcher.BeanSearcher;
-import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -360,61 +358,15 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	@Override
 	public GroupsRelation getRelationNoOrder(GoodsDonSku sku, Long userId, Long yhsId) {
-		GroupsRelation relation = null;
 		Integer retryNum = 1;
 		List<Long> errorsRelationIds = new ArrayList<>();
-		relation = getFinalRelation(sku, userId, relation, retryNum, yhsId, errorsRelationIds);
+		GroupsRelation relation = getFinalRelation(sku, userId, retryNum, yhsId, errorsRelationIds);
 		return relation;
 	}
 
-	public GroupsRelation getFinalRelation(GoodsDonSku sku, Long userId, GroupsRelation relation, Integer retryNum, Long yhsId, List<Long> errorsRelationIds) {
-		//寻找差不多过期时间规格的车位
-		relation = groupRelationFrontService.getSimilarExpiredGroupRelation(sku.getId(), sku.getDays(), sku.getMonths(), errorsRelationIds);
-		if (relation == null) {
-			GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
-					.eq(GroupsTrips::getSkuId, sku.getId())
-					.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
-					.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
-					.orderByAsc(GroupsTrips::getAvailableNum));
-			if (groups == null) {
-				//若是ChatGPT Plus 、MidJourney
-				//获取额外的车位
-				relation = getOutSideRelationIfAi(userId, groups, sku);
-				if (relation != null) {
-					groups = groupsMapper.selectById(relation.getGroupsId());
-				}
-				//待发车
-				if (relation == null) {
-					groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
-							.eq(GroupsTrips::getSkuId, sku.getId())
-							.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
-							.eq(GroupsTrips::getStatus, GroupsTrips.Status.waiting)
-							.orderByAsc(GroupsTrips::getAvailableNum));
-				}
-			}
-			if (groups == null) {
-				//新增车位 并关联
-				relation = createNewGroupTripsAndRelation(sku, groups, relation);
-				log.info("无合适规格车队,新增新车队,获取车位relationId:{}", relation.getId());
-			}
-
-			if (relation == null) {
-				//寻找快满编车队进行占座
-				relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-						.eq(GroupsRelation::getGroupsId, groups.getId())
-						.notIn(errorsRelationIds != null && errorsRelationIds.size() > 0, GroupsRelation::getId, errorsRelationIds)
-						.eq(GroupsRelation::getStatus, "none")
-						.eq(GroupsRelation::getUserId, 0)
-						.orderByAsc(GroupsRelation::getNum)
-						.last("limit 1")
-				);
-				log.info("寻找快满编车队的车位relationId:{}", relation.getId());
-				//如果占位失败 新增车位并关联
-				if (relation == null) {
-					relation = getOutSideRelationIfAi(userId, groups, sku);
-				}
-			}
-		}
+	public GroupsRelation getFinalRelation(GoodsDonSku sku, Long userId, Integer retryNum, Long yhsId, List<Long> errorsRelationIds) {
+		//获取车票车位
+		GroupsRelation relation = groupRelationFrontService.getRelation(null, userId, sku);
 
 		try {
 			//锁定座位
@@ -450,7 +402,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				throw BusinessRuntimeException.getInstance("获取车票异常,请联系客服");
 			}
 			//失败重新给他分配车位
-			getFinalRelation(sku, userId, relation, ++retryNum, yhsId, errorsRelationIds);
+			getFinalRelation(sku, userId, ++retryNum, yhsId, errorsRelationIds);
 		}
 		return relation;
 	}
@@ -475,82 +427,4 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			}
 		}
 	}
-
-	/**
-	 * 新增新车位并关联车位
-	 */
-	private GroupsRelation createNewGroupTripsAndRelation(GoodsDonSku sku, GroupsTrips groups, GroupsRelation relation) {
-		//通过兑换码兑换车票 新增车位
-		if (groups == null) {
-			groups = new GroupsTrips();
-		}
-		//补充占位
-		if (relation == null) {
-			relation = new GroupsRelation();
-		}
-		groups.setSkuId(sku.getId());
-		groups.setNum(sku.getNum());
-		groups.setAvailableNum(sku.getNum());
-		if (sku.getGoodsId() == 23) {
-			AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGoodsId, 23).onlySelect(AccountView::getId).build());
-			if (accountView != null) {
-				groups.setAccountId(accountView.getId());
-				groups.setStatus(GroupsTrips.Status.validity);
-				groups.setRemark("已设置唯一账号");
-			}else {
-				groups.setStatus(GroupsTrips.Status.waiting);
-				groups.setRemark("等待设置账号");
-			}
-		} else {
-			groups.setStatus(GroupsTrips.Status.waiting);
-			groups.setRemark("等待设置账号");
-		}
-		groupsMapper.insert(groups);
-		relation.setGroupsId(groups.getId());
-		relation.setNum(1);
-		relation.setStatus(GroupsRelation.Status.none);
-		relation.setGroupsId(groups.getId());
-		groupsRelationMapper.insert(relation);
-		//补充其他占位
-		for (int i = 2; i <= groups.getNum(); i++) {
-			GroupsRelation groupsRelation = new GroupsRelation();
-			groupsRelation.setGroupsId(groups.getId());
-			groupsRelation.setNum(i);
-			groupsRelation.setStatus(GroupsRelation.Status.none);
-			groupsRelationMapper.insert(groupsRelation);
-		}
-		return relation;
-	}
-
-	public GroupsRelation getOutSideRelationIfAi(Long userId, GroupsTrips groups, GoodsDonSku sku) {
-		//若是MidJourney、ChatGPT PLUS每个已满车队 硬塞5个座位
-		//主账号过期时间10天以外
-		GroupsRelation relation = null;
-		if (sku.getNum() > 1 && Constant.AI_goodsIds.contains(sku.getGoodsId())) {
-			DateTime tenExpiry = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 10);
-			Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), tenExpiry, 5, userId, sku.getNum());
-			if (groupsId != null) {
-				relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-						.eq(GroupsRelation::getGroupsId, groupsId)
-						.eq(GroupsRelation::getUserId, 0)
-						.eq(GroupsRelation::getStatus, GroupsRelation.Status.outside)
-						.last("limit 1"));
-				if (relation == null) {
-					relation = new GroupsRelation();
-					relation.setStatus(GroupsRelation.Status.outside);
-					relation.setUserId(userId);
-					relation.setGroupsId(groupsId);
-					GroupsRelation maxNumRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId, groupsId).orderByDesc(GroupsRelation::getNum).last("limit 1"));
-					Integer nextNum = maxNumRelation.getNum() + 1;
-					if (redisService.setNx(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, nextNum), nextNum, RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getTimeout())) {
-						relation.setNum(nextNum);
-						groupsRelationMapper.insert(relation);
-					} else {
-						throw BusinessRuntimeException.getInstance("系统繁忙,请重新兑换");
-					}
-				}
-			}
-		}
-		return relation;
-	}
 }

+ 3 - 2
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -376,10 +376,11 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
         if (Constant.AI_goodsIds.contains(sku.getGoodsId()) && sku.getNum() > 1) {
             Integer extraNum = Constant.AI_EXTRACT_NUM;
             Integer maxNum = skuNum + extraNum;
-            DateTime tenExpiry = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 10);
+            //主账号有效时间
+            DateTime time = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 25);
             Integer available = relationMapper.selectAvailableRelation(skuId, skuNum);
             //额外硬塞
-            Integer special_available = relationMapper.selectSpecialGroupsRelationAvailable(skuId, maxNum, skuNum, extraNum, tenExpiry);
+            Integer special_available = relationMapper.selectSpecialGroupsRelationAvailable(skuId, maxNum, skuNum, extraNum, time);
             available += special_available;
             available = getAvailableAfterPreAccount(available, skuId, maxNum, goodsId);
             //待发车已有人员成功上车

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

@@ -105,9 +105,6 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
-import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
-
 /**
  * @author chan
  * @date 2021/10/11 下午4:08
@@ -1907,83 +1904,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	 * yshId 店铺id
 	 */
 	public GroupsRelation getRelation(OrderPayRequest payRequest, GoodsDonSku sku, Long yhsId) {
-		GroupsRelation relation;
 		Long payRelationId = payRequest.getRelationId();
 		Boolean isLoginPopularize = payRequest.getIsLoginPopularize();
 		Long userId = payRequest.getUserId();
-		//锁定座位
-		if (payRelationId != null && payRelationId > 0) {
-			relation = groupsRelationMapper.selectById(payRelationId);
-			if (relation == null) {
-				throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-			}
-			if (relation.getUserId() != null && relation.getUserId() > 0L) {
-				throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
-			}
-
-		} else {
-			//寻找差不多过期时间规格的车位
-			relation = groupRelationFrontService.getSimilarExpiredGroupRelation(sku.getId(), sku.getDays(), sku.getMonths(), null);
-			if (relation == null) {
-				//TODO 如果没指定座位,等待逻辑确认
-				GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
-						.eq(GroupsTrips::getSkuId, sku.getId())
-						.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
-						.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
-						.orderByAsc(GroupsTrips::getAvailableNum));
-				if (groups == null) {
-					//若是MidJourney、ChatGPT PLUS每个已满车队 硬塞5个座位
-					//主账号过期时间10天以外
-					if (sku.getNum() > 1 && Constant.AI_goodsIds.contains(sku.getGoodsId())) {
-						DateTime tenExpiry = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 10);
-						//不塞存在该用户的车队
-						Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), tenExpiry, 5, userId, sku.getNum());
-						if (groupsId != null) {
-							relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-									.eq(GroupsRelation::getGroupsId, groupsId)
-									.eq(GroupsRelation::getUserId, 0)
-									.eq(GroupsRelation::getStatus, GroupsRelation.Status.outside)
-									.last("limit 1"));
-							if (relation == null) {
-								relation = new GroupsRelation();
-								relation.setStatus(GroupsRelation.Status.outside);
-								relation.setUserId(userId);
-								relation.setGroupsId(groupsId);
-								GroupsRelation maxNumRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId, groupsId).orderByDesc(GroupsRelation::getNum).last("limit 1"));
-								Integer nextNum = maxNumRelation.getNum() + 1;
-								if (redisService.setNx(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, nextNum), nextNum, RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getTimeout())) {
-									relation.setNum(nextNum);
-									groupsRelationMapper.insert(relation);
-								} else {
-									throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
-								}
-							}
-							groups = groupsMapper.selectById(groupsId);
-						}
-					}
-					if (relation == null) {
-						//待发车
-						groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
-								.eq(GroupsTrips::getSkuId, sku.getId())
-								.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
-								.eq(GroupsTrips::getStatus, GroupsTrips.Status.waiting)
-								.orderByAsc(GroupsTrips::getAvailableNum));
-					}
-				}
-
-				if (groups == null) {
-					relation = groupsFuncService.createNewGroupsTrips(sku);
-				}
-
-				if (relation == null) {
-					//寻找快满编车队进行占座
-					relation = groupsRelationMapper.selectRandomOneRelationByGroupsId(groups.getId());
-					if (relation == null) {
-						throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-					}
-				}
-			}
-		}
+		//获取车票车位
+		GroupsRelation relation = groupRelationFrontService.getRelation(payRelationId, userId, sku);
 
 		//锁定座位
 		setRelation(relation.getId(), relation.getGroupsId(), userId, sku.getGoodsId(), isLoginPopularize, relation.getStatus());

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

@@ -1,6 +1,7 @@
 package com.cyksj.service.relation;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.request.SpecialGoodsTicketReq;
 import com.cyksj.model.views.RenewalView;
@@ -27,4 +28,9 @@ public interface GroupRelationFrontService {
 	 * 通过邮件发送课程
 	 */
 	void sendCourseWare(SpecialGoodsTicketReq request) throws Exception;
+
+	/**
+	 * 获取车票座位
+	 */
+	GroupsRelation getRelation(Long payRelationId, Long userId, GoodsDonSku sku);
 }

+ 89 - 4
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -8,18 +8,17 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.enums.GatewayApiCode;
-import com.cyksj.mapper.GroupsRelationMapper;
-import com.cyksj.mapper.OrderDiscountPlusPurchaseSkuRelationMapper;
-import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.SpecialGoodsTicketReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.chatgpt.ChatGptAuthService;
+import com.cyksj.service.groups.GroupsFuncService;
 import com.cyksj.service.mail.MailService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.relation.GroupRelationFrontService;
@@ -40,6 +39,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
+import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
+import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
+
 /*
  *项目名: netflix
  *文件名: GroupRelationFrontServiceImpl
@@ -60,6 +62,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final GroupsRelationMapper groupsRelationMapper;
 
+	private final GroupsMapper groupsMapper;
+
 	private final ChatGptAuthService chatGptAuthService;
 
 	private final RedisService redisService;
@@ -72,6 +76,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final HttpServletRequest request;
 
+	private final GroupsFuncService groupsFuncService;
+
 	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
 
 	@Override
@@ -284,4 +290,83 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			mailService.sendCoursewareByGoodsId(relation.getGoodsId(), relation.getRelationId(), relation.getUserId(), relation.getTitle(), email);
 		}
 	}
+
+	@Override
+	public GroupsRelation getRelation(Long payRelationId, Long userId, GoodsDonSku sku) {
+		GroupsRelation relation = null;
+		if (payRelationId != null && payRelationId > 0) {
+			relation = groupsRelationMapper.selectById(payRelationId);
+			if (relation == null) {
+				throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
+			}
+			if (relation.getUserId() != null && relation.getUserId() > 0L) {
+				throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
+			}
+
+		} else {
+			GroupsTrips groups = null;
+			//ChatGpt Plus、Midjourney非独立规格 上车先获取硬塞座位 硬塞5个座位
+			//主账号过期时间25天以外
+			if (sku.getNum() > 1 && Constant.AI_goodsIds.contains(sku.getGoodsId())) {
+				DateTime time = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 25);
+				//不塞存在该用户的车队
+				Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), time, 5, userId, sku.getNum());
+				if (groupsId != null) {
+					relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+							.eq(GroupsRelation::getGroupsId, groupsId)
+							.eq(GroupsRelation::getUserId, 0)
+							.eq(GroupsRelation::getStatus, GroupsRelation.Status.outside)
+							.last("limit 1"));
+					if (relation == null) {
+						relation = new GroupsRelation();
+						relation.setStatus(GroupsRelation.Status.outside);
+						relation.setUserId(userId);
+						relation.setGroupsId(groupsId);
+						GroupsRelation maxNumRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId, groupsId).orderByDesc(GroupsRelation::getNum).last("limit 1"));
+						Integer nextNum = maxNumRelation.getNum() + 1;
+						if (redisService.setNx(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, nextNum), nextNum, RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getTimeout())) {
+							relation.setNum(nextNum);
+							groupsRelationMapper.insert(relation);
+						} else {
+							throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
+						}
+					}
+					groups = groupsMapper.selectById(groupsId);
+				}
+			}
+			if (groups == null) {
+				//寻找差不多过期时间规格的车位
+				relation = getSimilarExpiredGroupRelation(sku.getId(), sku.getDays(), sku.getMonths(), null);
+				if (relation == null) {
+					//TODO 如果没指定座位,等待逻辑确认
+					groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
+							.eq(GroupsTrips::getSkuId, sku.getId())
+							.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
+							.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
+							.orderByAsc(GroupsTrips::getAvailableNum));
+					if (groups == null) {
+						//待发车
+						groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
+								.eq(GroupsTrips::getSkuId, sku.getId())
+								.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
+								.eq(GroupsTrips::getStatus, GroupsTrips.Status.waiting)
+								.orderByAsc(GroupsTrips::getAvailableNum));
+					}
+					//新增空车队
+					if (groups == null) {
+						relation = groupsFuncService.createNewGroupsTrips(sku);
+					}
+					//获取车位
+					if (relation == null) {
+						//寻找快满编车队进行占座
+						relation = groupsRelationMapper.selectRandomOneRelationByGroupsId(groups.getId());
+						if (relation == null) {
+							throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
+						}
+					}
+				}
+			}
+		}
+		return relation;
+	}
 }