From 50341705390ea36e99da2ab0e6efc00b0b965685 Mon Sep 17 00:00:00 2001
From: whb <17803890193@163.com>
Date: Wed, 17 Jul 2024 14:47:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E6=A8=A1=E5=9E=8B=E4=BD=BF=E7=94=A8?=
 =?UTF-8?q?=E6=AC=A1=E6=95=B0=E6=94=B9=E4=B8=BA=E5=9B=BE=E7=89=87=E7=94=9F?=
 =?UTF-8?q?=E6=88=90=E4=B8=89=E6=AC=A1=E6=88=96=E6=8F=90=E9=97=AE=E4=B8=8A?=
 =?UTF-8?q?=E9=99=9030=E4=B8=AA=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../marketing/annotation/aspect/AiAspect.java | 77 +++++++++++++++++--
 .../marketing/qianfan/model/chat/Message.java |  6 +-
 .../impl/QianFanBigModuleServiceImpl.java     | 38 +++++++--
 3 files changed, 104 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/sztzjy/marketing/annotation/aspect/AiAspect.java b/src/main/java/com/sztzjy/marketing/annotation/aspect/AiAspect.java
index acedec7..a65e444 100644
--- a/src/main/java/com/sztzjy/marketing/annotation/aspect/AiAspect.java
+++ b/src/main/java/com/sztzjy/marketing/annotation/aspect/AiAspect.java
@@ -43,13 +43,27 @@ public class AiAspect {
      */
 
     // 定义一个Pointcut,匹配带有StuCreateImgDTO参数的方法
-    @Pointcut("execution(* com.sztzjy.marketing.service.impl.QianFanBigModuleServiceImpl.*(..))")
+    @Pointcut("execution(* com.sztzjy.marketing.service.impl.QianFanBigModuleServiceImpl.createArticleByMessage(..))")
     public void useInspect() {
     }
 
 
-    @Before("useInspect()")
-    public void timesCheck(JoinPoint joinPoint) throws IllegalAccessException {
+    /**
+     * 切入点
+     *
+     * @param
+     * @return
+     */
+
+    // 定义一个Pointcut,匹配带有StuCreateImgDTO参数的方法
+    @Pointcut("execution(* com.sztzjy.marketing.service.impl.QianFanBigModuleServiceImpl.createImgByAi(..))")
+    public void limitImg() {
+    }
+
+
+
+    @Before("limitImg()")
+    public void imgTimesCheck(JoinPoint joinPoint) throws IllegalAccessException {
         log.info("开始检查使用次数...");
 
 
@@ -59,17 +73,17 @@ public class AiAspect {
 
             StuAiLimitExample limitExample = new StuAiLimitExample();
             limitExample.createCriteria().andUserIdEqualTo(jwtUser.getUserId());
-
             List<StuAiLimit> stuAiLimits = stuAiLimitMapper.selectByExample(limitExample);
             if (!stuAiLimits.isEmpty())
             {
                 if (stuAiLimits.get(0).getLimitState()== (byte) 1 || 3 < stuAiLimits.get(0).getNumberOfTimes()){
-                    throw new RuntimeException("超出使用限制,请明日再来!");
+                    throw new RuntimeException("您的使用已达到今日限额,请明日再试。");
                 }
 
                 StuAiLimit stuAiLimit = stuAiLimits.get(0);
+
                 stuAiLimit.setNumberOfTimes(stuAiLimit.getNumberOfTimes()+1);
-                if (3 == stuAiLimit.getNumberOfTimes())
+                if (3 <= stuAiLimit.getNumberOfTimes())
                 {
                     stuAiLimit.setLimitState((byte)1);
                 }
@@ -83,16 +97,63 @@ public class AiAspect {
                 stuAiLimit.setUserId(jwtUser.getUserId());
                 stuAiLimit.setLimitState((byte)0);
                 stuAiLimit.setCreateTime(new Date());
-                stuAiLimit.setNumberOfTimes(1);
+                stuAiLimit.setNumberOfTimes(0);
+                stuAiLimit.setWordNumber(0);
                 stuAiLimitMapper.insertSelective(stuAiLimit);
 
             }
 
-
         } else {
             throw new UnAuthorizedException("未经授权登录");
         }
 
+    }
+
+
+    @Before("useInspect()")
+    public void timesCheck(JoinPoint joinPoint) throws IllegalAccessException {
+        log.info("开始检查使用次数...");
+
+
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        if (authentication != null && authentication.isAuthenticated()) {
+            JwtUser jwtUser = (JwtUser) authentication.getPrincipal();
+
+            StuAiLimitExample limitExample = new StuAiLimitExample();
+            limitExample.createCriteria().andUserIdEqualTo(jwtUser.getUserId());
+            List<StuAiLimit> stuAiLimits = stuAiLimitMapper.selectByExample(limitExample);
+            if (!stuAiLimits.isEmpty())
+            {
+                if (stuAiLimits.get(0).getLimitState()== (byte) 1 || 30 < stuAiLimits.get(0).getWordNumber()){
+                    throw new RuntimeException("您的使用已达到今日限额,请明日再试。");
+                }
+
+                StuAiLimit stuAiLimit = stuAiLimits.get(0);
+
+
+                if (30 <= stuAiLimit.getWordNumber())
+                {
+                    stuAiLimit.setLimitState((byte)1);
+                }
+
+                stuAiLimitMapper.updateByPrimaryKeySelective(stuAiLimit);
+
+
+            }else {
+
+                StuAiLimit stuAiLimit = new StuAiLimit();
+                stuAiLimit.setUserId(jwtUser.getUserId());
+                stuAiLimit.setLimitState((byte)0);
+                stuAiLimit.setCreateTime(new Date());
+                stuAiLimit.setNumberOfTimes(1);
+                stuAiLimit.setWordNumber(0);
+                stuAiLimitMapper.insertSelective(stuAiLimit);
+
+            }
+
+        } else {
+            throw new UnAuthorizedException("未经授权登录");
+        }
 
     }
 
diff --git a/src/main/java/com/sztzjy/marketing/qianfan/model/chat/Message.java b/src/main/java/com/sztzjy/marketing/qianfan/model/chat/Message.java
index a806b66..d8d2d7d 100644
--- a/src/main/java/com/sztzjy/marketing/qianfan/model/chat/Message.java
+++ b/src/main/java/com/sztzjy/marketing/qianfan/model/chat/Message.java
@@ -20,7 +20,9 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
 public class Message {
     /**
      * 角色,可选 "user", "assistant", "function"
@@ -37,6 +39,8 @@ public class Message {
      */
     private String name;
 
+    private String userId;
+
     /**
      * 函数调用
      */
diff --git a/src/main/java/com/sztzjy/marketing/service/impl/QianFanBigModuleServiceImpl.java b/src/main/java/com/sztzjy/marketing/service/impl/QianFanBigModuleServiceImpl.java
index f3e7122..e63d08d 100644
--- a/src/main/java/com/sztzjy/marketing/service/impl/QianFanBigModuleServiceImpl.java
+++ b/src/main/java/com/sztzjy/marketing/service/impl/QianFanBigModuleServiceImpl.java
@@ -5,9 +5,12 @@ package com.sztzjy.marketing.service.impl;/**
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.sztzjy.marketing.entity.StuAiLimit;
+import com.sztzjy.marketing.entity.StuAiLimitExample;
 import com.sztzjy.marketing.entity.dto.ReqChatMessage;
 import com.sztzjy.marketing.entity.dto.StuCreateArticleDTO;
 import com.sztzjy.marketing.entity.dto.StuCreateImgDTO;
+import com.sztzjy.marketing.mapper.StuAiLimitMapper;
 import com.sztzjy.marketing.qianfan.Qianfan;
 import com.sztzjy.marketing.qianfan.model.chat.ChatResponse;
 import com.sztzjy.marketing.qianfan.model.chat.Message;
@@ -49,15 +52,19 @@ public class QianFanBigModuleServiceImpl implements QianFanBigModuleService {
     @Autowired
     private AsyncTaskExecutor asyncTaskExecutor;
 
+
+    @Autowired
+    private StuAiLimitMapper stuAiLimitMapper;
+
     @Override
     public ResultEntity createImgByAi(StuCreateImgDTO stuCreateImgDTO)  {
 
-        String accesstoken = null;
-        try {
-             accesstoken = getAccesstoken();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
+//        String accesstoken = null;
+//        try {
+//             accesstoken = getAccesstoken();
+//        } catch (IOException e) {
+//            throw new RuntimeException(e);
+//        }
 
 //        chat(accesstoken);
 
@@ -107,6 +114,23 @@ public class QianFanBigModuleServiceImpl implements QianFanBigModuleService {
     @Override
     public Flux<String> createArticleByMessage(List<Message> messageList) {
 
+        int count = 0;
+        for (Message message : messageList) {
+            int length = message.getContent().length();
+            count += length;
+        }
+        System.out.println(count);
+
+        StuAiLimitExample limitExample = new StuAiLimitExample();
+        limitExample.createCriteria().andUserIdEqualTo(messageList.get(0).getUserId());
+        List<StuAiLimit> stuAiLimits = stuAiLimitMapper.selectByExample(limitExample);
+
+
+        if (stuAiLimits.get(0).getLimitState()== (byte) 1 || 30 < stuAiLimits.get(0).getWordNumber()) {
+            throw new RuntimeException("您的使用已达到今日限额,请明日再试。");
+        }
+        stuAiLimits.get(0).setWordNumber(stuAiLimits.get(0).getWordNumber() + count);
+        stuAiLimitMapper.updateByPrimaryKeySelective(stuAiLimits.get(0));
 
 
         String accesstoken = null;
@@ -116,8 +140,6 @@ public class QianFanBigModuleServiceImpl implements QianFanBigModuleService {
             throw new RuntimeException(e);
         }
 
-
-
         return (chat(accesstoken,messageList));
     }