zoujiajian 2 gadi atpakaļ
vecāks
revīzija
313c763d11

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

@@ -363,4 +363,6 @@ public interface Constant {
 	String money = "money";
 
 	String orders = "orders";
+
+	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-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -842,6 +842,8 @@ public class RedisService {
         MIDJOURNEY_ACCOUNT("midjourney:account:", "midjourney account", 60 * 60 * 48L),
         APPLY_MONEY_DAY_LIMIT_KEY("apply_money_day_limit_key:%s:%s:%s", "每日提现次数限制", 60 * 60 * 24L),
         NETFLIX_SET_LIMIT_TIME("netflix_set_limit_time", "奈飞设置限制", 30l),
+        LUMA_USER("luma_user:", "luma_user", 60 * 60 * 2L),
+        LUMA_USER_MUM_LIMIT("luma_user_mum_limit:", "luma_user 生成视频次数", 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_USER_MUM_LIMIT.getName() + lumaUser.getId(), lumaUser.getNum(), RedisService.key.LUMA_USER_MUM_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_USER_MUM_LIMIT.getName() + lumaUser.getId(), upgradePackage.getNum().longValue());
+                if (decr < 0) {
+                    redisService.set(RedisService.key.LUMA_USER_MUM_LIMIT.getName() + lumaUser.getId(), 0L);
+                }
+            }
+        }
     }
 
     /**

+ 20 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -322,6 +322,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonRenewRecordMapper orderDonRenewRecordMapper;
 
+	private final LumaUserMapper lumaUserMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -3596,6 +3598,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_USER_MUM_LIMIT.getName() + lumaUser.getId());
+				if (num == null) {
+					redisService.set(RedisService.key.LUMA_USER_MUM_LIMIT.getName() + lumaUser.getId(), lumaUser.getNum() + upgradePackage.getNum().longValue(), RedisService.key.LUMA_USER_MUM_LIMIT.getTimeout());
+				} else {
+					redisService.incr(RedisService.key.LUMA_USER_MUM_LIMIT.getName() + lumaUser.getId(), upgradePackage.getNum().longValue());
+				}
+			}
+		}
 	}
 
 

+ 27 - 2
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -19,6 +19,7 @@ import com.cyksj.model.views.ChatGptUserView;
 import com.cyksj.model.views.ChatgptCarInfoView;
 import com.cyksj.model.views.ChatgptConversionLimitView;
 import com.cyksj.service.chatgpt.ChatGptAccountService;
+import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.midjourney.MidjourneyAccountService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
@@ -34,14 +35,12 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.swing.text.html.Option;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
-import java.util.Optional;
 
 /**
  * /server/镜像服务
@@ -81,6 +80,11 @@ public class MirrorController {
 
     private final GroupsMapper groupsMapper;
 
+    private final LumaService lumaService;
+
+    @Value("${luma.videoUrl}")
+    private String lumaVideoUrl;
+
 
     /**
      * GPT车票跳转登录
@@ -405,4 +409,25 @@ public class MirrorController {
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * MJ车票跳转登录
+     *
+     * @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(midjourneyHost + (EnvCommonService.active.equals(envCommonService.getEnv()) ? "/8081":"/8082") +"/api/applets/midjourney/midjourneyMirrorWithToken/" + lumaUser.getUserToken());
+    }
+
+    @GetMapping("/lumaWithToken/{userToken}")
+    public void lumaWithToken(@PathVariable String userToken) throws IOException {
+        Cookie cookie = new Cookie("userToken", userToken);
+        cookie.setMaxAge(31536000);
+        cookie.setPath("/");
+        response.addCookie(cookie);
+        response.sendRedirect(lumaVideoUrl);
+    }
 }

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 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://nf.video
-  drawUrl: https://nf.video/drawTest/web/
+  drawUrl: https://nf.video/drawTest/web/
+
+luma:
+  url: https://inside.yicanggongyi.com
+  drawUrl: https://inside.yicanggongyi.com/draw/web

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels