下号比率恢复 + 触线降权 + 同步裁决

This commit is contained in:
root
2026-07-04 11:46:00 +08:00
parent 455b6669e8
commit 9b57b0c400
16 changed files with 358 additions and 88 deletions
@@ -13,7 +13,7 @@ use app\admin\model\split\Ticket;
class SplitTicketRuleService
{
/**
* 同步后应用工单开关规则;号码开关以爬虫/platform 快照为准(不再跑单号上限/下号比率)
* 同步后应用工单开关规则;号码开关由 applyNumberRules 综合裁决(平台在线 + 单号上限 + 下号比率)
*/
public function applyAfterSync(Ticket $ticket, int $completeCount): void
{
@@ -23,7 +23,7 @@ class SplitTicketRuleService
if ((string) $fresh['status'] === 'hidden') {
$this->cascadeTicketClosedToNumbers($fresh);
} else {
(new SplitTicketNumberSyncService())->applyStatusFromPlatformSnapshot($fresh);
$this->applyNumberRules($fresh);
}
}
}
@@ -70,7 +70,7 @@ class SplitTicketRuleService
}
/**
* 手动切换工单状态时,非手动号码按 platform_status 对齐开关
* 手动切换工单状态时,非手动号码按业务规则对齐开关
*/
public function syncNumbersWithTicketStatus(Ticket $ticket): void
{
@@ -79,21 +79,21 @@ class SplitTicketRuleService
$this->cascadeTicketClosedToNumbers($ticket);
return;
}
(new SplitTicketNumberSyncService())->applyStatusFromPlatformSnapshot($ticket);
$this->applyNumberRules($ticket);
}
/**
* 工单处于开启状态时,将云控在线的非手动号码设为开启
*
* @deprecated 请使用 applyStatusFromPlatformSnapshot(以 platform_status 为准)
* @deprecated 请使用 applyNumberRules
*/
public function syncOnlineNumbersWhenTicketOpen(Ticket $ticket): void
{
(new SplitTicketNumberSyncService())->applyStatusFromPlatformSnapshot($ticket);
$this->applyNumberRules($ticket);
}
/**
* 单号上限、下号比率、云控在线状态、工单开关综合决定号码状态
* 单号上限、下号比率、云控在线状态、工单开关综合决定号码 status;同步时清除或确认 ratio_deferred
*/
public function applyNumberRules(Ticket $ticket): void
{
@@ -125,12 +125,21 @@ class SplitTicketRuleService
'updatetime' => time(),
];
// 手动管理(含用户手动关闭)的号码:仅更新统计字段,不改状态
// 手动管理(含用户手动关闭)的号码:仅更新统计字段,不改状态与降权标记
if ((int) $number['manual_manage'] === 1) {
Number::where('id', (int) $number['id'])->update($update);
continue;
}
// 同步裁决 ratio_deferred:进线增长则解除降权;触线且无进线增长则关号并清除降权
if ($inboundCount > $lastInbound) {
$update['ratio_deferred'] = 0;
$update['ratio_deferred_at'] = null;
} else {
$update['ratio_deferred'] = 0;
$update['ratio_deferred_at'] = null;
}
$update['status'] = $this->resolveAutomatedStatus(
$ticket,
(string) ($number['platform_status'] ?? 'unknown'),