新增查看显示实时彩金池

This commit is contained in:
2026-03-10 16:41:11 +08:00
parent e56c3ada34
commit bc034727b0
6 changed files with 159 additions and 39 deletions

View File

@@ -75,5 +75,41 @@ export default {
url: '/dice/lottery_config/DiceLotteryConfig/destroy', url: '/dice/lottery_config/DiceLotteryConfig/destroy',
data: params data: params
}) })
},
/**
* 获取当前彩金池Redis 实例化,无则按 type=0 创建),含 profit_amount 实时值
*/
getCurrentPool() {
return request.get<{
id: number
name: string
safety_line: number
t1_weight: number
t2_weight: number
t3_weight: number
t4_weight: number
t5_weight: number
profit_amount: number
}>({
url: '/dice/lottery_config/DiceLotteryConfig/getCurrentPool'
})
},
/**
* 更新当前彩金池:仅 safety_line、t1_weightt5_weight不可改 profit_amount
*/
updateCurrentPool(params: {
safety_line?: number
t1_weight?: number
t2_weight?: number
t3_weight?: number
t4_weight?: number
t5_weight?: number
}) {
return request.post<any>({
url: '/dice/lottery_config/DiceLotteryConfig/updateCurrentPool',
data: params
})
} }
} }

View File

@@ -7,29 +7,13 @@
<!-- 表格头部 --> <!-- 表格头部 -->
<ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData"> <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
<template #left> <template #left>
<!-- <ElSpace wrap>--> <ElButton
<!-- <ElButton--> v-permission="'dice:lottery_config:index:index'"
<!-- v-permission="'dice:lottery_config:index:save'"--> type="primary"
<!-- @click="showDialog('add')"--> @click="showCurrentPoolDialog"
<!-- v-ripple--> >
<!-- >--> 查看当前彩金池
<!-- <template #icon>--> </ElButton>
<!-- <ArtSvgIcon icon="ri:add-fill" />-->
<!-- </template>-->
<!-- 新增-->
<!-- </ElButton>-->
<!-- <ElButton-->
<!-- v-permission="'dice:lottery_config:index:destroy'"-->
<!-- :disabled="selectedRows.length === 0"-->
<!-- @click="deleteSelectedRows(api.delete, refreshData)"-->
<!-- v-ripple-->
<!-- >-->
<!-- <template #icon>-->
<!-- <ArtSvgIcon icon="ri:delete-bin-5-line" />-->
<!-- </template>-->
<!-- 删除-->
<!-- </ElButton>-->
<!-- </ElSpace>-->
</template> </template>
</ArtTableHeader> </ArtTableHeader>
@@ -71,6 +55,8 @@
:data="dialogData" :data="dialogData"
@success="refreshData" @success="refreshData"
/> />
<!-- 当前彩金池弹窗 -->
<CurrentPoolDialog v-model="currentPoolVisible" @success="refreshData" />
</div> </div>
</template> </template>
@@ -80,6 +66,7 @@
import api from '../../api/lottery_config/index' import api from '../../api/lottery_config/index'
import TableSearch from './modules/table-search.vue' import TableSearch from './modules/table-search.vue'
import EditDialog from './modules/edit-dialog.vue' import EditDialog from './modules/edit-dialog.vue'
import CurrentPoolDialog from './modules/current-pool-dialog.vue'
// 搜索表单 // 搜索表单
const searchForm = ref({ const searchForm = ref({
@@ -172,14 +159,10 @@
}) })
// 编辑配置 // 编辑配置
const { const { dialogType, dialogVisible, dialogData, showDialog, handleSelectionChange } = useSaiAdmin()
dialogType,
dialogVisible, const currentPoolVisible = ref(false)
dialogData, function showCurrentPoolDialog() {
showDialog, currentPoolVisible.value = true
// deleteRow, }
// deleteSelectedRows,
handleSelectionChange
// selectedRows
} = useSaiAdmin()
</script> </script>

View File

@@ -135,4 +135,25 @@ class DiceLotteryConfigController extends BaseController
} }
} }
/**
* 获取当前彩金池Redis 实例化,无则按 type=0 创建)
* 返回含 profit_amount 实时值,供前端轮询展示
*/
#[Permission('色子奖池配置列表', 'dice:lottery_config:index:index')]
public function getCurrentPool(Request $request): Response
{
$data = $this->logic->getCurrentPool();
return $this->success($data);
}
/**
* 更新当前彩金池:仅可修改 safety_line、t1_weightt5_weight不可修改 profit_amount
*/
#[Permission('色子奖池配置修改', 'dice:lottery_config:index:update')]
public function updateCurrentPool(Request $request): Response
{
$data = $request->post();
$this->logic->updateCurrentPool($data);
return $this->success('保存成功');
}
} }

View File

@@ -6,16 +6,22 @@
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace app\dice\logic\lottery_config; namespace app\dice\logic\lottery_config;
use app\dice\model\lottery_config\DiceLotteryConfig;
use plugin\saiadmin\basic\think\BaseLogic; use plugin\saiadmin\basic\think\BaseLogic;
use plugin\saiadmin\exception\ApiException; use plugin\saiadmin\exception\ApiException;
use plugin\saiadmin\utils\Helper; use plugin\saiadmin\utils\Helper;
use app\dice\model\lottery_config\DiceLotteryConfig; use support\think\Cache;
/** /**
* 色子奖池配置逻辑层 * 色子奖池配置逻辑层
*/ */
class DiceLotteryConfigLogic extends BaseLogic class DiceLotteryConfigLogic extends BaseLogic
{ {
/** Redis 当前彩金池type=0 实例key无则按 type=0 创建 */
private const REDIS_KEY_CURRENT_POOL = 'api:game:lottery_pool:default';
private const EXPIRE = 86400 * 7;
/** /**
* 构造函数 * 构造函数
*/ */
@@ -24,4 +30,75 @@ class DiceLotteryConfigLogic extends BaseLogic
$this->model = new DiceLotteryConfig(); $this->model = new DiceLotteryConfig();
} }
/**
* 获取当前彩金池:从 Redis 读取,若无则按 type=0 配置创建并写入 Redis返回含 profit_amount(ev) 的完整数据
*
* @return array{id:int,name:string,safety_line:int,t1_weight:int,t2_weight:int,t3_weight:int,t4_weight:int,t5_weight:int,profit_amount:float}
*/
public function getCurrentPool(): array
{
$cached = Cache::get(self::REDIS_KEY_CURRENT_POOL);
if ($cached && is_string($cached)) {
$data = json_decode($cached, true);
if (is_array($data)) {
$config = DiceLotteryConfig::find($data['id'] ?? 0);
$ev = $config && isset($config->ev) ? (float) $config->ev : (float) ($data['profit_amount'] ?? 0);
$data['profit_amount'] = $ev;
return $data;
}
}
$config = DiceLotteryConfig::where('type', 0)->find();
if (!$config) {
throw new ApiException('未找到 type=0 的奖池配置,请先创建');
}
$row = $config->toArray();
$pool = [
'id' => (int) $row['id'],
'name' => (string) ($row['name'] ?? ''),
'safety_line' => (int) ($row['safety_line'] ?? 0),
't1_weight' => (int) ($row['t1_weight'] ?? 0),
't2_weight' => (int) ($row['t2_weight'] ?? 0),
't3_weight' => (int) ($row['t3_weight'] ?? 0),
't4_weight' => (int) ($row['t4_weight'] ?? 0),
't5_weight' => (int) ($row['t5_weight'] ?? 0),
'profit_amount' => isset($row['ev']) ? (float) $row['ev'] : 0.0,
];
Cache::set(self::REDIS_KEY_CURRENT_POOL, json_encode($pool), self::EXPIRE);
return $pool;
}
/**
* 更新当前彩金池:仅允许修改 safety_line、t1_weightt5_weight不同步 profit_amount(ev)
* 同时更新 Redis 与 DB 中 type=0 的记录
*
* @param array{safety_line?:int,t1_weight?:int,t2_weight?:int,t3_weight?:int,t4_weight?:int,t5_weight?:int} $data
*/
public function updateCurrentPool(array $data): void
{
$pool = $this->getCurrentPool();
$id = (int) $pool['id'];
$config = DiceLotteryConfig::find($id);
if (!$config) {
throw new ApiException('奖池配置不存在');
}
$allow = ['safety_line', 't1_weight', 't2_weight', 't3_weight', 't4_weight', 't5_weight'];
$update = [];
foreach ($allow as $k) {
if (array_key_exists($k, $data)) {
if ($k === 'safety_line') {
$update[$k] = (int) $data[$k];
} else {
$update[$k] = max(0, min(100, (int) $data[$k]));
}
}
}
if (empty($update)) {
return;
}
DiceLotteryConfig::where('id', $id)->update($update);
$pool = array_merge($pool, $update);
$refreshed = DiceLotteryConfig::find($id);
$pool['profit_amount'] = $refreshed && isset($refreshed->ev) ? (float) $refreshed->ev : (float) ($pool['profit_amount'] ?? 0);
Cache::set(self::REDIS_KEY_CURRENT_POOL, json_encode($pool), self::EXPIRE);
}
} }

View File

@@ -25,6 +25,7 @@ use plugin\saiadmin\basic\think\BaseModel;
* @property $t3_weight T3池权重 * @property $t3_weight T3池权重
* @property $t4_weight T4池权重 * @property $t4_weight T4池权重
* @property $t5_weight T5池权重 * @property $t5_weight T5池权重
* @property $ev 池子累计盈利(游戏结算时累加,仅展示不可编辑)
*/ */
class DiceLotteryConfig extends BaseModel class DiceLotteryConfig extends BaseModel
{ {

View File

@@ -107,6 +107,8 @@ Route::group('/core', function () {
Route::post('/dice/reward_config/DiceRewardConfig/batchUpdateWeights', [\app\dice\controller\reward_config\DiceRewardConfigController::class, 'batchUpdateWeights']); 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); 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']); Route::get('/dice/lottery_config/DiceLotteryConfig/getOptions', [\app\dice\controller\lottery_config\DiceLotteryConfigController::class, 'getOptions']);
Route::get('/dice/lottery_config/DiceLotteryConfig/getCurrentPool', [\app\dice\controller\lottery_config\DiceLotteryConfigController::class, 'getCurrentPool']);
Route::post('/dice/lottery_config/DiceLotteryConfig/updateCurrentPool', [\app\dice\controller\lottery_config\DiceLotteryConfigController::class, 'updateCurrentPool']);
// 数据表维护 // 数据表维护
Route::get("/database/index", [\plugin\saiadmin\app\controller\system\DataBaseController::class, 'index']); Route::get("/database/index", [\plugin\saiadmin\app\controller\system\DataBaseController::class, 'index']);