优化中奖权重计算方式

This commit is contained in:
2026-03-12 17:17:00 +08:00
parent 064ce06393
commit 7e4ba86afa
25 changed files with 2344 additions and 403 deletions

View File

@@ -0,0 +1,120 @@
<?php
// +----------------------------------------------------------------------
// | saiadmin [ saiadmin快速开发框架 ]
// +----------------------------------------------------------------------
namespace app\dice\controller\reward;
use app\dice\logic\reward\DiceRewardLogic;
use app\dice\model\reward\DiceReward;
use plugin\saiadmin\basic\BaseController;
use plugin\saiadmin\service\Permission;
use support\Request;
use support\Response;
/**
* 奖励对照控制器dice_reward按方向分页列表 + 权重编辑)
*/
class DiceRewardController extends BaseController
{
/**
* 分页列表,按 direction 区分顺时针(0)/逆时针(1)
* 参数direction(必), tier(选), page, limit, orderField, orderType
*/
#[Permission('奖励对照列表', 'dice:reward:index:index')]
public function index(Request $request): Response
{
$direction = $request->input('direction', null);
if ($direction === null || $direction === '') {
return $this->fail('请传入 direction0=顺时针 1=逆时针)');
}
$direction = (int) $direction;
if (!in_array($direction, [DiceReward::DIRECTION_CLOCKWISE, DiceReward::DIRECTION_COUNTERCLOCKWISE], true)) {
return $this->fail('direction 必须为 0顺时针或 1逆时针');
}
$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
*/
#[Permission('奖励对照列表', 'dice:reward:index:index')]
public function weightRatioListWithDirection(Request $request): Response
{
$logic = new DiceRewardLogic();
$data = $logic->getListGroupedByTierWithDirection();
return $this->success($data);
}
/**
* 权重编辑弹窗:按方向+点数批量更新权重(写入 dice_reward
* 参数items: [{ grid_number, weight_clockwise, weight_counterclockwise }, ...]
*/
#[Permission('奖励对照修改', 'dice:reward:index:update')]
public function batchUpdateWeights(Request $request): Response
{
$items = $request->post('items', []);
if (!is_array($items)) {
return $this->fail('参数 items 必须为数组');
}
try {
$logic = new DiceRewardLogic();
$logic->batchUpdateWeights($items);
return $this->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 必须为 0顺时针或 1逆时针');
}
$items = $request->post('items', []);
if (!is_array($items)) {
return $this->fail('参数 items 必须为数组');
}
try {
$logic = new DiceRewardLogic();
$logic->batchUpdateWeightsByDirection($direction, $items);
return $this->success('保存成功');
} catch (\plugin\saiadmin\exception\ApiException $e) {
return $this->fail($e->getMessage());
}
}
}