增加后台管理,支持docker部署

This commit is contained in:
ageer
2024-05-17 02:00:31 +08:00
parent ef7434ed04
commit 7fe89a931b
59 changed files with 3911 additions and 1501 deletions

View File

@@ -0,0 +1,114 @@
package com.xmzs.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.xmzs.common.core.domain.R;
import com.xmzs.common.core.validate.AddGroup;
import com.xmzs.common.core.validate.EditGroup;
import com.xmzs.common.excel.utils.ExcelUtil;
import com.xmzs.common.idempotent.annotation.RepeatSubmit;
import com.xmzs.common.log.annotation.Log;
import com.xmzs.common.log.enums.BusinessType;
import com.xmzs.common.mybatis.core.page.PageQuery;
import com.xmzs.common.mybatis.core.page.TableDataInfo;
import com.xmzs.common.web.core.BaseController;
import com.xmzs.system.domain.bo.SysModelBo;
import com.xmzs.system.domain.vo.SysModelVo;
import com.xmzs.system.service.ISysModelService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 系统模型
*
* @author Lion Li
* @date 2024-04-04
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/model")
public class SysModelController extends BaseController {
private final ISysModelService sysModelService;
/**
* 查询系统模型列表
*/
@GetMapping("/list")
public TableDataInfo<SysModelVo> list(SysModelBo bo, PageQuery pageQuery) {
return sysModelService.queryPageList(bo, pageQuery);
}
/**
* 查询系统模型列表
*/
@GetMapping("/modelList")
public R<List<SysModelVo>> modelList(SysModelBo bo) {
bo.setModelShow("0");
return R.ok(sysModelService.queryList(bo));
}
/**
* 导出系统模型列表
*/
@SaCheckPermission("system:model:export")
@Log(title = "系统模型", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysModelBo bo, HttpServletResponse response) {
List<SysModelVo> list = sysModelService.queryList(bo);
ExcelUtil.exportExcel(list, "系统模型", SysModelVo.class, response);
}
/**
* 获取系统模型详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:model:query")
@GetMapping("/{id}")
public R<SysModelVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(sysModelService.queryById(id));
}
/**
* 新增系统模型
*/
@SaCheckPermission("system:model:add")
@Log(title = "系统模型", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysModelBo bo) {
return toAjax(sysModelService.insertByBo(bo));
}
/**
* 修改系统模型
*/
@SaCheckPermission("system:model:edit")
@Log(title = "系统模型", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysModelBo bo) {
return toAjax(sysModelService.updateByBo(bo));
}
/**
* 删除系统模型
*
* @param ids 主键串
*/
@SaCheckPermission("system:model:remove")
@Log(title = "系统模型", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(sysModelService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@@ -17,7 +17,7 @@ import java.math.BigDecimal;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("payment_orders")
@TableName("sys_pay_order")
public class PaymentOrders extends BaseEntity {
@Serial

View File

@@ -0,0 +1,68 @@
package com.xmzs.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xmzs.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 系统模型对象 sys_model
*
* @author Lion Li
* @date 2024-04-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_model")
public class SysModel extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 模型名称
*/
private String modelName;
/**
* 模型描述
*/
private String modelDescribe;
/**
* 模型价格
*/
private double modelPrice;
/**
* 计费类型
*/
private String modelType;
/**
* 是否显示
*/
private String modelShow;
/**
* 系统提示词
*/
private String systemPrompt;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,73 @@
package com.xmzs.system.domain.bo;
import com.xmzs.common.core.validate.AddGroup;
import com.xmzs.common.core.validate.EditGroup;
import com.xmzs.common.mybatis.core.domain.BaseEntity;
import com.xmzs.system.domain.SysModel;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 系统模型业务对象 sys_model
*
* @author Lion Li
* @date 2024-04-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = SysModel.class, reverseConvertGenerate = false)
public class SysModelBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelName;
/**
* 模型描述
*/
@NotBlank(message = "模型描述不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelDescribe;
/**
* 模型价格
*/
@NotNull(message = "模型价格不能为空", groups = { AddGroup.class, EditGroup.class })
private double modelPrice;
/**
* 计费类型 (1 token扣费; 2 次数扣费 )
*/
@NotBlank(message = "计费类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelType;
/**
* 模型状态 (0 显示; 1 隐藏 )
*/
private String modelShow;
/**
* 系统提示词
*/
private String systemPrompt;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

View File

@@ -0,0 +1,76 @@
package com.xmzs.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.xmzs.system.domain.SysModel;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 系统模型视图对象 sys_model
*
* @author Lion Li
* @date 2024-04-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = SysModel.class)
public class SysModelVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 模型名称
*/
@ExcelProperty(value = "模型名称")
private String modelName;
/**
* 模型描述
*/
@ExcelProperty(value = "模型描述")
private String modelDescribe;
/**
* 模型价格
*/
@ExcelProperty(value = "模型价格")
private double modelPrice;
/**
* 计费类型
*/
@ExcelProperty(value = "计费类型")
private String modelType;
/**
* 是否显示
*/
private String modelShow;
/**
* 系统提示词
*/
private String systemPrompt;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -4,14 +4,16 @@ package com.xmzs.system.listener;
import cn.hutool.core.collection.CollectionUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xmzs.common.chat.config.LocalCache;
import com.xmzs.common.chat.entity.chat.ChatCompletion;
import com.xmzs.common.chat.entity.chat.ChatCompletionResponse;
import com.xmzs.common.chat.utils.TikTokensUtil;
import com.xmzs.common.core.utils.SpringUtils;
import com.xmzs.common.core.utils.StringUtils;
import com.xmzs.system.domain.bo.ChatMessageBo;
import com.xmzs.system.domain.bo.SysModelBo;
import com.xmzs.system.domain.vo.SysModelVo;
import com.xmzs.system.service.IChatMessageService;
import com.xmzs.system.service.IChatService;
import com.xmzs.system.service.IChatCostService;
import com.xmzs.system.service.ISysModelService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -24,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.util.List;
import java.util.Objects;
/**
@@ -45,7 +48,7 @@ public class SSEEventSourceListener extends EventSourceListener {
public SSEEventSourceListener(ResponseBodyEmitter emitter) {
this.emitter = emitter;
}
private static final ISysModelService sysModelService = SpringUtils.getBean(ISysModelService.class);
private String modelName;
/**
* {@inheritDoc}
@@ -66,34 +69,34 @@ public class SSEEventSourceListener extends EventSourceListener {
//成功响应
emitter.complete();
if(StringUtils.isNotEmpty(modelName)){
IChatService IChatService = SpringUtils.context().getBean(IChatService.class);
IChatCostService IChatCostService = SpringUtils.context().getBean(IChatCostService.class);
IChatMessageService chatMessageService = SpringUtils.context().getBean(IChatMessageService.class);
ChatMessageBo chatMessageBo = new ChatMessageBo();
chatMessageBo.setModelName(modelName);
chatMessageBo.setContent(stringBuffer.toString());
Long userId = (Long)LocalCache.CACHE.get("userId");
chatMessageBo.setUserId(userId);
if(ChatCompletion.Model.GPT_4_ALL.getName().equals(modelName)
|| modelName.startsWith(ChatCompletion.Model.GPT_4_GIZMO.getName())
|| modelName.startsWith(ChatCompletion.Model.NET.getName())
|| ChatCompletion.Model.GPT_4_VISION_PREVIEW.getName().equals(modelName)
|| ChatCompletion.Model.CLAUDE_3_SONNET.getName().equals(modelName)
|| ChatCompletion.Model.STABLE_DIFFUSION.getName().equals(modelName)
|| ChatCompletion.Model.SUNO_V3.getName().equals(modelName)
){
chatMessageBo.setDeductCost(0.0);
chatMessageBo.setTotalTokens(0);
//查询按次数扣费的模型
SysModelBo sysModelBo = new SysModelBo();
sysModelBo.setModelType("2");
sysModelBo.setModelName(modelName);
List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
if (CollectionUtil.isNotEmpty(sysModelList)){
chatMessageBo.setDeductCost(0d);
chatMessageBo.setRemark("提问时扣费");
// 保存消息记录
chatMessageService.insertByBo(chatMessageBo);
}else {
// 扣除余额
}else{
int tokens = TikTokensUtil.tokens(modelName,stringBuffer.toString());
chatMessageBo.setTotalTokens(tokens);
IChatService.deductToken(chatMessageBo);
// 按token扣费并且保存消息记录
IChatCostService.deductToken(chatMessageBo);
}
}
return;
}
// 解析返回内容
ObjectMapper mapper = new ObjectMapper();
ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class);
if(completionResponse == null || CollectionUtil.isEmpty(completionResponse.getChoices())){

View File

@@ -0,0 +1,15 @@
package com.xmzs.system.mapper;
import com.xmzs.common.mybatis.core.mapper.BaseMapperPlus;
import com.xmzs.system.domain.SysModel;
import com.xmzs.system.domain.vo.SysModelVo;
/**
* 系统模型Mapper接口
*
* @author Lion Li
* @date 2024-04-04
*/
public interface SysModelMapper extends BaseMapperPlus<SysModel, SysModelVo> {
}

View File

@@ -0,0 +1,37 @@
package com.xmzs.system.service;
import com.xmzs.system.domain.bo.ChatMessageBo;
public interface IChatCostService {
/**
* 根据消耗的tokens扣除余额
*
* @param chatMessageBo
* @return 结果
*/
void deductToken(ChatMessageBo chatMessageBo);
/**
* 扣除用户的余额
*
*/
void deductUserBalance(Long userId, Double numberCost);
/**
* 扣除任务费用并且保存记录
*
* @param type 任务类型
* @param prompt 任务描述
* @param cost 扣除费用
*/
void taskDeduct(String type,String prompt, double cost);
/**
* 判断用户是否付费
*/
void checkUserGrade();
}

View File

@@ -0,0 +1,48 @@
package com.xmzs.system.service;
import com.xmzs.common.mybatis.core.page.PageQuery;
import com.xmzs.common.mybatis.core.page.TableDataInfo;
import com.xmzs.system.domain.bo.SysModelBo;
import com.xmzs.system.domain.vo.SysModelVo;
import java.util.Collection;
import java.util.List;
/**
* 系统模型Service接口
*
* @author Lion Li
* @date 2024-04-04
*/
public interface ISysModelService {
/**
* 查询系统模型
*/
SysModelVo queryById(Long id);
/**
* 查询系统模型列表
*/
TableDataInfo<SysModelVo> queryPageList(SysModelBo bo, PageQuery pageQuery);
/**
* 查询系统模型列表
*/
List<SysModelVo> queryList(SysModelBo bo);
/**
* 新增系统模型
*/
Boolean insertByBo(SysModelBo bo);
/**
* 修改系统模型
*/
Boolean updateByBo(SysModelBo bo);
/**
* 校验并批量删除系统模型信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,160 @@
package com.xmzs.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xmzs.common.core.domain.model.LoginUser;
import com.xmzs.common.core.exception.ServiceException;
import com.xmzs.common.core.exception.base.BaseException;
import com.xmzs.common.satoken.utils.LoginHelper;
import com.xmzs.system.domain.ChatToken;
import com.xmzs.system.domain.SysUser;
import com.xmzs.system.domain.bo.ChatMessageBo;
import com.xmzs.system.domain.bo.SysModelBo;
import com.xmzs.system.domain.vo.SysModelVo;
import com.xmzs.system.mapper.SysUserMapper;
import com.xmzs.system.service.IChatCostService;
import com.xmzs.system.service.IChatMessageService;
import com.xmzs.system.service.IChatTokenService;
import com.xmzs.system.service.ISysModelService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.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("免费用户暂时不支持此模型,请切换gpt-3.5-turbo模型或者点击《进入市场选购您的商品》充值后使用!");
}
}
/**
* 获取用户Id
*
* @return
*/
public Long getUserId() {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new BaseException("用户未登录!");
}
return loginUser.getUserId();
}
}

View File

@@ -1,5 +1,6 @@
package com.xmzs.system.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.xmzs.common.chat.config.LocalCache;
import com.xmzs.common.chat.constant.OpenAIConst;
import com.xmzs.common.chat.domain.request.ChatRequest;
@@ -15,14 +16,18 @@ import com.xmzs.common.chat.openai.OpenAiStreamClient;
import com.xmzs.common.chat.utils.TikTokensUtil;
import com.xmzs.common.core.domain.model.LoginUser;
import com.xmzs.common.core.exception.base.BaseException;
import com.xmzs.common.core.utils.StringUtils;
import com.xmzs.common.satoken.utils.LoginHelper;
import com.xmzs.system.domain.SysUser;
import com.xmzs.system.domain.bo.ChatMessageBo;
import com.xmzs.system.domain.bo.SysModelBo;
import com.xmzs.system.domain.vo.SysModelVo;
import com.xmzs.system.listener.SSEEventSourceListener;
import com.xmzs.system.mapper.SysUserMapper;
import com.xmzs.system.service.IChatCostService;
import com.xmzs.system.service.IChatMessageService;
import com.xmzs.system.service.IChatService;
import com.xmzs.system.service.ISseService;
import com.xmzs.system.service.ISysModelService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.ResponseBody;
@@ -58,13 +63,14 @@ public class SseServiceImpl implements ISseService {
private final OpenAiStreamClient openAiStreamClient;
private final IChatService IChatService;
private final IChatCostService chatService;
private final SysUserMapper sysUserMapper;
private final IChatMessageService chatMessageService;
private final ISysModelService sysModelService;
@Value("${chat.apiKey}")
private String apiKey;
@Value("${chat.apiHost}")
@@ -91,33 +97,35 @@ public class SseServiceImpl implements ISseService {
// 判断用户是否付费
checkUserGrade();
}
// 按次数扣费
if(ChatCompletion.Model.GPT_4_ALL.getName().equals(chatRequest.getModel())
|| chatRequest.getModel().startsWith(ChatCompletion.Model.GPT_4_GIZMO.getName())
|| chatRequest.getModel().startsWith(ChatCompletion.Model.NET.getName())
|| ChatCompletion.Model.GPT_4_VISION_PREVIEW.getName().equals(chatRequest.getModel())
|| ChatCompletion.Model.CLAUDE_3_SONNET.getName().equals(chatRequest.getModel())
|| ChatCompletion.Model.STABLE_DIFFUSION.getName().equals(chatRequest.getModel())
|| ChatCompletion.Model.SUNO_V3.getName().equals(chatRequest.getModel())
){
double cost = OpenAIConst.GPT4_COST;
if(ChatCompletion.Model.STABLE_DIFFUSION.getName().equals(chatRequest.getModel())){
cost = 0.1;
//根据模型名称查询模型信息
SysModelBo sysModelBo = new SysModelBo();
sysModelBo.setModelName(chatRequest.getModel());
List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
if (CollectionUtil.isEmpty(sysModelList)) {
// 如果模型不存在默认使用token扣费方式
processByToken(chatRequest.getModel(), msgList, chatMessageBo);
} else {
// 模型设置默认提示词
SysModelVo firstModel = sysModelList.get(0);
if (StringUtils.isNotEmpty(firstModel.getSystemPrompt())) {
Message sysMessage = Message.builder().content(firstModel.getSystemPrompt()).role(Message.Role.SYSTEM).build();
// 假设 msgList 不为空并且至少有一个元素
if (msgList.get(0).equals(sysMessage)) {
// 如果第一个元素与sysMessage相等替换第一个元素
msgList.set(0, sysMessage);
} else {
// 如果不相等将sysMessage插入到列表的第一个位置
msgList.add(0, sysMessage);
}
}
if(ChatCompletion.Model.SUNO_V3.getName().equals(chatRequest.getModel())){
cost = 0.5;
// 计费类型: 1 token扣费 2 次数扣费
if ("2".equals(firstModel.getModelType())) {
processByModelPrice(firstModel, chatMessageBo);
} else {
processByToken(chatRequest.getModel(), msgList, chatMessageBo);
}
IChatService.deductUserBalance(getUserId(), cost);
chatMessageBo.setDeductCost(cost);
// 保存消息记录
chatMessageService.insertByBo(chatMessageBo);
}else {
int tokens = TikTokensUtil.tokens(chatRequest.getModel(), msgList);
chatMessageBo.setTotalTokens(tokens);
// 按token扣费并且保存消息记录
IChatService.deductToken(chatMessageBo);
}
}catch (Exception e){
} catch (Exception e) {
sendErrorEvent(sseEmitter, e.getMessage());
return sseEmitter;
}
@@ -147,6 +155,32 @@ public class SseServiceImpl implements ISseService {
return sseEmitter;
}
/**
* 根据次数扣除余额
*
* @param model 模型信息
* @param chatMessageBo 对话信息
*/
private void processByModelPrice(SysModelVo model, ChatMessageBo chatMessageBo) {
double cost = model.getModelPrice();
chatService.deductUserBalance(getUserId(), cost);
chatMessageBo.setDeductCost(cost);
chatMessageService.insertByBo(chatMessageBo);
}
/**
* 根据token扣除余额
*
* @param modelName 模型名称
* @param msgList 消息列表
* @param chatMessageBo 消息记录
*/
private void processByToken(String modelName, List<Message> msgList, ChatMessageBo chatMessageBo) {
int tokens = TikTokensUtil.tokens(modelName, msgList);
chatMessageBo.setTotalTokens(tokens);
chatService.deductToken(chatMessageBo);
}
/**
* 文字转语音
*
@@ -225,9 +259,9 @@ public class SseServiceImpl implements ISseService {
// 扣除费用
if(Objects.equals(request.getSize(), "1792x1024") || Objects.equals(request.getSize(), "1024x1792")){
IChatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_HD_COST);
chatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_HD_COST);
}else {
IChatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_COST);
chatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_COST);
}
// 保存消息记录
ChatMessageBo chatMessageBo = new ChatMessageBo();

View File

@@ -96,7 +96,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
* @param dictType 字典类型
* @return 字典数据集合信息
*/
@Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
// @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
@Override
public List<SysDictDataVo> selectDictDataByType(String dictType) {
List<SysDictDataVo> dictDatas = dictDataMapper.selectDictDataByType(dictType);

View File

@@ -0,0 +1,110 @@
package com.xmzs.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 com.xmzs.common.core.utils.MapstructUtils;
import com.xmzs.common.core.utils.StringUtils;
import com.xmzs.common.mybatis.core.page.PageQuery;
import com.xmzs.common.mybatis.core.page.TableDataInfo;
import com.xmzs.system.domain.SysModel;
import com.xmzs.system.domain.bo.SysModelBo;
import com.xmzs.system.domain.vo.SysModelVo;
import com.xmzs.system.mapper.SysModelMapper;
import com.xmzs.system.service.ISysModelService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
/**
* 系统模型Service业务层处理
*
* @author Lion Li
* @date 2024-04-04
*/
@RequiredArgsConstructor
@Service
public class SysModelServiceImpl implements ISysModelService {
private final SysModelMapper baseMapper;
/**
* 查询系统模型
*/
@Override
public SysModelVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询系统模型列表
*/
@Override
public TableDataInfo<SysModelVo> queryPageList(SysModelBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SysModel> lqw = buildQueryWrapper(bo);
Page<SysModelVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询系统模型列表
*/
@Override
public List<SysModelVo> queryList(SysModelBo bo) {
LambdaQueryWrapper<SysModel> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<SysModel> buildQueryWrapper(SysModelBo bo) {
LambdaQueryWrapper<SysModel> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getModelName()), SysModel::getModelName, bo.getModelName());
lqw.like(StringUtils.isNotBlank(bo.getModelShow()), SysModel::getModelShow, bo.getModelShow());
lqw.eq(StringUtils.isNotBlank(bo.getModelDescribe()), SysModel::getModelDescribe, bo.getModelDescribe());
lqw.eq(StringUtils.isNotBlank(bo.getModelType()), SysModel::getModelType, bo.getModelType());
return lqw;
}
/**
* 新增系统模型
*/
@Override
public Boolean insertByBo(SysModelBo bo) {
SysModel add = MapstructUtils.convert(bo, SysModel.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改系统模型
*/
@Override
public Boolean updateByBo(SysModelBo bo) {
SysModel update = MapstructUtils.convert(bo, SysModel.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(SysModel entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除系统模型
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -78,6 +78,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
.eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId())
.eq(ObjectUtil.isNotNull(user.getUserGrade()), "u.user_grade", user.getUserGrade())
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
@@ -324,9 +325,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
@Transactional(rollbackFor = Exception.class)
public int updateUser(SysUserBo user) {
// 新增用户与角色管理
insertUserRole(user, true);
//insertUserRole(user, true);
// 新增用户与岗位管理
insertUserPost(user, true);
//insertUserPost(user, true);
SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
// 防止错误更新后导致的数据误删除
int flag = baseMapper.updateById(sysUser);