feat: 测试版本提交

This commit is contained in:
ageerle
2025-04-08 16:48:06 +08:00
parent 00f362acf1
commit d2755f00bc
111 changed files with 1112 additions and 2276 deletions

View File

@@ -344,10 +344,16 @@
</dependencyManagement>
<modules>
<module>ruoyi-admin</module>
<module>ruoyi-common</module>
<module>ruoyi-modules</module>
<module>ruoyi-modules-api</module>
<module>ruoyi-modules-api</module>
<module>ruoyi-modules-api/ruoyi-device-api</module>
<module>ruoyi-modules-api/ruoyi-weixin-api</module>
<module>ruoyi-modules/ruoyi-weixin</module>
<module>ruoyi-modules/ruoyi-device</module>
</modules>
<packaging>pom</packaging>
<build>

View File

@@ -1,35 +0,0 @@
#基础镜像
FROM findepi/graalvm:java17-native
# 设置环境变量
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8
ENV LC_ALL C.UTF-8
ENV SERVER_PORT=6039
MAINTAINER ageerle
RUN mkdir -p /ruoyi/server/logs \
/ruoyi/server/temp \
/ruoyi/skywalking/agent
#工作空间
WORKDIR /ruoyi/server
EXPOSE ${SERVER_PORT}
ADD ./target/ruoyi-admin.jar ./app.jar
ENTRYPOINT ["java", \
"-Djava.security.egd=file:/dev/./urandom", \
"-Dserver.port=${SERVER_PORT}", \
# 应用名称 如果想区分集群节点监控 改成不同的名称即可
# "-Dskywalking.agent.service_name=ruoyi-server", \
# "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
"-jar", "app.jar"]

View File

@@ -1,129 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi-ai</artifactId>
<groupId>org.ruoyi</groupId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId>
<description>
web服务入口
</description>
<dependencies>
<!-- Mysql驱动包 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- Oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!-- PostgreSql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- SqlServer -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-doc</artifactId>
</dependency>
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>
</dependency>
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-chat</artifactId>
</dependency>
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-knowledge</artifactId>
</dependency>
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
</dependency>
<!-- demo模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-demo</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 添加thumbnailator依赖 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.11</version>
</dependency>
<dependency>
<groupId>io.github.ollama4j</groupId>
<artifactId>ollama4j</artifactId>
<version>1.0.79</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${maven-war-plugin.version}</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,184 +0,0 @@
package org.ruoyi.controller;
import cn.dev33.satoken.stp.StpUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.ruoyi.common.chat.domain.request.ChatRequest;
import org.ruoyi.common.chat.entity.chat.Message;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.excel.utils.ExcelUtil;
import org.ruoyi.common.log.annotation.Log;
import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
import org.ruoyi.knowledge.service.EmbeddingService;
import org.ruoyi.knowledge.service.IKnowledgeAttachService;
import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
import org.ruoyi.knowledge.service.IKnowledgeInfoService;
import org.ruoyi.system.service.ISseService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.util.List;
/**
* 知识库
*
* @author Lion Li
* @date 2024-10-21
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/knowledge")
public class KnowledgeController extends BaseController {
private final IKnowledgeInfoService knowledgeInfoService;
private final VectorStore vectorStore;
private final IKnowledgeAttachService attachService;
private final IKnowledgeFragmentService fragmentService;
private final EmbeddingService embeddingService;
private final ISseService sseService;
/**
* 知识库对话
*/
@PostMapping("/send")
public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
List<Message> messages = chatRequest.getMessages();
// 获取知识库信息
Message message = messages.get(messages.size() - 1);
StringBuilder sb = new StringBuilder(message.getContent().toString());
List<String> nearestList;
List<Double> queryVector = embeddingService.getQueryVector(message.getContent().toString(), chatRequest.getKid());
nearestList = vectorStore.nearest(queryVector, chatRequest.getKid());
for (String prompt : nearestList) {
sb.append("\n####").append(prompt);
}
sb.append( (nearestList.size() > 0 ? "\n\n注意回答问题时须严格根据我给你的系统上下文内容原文进行回答请不要自己发挥,回答时保持原来文本的段落层级" : ""));
message.setContent(sb.toString());
return sseService.sseChat(chatRequest, request);
}
/**
* 根据用户信息查询本地知识库
*/
@GetMapping("/list")
public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
if(!StpUtil.isLogin()){
return null;
}
bo.setUid(LoginHelper.getUserId());
return knowledgeInfoService.queryPageList(bo, pageQuery);
}
/**
* 新增知识库
*/
@Log(title = "知识库", businessType = BusinessType.INSERT)
@PostMapping("/save")
public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
knowledgeInfoService.saveOne(bo);
return R.ok();
}
/**
* 删除知识库
*/
@PostMapping("/remove/{id}")
public R<String> remove(@PathVariable String id){
knowledgeInfoService.removeKnowledge(id);
return R.ok("删除知识库成功!");
}
/**
* 修改知识库
*/
@Log(title = "知识库", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
public R<Void> edit( @RequestBody KnowledgeInfoBo bo) {
return toAjax(knowledgeInfoService.updateByBo(bo));
}
/**
* 导出知识库列表
*/
@Log(title = "知识库", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
}
/**
* 查询知识附件信息
*/
@GetMapping("/detail/{kid}")
public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,@PathVariable String kid){
bo.setKid(kid);
return attachService.queryPageList(bo, pageQuery);
}
/**
* 上传知识库附件
*/
@PostMapping(value = "/attach/upload")
public R<String> upload(KnowledgeInfoUploadRequest request){
knowledgeInfoService.upload(request);
return R.ok("上传知识库附件成功!");
}
/**
* 获取知识库附件详细信息
*
* @param id 主键
*/
@GetMapping("attach/info/{id}")
public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(attachService.queryById(id));
}
/**
* 删除知识库附件
*
*/
@PostMapping("attach/remove/{docId}")
public R<Void> removeAttach(@NotEmpty(message = "主键不能为空") @PathVariable String docId) {
attachService.removeKnowledgeAttach(docId);
return R.ok();
}
/**
* 查询知识片段
*/
@GetMapping("/fragment/list/{docId}")
public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
bo.setDocId(docId);
return fragmentService.queryPageList(bo, pageQuery);
}
}

61
ruoyi-modules-api/pom.xml Normal file
View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-ai</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>ruoyi-modules-api</artifactId>
<packaging>pom</packaging>
<modules>
<module>ruoyi-system-api</module>
<module>ruoyi-chat-api</module>
<module>ruoyi-knowledge-api</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 系统核心模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<!-- mybaits基础模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-mybatis</artifactId>
</dependency>
<!-- 脱敏模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-sensitive</artifactId>
</dependency>
<!-- excel模块-->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-modules-api</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>ruoyi-chat-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -1,10 +1,10 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;

View File

@@ -1,13 +1,13 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.common.tenant.core.TenantEntity;
import java.io.Serial;
@@ -20,7 +20,7 @@ import java.io.Serial;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_config")
public class ChatConfig extends TenantEntity {
public class ChatConfig extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import jakarta.validation.constraints.NotBlank;

View File

@@ -1,6 +1,7 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;

View File

@@ -1,11 +1,11 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@@ -1,12 +1,13 @@
package org.ruoyi.system.domain;
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.*;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 用户兑换记录对象 chat_voucher

View File

@@ -1,12 +1,13 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatAppStore;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.domain.ChatAppStore;
/**
* 应用市场业务对象 voice_role

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
@@ -10,7 +10,8 @@ import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.system.domain.ChatConfig;
import org.ruoyi.domain.ChatConfig;
/**
* 对话配置信息

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
@@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatGpts;
import org.ruoyi.domain.ChatGpts;
/**
* gpts管理业务对象 chat_gpts

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
@@ -8,7 +8,8 @@ import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatMessage;
import org.ruoyi.domain.ChatMessage;
/**
* 聊天消息业务对象 chat_message

View File

@@ -1,13 +1,15 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.system.domain.ChatPlugin;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.domain.ChatPlugin;
/**
* 插件管理业务对象 chat_plugin

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
@@ -8,7 +8,8 @@ import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatVisitorUsage;
import org.ruoyi.domain.ChatVisitorUsage;
/**
* 访客管理业务对象 chat_visitor_usage

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.bo;
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
@@ -7,7 +7,8 @@ import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatVoucher;
import org.ruoyi.domain.ChatVoucher;
import java.math.BigDecimal;

View File

@@ -0,0 +1,23 @@
package org.ruoyi.domain.vo;
import lombok.Data;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* 缓存监控列表信息
*
* @author Michelle.Chung
*/
@Data
public class CacheListInfoVo {
private Properties info;
private Long dbSize;
private List<Map<String, String>> commandStats;
}

View File

@@ -0,0 +1,25 @@
package org.ruoyi.domain.vo;
import lombok.Data;
/**
* 验证码信息
*
* @author Michelle.Chung
*/
@Data
public class CaptchaVo {
/**
* 是否开启验证码
*/
private Boolean captchaEnabled = true;
private String uuid;
/**
* 验证码图片
*/
private String img;
}

View File

@@ -1,10 +1,12 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.system.domain.ChatAppStore;
import org.ruoyi.domain.ChatAppStore;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
@@ -6,7 +6,8 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.system.domain.ChatConfig;
import org.ruoyi.domain.ChatConfig;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -1,10 +1,11 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.system.domain.ChatGpts;
import org.ruoyi.domain.ChatGpts;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -1,4 +1,4 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.github.linpeilie.annotations.AutoMapper;
@@ -7,7 +7,8 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.system.domain.ChatMessage;
import org.ruoyi.domain.ChatMessage;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -1,16 +1,13 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import org.ruoyi.system.domain.ChatPlugin;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.domain.ChatPlugin;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**

View File

@@ -1,10 +1,10 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import java.io.Serializable;

View File

@@ -1,10 +1,10 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import org.ruoyi.system.domain.ChatVisitorUsage;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.domain.ChatVisitorUsage;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -1,11 +1,10 @@
package org.ruoyi.system.domain.vo;
package org.ruoyi.domain.vo;
import org.ruoyi.system.domain.ChatVoucher;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.domain.ChatVoucher;
import java.io.Serial;
import java.io.Serializable;

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatAppStore;
import org.ruoyi.domain.vo.ChatAppStoreVo;
/**
* 应用市场Mapper接口
*
* @author Lion Li
* @date 2024-03-19
*/
public interface ChatAppStoreMapper extends BaseMapperPlus<ChatAppStore, ChatAppStoreVo> {
}

View File

@@ -0,0 +1,17 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatConfig;
import org.ruoyi.domain.vo.ChatConfigVo;
/**
* 对话配置信息Mapper接口
*
* @author Lion Li
* @date 2024-04-13
*/
public interface ChatConfigMapper extends BaseMapperPlus<ChatConfig, ChatConfigVo> {
}

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatGpts;
import org.ruoyi.domain.vo.ChatGptsVo;
/**
* gpts管理Mapper接口
*
* @author Lion Li
* @date 2024-07-09
*/
public interface ChatGptsMapper extends BaseMapperPlus<ChatGpts, ChatGptsVo> {
}

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatMessage;
import org.ruoyi.domain.vo.ChatMessageVo;
/**
* 聊天消息Mapper接口
*
* @author Lion Li
* @date 2023-11-26
*/
public interface ChatMessageMapper extends BaseMapperPlus<ChatMessage, ChatMessageVo> {
}

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatPlugin;
import org.ruoyi.domain.vo.ChatPluginVo;
/**
* 插件管理Mapper接口
*
* @author ageerle
* @date 2025-03-30
*/
public interface ChatPluginMapper extends BaseMapperPlus<ChatPlugin, ChatPluginVo> {
}

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatToken;
import org.ruoyi.domain.vo.ChatTokenVo;
/**
* 聊天消息Mapper接口
*
* @author Lion Li
* @date 2023-11-26
*/
public interface ChatTokenMapper extends BaseMapperPlus<ChatToken, ChatTokenVo> {
}

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatVisitorUsage;
import org.ruoyi.domain.vo.ChatVisitorUsageVo;
/**
* 访客管理Mapper接口
*
* @author Lion Li
* @date 2024-07-14
*/
public interface ChatVisitorUsageMapper extends BaseMapperPlus<ChatVisitorUsage, ChatVisitorUsageVo> {
}

View File

@@ -0,0 +1,16 @@
package org.ruoyi.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatVoucher;
import org.ruoyi.domain.vo.ChatVoucherVo;
/**
* 用户兑换记录Mapper接口
*
* @author Lion Li
* @date 2024-05-03
*/
public interface ChatVoucherMapper extends BaseMapperPlus<ChatVoucher, ChatVoucherVo> {
}

View File

@@ -1,14 +1,10 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
import org.ruoyi.system.domain.bo.ChatAppStoreBo;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.system.request.RoleListDto;
import org.ruoyi.system.request.RoleRequest;
import org.ruoyi.system.request.SimpleGenerateRequest;
import org.ruoyi.system.response.SimpleGenerateDataResponse;
import org.ruoyi.system.response.rolelist.ChatAppStoreVO;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatAppStoreBo;
import org.ruoyi.domain.vo.ChatAppStoreVo;
import java.util.Collection;
import java.util.List;
@@ -36,15 +32,6 @@ public interface IChatAppStoreService {
*/
List<ChatAppStoreVo> queryList(ChatAppStoreBo bo);
/**
* 新增应用市场
*/
Boolean insertByBo(RoleRequest roleRequest);
/**
* 生成音频
*/
SimpleGenerateDataResponse simpleGenerate(SimpleGenerateRequest simpleGenerateRequest);
/**
* 修改应用市场
@@ -56,16 +43,5 @@ public interface IChatAppStoreService {
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 查询市场角色
*
* @return 角色列表
*/
List<ChatAppStoreVO> roleList();
/**
* 收藏市场角色
*
*/
void copyRole(RoleListDto roleListDto);
}

View File

@@ -1,9 +1,9 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.system.domain.bo.ChatConfigBo;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import org.ruoyi.domain.bo.ChatConfigBo;
import org.ruoyi.domain.vo.ChatConfigVo;
import java.util.Collection;
import java.util.List;

View File

@@ -1,6 +1,6 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.domain.bo.ChatMessageBo;
public interface IChatCostService {

View File

@@ -1,9 +1,9 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.vo.ChatGptsVo;
import org.ruoyi.system.domain.bo.ChatGptsBo;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatGptsBo;
import org.ruoyi.domain.vo.ChatGptsVo;
import java.util.Collection;
import java.util.List;

View File

@@ -1,9 +1,9 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.vo.ChatMessageVo;
import org.ruoyi.domain.bo.ChatMessageBo;
import org.ruoyi.domain.vo.ChatMessageVo;
import java.util.Collection;
import java.util.List;

View File

@@ -1,10 +1,9 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.ChatPlugin;
import org.ruoyi.system.domain.vo.ChatPluginVo;
import org.ruoyi.system.domain.bo.ChatPluginBo;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatPluginBo;
import org.ruoyi.domain.vo.ChatPluginVo;
import java.util.Collection;
import java.util.List;

View File

@@ -1,6 +1,6 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.ChatToken;
import org.ruoyi.domain.ChatToken;
/**
* 聊天消息Service接口
@@ -13,7 +13,7 @@ public interface IChatTokenService {
/**
* 查询用户token
*/
ChatToken queryByUserId(Long userId,String modelName);
ChatToken queryByUserId(Long userId, String modelName);
/**
* 清空用户token

View File

@@ -1,9 +1,9 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.vo.ChatVisitorUsageVo;
import org.ruoyi.system.domain.bo.ChatVisitorUsageBo;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatVisitorUsageBo;
import org.ruoyi.domain.vo.ChatVisitorUsageVo;
import java.util.Collection;
import java.util.List;

View File

@@ -1,9 +1,9 @@
package org.ruoyi.system.service;
package org.ruoyi.service;
import org.ruoyi.system.domain.vo.ChatVoucherVo;
import org.ruoyi.system.domain.bo.ChatVoucherBo;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatVoucherBo;
import org.ruoyi.domain.vo.ChatVoucherVo;
import java.util.Collection;
import java.util.List;

View File

@@ -2,6 +2,6 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.ruoyi.system.mapper.ChatConfigMapper">
<mapper namespace="org.ruoyi.mapper.ChatConfigMapper">
</mapper>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-ai</artifactId>
<version>1.0.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>ruoyi-device-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-modules-api</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>ruoyi-knowledge-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-modules-api</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>ruoyi-system-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-ai</artifactId>
<version>1.0.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>ruoyi-weixin-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -17,10 +17,7 @@ import org.ruoyi.common.core.exception.base.BaseException;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.request.translation.TranslationRequest;
import org.ruoyi.system.domain.vo.ChatMessageVo;
import org.ruoyi.system.service.IChatMessageService;
import org.ruoyi.system.service.ISseService;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;

View File

@@ -9,7 +9,6 @@ import okhttp3.Request;
import org.apache.commons.lang3.math.NumberUtils;
import org.ruoyi.chat.domain.InsightFace;
import org.ruoyi.chat.util.MjOkHttpUtil;
import org.ruoyi.system.service.IChatCostService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@@ -9,7 +9,6 @@ import org.apache.commons.lang3.math.NumberUtils;
import org.ruoyi.common.core.utils.OkHttpUtil;
import org.ruoyi.system.cofing.OkHttpConfig;
import org.ruoyi.system.domain.GenerateLuma;
import org.ruoyi.system.service.IChatCostService;
import org.springframework.web.bind.annotation.*;
/**

View File

@@ -10,7 +10,6 @@ import org.apache.commons.lang3.math.NumberUtils;
import org.ruoyi.chat.dto.*;
import org.ruoyi.chat.enums.ActionType;
import org.ruoyi.chat.util.MjOkHttpUtil;
import org.ruoyi.system.service.IChatCostService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@@ -10,7 +10,6 @@ import org.ruoyi.common.core.utils.OkHttpUtil;
import org.ruoyi.system.cofing.OkHttpConfig;
import org.ruoyi.system.domain.GenerateLyric;
import org.ruoyi.system.domain.GenerateSuno;
import org.ruoyi.system.service.IChatCostService;
import org.springframework.web.bind.annotation.*;
@RestController

View File

@@ -7,7 +7,6 @@ import org.ruoyi.system.request.RoleListDto;
import org.ruoyi.system.request.SimpleGenerateRequest;
import org.ruoyi.system.response.SimpleGenerateDataResponse;
import org.ruoyi.system.response.rolelist.ChatAppStoreVO;
import org.ruoyi.system.service.IChatAppStoreService;
import org.springframework.web.bind.annotation.*;
import java.util.List;

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-ai</artifactId>
<version>1.0.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>ruoyi-device</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -124,6 +124,10 @@
<version>1.0.79</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-mail</artifactId>
</dependency>
</dependencies>

View File

@@ -1,4 +1,4 @@
package org.ruoyi;
package org.ruoyi.system;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

View File

@@ -1,4 +1,4 @@
package org.ruoyi;
package org.ruoyi.system;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

View File

@@ -1,16 +1,14 @@
package org.ruoyi.controller;
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException;
import org.ruoyi.common.core.constant.Constants;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.domain.model.EmailLoginBody;
import org.ruoyi.common.core.domain.model.LoginBody;
import org.ruoyi.common.core.domain.model.RegisterBody;
import org.ruoyi.common.core.domain.model.SmsLoginBody;
import org.ruoyi.common.core.domain.model.VisitorLoginBody;
import org.ruoyi.common.core.domain.model.*;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StreamUtils;
import org.ruoyi.common.core.utils.StringUtils;
@@ -18,16 +16,12 @@ import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.common.tenant.helper.TenantHelper;
import org.ruoyi.system.domain.bo.SysTenantBo;
import org.ruoyi.system.domain.vo.LoginTenantVo;
import org.ruoyi.system.domain.vo.LoginVo;
import org.ruoyi.system.domain.vo.SysTenantVo;
import org.ruoyi.system.domain.vo.TenantListVo;
import org.ruoyi.system.service.ISysTenantService;
import org.ruoyi.system.service.SysLoginService;
import org.ruoyi.system.service.SysRegisterService;
import org.ruoyi.system.domain.vo.LoginVo;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -1,10 +1,14 @@
package org.ruoyi.controller;
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.core.constant.Constants;
import org.ruoyi.common.core.constant.GlobalConstants;
import org.ruoyi.common.core.domain.R;
@@ -22,10 +26,6 @@ import org.ruoyi.common.web.config.properties.CaptchaProperties;
import org.ruoyi.common.web.enums.CaptchaType;
import org.ruoyi.system.domain.request.EmailRequest;
import org.ruoyi.system.domain.vo.CaptchaVo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -36,7 +36,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.time.Duration;
import java.util.*;
import java.util.HashMap;
import java.util.Map;
/**
* 验证码操作处理

View File

@@ -8,9 +8,6 @@ import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.service.ConfigService;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatConfigBo;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import org.ruoyi.system.service.IChatConfigService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -15,9 +15,6 @@ import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatGptsBo;
import org.ruoyi.system.domain.vo.ChatGptsVo;
import org.ruoyi.system.service.IChatGptsService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -16,9 +16,6 @@ import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.vo.ChatMessageVo;
import org.ruoyi.system.service.IChatMessageService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -17,9 +17,6 @@ import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.system.domain.vo.ChatPluginVo;
import org.ruoyi.system.domain.bo.ChatPluginBo;
import org.ruoyi.system.service.IChatPluginService;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
/**

View File

@@ -3,10 +3,6 @@ package org.ruoyi.system.controller.system;
import lombok.RequiredArgsConstructor;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatAppStoreBo;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
import org.ruoyi.system.service.IChatAppStoreService;
import org.springframework.web.bind.annotation.*;
import java.util.List;

View File

@@ -15,9 +15,6 @@ import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatVisitorUsageBo;
import org.ruoyi.system.domain.vo.ChatVisitorUsageVo;
import org.ruoyi.system.service.IChatVisitorUsageService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -16,9 +16,6 @@ import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.common.wechat.web.utils.UUIDShortUtil;
import org.ruoyi.system.domain.bo.ChatVoucherBo;
import org.ruoyi.system.domain.vo.ChatVoucherVo;
import org.ruoyi.system.service.IChatVoucherService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -1,4 +1,4 @@
package org.ruoyi.controller;
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;

View File

@@ -0,0 +1,184 @@
//package org.ruoyi.system.controller.system;
//
//import cn.dev33.satoken.stp.StpUtil;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse;
//import jakarta.validation.Valid;
//import jakarta.validation.constraints.NotEmpty;
//import jakarta.validation.constraints.NotNull;
//import lombok.RequiredArgsConstructor;
//import org.ruoyi.common.chat.domain.request.ChatRequest;
//import org.ruoyi.common.chat.entity.chat.Message;
//import org.ruoyi.common.core.domain.R;
//import org.ruoyi.common.core.validate.AddGroup;
//import org.ruoyi.common.excel.utils.ExcelUtil;
//import org.ruoyi.common.log.annotation.Log;
//import org.ruoyi.common.log.enums.BusinessType;
//import org.ruoyi.common.mybatis.core.page.PageQuery;
//import org.ruoyi.common.mybatis.core.page.TableDataInfo;
//import org.ruoyi.common.satoken.utils.LoginHelper;
//import org.ruoyi.common.web.core.BaseController;
//import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
//import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
//import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
//import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
//import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
//import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
//import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
//import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
//import org.ruoyi.knowledge.service.EmbeddingService;
//import org.ruoyi.knowledge.service.IKnowledgeAttachService;
//import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
//import org.ruoyi.knowledge.service.IKnowledgeInfoService;
//import org.ruoyi.system.service.ISseService;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.*;
//import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
//
//import java.util.List;
//
//
///**
// * 知识库
// *
// * @author Lion Li
// * @date 2024-10-21
// */
//@Validated
//@RequiredArgsConstructor
//@RestController
//@RequestMapping("/knowledge")
//public class KnowledgeController extends BaseController {
//
// private final IKnowledgeInfoService knowledgeInfoService;
//
// private final VectorStore vectorStore;
//
// private final IKnowledgeAttachService attachService;
//
// private final IKnowledgeFragmentService fragmentService;
//
// private final EmbeddingService embeddingService;
//
// private final ISseService sseService;
//
// /**
// * 知识库对话
// */
// @PostMapping("/send")
// public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
// List<Message> messages = chatRequest.getMessages();
// // 获取知识库信息
// Message message = messages.get(messages.size() - 1);
// StringBuilder sb = new StringBuilder(message.getContent().toString());
// List<String> nearestList;
// List<Double> queryVector = embeddingService.getQueryVector(message.getContent().toString(), chatRequest.getKid());
// nearestList = vectorStore.nearest(queryVector, chatRequest.getKid());
// for (String prompt : nearestList) {
// sb.append("\n####").append(prompt);
// }
// sb.append( (nearestList.size() > 0 ? "\n\n注意回答问题时须严格根据我给你的系统上下文内容原文进行回答请不要自己发挥,回答时保持原来文本的段落层级" : ""));
// message.setContent(sb.toString());
// return sseService.sseChat(chatRequest, request);
// }
//
// /**
// * 根据用户信息查询本地知识库
// */
// @GetMapping("/list")
// public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
// if(!StpUtil.isLogin()){
// return null;
// }
// bo.setUid(LoginHelper.getUserId());
// return knowledgeInfoService.queryPageList(bo, pageQuery);
// }
//
// /**
// * 新增知识库
// */
// @Log(title = "知识库", businessType = BusinessType.INSERT)
// @PostMapping("/save")
// public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
// knowledgeInfoService.saveOne(bo);
// return R.ok();
// }
//
// /**
// * 删除知识库
// */
// @PostMapping("/remove/{id}")
// public R<String> remove(@PathVariable String id){
// knowledgeInfoService.removeKnowledge(id);
// return R.ok("删除知识库成功!");
// }
//
// /**
// * 修改知识库
// */
// @Log(title = "知识库", businessType = BusinessType.UPDATE)
// @PostMapping("/edit")
// public R<Void> edit( @RequestBody KnowledgeInfoBo bo) {
// return toAjax(knowledgeInfoService.updateByBo(bo));
// }
//
// /**
// * 导出知识库列表
// */
// @Log(title = "知识库", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
// List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
// ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
// }
//
// /**
// * 查询知识附件信息
// */
// @GetMapping("/detail/{kid}")
// public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,@PathVariable String kid){
// bo.setKid(kid);
// return attachService.queryPageList(bo, pageQuery);
// }
//
// /**
// * 上传知识库附件
// */
// @PostMapping(value = "/attach/upload")
// public R<String> upload(KnowledgeInfoUploadRequest request){
// knowledgeInfoService.upload(request);
// return R.ok("上传知识库附件成功!");
// }
//
// /**
// * 获取知识库附件详细信息
// *
// * @param id 主键
// */
// @GetMapping("attach/info/{id}")
// public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
// @PathVariable Long id) {
// return R.ok(attachService.queryById(id));
// }
//
// /**
// * 删除知识库附件
// *
// */
// @PostMapping("attach/remove/{docId}")
// public R<Void> removeAttach(@NotEmpty(message = "主键不能为空") @PathVariable String docId) {
// attachService.removeKnowledgeAttach(docId);
// return R.ok();
// }
//
//
// /**
// * 查询知识片段
// */
// @GetMapping("/fragment/list/{docId}")
// public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
// bo.setDocId(docId);
// return fragmentService.queryPageList(bo, pageQuery);
// }
//
//}

View File

@@ -1,333 +1,333 @@
package org.ruoyi.system.controller.system;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Event;
import com.stripe.model.Price;
import com.stripe.model.Product;
import com.stripe.model.checkout.Session;
import com.stripe.net.Webhook;
import com.stripe.param.checkout.SessionCreateParams;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.config.PayConfig;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.exception.base.BaseException;
import org.ruoyi.common.core.service.ConfigService;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.oss.core.OssClient;
import org.ruoyi.common.oss.entity.UploadResult;
import org.ruoyi.common.oss.factory.OssFactory;
import org.ruoyi.common.response.PayResponse;
import org.ruoyi.common.service.PayService;
import org.ruoyi.common.utils.MD5Util;
import org.ruoyi.system.domain.bo.PaymentOrdersBo;
import org.ruoyi.system.domain.bo.SysUserBo;
import org.ruoyi.system.domain.request.OrderRequest;
import org.ruoyi.system.domain.vo.PaymentOrdersVo;
import org.ruoyi.system.domain.vo.SysUserVo;
import org.ruoyi.system.service.IPaymentOrdersService;
import org.ruoyi.system.service.ISysUserService;
import org.springframework.web.bind.annotation.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RequiredArgsConstructor
@RestController
@RequestMapping("/pay")
@Slf4j
public class PayController {
private final PayService payService;
private final ISysUserService userService;
private final IPaymentOrdersService paymentOrdersService;
private final PayConfig payConfig;
private final WxPayService wxService;
private final ConfigService configService;
/**
* 获取支付二维码
*
* @Date 2023/7/3
* @return void
**/
@PostMapping("/payUrl")
public R<PaymentOrdersVo> payUrl(@RequestBody OrderRequest orderRequest) {
PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
PaymentOrdersVo paymentOrdersVo = new PaymentOrdersVo();
if(!Boolean.parseBoolean(getKey("enabled"))){
String payUrl = payService.getPayUrl(payOrder.getOrderNo(), orderRequest.getName(), Double.parseDouble(orderRequest.getMoney()), "192.168.1.6");
byte[] bytes = QrCodeUtil.generatePng(payUrl, 300, 300);
OssClient storage = OssFactory.instance();
UploadResult upload=storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
BeanUtil.copyProperties(payOrder,paymentOrdersVo);
paymentOrdersVo.setUrl(upload.getUrl());
}else {
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setTradeType("NATIVE");
request.setBody(orderRequest.getName());
request.setOutTradeNo(payOrder.getOrderNo());
request.setTotalFee(BaseWxPayRequest.yuanToFen(orderRequest.getMoney()));
request.setSpbillCreateIp("127.0.0.1");
request.setNotifyUrl(getKey("notifyUrl"));
request.setProductId(payOrder.getId().toString());
try {
WxPayNativeOrderResult order = wxService.createOrder(request);
byte[] bytes = QrCodeUtil.generatePng(order.getCodeUrl(), 300, 300);
OssClient storage = OssFactory.instance();
UploadResult upload = storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
BeanUtil.copyProperties(payOrder,paymentOrdersVo);
paymentOrdersVo.setUrl(upload.getUrl());
} catch (WxPayException e) {
throw new BaseException("获取微信支付二维码发生错误:{}"+e.getMessage());
}
}
return R.ok(paymentOrdersVo);
}
/**
* 回调通知地址
*
* @Date 2023/7/3
* @param
* @return void
**/
@GetMapping("/notifyUrl")
public String notifyUrl(PayResponse payResponse) {
// 校验签名
String mdString = "money=" + payResponse.getMoney() + "&name=" + payResponse.getName() +
"&out_trade_no=" + payResponse.getOut_trade_no() + "&pid=" + payConfig.getPid() +
"&trade_no=" + payResponse.getTrade_no() + "&trade_status=" + payResponse.getTrade_status() +
"&type=" + payResponse.getType() + payConfig.getKey();
String sign = MD5Util.GetMD5Code(mdString);
if(!sign.equals(payResponse.getSign())){
throw new BaseException("校验签名失败!");
}
double money = Double.parseDouble(payResponse.getMoney());
log.info("支付订单号{}",payResponse);
PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
paymentOrdersBo.setOrderNo(payResponse.getOut_trade_no());
List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
if (CollectionUtil.isEmpty(paymentOrdersList)){
throw new BaseException("订单不存在!");
}
// 订单状态修改为已支付
PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
paymentOrdersVo.setPaymentStatus("2");
paymentOrdersVo.setPaymentMethod(payResponse.getType());
BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
paymentOrdersService.updateByBo(paymentOrdersBo);
SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
sysUserVo.setUserBalance(sysUserVo.getUserBalance() + money);
SysUserBo sysUserBo = new SysUserBo();
BeanUtil.copyProperties(sysUserVo,sysUserBo);
// 设置为付费用户
sysUserBo.setUserGrade("1");
userService.updateUser(sysUserBo);
return "success";
}
/**
* 跳转通知地址
*
* @Date 2023/7/3
* @param
* @return void
**/
@GetMapping("/return_url")
public void returnUrl() {
log.info("return_url===========");
}
@PostMapping("/notify/wxOrder")
public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
// TODO 根据自己业务场景需要构造返回对象
PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
paymentOrdersBo.setOrderNo(notifyResult.getOutTradeNo());
List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
paymentOrdersVo.setPaymentStatus("2");
paymentOrdersVo.setPaymentMethod("wx");
BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
paymentOrdersService.updateByBo(paymentOrdersBo);
SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
sysUserVo.setUserBalance(sysUserVo.getUserBalance() + convertCentsToYuan(notifyResult.getTotalFee()));
SysUserBo sysUserBo = new SysUserBo();
BeanUtil.copyProperties(sysUserVo,sysUserBo);
// 设置为付费用户
sysUserBo.setUserGrade("1");
userService.updateUser(sysUserBo);
return WxPayNotifyResponse.success("success");
}
/**
* 将分转换为元,并保留精度。
*
* @param cents 分的金额类型为Integer
* @return 转换后的元金额类型为double
*/
public static double convertCentsToYuan(Integer cents) {
// 处理空输入
if (cents == null) {
throw new IllegalArgumentException("输入的分金额不能为空");
}
// 100分 = 1元
BigDecimal centsBigDecimal = new BigDecimal(cents);
BigDecimal yuan = centsBigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
// 转换为double并返回
return yuan.doubleValue();
}
/**
* 获取订单信息
*
*/
@PostMapping("/orderInfo")
public R<PaymentOrdersVo> orderInfo(@RequestBody OrderRequest orderRequest) {
if(StringUtils.isEmpty(orderRequest.getOrderNo())){
throw new BaseException("订单号不能为空!");
}
PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
if (CollectionUtil.isEmpty(paymentOrdersList)){
throw new BaseException("订单不存在!");
}
PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
return R.ok(paymentOrdersVo);
}
// 获取支付链接
// static {
// Stripe.apiKey = "sk_test_51PMMj2KcfX4oNioqXkoKpScTsgmR55xQki2tg8MEZJYc0gjhYV85t2FzDasE06eqZb0sqyYhOp3UXhcGGQLWI4A9008aq8SOnb";
//package org.ruoyi.system.controller.system;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.collection.CollectionUtil;
//import cn.hutool.extra.qrcode.QrCodeUtil;
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil;
//import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
//import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
//import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
//import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
//import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
//import com.github.binarywang.wxpay.exception.WxPayException;
//import com.github.binarywang.wxpay.service.WxPayService;
//import com.stripe.Stripe;
//import com.stripe.exception.StripeException;
//import com.stripe.model.Event;
//import com.stripe.model.Price;
//import com.stripe.model.Product;
//import com.stripe.model.checkout.Session;
//import com.stripe.net.Webhook;
//import com.stripe.param.checkout.SessionCreateParams;
//import jakarta.servlet.http.HttpServletRequest;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.ruoyi.common.config.PayConfig;
//import org.ruoyi.common.core.domain.R;
//import org.ruoyi.common.core.exception.base.BaseException;
//import org.ruoyi.common.core.service.ConfigService;
//import org.ruoyi.common.core.utils.StringUtils;
//import org.ruoyi.common.oss.core.OssClient;
//import org.ruoyi.common.oss.entity.UploadResult;
//import org.ruoyi.common.oss.factory.OssFactory;
//import org.ruoyi.common.response.PayResponse;
//import org.ruoyi.common.service.PayService;
//import org.ruoyi.common.utils.MD5Util;
//import org.ruoyi.system.domain.bo.PaymentOrdersBo;
//import org.ruoyi.system.domain.bo.SysUserBo;
//import org.ruoyi.system.domain.request.OrderRequest;
//import org.ruoyi.system.domain.vo.PaymentOrdersVo;
//import org.ruoyi.system.domain.vo.SysUserVo;
//import org.ruoyi.system.service.IPaymentOrdersService;
//import org.ruoyi.system.service.ISysUserService;
//import org.springframework.web.bind.annotation.*;
//
//import java.io.ByteArrayOutputStream;
//import java.io.InputStream;
//import java.math.BigDecimal;
//import java.math.RoundingMode;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//
//@RequiredArgsConstructor
//@RestController
//@RequestMapping("/pay")
//@Slf4j
//public class PayController {
//
// private final PayService payService;
//
// private final ISysUserService userService;
//
// private final IPaymentOrdersService paymentOrdersService;
//
// private final PayConfig payConfig;
//
// private final WxPayService wxService;
//
// private final ConfigService configService;
//
// /**
// * 获取支付二维码
// *
// * @Date 2023/7/3
// * @return void
// **/
// @PostMapping("/payUrl")
// public R<PaymentOrdersVo> payUrl(@RequestBody OrderRequest orderRequest) {
// PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
// PaymentOrdersVo paymentOrdersVo = new PaymentOrdersVo();
// if(!Boolean.parseBoolean(getKey("enabled"))){
// String payUrl = payService.getPayUrl(payOrder.getOrderNo(), orderRequest.getName(), Double.parseDouble(orderRequest.getMoney()), "192.168.1.6");
// byte[] bytes = QrCodeUtil.generatePng(payUrl, 300, 300);
// OssClient storage = OssFactory.instance();
// UploadResult upload=storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
// BeanUtil.copyProperties(payOrder,paymentOrdersVo);
// paymentOrdersVo.setUrl(upload.getUrl());
// }else {
// WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
// request.setTradeType("NATIVE");
// request.setBody(orderRequest.getName());
// request.setOutTradeNo(payOrder.getOrderNo());
// request.setTotalFee(BaseWxPayRequest.yuanToFen(orderRequest.getMoney()));
// request.setSpbillCreateIp("127.0.0.1");
// request.setNotifyUrl(getKey("notifyUrl"));
// request.setProductId(payOrder.getId().toString());
// try {
// WxPayNativeOrderResult order = wxService.createOrder(request);
// byte[] bytes = QrCodeUtil.generatePng(order.getCodeUrl(), 300, 300);
// OssClient storage = OssFactory.instance();
// UploadResult upload = storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
// BeanUtil.copyProperties(payOrder,paymentOrdersVo);
// paymentOrdersVo.setUrl(upload.getUrl());
// } catch (WxPayException e) {
// throw new BaseException("获取微信支付二维码发生错误:{}"+e.getMessage());
// }
// }
// return R.ok(paymentOrdersVo);
// }
/**
* 去支付
* 1、创建产品
* 2、设置价格
* 3、创建支付信息 得到url
* @return
*/
@PostMapping("/stripePay")
public String pay(@RequestBody OrderRequest orderRequest) throws StripeException {
String enabled = configService.getConfigValue("stripe", "enabled");
if(!Boolean.parseBoolean(enabled)){
String prompt = configService.getConfigValue("stripe", "prompt");
throw new BaseException(prompt);
}
// 获取支付链接
Stripe.apiKey = configService.getConfigValue("stripe", "key");
// 获取金额字符串并解析为 double
double moneyDouble = Double.parseDouble(orderRequest.getMoney());
// 将金额转换为以分为单位的整数
int randMoney = (int) (moneyDouble * 100);
Map<String, Object> params = new HashMap<>();
params.put("name", orderRequest.getName());
Product product = Product.create(params);
Map<String, Object> recurring = new HashMap<>();
recurring.put("interval", "month");
Map<String, Object> params2 = new HashMap<>();
params2.put("unit_amount", randMoney);
params2.put("currency", "usd");
params2.put("recurring", recurring);
params2.put("product", product.getId());
Price price = Price.create(params2);
// 创建支付订单
PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
//创建支付信息 得到url
SessionCreateParams params3 = SessionCreateParams.builder()
.setMode(SessionCreateParams.Mode.SUBSCRIPTION)
.setSuccessUrl(configService.getConfigValue("stripe", "success"))
.setCancelUrl(configService.getConfigValue("stripe", "cancel"))
.addLineItem(
SessionCreateParams.LineItem.builder()
.setQuantity(1L)
.setPrice(price.getId())
.build()).putMetadata("orderId", payOrder.getOrderNo())
.build();
Session session = Session.create(params3);
return session.getUrl();
}
/**
* 支付回调
*
*/
@PostMapping("/stripe_events")
public R<String> stripeEvent(HttpServletRequest request) {
try {
String endpointSecret = configService.getConfigValue("stripe", "secret");//webhook秘钥签名
InputStream inputStream = request.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024*4];
int n = 0;
while (-1 != (n = inputStream.read(buffer))) {
output.write(buffer, 0, n);
}
byte[] bytes = output.toByteArray();
String payload = new String(bytes, "UTF-8");
String sigHeader = request.getHeader("Stripe-Signature");
Event event = Webhook.constructEvent(payload, sigHeader, endpointSecret);//验签,并获取事件
if("checkout.session.completed".equals(event.getType())){
// 解析 JSON 字符串为 JSONObject
JSONObject jsonObject = JSONUtil.parseObj(event);
// 获取 metadata 对象
JSONObject metadata = jsonObject.getJSONObject("data")
.getJSONObject("object")
.getJSONObject("metadata");
OrderRequest orderRequest = new OrderRequest();
orderRequest.setPayType("stripe");
orderRequest.setOrderNo(metadata.getStr("orderId"));
paymentOrdersService.updatePayOrder(orderRequest);
}
} catch (Exception e) {
System.out.println("stripe异步通知webhook事件"+e);
}
return R.ok();
}
public String getKey(String key) {
return configService.getConfigValue("weixin", key);
}
}
//
// /**
// * 回调通知地址
// *
// * @Date 2023/7/3
// * @param
// * @return void
// **/
// @GetMapping("/notifyUrl")
// public String notifyUrl(PayResponse payResponse) {
// // 校验签名
// String mdString = "money=" + payResponse.getMoney() + "&name=" + payResponse.getName() +
// "&out_trade_no=" + payResponse.getOut_trade_no() + "&pid=" + payConfig.getPid() +
// "&trade_no=" + payResponse.getTrade_no() + "&trade_status=" + payResponse.getTrade_status() +
// "&type=" + payResponse.getType() + payConfig.getKey();
// String sign = MD5Util.GetMD5Code(mdString);
// if(!sign.equals(payResponse.getSign())){
// throw new BaseException("校验签名失败!");
// }
// double money = Double.parseDouble(payResponse.getMoney());
// log.info("支付订单号{}",payResponse);
// PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
// paymentOrdersBo.setOrderNo(payResponse.getOut_trade_no());
// List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
// if (CollectionUtil.isEmpty(paymentOrdersList)){
// throw new BaseException("订单不存在!");
// }
// // 订单状态修改为已支付
// PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
// paymentOrdersVo.setPaymentStatus("2");
// paymentOrdersVo.setPaymentMethod(payResponse.getType());
// BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
// paymentOrdersService.updateByBo(paymentOrdersBo);
//
// SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
// sysUserVo.setUserBalance(sysUserVo.getUserBalance() + money);
// SysUserBo sysUserBo = new SysUserBo();
// BeanUtil.copyProperties(sysUserVo,sysUserBo);
// // 设置为付费用户
// sysUserBo.setUserGrade("1");
// userService.updateUser(sysUserBo);
// return "success";
// }
//
// /**
// * 跳转通知地址
// *
// * @Date 2023/7/3
// * @param
// * @return void
// **/
// @GetMapping("/return_url")
// public void returnUrl() {
// log.info("return_url===========");
// }
//
//
// @PostMapping("/notify/wxOrder")
// public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
// WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
// // TODO 根据自己业务场景需要构造返回对象
// PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
// paymentOrdersBo.setOrderNo(notifyResult.getOutTradeNo());
// List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
// PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
// paymentOrdersVo.setPaymentStatus("2");
// paymentOrdersVo.setPaymentMethod("wx");
// BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
// paymentOrdersService.updateByBo(paymentOrdersBo);
// SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
// sysUserVo.setUserBalance(sysUserVo.getUserBalance() + convertCentsToYuan(notifyResult.getTotalFee()));
// SysUserBo sysUserBo = new SysUserBo();
// BeanUtil.copyProperties(sysUserVo,sysUserBo);
// // 设置为付费用户
// sysUserBo.setUserGrade("1");
// userService.updateUser(sysUserBo);
// return WxPayNotifyResponse.success("success");
// }
//
// /**
// * 将分转换为元,并保留精度。
// *
// * @param cents 分的金额类型为Integer
// * @return 转换后的元金额类型为double
// */
// public static double convertCentsToYuan(Integer cents) {
// // 处理空输入
// if (cents == null) {
// throw new IllegalArgumentException("输入的分金额不能为空");
// }
//
// // 100分 = 1元
// BigDecimal centsBigDecimal = new BigDecimal(cents);
// BigDecimal yuan = centsBigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
// // 转换为double并返回
// return yuan.doubleValue();
// }
//
// /**
// * 获取订单信息
// *
// */
// @PostMapping("/orderInfo")
// public R<PaymentOrdersVo> orderInfo(@RequestBody OrderRequest orderRequest) {
// if(StringUtils.isEmpty(orderRequest.getOrderNo())){
// throw new BaseException("订单号不能为空!");
// }
// PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
// paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
// List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
// if (CollectionUtil.isEmpty(paymentOrdersList)){
// throw new BaseException("订单不存在!");
// }
// PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
// return R.ok(paymentOrdersVo);
// }
//
// // 获取支付链接
//// static {
//// Stripe.apiKey = "sk_test_51PMMj2KcfX4oNioqXkoKpScTsgmR55xQki2tg8MEZJYc0gjhYV85t2FzDasE06eqZb0sqyYhOp3UXhcGGQLWI4A9008aq8SOnb";
//// }
//
// /**
// * 去支付
// * 1、创建产品
// * 2、设置价格
// * 3、创建支付信息 得到url
// * @return
// */
// @PostMapping("/stripePay")
// public String pay(@RequestBody OrderRequest orderRequest) throws StripeException {
//
// String enabled = configService.getConfigValue("stripe", "enabled");
// if(!Boolean.parseBoolean(enabled)){
// String prompt = configService.getConfigValue("stripe", "prompt");
// throw new BaseException(prompt);
// }
//
// // 获取支付链接
// Stripe.apiKey = configService.getConfigValue("stripe", "key");
//
// // 获取金额字符串并解析为 double
// double moneyDouble = Double.parseDouble(orderRequest.getMoney());
//
// // 将金额转换为以分为单位的整数
// int randMoney = (int) (moneyDouble * 100);
//
// Map<String, Object> params = new HashMap<>();
// params.put("name", orderRequest.getName());
// Product product = Product.create(params);
//
// Map<String, Object> recurring = new HashMap<>();
// recurring.put("interval", "month");
// Map<String, Object> params2 = new HashMap<>();
// params2.put("unit_amount", randMoney);
// params2.put("currency", "usd");
// params2.put("recurring", recurring);
// params2.put("product", product.getId());
// Price price = Price.create(params2);
//
// // 创建支付订单
// PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
//
// //创建支付信息 得到url
// SessionCreateParams params3 = SessionCreateParams.builder()
// .setMode(SessionCreateParams.Mode.SUBSCRIPTION)
// .setSuccessUrl(configService.getConfigValue("stripe", "success"))
// .setCancelUrl(configService.getConfigValue("stripe", "cancel"))
// .addLineItem(
// SessionCreateParams.LineItem.builder()
// .setQuantity(1L)
// .setPrice(price.getId())
// .build()).putMetadata("orderId", payOrder.getOrderNo())
// .build();
// Session session = Session.create(params3);
// return session.getUrl();
// }
//
// /**
// * 支付回调
// *
// */
// @PostMapping("/stripe_events")
// public R<String> stripeEvent(HttpServletRequest request) {
// try {
// String endpointSecret = configService.getConfigValue("stripe", "secret");//webhook秘钥签名
// InputStream inputStream = request.getInputStream();
// ByteArrayOutputStream output = new ByteArrayOutputStream();
// byte[] buffer = new byte[1024*4];
// int n = 0;
// while (-1 != (n = inputStream.read(buffer))) {
// output.write(buffer, 0, n);
// }
// byte[] bytes = output.toByteArray();
// String payload = new String(bytes, "UTF-8");
// String sigHeader = request.getHeader("Stripe-Signature");
// Event event = Webhook.constructEvent(payload, sigHeader, endpointSecret);//验签,并获取事件
// if("checkout.session.completed".equals(event.getType())){
// // 解析 JSON 字符串为 JSONObject
// JSONObject jsonObject = JSONUtil.parseObj(event);
// // 获取 metadata 对象
// JSONObject metadata = jsonObject.getJSONObject("data")
// .getJSONObject("object")
// .getJSONObject("metadata");
//
// OrderRequest orderRequest = new OrderRequest();
// orderRequest.setPayType("stripe");
// orderRequest.setOrderNo(metadata.getStr("orderId"));
// paymentOrdersService.updatePayOrder(orderRequest);
// }
// } catch (Exception e) {
// System.out.println("stripe异步通知webhook事件"+e);
// }
// return R.ok();
// }
//
// public String getKey(String key) {
// return configService.getConfigValue("weixin", key);
// }
//
//}
//

View File

@@ -1,81 +1,81 @@
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.core.exception.ServiceException;
import org.ruoyi.common.wechat.itchat4j.api.WechatTools;
import org.ruoyi.common.wechat.itchat4j.controller.LoginController;
import org.ruoyi.common.wechat.itchat4j.core.MsgCenter;
import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace;
import org.ruoyi.common.wechat.web.base.BaseException;
import org.ruoyi.system.domain.bo.WxRobConfigBo;
import org.ruoyi.system.domain.vo.WxRobConfigVo;
import org.ruoyi.system.handler.MyMsgHandler;
import org.ruoyi.system.service.ISseService;
import org.ruoyi.system.service.IWxRobConfigService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 个人微信扩展控制器
*
* @author WangLe
*/
@SaIgnore
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
public class WeChatController {
private final ISseService sseService;
private final IWxRobConfigService wxRobConfigService;
/**
* 登录第一步,获取二维码链接
* @throws BaseException
*/
@PostMapping("/getQr")
public String getQr(@RequestParam String uniqueKey) {
LoginController login = new LoginController(uniqueKey);
try {
return login.login_1();
} catch (BaseException e) {
throw new ServiceException("获取二维码失败:"+ e.getMessage());
}
}
@PostMapping("/wxLogin")
public Boolean wxLogin(@RequestParam String uniqueKey) {
LoginController login = new LoginController(uniqueKey);
return login.login_2();
}
@PostMapping("/wxInit")
public Boolean wxInit(@RequestParam String uniqueKey) {
LoginController login = new LoginController(uniqueKey);
// 开启消息处理线程
WxRobConfigBo wxRobConfigBo = new WxRobConfigBo();
wxRobConfigBo.setUniqueKey(uniqueKey);
List<WxRobConfigVo> wxRobConfigVos = wxRobConfigService.queryList(wxRobConfigBo);
//查询机器人对应的用户
start(uniqueKey,new MyMsgHandler(uniqueKey,sseService,wxRobConfigVos.get(0)));
return login.login_3();
}
@PostMapping("/wxLogout")
public void wxLogout(@RequestParam String uniqueKey) {
WechatTools.logout(uniqueKey);
}
public void start(String uniqueKey,IMsgHandlerFace msgHandler) {
log.info("7.+++开启消息处理线程["+uniqueKey+"]+++");
new Thread(() -> MsgCenter.handleMsg(uniqueKey,msgHandler)).start();
}
}
//package org.ruoyi.system.controller.system;
//
//import cn.dev33.satoken.annotation.SaIgnore;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.ruoyi.common.core.exception.ServiceException;
//import org.ruoyi.common.wechat.itchat4j.api.WechatTools;
//import org.ruoyi.common.wechat.itchat4j.controller.LoginController;
//import org.ruoyi.common.wechat.itchat4j.core.MsgCenter;
//import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace;
//import org.ruoyi.common.wechat.web.base.BaseException;
//import org.ruoyi.system.domain.bo.WxRobConfigBo;
//import org.ruoyi.system.domain.vo.WxRobConfigVo;
//import org.ruoyi.system.handler.MyMsgHandler;
//import org.ruoyi.system.service.ISseService;
//import org.ruoyi.system.service.IWxRobConfigService;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.List;
//
///**
// * 个人微信扩展控制器
// *
// * @author WangLe
// */
//@SaIgnore
//@Slf4j
//@Validated
//@RequiredArgsConstructor
//@RestController
//public class WeChatController {
//
// private final ISseService sseService;
//
// private final IWxRobConfigService wxRobConfigService;
//
// /**
// * 登录第一步,获取二维码链接
// * @throws BaseException
// */
// @PostMapping("/getQr")
// public String getQr(@RequestParam String uniqueKey) {
// LoginController login = new LoginController(uniqueKey);
// try {
// return login.login_1();
// } catch (BaseException e) {
// throw new ServiceException("获取二维码失败:"+ e.getMessage());
// }
// }
//
// @PostMapping("/wxLogin")
// public Boolean wxLogin(@RequestParam String uniqueKey) {
// LoginController login = new LoginController(uniqueKey);
// return login.login_2();
// }
//
// @PostMapping("/wxInit")
// public Boolean wxInit(@RequestParam String uniqueKey) {
// LoginController login = new LoginController(uniqueKey);
// // 开启消息处理线程
// WxRobConfigBo wxRobConfigBo = new WxRobConfigBo();
// wxRobConfigBo.setUniqueKey(uniqueKey);
// List<WxRobConfigVo> wxRobConfigVos = wxRobConfigService.queryList(wxRobConfigBo);
// //查询机器人对应的用户
// start(uniqueKey,new MyMsgHandler(uniqueKey,sseService,wxRobConfigVos.get(0)));
// return login.login_3();
// }
//
// @PostMapping("/wxLogout")
// public void wxLogout(@RequestParam String uniqueKey) {
// WechatTools.logout(uniqueKey);
// }
//
// public void start(String uniqueKey,IMsgHandlerFace msgHandler) {
// log.info("7.+++开启消息处理线程["+uniqueKey+"]+++");
// new Thread(() -> MsgCenter.handleMsg(uniqueKey,msgHandler)).start();
// }
//}

View File

@@ -19,7 +19,7 @@ import java.util.Map;
@RequiredArgsConstructor
public class MsgHandler extends AbstractHandler {
private final ISseService sseService;
// private final ISseService sseService;
@@ -34,8 +34,10 @@ public class MsgHandler extends AbstractHandler {
if (!msgType.equals(WxConsts.XmlMsgType.EVENT)) {
//TODO 可以选择将消息保存到本地
}
//TODO 组装回复消息
String content = sseService.wxCpChat(wxMessage.getContent());
String content = "";
//sseService.wxCpChat(wxMessage.getContent());
return new TextBuilder().build(content, wxMessage, cpService);

View File

@@ -15,11 +15,8 @@ import org.ruoyi.common.chat.entity.chat.ChatCompletionResponse;
import org.ruoyi.common.chat.utils.TikTokensUtil;
import org.ruoyi.common.core.utils.SpringUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.bo.SysModelBo;
import org.ruoyi.system.domain.vo.SysModelVo;
import org.ruoyi.system.service.IChatCostService;
import org.ruoyi.system.service.IChatMessageService;
import org.ruoyi.system.service.ISysModelService;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatAppStore;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
/**
* 应用市场Mapper接口

View File

@@ -1,7 +1,5 @@
package org.ruoyi.system.mapper;
import org.ruoyi.system.domain.ChatConfig;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
/**

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatGpts;
import org.ruoyi.system.domain.vo.ChatGptsVo;
/**
* gpts管理Mapper接口

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatMessage;
import org.ruoyi.system.domain.vo.ChatMessageVo;
/**

View File

@@ -1,7 +1,5 @@
package org.ruoyi.system.mapper;
import org.ruoyi.system.domain.ChatPlugin;
import org.ruoyi.system.domain.vo.ChatPluginVo;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
/**

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatToken;
import org.ruoyi.system.domain.vo.ChatTokenVo;
/**

View File

@@ -1,7 +1,5 @@
package org.ruoyi.system.mapper;
import org.ruoyi.system.domain.ChatVisitorUsage;
import org.ruoyi.system.domain.vo.ChatVisitorUsageVo;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
/**

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatVoucher;
import org.ruoyi.system.domain.vo.ChatVoucherVo;
/**
* 用户兑换记录Mapper接口

View File

@@ -1,259 +0,0 @@
package org.ruoyi.system.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.ruoyi.common.core.domain.model.LoginUser;
import org.ruoyi.common.core.exception.base.BaseException;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.system.domain.ChatAppStore;
import org.ruoyi.system.domain.bo.ChatAppStoreBo;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
import org.ruoyi.system.mapper.ChatAppStoreMapper;
import org.ruoyi.system.request.RoleListDto;
import org.ruoyi.system.request.RoleRequest;
import org.ruoyi.system.request.SimpleGenerateRequest;
import org.ruoyi.system.response.RoleResponse;
import org.ruoyi.system.response.SimpleGenerateDataResponse;
import org.ruoyi.system.response.SimpleGenerateResponse;
import org.ruoyi.system.response.rolelist.ContentResponse;
import org.ruoyi.system.response.rolelist.RoleListResponse;
import org.ruoyi.system.response.rolelist.ChatAppStoreVO;
import org.ruoyi.system.service.IChatCostService;
import org.ruoyi.system.service.IChatAppStoreService;
import org.ruoyi.system.util.AudioOkHttpUtil;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.*;
/**
* 应用市场Service业务层处理
*
* @author Lion Li
* @date 2024-03-19
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class ChatAppStoreImpl implements IChatAppStoreService {
private final ChatAppStoreMapper baseMapper;
private final IChatCostService chatService;
private final AudioOkHttpUtil audioOkHttpUtil;
/**
* 查询应用市场
*/
@Override
public ChatAppStoreVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询应用市场列表
*/
@Override
public TableDataInfo<ChatAppStoreVo> queryPageList(ChatAppStoreBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatAppStore> lqw = buildQueryWrapper(bo);
Page<ChatAppStoreVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询应用市场列表
*/
@Override
public List<ChatAppStoreVo> queryList(ChatAppStoreBo bo) {
LambdaQueryWrapper<ChatAppStore> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatAppStore> buildQueryWrapper(ChatAppStoreBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatAppStore> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getName()), ChatAppStore::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getDescription()), ChatAppStore::getDescription, bo.getDescription());
lqw.eq(StringUtils.isNotBlank(bo.getAvatar()), ChatAppStore::getAvatar, bo.getAvatar());
lqw.eq(bo.getCreateBy()!=null, ChatAppStore::getCreateBy, bo.getCreateBy());
return lqw;
}
/**
* 新增应用市场
*/
@Override
public Boolean insertByBo(RoleRequest roleRequest) {
try {
String prompt = convertFileToBase64(roleRequest.getPrompt());
roleRequest.setPrompt("data:audio/x-m4a;base64," + prompt);
String avatar = convertFileToBase64(roleRequest.getAvatar());
roleRequest.setAvatar("data:image/png;base64," + avatar);
} catch (IOException e) {
log.error("转换base64出现错误{}", e.getMessage());
}
// 创建一个Request对象来配置你的请求
String json = JSONUtil.toJsonStr(roleRequest);
Request postRequest = audioOkHttpUtil.createPostRequest("api/tts/voice", json);
String body = audioOkHttpUtil.executeRequest(postRequest);
RoleResponse bean = JSONUtil.toBean(body, RoleResponse.class);
ChatAppStore addVoiceRole = new ChatAppStore();
addVoiceRole.setName(roleRequest.getName());
addVoiceRole.setDescription(roleRequest.getDescription());
addVoiceRole.setAvatar(bean.getData().getMetadata().getAvatar());
return baseMapper.insert(addVoiceRole) > 0;
}
private static String convertFileToBase64(String fileUrl) throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(fileUrl).build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Failed to download file: " + response);
byte[] fileData = response.body().bytes();
return Base64.getEncoder().encodeToString(fileData);
}
/**
* 修改应用市场
*/
@Override
public Boolean updateByBo(ChatAppStoreBo bo) {
ChatAppStore update = MapstructUtils.convert(bo, ChatAppStore.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatAppStore entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除应用市场
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 实时生成语音
*
* @param simpleGenerateRequest 生成语音对象
* @return 生成的语音信息
*/
@Override
public SimpleGenerateDataResponse simpleGenerate(SimpleGenerateRequest simpleGenerateRequest) {
double charge = calculateCharge(simpleGenerateRequest.getText());
// 扣除费用并且保存消息记录
chatService.taskDeduct(simpleGenerateRequest.getModel(), simpleGenerateRequest.getText(), charge);
// 创建一个Request对象来配置你的请求
String json = JSONUtil.toJsonStr(simpleGenerateRequest);
Request postRequest = audioOkHttpUtil.createPostRequest("api/tts/simple-generate", json);
String body = audioOkHttpUtil.executeRequest(postRequest);
SimpleGenerateResponse bean = JSONUtil.toBean(body, SimpleGenerateResponse.class);
return bean.getData();
}
/**
* 查询市场角色
*
* @return 角色列表
*/
@Override
public List<ChatAppStoreVO> roleList() {
Request postRequest = audioOkHttpUtil.createGetRequest("api/tts/voice");
String body = audioOkHttpUtil.executeRequest(postRequest);
RoleListResponse bean = JSONUtil.toBean(body, RoleListResponse.class);
List<ChatAppStoreVO> roleList = new ArrayList<>();
for (ContentResponse element : bean.getData()) {
String name = element.getName();
String description = element.getMetadata().getDescription();
String voicesId = element.getId();
String avatar = element.getMetadata().getAvatar();
String previewAudio;
if (element.getMetadata().getPrompts() == null) {
// 从JSON中解析出的数据没有prompts
previewAudio = element.getMetadata().getPreviewAudio();
} else {
previewAudio = element.getMetadata().getPrompts().get(0).getPromptOriginAudioStorageUrl();
}
//roleList.add(new ChatAppStoreVO());
}
return roleList;
}
/**
* 收藏市场角色
*/
@Override
public void copyRole(RoleListDto roleListDto) {
// 保存至数据库
ChatAppStore voiceRole = new ChatAppStore();
voiceRole.setName(roleListDto.getName());
voiceRole.setDescription(roleListDto.getDescription());
voiceRole.setAvatar(roleListDto.getAvatar());
baseMapper.insert(voiceRole);
}
/**
* 根据文本长度计算扣除的金额。
*
* @param text 输入的文本
* @return 扣除的金额
*/
public static double calculateCharge(String text) {
if (text == null || text.isEmpty()) {
return 0.0;
}
int length = text.length();
double charge = 0.0;
while (length > 0) {
if (length >= 500) {
// 对于每500个字符扣除0.5元
charge += (length / 500) * 0.5;
length %= 500; // 处理剩余字符
} else if (length >= 100) {
// 对于100到499个字符扣除0.2元
charge += 0.2;
break; // 处理完毕,退出循环
} else {
// 对于少于100个字符扣除0.1元
charge += 0.1;
break; // 处理完毕,退出循环
}
}
return charge;
}
public Long getUserId() {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new BaseException("用户未登录!");
}
return loginUser.getUserId();
}
}

View File

@@ -1,159 +0,0 @@
package org.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.core.event.ConfigChangeEvent;
import org.ruoyi.common.core.service.ConfigService;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.system.domain.ChatConfig;
import org.ruoyi.system.domain.bo.ChatConfigBo;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import org.ruoyi.system.mapper.ChatConfigMapper;
import org.ruoyi.system.service.IChatConfigService;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
/**
* 对话配置信息
Service业务层处理
*
* @author Lion Li
* @date 2024-04-13
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class ChatConfigServiceImpl implements IChatConfigService, ConfigService {
private final ChatConfigMapper baseMapper;
private final ApplicationEventPublisher eventPublisher;
/**
* 查询对话配置信息
*/
@Override
public ChatConfigVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询对话配置信息列表
*/
@Override
public TableDataInfo<ChatConfigVo> queryPageList(ChatConfigBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatConfig> lqw = buildQueryWrapper(bo);
Page<ChatConfigVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询对话配置信息列表
*/
@Override
public List<ChatConfigVo> queryList(ChatConfigBo bo) {
LambdaQueryWrapper<ChatConfig> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatConfig> buildQueryWrapper(ChatConfigBo bo) {
LambdaQueryWrapper<ChatConfig> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getCategory()), ChatConfig::getCategory, bo.getCategory());
lqw.like(StringUtils.isNotBlank(bo.getConfigName()), ChatConfig::getConfigName, bo.getConfigName());
lqw.eq(StringUtils.isNotBlank(bo.getConfigValue()), ChatConfig::getConfigValue, bo.getConfigValue());
return lqw;
}
/**
* 新增对话配置信息
*/
@Override
public Boolean insertByBo(ChatConfigBo bo) {
ChatConfig add = MapstructUtils.convert(bo, ChatConfig.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改对话配置信息
*/
@Override
public Boolean updateByBo(ChatConfigBo bo) {
ChatConfig update = MapstructUtils.convert(bo, ChatConfig.class);
validEntityBeforeSave(update);
// 更新配置信息(类型区分)
eventPublisher.publishEvent(new ConfigChangeEvent(this));
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatConfig entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除对话配置信息
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 根据配置类型和配置key获取值
*
* @param category
* @param configKey
* @return
*/
@Override
public String getConfigValue(String category,String configKey) {
ChatConfigBo bo = new ChatConfigBo();
bo.setCategory(category);
bo.setConfigName(configKey);
LambdaQueryWrapper<ChatConfig> lqw = buildQueryWrapper(bo);
ChatConfigVo chatConfigVo = baseMapper.selectVoOne(lqw);
if(chatConfigVo != null){
return chatConfigVo.getConfigValue();
}else {
return "";
}
}
/**
* 根据配置类型和配置key获取值
*
* @param category
* @return
*/
@Override
public List<ChatConfigVo> getSysConfigValue(String category) {
ChatConfigBo bo = new ChatConfigBo();
bo.setCategory(category);
LambdaQueryWrapper<ChatConfig> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
}

View File

@@ -1,161 +0,0 @@
package org.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.core.domain.model.LoginUser;
import org.ruoyi.common.core.exception.ServiceException;
import org.ruoyi.common.core.exception.base.BaseException;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.system.domain.ChatToken;
import org.ruoyi.system.domain.SysUser;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.bo.SysModelBo;
import org.ruoyi.system.domain.vo.SysModelVo;
import org.ruoyi.system.mapper.SysUserMapper;
import org.ruoyi.system.service.IChatCostService;
import org.ruoyi.system.service.IChatMessageService;
import org.ruoyi.system.service.IChatTokenService;
import org.ruoyi.system.service.ISysModelService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author hncboy
* @date 2023/3/22 19:41
* 聊天相关业务实现类
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class ChatCostServiceImpl implements IChatCostService {
private final SysUserMapper sysUserMapper;
private final IChatMessageService chatMessageService;
private final IChatTokenService chatTokenService;
private final ISysModelService sysModelService;
/**
* 根据消耗的tokens扣除余额
*
* @param chatMessageBo
*/
public void deductToken(ChatMessageBo chatMessageBo) {
// 计算总token数
ChatToken chatToken = chatTokenService.queryByUserId(chatMessageBo.getUserId(), chatMessageBo.getModelName());
if (chatToken == null) {
chatToken = new ChatToken();
chatToken.setToken(0);
}
int totalTokens = chatToken.getToken() + chatMessageBo.getTotalTokens();
// 如果总token数大于等于1000,进行费用扣除
if (totalTokens >= 1000) {
// 计算费用
int token1 = totalTokens / 1000;
int token2 = totalTokens % 1000;
if (token2 > 0) {
// 保存剩余tokens
chatToken.setModelName(chatMessageBo.getModelName());
chatToken.setUserId(chatMessageBo.getUserId());
chatToken.setToken(token2);
chatTokenService.editToken(chatToken);
} else {
chatTokenService.resetToken(chatMessageBo.getUserId(), chatMessageBo.getModelName());
}
// 扣除用户余额
SysModelBo sysModelBo = new SysModelBo();
sysModelBo.setModelName(chatMessageBo.getModelName());
List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
double modelPrice = sysModelList.get(0).getModelPrice();
Double numberCost = token1 * modelPrice;
deductUserBalance(chatMessageBo.getUserId(), numberCost);
chatMessageBo.setDeductCost(numberCost);
} else {
// 扣除用户余额
deductUserBalance(chatMessageBo.getUserId(), 0.0);
chatMessageBo.setDeductCost(0d);
chatMessageBo.setRemark("不满1kToken,计入下一次!");
chatToken.setToken(totalTokens);
chatToken.setModelName(chatMessageBo.getModelName());
chatToken.setUserId(chatMessageBo.getUserId());
chatTokenService.editToken(chatToken);
}
// 保存消息记录
chatMessageService.insertByBo(chatMessageBo);
}
/**
* 从用户余额中扣除费用
*
* @param userId 用户ID
* @param numberCost 要扣除的费用
*/
@Override
public void deductUserBalance(Long userId, Double numberCost) {
SysUser sysUser = sysUserMapper.selectById(userId);
if (sysUser == null) {
return;
}
Double userBalance = sysUser.getUserBalance();
if (userBalance < numberCost || userBalance == 0) {
throw new ServiceException("余额不足, 请充值");
}
sysUserMapper.update(null,
new LambdaUpdateWrapper<SysUser>()
.set(SysUser::getUserBalance, Math.max(userBalance - numberCost, 0))
.eq(SysUser::getUserId, userId));
}
/**
* 扣除任务费用
*
*/
@Override
public void taskDeduct(String type,String prompt, double cost) {
// 判断用户是否付费
checkUserGrade();
// 扣除费用
deductUserBalance(getUserId(), cost);
// 保存消息记录
ChatMessageBo chatMessageBo = new ChatMessageBo();
chatMessageBo.setUserId(getUserId());
chatMessageBo.setModelName(type);
chatMessageBo.setContent(prompt);
chatMessageBo.setDeductCost(cost);
chatMessageBo.setTotalTokens(0);
chatMessageService.insertByBo(chatMessageBo);
}
/**
* 判断用户是否付费
*/
@Override
public void checkUserGrade() {
SysUser sysUser = sysUserMapper.selectById(getUserId());
if("0".equals(sysUser.getUserGrade())){
throw new BaseException("This model is currently unavailable for free users. Please make any amount of deposit to access.");
}
}
/**
* 获取用户Id
*
* @return
*/
public Long getUserId() {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new BaseException("用户未登录!");
}
return loginUser.getUserId();
}
}

View File

@@ -1,118 +0,0 @@
package org.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.system.domain.ChatGpts;
import org.ruoyi.system.domain.bo.ChatGptsBo;
import org.ruoyi.system.domain.vo.ChatGptsVo;
import org.ruoyi.system.mapper.ChatGptsMapper;
import org.ruoyi.system.service.IChatGptsService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* gpts管理Service业务层处理
*
* @author Lion Li
* @date 2024-07-09
*/
@RequiredArgsConstructor
@Service
public class ChatGptsServiceImpl implements IChatGptsService {
private final ChatGptsMapper baseMapper;
/**
* 查询gpts管理
*/
@Override
public ChatGptsVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询gpts管理列表
*/
@Override
public TableDataInfo<ChatGptsVo> queryPageList(ChatGptsBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatGpts> lqw = buildQueryWrapper(bo);
Page<ChatGptsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询gpts管理列表
*/
@Override
public List<ChatGptsVo> queryList(ChatGptsBo bo) {
LambdaQueryWrapper<ChatGpts> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatGpts> buildQueryWrapper(ChatGptsBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatGpts> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getGid()), ChatGpts::getGid, bo.getGid());
lqw.like(StringUtils.isNotBlank(bo.getName()), ChatGpts::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getLogo()), ChatGpts::getLogo, bo.getLogo());
lqw.eq(StringUtils.isNotBlank(bo.getInfo()), ChatGpts::getInfo, bo.getInfo());
lqw.eq(StringUtils.isNotBlank(bo.getAuthorId()), ChatGpts::getAuthorId, bo.getAuthorId());
lqw.like(StringUtils.isNotBlank(bo.getAuthorName()), ChatGpts::getAuthorName, bo.getAuthorName());
lqw.eq(StringUtils.isNotBlank(bo.getUseCnt()), ChatGpts::getUseCnt, bo.getUseCnt());
lqw.eq(StringUtils.isNotBlank(bo.getBad()), ChatGpts::getBad, bo.getBad());
lqw.eq(StringUtils.isNotBlank(bo.getType()), ChatGpts::getType, bo.getType());
lqw.eq(StringUtils.isNotBlank(bo.getUpdateIp()), ChatGpts::getUpdateIp, bo.getUpdateIp());
return lqw;
}
/**
* 新增gpts管理
*/
@Override
public Boolean insertByBo(ChatGptsBo bo) {
ChatGpts add = MapstructUtils.convert(bo, ChatGpts.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改gpts管理
*/
@Override
public Boolean updateByBo(ChatGptsBo bo) {
ChatGpts update = MapstructUtils.convert(bo, ChatGpts.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatGpts entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除gpts管理
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -1,144 +0,0 @@
package org.ruoyi.system.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.system.domain.ChatMessage;
import org.ruoyi.system.domain.SysUser;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.vo.ChatMessageVo;
import org.ruoyi.system.domain.vo.SysUserVo;
import org.ruoyi.system.mapper.ChatMessageMapper;
import org.ruoyi.system.mapper.SysUserMapper;
import org.ruoyi.system.service.IChatMessageService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 聊天消息Service业务层处理
*
* @author Lion Li
* @date 2023-11-26
*/
@RequiredArgsConstructor
@Service
public class ChatMessageServiceImpl implements IChatMessageService {
private final ChatMessageMapper baseMapper;
private final SysUserMapper sysUserMapper;
/**
* 查询聊天消息
*/
@Override
public ChatMessageVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询聊天消息列表
*/
@Override
public TableDataInfo<ChatMessageVo> queryPageList(ChatMessageBo bo, PageQuery pageQuery) {
// 根据用户名称查询用户
if(StringUtils.isNotEmpty(bo.getUserName())){
SysUserVo sysUserVo = sysUserMapper.selectUserByUserName(bo.getUserName());
bo.setUserId(sysUserVo.getUserId());
}
LambdaQueryWrapper<ChatMessage> lqw = buildQueryWrapper(bo);
Page<ChatMessageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if(CollectionUtil.isEmpty(result.getRecords())){
return TableDataInfo.build(result);
}
List<Long> userIds = result.getRecords().stream()
.map(ChatMessageVo::getUserId)
.collect(Collectors.toList());
// 一次性查询所有userName
Map<Long, String> userIdToUserNameMap = getUserNamesByUserIds(userIds);
// 设置userName
result.getRecords().forEach(chatMessageVo -> {
chatMessageVo.setUserName(userIdToUserNameMap.get(chatMessageVo.getUserId()));
});
return TableDataInfo.build(result);
}
private Map<Long, String> getUserNamesByUserIds(List<Long> userIds) {
// 实现批量查询userName的逻辑例如通过sysUserMapper查询sys_user表
List<SysUser> sysUsers = sysUserMapper.selectBatchIds(userIds);
return sysUsers.stream()
.collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName));
}
/**
* 查询聊天消息列表
*/
@Override
public List<ChatMessageVo> queryList(ChatMessageBo bo) {
LambdaQueryWrapper<ChatMessage> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatMessage> buildQueryWrapper(ChatMessageBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatMessage> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, ChatMessage::getUserId, bo.getUserId());
lqw.eq(StringUtils.isNotBlank(bo.getContent()), ChatMessage::getContent, bo.getContent());
lqw.eq(bo.getDeductCost() != null, ChatMessage::getDeductCost, bo.getDeductCost());
lqw.eq(bo.getTotalTokens() != null, ChatMessage::getTotalTokens, bo.getTotalTokens());
lqw.like(StringUtils.isNotBlank(bo.getModelName()), ChatMessage::getModelName, bo.getModelName());
return lqw;
}
/**
* 新增聊天消息
*/
@Override
public Boolean insertByBo(ChatMessageBo bo) {
ChatMessage add = MapstructUtils.convert(bo, ChatMessage.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改聊天消息
*/
@Override
public Boolean updateByBo(ChatMessageBo bo) {
ChatMessage update = MapstructUtils.convert(bo, ChatMessage.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatMessage entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除聊天消息
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -1,110 +0,0 @@
package org.ruoyi.system.service.impl;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.ruoyi.system.domain.bo.ChatPluginBo;
import org.ruoyi.system.domain.vo.ChatPluginVo;
import org.ruoyi.system.domain.ChatPlugin;
import org.ruoyi.system.mapper.ChatPluginMapper;
import org.ruoyi.system.service.IChatPluginService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 插件管理Service业务层处理
*
* @author ageerle
* @date 2025-03-30
*/
@RequiredArgsConstructor
@Service
public class ChatPluginServiceImpl implements IChatPluginService {
private final ChatPluginMapper baseMapper;
/**
* 查询插件管理
*/
@Override
public ChatPluginVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询插件管理列表
*/
@Override
public TableDataInfo<ChatPluginVo> queryPageList(ChatPluginBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatPlugin> lqw = buildQueryWrapper(bo);
Page<ChatPluginVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询插件管理列表
*/
@Override
public List<ChatPluginVo> queryList(ChatPluginBo bo) {
LambdaQueryWrapper<ChatPlugin> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatPlugin> buildQueryWrapper(ChatPluginBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatPlugin> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getName()), ChatPlugin::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getCode()), ChatPlugin::getCode, bo.getCode());
return lqw;
}
/**
* 新增插件管理
*/
@Override
public Boolean insertByBo(ChatPluginBo bo) {
ChatPlugin add = MapstructUtils.convert(bo, ChatPlugin.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改插件管理
*/
@Override
public Boolean updateByBo(ChatPluginBo bo) {
ChatPlugin update = MapstructUtils.convert(bo, ChatPlugin.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatPlugin entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除插件管理
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -1,55 +0,0 @@
package org.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.ruoyi.system.domain.ChatToken;
import org.ruoyi.system.mapper.ChatTokenMapper;
import org.ruoyi.system.service.IChatTokenService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* 聊天消息Service业务层处理
*
* @author Lion Li
* @date 2023-11-26
*/
@RequiredArgsConstructor
@Service
public class ChatTokenServiceImpl implements IChatTokenService {
private final ChatTokenMapper baseMapper;
@Override
public ChatToken queryByUserId(Long userId,String modelName) {
return baseMapper.selectOne(
new LambdaQueryWrapper<ChatToken>()
.eq(ChatToken::getUserId, userId)
.eq(ChatToken::getModelName, modelName)
.last("limit 1")
);
}
/**
* 清空用户token
*
*/
@Override
public void resetToken(Long userId,String modelName) {
ChatToken chatToken = queryByUserId(userId, modelName);
chatToken.setToken(0);
baseMapper.updateById(chatToken);
}
/**
* 增加用户token
*
*/
@Override
public void editToken(ChatToken chatToken) {
if(chatToken.getId() == null){
baseMapper.insert(chatToken);
}else {
baseMapper.updateById(chatToken);
}
}
}

View File

@@ -1,112 +0,0 @@
package org.ruoyi.system.service.impl;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.ruoyi.system.domain.bo.ChatVisitorUsageBo;
import org.ruoyi.system.domain.vo.ChatVisitorUsageVo;
import org.ruoyi.system.domain.ChatVisitorUsage;
import org.ruoyi.system.mapper.ChatVisitorUsageMapper;
import org.ruoyi.system.service.IChatVisitorUsageService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 访客管理Service业务层处理
*
* @author Lion Li
* @date 2024-07-14
*/
@RequiredArgsConstructor
@Service
public class ChatVisitorUsageServiceImpl implements IChatVisitorUsageService {
private final ChatVisitorUsageMapper baseMapper;
/**
* 查询访客管理
*/
@Override
public ChatVisitorUsageVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询访客管理列表
*/
@Override
public TableDataInfo<ChatVisitorUsageVo> queryPageList(ChatVisitorUsageBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatVisitorUsage> lqw = buildQueryWrapper(bo);
Page<ChatVisitorUsageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询访客管理列表
*/
@Override
public List<ChatVisitorUsageVo> queryList(ChatVisitorUsageBo bo) {
LambdaQueryWrapper<ChatVisitorUsage> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatVisitorUsage> buildQueryWrapper(ChatVisitorUsageBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatVisitorUsage> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getFingerprint()), ChatVisitorUsage::getFingerprint, bo.getFingerprint());
lqw.eq(StringUtils.isNotBlank(bo.getUsageCount()), ChatVisitorUsage::getUsageCount, bo.getUsageCount());
lqw.eq(StringUtils.isNotBlank(bo.getIpAddress()), ChatVisitorUsage::getIpAddress, bo.getIpAddress());
lqw.eq(StringUtils.isNotBlank(bo.getUpdateIp()), ChatVisitorUsage::getUpdateIp, bo.getUpdateIp());
return lqw;
}
/**
* 新增访客管理
*/
@Override
public Boolean insertByBo(ChatVisitorUsageBo bo) {
ChatVisitorUsage add = MapstructUtils.convert(bo, ChatVisitorUsage.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改访客管理
*/
@Override
public Boolean updateByBo(ChatVisitorUsageBo bo) {
ChatVisitorUsage update = MapstructUtils.convert(bo, ChatVisitorUsage.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatVisitorUsage entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除访客管理
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -1,180 +0,0 @@
package org.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.system.domain.SysUser;
import org.ruoyi.system.domain.bo.SysUserBo;
import org.ruoyi.system.domain.vo.SysUserVo;
import org.ruoyi.system.mapper.SysUserMapper;
import org.ruoyi.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.ruoyi.system.domain.bo.ChatVoucherBo;
import org.ruoyi.system.domain.vo.ChatVoucherVo;
import org.ruoyi.system.domain.ChatVoucher;
import org.ruoyi.system.mapper.ChatVoucherMapper;
import org.ruoyi.system.service.IChatVoucherService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 用户兑换记录Service业务层处理
*
* @author Lion Li
* @date 2024-05-03
*/
@RequiredArgsConstructor
@Service
public class ChatVoucherServiceImpl implements IChatVoucherService {
private final ChatVoucherMapper baseMapper;
private final ISysUserService sysUserService;
private final SysUserMapper sysUserMapper;
/**
* 查询用户兑换记录
*/
@Override
public ChatVoucherVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询用户兑换记录列表
*/
@Override
public TableDataInfo<ChatVoucherVo> queryPageList(ChatVoucherBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatVoucher> lqw = buildQueryWrapper(bo);
Page<ChatVoucherVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if(CollectionUtil.isEmpty(result.getRecords())){
return TableDataInfo.build(result);
}
// 获取所有userId
List<Long> userIds = result.getRecords().stream()
.map(ChatVoucherVo::getUserId)
.collect(Collectors.toList());
// 一次性查询所有userName
Map<Long, String> userIdToUserNameMap = getUserNamesByUserIds(userIds);
// 设置userName
result.getRecords().forEach(chatVoucherVo -> {
chatVoucherVo.setUserName(userIdToUserNameMap.get(chatVoucherVo.getUserId()));
});
return TableDataInfo.build(result);
}
private Map<Long, String> getUserNamesByUserIds(List<Long> userIds) {
// 实现批量查询userName的逻辑例如通过sysUserMapper查询sys_user表
List<SysUser> sysUsers = sysUserMapper.selectBatchIds(userIds);
return sysUsers.stream()
.collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName));
}
/**
* 查询用户兑换记录列表
*/
@Override
public List<ChatVoucherVo> queryList(ChatVoucherBo bo) {
LambdaQueryWrapper<ChatVoucher> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatVoucher> buildQueryWrapper(ChatVoucherBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatVoucher> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, ChatVoucher::getUserId, bo.getUserId());
lqw.eq(StringUtils.isNotBlank(bo.getCode()), ChatVoucher::getCode, bo.getCode());
lqw.eq(bo.getAmount() != null, ChatVoucher::getAmount, bo.getAmount());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ChatVoucher::getStatus, bo.getStatus());
return lqw;
}
/**
* 新增用户兑换记录
*/
@Override
public Boolean insertByBo(ChatVoucherBo bo) {
ChatVoucher add = MapstructUtils.convert(bo, ChatVoucher.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改用户兑换记录
*/
@Override
public Boolean updateByBo(ChatVoucherBo bo) {
ChatVoucher update = MapstructUtils.convert(bo, ChatVoucher.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatVoucher entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除用户兑换记录
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 兑换卡密
*
* @param bo 卡密信息
*/
@Override
public Boolean redeem(ChatVoucherBo bo) {
LambdaQueryWrapper<ChatVoucher> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getCode()), ChatVoucher::getCode, bo.getCode());
ChatVoucherVo chatVoucherVo = baseMapper.selectVoOne(lqw);
if(chatVoucherVo != null){
// 如果卡密已经兑换
if("2".equals(chatVoucherVo.getStatus())){
return false;
}
SysUserVo sysUserVo = sysUserService.selectUserById(LoginHelper.getLoginUser().getUserId());
// 更新卡密记录
chatVoucherVo.setUserId(LoginHelper.getLoginUser().getUserId());
chatVoucherVo.setStatus("2");
chatVoucherVo.setBalanceBefore(sysUserVo.getUserBalance());
chatVoucherVo.setBalanceAfter(sysUserVo.getUserBalance()+chatVoucherVo.getAmount());
// 添加用户余额
sysUserVo.setUserBalance(sysUserVo.getUserBalance() + chatVoucherVo.getAmount());
SysUserBo user = new SysUserBo();
BeanUtil.copyProperties(sysUserVo,user);
sysUserService.updateUser(user);
ChatVoucher update = MapstructUtils.convert(chatVoucherVo, ChatVoucher.class);
baseMapper.updateById(update);
}else {
return false;
}
return true;
}
}

View File

@@ -24,7 +24,6 @@ import org.ruoyi.system.domain.model.ApiResult;
import org.ruoyi.system.domain.vo.cover.*;
import org.ruoyi.system.mapper.CoverMapper;
import org.ruoyi.system.mapper.CoverPromptAudioMapper;
import org.ruoyi.system.service.IChatCostService;
import org.ruoyi.system.service.ICoverService;
import org.ruoyi.system.util.WeChatScanHttpUtil;
import org.springframework.stereotype.Service;

View File

@@ -9,13 +9,11 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import org.ruoyi.common.core.constant.Constants;
import org.ruoyi.common.core.domain.model.LoginUser;
import org.ruoyi.common.core.exception.base.BaseException;
import org.ruoyi.common.core.service.ConfigService;
import org.ruoyi.common.redis.utils.RedisUtils;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.system.cofing.OkHttpConfig;
import org.ruoyi.system.domain.vo.ppt.*;
import org.ruoyi.system.service.IChatCostService;
import org.ruoyi.system.service.IPptService;
import org.ruoyi.system.util.HttpUtils;
import org.ruoyi.system.util.WddPptApi;
@@ -26,8 +24,6 @@ import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.time.Duration;
import static org.ruoyi.common.satoken.utils.LoginHelper.getLoginUser;
/**
* AI-PPTService业务层处理
*

View File

@@ -42,9 +42,7 @@ import org.ruoyi.common.core.utils.file.FileUtils;
import org.ruoyi.common.core.utils.file.MimeTypeUtils;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.system.domain.SysModel;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.request.translation.TranslationRequest;
import org.ruoyi.system.domain.vo.ChatGptsVo;
import org.ruoyi.system.listener.SSEEventSourceListener;
import org.ruoyi.system.service.*;
import org.springframework.core.io.InputStreamResource;
@@ -78,8 +76,7 @@ public class SseServiceImpl implements ISseService {
private OpenAiStreamClient openAiStreamClient;
private final ChatConfig chatConfig;
ChatConfig chatConfig;
private final IChatCostService chatService;

Some files were not shown because too many files have changed in this diff Show More