mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-03-21 16:43:47 +08:00
feat: 测试版本提交
This commit is contained in:
8
pom.xml
8
pom.xml
@@ -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>
|
||||
|
||||
@@ -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"]
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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
61
ruoyi-modules-api/pom.xml
Normal 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>
|
||||
22
ruoyi-modules-api/ruoyi-chat-api/pom.xml
Normal file
22
ruoyi-modules-api/ruoyi-chat-api/pom.xml
Normal 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>
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.ruoyi.system.domain;
|
||||
package org.ruoyi.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.ruoyi.system.domain;
|
||||
package org.ruoyi.domain;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
|
||||
/**
|
||||
* 对话配置信息
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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>
|
||||
21
ruoyi-modules-api/ruoyi-device-api/pom.xml
Normal file
21
ruoyi-modules-api/ruoyi-device-api/pom.xml
Normal 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>
|
||||
20
ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
Normal file
20
ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
Normal 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>
|
||||
20
ruoyi-modules-api/ruoyi-system-api/pom.xml
Normal file
20
ruoyi-modules-api/ruoyi-system-api/pom.xml
Normal 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>
|
||||
21
ruoyi-modules-api/ruoyi-weixin-api/pom.xml
Normal file
21
ruoyi-modules-api/ruoyi-weixin-api/pom.xml
Normal 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>
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
21
ruoyi-modules/ruoyi-device/pom.xml
Normal file
21
ruoyi-modules/ruoyi-device/pom.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.ruoyi;
|
||||
package org.ruoyi.system;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
@@ -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;
|
||||
@@ -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.*;
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 验证码操作处理
|
||||
@@ -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.*;
|
||||
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
|
||||
@@ -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.*;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.ruoyi.controller;
|
||||
package org.ruoyi.system.controller.system;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -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);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
@@ -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);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
//
|
||||
|
||||
@@ -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();
|
||||
// }
|
||||
//}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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接口
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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接口
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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接口
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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业务层处理
|
||||
*
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user