Explorar o código

Merge branch 'luma_yh_func'

# Conflicts:
#	netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
#	netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java
#	netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
#	netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsSkuFrontView.java
#	netflix-service/src/main/java/com/cyksj/redis/RedisService.java
#	netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java
#	netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
#	netflix-web/src/main/resources/application-pre.yml
zoujiajian %!s(int64=2) %!d(string=hai) anos
pai
achega
84a51d617d
Modificáronse 21 ficheiros con 435 adicións e 4 borrados
  1. 2 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/LumaUserMapper.java
  3. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  4. 53 0
      netflix-dao/src/main/java/com/cyksj/model/entity/LumaUser.java
  5. 2 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
  6. 2 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java
  7. 37 0
      netflix-dao/src/main/java/com/cyksj/model/views/LumaUserView.java
  8. 18 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  9. 15 0
      netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsSkuFrontView.java
  10. 2 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  11. 13 0
      netflix-service/src/main/java/com/cyksj/service/luma/LumaService.java
  12. 159 0
      netflix-service/src/main/java/com/cyksj/service/luma/impl/LumaServiceImpl.java
  13. 19 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  14. 14 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java
  15. 19 2
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  16. 13 1
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  17. 22 0
      netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
  18. 21 0
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  19. 0 0
      netflix-web/src/main/resources/application-dev.yml
  20. 0 0
      netflix-web/src/main/resources/application-prd.yml
  21. 5 1
      netflix-web/src/main/resources/application-pre.yml

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

@@ -376,4 +376,6 @@ public interface Constant {
 	 * 特殊普通渠道用户
 	 */
 	Long SPECIAL_DISTRIBUTE_USER_ID = 469739l;
+
+	Long LUMA_GOODS_ID = 87l;
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/LumaUserMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.LumaUser;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: LumaUserMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/8/2 18:22
+ */
+public interface LumaUserMapper extends BaseMapper<LumaUser> {
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -189,6 +189,12 @@ public class GoodsDonSku extends BaseEntity {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer mjRelaxNum;
 
+    /**
+     * luma次数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer lumaNum;
+
     /**
      * 特定价格
      */

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

@@ -0,0 +1,53 @@
+package com.cyksj.model.entity;
+
+/**
+ * @author zwhui
+ * @date 2024/4/16 17:01
+ */
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class LumaUser extends BaseEntity{
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 头像
+     */
+    private String img;
+
+    /**
+     * 用户凭证
+     */
+    private String userToken;
+
+    /**
+     * 过期时间
+     */
+    private Date expireTime;
+
+    /**
+     * 车票id
+     */
+    private Long relationId;
+
+    /**
+     * 可用次数
+     */
+    private Integer num;
+
+    /**
+     * 车票类型 2试用
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private Integer aqType;
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java

@@ -162,6 +162,8 @@ public class ReqGoodsSkuInsert {
          */
         private Integer mjRelaxNum;
 
+        private Integer lumaNum;
+
         /**
          * 备注
          */

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java

@@ -155,5 +155,7 @@ public class GoodsDonSkuFrontView {
 
 	private Boolean isMirror;
 
+	private Integer lumaNum;
+
 	private String remark;
 }

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/views/LumaUserView.java

@@ -0,0 +1,37 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2024/4/28 17:43
+ */
+@Data
+@SearchBean(tables = "luma_user lu left join groups_relation gr on lu.relation_id = gr.id ")
+public class LumaUserView {
+
+
+    @DbField("lu.id")
+    private Long id;
+
+    @DbField("lu.relation_id")
+    private Long relationId;
+
+    @DbField("gr.user_id")
+    private Long userId;
+
+    @DbField("lu.num")
+    private Integer lumaNum;
+
+    @DbField("lu.expire_time")
+    private Date expireTime;
+
+
+
+
+
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -210,12 +210,24 @@ public class RenewalView {
     @DbField("sku.gpt_limit_num")
     private Integer gptLimitNum;
 
+    /**
+     * luma 次数
+     */
+    @DbField("sku.luma_num")
+    private Integer lumaNUm;
+
     /**
      * mj 套餐包最低单价
      */
     @DbIgnore
     private BigDecimal mjPackagePrice;
 
+    /**
+     * luma 套餐包最低单价
+     */
+    @DbIgnore
+    private BigDecimal lumaPackagePrice;
+
     /**
      * 用户 mj fast次数
      */
@@ -240,6 +252,12 @@ public class RenewalView {
     @DbIgnore
     private Long gptUserLimitTime;
 
+    /**
+     * luma 用户次数
+     */
+    @DbIgnore
+    private Integer lumaUserNum;
+
     @DbIgnore
     private Long use;
 

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsSkuFrontView.java

@@ -143,6 +143,21 @@ public class YhShopGoodsSkuFrontView {
 	@DbField("sku.is_mirror")
 	private Boolean isMirror;
 
+	/**
+	 * mj fast次数
+	 */
+	@DbField("sku.mj_fast_num")
+	private Integer mjFastNum;
+
+	/**
+	 * mj relax次数
+	 */
+	@DbField("sku.mj_relax_num")
+	private Integer mjRelaxNum;
+
+	@DbField("sku.luma_num")
+	private Integer lumaNum;
+
 	@DbField("sku.remark")
 	private Boolean remark;
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -843,6 +843,8 @@ public class RedisService {
         SYS_CONFIG_CACHE_KEY("sys_config_cache_key:", "系统配置缓存key", 60 * 60 * 23L),
         NF_UPGRAD_USER_LIMIT_KEY("nf_upgrad_user_limit_key:%s:%s:%s", "奈飞同步装置key", 60 * 60L),
 
+        LUMA_USER("luma_user:", "luma_user", 60 * 60 * 2L),
+        LUMA_NUM_LIMIT("luma_num_limit:", "luma次数", 60 * 60 * 48L),
         ;
 
         private String name;

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

@@ -0,0 +1,13 @@
+package com.cyksj.service.luma;
+
+import com.cyksj.model.entity.LumaUser;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: LumaService
+ * 创建者: JavaZou
+ * 创建时间:2024/8/5 11:54
+ */
+public interface LumaService {
+	LumaUser getLumaUser(Long userId, Long relationId);
+}

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

@@ -0,0 +1,159 @@
+package com.cyksj.service.luma.impl;
+
+import cn.hutool.core.lang.UUID;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.*;
+import com.cyksj.model.entity.*;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.luma.LumaService;
+import com.cyksj.service.user.UserBindRelationService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+
+import javax.imageio.stream.FileImageOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: LumaServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/8/5 11:55
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class LumaServiceImpl implements LumaService {
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final GoodsDonSkuMapper skuMapper;
+
+	private final UserBindRelationService userBindRelationService;
+
+	private final GroupsRelationMapper groupsRelationMapper;
+
+	private final GroupsMapper groupsMapper;
+
+	private final LumaUserMapper lumaUserMapper;
+
+	private final UserMapper userMapper;
+
+	private final RedisService redisService;
+
+	@Override
+	public LumaUser getLumaUser(Long userId, Long relationId) {
+		GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
+		GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
+		GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
+
+		if (goodsDonSku != null && goodsDonSku.getGoodsId() == Constant.LUMA_GOODS_ID) {
+			return getLumaUser(userId, relationId, groupsRelation, goodsDonSku);
+		} else {
+			throw BusinessRuntimeException.getInstance("服务器出了点问题");
+		}
+	}
+
+	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));
+		if (groupsRelation == null) {
+			throw BusinessRuntimeException.getInstance("车票不存在");
+		}
+		return groupsRelation;
+	}
+
+	/**
+	 * 获取车队信息
+	 *
+	 * @param groupsRelation
+	 * @return
+	 */
+	private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
+		GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
+		if (groupsTrips == null) {
+			throw BusinessRuntimeException.getInstance("车队异常");
+		}
+		return groupsTrips;
+	}
+
+	private LumaUser getLumaUser(Long userId, Long relationId, GroupsRelation groupsRelation, GoodsDonSku goodsDonSku) {
+		LumaUser lumaUser = lumaUserMapper.selectOne(Wrappers.lambdaQuery(LumaUser.class).eq(LumaUser::getRelationId, relationId));
+		User user = userMapper.selectById(userId);
+		if (lumaUser == null) {
+			lumaUser = createLumaUser(groupsRelation, user, goodsDonSku);
+		} else {
+			updateLumaUser(groupsRelation, user, lumaUser);
+		}
+		return lumaUser;
+	}
+
+	private void updateLumaUser(GroupsRelation groupsRelation, User user, LumaUser lumaUser) {
+		lumaUser.setName(user.getNickname());
+		lumaUser.setImg(getWxImg(user.getHeadimgurl(), user));
+		lumaUser.setExpireTime(groupsRelation.getExpiryTime());
+		lumaUserMapper.updateById(lumaUser);
+		lumaUser.setAqType(groupsRelation.getAqType());
+		redisService.set(RedisService.key.LUMA_USER.getName() + lumaUser.getUserToken(), lumaUser, RedisService.key.LUMA_USER.getTimeout());
+	}
+
+	private LumaUser createLumaUser(GroupsRelation groupsRelation, User user, GoodsDonSku goodsDonSku) {
+		LumaUser lumaUser = new LumaUser();
+		lumaUser.setExpireTime(groupsRelation.getExpiryTime());
+		lumaUser.setName(user.getNickname());
+		lumaUser.setImg(getWxImg(user.getHeadimgurl(), user));
+		lumaUser.setRelationId(groupsRelation.getId());
+		lumaUser.setUserToken(UUID.randomUUID().toString());
+		if (groupsRelation.getAqType() == 2) {
+			lumaUser.setNum(goodsDonSku.getLumaNum());
+		} else {
+			lumaUser.setNum(goodsDonSku.getLumaNum());
+		}
+		lumaUser.setAqType(groupsRelation.getAqType());
+		try {
+			lumaUserMapper.insert(lumaUser);
+		} catch (DuplicateKeyException e) {
+		}
+		redisService.set(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId(), lumaUser.getNum(), RedisService.key.LUMA_NUM_LIMIT.getTimeout());
+		return lumaUser;
+	}
+
+	/**
+	 * 更换wx头像至oss
+	 */
+	private String getWxImg(String headimgurl, User user) {
+		if (headimgurl.contains("thirdwx.qlogo.cn")) {
+			try {
+				return uploadPic(headimgurl, "wxheadimg-" + user.getId());
+			} catch (Exception ex) {
+				log.error("上传微信头像错误!msg:{}", StringUtil.getErrorText(ex));
+				return "./avatars.png";
+			}
+		} else {
+			return user.getHeadimgurl();
+		}
+	}
+
+	private static String uploadPic(String url, String prefix) throws IOException {
+		byte[] body = HttpUtil.downloadBytes(url);
+		Path tempFile = Files.createTempFile(prefix, ".jpeg");
+		try (FileImageOutputStream imageOutput = new FileImageOutputStream(tempFile.toFile())) {
+			imageOutput.write(body, 0, body.length);
+		}
+		Map<String, Object> paramMap = new HashMap<>();
+		paramMap.put("file", tempFile.toFile());
+		JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
+		return result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl");
+	}
+}

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -199,6 +199,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final OrderDonRenewRecordMapper orderDonRenewRecordMapper;
 
+    private final LumaUserMapper lumaUserMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -509,6 +511,23 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 }
             }
         }
+
+        //扣除luma套餐次数
+        if (upgradePackage.getGoodsId() == Constant.LUMA_GOODS_ID) {
+            LumaUser lumaUser = lumaUserMapper.selectOne(Wrappers.lambdaQuery(LumaUser.class).eq(LumaUser::getRelationId, orderDon.getRelationId()));
+            if (lumaUser != null) {
+                int update = lumaUserMapper.update(null, Wrappers.lambdaUpdate(LumaUser.class)
+                        .set(LumaUser::getNum, lumaUser.getNum() < upgradePackage.getNum() ? 0 : lumaUser.getNum() - upgradePackage.getNum())
+                        .eq(LumaUser::getId, lumaUser.getId()));
+                if (update == 0) {
+                    log.info("lumaUser 套餐包增值失败 id:{},orderId:{}", lumaUser.getId(), orderDon.getId());
+                }
+                Long decr = redisService.decr(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId(), upgradePackage.getNum().longValue());
+                if (decr < 0) {
+                    redisService.set(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId(), 0L);
+                }
+            }
+        }
     }
 
     /**

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/MirrorUserCleatServiceImpl.java

@@ -2,6 +2,7 @@ package com.cyksj.service.mange.impl;
 
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.mapper.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.redis.RedisService;
@@ -45,6 +46,8 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 
 	private final ClaudeUserMapper claudeUserMapper;
 
+	private final LumaUserMapper lumaUserMapper;
+
 	@Override
 	public void delMirrorUser(Long goodsId, Long relationId) {
 		//gpt镜像
@@ -75,6 +78,17 @@ public class MirrorUserCleatServiceImpl implements MirrorUserCleatService {
 						.eq(ClaudeUser::getRelationId, relationId));
 			}
 		}
+
+		//luma
+		if (goodsId != null && goodsId == Constant.LUMA_GOODS_ID) {
+			LumaUser user = lumaUserMapper.selectOne(Wrappers.lambdaQuery(LumaUser.class)
+					.eq(LumaUser::getRelationId, relationId).last("limit 1"));
+			if (user != null) {
+				lumaUserMapper.delete(Wrappers.lambdaQuery(LumaUser.class)
+						.eq(LumaUser::getRelationId, relationId));
+				redisService.del(RedisService.key.LUMA_NUM_LIMIT.getName() + user.getId());
+			}
+		}
 	}
 
 	@Override

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

@@ -72,7 +72,6 @@ import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.coupon.CouponFontService;
-import com.cyksj.service.distribute.DistributeExtraRebateService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
 import com.cyksj.service.exchange.ExchangeCodeService;
@@ -308,7 +307,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final ChatgptUserMapper chatgptUserMapper;
 
-	private final DistributeExtraRebateService distributeExtraRebateService;
+	private final LumaUserMapper lumaUserMapper;
 
 	private final UserTrialTicketJumpPayRecordMapper userTrialTicketJumpPayRecordMapper;
 
@@ -3601,6 +3600,24 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 			}
 		}
+
+		//luma
+		if (upgradePackage.getGoodsId() == Constant.LUMA_GOODS_ID) {
+			LumaUser lumaUser = lumaUserMapper.selectOne(Wrappers.lambdaQuery(LumaUser.class).eq(LumaUser::getRelationId, orderDon.getRelationId()));
+			if (lumaUser != null) {
+				int update = lumaUserMapper.update(null, Wrappers.lambdaUpdate(LumaUser.class)
+						.set(LumaUser::getNum, lumaUser.getNum() + upgradePackage.getNum()).eq(LumaUser::getId, lumaUser.getId()));
+				if (update == 0) {
+					log.info("lumaUser 套餐包增值失败 id:{},orderId:{}", lumaUser.getId(), orderDon.getId());
+				}
+				Object num = redisService.get(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId());
+				if (num == null) {
+					redisService.set(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId(), lumaUser.getNum() + upgradePackage.getNum().longValue(), RedisService.key.LUMA_NUM_LIMIT.getTimeout());
+				} else {
+					redisService.incr(RedisService.key.LUMA_NUM_LIMIT.getName() + lumaUser.getId(), upgradePackage.getNum().longValue());
+				}
+			}
+		}
 	}
 
 

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

@@ -32,6 +32,7 @@ import com.cyksj.service.chatgpt.ChatGptAccountService;
 import com.cyksj.service.chatgpt.ChatGptAuthService;
 import com.cyksj.service.claude.ClaudeService;
 import com.cyksj.service.groups.GroupsFuncService;
+import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.mail.CuiQiuMailService;
 import com.cyksj.service.mail.MailService;
 import com.cyksj.service.mail.YhMailService;
@@ -127,7 +128,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final UpgradePackageMapper upgradePackageMapper;
 
-	private final GoodsDonQaRelateMapper goodsDonQaRelateMapper;
+	private final LumaService lumaService;
 
 	private final GroupsRelationNetflixService groupsRelationNetflixService;
 
@@ -319,6 +320,17 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				} catch (Exception e) {
 				}
 			}
+			if (ticket.getGoodsId() == Constant.LUMA_GOODS_ID && ticket.getExpiryTime() != null) {
+				try {
+					List<UpgradePackage> upgradePackages = upgradePackageMapper.selectList(Wrappers.lambdaQuery(UpgradePackage.class).apply("JSON_CONTAINS(sku_ids,'\"" + ticket.getSkuId() + "\"')").eq(UpgradePackage::getStatus, Boolean.TRUE).eq(UpgradePackage::getDeleted, Boolean.TRUE));
+					if (CollectionUtil.isNotEmpty(upgradePackages)){
+						upgradePackages.stream().map(e -> e.getPrice().divide(BigDecimal.valueOf(e.getNum()), 2, RoundingMode.HALF_UP)).min(BigDecimal::compareTo).ifPresent(ticket::setLumaPackagePrice);
+					}
+					LumaUser lumaUser = lumaService.getLumaUser(userId, ticket.getRelationId());
+					ticket.setLumaUserNum(lumaUser.getNum());
+				} catch (Exception e) {
+				}
+			}
 			List<GroupsRelationUserView> relationUserViews = groupsRelationMapper.getUserRelationUserViews(ticket.getGroupId(), ticket.getRelationId(), ticket.getUserId(), List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside));
 			ticket.setRelationViews(relationUserViews);
 			if (ticket.getExpiryTime() != null) {

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

@@ -18,6 +18,7 @@ import com.cyksj.model.response.ConversationLimitResponse;
 import com.cyksj.model.views.*;
 import com.cyksj.service.chatgpt.ChatGptAccountService;
 import com.cyksj.service.claude.ClaudeService;
+import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.midjourney.MidjourneyAccountService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
@@ -74,12 +75,20 @@ public class MirrorController {
     @Value("${midjourney.drawUrl}")
     private String midjourneyDrawUrl;
 
+    @Value("${luma.url}")
+    private String lumaHost;
+
+    @Value("${luma.videoUrl}")
+    private String lumaVideoUrl;
+
     private final RenewUpgradePackageMapper renewUpgradePackageMapper;
 
     private final GroupsRelationMapper relationMapper;
 
     private final GroupsMapper groupsMapper;
 
+    private final LumaService lumaService;
+
 
     /**
      * GPT车票跳转登录
@@ -583,4 +592,17 @@ public class MirrorController {
             });
         }
     }
+
+
+    /**
+     * luma车票跳转登录
+     *
+     * @param relationId 车票id
+     */
+    @GetMapping("/luma/{relationId}")
+    public Result<String> lumaRedirect(@PathVariable Long relationId) {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        LumaUser lumaUser = lumaService.getLumaUser(userId, relationId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(lumaHost + (EnvCommonService.active_pre.equals(envCommonService.getEnv()) ? "/8083":"/8084") +"/api/applets/luma/lumaMirrorWithToken/" + lumaUser.getUserToken());
+    }
 }

+ 21 - 0
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -33,8 +33,10 @@ import com.cyksj.model.request.AlipayOrderDonReq;
 import com.cyksj.model.request.OrderPayRequest;
 import com.cyksj.model.response.AliPayTradeStatus;
 import com.cyksj.model.views.GoodsDonSkuView;
+import com.cyksj.model.views.LumaUserView;
 import com.cyksj.model.views.MidjourneyUserView;
 import com.cyksj.model.views.OrderCommentView;
+import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.midjourney.MidjourneyAccountService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.paypal.PayPalService;
@@ -129,6 +131,9 @@ public class OrderController {
     @Autowired
     private OrderDonRenewRecordMapper orderDonRenewRecordMapper;
 
+    @Autowired
+    private LumaService lumaService;
+
     /**
      * 支付
      * @author chan
@@ -862,4 +867,20 @@ public class OrderController {
                 .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
+
+    /**
+     * luma查询订单用户账号剩余次数
+     */
+    @GetMapping("/get/luma/user")
+    public Result<LumaUserView> getLumaUser(Long relationId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        LumaUserView search = beanSearcher.searchFirst(LumaUserView.class, MapUtils.flatBuilder(request.getParameterMap())
+                .field(LumaUserView::getUserId, userId).field(LumaUserView::getRelationId, relationId).build());
+        if (search == null) {
+            LumaUser lumaUser = lumaService.getLumaUser(userId, relationId);
+            search = new LumaUserView();
+            BeanUtils.copyProperties(lumaUser, search);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


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

@@ -197,4 +197,8 @@ smsVerify:
 
 midjourney:
   url: https://mj1.galaxydvd.com
-  drawUrl: https://nf.video/drawTest/web/
+  drawUrl: https://nf.video/drawTest/web/
+
+luma:
+  url: https://luma.galaxydvd.com
+  videoUrl: https://luma.galaxydvd.com/videoTest/web

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio