input('direction', null); if ($direction === null || $direction === '') { return $this->fail('please provide direction (0=clockwise, 1=counterclockwise)'); } $direction = (int) $direction; if (!in_array($direction, [DiceReward::DIRECTION_CLOCKWISE, DiceReward::DIRECTION_COUNTERCLOCKWISE], true)) { return $this->fail('direction must be 0 (clockwise) or 1 (counterclockwise)'); } $tier = $request->input('tier', ''); $page = (int) $request->input('page', 1); $limit = (int) $request->input('limit', 10); $orderField = $request->input('orderField', 'r.tier'); $orderType = $request->input('orderType', 'asc'); $logic = new DiceRewardLogic(); $data = $logic->getListWithConfig($direction, [ 'tier' => $tier, 'orderField' => $orderField, 'orderType' => $orderType, ], $page, $limit); return $this->success($data); } /** * 权重编辑弹窗:按档位分组获取当前方向的配置+权重(单方向,用于兼容) * 参数:direction 0=顺时针 1=逆时针 */ #[Permission('奖励对照列表', 'dice:reward:index:index')] public function weightRatioList(Request $request): Response { $direction = (int) $request->input('direction', 0); if (!in_array($direction, [DiceReward::DIRECTION_CLOCKWISE, DiceReward::DIRECTION_COUNTERCLOCKWISE], true)) { $direction = DiceReward::DIRECTION_CLOCKWISE; } $logic = new DiceRewardLogic(); $data = $logic->getListGroupedByTierForDirection($direction); return $this->success($data); } /** * 权重编辑弹窗:按档位分组获取配置+顺时针/逆时针权重(dice_reward 双方向) * 返回与 reward_config 权重配比一致结构,供奖励对照页弹窗同时编辑 direction=0/1 * 拉取前先刷新缓存,保证与列表页(直查 DB)数据一致,避免表格与弹窗权重不一致 */ #[Permission('奖励对照列表', 'dice:reward:index:index')] public function weightRatioListWithDirection(Request $request): Response { DiceReward::refreshCache(); $logic = new DiceRewardLogic(); $data = $logic->getListGroupedByTierWithDirection(); return $this->success($data); } /** * 一键测试权重:创建测试记录并启动单进程后台执行,按付费/免费、顺逆方向交替写入 dice_play_record_test * 参数:lottery_config_id 可选,不选则传 paid_tier_weights / free_tier_weights 自定义档位; * paid_s_count, paid_n_count, free_s_count, free_n_count;或兼容旧版 s_count, n_count */ #[Permission('一键测试权重', 'dice:reward:index:startWeightTest')] public function startWeightTest(Request $request): Response { $post = is_array($request->post()) ? $request->post() : []; $params = [ 'lottery_config_id' => $post['lottery_config_id'] ?? null, 'paid_lottery_config_id' => $post['paid_lottery_config_id'] ?? null, 'free_lottery_config_id' => $post['free_lottery_config_id'] ?? null, 's_count' => $post['s_count'] ?? null, 'n_count' => $post['n_count'] ?? null, 'paid_s_count' => $post['paid_s_count'] ?? null, 'paid_n_count' => $post['paid_n_count'] ?? null, 'free_s_count' => $post['free_s_count'] ?? null, 'free_n_count' => $post['free_n_count'] ?? null, 'paid_tier_weights' => $post['paid_tier_weights'] ?? null, 'free_tier_weights' => $post['free_tier_weights'] ?? null, ]; $adminId = isset($this->adminInfo['id']) ? (int) $this->adminInfo['id'] : null; try { $logic = new DiceRewardConfigRecordLogic(); $recordId = $logic->createWeightTestRecord($params, $adminId); return $this->success(['record_id' => $recordId]); } catch (\plugin\saiadmin\exception\ApiException $e) { return $this->fail($e->getMessage()); } } /** * 查询一键测试进度:total_play_count、over_play_count、status、remark */ #[Permission('奖励对照列表', 'dice:reward:index:index')] public function getTestProgress(Request $request): Response { $recordId = (int) $request->input('record_id', 0); if ($recordId <= 0) { return $this->fail('please provide record_id'); } $record = DiceRewardConfigRecord::find($recordId); if (!$record) { return $this->fail('record not found'); } $arr = $record->toArray(); $data = [ 'total_play_count' => (int) ($arr['total_play_count'] ?? 0), 'over_play_count' => (int) ($arr['over_play_count'] ?? 0), 'status' => (int) ($arr['status'] ?? 0), 'remark' => $arr['remark'] ?? null, 'result_counts' => $arr['result_counts'] ?? null, 'tier_counts' => $arr['tier_counts'] ?? null, ]; return $this->success($data); } /** * 一键清空测试数据:清空 dice_play_record_test 表 */ #[Permission('奖励对照列表', 'dice:reward:index:index')] public function clearPlayRecordTest(Request $request): Response { try { $table = (new DicePlayRecordTest())->getTable(); Db::execute('TRUNCATE TABLE `' . $table . '`'); return $this->success('test data cleared'); } catch (\Throwable $e) { return $this->fail('clear failed: ' . $e->getMessage()); } } /** * 权重编辑弹窗:按方向+点数批量更新权重(写入 dice_reward) * 参数:items: [{ grid_number, weight_clockwise, weight_counterclockwise }, ...] */ #[Permission('权重配比', 'dice:reward:index:batchUpdateWeights')] public function batchUpdateWeights(Request $request): Response { $items = $request->post('items', []); if (!is_array($items)) { return $this->fail('parameter items must be an array'); } try { $logic = new DiceRewardLogic(); $logic->batchUpdateWeights($items); return $this->success('save success'); } catch (\plugin\saiadmin\exception\ApiException $e) { return $this->fail($e->getMessage()); } } /** * 权重编辑弹窗:批量更新当前方向的权重(单方向,用于兼容) * 参数:direction(必), items: [{ id, weight }, ...] */ #[Permission('奖励对照修改', 'dice:reward:index:update')] public function batchUpdateWeightsByDirection(Request $request): Response { $direction = (int) $request->post('direction', 0); if (!in_array($direction, [DiceReward::DIRECTION_CLOCKWISE, DiceReward::DIRECTION_COUNTERCLOCKWISE], true)) { return $this->fail('direction must be 0 (clockwise) or 1 (counterclockwise)'); } $items = $request->post('items', []); if (!is_array($items)) { return $this->fail('parameter items must be an array'); } try { $logic = new DiceRewardLogic(); $logic->batchUpdateWeightsByDirection($direction, $items); return $this->success('save success'); } catch (\plugin\saiadmin\exception\ApiException $e) { return $this->fail($e->getMessage()); } } }