- Draw相关控制器添加provider_code和provider_name字段支持 - 允许手动录入开奖批次时指定provider_code - RNG开奖批次生成支持多provider,分别生成对应批次数据 - DrawPublishService和DrawManualResultService中支持基于provider_code管理开奖版本和发布流程 - DrawResultViewService调整,支持按provider汇总及筛选开奖结果 - Settlement处理逻辑调整,按provider区分待结算票据及批次,分开结算 - 结算期间管理相关服务支持使用站点本地结算时区计算开账建议和日期处理 - 增加AdminSite的settlement_timezone字段及相关请求验证和数据存取支持 - 优化AdminSettlementPeriod相关代码,防止存在未结清票据时关账 - Ticket明细返回接口添加结算时区信息,提升用户时间体验 - 多处查询排序和版本号处理改进,保证多provider数据正确顺序与一致性
75 lines
2.2 KiB
PHP
75 lines
2.2 KiB
PHP
<?php
|
||
|
||
namespace App\Support;
|
||
|
||
use Carbon\Carbon;
|
||
use Illuminate\Validation\ValidationException;
|
||
|
||
/** 账期起止边界:开账时规范化写入,关账/聚合/流水筛选共用同一对 UTC 时刻。 */
|
||
final class AgentSettlementPeriodWindow
|
||
{
|
||
/**
|
||
* @return array{0: Carbon, 1: Carbon}
|
||
*/
|
||
public static function bounds(string $periodStart, string $periodEnd): array
|
||
{
|
||
return [
|
||
Carbon::parse($periodStart)->utc(),
|
||
Carbon::parse($periodEnd)->utc(),
|
||
];
|
||
}
|
||
|
||
/**
|
||
* @return array{0: string, 1: string}
|
||
*/
|
||
public static function boundStrings(string $periodStart, string $periodEnd): array
|
||
{
|
||
[$start, $end] = self::bounds($periodStart, $periodEnd);
|
||
|
||
return [$start->toDateTimeString(), $end->toDateTimeString()];
|
||
}
|
||
|
||
/**
|
||
* 开账 API:支持 `Y-m-d` 或带时刻字符串;前者按站点业务时区扩界,后者按 UTC 解释。
|
||
*
|
||
* @return array{0: string, 1: string}
|
||
*/
|
||
public static function normalizeInputBounds(
|
||
string $periodStart,
|
||
string $periodEnd,
|
||
string $timezone = 'UTC',
|
||
): array {
|
||
$startRaw = trim($periodStart);
|
||
$endRaw = trim($periodEnd);
|
||
|
||
if ($startRaw === '' || $endRaw === '') {
|
||
throw ValidationException::withMessages([
|
||
'period_start' => ['required'],
|
||
]);
|
||
}
|
||
|
||
$tz = AgentSettlementSiteTimezone::isValid($timezone) ? $timezone : 'UTC';
|
||
|
||
$startAt = self::isDateOnly($startRaw)
|
||
? Carbon::parse($startRaw.' 00:00:00', $tz)->utc()
|
||
: Carbon::parse($startRaw)->utc();
|
||
|
||
$endAt = self::isDateOnly($endRaw)
|
||
? Carbon::parse($endRaw.' 23:59:59', $tz)->utc()
|
||
: Carbon::parse($endRaw)->utc();
|
||
|
||
if ($endAt->lessThan($startAt)) {
|
||
throw ValidationException::withMessages([
|
||
'period_end' => ['after:period_start'],
|
||
]);
|
||
}
|
||
|
||
return [$startAt->toDateTimeString(), $endAt->toDateTimeString()];
|
||
}
|
||
|
||
private static function isDateOnly(string $value): bool
|
||
{
|
||
return (bool) preg_match('/^\d{4}-\d{2}-\d{2}$/', $value);
|
||
}
|
||
}
|