Explorar el Código

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

zoujiajian hace 2 años
padre
commit
efe248732a

+ 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;
+
     /**
      * 创建时间
      */

+ 2 - 0
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.availableParkingNum = 0 or (select count(*) from groups_realtion gr where gr.groups_id = gt.id and gr.user_id != 0) < gt.availableParkingNum)
                 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.availableParkingNum = 0 or (select count(*) from groups_realtion gr where gr.groups_id = gt.id and gr.user_id != 0) < gt.availableParkingNum)
         order by RAND() limit 1
     </select>
 

+ 7 - 1
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -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()))) {

+ 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());

+ 6 - 0
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 {

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

@@ -1074,7 +1074,11 @@ 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) {
+	public void setRelation(GroupsRelation relation) {
+		Long relationId = relation.getId();
+		Long userId = relation.getUserId();
+		Long groupsId = relation.getGroupsId();
+		GroupsRelation.Status status = relation.getStatus();
 		if (!redisService.setNx(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L)) {
 			log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
 			throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
@@ -1952,18 +1956,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 +2216,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.updateById(orderDon);
 
+		//调整指定规格车队下次可 停用车位数的时间
+		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
+
 		TASK_POOL.execute(()->{
 			try {
 				//发放积分

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

@@ -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);
 }

+ 99 - 1
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -316,9 +316,13 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			//ChatGpt Plus、Midjourney非独立规格 上车先获取硬塞座位 硬塞5个座位
 			//主账号过期时间25天以外
 			if (sku.getNum() > 1 && Constant.AI_goodsIds.contains(sku.getGoodsId())) {
+				Integer extraNum = 5;
+				if (sku.getId() == 178l) {
+					extraNum = 2;
+				}
 				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());
 				if (groupsId != null) {
 					relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
 							.eq(GroupsRelation::getGroupsId, groupsId)
@@ -350,6 +354,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 					groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
 							.eq(GroupsTrips::getSkuId, sku.getId())
 							.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
+							.apply("(available_parking_num = 0 or available_parking_num > (select count(*) from groups_relation gr where gr.groups_id = groups_trips.id and user_id != 0))")
 							.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
 							.orderByAsc(GroupsTrips::getAvailableNum));
 					if (groups == null) {
@@ -358,6 +363,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("(available_parking_num = 0 or available_parking_num > (select count(*) from groups_relation gr where gr.groups_id = groups_trips.id and user_id != 0))")
 								.orderByAsc(GroupsTrips::getAvailableNum));
 					}
 					//新增空车队
@@ -376,6 +382,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 					}
 				}
 			}
+			//车队目前可用停车数
+			relation.setGroupsAvailParkingNum(groups.getAvailableParkingNum());
 		}
 		return relation;
 	}
@@ -407,4 +415,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));
+			}
+		}
+	}
 }

+ 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);
+					}
 				}
 			}