zoujiajian 11 ماه پیش
والد
کامیت
66d518fa1a

+ 1 - 14
netflix-service/src/main/java/com/cyksj/service/quota/NanoUserQuotaService.java

@@ -8,18 +8,5 @@ import com.cyksj.model.entity.NanoUserQuota;
  */
 public interface NanoUserQuotaService extends IService<NanoUserQuota> {
 
-    /**
-     * 根据用户token获取配额信息
-     */
-    NanoUserQuota getByUserToken(String userToken);
-
-    /**
-     * 根据用户ID获取配额信息
-     */
-    NanoUserQuota getByUid(Long uid);
-
-    /**
-     * 更新配额使用情况
-     */
-    void updateUsage(Long id, Integer usedQuota);
+	NanoUserQuota getNanoUser(Long userId, Long relationId);
 }

+ 78 - 37
netflix-service/src/main/java/com/cyksj/service/quota/impl/NanoUserQuotaServiceImpl.java

@@ -1,16 +1,21 @@
 package com.cyksj.service.quota.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.lang.UUID;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
-import com.cyksj.mapper.NanoUserQuotaMapper;
-import com.cyksj.model.entity.NanoUserQuota;
+import com.cyksj.mapper.*;
+import com.cyksj.model.entity.*;
 import com.cyksj.service.quota.NanoUserQuotaService;
+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 java.util.Date;
+import java.util.List;
 
 /**
  * 用户固定配额管理服务实现类
@@ -19,49 +24,85 @@ import java.util.Date;
 @Service
 @RequiredArgsConstructor
 public class NanoUserQuotaServiceImpl extends ServiceImpl<NanoUserQuotaMapper, NanoUserQuota> implements NanoUserQuotaService {
+    private final UserBindRelationService userBindRelationService;
+
+    private final GroupsRelationMapper groupsRelationMapper;
+
+    private final GroupsMapper groupsMapper;
+
+    private final UserMapper userMapper;
+
+    private final GoodsDonSkuMapper skuMapper;
 
     @Override
-    public NanoUserQuota getByUserToken(String userToken) {
-        if (userToken == null || userToken.trim().isEmpty()) {
-            throw new BusinessRuntimeException("用户token不能为空");
+    public NanoUserQuota getNanoUser(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.NANO_GOODS_ID) {
+            return getNanoUser(userId, relationId, groupsRelation, goodsDonSku);
+        } else {
+            throw BusinessRuntimeException.getInstance("服务器出了点问题");
         }
-        return this.getOne(new LambdaQueryWrapper<NanoUserQuota>()
-                .eq(NanoUserQuota::getUserToken, userToken)
-                .last("LIMIT 1"));
     }
 
-    @Override
-    public NanoUserQuota getByUid(Long uid) {
-        if (uid == null) {
-            throw new BusinessRuntimeException("用户ID不能为空");
+    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 this.getOne(new LambdaQueryWrapper<NanoUserQuota>()
-                .eq(NanoUserQuota::getUid, uid)
-                .last("LIMIT 1"));
+        return groupsRelation;
     }
 
-    @Override
-    public void updateUsage(Long id, Integer usedQuota) {
-        if (id == null) {
-            throw new BusinessRuntimeException("配额ID不能为空");
+    /**
+     * 获取车队信息
+     *
+     * @param groupsRelation
+     * @return
+     */
+    private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
+        GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
+        if (groupsTrips == null) {
+            throw BusinessRuntimeException.getInstance("车队异常");
         }
-        if (usedQuota == null || usedQuota < 0) {
-            throw new BusinessRuntimeException("使用配额数量不能为空且必须大于等于0");
-        }
-        
-        NanoUserQuota quota = this.getById(id);
-        if (quota == null) {
-            throw new BusinessRuntimeException("配额记录不存在");
+        return groupsTrips;
+    }
+
+    private NanoUserQuota getNanoUser(Long userId, Long relationId, GroupsRelation groupsRelation, GoodsDonSku goodsDonSku) {
+        NanoUserQuota nanoUser = getOne(Wrappers.lambdaQuery(NanoUserQuota.class).eq(NanoUserQuota::getRelationId, relationId));
+        User user = userMapper.selectById(userId);
+        if (nanoUser == null) {
+            nanoUser = createNanoUser(groupsRelation, user, goodsDonSku);
+        } else {
+            updateLumaUser(user, nanoUser);
         }
-        
-        if (usedQuota > quota.getTotalQuota()) {
-            throw new BusinessRuntimeException("使用配额不能超过总配额");
+        return nanoUser;
+    }
+
+
+    private NanoUserQuota createNanoUser(GroupsRelation groupsRelation, User user, GoodsDonSku sku) {
+        NanoUserQuota nanoUserQuota = new NanoUserQuota();
+        nanoUserQuota.setUid(user.getId());
+        nanoUserQuota.setRelationId(groupsRelation.getId());
+        nanoUserQuota.setUserToken(UUID.randomUUID().toString());
+        nanoUserQuota.setNickname(user.getNickname());
+        nanoUserQuota.setAvatar(user.getHeadimgurl());
+        nanoUserQuota.setPurchaseDate(DateTime.now());
+        nanoUserQuota.setTotalQuota(sku.getNanoQuota());
+        nanoUserQuota.setRemainingQuota(nanoUserQuota.getRemainingQuota());
+        try {
+            save(nanoUserQuota);
+        } catch (DuplicateKeyException e) {
+
         }
-        
-        quota.setUsedQuota(usedQuota);
-        quota.setRemainingQuota(quota.getTotalQuota() - usedQuota);
-        quota.setLastUsedDate(new Date());
-        
-        this.updateById(quota);
+        return nanoUserQuota;
+    }
+
+    private void updateLumaUser(User user, NanoUserQuota nanoUserQuota) {
+        nanoUserQuota.setNickname(user.getNickname());
+        nanoUserQuota.setAvatar(user.getHeadimgurl());
+        updateById(nanoUserQuota);
     }
+
 }

+ 0 - 105
netflix-web/src/main/java/com/cyksj/web/controller/manage/NanoUserQuotaController.java

@@ -1,105 +0,0 @@
-package com.cyksj.web.controller.manage;
-
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import com.cyksj.common.annotation.Log;
-import com.cyksj.dto.Result;
-import com.cyksj.enums.BusinessType;
-import com.cyksj.enums.GatewayResponse;
-import com.cyksj.model.entity.NanoUserQuota;
-import com.cyksj.service.quota.NanoUserQuotaService;
-import com.ejlchina.searcher.BeanSearcher;
-import com.ejlchina.searcher.SearchResult;
-import com.ejlchina.searcher.util.MapUtils;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * 用户固定配额管理接口
- */
-@Slf4j
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/manage/nanoUserQuota")
-public class NanoUserQuotaController {
-
-    private final HttpServletRequest request;
-    private final BeanSearcher beanSearcher;
-    private final NanoUserQuotaService nanoUserQuotaService;
-
-    /**
-     * 分页查询用户配额列表
-     */
-    @GetMapping("/list")
-    public Result<SearchResult<NanoUserQuota>> list() {
-        SearchResult<NanoUserQuota> search = beanSearcher.search(NanoUserQuota.class, 
-            MapUtils.flatBuilder(request.getParameterMap()).build());
-        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
-    }
-
-    /**
-     * 根据ID获取用户配额详情
-     */
-    @GetMapping("/{id}")
-    public Result<NanoUserQuota> getById(@PathVariable Long id) {
-        NanoUserQuota quota = nanoUserQuotaService.getById(id);
-        return GatewayResponse.SUCCESS.newBuilder().toResult(quota);
-    }
-
-    /**
-     * 新增用户配额
-     */
-    @PostMapping
-    public Result<String> add(@RequestBody @Validated NanoUserQuota quota) {
-        nanoUserQuotaService.save(quota);
-        return GatewayResponse.SUCCESS.newBuilder().toResult();
-    }
-
-    /**
-     * 修改用户配额
-     */
-    @PutMapping
-    public Result<String> update(@RequestBody @Validated NanoUserQuota quota) {
-        nanoUserQuotaService.updateById(quota);
-        return GatewayResponse.SUCCESS.newBuilder().toResult();
-    }
-
-    /**
-     * 删除用户配额
-     */
-    @DeleteMapping("/{id}")
-    public Result<String> delete(@PathVariable Long id) {
-        nanoUserQuotaService.removeById(id);
-        return GatewayResponse.SUCCESS.newBuilder().toResult();
-    }
-
-    /**
-     * 根据用户token获取配额信息
-     */
-    @GetMapping("/token/{userToken}")
-    public Result<NanoUserQuota> getByUserToken(@PathVariable String userToken) {
-        NanoUserQuota quota = nanoUserQuotaService.getByUserToken(userToken);
-        return GatewayResponse.SUCCESS.newBuilder().toResult(quota);
-    }
-
-    /**
-     * 根据用户ID获取配额信息
-     */
-    @GetMapping("/uid/{uid}")
-    public Result<NanoUserQuota> getByUid(@PathVariable Long uid) {
-        NanoUserQuota quota = nanoUserQuotaService.getByUid(uid);
-        return GatewayResponse.SUCCESS.newBuilder().toResult(quota);
-    }
-
-    /**
-     * 更新配额使用情况
-     */
-    @PutMapping("/usage/{id}")
-    public Result<String> updateUsage(@PathVariable Long id, @RequestParam Integer usedQuota) {
-        nanoUserQuotaService.updateUsage(id, usedQuota);
-        return GatewayResponse.SUCCESS.newBuilder().toResult();
-    }
-}

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

@@ -16,7 +16,6 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GroupsMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.WebInfoMapper;
-import com.cyksj.mapper.WholesaleUserMapper;
 import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
 import com.cyksj.model.dto.ChatgptUserVerifyDto;
 import com.cyksj.model.entity.*;
@@ -26,6 +25,7 @@ import com.cyksj.service.claude.ClaudeService;
 import com.cyksj.service.grok.GrokService;
 import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.midjourney.MidjourneyAccountService;
+import com.cyksj.service.quota.NanoUserQuotaService;
 import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
@@ -100,7 +100,7 @@ public class MirrorController {
 
     private final GrokService grokService;
 
-    private final WholesaleUserMapper wholesaleUserMapper;
+    private final NanoUserQuotaService nanoUserQuotaService;
 
     private final WebInfoMapper webInfoMapper;
 
@@ -628,4 +628,29 @@ public class MirrorController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(webInfo);
     }
 
+    /**
+     * nano车票跳转登录
+     */
+    @GetMapping("/nanoUser/{relationId}")
+    public void nanoUserWithTokenRedirect(String domain, @PathVariable Long relationId) throws IOException {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        NanoUserQuota nanoUserQuota = nanoUserQuotaService.getNanoUser(userId, relationId);
+        String DOMAIN = domain;
+        if (StrUtil.isEmpty(DOMAIN)) {
+            try {
+                SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "mirror_nano_domain"));
+                if (sysConfig != null) {
+                    String sysValue = sysConfig.getSysValue();
+                    if (JSONUtil.isJsonArray(sysValue)) {
+                        List<String> domainList = JSONUtil.parseArray(sysValue).toList(String.class);
+                        DOMAIN = domainList.get(RandomUtil.randomInt(domainList.size()));
+                    }
+                }
+            } catch (Exception e) {
+                log.error("nano随机抽取域名错误. msg:{}", StringUtil.getErrorText(e));
+            }
+        }
+        response.sendRedirect(DOMAIN + "/login?usertoken=" + nanoUserQuota.getUserToken());
+    }
+
 }