chore: 入库生产基线(2026-10-26 与 shop.douba.top 一致)

- 11 个已跟踪文件的在途改动此前只存在于工作区,生产已在运行
- 补入两个从未入库的文件:InternalController.php(app_03/box_app 内部接口)、
  config/internal.php(内部通信 key,值从 .env 读取,不含硬编码密钥)
- 逐文件 md5 比对过生产,内容一致

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-26 17:08:55 +08:00
parent c7f85ffbda
commit fc353899a9
13 changed files with 331 additions and 37 deletions

View File

@@ -104,6 +104,10 @@ class WorkClientServices extends BaseServices
$config = app()->make(WorkConfig::class);
$corpId = $config->corpId;
if (!$corpId) {
Log::info('work client authGetExternalcontact skip (empty corp_id) ' . json_encode([
'page' => $page,
'cursor_len' => strlen($cursor),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
return true;
}
/** @var WorkMemberServices $memberService */
@@ -111,6 +115,22 @@ class WorkClientServices extends BaseServices
$menmberList = $memberService->getDataList(['corp_id' => $corpId], ['userid'], $page, 1);
//没有数据就返回成功
if (!$menmberList) {
$memberCount = 0;
try {
$memberCount = $memberService->count(['corp_id' => $corpId]);
} catch (\Throwable $e) {
Log::error('work client authGetExternalcontact member count error ' . json_encode([
'corp_id' => $corpId,
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
}
Log::info('work client authGetExternalcontact done (no member) ' . json_encode([
'corp_id' => $corpId,
'page' => $page,
'member_count' => $memberCount,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
return true;
}
@@ -123,18 +143,43 @@ class WorkClientServices extends BaseServices
}
$userids = array_column($menmberList, 'userid');
Log::info('work client authGetExternalcontact fetch ' . json_encode([
'corp_id' => $corpId,
'page' => $page,
'cursor_len' => strlen($cursor),
'userids_count' => count($userids),
'tag_group_count' => count($tagRes['tag_group'] ?? []),
'tag_map_count' => count($tagMap),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
try {
$response = Work::getBatchClientList($userids, $cursor);
$externalContactList = $response['external_contact_list'] ?? [];
}catch (\Throwable $e){
Log::error('work client authGetExternalcontact batchGet exception ' . json_encode([
'corp_id' => $corpId,
'page' => $page,
'cursor_len' => strlen($cursor),
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
WorkClientJob::dispatchDo('authClient', [$page + 1, '']);
return true;
}
$stats = [
'external_contact_count' => count($externalContactList),
'client_insert' => 0,
'client_update' => 0,
'follow_insert' => 0,
'follow_update' => 0,
'tag_save' => 0,
'missing_client_map' => 0,
];
$external = [];
$followUser = [];//内部人员跟踪
$externalUserids = [];//客户信息
$this->transaction(function () use ($externalContactList, $corpId, $externalUserids, $followUser, $external, $tagMap) {
$followUser = [];
$externalUserids = [];
$this->transaction(function () use ($externalContactList, $corpId, $tagMap, &$stats, &$externalUserids, &$followUser, &$external) {
/** @var WechatUserServices $wechatUserService */
$wechatUserService = app()->make(WechatUserServices::class);
foreach ($externalContactList as $item) {
@@ -196,10 +241,12 @@ class WorkClientServices extends BaseServices
if ($this->dao->count(['external_userid' => $externalUserid, 'corp_id' => $corpId])) {
unset($externalContact['external_userid']);
$this->dao->update(['external_userid' => $externalUserid], $externalContact);
$stats['client_update']++;
} else {
$externalContact['create_time'] = $item['follow_info']['createtime'] ??time();
$externalContact['update_time'] = time();
$external[] = $externalContact;
$stats['client_insert']++;
}
}
if ($external) {
@@ -214,6 +261,7 @@ class WorkClientServices extends BaseServices
$tagService = app()->make(WorkClientFollowTagsServices::class);
foreach ($followUser as $userid => $items) {
if(!isset($clientList[$userid])){
$stats['missing_client_map']++;
continue;
}
$items['client_id'] = $clientList[$userid];
@@ -227,9 +275,11 @@ class WorkClientServices extends BaseServices
'add_way' => $items['add_way'],
'oper_userid' => $items['oper_userid'],
]);
$stats['follow_update']++;
} else {
$res = $followService->save($items);
$id = $res->id;
$stats['follow_insert']++;
}
if (!empty($items['tags'])) {
$tagService->delete(['follow_id' => $id]);
@@ -237,14 +287,32 @@ class WorkClientServices extends BaseServices
$tag['follow_id'] = $id;
}
$tagService->saveAll($items['tags']);
$stats['tag_save'] += count($items['tags']);
}
}
}
});
Log::info('work client authGetExternalcontact processed ' . json_encode([
'corp_id' => $corpId,
'page' => $page,
'cursor_len' => strlen($cursor),
'next_cursor_len' => strlen((string)($response['next_cursor'] ?? '')),
'stats' => $stats,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
if (isset($response['next_cursor']) && $response['next_cursor']) {
Log::info('work client authGetExternalcontact dispatch next_cursor ' . json_encode([
'corp_id' => $corpId,
'page' => $page,
'next_cursor_len' => strlen((string)$response['next_cursor']),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
WorkClientJob::dispatchDo('authClient', [$page, $response['next_cursor']]);
} else if (empty($response['next_cursor'])) {
Log::info('work client authGetExternalcontact dispatch next_page ' . json_encode([
'corp_id' => $corpId,
'page' => $page + 1,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
WorkClientJob::dispatchDo('authClient', [$page + 1, '']);
}