'integer', 'target_id' => 'integer', 'param1' => 'integer', 'param2' => 'integer', 'quantity' => 'integer', 'extra_data' => 'json', ]; /** * 获取消耗项所属的消耗组 * * @return BelongsTo */ public function consumeGroup(): BelongsTo { return $this->belongsTo(GameConsumeGroup::class, 'group_id', 'id'); } /** * 获取消耗项名称(访问器) * * @return string */ public function getNameAttribute(): string { return $this->getTargetName(); } /** * 获取目标名称 * * @return string */ public function getTargetName(): string { switch ($this->consume_type) { case CONSUME_TYPE::ITEM->value: try { $itemModel = \App\Module\GameItems\Models\Item::find($this->target_id); return $itemModel ? $itemModel->name : "物品 (ID: {$this->target_id})"; } catch (\Exception $e) { return "物品 (ID: {$this->target_id})"; } case CONSUME_TYPE::CURRENCY->value: try { $currency = \App\Module\Fund\Models\FundCurrencyModel::find($this->target_id); return $currency ? $currency->name : "货币 (ID: {$this->target_id})"; } catch (\Exception $e) { return "货币 (ID: {$this->target_id})"; } case CONSUME_TYPE::FUND_CONFIG->value: try { $fund = \App\Module\Fund\Models\FundConfigModel::find($this->target_id); return $fund ? $fund->name : "账户种类 (ID: {$this->target_id})"; } catch (\Exception $e) { return "账户种类 (ID: {$this->target_id})"; } case CONSUME_TYPE::FUND_CONFIGS->value: try { $names = []; // 获取主账户种类名称 if ($this->target_id > 0) { $fund = \App\Module\Fund\Models\FundConfigModel::find($this->target_id); $names[] = $fund ? $fund->name : "账户种类 (ID: {$this->target_id})"; } // 获取额外账户种类名称 if (!empty($this->extra_data) && is_array($this->extra_data) && isset($this->extra_data['fund_config_ids']) && is_array($this->extra_data['fund_config_ids'])) { foreach ($this->extra_data['fund_config_ids'] as $id) { if (is_numeric($id) && $id > 0 && $id != $this->target_id) { $fund = \App\Module\Fund\Models\FundConfigModel::find($id); $names[] = $fund ? $fund->name : "账户种类 (ID: {$id})"; } } } return empty($names) ? "多账户种类 (未配置)" : "多账户种类: " . implode(', ', $names); } catch (\Exception $e) { return "多账户种类 (ID: {$this->target_id})"; } default: return "未知消耗类型 (ID: {$this->target_id})"; } } /** * 转换为 Deduct protobuf 对象 * * @return \Uraus\Kku\Common\Deduct */ public function toDeductObject(): \Uraus\Kku\Common\Deduct { $deduct = new \Uraus\Kku\Common\Deduct(); switch ($this->consume_type) { case CONSUME_TYPE::ITEM->value: // 创建物品扣除对象 $deductItem = new \Uraus\Kku\Common\DeductItem([ 'item_id' => $this->target_id, 'instance_id' => 0, // 默认为0,表示不指定实例 'quantity' => $this->quantity, ]); $deduct->setItems([$deductItem]); break; case CONSUME_TYPE::CURRENCY->value: case CONSUME_TYPE::FUND_CONFIG->value: // 创建代币扣除对象 $deductCoin = new \Uraus\Kku\Common\DeductCoin([ 'type' => $this->target_id, 'quantity' => $this->quantity, ]); $deduct->setCoins([$deductCoin]); break; case CONSUME_TYPE::FUND_CONFIGS->value: // 创建多个代币扣除对象 $deductCoins = []; // 获取账户种类ID列表 $fundConfigIds = []; if ($this->target_id > 0) { $fundConfigIds[] = $this->target_id; } if (!empty($this->extra_data) && is_array($this->extra_data) && isset($this->extra_data['fund_config_ids']) && is_array($this->extra_data['fund_config_ids'])) { foreach ($this->extra_data['fund_config_ids'] as $id) { if (is_numeric($id) && $id > 0 && !in_array($id, $fundConfigIds)) { $fundConfigIds[] = (int)$id; } } } // 为每个账户种类创建扣除对象 foreach ($fundConfigIds as $fundConfigId) { $deductCoins[] = new \Uraus\Kku\Common\DeductCoin([ 'type' => $fundConfigId, 'quantity' => $this->quantity, // 注意:这里是总量,实际扣除时会按顺序分配 ]); } $deduct->setCoins($deductCoins); break; } return $deduct; } }