feat: 积分先按aimanager配置扣减,任务终态时再回补

This commit is contained in:
yys 2026-04-13 09:53:37 +08:00
parent a67a8e202a
commit 982ce1f179
3 changed files with 34 additions and 25 deletions

View File

@ -4,7 +4,6 @@ import com.ruoyi.ai.domain.*;
import com.ruoyi.ai.service.*;
import com.ruoyi.api.request.ByteApiRequest;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.constant.BalanceChangerConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.request.video.dto.VideoTaskCallBackRequest;
@ -12,7 +11,6 @@ import com.ruoyi.common.core.response.video.GetVideoGenerationTaskResponse;
import com.ruoyi.common.enums.AiOrderStatusType;
import com.ruoyi.common.enums.VideoTaskStatusType;
import com.ruoyi.common.utils.RandomStringUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.TencentCosUtil;
import io.swagger.annotations.Api;
@ -20,12 +18,12 @@ import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

View File

@ -263,7 +263,7 @@ public class PortalVideoController extends BaseController {
private AjaxResult submitOrderAndCreate(PortalVideoGenRequest req, String mode, ByteBodyReq byteBodyReq) {
String functionType = resolveFunctionType(req);
// 判断余额是否足够aimanager里配置了最低限额创建订单
AiOrder aiOrder = aiOrderService.getAiOrder(functionType, false);
AiOrder aiOrder = aiOrderService.getAiOrder(functionType);
if (aiOrder == null) {
return AjaxResult.error(-1, "You have a low balance, please recharge");
}
@ -285,30 +285,33 @@ public class PortalVideoController extends BaseController {
aiOrder.setVideoGenRequestId(byteBodyRes.getRequestId());
// aiOrderService.orderSuccess(aiOrder);
aiOrderService.updateAiOrder(aiOrder);
// 逻辑暂时停用先不预扣 start !!!!!
// 查询任务详情按字节返回的预扣数量扣减
GetVideoGenerationTaskResponse task = byteService.getVideoGenerationTasks(thirdPartyOrderNumId, key);
if (task == null || task.getUsage() == null || task.getUsage().getTotalTokens() == null) {
return AjaxResult.error(-2, "generation failed, byte task's usage is null");
}
if (task.getUsage().getTotalTokens() <= 0) {
return AjaxResult.error(-2, "generation failed, byte task's totalTokens <= 0");
}
BigDecimal totalTokens = new BigDecimal(task.getUsage().getTotalTokens());
// 同步设置aiOrder以防在抛异常时数值没变
aiOrder.setPreDeductAmount(totalTokens);
aiOrder.setAmount(totalTokens);
// GetVideoGenerationTaskResponse task = byteService.getVideoGenerationTasks(thirdPartyOrderNumId, key);
// if (task == null || task.getUsage() == null || task.getUsage().getTotalTokens() == null) {
// return AjaxResult.error(-2, "generation failed, byte task's usage is null");
// }
// if (task.getUsage().getTotalTokens() <= 0) {
// return AjaxResult.error(-2, "generation failed, byte task's totalTokens <= 0");
// }
// BigDecimal totalTokens = new BigDecimal(task.getUsage().getTotalTokens());
// // 同步设置aiOrder以防在抛异常时数值没变
// aiOrder.setPreDeductAmount(totalTokens);
// aiOrder.setAmount(totalTokens);
// 设置订单信息
AiOrder updAiOrder = new AiOrder();
updAiOrder.setId(aiOrder.getId());
updAiOrder.setOrderNum(aiOrder.getOrderNum());
updAiOrder.setPreDeductAmount(totalTokens);
// AiOrder updAiOrder = new AiOrder();
// updAiOrder.setId(aiOrder.getId());
// updAiOrder.setOrderNum(aiOrder.getOrderNum());
// updAiOrder.setPreDeductAmount(totalTokens);
// 先设置成预扣数量等收到回调再改过来这样后续报表会比较准确
updAiOrder.setAmount(totalTokens);
aiOrderService.updateAiOrder(updAiOrder);
// updAiOrder.setAmount(totalTokens);
// aiOrderService.updateAiOrder(updAiOrder);
// 扣减余额
aiUserService.addUserBalance(aiOrder.getOrderNum(), SecurityUtils.getAiUserId()
, NumberUtil.mul(-1, totalTokens), aiOrderService.getChangerType(functionType));
// aiUserService.addUserBalance(aiOrder.getOrderNum(), SecurityUtils.getAiUserId()
// , NumberUtil.mul(-1, totalTokens), aiOrderService.getChangerType(functionType));
// 逻辑暂时停用先不预扣 start !!!!!
return AjaxResult.success(byteBodyRes);
} catch (Exception e) {
aiOrderService.orderFailure(aiOrder);

View File

@ -219,8 +219,10 @@ public class AiOrderServiceImpl implements IAiOrderService {
aiOrder.setRemark(remark);
aiOrderMapper.updateById(aiOrder);
Long userId = aiOrder.getUserId() != null ? aiOrder.getUserId() : SecurityUtils.getAiUserId();
// 变更值为0则不改余额没有流水
if (aiOrder.getAmount() != null && !aiOrder.getAmount().equals(new BigDecimal(0))) {
aiUserService.addUserBalance(aiOrder.getOrderNum(), userId, amount, BalanceChangerConstants.REFUND, remark);
}
}
@Override
@ -308,6 +310,7 @@ public class AiOrderServiceImpl implements IAiOrderService {
order.setAmount(realAmount);
// 订单状态
order.setStatus(AiOrderStatusType.FINISH.ordinal());
// 已回补
order.setIsBackfilled(1);
orderSuccess(order);
@ -322,6 +325,11 @@ public class AiOrderServiceImpl implements IAiOrderService {
BalanceChangerConstants.REFUND, TASK_SUCCESS_BALANCE_REMARK);
}
}
// 按实际用量扣减
// BigDecimal reduceAmount = NumberUtil.mul(-1, realAmount);
// aiUserService.addUserBalance(order.getOrderNum(), order.getUserId(), reduceAmount,
// BalanceChangerConstants.QUICK_VIDEO_GENERATION, TASK_SUCCESS_BALANCE_REMARK);
return AjaxResult.success("callback success");
}
}