160 lines
5.6 KiB
PHP
160 lines
5.6 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace app\command;
|
|||
|
|
|
|||
|
|
use think\console\Command;
|
|||
|
|
use think\console\Input;
|
|||
|
|
use think\console\Output;
|
|||
|
|
use think\Db;
|
|||
|
|
use app\common\service\WechatAccountHealthScoreService;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 检测和修复s2_wechat_account表中wechatId和alias不一致的问题
|
|||
|
|
* 同时更新isModifiedAlias字段和健康分
|
|||
|
|
*/
|
|||
|
|
class CheckAndFixWechatAccountCommand extends Command
|
|||
|
|
{
|
|||
|
|
protected function configure()
|
|||
|
|
{
|
|||
|
|
$this->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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|