setName('wechat:check-and-fix') ->setDescription('检测和修复s2_wechat_account表中wechatId和alias不一致的问题,并更新健康分'); } protected function execute(Input $input, Output $output) { $output->writeln("开始检测和修复s2_wechat_account表..."); try { // 1. 检测wechatId和alias不一致的记录 $output->writeln("步骤1: 检测wechatId和alias不一致的记录..."); $inconsistentAccounts = $this->findInconsistentAccounts(); $output->writeln("发现 " . count($inconsistentAccounts) . " 条不一致记录"); if (empty($inconsistentAccounts)) { $output->writeln("没有发现不一致的记录,任务完成!"); return; } // 2. 修复不一致的记录 $output->writeln("步骤2: 修复不一致的记录..."); $fixedCount = $this->fixInconsistentAccounts($inconsistentAccounts); $output->writeln("已修复 " . $fixedCount . " 条记录"); // 3. 更新isModifiedAlias字段 $output->writeln("步骤3: 更新isModifiedAlias字段..."); $updatedCount = $this->updateModifiedAliasFlag(); $output->writeln("已更新 " . $updatedCount . " 条记录的isModifiedAlias字段"); // 4. 重新计算健康分 $output->writeln("步骤4: 重新计算健康分..."); $healthScoreService = new WechatAccountHealthScoreService(); $accountIds = array_column($inconsistentAccounts, 'id'); $stats = $healthScoreService->batchCalculateAndUpdate($accountIds, 100); $output->writeln("健康分计算完成:成功 " . $stats['success'] . " 条,失败 " . $stats['failed'] . " 条"); if (!empty($stats['errors'])) { $output->writeln("错误详情:"); foreach ($stats['errors'] as $error) { $output->writeln(" 账号ID {$error['accountId']}: {$error['error']}"); } } $output->writeln("任务完成!"); } catch (\Exception $e) { $output->writeln("错误: " . $e->getMessage()); $output->writeln($e->getTraceAsString()); } } /** * 查找wechatId和alias不一致的记录 * * @return array */ private function findInconsistentAccounts() { // 查找wechatId和alias不一致的记录 // 条件:wechatId不为空,alias不为空,且wechatId != alias $accounts = Db::table('s2_wechat_account') ->where('isDeleted', 0) ->where('wechatId', '<>', '') ->where('alias', '<>', '') ->whereRaw('wechatId != alias') ->field('id, wechatId, alias, nickname, isModifiedAlias') ->select(); return $accounts ?: []; } /** * 修复不一致的记录 * 策略:从s2_wechat_friend表中查找最新的alias值来更新 * * @param array $accounts 不一致的账号列表 * @return int 修复数量 */ private function fixInconsistentAccounts($accounts) { $fixedCount = 0; foreach ($accounts as $account) { $wechatId = $account['wechatId']; // 从s2_wechat_friend表中查找最新的alias值 $latestAlias = Db::table('s2_wechat_friend') ->where('wechatId', $wechatId) ->where('alias', '<>', '') ->order('updateTime', 'desc') ->value('alias'); // 如果找到了最新的alias,则更新 if (!empty($latestAlias) && $latestAlias !== $account['alias']) { Db::table('s2_wechat_account') ->where('id', $account['id']) ->update([ 'alias' => $latestAlias, 'updateTime' => time() ]); $fixedCount++; } } return $fixedCount; } /** * 更新isModifiedAlias字段 * 如果wechatId和alias不一致,则标记为已修改 * * @return int 更新数量 */ private function updateModifiedAliasFlag() { // 更新isModifiedAlias字段:wechatId != alias 的记录标记为1 $updatedCount = Db::table('s2_wechat_account') ->where('isDeleted', 0) ->where('wechatId', '<>', '') ->where('alias', '<>', '') ->whereRaw('wechatId != alias') ->update([ 'isModifiedAlias' => 1, 'updateTime' => time() ]); // 更新isModifiedAlias字段:wechatId == alias 的记录标记为0 Db::table('s2_wechat_account') ->where('isDeleted', 0) ->where('wechatId', '<>', '') ->where('alias', '<>', '') ->whereRaw('wechatId = alias') ->update([ 'isModifiedAlias' => 0, 'updateTime' => time() ]); return $updatedCount; } }