This commit is contained in:
Your Name
2026-04-21 18:02:27 +08:00
parent a1d2ab4649
commit d899e0fe0a
301 changed files with 1937 additions and 344 deletions
@@ -101,6 +101,20 @@ class QywxExternalContactCallbackController extends BaseApiController
$state = (string) ($message['State'] ?? '');
$welcomeCode = (string) ($message['WelcomeCode'] ?? '');
$failReason = (string) ($message['FailReason'] ?? '');
$eventTime = (int) ($message['CreateTime'] ?? 0);
// 事件流水:一进来就落库(幂等),用于"今天进来多少人"等零误差统计;
// 独立于业务 UPSERT,即便后续 DB 逻辑抛错也不影响计数。
CustomerLogic::recordExternalContactEvent([
'change_type' => $changeType,
'user_id' => $userId,
'external_userid' => $extId,
'state' => $state,
'fail_reason' => $failReason,
'welcome_code' => $welcomeCode !== '' ? 1 : 0,
'event_time' => $eventTime,
'raw' => $message,
]);
if ($extId === '') {
Log::info(sprintf('qywx external contact callback: 无 ExternalUserID type=%s user=%s', $changeType, $userId));
@@ -133,7 +147,23 @@ class QywxExternalContactCallbackController extends BaseApiController
return;
}
// 其余变更(添加/编辑/删跟进人/转接成功/标签变化等):以 get 详情为准 UPSERT,避免遗漏未枚举的 ChangeType
if ($changeType === 'transfer_fail') {
// 转接失败(customer_refused 等):客户并未成功归属新员工,旧跟进人保持不变;
// 此时 /externalcontact/get 多半返回 84061「not external contact」,继续拉详情只会刷无意义 warning。
return;
}
if ($changeType === 'del_follow_user') {
// 某员工不再跟进该客户:只需把本地 follow_users 里对应 userid 移除;
// 若已无跟进人则软删;不再回调 /externalcontact/get(最后一个跟进人被删时会稳定返回 84061)。
if ($userId !== '') {
CustomerLogic::removeFollowUserFromLocal($extId, $userId);
}
return;
}
// 其余变更(添加/编辑/转接成功/标签变化等):以 get 详情为准 UPSERT,避免遗漏未枚举的 ChangeType
CustomerLogic::upsertSingleExternalContactFromApi($extId);
}
}