修复号码数量列的数据统计方式

This commit is contained in:
root
2026-07-08 01:07:08 +08:00
parent 92b4faf61f
commit 76692e0021
16 changed files with 497 additions and 29 deletions
@@ -27,6 +27,7 @@ CREATE TABLE `fa_split_ticket` (
`number_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '号码数量含离线封号(同步)',
`number_offline_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '离线号码数(同步)',
`number_banned_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '封号号码数(同步)',
`active_number_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '本地开启号码数(status=normal)',
`online_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '在线人数(同步)',
`sync_status` enum('success','error','pending') NOT NULL DEFAULT 'pending' COMMENT '同步状态',
`sync_time` bigint(16) DEFAULT NULL COMMENT '最近同步时间',
@@ -0,0 +1,21 @@
-- 工单表:本地开启号码数(status=normal),列表直接读字段,避免子查询
SET NAMES utf8mb4;
ALTER TABLE `fa_split_ticket`
ADD COLUMN `active_number_count` int(10) unsigned NOT NULL DEFAULT 0
COMMENT '本地开启号码数(status=normal)' AFTER `number_banned_count`;
-- 历史数据回填
UPDATE `fa_split_ticket` t
SET t.`active_number_count` = (
SELECT COUNT(*)
FROM `fa_split_number` n
WHERE n.`admin_id` = t.`admin_id`
AND n.`split_link_id` = t.`split_link_id`
AND n.`ticket_name` = t.`ticket_name`
AND n.`status` = 'normal'
);
-- 加速按工单统计 status=normal 数量
ALTER TABLE `fa_split_number`
ADD KEY `idx_ticket_active` (`admin_id`, `split_link_id`, `ticket_name`(50), `status`);
@@ -18,6 +18,7 @@ use think\console\Output;
* 用法:
* php think split:sync-tickets
* php think split:sync-tickets --ticket=12
* php think split:sync-tickets --ticket=12 --mode=auto
*/
class SplitSyncTickets extends Command
{
@@ -25,21 +26,24 @@ class SplitSyncTickets extends Command
{
$this->setName('split:sync-tickets')
->addOption('ticket', 't', Option::VALUE_OPTIONAL, '指定工单 ID(强制同步,忽略周期)', '')
->addOption('mode', 'm', Option::VALUE_OPTIONAL, '同步方式: auto=定时自动, manual=手动触发', 'manual')
->setDescription('同步分流工单云控数据');
}
protected function execute(Input $input, Output $output): void
{
set_time_limit(0);
$syncMode = $this->resolveSyncMode($input);
SplitTicketSyncLogger::log('cli', 'command start', [
'ticketOption' => trim((string) $input->getOption('ticket')),
'syncMode' => $syncMode,
'appDebug' => SplitTicketSyncLogger::isEnabled(),
]);
$service = new SplitTicketSyncService();
$ticketId = trim((string) $input->getOption('ticket'));
if ($ticketId !== '' && ctype_digit($ticketId)) {
$result = $service->syncOne((int) $ticketId, true);
$result = $service->syncOne((int) $ticketId, true, false, $syncMode);
if (!empty($result['skipped'])) {
$output->writeln('<comment>跳过: ' . ($result['message'] ?? '') . '</comment>');
return;
@@ -71,4 +75,14 @@ class SplitSyncTickets extends Command
$output->writeln('<comment>详细调试日志已写入 runtime/log/split_sync.log</comment>');
}
}
/**
* 解析 CLI 同步方式,供 sync_success_mode 落库
*/
private function resolveSyncMode(Input $input): string
{
$mode = strtolower(trim((string) $input->getOption('mode')));
return in_array($mode, ['auto', 'manual'], true) ? $mode : 'manual';
}
}