Merge pull request #136 from Administratos-User/main

修复token不扣费和扣费异常的问题
This commit is contained in:
ageerle
2025-07-16 15:53:56 +08:00
committed by GitHub
3 changed files with 87 additions and 20 deletions

View File

@@ -61,4 +61,10 @@ public class ChatRequest {
*/
private String role;
/**
* 对话id(每个聊天窗口都不一样)
*/
private Long uuid;
}

View File

@@ -47,46 +47,57 @@ public class ChatCostServiceImpl implements IChatCostService {
*/
@Override
public void deductToken(ChatRequest chatRequest) {
if(chatRequest.getUserId()==null || chatRequest.getSessionId()==null){
return;
}
int tokens = TikTokensUtil.tokens(chatRequest.getModel(), chatRequest.getPrompt());
System.out.println("deductToken->本次提交token数 : "+tokens);
String modelName = chatRequest.getModel();
ChatMessageBo chatMessageBo = new ChatMessageBo();
// 设置用户id
chatMessageBo.setUserId(chatRequest.getUserId());
// 设置对话角色
chatMessageBo.setRole(chatRequest.getRole());
// 设置会话id
chatMessageBo.setSessionId(chatRequest.getSessionId());
// 设置对话角色
chatMessageBo.setRole(chatRequest.getRole());
// 设置对话内容
chatMessageBo.setContent(chatRequest.getPrompt());
// 计算总token数
// 设置模型名字
chatMessageBo.setModelName(chatRequest.getModel());
// 获得记录的累计token数
ChatUsageToken chatToken = chatTokenService.queryByUserId(chatMessageBo.getUserId(), modelName);
if (chatToken == null) {
chatToken = new ChatUsageToken();
chatToken.setToken(0);
}
// 计算总token数
int totalTokens = chatToken.getToken() + tokens;
// 如果总token数大于等于1000,进行费用扣除
if (totalTokens >= 1000) {
// 计算费用
int token1 = totalTokens / 1000;
int token2 = totalTokens % 1000;
if (token2 > 0) {
// 保存剩余tokens
chatToken.setModelName(modelName);
chatToken.setUserId(chatMessageBo.getUserId());
chatToken.setToken(token2);
chatTokenService.editToken(chatToken);
} else {
chatTokenService.resetToken(chatMessageBo.getUserId(), modelName);
}
//当前未付费token
int token = chatToken.getToken();
System.out.println("deductToken->未付费的token数 : "+token);
System.out.println("deductToken->本次提交+未付费token数 : "+totalTokens);
//扣费核心逻辑总token大于100就要对未结清的token进行扣费
if (totalTokens >= 100) {// 如果总token数大于等于100,进行费用扣除
ChatModelVo chatModelVo = chatModelService.selectModelByName(modelName);
double cost = chatModelVo.getModelPrice();
if (BillingType.TIMES.getCode().equals(chatModelVo.getModelType())) {
@@ -95,22 +106,42 @@ public class ChatCostServiceImpl implements IChatCostService {
chatMessageBo.setDeductCost(cost);
}else {
// 按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);
chatMessageBo.setDeductCost(numberCost);
// 保存剩余tokens
chatToken.setModelName(modelName);
chatToken.setUserId(chatMessageBo.getUserId());
chatToken.setToken(0);//因为判断大于100token直接全部计算扣除了所以这里直接=0就可以了
chatTokenService.editToken(chatToken);
}
} else {
deductUserBalance(chatMessageBo.getUserId(), 0.0);
//不满100Token,不需要进行扣费啊啊啊
//deductUserBalance(chatMessageBo.getUserId(), 0.0);
chatMessageBo.setDeductCost(0d);
chatMessageBo.setRemark("不满1kToken,计入下一次!");
chatMessageBo.setRemark("不满100Token,计入下一次!");
System.out.println("deductToken->不满100Token,计入下一次!");
chatToken.setToken(totalTokens);
chatToken.setModelName(chatMessageBo.getModelName());
chatToken.setUserId(chatMessageBo.getUserId());
chatTokenService.editToken(chatToken);
}
// 保存消息记录
chatMessageService.insertByBo(chatMessageBo);
System.out.println("deductToken->chatMessageService.insertByBo(: "+chatMessageBo);
System.out.println("----------------------------------------");
}
/**
@@ -121,15 +152,25 @@ public class ChatCostServiceImpl implements IChatCostService {
*/
@Override
public void deductUserBalance(Long userId, Double numberCost) {
SysUser sysUser = sysUserMapper.selectById(userId);
if (sysUser == null) {
return;
}
Double userBalance = sysUser.getUserBalance();
System.out.println("deductUserBalance->准备扣除numberCost: "+numberCost);
System.out.println("deductUserBalance->剩余金额userBalance: "+userBalance);
if (userBalance < numberCost || userBalance == 0) {
throw new ServiceException("余额不足, 请充值");
}
sysUserMapper.update(null,
new LambdaUpdateWrapper<SysUser>()
.set(SysUser::getUserBalance, Math.max(userBalance - numberCost, 0))

View File

@@ -81,6 +81,26 @@ public class SseServiceImpl implements ISseService {
chatRequest.setRole(Message.Role.USER.getName());
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);
chatRequest.setUserId(chatCostService.getUserId());