mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-03-29 12:33:44 +08:00
Merge pull request #136 from Administratos-User/main
修复token不扣费和扣费异常的问题
This commit is contained in:
@@ -61,4 +61,10 @@ public class ChatRequest {
|
|||||||
*/
|
*/
|
||||||
private String role;
|
private String role;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对话id(每个聊天窗口都不一样)
|
||||||
|
*/
|
||||||
|
private Long uuid;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,46 +47,57 @@ public class ChatCostServiceImpl implements IChatCostService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void deductToken(ChatRequest chatRequest) {
|
public void deductToken(ChatRequest chatRequest) {
|
||||||
|
|
||||||
|
|
||||||
if(chatRequest.getUserId()==null || chatRequest.getSessionId()==null){
|
if(chatRequest.getUserId()==null || chatRequest.getSessionId()==null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int tokens = TikTokensUtil.tokens(chatRequest.getModel(), chatRequest.getPrompt());
|
int tokens = TikTokensUtil.tokens(chatRequest.getModel(), chatRequest.getPrompt());
|
||||||
|
|
||||||
|
System.out.println("deductToken->本次提交token数 : "+tokens);
|
||||||
|
|
||||||
String modelName = chatRequest.getModel();
|
String modelName = chatRequest.getModel();
|
||||||
|
|
||||||
ChatMessageBo chatMessageBo = new ChatMessageBo();
|
ChatMessageBo chatMessageBo = new ChatMessageBo();
|
||||||
|
|
||||||
// 设置用户id
|
// 设置用户id
|
||||||
chatMessageBo.setUserId(chatRequest.getUserId());
|
chatMessageBo.setUserId(chatRequest.getUserId());
|
||||||
// 设置对话角色
|
|
||||||
chatMessageBo.setRole(chatRequest.getRole());
|
|
||||||
// 设置会话id
|
// 设置会话id
|
||||||
chatMessageBo.setSessionId(chatRequest.getSessionId());
|
chatMessageBo.setSessionId(chatRequest.getSessionId());
|
||||||
|
|
||||||
|
// 设置对话角色
|
||||||
|
chatMessageBo.setRole(chatRequest.getRole());
|
||||||
|
|
||||||
// 设置对话内容
|
// 设置对话内容
|
||||||
chatMessageBo.setContent(chatRequest.getPrompt());
|
chatMessageBo.setContent(chatRequest.getPrompt());
|
||||||
|
|
||||||
// 计算总token数
|
// 设置模型名字
|
||||||
|
chatMessageBo.setModelName(chatRequest.getModel());
|
||||||
|
|
||||||
|
// 获得记录的累计token数
|
||||||
ChatUsageToken chatToken = chatTokenService.queryByUserId(chatMessageBo.getUserId(), modelName);
|
ChatUsageToken chatToken = chatTokenService.queryByUserId(chatMessageBo.getUserId(), modelName);
|
||||||
|
|
||||||
|
|
||||||
if (chatToken == null) {
|
if (chatToken == null) {
|
||||||
chatToken = new ChatUsageToken();
|
chatToken = new ChatUsageToken();
|
||||||
chatToken.setToken(0);
|
chatToken.setToken(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 计算总token数
|
||||||
int totalTokens = chatToken.getToken() + tokens;
|
int totalTokens = chatToken.getToken() + tokens;
|
||||||
// 如果总token数大于等于1000,进行费用扣除
|
|
||||||
if (totalTokens >= 1000) {
|
//当前未付费token
|
||||||
// 计算费用
|
int token = chatToken.getToken();
|
||||||
int token1 = totalTokens / 1000;
|
|
||||||
int token2 = totalTokens % 1000;
|
System.out.println("deductToken->未付费的token数 : "+token);
|
||||||
if (token2 > 0) {
|
System.out.println("deductToken->本次提交+未付费token数 : "+totalTokens);
|
||||||
// 保存剩余tokens
|
|
||||||
chatToken.setModelName(modelName);
|
|
||||||
chatToken.setUserId(chatMessageBo.getUserId());
|
//扣费核心逻辑(总token大于100就要对未结清的token进行扣费)
|
||||||
chatToken.setToken(token2);
|
if (totalTokens >= 100) {// 如果总token数大于等于100,进行费用扣除
|
||||||
chatTokenService.editToken(chatToken);
|
|
||||||
} else {
|
|
||||||
chatTokenService.resetToken(chatMessageBo.getUserId(), modelName);
|
|
||||||
}
|
|
||||||
ChatModelVo chatModelVo = chatModelService.selectModelByName(modelName);
|
ChatModelVo chatModelVo = chatModelService.selectModelByName(modelName);
|
||||||
double cost = chatModelVo.getModelPrice();
|
double cost = chatModelVo.getModelPrice();
|
||||||
if (BillingType.TIMES.getCode().equals(chatModelVo.getModelType())) {
|
if (BillingType.TIMES.getCode().equals(chatModelVo.getModelType())) {
|
||||||
@@ -95,22 +106,42 @@ public class ChatCostServiceImpl implements IChatCostService {
|
|||||||
chatMessageBo.setDeductCost(cost);
|
chatMessageBo.setDeductCost(cost);
|
||||||
}else {
|
}else {
|
||||||
// 按token扣费
|
// 按token扣费
|
||||||
Double numberCost = token1 * cost;
|
Double numberCost = totalTokens * cost;
|
||||||
|
System.out.println("deductToken->按token扣费 计算token数量: "+totalTokens);
|
||||||
|
System.out.println("deductToken->按token扣费 每token的价格: "+cost);
|
||||||
|
|
||||||
deductUserBalance(chatMessageBo.getUserId(), numberCost);
|
deductUserBalance(chatMessageBo.getUserId(), numberCost);
|
||||||
chatMessageBo.setDeductCost(numberCost);
|
chatMessageBo.setDeductCost(numberCost);
|
||||||
|
|
||||||
|
// 保存剩余tokens
|
||||||
|
chatToken.setModelName(modelName);
|
||||||
|
chatToken.setUserId(chatMessageBo.getUserId());
|
||||||
|
chatToken.setToken(0);//因为判断大于100token直接全部计算扣除了所以这里直接=0就可以了
|
||||||
|
chatTokenService.editToken(chatToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
deductUserBalance(chatMessageBo.getUserId(), 0.0);
|
//不满100Token,不需要进行扣费啊啊啊
|
||||||
|
//deductUserBalance(chatMessageBo.getUserId(), 0.0);
|
||||||
chatMessageBo.setDeductCost(0d);
|
chatMessageBo.setDeductCost(0d);
|
||||||
chatMessageBo.setRemark("不满1kToken,计入下一次!");
|
chatMessageBo.setRemark("不满100Token,计入下一次!");
|
||||||
|
System.out.println("deductToken->不满100Token,计入下一次!");
|
||||||
chatToken.setToken(totalTokens);
|
chatToken.setToken(totalTokens);
|
||||||
chatToken.setModelName(chatMessageBo.getModelName());
|
chatToken.setModelName(chatMessageBo.getModelName());
|
||||||
chatToken.setUserId(chatMessageBo.getUserId());
|
chatToken.setUserId(chatMessageBo.getUserId());
|
||||||
chatTokenService.editToken(chatToken);
|
chatTokenService.editToken(chatToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 保存消息记录
|
// 保存消息记录
|
||||||
chatMessageService.insertByBo(chatMessageBo);
|
chatMessageService.insertByBo(chatMessageBo);
|
||||||
|
|
||||||
|
System.out.println("deductToken->chatMessageService.insertByBo(: "+chatMessageBo);
|
||||||
|
System.out.println("----------------------------------------");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,15 +152,25 @@ public class ChatCostServiceImpl implements IChatCostService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void deductUserBalance(Long userId, Double numberCost) {
|
public void deductUserBalance(Long userId, Double numberCost) {
|
||||||
|
|
||||||
SysUser sysUser = sysUserMapper.selectById(userId);
|
SysUser sysUser = sysUserMapper.selectById(userId);
|
||||||
if (sysUser == null) {
|
if (sysUser == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Double userBalance = sysUser.getUserBalance();
|
Double userBalance = sysUser.getUserBalance();
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println("deductUserBalance->准备扣除:numberCost: "+numberCost);
|
||||||
|
System.out.println("deductUserBalance->剩余金额:userBalance: "+userBalance);
|
||||||
|
|
||||||
|
|
||||||
if (userBalance < numberCost || userBalance == 0) {
|
if (userBalance < numberCost || userBalance == 0) {
|
||||||
throw new ServiceException("余额不足, 请充值");
|
throw new ServiceException("余额不足, 请充值");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sysUserMapper.update(null,
|
sysUserMapper.update(null,
|
||||||
new LambdaUpdateWrapper<SysUser>()
|
new LambdaUpdateWrapper<SysUser>()
|
||||||
.set(SysUser::getUserBalance, Math.max(userBalance - numberCost, 0))
|
.set(SysUser::getUserBalance, Math.max(userBalance - numberCost, 0))
|
||||||
|
|||||||
@@ -81,6 +81,26 @@ public class SseServiceImpl implements ISseService {
|
|||||||
chatRequest.setRole(Message.Role.USER.getName());
|
chatRequest.setRole(Message.Role.USER.getName());
|
||||||
|
|
||||||
if(LoginHelper.isLogin()){
|
if(LoginHelper.isLogin()){
|
||||||
|
|
||||||
|
// 设置用户id
|
||||||
|
chatRequest.setUserId(LoginHelper.getUserId());
|
||||||
|
|
||||||
|
|
||||||
|
//待优化的地方 (这里请前端提交send的时候传递uuid进来或者sessionId)
|
||||||
|
//待优化的地方 (这里请前端提交send的时候传递uuid进来或者sessionId)
|
||||||
|
//待优化的地方 (这里请前端提交send的时候传递uuid进来或者sessionId)
|
||||||
|
{
|
||||||
|
// 设置会话id
|
||||||
|
if (chatRequest.getUuid() == null){
|
||||||
|
//暂时随机生成会话id
|
||||||
|
chatRequest.setSessionId(System.currentTimeMillis());
|
||||||
|
}else{
|
||||||
|
//这里或许需要修改一下,这里应该用uuid 或者 前端传递 sessionId
|
||||||
|
chatRequest.setSessionId(chatRequest.getUuid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 保存消息记录 并扣除费用
|
// 保存消息记录 并扣除费用
|
||||||
chatCostService.deductToken(chatRequest);
|
chatCostService.deductToken(chatRequest);
|
||||||
chatRequest.setUserId(chatCostService.getUserId());
|
chatRequest.setUserId(chatCostService.getUserId());
|
||||||
|
|||||||
Reference in New Issue
Block a user