From e56c3ada345558624e2f02244070010cb62472fd Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Tue, 10 Mar 2026 16:27:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=8E=A9=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E4=B8=AD=E5=A5=96=E6=9D=83=E9=87=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/dice/api/reward_config/index.ts | 19 + .../plugin/dice/reward_config/index/index.vue | 34 +- .../index/modules/edit-dialog.vue | 16 +- .../index/modules/weight-ratio-dialog.vue | 375 ++++++++++++++++++ .../DiceRewardConfigController.php | 31 ++ .../reward_config/DiceRewardConfigLogic.php | 82 ++++ .../model/reward_config/DiceRewardConfig.php | 16 +- server/plugin/saiadmin/config/route.php | 2 + 8 files changed, 539 insertions(+), 36 deletions(-) create mode 100644 saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue diff --git a/saiadmin-artd/src/views/plugin/dice/api/reward_config/index.ts b/saiadmin-artd/src/views/plugin/dice/api/reward_config/index.ts index 8b38b17..11fafaa 100644 --- a/saiadmin-artd/src/views/plugin/dice/api/reward_config/index.ts +++ b/saiadmin-artd/src/views/plugin/dice/api/reward_config/index.ts @@ -61,5 +61,24 @@ export default { url: '/core/dice/reward_config/DiceRewardConfig/destroy', data: params }) + }, + + /** + * T1-T5、BIGWIN 权重配比:按档位分组获取配置列表 + */ + weightRatioList() { + return request.get({ + url: '/core/dice/reward_config/DiceRewardConfig/weightRatioList' + }) + }, + + /** + * T1-T5、BIGWIN 权重配比:批量更新权重(同一档位权重之和必须等于 100%) + */ + batchUpdateWeights(items: Array<{ id: number; weight: number }>) { + return request.post({ + url: '/core/dice/reward_config/DiceRewardConfig/batchUpdateWeights', + data: { items } + }) } } diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue index 4bc02ce..6f9e69d 100644 --- a/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue @@ -8,27 +8,14 @@ @@ -71,6 +58,8 @@ :data="dialogData" @success="refreshData" /> + + @@ -80,6 +69,9 @@ import api from '../../api/reward_config/index' import TableSearch from './modules/table-search.vue' import EditDialog from './modules/edit-dialog.vue' + import WeightRatioDialog from './modules/weight-ratio-dialog.vue' + + const weightRatioVisible = ref(false) // 搜索表单 const searchForm = ref>({ diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue index b953a15..0b136ee 100644 --- a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue @@ -102,9 +102,11 @@ set: (value) => emit('update:modelValue', value) }) - /** tier=BIGWIN 且 grid_number 为 5 或 30 时权重固定 100%,不可修改 */ - const isWeightFixed100 = computed( - () => formData.tier === 'BIGWIN' && (formData.grid_number === 5 || formData.grid_number === 30) + /** BIGWIN 且 grid_number 为 5 或 30 时豹子概率不可修改 */ + const isWeightDisabled = computed( + () => + formData.tier === 'BIGWIN' && + (formData.grid_number === 5 || formData.grid_number === 30) ) /** @@ -231,8 +233,12 @@ } else if (payload.grid_number === 5 || payload.grid_number === 30) { payload.weight = 100 } else { - const w = Number(payload.weight) - payload.weight = Number.isNaN(w) ? 0 : Math.max(0, Math.min(100, w)) + if (payload.grid_number === 5 || payload.grid_number === 30) { + payload.weight = 100 + } else { + const w = Number(payload.weight) + payload.weight = Number.isNaN(w) ? 0 : Math.max(0, Math.min(100, w)) + } } if (props.dialogType === 'add') { await api.save(payload) diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue new file mode 100644 index 0000000..0c64d79 --- /dev/null +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue @@ -0,0 +1,375 @@ + + + + + diff --git a/server/app/dice/controller/reward_config/DiceRewardConfigController.php b/server/app/dice/controller/reward_config/DiceRewardConfigController.php index e835205..037e3bf 100644 --- a/server/app/dice/controller/reward_config/DiceRewardConfigController.php +++ b/server/app/dice/controller/reward_config/DiceRewardConfigController.php @@ -123,4 +123,35 @@ class DiceRewardConfigController extends BaseController } } + /** + * T1-T5、BIGWIN 权重配比:按档位分组返回配置列表 + * @param Request $request + * @return Response + */ + #[Permission('奖励配置列表', 'dice:reward_config:index:index')] + public function weightRatioList(Request $request): Response + { + $data = $this->logic->getListGroupedByTier(); + return $this->success($data); + } + + /** + * T1-T5、BIGWIN 权重配比:批量更新权重(T1-T5 同档位权重和须为 100%,BIGWIN 为豹子权重单独设定、无合计要求) + * @param Request $request + * @return Response + */ + #[Permission('奖励配置修改', 'dice:reward_config:index:update')] + public function batchUpdateWeights(Request $request): Response + { + $items = $request->post('items', []); + if (!is_array($items)) { + return $this->fail('参数 items 必须为数组'); + } + try { + $this->logic->batchUpdateWeights($items); + return $this->success('保存成功'); + } catch (\plugin\saiadmin\exception\ApiException $e) { + return $this->fail($e->getMessage()); + } + } } diff --git a/server/app/dice/logic/reward_config/DiceRewardConfigLogic.php b/server/app/dice/logic/reward_config/DiceRewardConfigLogic.php index a9457dc..fb774ca 100644 --- a/server/app/dice/logic/reward_config/DiceRewardConfigLogic.php +++ b/server/app/dice/logic/reward_config/DiceRewardConfigLogic.php @@ -10,6 +10,7 @@ use plugin\saiadmin\basic\think\BaseLogic; use plugin\saiadmin\exception\ApiException; use plugin\saiadmin\utils\Helper; use app\dice\model\reward_config\DiceRewardConfig; +use support\Log; /** * 奖励配置逻辑层 @@ -57,4 +58,85 @@ class DiceRewardConfigLogic extends BaseLogic $data['weight'] = max(0, min(100, $w)); return $data; } + + /** + * 按档位分组返回奖励配置列表(用于 T1-T5、BIGWIN 权重配比) + * @return array 键为 T1|T2|T3|T4|T5|BIGWIN,值为该档位下的配置行数组 + */ + public function getListGroupedByTier(): array + { + $tiers = ['T1', 'T2', 'T3', 'T4', 'T5', 'BIGWIN']; + $list = $this->model->whereIn('tier', $tiers)->order('tier')->order('id')->select()->toArray(); + $grouped = []; + foreach ($tiers as $t) { + $grouped[$t] = []; + } + foreach ($list as $row) { + $tier = isset($row['tier']) ? (string) $row['tier'] : ''; + if ($tier !== '' && isset($grouped[$tier])) { + $grouped[$tier][] = $row; + } + } + return $grouped; + } + + /** + * 批量更新权重:T1-T5 同档位权重之和必须等于 100;BIGWIN 为豹子权重单独设定,不校验合计 + * @param array $items 元素为 [ id => 配置ID, weight => 0-100 ] + * @throws ApiException 当单条 weight 非法或 T1-T5 某档位权重和≠100 时 + */ + public function batchUpdateWeights(array $items): void + { + if (empty($items)) { + return; + } + $items = array_values($items); + $ids = []; + $weightById = []; + foreach ($items as $item) { + if (!is_array($item)) { + continue; + } + $id = isset($item['id']) ? (int) $item['id'] : 0; + $w = isset($item['weight']) ? (float) $item['weight'] : 0; + if ($id < 0) { + throw new ApiException('存在无效的配置ID'); + } + if ($w < 0 || $w > 100) { + throw new ApiException('权重必须在 0-100 之间'); + } + $ids[] = $id; + $w = max(0, min(100, $w)); + $weightById[$id] = isset($weightById[$id]) ? min(100, $weightById[$id] + $w) : $w; + } + $list = $this->model->whereIn('id', array_unique($ids))->field('id,tier,grid_number')->select()->toArray(); + $idToTier = []; + foreach ($list as $r) { + $id = isset($r['id']) ? (int) $r['id'] : 0; + $idToTier[$id] = isset($r['tier']) ? (string) $r['tier'] : ''; + } + $sumByTier = []; + foreach ($weightById as $id => $w) { + $tier = $idToTier[$id] ?? ''; + if ($tier === '') { + throw new ApiException('配置ID ' . $id . ' 不存在或档位为空'); + } + if ($tier === 'BIGWIN') { + continue; + } + if (!isset($sumByTier[$tier])) { + $sumByTier[$tier] = 0; + } + $sumByTier[$tier] += $w; + } + foreach ($sumByTier as $tier => $sum) { + if (abs($sum - 100)) { + throw new ApiException('档位 ' . $tier . ' 的权重之和必须等于 100%,当前为 ' . round($sum, 2)); + } + } + foreach ($weightById as $id => $w) { + DiceRewardConfig::where('id', $id)->update(['weight' => $w]); + } + DiceRewardConfig::refreshCache(); + } } diff --git a/server/app/dice/model/reward_config/DiceRewardConfig.php b/server/app/dice/model/reward_config/DiceRewardConfig.php index 2291ea1..20a7d59 100644 --- a/server/app/dice/model/reward_config/DiceRewardConfig.php +++ b/server/app/dice/model/reward_config/DiceRewardConfig.php @@ -110,19 +110,15 @@ class DiceRewardConfig extends BaseModel } } $sEnd = isset($row['s_end_index']) ? (int) $row['s_end_index'] : 0; - if ($sEnd !== 0) { - if (!isset($bySEndIndex[$sEnd])) { - $bySEndIndex[$sEnd] = []; - } - $bySEndIndex[$sEnd][] = $row; + if (!isset($bySEndIndex[$sEnd])) { + $bySEndIndex[$sEnd] = []; } + $bySEndIndex[$sEnd][] = $row; $nEnd = isset($row['n_end_index']) ? (int) $row['n_end_index'] : 0; - if ($nEnd !== 0) { - if (!isset($byNEndIndex[$nEnd])) { - $byNEndIndex[$nEnd] = []; - } - $byNEndIndex[$nEnd][] = $row; + if (!isset($byNEndIndex[$nEnd])) { + $byNEndIndex[$nEnd] = []; } + $byNEndIndex[$nEnd][] = $row; } $minRealEv = empty($list) ? 0.0 : (float) min(array_column($list, 'real_ev')); self::$instance = [ diff --git a/server/plugin/saiadmin/config/route.php b/server/plugin/saiadmin/config/route.php index 8aabaf1..c6410ec 100644 --- a/server/plugin/saiadmin/config/route.php +++ b/server/plugin/saiadmin/config/route.php @@ -103,6 +103,8 @@ Route::group('/core', function () { fastRoute('dice/player_ticket_record/DicePlayerTicketRecord', \app\dice\controller\player_ticket_record\DicePlayerTicketRecordController::class); Route::get('/dice/player_ticket_record/DicePlayerTicketRecord/getPlayerOptions', [\app\dice\controller\player_ticket_record\DicePlayerTicketRecordController::class, 'getPlayerOptions']); fastRoute('dice/reward_config/DiceRewardConfig', \app\dice\controller\reward_config\DiceRewardConfigController::class); + Route::get('/dice/reward_config/DiceRewardConfig/weightRatioList', [\app\dice\controller\reward_config\DiceRewardConfigController::class, 'weightRatioList']); + Route::post('/dice/reward_config/DiceRewardConfig/batchUpdateWeights', [\app\dice\controller\reward_config\DiceRewardConfigController::class, 'batchUpdateWeights']); fastRoute('dice/lottery_config/DiceLotteryConfig', \app\dice\controller\lottery_config\DiceLotteryConfigController::class); Route::get('/dice/lottery_config/DiceLotteryConfig/getOptions', [\app\dice\controller\lottery_config\DiceLotteryConfigController::class, 'getOptions']);