From baaa7087b0f197de6298f14bd38841b0bbeb54b1 Mon Sep 17 00:00:00 2001 From: lkddi Date: Sun, 1 Mar 2026 11:22:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E6=8E=A5=E6=94=B6=E6=AC=A1=E6=95=B0=E4=B8=8A?= =?UTF-8?q?=E9=99=90=EF=BC=88=E8=81=8C=E5=8A=A1=E7=AE=A1=E7=90=86=E9=A1=B5?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增全局 sysparam 配置 reward_recipient_daily_max: - 控制每位用户单日内从所有职务持有者处累计接收奖励的最高次数 - 0 = 不限制 后端变更: - PositionController::saveRewardConfig() 保存配置 - POST admin/positions/reward-config 路由 - AdminCommandController::reward() 新增第④层校验: 全局次数上限(优先级低于职务级别的 recipient_daily_limit) 视图变更: - 职务管理页顶部加橙色配置卡片(行内表单,即改即存) - 显示当前全局配置值 --- .../Controllers/Admin/PositionController.php | 36 ++++++++++++++++++- .../Controllers/AdminCommandController.php | 16 +++++++++ .../views/admin/positions/index.blade.php | 27 ++++++++++++++ routes/web.php | 1 + 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/PositionController.php b/app/Http/Controllers/Admin/PositionController.php index 0bedcb5..62c919f 100644 --- a/app/Http/Controllers/Admin/PositionController.php +++ b/app/Http/Controllers/Admin/PositionController.php @@ -15,6 +15,7 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Department; use App\Models\Position; +use App\Models\Sysparam; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -34,7 +35,10 @@ class PositionController extends Controller // 全部职务(供任命白名单多选框使用) $allPositions = Position::with('department')->orderByDesc('rank')->get(); - return view('admin.positions.index', compact('departments', 'allPositions')); + // 全局奖励接收次数上限(0 = 不限) + $globalRecipientDailyMax = (int) Sysparam::getValue('reward_recipient_daily_max', '0'); + + return view('admin.positions.index', compact('departments', 'allPositions', 'globalRecipientDailyMax')); } /** @@ -68,6 +72,36 @@ class PositionController extends Controller return redirect()->route('admin.positions.index')->with('success', "职务【{$data['name']}】创建成功!"); } + /** + * 保存全局奖励金币接收次数上限 + * + * 控制每位用户单日内可从所有职务持有者处累计接收奖励的最高次数。 + * 0 表示不限制,保存到 sysparam 表中(key: reward_recipient_daily_max)。 + */ + public function saveRewardConfig(Request $request): RedirectResponse + { + $request->validate([ + 'reward_recipient_daily_max' => 'required|integer|min:0|max:9999', + ]); + + $value = (string) $request->integer('reward_recipient_daily_max'); + + Sysparam::updateOrCreate( + ['alias' => 'reward_recipient_daily_max'], + [ + 'body' => $value, + 'guidetxt' => '用户单日最多接收奖励金币次数(0=不限,统计所有职务持有者的发放总次数)', + ] + ); + + Sysparam::clearCache('reward_recipient_daily_max'); + + $label = $value === '0' ? '不限' : "{$value} 次"; + + return redirect()->route('admin.positions.index') + ->with('success', "全局接收次数上限已更新为:{$label}"); + } + /** * 更新职务(含任命白名单同步) */ diff --git a/app/Http/Controllers/AdminCommandController.php b/app/Http/Controllers/AdminCommandController.php index 4b02c65..5f9a8bb 100644 --- a/app/Http/Controllers/AdminCommandController.php +++ b/app/Http/Controllers/AdminCommandController.php @@ -499,6 +499,22 @@ class AdminCommandController extends Controller } } + // ④ 全局系统级别:每位用户单日最多接收奖励次数(后台职务管理页统一配置) + $globalMax = (int) Sysparam::getValue('reward_recipient_daily_max', '0'); + if ($globalMax > 0) { + $globalCount = PositionAuthorityLog::where('target_user_id', $target->id) + ->where('action_type', 'reward') + ->whereDate('created_at', today()) + ->count(); + + if ($globalCount >= $globalMax) { + return response()->json([ + 'status' => 'error', + 'message' => "{$targetUsername} 今日已累计接收 {$globalCount} 次奖励,已达全局每日上限({$globalMax})", + ], 422); + } + } + // 发放金币(通过 UserCurrencyService 原子性更新 + 写流水) $this->currencyService->change( $target, diff --git a/resources/views/admin/positions/index.blade.php b/resources/views/admin/positions/index.blade.php index d1affc4..80e39e5 100644 --- a/resources/views/admin/positions/index.blade.php +++ b/resources/views/admin/positions/index.blade.php @@ -101,6 +101,33 @@ {{ session('error') }} @endif + {{-- 全局奖励接收上限配置卡片 --}} +
+
+
+

🪙 全局奖励接收上限

+

+ 每位用户单日内可从所有职务持有者处累计接收奖励金币的最高次数。 + 设为 0 表示不限制。 + 当前配置:{{ $globalRecipientDailyMax > 0 ? $globalRecipientDailyMax . ' 次' : '不限' }} +

+
+
+ @csrf + + + 次(0=不限) + +
+
+
+ {{-- 按部门分组展示职务 --}} @foreach ($departments as $dept)
diff --git a/routes/web.php b/routes/web.php index 2d302d4..4e53884 100644 --- a/routes/web.php +++ b/routes/web.php @@ -191,6 +191,7 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad Route::get('/positions', [\App\Http\Controllers\Admin\PositionController::class, 'index'])->name('positions.index'); Route::put('/departments/{department}', [\App\Http\Controllers\Admin\DepartmentController::class, 'update'])->name('departments.update'); Route::put('/positions/{position}', [\App\Http\Controllers\Admin\PositionController::class, 'update'])->name('positions.update'); + Route::post('/positions/reward-config', [\App\Http\Controllers\Admin\PositionController::class, 'saveRewardConfig'])->name('positions.reward_config'); // 大卡片通知广播(仅超级管理员,安全隔离:普通用户无此接口) Route::post('/banner/broadcast', [\App\Http\Controllers\Admin\BannerBroadcastController::class, 'send'])->name('admin.banner.broadcast');