setAccessible(true); $catalog = [ ['tag_id' => 'tag-a', 'tag_name' => '最新标签 A', 'group_name' => '当前分组', 'customer_count' => 12], ['tag_id' => 'tag-disabled', 'tag_name' => '当前仍在用', 'group_name' => '当前分组', 'customer_count' => 8], ['tag_id' => 'tag-new', 'tag_name' => '新发现标签', 'group_name' => '其它', 'customer_count' => 3], ]; $configured = [ [ 'id' => 1, 'channel_code' => 'stable-a', 'channel_name' => '人工渠道名', 'source_tag_id' => 'tag-a', 'source_tag_name' => '旧标签 A', 'source_group_name' => '旧分组', 'status' => 1, ], [ 'id' => 2, 'channel_code' => 'stable-disabled', 'channel_name' => '停用时名称', 'source_tag_id' => 'tag-disabled', 'source_tag_name' => '停用时名称', 'source_group_name' => '旧分组', 'status' => 0, ], [ 'id' => 3, 'channel_code' => 'legacy-name-only', 'channel_name' => '历史个人标签', 'source_tag_id' => '', 'source_tag_name' => '历史个人标签', 'source_group_name' => '历史', 'status' => 1, ], ]; /** @var array> $rows */ $rows = $mergeMethod->invoke(null, $catalog, $configured); if (count($rows) !== count($catalog)) { throw new RuntimeException('Current-tag projection leaked a historical channel or lost a current tag'); } $byTagId = []; foreach ($rows as $row) { $byTagId[(string) ($row['source_tag_id'] ?? '')] = $row; } $renamed = $byTagId['tag-a'] ?? null; if (!is_array($renamed) || ($renamed['channel_code'] ?? '') !== 'stable-a' || ($renamed['channel_name'] ?? '') !== '最新标签 A' || ($renamed['source_tag_name'] ?? '') !== '最新标签 A' || ($renamed['source_group_name'] ?? '') !== '当前分组' || ($renamed['customer_count'] ?? 0) !== 12 || ($renamed['legacy_channel_name'] ?? '') !== '人工渠道名' || ($renamed['legacy_source_tag_name'] ?? '') !== '旧标签 A') { throw new RuntimeException('Current tag metadata did not override historical display metadata safely'); } $disabled = $byTagId['tag-disabled'] ?? null; if (!is_array($disabled) || ($disabled['channel_code'] ?? '') !== 'stable-disabled' || ($disabled['channel_name'] ?? '') !== '当前仍在用' || ($disabled['status'] ?? 0) !== 1) { throw new RuntimeException('A current WeCom tag was hidden by historical registry status'); } $newTag = $byTagId['tag-new'] ?? null; if (!is_array($newTag) || ($newTag['channel_code'] ?? '') !== 'tag_tag-new' || ($newTag['channel_name'] ?? '') !== '新发现标签') { throw new RuntimeException('A current unregistered tag did not receive its deterministic channel code'); } if (isset($byTagId['']) || in_array('legacy-name-only', array_column($rows, 'channel_code'), true)) { throw new RuntimeException('Historical name-only channels must not appear in the current-tag projection'); } if (in_array('--integration', $argv, true)) { $app = new think\App(); $app->initialize(); $startedAt = microtime(true); $currentCatalog = MediaChannelService::getCurrentTagCatalog(); $catalogElapsedMs = round((microtime(true) - $startedAt) * 1000, 1); $optionsStartedAt = microtime(true); $currentOptions = MediaChannelService::getCurrentTagOptions(); $optionsElapsedMs = round((microtime(true) - $optionsStartedAt) * 1000, 1); $statsStartedAt = microtime(true); $tagStats = CustomerLogic::getTagStats(); $statsElapsedMs = round((microtime(true) - $statsStartedAt) * 1000, 1); $elapsedMs = round((microtime(true) - $startedAt) * 1000, 1); $catalogById = []; foreach ($currentCatalog as $tag) { $catalogById[(string) ($tag['tag_id'] ?? '')] = $tag; } $statsById = []; foreach ($tagStats['groups'] ?? [] as $group) { foreach ($group['tags'] ?? [] as $tag) { $statsById[(string) ($tag['tag_id'] ?? '')] = [ 'tag_name' => (string) ($tag['tag_name'] ?? ''), 'group_name' => (string) ($group['group_name'] ?? ''), 'customer_count' => (int) ($tag['customer_count'] ?? 0), ]; } } if (count($catalogById) !== count($currentCatalog) || count($currentOptions) !== count($currentCatalog) || count($statsById) !== count($currentCatalog)) { throw new RuntimeException('Current catalog, qywx tag stats, and first-visit options are not one-to-one'); } foreach ($currentOptions as $option) { $tagId = (string) ($option['tag_id'] ?? ''); $catalogTag = $catalogById[$tagId] ?? null; if (!is_array($catalogTag) || ($option['name'] ?? '') !== ($catalogTag['tag_name'] ?? '') || ($option['group_name'] ?? '') !== ($catalogTag['group_name'] ?? '') || ($option['customer_count'] ?? 0) !== ($catalogTag['customer_count'] ?? 0) || MediaChannelService::getCurrentTagChannelByCode((string) ($option['code'] ?? '')) === null) { throw new RuntimeException("First-visit option {$tagId} differs from the current qywx tag catalog"); } } foreach ($catalogById as $tagId => $catalogTag) { $statsTag = $statsById[$tagId] ?? null; if (!is_array($statsTag) || $statsTag['tag_name'] !== (string) ($catalogTag['tag_name'] ?? '') || $statsTag['group_name'] !== (string) ($catalogTag['group_name'] ?? '') || $statsTag['customer_count'] !== (int) ($catalogTag['customer_count'] ?? 0)) { throw new RuntimeException("Qywx tag stats {$tagId} differs from the shared current catalog"); } } echo json_encode([ 'current_tag_count' => count($currentCatalog), 'first_visit_option_count' => count($currentOptions), 'qywx_tag_count' => count($statsById), 'matching_4' => array_values(array_map( static fn (array $option): string => (string) ($option['name'] ?? ''), array_filter( $currentOptions, static fn (array $option): bool => mb_strpos((string) ($option['name'] ?? ''), '4') !== false ) )), 'catalog_ms' => $catalogElapsedMs, 'options_ms' => $optionsElapsedMs, 'qywx_stats_ms' => $statsElapsedMs, 'elapsed_ms' => $elapsedMs, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), "\n"; } echo "CURRENT_TAG_CHANNEL_PROJECTION_OK\n";