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; // 成功执行
}
/**