target_id; $amount = $consumeItem->quantity * $multiplier; // 使用倍数计算所需金额 // 获取用户账户 $account = FundLogic::get_account($userId, $fundConfigId); // 检查账户是否存在 if ($account === false) { return Res::error("用户没有该账户种类", [ 'fund_config_id' => $fundConfigId ]); } // 检查余额是否足够 if ($account->balance < $amount) { return Res::error("账户余额不足,需要 {$amount},实际 {$account->balance}", [ 'fund_config_id' => $fundConfigId, 'required' => $amount, 'actual' => $account->balance ]); } return Res::success('账户余额足够', [ 'fund_config_id' => $fundConfigId, 'required' => $amount, 'actual' => $account->balance ]); } /** * 执行账户种类消耗 * * 注意:这里的target_id指向fund_config表的id(账户种类ID) * * @param int $userId 用户ID * @param GameConsumeItem $consumeItem 消耗项 * @param string $source 消耗来源 * @param int $sourceId 消耗来源ID * @param float $multiplier 倍数,用于执行几倍消耗,默认为1 * @return Res 执行结果 */ public static function process(int $userId, GameConsumeItem $consumeItem, string $source, int $sourceId,$multiplier): Res { $fundConfigId = $consumeItem->target_id; $amount = -($consumeItem->quantity * $multiplier); // 使用倍数计算实际消耗金额,负数表示消耗 // 构建备注 $remark = "消耗组:{$consumeItem->group_id},来源:{$source}"; if ($sourceId > 0) { $remark .= ",ID:{$sourceId}"; } if ($multiplier != 1.0) { $remark .= ",倍数:{$multiplier}"; } // 消耗账户资金 $result = FundLogic::handle( $userId, $fundConfigId, $amount, FUND_LOG_TYPE::TRADE, // 使用TRADE类型,因为CONSUME可能不存在 $sourceId, $remark ); if ($result !== true) { $errorMessage = is_string($result) ? $result : '账户资金消耗失败'; return Res::error($errorMessage, [ 'fund_config_id' => $fundConfigId, 'amount' => abs($amount) ]); } return Res::success('账户资金消耗成功', [ 'fund_config_id' => $fundConfigId, 'amount' => abs($amount) ]); } }