Files
chatroom/app/Services/MarriageConfigService.php
lkddi 2d07b032d9 功能:婚姻系统第4-6步(Services + Models)
Step 4 - MarriageConfigService:
- 带60min Cache 的配置读取/写入
- 支持单项/分组/全量读取,管理员保存后自动清缓存

Step 5 - MarriageIntimacyService:
- 亲密度增加 + 日志写入 + 等级自动更新
- Redis 每日上限计数器(各来源独立控制)
- onFlowerSent/onPrivateChat/onlineTick 接入点方法
- dailyBatch 批量处理(Horizon Job 用)

Step 6 - MarriageService(核心业务):
- propose/accept/reject/divorce/confirmDivorce/forceDissolve
- 所有金币魅力通过 UserCurrencyService 统一记账
- 冷静期检查/超时处理/强制离婚金币全转对方

Models 改良(Marriage/MarriageConfig/MarriageIntimacyLog)
2026-03-01 15:03:34 +08:00

113 lines
3.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:婚姻参数配置服务
*
* 提供带缓存的婚姻系统参数读取与写入接口。
* 管理员修改参数后自动清除缓存,所有婚姻相关 Service 均通过此类读取配置,
* 不在代码中硬编码任何奖惩数值。
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Services;
use App\Models\MarriageConfig;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
class MarriageConfigService
{
/** 缓存 KEY 前缀 */
private const CACHE_PREFIX = 'marriage_config:';
/** 缓存 TTL分钟 */
private const CACHE_TTL = 60;
/** 全量缓存 KEY分组展示用 */
private const ALL_CACHE_KEY = 'marriage_config:__all__';
/**
* 读取单个配置值(带缓存)。
*
* @param string $key 配置键名
* @param int $default 找不到时的默认值
*/
public function get(string $key, int $default = 0): int
{
return Cache::remember(
self::CACHE_PREFIX.$key,
now()->addMinutes(self::CACHE_TTL),
fn () => MarriageConfig::where('key', $key)->value('value') ?? $default
);
}
/**
* 批量读取同一分组所有配置(后台页面用)。
*
* @param string $group 分组名
* @return Collection<int, MarriageConfig>
*/
public function getGroup(string $group): Collection
{
return MarriageConfig::where('group', $group)->orderBy('id')->get();
}
/**
* 按分组名返回所有配置(后台页面用)。
*
* @return Collection<string, Collection<int, MarriageConfig>>
*/
public function allGrouped(): Collection
{
return Cache::remember(
self::ALL_CACHE_KEY,
now()->addMinutes(self::CACHE_TTL),
fn () => MarriageConfig::orderBy('id')->get()->groupBy('group')
);
}
/**
* 写入单个配置值,并清除相关缓存。
*
* @param string $key 配置键名
* @param int $value 新值
*/
public function set(string $key, int $value): bool
{
$rows = MarriageConfig::where('key', $key)->update(['value' => $value]);
// 清除单项缓存及全量缓存
Cache::forget(self::CACHE_PREFIX.$key);
Cache::forget(self::ALL_CACHE_KEY);
return $rows > 0;
}
/**
* 批量写入配置(后台表单批量保存,接受 ['key' => value] 格式)。
*
* @param array<string, int> $data 键值对
*/
public function batchSet(array $data): void
{
foreach ($data as $key => $value) {
$this->set($key, (int) $value);
}
}
/**
* 清除全部婚姻配置缓存(迁移/重新 Seed 后调用)。
*/
public function clearAll(): void
{
$keys = MarriageConfig::pluck('key');
foreach ($keys as $key) {
Cache::forget(self::CACHE_PREFIX.$key);
}
Cache::forget(self::ALL_CACHE_KEY);
}
}