diff --git a/Server/application/command/CalculateWechatAccountScoreCommand.php b/Server/application/command/CalculateWechatAccountScoreCommand.php index 4182e1fa..2b1c996a 100644 --- a/Server/application/command/CalculateWechatAccountScoreCommand.php +++ b/Server/application/command/CalculateWechatAccountScoreCommand.php @@ -51,21 +51,21 @@ class CalculateWechatAccountScoreCommand extends Command $accountId = $input->getOption('account-id'); $batchSize = (int)$input->getOption('batch-size'); $forceRecalculate = $input->getOption('force-recalculate'); - + // 参数验证 if ($batchSize <= 0) { $batchSize = 50; // 默认批处理大小 } - + // 显示执行参数 $output->writeln("=========================================="); $output->writeln("开始统一计算微信账号健康分..."); $output->writeln("=========================================="); - + if ($accountId) { $output->writeln("指定账号ID: {$accountId}"); } - + if ($onlyInit) { $output->writeln("仅执行初始化步骤"); } elseif ($onlyUpdate) { @@ -73,147 +73,148 @@ class CalculateWechatAccountScoreCommand extends Command } elseif ($onlyBatch) { $output->writeln("仅执行批量更新健康分步骤"); } - + if ($forceRecalculate) { $output->writeln("强制重新计算基础分"); } - + $output->writeln("批处理大小: {$batchSize}"); - + // 记录命令开始执行的日志(仅在非交互模式下记录) if (!$output->isVerbose()) { Log::info('开始执行微信账号健康分计算命令', [ 'accountId' => $accountId, - 'onlyInit' => $onlyInit ? 'true' : 'false', - 'onlyUpdate' => $onlyUpdate ? 'true' : 'false', - 'onlyBatch' => $onlyBatch ? 'true' : 'false', - 'batchSize' => $batchSize, - 'forceRecalculate' => $forceRecalculate ? 'true' : 'false' - ]); - - $startTime = time(); - - try { - // 实例化服务 - $service = new WechatAccountHealthScoreService(); - } catch (\Exception $e) { - $errorMsg = "实例化WechatAccountHealthScoreService失败: " . $e->getMessage(); - $output->writeln("{$errorMsg}"); - Log::error($errorMsg); - return 1; // 返回非零状态码表示失败 + 'onlyInit' => $onlyInit ? 'true' : 'false', + 'onlyUpdate' => $onlyUpdate ? 'true' : 'false', + 'onlyBatch' => $onlyBatch ? 'true' : 'false', + 'batchSize' => $batchSize, + 'forceRecalculate' => $forceRecalculate ? 'true' : 'false' + ]); + + $startTime = time(); + + try { + // 实例化服务 + $service = new WechatAccountHealthScoreService(); + } catch (\Exception $e) { + $errorMsg = "实例化WechatAccountHealthScoreService失败: " . $e->getMessage(); + $output->writeln("{$errorMsg}"); + Log::error($errorMsg); + return 1; // 返回非零状态码表示失败 + } + + // 初始化统计数据 + $initStats = ['success' => 0, 'failed' => 0, 'errors' => []]; + $updateStats = ['total' => 0]; + $batchStats = ['success' => 0, 'failed' => 0, 'errors' => []]; + + try { + // 步骤1: 初始化未计算基础分的账号 + if (!$onlyUpdate && !$onlyBatch) { + $output->writeln("\n[步骤1] 初始化未计算基础分的账号..."); + $initStats = $this->initUncalculatedAccounts($service, $output, $accountId, $batchSize); + $output->writeln("初始化完成:成功 {$initStats['success']} 条,失败 {$initStats['failed']} 条"); + } + + // 步骤2: 更新评分记录(根据wechatId和alias不一致情况) + if (!$onlyInit && !$onlyBatch) { + $output->writeln("\n[步骤2] 更新评分记录(根据wechatId和alias不一致情况)..."); + $updateStats = $this->updateScoreRecords($service, $output, $accountId, $batchSize); + $output->writeln("更新完成:处理了 {$updateStats['total']} 条记录"); + } + + // 步骤3: 批量更新健康分(只更新动态分,不重新计算基础分) + if (!$onlyInit && !$onlyUpdate) { + $output->writeln("\n[步骤3] 批量更新健康分(只更新动态分)..."); + $batchStats = $this->batchUpdateHealthScore($service, $output, $accountId, $batchSize, $forceRecalculate); + $output->writeln("批量更新完成:成功 {$batchStats['success']} 条,失败 {$batchStats['failed']} 条"); + } + + // 统计信息 + $endTime = time(); + $duration = $endTime - $startTime; + + $output->writeln("\n=========================================="); + $output->writeln("任务完成!"); + $output->writeln("=========================================="); + $output->writeln("总耗时: {$duration} 秒"); + $output->writeln("初始化: 成功 {$initStats['success']} 条,失败 {$initStats['failed']} 条"); + $output->writeln("更新评分记录: {$updateStats['total']} 条"); + $output->writeln("批量更新: 成功 {$batchStats['success']} 条,失败 {$batchStats['failed']} 条"); + + // 记录命令执行完成的日志 + Log::info("微信账号健康分计算命令执行完成,总耗时: {$duration} 秒," . + "初始化: 成功 {$initStats['success']} 条,失败 {$initStats['failed']} 条," . + "更新评分记录: {$updateStats['total']} 条," . + "批量更新: 成功 {$batchStats['success']} 条,失败 {$batchStats['failed']} 条"); + + if (!empty($initStats['errors'])) { + $output->writeln("\n初始化错误详情:"); + Log::warning("初始化阶段出现 " . count($initStats['errors']) . " 个错误"); + + foreach (array_slice($initStats['errors'], 0, 10) as $error) { + $output->writeln(" 账号ID {$error['accountId']}: {$error['error']}"); + Log::error("初始化错误 - 账号ID {$error['accountId']}: {$error['error']}"); + } + + if (count($initStats['errors']) > 10) { + $output->writeln(" ... 还有 " . (count($initStats['errors']) - 10) . " 个错误"); + Log::warning("初始化错误过多,只记录前10个,还有 " . (count($initStats['errors']) - 10) . " 个错误未显示"); + } + } + + if (!empty($batchStats['errors'])) { + $output->writeln("\n批量更新错误详情:"); + Log::warning("批量更新阶段出现 " . count($batchStats['errors']) . " 个错误"); + + foreach (array_slice($batchStats['errors'], 0, 10) as $error) { + $output->writeln(" 账号ID {$error['accountId']}: {$error['error']}"); + Log::error("批量更新错误 - 账号ID {$error['accountId']}: {$error['error']}"); + } + + if (count($batchStats['errors']) > 10) { + $output->writeln(" ... 还有 " . (count($batchStats['errors']) - 10) . " 个错误"); + Log::warning("批量更新错误过多,只记录前10个,还有 " . (count($batchStats['errors']) - 10) . " 个错误未显示"); + } + } + + } catch (\PDOException $e) { + // 数据库异常 + $errorMsg = "数据库操作失败: " . $e->getMessage(); + $output->writeln("\n数据库错误: " . $errorMsg . ""); + $output->writeln($e->getTraceAsString()); + + // 记录数据库错误 + Log::error("数据库错误: " . $errorMsg); + Log::error("错误堆栈: " . $e->getTraceAsString()); + + return 2; // 数据库错误状态码 + } catch (\Exception $e) { + // 一般异常 + $errorMsg = "命令执行失败: " . $e->getMessage(); + $output->writeln("\n错误: " . $errorMsg . ""); + $output->writeln($e->getTraceAsString()); + + // 记录严重错误 + Log::error($errorMsg); + Log::error("错误堆栈: " . $e->getTraceAsString()); + + return 1; // 一般错误状态码 + } catch (\Throwable $e) { + // 其他所有错误 + $errorMsg = "严重错误: " . $e->getMessage(); + $output->writeln("\n严重错误: " . $errorMsg . ""); + $output->writeln($e->getTraceAsString()); + + // 记录严重错误 + Log::critical($errorMsg); + Log::critical("错误堆栈: " . $e->getTraceAsString()); + + return 3; // 严重错误状态码 + } + + return 0; // 成功执行 } - - // 初始化统计数据 - $initStats = ['success' => 0, 'failed' => 0, 'errors' => []]; - $updateStats = ['total' => 0]; - $batchStats = ['success' => 0, 'failed' => 0, 'errors' => []]; - - try { - // 步骤1: 初始化未计算基础分的账号 - if (!$onlyUpdate && !$onlyBatch) { - $output->writeln("\n[步骤1] 初始化未计算基础分的账号..."); - $initStats = $this->initUncalculatedAccounts($service, $output, $accountId, $batchSize); - $output->writeln("初始化完成:成功 {$initStats['success']} 条,失败 {$initStats['failed']} 条"); - } - - // 步骤2: 更新评分记录(根据wechatId和alias不一致情况) - if (!$onlyInit && !$onlyBatch) { - $output->writeln("\n[步骤2] 更新评分记录(根据wechatId和alias不一致情况)..."); - $updateStats = $this->updateScoreRecords($service, $output, $accountId, $batchSize); - $output->writeln("更新完成:处理了 {$updateStats['total']} 条记录"); - } - - // 步骤3: 批量更新健康分(只更新动态分,不重新计算基础分) - if (!$onlyInit && !$onlyUpdate) { - $output->writeln("\n[步骤3] 批量更新健康分(只更新动态分)..."); - $batchStats = $this->batchUpdateHealthScore($service, $output, $accountId, $batchSize, $forceRecalculate); - $output->writeln("批量更新完成:成功 {$batchStats['success']} 条,失败 {$batchStats['failed']} 条"); - } - - // 统计信息 - $endTime = time(); - $duration = $endTime - $startTime; - - $output->writeln("\n=========================================="); - $output->writeln("任务完成!"); - $output->writeln("=========================================="); - $output->writeln("总耗时: {$duration} 秒"); - $output->writeln("初始化: 成功 {$initStats['success']} 条,失败 {$initStats['failed']} 条"); - $output->writeln("更新评分记录: {$updateStats['total']} 条"); - $output->writeln("批量更新: 成功 {$batchStats['success']} 条,失败 {$batchStats['failed']} 条"); - - // 记录命令执行完成的日志 - Log::info("微信账号健康分计算命令执行完成,总耗时: {$duration} 秒," . - "初始化: 成功 {$initStats['success']} 条,失败 {$initStats['failed']} 条," . - "更新评分记录: {$updateStats['total']} 条," . - "批量更新: 成功 {$batchStats['success']} 条,失败 {$batchStats['failed']} 条"); - - if (!empty($initStats['errors'])) { - $output->writeln("\n初始化错误详情:"); - Log::warning("初始化阶段出现 " . count($initStats['errors']) . " 个错误"); - - foreach (array_slice($initStats['errors'], 0, 10) as $error) { - $output->writeln(" 账号ID {$error['accountId']}: {$error['error']}"); - Log::error("初始化错误 - 账号ID {$error['accountId']}: {$error['error']}"); - } - - if (count($initStats['errors']) > 10) { - $output->writeln(" ... 还有 " . (count($initStats['errors']) - 10) . " 个错误"); - Log::warning("初始化错误过多,只记录前10个,还有 " . (count($initStats['errors']) - 10) . " 个错误未显示"); - } - } - - if (!empty($batchStats['errors'])) { - $output->writeln("\n批量更新错误详情:"); - Log::warning("批量更新阶段出现 " . count($batchStats['errors']) . " 个错误"); - - foreach (array_slice($batchStats['errors'], 0, 10) as $error) { - $output->writeln(" 账号ID {$error['accountId']}: {$error['error']}"); - Log::error("批量更新错误 - 账号ID {$error['accountId']}: {$error['error']}"); - } - - if (count($batchStats['errors']) > 10) { - $output->writeln(" ... 还有 " . (count($batchStats['errors']) - 10) . " 个错误"); - Log::warning("批量更新错误过多,只记录前10个,还有 " . (count($batchStats['errors']) - 10) . " 个错误未显示"); - } - } - - } catch (\PDOException $e) { - // 数据库异常 - $errorMsg = "数据库操作失败: " . $e->getMessage(); - $output->writeln("\n数据库错误: " . $errorMsg . ""); - $output->writeln($e->getTraceAsString()); - - // 记录数据库错误 - Log::error("数据库错误: " . $errorMsg); - Log::error("错误堆栈: " . $e->getTraceAsString()); - - return 2; // 数据库错误状态码 - } catch (\Exception $e) { - // 一般异常 - $errorMsg = "命令执行失败: " . $e->getMessage(); - $output->writeln("\n错误: " . $errorMsg . ""); - $output->writeln($e->getTraceAsString()); - - // 记录严重错误 - Log::error($errorMsg); - Log::error("错误堆栈: " . $e->getTraceAsString()); - - return 1; // 一般错误状态码 - } catch (\Throwable $e) { - // 其他所有错误 - $errorMsg = "严重错误: " . $e->getMessage(); - $output->writeln("\n严重错误: " . $errorMsg . ""); - $output->writeln($e->getTraceAsString()); - - // 记录严重错误 - Log::critical($errorMsg); - Log::critical("错误堆栈: " . $e->getTraceAsString()); - - return 3; // 严重错误状态码 - } - - return 0; // 成功执行 } /**