zoujiajian 1 год назад
Родитель
Сommit
d72af65de5

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/LumaUser.java

@@ -44,6 +44,13 @@ public class LumaUser extends BaseEntity{
      */
     private Integer num;
 
+    /**
+     * luma该规格次数
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private Integer lumaNum;
+
     /**
      * 车票类型 2试用
      */

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/model/views/LumaUserInfoView.java

@@ -0,0 +1,32 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: LumaUserInfo
+ * 创建者: JavaZou
+ * 创建时间:2025/7/25 17:18
+ */
+@Getter
+@Setter
+public class LumaUserInfoView {
+	private String userToken;
+
+	private Long relationId;
+
+	/**
+	 * luma规格次数
+	 */
+	private Integer lumaNum;
+
+	/**
+	 * 用户可用次数
+	 */
+	private Integer lumaUserNum;
+
+	private Date expireTime;
+}

+ 312 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorTicketView.java

@@ -0,0 +1,312 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: UserMirrorTicketView
+ * 创建者: JavaZou
+ * 创建时间:2025/7/25 16:11
+ */
+@SearchBean(tables = "groups_relation gr left join groups_trips gt on gt.id = gr.groups_id " +
+		"left join goods_don_sku sku on gt.sku_id = sku.id " +
+		"left join goods_don g on g.id = sku.goods_id "
+)
+@Getter
+@Setter
+public class UserMirrorTicketView {
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("sku.id")
+	private Long skuId;
+
+	@DbField("g.status")
+	private Boolean goodsStatus;
+
+	@DbField("sku.status")
+	private Boolean skuStatus;
+
+	@DbField("sku.months")
+	private Integer months;
+
+	@DbField("sku.days")
+	private Integer days;
+
+	@DbField("sku.num")
+	private Integer skuNum;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("gr.id")
+	private Long relationId;
+
+	@DbField("gr.num")
+	private Integer num;
+
+	@DbField("gr.groups_id")
+	private Long groupId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("g.logo")
+	private String logo;
+
+	@DbField("g.img")
+	private String img;
+
+	@DbField("gt.status")
+	private String groupsStatus;
+
+	@DbField("gr.user_id")
+	@JsonIgnore
+	private Long userId;
+
+	@DbField("gr.start_time")
+	private Date startTime;
+
+	@DbField("gr.expiry_time")
+	private Date expiryTime;
+
+	@DbIgnore
+	private Long total;
+
+	@DbIgnore
+	private String expiryTimeStr;
+
+	@DbField("gr.status")
+	private String status;
+
+	/**
+	 * 店铺id
+	 */
+	@DbField("gr.yhs_id")
+	private Long yhsId;
+
+	/**
+	 * 店铺类型
+	 * 0无 1.普通店铺 2.镜像店铺
+	 */
+	@DbField("gr.cmt")
+	private Integer cmt;
+
+	/**
+	 * 车票获取类型 默认1购买,2.体验 3.镜像裂变
+	 */
+	@DbField("gr.aq_type")
+	private Integer aqType;
+
+	/**
+	 * 是否是VIP
+	 */
+	@DbField("gr.is_vip")
+	private Boolean isVip;
+
+	@DbIgnore
+	private Date payTime;
+
+	@DbIgnore
+	private String remainDays;
+
+	/**
+	 * 是否为镜像服务
+	 */
+	@DbField("sku.is_mirror")
+	private Boolean isMirror;
+
+	/**
+	 * 是否为镜像车队服务
+	 */
+	@DbField("sku.is_car")
+	private Boolean isCar;
+
+
+	/**
+	 * mj fast次数
+	 */
+	@DbField("sku.mj_fast_num")
+	private Integer mjFastNum;
+
+
+	/**
+	 * mj relax次数
+	 */
+	@DbField("sku.mj_relax_num")
+	private Integer mjRelaxNum;
+
+	/**
+	 * 镜像限制次数
+	 */
+	@DbField("sku.gpt_limit_num")
+	private Integer gptLimitNum;
+
+	/**
+	 * luma 次数
+	 */
+	@DbField("sku.luma_num")
+	private Integer lumaNUm;
+
+	/**
+	 * deepseek限制次数
+	 */
+	@DbField("sku.ds_limit_num")
+	private Integer dsLimitNum;
+
+	/**
+	 * deepseek限制时间
+	 */
+	@DbField("sku.ds_limit_time")
+	private Long dsLimitTime;
+
+	/**
+	 * 其他模型限制次数
+	 */
+	@DbField("sku.other_limit_num")
+	private Integer otherLimitNum;
+
+	/**
+	 * 其他模型限制时间
+	 */
+	@DbField("sku.other_limit_time")
+	private Long otherLimitTime;
+
+	/**
+	 * mj 套餐包最低单价
+	 */
+	@DbIgnore
+	private BigDecimal mjPackagePrice;
+
+	/**
+	 * luma 套餐包最低单价
+	 */
+	@DbIgnore
+	private BigDecimal lumaPackagePrice;
+
+	/**
+	 * 用户 mj fast次数
+	 */
+	@DbIgnore
+	private Integer mjUserFastNum;
+
+	/**
+	 * 用户 mj 加量包次数
+	 */
+	@DbIgnore
+	private Integer mjUserUpgradeNum;
+
+
+	/**
+	 * 用户 mj relax次数
+	 */
+	@DbIgnore
+	private Integer mjUserRelaxNum;
+
+	/**
+	 * gpt 用户镜像限制次数
+	 */
+	@DbIgnore
+	private Integer gptUserLimitNum;
+
+	/**
+	 * gpt 用户镜像限制时间
+	 */
+	@DbIgnore
+	private Long gptUserLimitTime;
+
+	/**
+	 * luma 用户次数
+	 */
+	@DbIgnore
+	private Integer lumaUserNum;
+
+	/**
+	 * deepseek限制次数
+	 */
+	@DbIgnore
+	private Integer userDsLimitNum;
+
+	/**
+	 * deepseek限制时间
+	 */
+	@DbIgnore
+	private Long userDsLimitTime;
+
+	/**
+	 * 其他模型限制次数
+	 */
+	@DbIgnore
+	private Integer userOtherLimitNum;
+
+	/**
+	 * 其他模型限制时间
+	 */
+	@DbIgnore
+	private Long userOtherLimitTime;
+
+	/**
+	 * 镜像token
+	 */
+	@DbIgnore
+	private String userToken;
+
+	@DbIgnore
+	private Long use;
+
+	/**
+	 * 是否可升级套餐 (标准,专业)
+	 */
+	@DbIgnore
+	private Boolean upgrade;
+
+	@DbIgnore
+	private Long packageId;
+
+	/**
+	 * 目前已升级套餐价格
+	 */
+	@DbIgnore
+	private BigDecimal packagePrice;
+
+	@DbIgnore
+	private DistributePosterGoodsDetailView posterInfo;
+
+	/**
+	 * 是否是续费升级
+	 */
+	@DbIgnore
+	private Boolean isRenewPackage;
+
+	/**
+	 * 续费升级规格id
+	 */
+	@DbIgnore
+	private Long renewSkuId;
+
+	/**
+	 * 续费升级目前规格
+	 */
+	@DbIgnore
+	private GoodsDonSkuRenewView renewSku;
+
+	/**
+	 * 续费升级折扣
+	 */
+	@DbIgnore
+	private BigDecimal discount;
+
+	/**
+	 * gpt模式 0旧版 1新版
+	 */
+	@DbIgnore
+	private Integer model;
+}

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/luma/LumaService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.luma;
 
 import com.cyksj.model.entity.LumaUser;
+import com.cyksj.model.views.LumaUserInfoView;
 
 /**
  * 项目名: yhlxj2
@@ -10,4 +11,6 @@ import com.cyksj.model.entity.LumaUser;
  */
 public interface LumaService {
 	LumaUser getLumaUser(Long userId, Long relationId);
+
+	LumaUserInfoView getLumaUserInfo(long userId, Long relationId);
 }

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/luma/impl/LumaServiceImpl.java

@@ -11,6 +11,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.*;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.views.LumaUserInfoView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.user.UserBindRelationService;
@@ -66,6 +67,20 @@ public class LumaServiceImpl implements LumaService {
 		}
 	}
 
+	@Override
+	public LumaUserInfoView getLumaUserInfo(long userId, Long relationId) {
+		LumaUser lumaUser = getLumaUser(userId, relationId);
+
+		LumaUserInfoView userInfoView = new LumaUserInfoView();
+		userInfoView.setUserToken(lumaUser.getUserToken());
+		userInfoView.setRelationId(relationId);
+		userInfoView.setExpireTime(lumaUser.getExpireTime());
+		userInfoView.setLumaNum(lumaUser.getLumaNum());
+		//用户可用次数
+		userInfoView.setLumaUserNum(lumaUser.getNum());
+		return userInfoView;
+	}
+
 	private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
 		GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
@@ -97,6 +112,7 @@ public class LumaServiceImpl implements LumaService {
 		} else {
 			updateLumaUser(groupsRelation, user, lumaUser);
 		}
+		lumaUser.setLumaNum(goodsDonSku.getLumaNum());
 		return lumaUser;
 	}
 

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/midjourney/MidjourneyAccountService.java

@@ -3,6 +3,7 @@ package com.cyksj.service.midjourney;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cyksj.model.entity.MidjourneyAccount;
 import com.cyksj.model.entity.MidjourneyUser;
+import com.cyksj.model.views.MidjourneyUserView;
 
 import java.util.Date;
 
@@ -24,4 +25,6 @@ public interface MidjourneyAccountService extends IService<MidjourneyAccount> {
     MidjourneyUser getMidjourneyUserToken(Long userId, Long relationId);
 
     void updateUserExpiryTime(Long relationId, Date expiryTime);
+
+	MidjourneyUserView getUserInfo(long userId, Long relationId);
 }

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

@@ -13,6 +13,7 @@ import com.cyksj.model.response.NetflixRecoverResp;
 import com.cyksj.model.response.NetflixRefundInfoResp;
 import com.cyksj.model.views.GoodsCategorySkuView;
 import com.cyksj.model.views.RenewalView;
+import com.cyksj.model.views.UserMirrorTicketView;
 import com.cyksj.model.views.UserRecommendGoodsFrontView;
 import com.ejlchina.searcher.SearchResult;
 
@@ -113,4 +114,6 @@ public interface GroupRelationFrontService {
 	Boolean refundNetflix(ErrorNetflixChangeReq req) throws Exception;
 
 	NetflixRefundInfoResp refundNetflixInfo(Long userId, Long relationId);
+
+	List<UserMirrorTicketView> getMirrorTicket(long userId);
 }

+ 49 - 6
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -408,7 +408,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				ticket.setPosterInfo(setGoodsPoster(ticket, u, userIds));
 
 				//续费升级折扣
-				setRenewDiscount(ticket);
+				BigDecimal renewDiscount = getRenewDiscount(ticket.getGoodsId(), ticket.getSkuId(), ticket.getIsMirror(), ticket.getSkuNum());
+				ticket.setDiscount(renewDiscount);
 
 				if (CollUtil.isNotEmpty(renewReduceSkuIds) && renewReduceSkuIds.contains(ticket.getSkuId())) {
 					ticket.setIsRenewReduce(true);
@@ -1772,6 +1773,47 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		return true;
 	}
 
+	@Override
+	public List<UserMirrorTicketView> getMirrorTicket(long userId) {
+		User u = userMapper.selectById(userId);
+		if (u == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+		if (u.getIsBlack()) {
+			return null;
+		}
+		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		DateTime now = DateTime.now();
+		List<UserMirrorTicketView> list = beanSearcher.searchAll(UserMirrorTicketView.class, builder
+				.field(UserMirrorTicketView::getUserId, userIds).op(Operator.InList)
+				.field(UserMirrorTicketView::getIsMirror, Boolean.TRUE)
+				//过期7天内的镜像车票都展示
+				.field(UserMirrorTicketView::getExpiryTime, DateUtil.offsetDay(now, -7))
+				.orderBy(RenewalView::getExpiryTime).asc()
+				.build());
+		list.forEach(ticket -> {
+			if (ticket.getExpiryTime() != null) {
+				String remainDays = DateUtil.formatBetween(now, ticket.getExpiryTime(), BetweenFormater.Level.DAY);
+				if ("0天".equals(remainDays)) {
+					remainDays = "小于1天";
+				} else {
+					//当天也算
+					int days = Integer.parseInt(remainDays.substring(0, remainDays.indexOf("天")));
+					remainDays = days + 1 + "天";
+				}
+				ticket.setRemainDays(remainDays);
+				ticket.setTotal(DateUtil.betweenDay(ticket.getStartTime(), ticket.getExpiryTime(), false) + 1);
+			}
+			if (ticket.getExpiryTime() != null) {
+				ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
+			}
+			//续费升级折扣
+			BigDecimal renewDiscount = getRenewDiscount(ticket.getGoodsId(), ticket.getSkuId(), ticket.getIsMirror(), ticket.getSkuNum());
+			ticket.setDiscount(renewDiscount);
+		});
+		userLoginRecordService.saveUserLoginDayRecord(userId);
+		return list;
+	}
+
 	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());
@@ -1819,21 +1861,22 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		return distributePosterGoodsDetailView;
 	}
 
-	private void setRenewDiscount(RenewalView ticket) {
+	private BigDecimal getRenewDiscount(Long goodsId, Long skuId, Boolean isMirror, Integer skuNum) {
 		//镜像或者独立规格
-		if (ticket.getIsMirror() || (ticket.getSkuNum() != null && ticket.getSkuNum() == 1)) {
+		if (isMirror || (skuNum != null && skuNum == 1)) {
 			RenewUpgradePackage renewUpgradePackage = renewUpgradePackageMapper.selectOne(Wrappers.lambdaQuery(RenewUpgradePackage.class)
-					.eq(RenewUpgradePackage::getGoodsId, ticket.getGoodsId())
+					.eq(RenewUpgradePackage::getGoodsId, goodsId)
 					.eq(RenewUpgradePackage::getStatus, 1)
 					.eq(RenewUpgradePackage::getDeleted, 1)
-					.eq(RenewUpgradePackage::getSkuId, ticket.getSkuId())
+					.eq(RenewUpgradePackage::getSkuId, skuId)
 					.orderByAsc(RenewUpgradePackage::getDiscount)
 					.last("limit 1")
 					.select(RenewUpgradePackage::getId, RenewUpgradePackage::getDiscount));
 			if (renewUpgradePackage != null) {
-				ticket.setDiscount(renewUpgradePackage.getDiscount());
+				return renewUpgradePackage.getDiscount();
 			}
 		}
+		return null;
 	}
 
 	private void setMirrorTicketInfo(RenewalView ticket) {

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

@@ -1376,4 +1376,14 @@ public class GroupRelationController {
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
+
+    /**
+     * 镜像车票列表
+     */
+    @GetMapping("/get/mirror/ticket")
+    public Result<List<UserMirrorTicketView>> getMirrorTicket() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<UserMirrorTicketView> list = groupRelationFrontService.getMirrorTicket(userId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    }
 }

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -460,6 +460,16 @@ public class MirrorController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(lumaHost + (EnvCommonService.active_pre.equals(envCommonService.getEnv()) ? "/8083":"/8085") +"/api/applets/luma/lumaMirrorWithToken/" + lumaUser.getUserToken());
     }
 
+    /**
+     * 获取luma车票信息
+     */
+    @GetMapping("/luma/userInfo")
+    public Result<LumaUserInfoView> getLumaUserInfo(Long relationId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        LumaUserInfoView userInfoView = lumaService.getLumaUserInfo(userId, relationId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(userInfoView);
+    }
+
     /**
      * gpt 次数风控
      * @return