重新优化中奖权重计算方式

This commit is contained in:
2026-03-11 15:40:15 +08:00
parent bb166350fd
commit 2af7fedcce
13 changed files with 330 additions and 322 deletions

View File

@@ -107,6 +107,58 @@ class DicePlayRecord extends BaseModel
}
}
/**
* 读取 roll_array 时:若为空且 roll_number 在 530则按点数和生成默认 5 个色子数组,避免“点数和有值但五个点数空”的展示问题
* @param mixed $value 库中原始值JSON 字符串或 null
* @param array $data 当前记录数据
* @return array 5 个元素的数组,每项 16
*/
public function getRollArrayAttr($value, $data = []): array
{
$arr = [];
if (is_string($value) && $value !== '') {
$decoded = json_decode($value, true);
$arr = is_array($decoded) ? $decoded : [];
} elseif (is_array($value)) {
$arr = $value;
}
$sum = isset($data['roll_number']) ? (int) $data['roll_number'] : 0;
if (count($arr) === 5 && array_sum($arr) === $sum) {
$valid = true;
foreach ($arr as $v) {
if (!is_numeric($v) || (int) $v < 1 || (int) $v > 6) {
$valid = false;
break;
}
}
if ($valid) {
return array_map('intval', array_slice($arr, 0, 5));
}
}
if ($sum >= 5 && $sum <= 30) {
return self::defaultRollArrayForSum($sum);
}
return array_slice(array_map('intval', $arr), 0, 5);
}
/**
* 根据点数和生成默认 5 个色子数组(每项 16用于补全缺失的 roll_array
*/
public static function defaultRollArrayForSum(int $sum): array
{
$sum = max(5, min(30, $sum));
$base = (int) floor($sum / 5);
$rem = $sum - 5 * $base;
$arr = array_fill(0, 5, $base);
for ($i = 0; $i < $rem; $i++) {
$arr[$i]++;
}
$arr = array_map(function ($v) {
return max(1, min(6, (int) $v));
}, $arr);
return array_values($arr);
}
/** 抽奖类型 */
public function searchLotteryTypeAttr($query, $value)
{