修复A2C工单蜘蛛

This commit is contained in:
root
2026-07-01 01:26:27 +08:00
parent 9f2e904fab
commit 54c13c54ef
22 changed files with 1614 additions and 272 deletions
@@ -11,11 +11,16 @@ use think\Db;
/**
* 工单同步结果写入号码表
*
* 同步策略(全量镜像):
* - 爬虫返回的号码:写入 platform_status / inbound_count,开关 status 与云控在线状态一致
* - 爬虫未返回且 manual_manage=0:物理删除
* - manual_manage=1:不删除,仅当仍在爬虫结果中时更新 platform_status
*/
class SplitTicketNumberSyncService
{
/**
* 将蜘蛛返回的号码列表同步到号码管理
* 将蜘蛛返回的号码列表同步到号码管理(全量镜像,以爬虫为准)
*/
public function syncFromUnifiedData(Ticket $ticket, UnifiedScrmData $data): void
{
@@ -61,7 +66,7 @@ class SplitTicketNumberSyncService
$newFollowers = (int) ($row['newFollowersToday'] ?? 0);
if (isset($existingMap[$number])) {
$this->updateExistingNumber($existingMap[$number], $platformStatus, $newFollowers);
$this->updateExistingNumber($ticket, $existingMap[$number], $platformStatus, $newFollowers);
continue;
}
@@ -87,6 +92,7 @@ class SplitTicketNumberSyncService
}
}
$deleteIds = [];
foreach ($existingMap as $number => $item) {
if (isset($syncedNumberSet[$number])) {
continue;
@@ -94,18 +100,58 @@ class SplitTicketNumberSyncService
if ((int) $item['manual_manage'] === 1) {
continue;
}
Number::where('id', (int) $item['id'])->update([
'status' => 'hidden',
$deleteIds[] = (int) $item['id'];
}
if ($deleteIds !== []) {
Number::where('id', 'in', $deleteIds)->delete();
}
}
/**
* 工单手动开启等非同步场景:按已存的 platform_status 对齐开关(不跑单号上限/下号比率)
*/
public function applyStatusFromPlatformSnapshot(Ticket $ticket): void
{
if ((string) ($ticket['status'] ?? 'hidden') !== 'normal') {
return;
}
$numbers = Number::where('admin_id', (int) $ticket['admin_id'])
->where('split_link_id', (int) $ticket['split_link_id'])
->where('ticket_name', (string) $ticket['ticket_name'])
->where('manual_manage', 0)
->select();
foreach ($numbers as $number) {
$platformStatus = (string) ($number['platform_status'] ?? 'offline');
Number::where('id', (int) $number['id'])->update([
'status' => self::resolveSwitchStatus($ticket, $platformStatus),
'updatetime' => time(),
]);
}
}
/**
* 云控在线 → 开启;离线 → 关闭;工单关闭时一律关闭
*/
public static function resolveSwitchStatus(Ticket $ticket, string $platformStatus): string
{
if ((string) ($ticket['status'] ?? 'hidden') !== 'normal') {
return 'hidden';
}
return $platformStatus === 'online' ? 'normal' : 'hidden';
}
/**
* @param Number $row
*/
private function updateExistingNumber($row, string $platformStatus, int $newFollowers): void
{
private function updateExistingNumber(
Ticket $ticket,
$row,
string $platformStatus,
int $newFollowers
): void {
$update = [
'platform_status' => $platformStatus,
'updatetime' => time(),
@@ -116,8 +162,8 @@ class SplitTicketNumberSyncService
return;
}
// 进线人数由同步写入,最终开关由 applyNumberRules 统一判定(单号上限/下号比率等)
$update['inbound_count'] = max(0, $newFollowers);
$update['status'] = self::resolveSwitchStatus($ticket, $platformStatus);
Number::where('id', (int) $row['id'])->update($update);
}
@@ -139,7 +185,7 @@ class SplitTicketNumberSyncService
'inbound_count' => max(0, $newFollowers),
'manual_manage' => 0,
'platform_status' => $platformStatus,
'status' => 'hidden',
'status' => self::resolveSwitchStatus($ticket, $platformStatus),
'createtime' => $now,
'updatetime' => $now,
];
@@ -148,10 +194,11 @@ class SplitTicketNumberSyncService
Db::name('split_number')->insert($data);
} catch (\Throwable $e) {
$exists = Number::where('split_link_id', (int) $ticket['split_link_id'])
->where('ticket_name', (string) $ticket['ticket_name'])
->where('number', $number)
->find();
if ($exists) {
$this->updateExistingNumber($exists, $platformStatus, $newFollowers);
$this->updateExistingNumber($ticket, $exists, $platformStatus, $newFollowers);
}
}
}