Merge branch 'v3.0.0' into main

合并 v3.0.0 分支到 main,包含以下主要更新:
- 重构聊天模块架构,引入Handler模式
- 添加 Docker 部署支持
- 恢复 MCP 模块功能
- 工作流与大模型聊天对话整合
- 多项 bug 修复和文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ageerle
2026-03-21 12:15:40 +08:00
1570 changed files with 51500 additions and 77494 deletions

View File

@@ -1,86 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>
<artifactId>ruoyi-ai</artifactId>
<groupId>org.ruoyi</groupId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>ruoyi-modules-api</artifactId>
<packaging>pom</packaging>
<modules>
<module>ruoyi-chat-api</module>
<module>ruoyi-knowledge-api</module>
<module>ruoyi-system-api</module>
<module>ruoyi-workflow-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>
<!-- 租户基础模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-tenant</artifactId>
</dependency>
<!-- 字段翻译基础模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-translation</artifactId>
</dependency>
<!-- 系统日志模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<!-- 对象存储模块 -->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-oss</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,144 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
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>${revision}</version>
<relativePath>../pom.xml</relativePath>
</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>
<spring-ai.version>1.0.0-M7</spring-ai.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 对话基础模块 -->
<dependencies>
<!-- <dependency>-->
<!-- <groupId>io.modelcontextprotocol.sdk</groupId>-->
<!-- <artifactId>mcp-spring-webflux</artifactId>-->
<!-- <version>0.8.0</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.ruoyi</groupId>
<artifactId>ruoyi-common-chat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>io.github.imfangs</groupId>
<artifactId>dify-java-client</artifactId>
<version>1.0.7</version>
</dependency>
<dependency>
<groupId>com.coze</groupId>
<artifactId>coze-api</artifactId>
<version>0.3.1</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-http-client-jdk</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-zhipu-ai</artifactId>
<version>1.0.1-beta6</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope</artifactId>
<version>1.0.1-beta6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.12.6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.12.6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.12.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,78 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 聊天消息对象 chat_message
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_message")
public class ChatMessage extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 会话id
*/
private Long sessionId;
/**
* 消息内容
*/
private String content;
/**
* 对话角色
*/
private String role;
/**
* 扣除金额
*/
private BigDecimal deductCost;
/**
* 累计 Tokens
*/
private Long totalTokens;
/**
* 模型名称
*/
private String modelName;
/**
* 备注
*/
private String remark;
/**
* 计费类型1-token计费2-次数计费null-普通消息)
*/
private String billingType;
}

View File

@@ -1,95 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
import java.io.Serial;
/**
* 聊天模型对象 chat_model
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_model")
public class ChatModel extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 模型分类
*/
private String category;
/**
* 模型名称
*/
private String modelName;
/**
* 模型描述
*/
private String modelDescribe;
/**
* 模型价格
*/
private Double modelPrice;
/**
* 计费类型
*/
private String modelType;
/**
* 是否显示
*/
private String modelShow;
/**
* 系统提示词
*/
private String systemPrompt;
/**
* 请求地址
*/
private String apiHost;
/**
* 密钥
*/
private String apiKey;
/**
* 优先级
*/
private Integer priority;
/**
* 模型供应商
*/
private String providerName;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,68 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
import java.io.Serial;
import java.math.BigDecimal;
/**
* 支付订单对象 chat_pay_order
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_pay_order")
public class ChatPayOrder extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 订单编号
*/
private String orderNo;
/**
* 订单名称
*/
private String orderName;
/**
* 金额
*/
private BigDecimal amount;
/**
* 支付状态
*/
private String paymentStatus;
/**
* 支付方式
*/
private String paymentMethod;
/**
* 用户ID
*/
private Long userId;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,55 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
import java.io.Serial;
/**
* 会话管理对象 chat_session
*
* @author ageerle
* @date 2025-05-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_session")
public class ChatSession extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 会话标题
*/
private String sessionTitle;
/**
* 会话内容
*/
private String sessionContent;
/**
* 备注
*/
private String remark;
/**
* 会话id
*/
private String conversationId;
}

View File

@@ -1,49 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableName;
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;
/**
* 用户token使用记录
*
* @author Lion Li
* @date 2023-11-26
*/
@Data
@TableName("chat_usage_token")
public class ChatToken implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 用户ID
*/
@NotBlank(message = "用户ID", groups = {AddGroup.class, EditGroup.class})
private Long UserId;
/**
* 待结算token
*/
private Integer token;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelName;
}

View File

@@ -1,50 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 用户token使用详情对象 chat_usage_token
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@TableName("chat_usage_token")
public class ChatUsageToken implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 用户
*/
private Long userId;
/**
* 待结算token
*/
private Integer token;
/**
* 模型名称
*/
private String modelName;
/**
* 累计使用token
*/
private String totalToken;
}

View File

@@ -1,62 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
/**
* MCP对象 mcp_info
*
* @author ageerle
* @date Sat Aug 09 16:50:58 CST 2025
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mcp_info")
public class McpInfo extends BaseEntity {
/**
* id
*/
@TableId(value = "mcp_id", type = IdType.AUTO)
private Integer mcpId;
/**
* 服务器名称
*/
private String serverName;
/**
* 链接方式
*/
private String transportType;
/**
* Command
*/
private String command;
/**
* Args
*/
private String arguments;
private String description;
/**
* Env
*/
private String env;
/**
* 是否启用
*/
private Boolean status;
}

View File

@@ -1,47 +0,0 @@
package org.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
/**
* 提示词模板对象 prompt_template
*
* @author evo
* @date 2025-06-12
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("prompt_template")
public class PromptTemplate extends BaseEntity {
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 提示词模板名称
*/
private String templateName;
/**
* 提示词模板内容
*/
private String templateContent;
/**
* 提示词分类knowledge 知识库类型chat 对话类型draw绘画类型 ...
*/
private String category;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,84 +0,0 @@
package org.ruoyi.domain.bo;
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.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.core.domain.BaseEntity;
import org.ruoyi.domain.ChatMessage;
/**
* 聊天消息业务对象 chat_message
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatMessage.class, reverseConvertGenerate = false)
public class ChatMessageBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 消息内容
*/
@NotBlank(message = "消息内容不能为空", groups = {AddGroup.class, EditGroup.class})
private String content;
/**
* 会话id
*/
@NotBlank(message = "会话id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long sessionId;
/**
* 对话角色
*/
@NotBlank(message = "对话角色不能为空", groups = {AddGroup.class, EditGroup.class})
private String role;
/**
* 扣除金额
*/
@NotNull(message = "扣除金额不能为空", groups = {AddGroup.class, EditGroup.class})
private Double deductCost;
/**
* 累计 Tokens
*/
@NotNull(message = "累计 Tokens不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer totalTokens;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelName;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = {AddGroup.class, EditGroup.class})
private String remark;
/**
* 计费类型1-token计费2-次数计费null-普通消息)
*/
private String billingType;
}

View File

@@ -1,109 +0,0 @@
package org.ruoyi.domain.bo;
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;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 聊天消息业务对象(uniapp) chat_message
*
* @author ageerle
* @date 2025-04-08
*/
@Data
public class ChatMessageForUniappBo implements Serializable {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 消息内容
*/
@NotBlank(message = "消息内容不能为空", groups = {AddGroup.class, EditGroup.class})
private String content;
/**
* 会话id
*/
private Long sessionId;
/**
* 对话角色
*/
private String role;
/**
* 扣除金额
*/
private Double deductCost;
/**
* 累计 Tokens
*/
private Integer totalTokens;
/**
* 模型名称
*/
private String modelName;
/**
* 备注
*/
private String remark;
/**
* 搜索值
*/
private String searchValue;
/**
* 创建部门
*/
private Long createDept;
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
private Date updateTime;
/**
* 请求参数
*/
private Map<String, Object> params = new HashMap<>();
}

View File

@@ -1,100 +0,0 @@
package org.ruoyi.domain.bo;
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.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.core.domain.BaseEntity;
import org.ruoyi.domain.ChatModel;
/**
* 聊天模型业务对象 chat_model
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatModel.class, reverseConvertGenerate = false)
public class ChatModelBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 模型分类
*/
@NotBlank(message = "模型分类不能为空", groups = {AddGroup.class, EditGroup.class})
private String category;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelName;
/**
* 模型描述
*/
@NotBlank(message = "模型描述不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelDescribe;
/**
* 模型价格
*/
@NotNull(message = "模型价格不能为空", groups = {AddGroup.class, EditGroup.class})
private Double modelPrice;
/**
* 计费类型
*/
@NotBlank(message = "计费类型不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelType;
/**
* 是否显示
*/
@NotBlank(message = "是否显示不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelShow;
/**
* 系统提示词
*/
private String systemPrompt;
/**
* 请求地址
*/
@NotBlank(message = "请求地址不能为空", groups = {AddGroup.class, EditGroup.class})
private String apiHost;
/**
* 优先级
*/
private Integer priority;
/**
* 密钥
*/
@NotBlank(message = "密钥不能为空", groups = {AddGroup.class, EditGroup.class})
private String apiKey;
/**
* 模型供应商
*/
private String providerName;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = {AddGroup.class, EditGroup.class})
private String remark;
}

View File

@@ -1,75 +0,0 @@
package org.ruoyi.domain.bo;
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.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.core.domain.BaseEntity;
import org.ruoyi.domain.ChatPayOrder;
import java.math.BigDecimal;
/**
* 支付订单业务对象 chat_pay_order
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatPayOrder.class, reverseConvertGenerate = false)
public class ChatPayOrderBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 订单编号
*/
@NotBlank(message = "订单编号不能为空", groups = {AddGroup.class, EditGroup.class})
private String orderNo;
/**
* 订单名称
*/
@NotBlank(message = "订单名称不能为空", groups = {AddGroup.class, EditGroup.class})
private String orderName;
/**
* 金额
*/
@NotNull(message = "金额不能为空", groups = {AddGroup.class, EditGroup.class})
private BigDecimal amount;
/**
* 支付状态
*/
@NotBlank(message = "支付状态不能为空", groups = {AddGroup.class, EditGroup.class})
private String paymentStatus;
/**
* 支付方式
*/
@NotBlank(message = "支付方式不能为空", groups = {AddGroup.class, EditGroup.class})
private String paymentMethod;
/**
* 用户ID
*/
@NotNull(message = "用户ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = {AddGroup.class, EditGroup.class})
private String remark;
}

View File

@@ -1,52 +0,0 @@
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.core.domain.BaseEntity;
import org.ruoyi.domain.ChatSession;
/**
* 会话管理业务对象 chat_session
*
* @author ageerle
* @date 2025-05-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatSession.class, reverseConvertGenerate = false)
public class ChatSessionBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 会话标题
*/
private String sessionTitle;
/**
* 会话内容
*/
private String sessionContent;
/**
* 备注
*/
private String remark;
/**
* 会话id
*/
private String conversationId;
}

View File

@@ -1,55 +0,0 @@
package org.ruoyi.domain.bo;
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.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.core.domain.BaseEntity;
import org.ruoyi.domain.ChatUsageToken;
/**
* 用户token使用详情业务对象 chat_usage_token
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatUsageToken.class, reverseConvertGenerate = false)
public class ChatUsageTokenBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 用户
*/
@NotNull(message = "用户不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 待结算token
*/
@NotNull(message = "待结算token不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer token;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = {AddGroup.class, EditGroup.class})
private String modelName;
/**
* 累计使用token
*/
@NotBlank(message = "累计使用token不能为空", groups = {AddGroup.class, EditGroup.class})
private String totalToken;
}

View File

@@ -1,58 +0,0 @@
package org.ruoyi.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.ruoyi.domain.McpInfo;
import java.io.Serializable;
/**
* MCP业务对象 mcp_info
*
* @author ageerle
* @date Sat Aug 09 16:50:58 CST 2025
*/
@Data
@AutoMapper(target = McpInfo.class, reverseConvertGenerate = false)
public class McpInfoBo implements Serializable {
/**
* id
*/
@NotNull(message = "id不能为空")
private Integer mcpId;
/**
* 服务器名称
*/
private String serverName;
/**
* 链接方式
*/
private String transportType;
/**
* Command
*/
private String command;
/**
* Args
*/
private String arguments;
private String description;
/**
* Env
*/
private String env;
/**
* 是否启用
*/
private Boolean status;
}

View File

@@ -1,53 +0,0 @@
package org.ruoyi.domain.bo;
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.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.core.domain.BaseEntity;
import org.ruoyi.domain.PromptTemplate;
/**
* 提示词模板业务对象 prompt_template
*
* @author evo
* @date 2025-06-12
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = PromptTemplate.class, reverseConvertGenerate = false)
public class PromptTemplateBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 提示词模板名称
*/
@NotBlank(message = "提示词模板名称不能为空", groups = {AddGroup.class, EditGroup.class})
private String templateName;
/**
* 提示词模板内容
*/
@NotBlank(message = "提示词模板内容不能为空", groups = {AddGroup.class, EditGroup.class})
private String templateContent;
/**
* 提示词分类knowledge 知识库类型chat 对话类型draw绘画类型 ...
*/
@NotBlank(message = "提示词分类", groups = {AddGroup.class, EditGroup.class})
private String category;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = {AddGroup.class, EditGroup.class})
private String remark;
}

View File

@@ -1,99 +0,0 @@
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.common.excel.annotation.ExcelDictFormat;
import org.ruoyi.common.excel.convert.ExcelDictConvert;
import org.ruoyi.domain.ChatMessage;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 聊天消息视图对象 chat_message
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatMessage.class)
public class ChatMessageVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 会话id
*/
private Long sessionId;
/**
* 消息内容
*/
@ExcelProperty(value = "消息内容")
private String content;
/**
* 对话角色
*/
@ExcelProperty(value = "对话角色")
private String role;
/**
* 扣除金额
*/
@ExcelProperty(value = "扣除金额")
private BigDecimal deductCost;
/**
* 累计 Tokens
*/
@ExcelProperty(value = "累计 Tokens")
private Long totalTokens;
/**
* 模型名称
*/
@ExcelProperty(value = "模型名称")
private String modelName;
/**
* 计费类型1-token计费2-次数计费)
*/
@ExcelProperty(value = "计费类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_model_billing")
private String billingType;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
}

View File

@@ -1,115 +0,0 @@
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.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.domain.ChatModel;
import java.io.Serial;
import java.io.Serializable;
/**
* 聊天模型视图对象 chat_model
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatModel.class)
public class ChatModelVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 模型分类
*/
@ExcelProperty(value = "模型分类")
private String category;
/**
* 模型名称
*/
@ExcelProperty(value = "模型名称")
private String modelName;
/**
* 模型描述
*/
@ExcelProperty(value = "模型描述")
private String modelDescribe;
/**
* 模型价格
*/
@ExcelProperty(value = "模型价格")
private Double modelPrice;
/**
* 计费类型
*/
@ExcelProperty(value = "计费类型")
private String modelType;
/**
* 是否显示
*/
@ExcelProperty(value = "是否显示")
private String modelShow;
/**
* 模型维度
*/
private Integer dimension;
/**
* 系统提示词
*/
@ExcelProperty(value = "系统提示词")
private String systemPrompt;
/**
* 请求地址
*/
@ExcelProperty(value = "请求地址")
private String apiHost;
/**
* 密钥
*/
@Sensitive(strategy = SensitiveStrategy.PHONE)
@ExcelProperty(value = "密钥")
private String apiKey;
/**
* 优先级(值越大优先级越高)
*/
@ExcelProperty(value = "优先级")
private Integer priority;
/**
* 模型供应商
*/
@ExcelProperty(value = "模型供应商")
private String providerName;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -1,77 +0,0 @@
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.domain.ChatPayOrder;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 支付订单视图对象 chat_pay_order
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatPayOrder.class)
public class ChatPayOrderVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 订单编号
*/
@ExcelProperty(value = "订单编号")
private String orderNo;
/**
* 订单名称
*/
@ExcelProperty(value = "订单名称")
private String orderName;
/**
* 金额
*/
@ExcelProperty(value = "金额")
private BigDecimal amount;
/**
* 支付状态
*/
@ExcelProperty(value = "支付状态")
private String paymentStatus;
/**
* 支付方式
*/
@ExcelProperty(value = "支付方式")
private String paymentMethod;
/**
* 用户ID
*/
@ExcelProperty(value = "用户ID")
private Long userId;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -1,70 +0,0 @@
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.domain.ChatSession;
import java.io.Serial;
import java.io.Serializable;
/**
* 会话管理视图对象 chat_session
*
* @author ageerle
* @date 2025-05-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatSession.class)
public class ChatSessionVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 会话标题
*/
@ExcelProperty(value = "会话标题")
private String sessionTitle;
/**
* 会话内容
*/
@ExcelProperty(value = "会话内容")
private String sessionContent;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private String createTime;
/**
* 会话id
*/
@ExcelProperty(value = "会话id")
private String conversationId;
}

View File

@@ -1,58 +0,0 @@
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.domain.ChatUsageToken;
import java.io.Serial;
import java.io.Serializable;
/**
* 用户token使用详情视图对象 chat_usage_token
*
* @author ageerle
* @date 2025-04-08
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatUsageToken.class)
public class ChatUsageTokenVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 用户
*/
@ExcelProperty(value = "用户")
private Long userId;
/**
* 待结算token
*/
@ExcelProperty(value = "待结算token")
private Integer token;
/**
* 模型名称
*/
@ExcelProperty(value = "模型名称")
private String modelName;
/**
* 累计使用token
*/
@ExcelProperty(value = "累计使用token")
private String totalToken;
}

View File

@@ -1,65 +0,0 @@
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.common.excel.annotation.ExcelDictFormat;
import org.ruoyi.common.excel.convert.ExcelDictConvert;
import org.ruoyi.domain.McpInfo;
import java.io.Serializable;
/**
* MCP视图对象 mcp_info
*
* @author jiyi
* @date Sat Aug 09 16:50:58 CST 2025
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = McpInfo.class)
public class McpInfoVo implements Serializable {
private Integer mcpId;
/**
* 服务器名称
*/
@ExcelProperty(value = "服务器名称")
private String serverName;
/**
* 链接方式
*/
@ExcelProperty(value = "链接方式", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "mcp_transport_type")
private String transportType;
/**
* Command
*/
@ExcelProperty(value = "Command")
private String command;
/**
* Args
*/
@ExcelProperty(value = "Args")
private String arguments;
@ExcelProperty(value = "Description")
private String description;
/**
* Env
*/
@ExcelProperty(value = "Env")
private String env;
/**
* 是否启用
*/
@ExcelProperty(value = "是否启用")
private Boolean status;
}

View File

@@ -1,52 +0,0 @@
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.domain.PromptTemplate;
import java.io.Serializable;
/**
* 提示词模板视图对象 prompt_template
*
* @author evo
* @date 2025-06-12
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = PromptTemplate.class)
public class PromptTemplateVo implements Serializable {
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 提示词模板名称
*/
@ExcelProperty(value = "提示词模板名称")
private String templateName;
/**
* 提示词模板内容
*/
@ExcelProperty(value = "提示词模板内容")
private String templateContent;
/**
* 提示词分类knowledge 知识库类型chat 对话类型draw绘画类型 ...
*/
@ExcelProperty(value = "提示词分类")
private String category;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -1,18 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatMessage;
import org.ruoyi.domain.vo.ChatMessageVo;
/**
* 聊天消息Mapper接口
*
* @author ageerle
* @date 2025-04-08
*/
@Mapper
public interface ChatMessageMapper extends BaseMapperPlus<ChatMessage, ChatMessageVo> {
}

View File

@@ -1,17 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatModel;
import org.ruoyi.domain.vo.ChatModelVo;
/**
* 聊天模型Mapper接口
*
* @author ageerle
* @date 2025-04-08
*/
@Mapper
public interface ChatModelMapper extends BaseMapperPlus<ChatModel, ChatModelVo> {
}

View File

@@ -1,18 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatPayOrder;
import org.ruoyi.domain.vo.ChatPayOrderVo;
/**
* 支付订单Mapper接口
*
* @author ageerle
* @date 2025-04-08
*/
@Mapper
public interface ChatPayOrderMapper extends BaseMapperPlus<ChatPayOrder, ChatPayOrderVo> {
}

View File

@@ -1,17 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatSession;
import org.ruoyi.domain.vo.ChatSessionVo;
/**
* 会话管理Mapper接口
*
* @author ageerle
* @date 2025-05-03
*/
@Mapper
public interface ChatSessionMapper extends BaseMapperPlus<ChatSession, ChatSessionVo> {
}

View File

@@ -1,18 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.ChatUsageToken;
import org.ruoyi.domain.vo.ChatUsageTokenVo;
/**
* 用户token使用详情Mapper接口
*
* @author ageerle
* @date 2025-04-08
*/
@Mapper
public interface ChatUsageTokenMapper extends BaseMapperPlus<ChatUsageToken, ChatUsageTokenVo> {
}

View File

@@ -1,33 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.*;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.McpInfo;
import org.ruoyi.domain.vo.McpInfoVo;
import java.util.List;
/**
* MCPMapper接口
*
* @author jiuyi
* @date Sat Aug 09 16:50:58 CST 2025
*/
@Mapper
public interface McpInfoMapper extends BaseMapperPlus<McpInfo, McpInfoVo> {
@Select("SELECT * FROM mcp_info WHERE server_name = #{serverName}")
McpInfo selectByServerName(@Param("serverName") String serverName);
@Select("SELECT * FROM mcp_info WHERE status = 1")
List<McpInfo> selectActiveServers();
@Select("SELECT server_name FROM mcp_info WHERE status = 1")
List<String> selectActiveServerNames();
@Update("UPDATE mcp_info SET status = #{status} WHERE server_name = #{serverName}")
int updateActiveStatus(@Param("serverName") String serverName, @Param("status") Boolean status);
@Delete("DELETE FROM mcp_info WHERE server_name = #{serverName}")
int deleteByServerName(@Param("serverName") String serverName);
}

View File

@@ -1,17 +0,0 @@
package org.ruoyi.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.ruoyi.core.mapper.BaseMapperPlus;
import org.ruoyi.domain.PromptTemplate;
import org.ruoyi.domain.vo.PromptTemplateVo;
/**
* 提示词模板Mapper接口
*
* @author evo
* @date 2025-06-12
*/
@Mapper
public interface PromptTemplateMapper extends BaseMapperPlus<PromptTemplate, PromptTemplateVo> {
}

View File

@@ -1,49 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatMessageBo;
import org.ruoyi.domain.vo.ChatMessageVo;
import java.util.Collection;
import java.util.List;
/**
* 聊天消息Service接口
*
* @author ageerle
* @date 2025-04-08
*/
public interface IChatMessageService {
/**
* 查询聊天消息
*/
ChatMessageVo queryById(Long id);
/**
* 查询聊天消息列表
*/
TableDataInfo<ChatMessageVo> queryPageList(ChatMessageBo bo, PageQuery pageQuery);
/**
* 查询聊天消息列表
*/
List<ChatMessageVo> queryList(ChatMessageBo bo);
/**
* 新增聊天消息
*/
Boolean insertByBo(ChatMessageBo bo);
/**
* 修改聊天消息
*/
Boolean updateByBo(ChatMessageBo bo);
/**
* 校验并批量删除聊天消息信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -1,77 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.ChatModel;
import org.ruoyi.domain.bo.ChatModelBo;
import org.ruoyi.domain.vo.ChatModelVo;
import java.util.Collection;
import java.util.List;
/**
* 聊天模型Service接口
*
* @author ageerle
* @date 2025-04-08
*/
public interface IChatModelService {
/**
* 查询聊天模型
*/
ChatModelVo queryById(Long id);
/**
* 查询聊天模型列表
*/
TableDataInfo<ChatModelVo> queryPageList(ChatModelBo bo, PageQuery pageQuery);
/**
* 查询聊天模型列表
*/
List<ChatModelVo> queryList(ChatModelBo bo);
/**
* 新增聊天模型
*/
Boolean insertByBo(ChatModelBo bo);
/**
* 修改聊天模型
*/
Boolean updateByBo(ChatModelBo bo);
/**
* 校验并批量删除聊天模型信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 通过模型名称获取模型信息
*/
ChatModelVo selectModelByName(String modelName);
/**
* 通过模型分类获取模型信息
*/
ChatModelVo selectModelByCategory(String image);
/**
* 通过模型分类获取优先级最高的模型信息
*/
ChatModelVo selectModelByCategoryWithHighestPriority(String category);
/**
* 在同一分类下,查找优先级小于当前优先级的最高优先级模型(用于降级)。
*/
ChatModelVo selectFallbackModelByCategoryAndLessPriority(String category, Integer currentPriority);
/**
* 获取ppt模型信息
*/
ChatModel getPPT();
}

View File

@@ -1,48 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatPayOrderBo;
import org.ruoyi.domain.vo.ChatPayOrderVo;
import java.util.Collection;
import java.util.List;
/**
* 支付订单Service接口
*
* @author ageerle
* @date 2025-04-08
*/
public interface IChatPayOrderService {
/**
* 查询支付订单
*/
ChatPayOrderVo queryById(Long id);
/**
* 查询支付订单列表
*/
TableDataInfo<ChatPayOrderVo> queryPageList(ChatPayOrderBo bo, PageQuery pageQuery);
/**
* 查询支付订单列表
*/
List<ChatPayOrderVo> queryList(ChatPayOrderBo bo);
/**
* 新增支付订单
*/
Boolean insertByBo(ChatPayOrderBo bo);
/**
* 修改支付订单
*/
Boolean updateByBo(ChatPayOrderBo bo);
/**
* 校验并批量删除支付订单信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -1,48 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatSessionBo;
import org.ruoyi.domain.vo.ChatSessionVo;
import java.util.Collection;
import java.util.List;
/**
* 会话管理Service接口
*
* @author ageerle
* @date 2025-05-03
*/
public interface IChatSessionService {
/**
* 查询会话管理
*/
ChatSessionVo queryById(Long id);
/**
* 查询会话管理列表
*/
TableDataInfo<ChatSessionVo> queryPageList(ChatSessionBo bo, PageQuery pageQuery);
/**
* 查询会话管理列表
*/
List<ChatSessionVo> queryList(ChatSessionBo bo);
/**
* 新增会话管理
*/
Boolean insertByBo(ChatSessionBo bo);
/**
* 修改会话管理
*/
Boolean updateByBo(ChatSessionBo bo);
/**
* 校验并批量删除会话管理信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -1,28 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.domain.ChatUsageToken;
/**
* 聊天消息Service接口
*
* @author ageerle
* @date 2025-04-08
*/
public interface IChatTokenService {
/**
* 查询用户token
*/
ChatUsageToken queryByUserId(Long userId, String modelName);
/**
* 清空用户token
*/
void resetToken(Long userId, String modelName);
/**
* 修改用户token
*/
void editToken(ChatUsageToken chatToken);
}

View File

@@ -1,49 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.bo.ChatUsageTokenBo;
import org.ruoyi.domain.vo.ChatUsageTokenVo;
import java.util.Collection;
import java.util.List;
/**
* 用户token使用详情Service接口
*
* @author ageerle
* @date 2025-04-08
*/
public interface IChatUsageTokenService {
/**
* 查询用户token使用详情
*/
ChatUsageTokenVo queryById(Long id);
/**
* 查询用户token使用详情列表
*/
TableDataInfo<ChatUsageTokenVo> queryPageList(ChatUsageTokenBo bo, PageQuery pageQuery);
/**
* 查询用户token使用详情列表
*/
List<ChatUsageTokenVo> queryList(ChatUsageTokenBo bo);
/**
* 新增用户token使用详情
*/
Boolean insertByBo(ChatUsageTokenBo bo);
/**
* 修改用户token使用详情
*/
Boolean updateByBo(ChatUsageTokenBo bo);
/**
* 校验并批量删除用户token使用详情信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -1,56 +0,0 @@
package org.ruoyi.service;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.bo.PromptTemplateBo;
import org.ruoyi.domain.vo.PromptTemplateVo;
import java.util.Collection;
import java.util.List;
/**
* 提示词模板Service接口
*
* @author evo
* @date 2025-06-12
*/
public interface IPromptTemplateService {
/**
* 查询提示词模板
*/
PromptTemplateVo queryById(Long id);
/**
* 查询提示词模板列表
*/
TableDataInfo<PromptTemplateVo> queryPageList(PromptTemplateBo bo, PageQuery pageQuery);
/**
* 查询提示词模板列表
*/
List<PromptTemplateVo> queryList(PromptTemplateBo bo);
/**
* 新增提示词模板
*/
Boolean insertByBo(PromptTemplateBo bo);
/**
* 修改提示词模板
*/
Boolean updateByBo(PromptTemplateBo bo);
/**
* 校验并批量删除提示词模板信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据分类查询提示词模板
*
* @param category 分类
*/
PromptTemplateVo queryByCategory(String category);
}

View File

@@ -1,121 +0,0 @@
package org.ruoyi.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.satoken.utils.LoginHelper;
import org.ruoyi.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.ChatMessage;
import org.ruoyi.domain.bo.ChatMessageBo;
import org.ruoyi.domain.vo.ChatMessageVo;
import org.ruoyi.mapper.ChatMessageMapper;
import org.ruoyi.service.IChatMessageService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 聊天消息Service业务层处理
*
* @author ageerle
* @date 2025-04-08
*/
@RequiredArgsConstructor
@Service
public class ChatMessageServiceImpl implements IChatMessageService {
private final ChatMessageMapper baseMapper;
/**
* 查询聊天消息
*/
@Override
public ChatMessageVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询聊天消息列表
*/
@Override
public TableDataInfo<ChatMessageVo> queryPageList(ChatMessageBo bo, PageQuery pageQuery) {
if (!LoginHelper.isLogin()) {
return TableDataInfo.build();
}
// 只有非管理员才自动设置为自己的 ID
if (!LoginHelper.isSuperAdmin()) {
bo.setUserId(LoginHelper.getUserId());
}
LambdaQueryWrapper<ChatMessage> lqw = buildQueryWrapper(bo);
Page<ChatMessageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询聊天消息列表
*/
@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.getSessionId() != null, ChatMessage::getSessionId, bo.getSessionId());
lqw.like(StringUtils.isNotBlank(bo.getRole()), ChatMessage::getRole, bo.getRole());
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,172 +0,0 @@
package org.ruoyi.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.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.ChatModel;
import org.ruoyi.domain.bo.ChatModelBo;
import org.ruoyi.domain.vo.ChatModelVo;
import org.ruoyi.mapper.ChatModelMapper;
import org.ruoyi.service.IChatModelService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 聊天模型Service业务层处理
*
* @author ageerle
* @date 2025-04-08
*/
@RequiredArgsConstructor
@Service
public class ChatModelServiceImpl implements IChatModelService {
private final ChatModelMapper baseMapper;
/**
* 查询聊天模型
*/
@Override
public ChatModelVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询聊天模型列表
*/
@Override
public TableDataInfo<ChatModelVo> queryPageList(ChatModelBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatModel> lqw = buildQueryWrapper(bo);
Page<ChatModelVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询聊天模型列表
*/
@Override
public List<ChatModelVo> queryList(ChatModelBo bo) {
LambdaQueryWrapper<ChatModel> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatModel> buildQueryWrapper(ChatModelBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatModel> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getCategory()), ChatModel::getCategory, bo.getCategory());
lqw.like(StringUtils.isNotBlank(bo.getModelName()), ChatModel::getModelName, bo.getModelName());
lqw.eq(StringUtils.isNotBlank(bo.getModelDescribe()), ChatModel::getModelDescribe, bo.getModelDescribe());
lqw.eq(bo.getModelPrice() != null, ChatModel::getModelPrice, bo.getModelPrice());
lqw.eq(StringUtils.isNotBlank(bo.getModelType()), ChatModel::getModelType, bo.getModelType());
lqw.eq(StringUtils.isNotBlank(bo.getModelShow()), ChatModel::getModelShow, bo.getModelShow());
lqw.eq(StringUtils.isNotBlank(bo.getSystemPrompt()), ChatModel::getSystemPrompt, bo.getSystemPrompt());
lqw.eq(StringUtils.isNotBlank(bo.getApiHost()), ChatModel::getApiHost, bo.getApiHost());
lqw.eq(StringUtils.isNotBlank(bo.getApiKey()), ChatModel::getApiKey, bo.getApiKey());
return lqw;
}
/**
* 新增聊天模型
*/
@Override
public Boolean insertByBo(ChatModelBo bo) {
ChatModel add = MapstructUtils.convert(bo, ChatModel.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改聊天模型
*/
@Override
public Boolean updateByBo(ChatModelBo bo) {
ChatModel update = MapstructUtils.convert(bo, ChatModel.class);
if (update != null) {
validEntityBeforeSave(update);
}
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatModel entity) {
// 判断是否包含*号
if (entity.getApiKey().contains("*")) {
// 重新设置key信息
entity.setApiKey(baseMapper.selectById(entity.getId()).getApiKey());
}
}
/**
* 批量删除聊天模型
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 通过模型名称获取模型信息
*/
@Override
public ChatModelVo selectModelByName(String modelName) {
return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getModelName, modelName));
}
/**
* 通过模型分类获取模型信息
*/
@Override
public ChatModelVo selectModelByCategory(String category) {
return baseMapper.selectVoOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getCategory, category));
}
/**
* 通过模型分类获取优先级最高的模型信息
*/
@Override
public ChatModelVo selectModelByCategoryWithHighestPriority(String category) {
return baseMapper.selectVoOne(
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.orderByDesc(ChatModel::getPriority),
false
);
}
/**
* 在同一分类下,查找优先级小于当前优先级的最高优先级模型(用于降级)。
*/
@Override
public ChatModelVo selectFallbackModelByCategoryAndLessPriority(String category, Integer currentPriority) {
return baseMapper.selectVoOne(
Wrappers.<ChatModel>lambdaQuery()
.eq(ChatModel::getCategory, category)
.lt(ChatModel::getPriority, currentPriority)
.orderByDesc(ChatModel::getPriority),
false
);
}
@Override
public ChatModel getPPT() {
return baseMapper.selectOne(Wrappers.<ChatModel>lambdaQuery().eq(ChatModel::getModelName, "ppt"));
}
}

View File

@@ -1,114 +0,0 @@
package org.ruoyi.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.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.ChatPayOrder;
import org.ruoyi.domain.bo.ChatPayOrderBo;
import org.ruoyi.domain.vo.ChatPayOrderVo;
import org.ruoyi.mapper.ChatPayOrderMapper;
import org.ruoyi.service.IChatPayOrderService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 支付订单Service业务层处理
*
* @author ageerle
* @date 2025-04-08
*/
@RequiredArgsConstructor
@Service
public class ChatPayOrderServiceImpl implements IChatPayOrderService {
private final ChatPayOrderMapper baseMapper;
/**
* 查询支付订单
*/
@Override
public ChatPayOrderVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询支付订单列表
*/
@Override
public TableDataInfo<ChatPayOrderVo> queryPageList(ChatPayOrderBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatPayOrder> lqw = buildQueryWrapper(bo);
Page<ChatPayOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询支付订单列表
*/
@Override
public List<ChatPayOrderVo> queryList(ChatPayOrderBo bo) {
LambdaQueryWrapper<ChatPayOrder> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatPayOrder> buildQueryWrapper(ChatPayOrderBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatPayOrder> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), ChatPayOrder::getOrderNo, bo.getOrderNo());
lqw.like(StringUtils.isNotBlank(bo.getOrderName()), ChatPayOrder::getOrderName, bo.getOrderName());
lqw.eq(bo.getAmount() != null, ChatPayOrder::getAmount, bo.getAmount());
lqw.eq(StringUtils.isNotBlank(bo.getPaymentStatus()), ChatPayOrder::getPaymentStatus, bo.getPaymentStatus());
lqw.eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ChatPayOrder::getPaymentMethod, bo.getPaymentMethod());
lqw.eq(bo.getUserId() != null, ChatPayOrder::getUserId, bo.getUserId());
return lqw;
}
/**
* 新增支付订单
*/
@Override
public Boolean insertByBo(ChatPayOrderBo bo) {
ChatPayOrder add = MapstructUtils.convert(bo, ChatPayOrder.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改支付订单
*/
@Override
public Boolean updateByBo(ChatPayOrderBo bo) {
ChatPayOrder update = MapstructUtils.convert(bo, ChatPayOrder.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatPayOrder entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除支付订单
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -1,111 +0,0 @@
package org.ruoyi.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.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.ChatSession;
import org.ruoyi.domain.bo.ChatSessionBo;
import org.ruoyi.domain.vo.ChatSessionVo;
import org.ruoyi.mapper.ChatSessionMapper;
import org.ruoyi.service.IChatSessionService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 会话管理Service业务层处理
*
* @author ageerle
* @date 2025-05-03
*/
@RequiredArgsConstructor
@Service
public class ChatSessionServiceImpl implements IChatSessionService {
private final ChatSessionMapper baseMapper;
/**
* 查询会话管理
*/
@Override
public ChatSessionVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询会话管理列表
*/
@Override
public TableDataInfo<ChatSessionVo> queryPageList(ChatSessionBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatSession> lqw = buildQueryWrapper(bo);
Page<ChatSessionVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询会话管理列表
*/
@Override
public List<ChatSessionVo> queryList(ChatSessionBo bo) {
LambdaQueryWrapper<ChatSession> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatSession> buildQueryWrapper(ChatSessionBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatSession> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, ChatSession::getUserId, bo.getUserId());
lqw.eq(StringUtils.isNotBlank(bo.getSessionTitle()), ChatSession::getSessionTitle, bo.getSessionTitle());
lqw.eq(StringUtils.isNotBlank(bo.getSessionContent()), ChatSession::getSessionContent, bo.getSessionContent());
return lqw;
}
/**
* 新增会话管理
*/
@Override
public Boolean insertByBo(ChatSessionBo bo) {
ChatSession add = MapstructUtils.convert(bo, ChatSession.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改会话管理
*/
@Override
public Boolean updateByBo(ChatSessionBo bo) {
ChatSession update = MapstructUtils.convert(bo, ChatSession.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatSession entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除会话管理
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

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

View File

@@ -1,112 +0,0 @@
package org.ruoyi.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.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.ChatUsageToken;
import org.ruoyi.domain.bo.ChatUsageTokenBo;
import org.ruoyi.domain.vo.ChatUsageTokenVo;
import org.ruoyi.mapper.ChatUsageTokenMapper;
import org.ruoyi.service.IChatUsageTokenService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 用户token使用详情Service业务层处理
*
* @author ageerle
* @date 2025-04-08
*/
@RequiredArgsConstructor
@Service
public class ChatUsageTokenServiceImpl implements IChatUsageTokenService {
private final ChatUsageTokenMapper baseMapper;
/**
* 查询用户token使用详情
*/
@Override
public ChatUsageTokenVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询用户token使用详情列表
*/
@Override
public TableDataInfo<ChatUsageTokenVo> queryPageList(ChatUsageTokenBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ChatUsageToken> lqw = buildQueryWrapper(bo);
Page<ChatUsageTokenVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询用户token使用详情列表
*/
@Override
public List<ChatUsageTokenVo> queryList(ChatUsageTokenBo bo) {
LambdaQueryWrapper<ChatUsageToken> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ChatUsageToken> buildQueryWrapper(ChatUsageTokenBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ChatUsageToken> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, ChatUsageToken::getUserId, bo.getUserId());
lqw.eq(bo.getToken() != null, ChatUsageToken::getToken, bo.getToken());
lqw.like(StringUtils.isNotBlank(bo.getModelName()), ChatUsageToken::getModelName, bo.getModelName());
lqw.eq(StringUtils.isNotBlank(bo.getTotalToken()), ChatUsageToken::getTotalToken, bo.getTotalToken());
return lqw;
}
/**
* 新增用户token使用详情
*/
@Override
public Boolean insertByBo(ChatUsageTokenBo bo) {
ChatUsageToken add = MapstructUtils.convert(bo, ChatUsageToken.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改用户token使用详情
*/
@Override
public Boolean updateByBo(ChatUsageTokenBo bo) {
ChatUsageToken update = MapstructUtils.convert(bo, ChatUsageToken.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(ChatUsageToken entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除用户token使用详情
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -1,120 +0,0 @@
package org.ruoyi.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.core.page.PageQuery;
import org.ruoyi.core.page.TableDataInfo;
import org.ruoyi.domain.PromptTemplate;
import org.ruoyi.domain.bo.PromptTemplateBo;
import org.ruoyi.domain.vo.PromptTemplateVo;
import org.ruoyi.mapper.PromptTemplateMapper;
import org.ruoyi.service.IPromptTemplateService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
/**
* 提示词模板Service业务层处理
*
* @author evo
* @date 2025-06-12
*/
@Service
@RequiredArgsConstructor
public class PromptTemplateServiceImpl implements IPromptTemplateService {
private final PromptTemplateMapper baseMapper;
/**
* 查询提示词模板
*/
@Override
public PromptTemplateVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询提示词模板列表
*/
@Override
public TableDataInfo<PromptTemplateVo> queryPageList(PromptTemplateBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<PromptTemplate> lqw = buildQueryWrapper(bo);
Page<PromptTemplateVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询提示词模板列表
*/
@Override
public List<PromptTemplateVo> queryList(PromptTemplateBo bo) {
LambdaQueryWrapper<PromptTemplate> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<PromptTemplate> buildQueryWrapper(PromptTemplateBo bo) {
LambdaQueryWrapper<PromptTemplate> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getTemplateName()),
PromptTemplate::getTemplateName, bo.getTemplateName());
lqw.like(StringUtils.isNotBlank(bo.getTemplateContent()),
PromptTemplate::getTemplateContent, bo.getTemplateContent());
lqw.eq(StringUtils.isNotBlank(bo.getCategory()),
PromptTemplate::getCategory, bo.getCategory());
return lqw;
}
/**
* 新增提示词模板
*/
@Override
public Boolean insertByBo(PromptTemplateBo bo) {
PromptTemplate add = MapstructUtils.convert(bo, PromptTemplate.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改提示词模板
*/
@Override
public Boolean updateByBo(PromptTemplateBo bo) {
PromptTemplate update = MapstructUtils.convert(bo, PromptTemplate.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(PromptTemplate entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除提示词模板
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public PromptTemplateVo queryByCategory(String category) {
LambdaQueryWrapper<PromptTemplate> queryWrapper = Wrappers.lambdaQuery(PromptTemplate.class);
queryWrapper.eq(PromptTemplate::getCategory, category);
queryWrapper.orderByDesc(PromptTemplate::getUpdateTime);
return baseMapper.selectVoOne(queryWrapper, false);
}
}

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.ruoyi.mapper.ChatMessageMapper">
</mapper>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.ruoyi.mapper.ChatModelMapper">
</mapper>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.ruoyi.mapper.ChatPayOrderMapper">
</mapper>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.ruoyi.mapper.McpInfoMapper">
</mapper>

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