|
|
@@ -8,6 +8,9 @@ use App\Module\UrsPromotion\Models\UrsProfit;
|
|
|
use App\Module\UrsPromotion\Models\UrsTalentConfig;
|
|
|
use App\Module\UrsPromotion\Enums\UrsProfitType;
|
|
|
use App\Module\UrsPromotion\Enums\UrsPromotionRelationLevel;
|
|
|
+use App\Module\Game\Services\RewardService;
|
|
|
+use App\Module\GameItems\Services\ItemService;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
/**
|
|
|
@@ -84,14 +87,16 @@ class UrsProfitLogic
|
|
|
* @param int $userId 产生收益的用户ID
|
|
|
* @param string $sourceType 收益来源类型
|
|
|
* @param int $sourceId 收益来源ID
|
|
|
- * @param string $originalAmount 原始收益金额
|
|
|
+ * @param int $originalAmount 原始收益数量(整数)
|
|
|
+ * @param int $itemId 收获的物品ID
|
|
|
* @return array 分成记录
|
|
|
*/
|
|
|
public function distributePlantingReward(
|
|
|
int $userId,
|
|
|
string $sourceType,
|
|
|
int $sourceId,
|
|
|
- string $originalAmount
|
|
|
+ int $originalAmount,
|
|
|
+ int $itemId
|
|
|
): array {
|
|
|
$profits = [];
|
|
|
|
|
|
@@ -115,8 +120,9 @@ class UrsProfitLogic
|
|
|
$sourceType,
|
|
|
$sourceId,
|
|
|
$level,
|
|
|
- $originalAmount,
|
|
|
- $talentConfigs
|
|
|
+ $originalAmount, // 传递原始整数数量
|
|
|
+ $talentConfigs,
|
|
|
+ $itemId // 传递物品ID
|
|
|
);
|
|
|
|
|
|
if ($profit) {
|
|
|
@@ -227,25 +233,58 @@ class UrsProfitLogic
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // TODO: 这里需要根据奖励组ID获取具体的奖励金额
|
|
|
- // 暂时使用固定金额作为示例
|
|
|
- $rewardAmount = $this->getRewardAmountByGroupId($rewardGroupId);
|
|
|
-
|
|
|
- // 创建收益记录
|
|
|
- $profit = UrsProfit::create([
|
|
|
- 'user_id' => $referrerId,
|
|
|
- 'promotion_member_id' => $memberId,
|
|
|
- 'source_id' => $sourceId,
|
|
|
- 'source_type' => $sourceType,
|
|
|
- 'profit_type' => UrsProfitType::PROMOTION_REWARD->value,
|
|
|
- 'relation_level' => $relationLevel,
|
|
|
- 'original_amount' => '0', // 推广收益无原始金额概念
|
|
|
- 'profit_amount' => $rewardAmount,
|
|
|
- 'profit_rate' => 0, // 推广收益无比例概念
|
|
|
- 'reward_group_id' => $rewardGroupId,
|
|
|
- 'talent_level' => $talentLevel,
|
|
|
- 'status' => UrsProfit::STATUS_NORMAL,
|
|
|
- ]);
|
|
|
+ // 开启事务(奖励组系统要求在事务中执行)
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 使用奖励组系统发放奖励
|
|
|
+ $rewardResult = RewardService::grantReward(
|
|
|
+ $referrerId,
|
|
|
+ $rewardGroupId,
|
|
|
+ $sourceType,
|
|
|
+ $sourceId
|
|
|
+ );
|
|
|
+
|
|
|
+ if (!$rewardResult->success) {
|
|
|
+ DB::rollBack();
|
|
|
+ Log::error("推广奖励发放失败", [
|
|
|
+ 'referrer_id' => $referrerId,
|
|
|
+ 'reward_group_id' => $rewardGroupId,
|
|
|
+ 'error' => $rewardResult->errorMessage
|
|
|
+ ]);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算奖励总金额(用于记录)
|
|
|
+ $totalRewardAmount = $this->calculateTotalRewardAmount($rewardResult->items);
|
|
|
+
|
|
|
+ // 创建收益记录
|
|
|
+ $profit = UrsProfit::create([
|
|
|
+ 'user_id' => $referrerId,
|
|
|
+ 'promotion_member_id' => $memberId,
|
|
|
+ 'source_id' => $sourceId,
|
|
|
+ 'source_type' => $sourceType,
|
|
|
+ 'profit_type' => UrsProfitType::PROMOTION_REWARD->value,
|
|
|
+ 'relation_level' => $relationLevel,
|
|
|
+ 'original_amount' => '0', // 推广收益无原始金额概念
|
|
|
+ 'profit_amount' => $totalRewardAmount,
|
|
|
+ 'profit_rate' => 0, // 推广收益无比例概念
|
|
|
+ 'reward_group_id' => $rewardResult->groupId,
|
|
|
+ 'talent_level' => $talentLevel,
|
|
|
+ 'status' => UrsProfit::STATUS_NORMAL,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ Log::error("推广奖励发放事务失败", [
|
|
|
+ 'referrer_id' => $referrerId,
|
|
|
+ 'reward_group_id' => $rewardGroupId,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
Log::info("URS推广收益记录创建", [
|
|
|
'profit_id' => $profit->id,
|
|
|
@@ -254,22 +293,23 @@ class UrsProfitLogic
|
|
|
'relation_level' => $relationLevel,
|
|
|
'talent_level' => $talentLevel,
|
|
|
'reward_group_id' => $rewardGroupId,
|
|
|
- 'reward_amount' => $rewardAmount
|
|
|
+ 'reward_amount' => $totalRewardAmount
|
|
|
]);
|
|
|
|
|
|
return $profit;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 计算种植收益分成(按比例)
|
|
|
+ * 计算种植收益分成(按比例发放物品)
|
|
|
*
|
|
|
* @param int $referrerId 推荐人ID
|
|
|
* @param int $memberId 团队成员ID
|
|
|
* @param string $sourceType 收益来源类型
|
|
|
* @param int $sourceId 收益来源ID
|
|
|
* @param int $relationLevel 推荐层级
|
|
|
- * @param string $originalAmount 原始收益金额
|
|
|
+ * @param int $originalAmount 原始收益数量(整数)
|
|
|
* @param array $talentConfigs 达人等级配置
|
|
|
+ * @param int $itemId 收获的物品ID
|
|
|
* @return UrsProfit|null
|
|
|
*/
|
|
|
private function calculatePlantingReward(
|
|
|
@@ -278,8 +318,9 @@ class UrsProfitLogic
|
|
|
string $sourceType,
|
|
|
int $sourceId,
|
|
|
int $relationLevel,
|
|
|
- string $originalAmount,
|
|
|
- array $talentConfigs
|
|
|
+ int $originalAmount,
|
|
|
+ array $talentConfigs,
|
|
|
+ int $itemId
|
|
|
): ?UrsProfit {
|
|
|
// 获取推荐人的达人等级
|
|
|
$talent = UrsUserTalent::where('user_id', $referrerId)->first();
|
|
|
@@ -299,24 +340,74 @@ class UrsProfitLogic
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 计算分成金额
|
|
|
- $profitAmount = bcmul($originalAmount, (string)$profitRate, 10);
|
|
|
+ // 计算应该奖励的物品数量(向下取整)
|
|
|
+ $rewardQuantity = (int)floor($originalAmount * $profitRate);
|
|
|
+ if ($rewardQuantity <= 0) {
|
|
|
+ Log::debug("推荐人 {$referrerId} 计算出的奖励数量为0", [
|
|
|
+ 'original_amount' => $originalAmount,
|
|
|
+ 'profit_rate' => $profitRate,
|
|
|
+ 'calculated_quantity' => $originalAmount * $profitRate
|
|
|
+ ]);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
- // 创建收益记录
|
|
|
- $profit = UrsProfit::create([
|
|
|
- 'user_id' => $referrerId,
|
|
|
- 'promotion_member_id' => $memberId,
|
|
|
- 'source_id' => $sourceId,
|
|
|
- 'source_type' => $sourceType,
|
|
|
- 'profit_type' => UrsProfitType::PLANTING_REWARD->value,
|
|
|
- 'relation_level' => $relationLevel,
|
|
|
- 'original_amount' => $originalAmount,
|
|
|
- 'profit_amount' => $profitAmount,
|
|
|
- 'profit_rate' => $profitRate,
|
|
|
- 'reward_group_id' => null, // 种植收益不使用奖励组
|
|
|
- 'talent_level' => $talentLevel,
|
|
|
- 'status' => UrsProfit::STATUS_NORMAL,
|
|
|
- ]);
|
|
|
+ // 开启事务发放物品奖励
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 使用物品模块服务发放物品
|
|
|
+ $addResult = ItemService::addItem($referrerId, $itemId, $rewardQuantity, [
|
|
|
+ 'source_type' => $sourceType,
|
|
|
+ 'source_id' => $sourceId,
|
|
|
+ 'source' => 'urs_planting_reward',
|
|
|
+ 'details' => [
|
|
|
+ 'member_id' => $memberId,
|
|
|
+ 'relation_level' => $relationLevel,
|
|
|
+ 'talent_level' => $talentLevel,
|
|
|
+ 'profit_rate' => $profitRate,
|
|
|
+ 'original_amount' => $originalAmount
|
|
|
+ ]
|
|
|
+ ]);
|
|
|
+
|
|
|
+ if (!$addResult['success']) {
|
|
|
+ DB::rollBack();
|
|
|
+ Log::error("种植收益物品发放失败", [
|
|
|
+ 'referrer_id' => $referrerId,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'quantity' => $rewardQuantity,
|
|
|
+ 'error' => $addResult['message'] ?? '未知错误'
|
|
|
+ ]);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建收益记录
|
|
|
+ $profit = UrsProfit::create([
|
|
|
+ 'user_id' => $referrerId,
|
|
|
+ 'promotion_member_id' => $memberId,
|
|
|
+ 'source_id' => $sourceId,
|
|
|
+ 'source_type' => $sourceType,
|
|
|
+ 'profit_type' => UrsProfitType::PLANTING_REWARD->value,
|
|
|
+ 'relation_level' => $relationLevel,
|
|
|
+ 'original_amount' => (string)$originalAmount,
|
|
|
+ 'profit_amount' => (string)$rewardQuantity, // 记录实际发放的物品数量
|
|
|
+ 'profit_rate' => $profitRate,
|
|
|
+ 'reward_group_id' => null, // 种植收益不使用奖励组
|
|
|
+ 'talent_level' => $talentLevel,
|
|
|
+ 'status' => UrsProfit::STATUS_NORMAL,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ Log::error("种植收益发放事务失败", [
|
|
|
+ 'referrer_id' => $referrerId,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'quantity' => $rewardQuantity,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
Log::info("URS种植收益记录创建", [
|
|
|
'profit_id' => $profit->id,
|
|
|
@@ -325,7 +416,9 @@ class UrsProfitLogic
|
|
|
'relation_level' => $relationLevel,
|
|
|
'talent_level' => $talentLevel,
|
|
|
'profit_rate' => $profitRate,
|
|
|
- 'profit_amount' => $profitAmount
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'reward_quantity' => $rewardQuantity,
|
|
|
+ 'original_amount' => $originalAmount
|
|
|
]);
|
|
|
|
|
|
return $profit;
|
|
|
@@ -333,6 +426,64 @@ class UrsProfitLogic
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 计算奖励总金额(用于记录)
|
|
|
+ *
|
|
|
+ * @param array $rewardItems 奖励项列表
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ private function calculateTotalRewardAmount(array $rewardItems): string
|
|
|
+ {
|
|
|
+ $totalAmount = '0';
|
|
|
+
|
|
|
+ foreach ($rewardItems as $item) {
|
|
|
+ // 计算货币类型的奖励金额
|
|
|
+ if (in_array($item->rewardType, ['fund', 'currency', 'fund_config'])) {
|
|
|
+ $totalAmount = bcadd($totalAmount, (string)$item->quantity, 10);
|
|
|
+ }
|
|
|
+ // 计算物品类型的奖励价值(按物品售价计算,如果没有售价则按数量计算)
|
|
|
+ elseif ($item->rewardType === 'item') {
|
|
|
+ // 获取物品售价作为价值参考
|
|
|
+ $itemValue = $this->getItemValue($item->targetId);
|
|
|
+ $itemTotalValue = bcmul((string)$itemValue, (string)$item->quantity, 10);
|
|
|
+ $totalAmount = bcadd($totalAmount, $itemTotalValue, 10);
|
|
|
+ }
|
|
|
+ // 其他类型奖励按数量计算基础价值
|
|
|
+ else {
|
|
|
+ $totalAmount = bcadd($totalAmount, (string)$item->quantity, 10);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $totalAmount;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取物品价值(用于奖励金额计算)
|
|
|
+ *
|
|
|
+ * @param int $itemId 物品ID
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ private function getItemValue(int $itemId): string
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 查询物品售价
|
|
|
+ $item = \App\Module\GameItems\Models\Item::find($itemId);
|
|
|
+ if ($item && $item->sell_price > 0) {
|
|
|
+ return (string)$item->sell_price;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有售价,返回默认价值(可以根据物品类型调整)
|
|
|
+ return '1.0000000000';
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::warning("获取物品价值失败", [
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+ return '1.0000000000';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取推广收益奖励组ID
|
|
|
*
|
|
|
@@ -377,38 +528,7 @@ class UrsProfitLogic
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 根据奖励组ID获取奖励金额
|
|
|
- *
|
|
|
- * TODO: 这里需要集成奖励组系统,暂时使用固定金额
|
|
|
- *
|
|
|
- * @param int $rewardGroupId 奖励组ID
|
|
|
- * @return string
|
|
|
- */
|
|
|
- private function getRewardAmountByGroupId(int $rewardGroupId): string
|
|
|
- {
|
|
|
- // 暂时使用固定金额映射,实际应该从奖励组系统获取
|
|
|
- $rewardAmounts = [
|
|
|
- 1001 => '50.0000000000', // 初级达人直推奖励
|
|
|
- 1002 => '30.0000000000', // 初级达人间推奖励
|
|
|
- 1003 => '10.0000000000', // 初级达人三推奖励
|
|
|
- 1004 => '80.0000000000', // 中级达人直推奖励
|
|
|
- 1005 => '50.0000000000', // 中级达人间推奖励
|
|
|
- 1006 => '20.0000000000', // 中级达人三推奖励
|
|
|
- 1007 => '120.0000000000', // 高级达人直推奖励
|
|
|
- 1008 => '80.0000000000', // 高级达人间推奖励
|
|
|
- 1009 => '40.0000000000', // 高级达人三推奖励
|
|
|
- 1010 => '200.0000000000', // 资深达人直推奖励
|
|
|
- 1011 => '120.0000000000', // 资深达人间推奖励
|
|
|
- 1012 => '60.0000000000', // 资深达人三推奖励
|
|
|
- 1013 => '300.0000000000', // 顶级达人直推奖励
|
|
|
- 1014 => '200.0000000000', // 顶级达人间推奖励
|
|
|
- 1015 => '100.0000000000', // 顶级达人三推奖励
|
|
|
- ];
|
|
|
|
|
|
- return $rewardAmounts[$rewardGroupId] ?? '0.0000000000';
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取用户的收益统计
|
|
|
*
|