Quellcode durchsuchen

GPT Plus10人月付规格、GPT4人月付新车队限制前三天上车数

zoujiajian vor 2 Jahren
Ursprung
Commit
f46e8f7ce6

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -232,4 +232,9 @@ public interface Constant {
 	 * 百度回传 过滤平台
 	 */
 	String BAIDU_POST_FILTER_GOODS_KEY = "baidu_post_filter_goods_key";
+
+	/**
+	 * GPT Plus规格 新车队规格限制上车数
+	 */
+	List<Long> GPT_PLUS_PARKING_SKU_IDS = List.of(161l, 178l);
 }

+ 4 - 2
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationMapper.java

@@ -28,7 +28,7 @@ public interface GroupsRelationMapper extends BaseMapper<GroupsRelation> {
 	@Update("update groups_relation set customer_service = null where id = #{id}")
 	void updateCustomerService(Long id);
 
-	Long selectSimilarExpiredRelation(@Param("skuId") Long skuId, @Param("minExpiryTime") DateTime minExpiryTime);
+	Long selectSimilarExpiredRelation(@Param("skuId") Long skuId, @Param("minExpiryTime") DateTime minExpiryTime, @Param("maxNum") Integer maxNum);
 
 	List<GroupsRelationView> selectRelationByGoodsId(@Param("goodsId") Long goodsId, @Param("userId") Long userId, @Param("yhsId") Long yhsId);
 
@@ -52,11 +52,13 @@ public interface GroupsRelationMapper extends BaseMapper<GroupsRelation> {
 
 	Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(@Param("page") Page<UserRecommendGoodsFrontView> page, @Param("list") List<Long> filter_goods_id, @Param("isPayNf") Boolean isPayNf);
 
-	Long getOutSideGroupsTripsRelationByGoodsId(@Param("skuId") Long skuId, @Param("beginOfDay") DateTime beginOfDay, @Param("extraNum") Integer extraNum, @Param("userId") Long userId, @Param("skuNum") Integer skuNum);
+	Long getOutSideGroupsTripsRelationByGoodsId(@Param("skuId") Long skuId, @Param("beginOfDay") DateTime beginOfDay, @Param("extraNum") Integer extraNum, @Param("userId") Long userId, @Param("skuNum") Integer skuNum, @Param("maxNum") Integer maxNum);
 
 	Integer selectAvailableRelation(@Param("skuId") Long skuId, @Param("skuNum") Integer skuNum);
 
 	Integer selectSpecialGroupsRelationAvailable(@Param("skuId") Long skuId, @Param("maxNum") Integer maxNum, @Param("skuNum") Integer skuNum, @Param("extractNum") Integer extractNum, @Param("tenExpiry") DateTime tenExpiry);
 
 	Integer selectNumWaitingGroups(Long skuId);
+
+	Integer selectLimitAvailableNum(@Param("skuId") Long skuId, @Param("maxNum") Integer maxNum);
 }

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java

@@ -89,6 +89,14 @@ public class GroupsRelation extends BaseEntity {
     private Long newRelationId;
 
 
+    /**
+     * 车队目前可用停车数
+     */
+    @TableField(exist = false)
+    @DbIgnore
+    private Integer groupsAvailParkingNum;
+
+
     @AllArgsConstructor
     @Getter
     public enum Status{

+ 12 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsTrips.java

@@ -133,6 +133,18 @@ public class GroupsTrips {
     @TableField(exist = false)
     private Boolean isExists;
 
+    /**
+     * 可上车队时间
+     */
+    @DbField("gt.parking_time")
+    private Date parkingTime;
+
+    /**
+     * 目前可停车数目
+     */
+    @DbField("gt.available_parking_num")
+    private Integer availableParkingNum;
+
     /**
      * 创建时间
      */

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/views/EmptyGroupsRelationView.java

@@ -17,7 +17,7 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "account a inner join groups_trips gt on gt.account_id = a.id",
-		where = ":account_id:")
+		where = ":condition:")
 public class EmptyGroupsRelationView {
 	@DbField("a.id")
 	private Long accountId;

+ 21 - 3
netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml

@@ -52,6 +52,7 @@
               from `groups_trips` gt
                        left join `groups_relation` gr on gr.groups_id = gt.id
               where gt.sku_id = #{skuId}
+                and (gt.available_parking_num = 0 or (select count(*) from groups_relation gr where gr.groups_id = gt.id and gr.user_id != 0 and gr.num &lt; #{maxNum}) &lt; gt.available_parking_num)
                 and gt.available_num > 0
                 and gt.status = 'validity'
                 and gr.status = 'validity'
@@ -235,6 +236,7 @@
         where gr.groups_id = gt.id
           and gr.user_id
             = #{userId}) = 0
+          and (gt.available_parking_num = 0 or (select count(*) from groups_relation gr where gr.groups_id = gt.id and gr.user_id != 0 and gr.num &lt; #{maxNum}) &lt; gt.available_parking_num)
         order by RAND() limit 1
     </select>
 
@@ -245,7 +247,8 @@
             and gt.`status` = 'validity'
             and gt.sku_id = #{skuId}
                  inner join groups_relation gr on gr.groups_id = gt.id
-            and gr.status in ('none','locking')
+            and gr.status in ('none', 'locking')
+            and gt.available_parking_num = 0
             and gr.num &lt;= #{skuNum}
     </select>
 
@@ -266,9 +269,10 @@
               from account a
                        inner join `groups_trips` gt on gt.account_id = a.id
                   and gt.`status` = 'validity'
+                  and gt.available_parking_num = 0
                   and gt.sku_id = #{skuId}
-                  and a.expiry_time >= #{tenExpiry}) s
-        where (t1 = 5 and a1 = 0) = 0
+            and a.expiry_time >= #{tenExpiry}) s
+        where (t1 = #{extractNum} and a1 = 0) = 0
     </select>
 
     <select id="selectNumWaitingGroups" resultType="java.lang.Integer">
@@ -280,4 +284,18 @@
             and gr.user_id != 0
             and gr.status in ('validity','outside')
     </select>
+
+    <select id="selectLimitAvailableNum" resultType="java.lang.Integer">
+        select sum(s1 - s2)
+        from (select available_parking_num          as s1,
+                     (select count(*)
+                      from groups_relation gr
+                      where gr.groups_id = gt.id
+                        and gr.status in ('validity', 'outside')
+                        and gr.num &lt;= #{maxNum}) as s2
+              from groups_trips gt
+              where gt.sku_id = #{skuId}
+                and gt.available_parking_num != 0) t
+        where t.s1 >= s2
+    </select>
 </mapper>

+ 28 - 18
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -370,7 +370,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 		try {
 			//锁定座位
-			setRelation(relation.getId(), userId, relation.getGroupsId(), relation.getStatus());
+			setRelation(relation);
 			relation.setUserId(userId);
 			GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
 			if (GroupsTrips.Status.validity.equals(groupsTrips.getStatus())) {
@@ -390,7 +390,13 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			}
 			relation.setYhsId(yhsId);
 			groupsRelationMapper.updateById(relation);
-			redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relation.getId());
+
+			Long skuId = sku.getId();
+			Long groupsId = relation.getGroupsId();
+			//校验指定平台规格的 目前车队的可停车位数
+			groupRelationFrontService.checkGroupsAvailParkingNum(skuId, groupsId, relation.getGroupsAvailParkingNum());
+
+			groupRelationFrontService.adjustGroupsParkingTime(relation.getId(), sku);
 		} catch (Exception e) {
 			Object value = redisService.get(RedisKey.GROUPS_RELATION_NUM_KEY + relation.getId());
 			if (value != null && userId.equals(Long.parseLong(value.toString()))) {
@@ -407,24 +413,28 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		return relation;
 	}
 
-	private void setRelation(Long relationId, Long userId, Long groupsId, GroupsRelation.Status status) {
-		if (redisService.get(RedisKey.GROUPS_RELATION_NUM_KEY + relationId) != null) {
-			log.info("=====>用户:{}获取了已有人座位:{}", userId, relationId);
-			throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
-		} else {
-			if (!redisService.setNx(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L)) {
+	public void setRelation(GroupsRelation relation) {
+		Long relationId = relation.getId();
+		Long userId = relation.getUserId();
+		Long groupsId = relation.getGroupsId();
+		GroupsRelation.Status status = relation.getStatus();
+		String relation_num_key = RedisKey.GROUPS_RELATION_NUM_KEY + relationId;
+		if (!redisService.setNx(relation_num_key, userId, 60 * 5L)) {
+			GroupsRelation dbRelation = groupsRelationMapper.selectById(relationId);
+			if (dbRelation.getUserId() != 0) {
 				log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
-				throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
-			}
-			if (status == GroupsRelation.Status.outside) {
-				return;
-			}
-			int count = groupsMapper.decrAvailableNum(groupsId);
-			if (count == 0) {
-				log.error("车位异常 groupId:{}", groupsId);
-				groupsMapper.updateAvailableNum(groupsId);
-				throw new BusinessRuntimeException("车位异常");
+				throw new BusinessRuntimeException("系统繁忙,请重试...");
 			}
 		}
+		if (status == GroupsRelation.Status.outside) {
+			return;
+		}
+		int count = groupsMapper.decrAvailableNum(groupsId);
+		if (count == 0) {
+			log.error("车位异常 groupId:{}", groupsId);
+			groupsMapper.updateAvailableNum(groupsId);
+			redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relationId);
+			throw new BusinessRuntimeException("车位异常");
+		}
 	}
 }

+ 10 - 0
netflix-service/src/main/java/com/cyksj/service/groups/impl/GroupFunServiceImpl.java

@@ -51,6 +51,16 @@ public class GroupFunServiceImpl implements GroupsFuncService {
 			groups.setStatus(GroupsTrips.Status.waiting);
 			groups.setRemark("等待设置账号");
 		}
+		//限制每天新车队前3天 停车数量
+		Integer availableParkingNum = 0;
+		if (sku.getId() == 161l) {
+			availableParkingNum = 10;
+		}
+		if (sku.getId() == 178l) {
+			availableParkingNum = 4;
+		}
+		groups.setAvailableParkingNum(availableParkingNum);
+
 		groupsMapper.insert(groups);
 		GroupsRelation relation = new GroupsRelation();
 		relation.setGroupsId(groups.getId());

+ 21 - 0
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -375,6 +375,10 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
         Integer skuNum = sku.getNum();
         if (Constant.AI_goodsIds.contains(sku.getGoodsId()) && sku.getNum() > 1) {
             Integer extraNum = Constant.AI_EXTRACT_NUM;
+            //GPT 4个月付
+            if (skuId == 178l) {
+                extraNum = 2;
+            }
             Integer maxNum = skuNum + extraNum;
             //主账号有效时间
             DateTime time = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 25);
@@ -382,6 +386,23 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
             //额外硬塞
             Integer special_available = relationMapper.selectSpecialGroupsRelationAvailable(skuId, maxNum, skuNum, extraNum, time);
             available += special_available;
+            //GPT Plus 10人月付规格 4人月付
+            if (Constant.GPT_PLUS_PARKING_SKU_IDS.contains(skuId)) {
+                //上面已排除限制车队
+                //限制车队可用车数位
+                Integer limitAvailable = Optional.ofNullable(relationMapper.selectLimitAvailableNum(skuId, maxNum)).orElse(0);
+                if (limitAvailable < 0) {
+                    limitAvailable = 0;
+                }
+                available += limitAvailable;
+
+                //新车队预备上车 最大可用数
+                if (Constant.GPT_PLUS_PARKING_SKU_IDS.get(0).equals(skuId)) {
+                    maxNum = 10;
+                }else {
+                    maxNum = 4;
+                }
+            }
             available = getAvailableAfterPreAccount(available, skuId, maxNum, goodsId);
             //待发车已有人员成功上车
             Integer waitingNum = relationMapper.selectNumWaitingGroups(skuId);

+ 11 - 1
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -53,6 +53,7 @@ import com.cyksj.service.order.OrderCommonService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.paypal.PayPalService;
 import com.cyksj.service.relation.GroupRelationClearService;
+import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationExpiryRecordService;
 import com.cyksj.service.shop.YhShopDistributeService;
 import com.cyksj.service.stripe.StripeService;
@@ -162,6 +163,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final UserPayEquipmentAvailableBenefitsMapper availableBenefitsMapper;
 
+    private final GroupRelationFrontService groupRelationFrontService;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -341,6 +344,9 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 .eq(WorkOrder::getStatus, WorkOrder.Status.waiting)
                 .eq(WorkOrder::getUserId, orderDon.getUserId())
                 .eq(WorkOrder::getRelationId, orderDon.getRelationId()));
+
+        //将GPT规格的车队 下次可停车时间置空
+        groupRelationFrontService.setGroupsTripsParkingTimeEmpty(sku, orderDon.getRelationId());
     }
 
     public String wxRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {
@@ -555,6 +561,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         });
         log.info("userId:{}更换车票,原座位号relationId:{}======>新座位号newRelationId:{}", newRelation.getUserId(), relationId, newRelation.getId());
         relationMapper.updateById(newRelation);
+
+        //更换车票 调整GPT相关规格新车队 上车数
+        GoodsDonSku sku = goodsDonSkuMapper.selectById(groups.getSkuId());
+        groupRelationFrontService.adjustGroupsParkingTime(newRelation.getId(), sku);
     }
 
     public String zfbRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {
@@ -982,7 +992,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         if (!redisService.setNx(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L)) {
             if (retryNum == 7) throw BusinessRuntimeException.getInstance("该车队人员已满,请选择另一车队");
             retryNum++;
-            getRelationThisTrips(userId, groupsId, retryNum);
+            return getRelationThisTrips(userId, groupsId, retryNum);
         }
         int count = groupsMapper.decrAvailableNum(relation.getGroupsId());
         if (count == 0) {

+ 24 - 6
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -1074,10 +1074,18 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		unifiedHandlerOrderNotify(orderDon, goodsDon, sku);
 	}
 
-	public void setRelation(Long relationId, Long groupsId, Long userId, Long goodsId, Boolean isLoginPopularize, GroupsRelation.Status status) {
-		if (!redisService.setNx(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L)) {
-			log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
-			throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
+	public void setRelation(GroupsRelation relation) {
+		Long relationId = relation.getId();
+		Long userId = relation.getUserId();
+		Long groupsId = relation.getGroupsId();
+		GroupsRelation.Status status = relation.getStatus();
+		String relation_num_key = RedisKey.GROUPS_RELATION_NUM_KEY + relationId;
+		if (!redisService.setNx(relation_num_key, userId, 60 * 5L)) {
+			GroupsRelation dbRelation = groupsRelationMapper.selectById(relationId);
+			if (dbRelation.getUserId() != 0) {
+				log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
+				throw new BusinessRuntimeException("系统繁忙,请重试...");
+			}
 		}
 		if (status == GroupsRelation.Status.outside) {
 			return;
@@ -1185,6 +1193,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setPayTime(DateTime.now());
 		}
 		this.updateById(orderDon);
+
+		//调整指定规格车队下次可 停用车位数的时间
+		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
 	}
 
 	public void updateCarParkAndSendMsg(GoodsDon goodsDon, GoodsDonSku sku, OrderDon order) {
@@ -1952,18 +1963,22 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	 */
 	public GroupsRelation getRelation(OrderPayRequest payRequest, GoodsDonSku sku, Long yhsId) {
 		Long payRelationId = payRequest.getRelationId();
-		Boolean isLoginPopularize = payRequest.getIsLoginPopularize();
 		Long userId = payRequest.getUserId();
 		//获取车票车位
 		GroupsRelation relation = groupRelationFrontService.getRelation(payRelationId, userId, sku);
 
 		//锁定座位
-		setRelation(relation.getId(), relation.getGroupsId(), userId, sku.getGoodsId(), isLoginPopularize, relation.getStatus());
+		setRelation(relation);
 		relation.setUserId(userId);
 		//重新置为锁定
 		relation.setStatus(GroupsRelation.Status.locking);
 		relation.setYhsId(yhsId);
 		groupsRelationMapper.updateById(relation);
+
+		Long skuId = sku.getId();
+		Long groupsId = relation.getGroupsId();
+		//校验指定平台规格的 目前车队的可停车位数
+		groupRelationFrontService.checkGroupsAvailParkingNum(skuId, groupsId, relation.getGroupsAvailParkingNum());
 		return relation;
 	}
 
@@ -2208,6 +2223,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.updateById(orderDon);
 
+		//调整指定规格车队下次可 停用车位数的时间
+		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
+
 		TASK_POOL.execute(()->{
 			try {
 				//发放积分

+ 11 - 1
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -20,7 +20,7 @@ public interface GroupRelationFrontService {
 
 	Boolean isJoinCorpWx(Long userId, Boolean isJoin, Boolean noCoupon);
 
-	GroupsRelation getSimilarExpiredGroupRelation(Long skuId, Integer days, Integer months, List<Long> errorsRelationIds);
+	GroupsRelation getSimilarExpiredGroupRelation(GoodsDonSku sku, List<Long> errorsRelationIds);
 
 	Page<UserRecommendGoodsFrontView> getRecommendGoodsViews(Boolean isPayNf, List<Long> filter_goods_id, Integer start, Integer limit);
 
@@ -38,4 +38,14 @@ public interface GroupRelationFrontService {
 	 * 获取车票账号登录 验证码
 	 */
 	String getAiVerifyCode(Long userId, Long relationId) throws Exception;
+
+
+	void checkGroupsAvailParkingNum(Long skuId, Long groupsId, Integer availableParkingNum);
+
+	/**
+	 * 调整指定规格车队下次可 停用车位数的时间
+	 */
+	void adjustGroupsParkingTime(Long relationId, GoodsDonSku sku);
+
+	void setGroupsTripsParkingTimeEmpty(GoodsDonSku sku, Long relationId);
 }

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

@@ -231,15 +231,24 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 	}
 
 	@Override
-	public GroupsRelation getSimilarExpiredGroupRelation(Long skuId, Integer days, Integer months, List<Long> errorsRelationIds) {
+	public GroupsRelation getSimilarExpiredGroupRelation(GoodsDonSku sku, List<Long> errorsRelationIds) {
+		Long skuId = sku.getId();
+		Integer days = sku.getDays();
+		Integer months = sku.getMonths();
+		Integer maxNum = sku.getNum();
 		DateTime expiryTime = null;
 		if (days != null && days > 0) {
 			expiryTime = DateUtil.offsetDay(DateTime.now(), days);
 		} else {
 			expiryTime = DateUtil.offsetMonth(DateTime.now(), months);
 		}
+		Integer extraNum = 5;
+		if (sku.getId() == 178l) {
+			extraNum = 2;
+		}
+		maxNum += extraNum;
 		DateTime minExpiryTime = DateUtil.offsetDay(expiryTime, -5);
-		Long groupsId = groupsRelationMapper.selectSimilarExpiredRelation(skuId, minExpiryTime);
+		Long groupsId = groupsRelationMapper.selectSimilarExpiredRelation(skuId, minExpiryTime, maxNum);
 		if (groupsId == null) {
 			log.info("暂无相似过期时间车队");
 			return null;
@@ -315,10 +324,16 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			GroupsTrips groups = null;
 			//ChatGpt Plus、Midjourney非独立规格 上车先获取硬塞座位 硬塞5个座位
 			//主账号过期时间25天以外
+			Integer maxNum = sku.getNum();
 			if (sku.getNum() > 1 && Constant.AI_goodsIds.contains(sku.getGoodsId())) {
+				Integer extraNum = 5;
+				if (sku.getId() == 178l) {
+					extraNum = 2;
+				}
+				maxNum += extraNum;
 				DateTime time = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 25);
 				//不塞存在该用户的车队
-				Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), time, 5, userId, sku.getNum());
+				Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), time, extraNum, userId, sku.getNum(), maxNum);
 				if (groupsId != null) {
 					relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
 							.eq(GroupsRelation::getGroupsId, groupsId)
@@ -344,12 +359,13 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			}
 			if (groups == null) {
 				//寻找差不多过期时间规格的车位
-				relation = getSimilarExpiredGroupRelation(sku.getId(), sku.getDays(), sku.getMonths(), null);
+				relation = getSimilarExpiredGroupRelation(sku,null);
 				if (relation == null) {
 					//TODO 如果没指定座位,等待逻辑确认
 					groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
 							.eq(GroupsTrips::getSkuId, sku.getId())
 							.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
+							.apply(String.format("(available_parking_num = 0 or available_parking_num > (select count(*) from groups_relation gr where gr.groups_id = groups_trips.id and gr.user_id != 0 and gr.num < %s))", maxNum))
 							.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
 							.orderByAsc(GroupsTrips::getAvailableNum));
 					if (groups == null) {
@@ -358,6 +374,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 								.eq(GroupsTrips::getSkuId, sku.getId())
 								.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
 								.eq(GroupsTrips::getStatus, GroupsTrips.Status.waiting)
+								.apply(String.format("(available_parking_num = 0 or available_parking_num > (select count(*) from groups_relation gr where gr.groups_id = groups_trips.id and gr.user_id != 0 and gr.num < %s))", maxNum))
 								.orderByAsc(GroupsTrips::getAvailableNum));
 					}
 					//新增空车队
@@ -376,6 +393,11 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 					}
 				}
 			}
+			if (groups == null) {
+				groups = groupsMapper.selectById(relation.getGroupsId());
+			}
+			//车队目前可用停车数
+			relation.setGroupsAvailParkingNum(groups.getAvailableParkingNum());
 		}
 		return relation;
 	}
@@ -407,4 +429,94 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		}
 		return code.trim();
 	}
+
+
+	@Override
+	public void checkGroupsAvailParkingNum(Long skuId, Long groupsId, Integer availableParkingNum) {
+		//GPT10人月付、4人月付
+		if (skuId == 161l || skuId == 178l) {
+			//为0时,不参与限制
+			if (availableParkingNum == 0) {
+				return;
+			}
+			//目前车队可用停车数
+			//目前上车人数
+			Integer currentParkingNum = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
+					.eq(GroupsRelation::getGroupsId, groupsId)
+					.ne(GroupsRelation::getUserId, 0));
+			if (currentParkingNum > availableParkingNum) {
+				throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
+			}
+		}
+	}
+
+	@Override
+	public void adjustGroupsParkingTime(Long relationId, GoodsDonSku sku) {
+		Long skuId = sku.getId();
+		//更新GPT Plus10人、4人月付车队状态
+		if (skuId == 161l || skuId == 178l) {
+			GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+			Long groupsId = relation.getGroupsId();
+			GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
+			Integer availableParkingNum = groupsTrips.getAvailableParkingNum();
+			//为0时 不参与限制
+			if (availableParkingNum == 0) {
+				return;
+			}
+			Integer extraNum = 5;
+			if (skuId == 178l) {
+				extraNum = 2;
+			}
+			Integer skuNum = sku.getNum();
+			if (availableParkingNum >= skuNum + extraNum) {
+				return;
+			}
+			//目前上车人数
+			Integer currentParkingNum = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
+					.eq(GroupsRelation::getGroupsId, groupsId)
+					.ne(GroupsRelation::getUserId, 0));
+			if (currentParkingNum >= availableParkingNum) {
+				//锁住
+				DateTime parkingTime = DateUtil.offsetDay(DateTime.now(), 1);
+
+				groupsMapper.update(null, Wrappers.lambdaUpdate(GroupsTrips.class)
+						.eq(GroupsTrips::getId, groupsTrips.getId())
+						.set(GroupsTrips::getParkingTime, parkingTime)
+						.isNull(GroupsTrips::getParkingTime));
+			}
+		}
+	}
+
+	@Override
+	public void setGroupsTripsParkingTimeEmpty(GoodsDonSku sku, Long relationId) {
+		Long skuId = sku.getId();
+		if (skuId == 161l || skuId == 178l) {
+			GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+			Long groupsId = relation.getGroupsId();
+			GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
+			Integer availableParkingNum = groupsTrips.getAvailableParkingNum();
+			if (groupsTrips.getParkingTime() == null || availableParkingNum == 0) {
+				return;
+			}
+			Integer extraNum = 5;
+			if (skuId == 178l) {
+				extraNum = 2;
+			}
+			Integer skuNum = sku.getNum();
+			if (availableParkingNum >= skuNum + extraNum) {
+				return;
+			}
+			//目前上车人数
+			Integer currentParkingNum = groupsRelationMapper.selectCount(Wrappers.lambdaQuery(GroupsRelation.class)
+					.eq(GroupsRelation::getGroupsId, groupsId)
+					.ne(GroupsRelation::getUserId, 0));
+			if (currentParkingNum < availableParkingNum) {
+
+				groupsMapper.update(null, Wrappers.lambdaUpdate(GroupsTrips.class)
+						.eq(GroupsTrips::getId, groupsTrips.getId())
+						.set(GroupsTrips::getParkingTime, null)
+						.isNotNull(GroupsTrips::getParkingTime));
+			}
+		}
+	}
 }

+ 17 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -626,6 +626,7 @@ public class CmsOrderController {
 				.field(EmptyGroupsRelationView::getStatus, GroupsTrips.Status.down.name()).op(Operator.NotEqual)
 				.field(EmptyGroupsRelationView::getSkuId, skuId).orderBy(EmptyGroupsRelationView::getAvailableNum)
 				.desc();
+		GoodsDonSku sku = skuMapper.selectById(skuId);
 		Date expiryTime = null;
 		if (relationId != null) {
 			GroupsRelation relation = relationMapper.selectById(relationId);
@@ -634,14 +635,28 @@ public class CmsOrderController {
 		if (groupsId != null) {
 			builder.field(EmptyGroupsRelationView::getGroupsId, groupsId).op(Operator.NotEqual);
 		}
+		String condition = StrUtil.EMPTY;
 		if (isNormal != null && isNormal) {
-			builder.put("account_id", String.format("gt.account_id not in (select account_id from work_order where sku_id = %s and account_id is not null)", skuId));
+			condition += String.format("gt.account_id not in (select account_id from work_order where sku_id = %s and account_id is not null)", skuId);
+		}
+		if (StrUtil.isNotEmpty(condition)) {
+			condition += " and ";
+		}
+		Integer maxNum = sku.getNum();
+		Integer extraNum = 5;
+		//GPT 4人月付
+		if (sku.getId() == 178l) {
+			extraNum = 2;
+		}
+		maxNum += extraNum;
+		condition += String.format("(available_parking_num = 0 or available_parking_num > (select count(*) from groups_relation gr where gr.groups_id = gt.id and gr.user_id != 0 and gr.num < %s))", maxNum);
+		if (StrUtil.isNotEmpty(condition)) {
+			builder.put("condition", condition);
 		}
 		if (expiryTime != null) {
 			builder.field(AccountView::getExpiryTime, expiryTime).op(Operator.GreaterEqual);
 			builder.orderBy(AccountView::getExpiryTime).asc();
 		}
-		GoodsDonSku sku = skuMapper.selectById(skuId);
 		if (sku.getNum() == 1 || !Constant.AI_goodsIds.contains(sku.getGoodsId())) {
 			builder.field(EmptyGroupsRelationView::getAvailableNum, 0).op(Operator.GreaterThan);
 		}

+ 35 - 11
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -29,7 +29,6 @@ import com.cyksj.model.excel.*;
 import com.cyksj.model.manage.request.ReqAccountIncrExpiryTime;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.GroupsRelationView;
-import com.cyksj.model.request.AccountPrepareReq;
 import com.cyksj.model.response.ExpiredAccountRep;
 import com.cyksj.model.response.OrderDonAccountRep;
 import com.cyksj.model.views.*;
@@ -368,11 +367,25 @@ public class CmsAccountController {
 		    }
 	    }
         accountService.save(account);
-	    //自动配置车队
-	    GroupsTrips groupsTrips = new GroupsTrips();
-	    groupsTrips.setSkuId(account.getSkuId());
-	    groupsTrips.setAccountId(account.getId());
-	    cmsGroupService.issuance(groupsTrips, account.getVerifyCodes());
+	    if (account.getSkuId() != null) {
+		    //自动配置车队
+		    GroupsTrips groupsTrips = new GroupsTrips();
+
+		    //限制每天新车队前3天 停车数量
+		    Integer availableParkingNum = 0;
+		    if (account.getSkuId() == 161l) {
+			    availableParkingNum = 10;
+		    }
+		    if (account.getSkuId() == 178l) {
+			    availableParkingNum = 4;
+		    }
+		    groupsTrips.setAvailableParkingNum(availableParkingNum);
+
+		    groupsTrips.setSkuId(account.getSkuId());
+		    groupsTrips.setAccountId(account.getId());
+		    cmsGroupService.issuance(groupsTrips, account.getVerifyCodes());
+	    }
+
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
@@ -423,11 +436,22 @@ public class CmsAccountController {
 						at.setExpiryTime(DateUtil.offsetMonth(at.getStartTime(), 1));
 					}
 					accountService.save(at);
-					//自动配置车队
-					GroupsTrips groupsTrips = new GroupsTrips();
-					groupsTrips.setSkuId(at.getSkuId());
-					groupsTrips.setAccountId(at.getId());
-					cmsGroupService.issuance(groupsTrips, null);
+					if (at.getSkuId() != null) {
+						//自动配置车队
+						GroupsTrips groupsTrips = new GroupsTrips();
+						//限制每天新车队前3天 停车数量
+						Integer availableParkingNum = 0;
+						if (at.getSkuId() == 161l) {
+							availableParkingNum = 10;
+						}
+						if (at.getSkuId() == 178l) {
+							availableParkingNum = 4;
+						}
+						groupsTrips.setAvailableParkingNum(availableParkingNum);
+						groupsTrips.setSkuId(at.getSkuId());
+						groupsTrips.setAccountId(at.getId());
+						cmsGroupService.issuance(groupsTrips, null);
+					}
 				}
 			}
 

+ 1 - 1
netflix-web/src/main/resources/application-pre.yml

@@ -65,7 +65,7 @@ spring:
       }
   redis:
     # Redis数据库索引(默认为 0)
-    database: 0
+    database: 3
     # Redis服务器地址
     host: 127.0.0.1
     # Redis服务器连接端口