Merge branch 'main' into dev: 同步分配管理优化、登录异常分型及历史数据刷正

This commit is contained in:
yml2213
2026-10-08 11:38:48 +08:00
25 changed files with 3031 additions and 1403 deletions
@@ -0,0 +1,72 @@
"""同步历史重登失败分型:根据最新 classify_failure 规则刷正 accounts 和 login_tasks
## 背景
新增了「必须绑定手机号」与「账号注销/封禁」分型,历史已存在报错文案的账号需要回写正确的 failure_kind,
使「登录异常一键筛选」与列表角标统计准确。
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
from web.backend.services.login_failure import classify_failure
revision: str = "20261008_0052"
down_revision: str | None = "20261004_0051"
branch_labels: str | None = None
depends_on: str | None = None
def upgrade() -> None:
conn = op.get_bind()
# 1. 查询 accounts 中有 relogin_last_error 的记录
rows = conn.execute(
sa.text(
"SELECT id, relogin_last_error, relogin_failure_kind "
"FROM accounts "
"WHERE relogin_last_error IS NOT NULL AND relogin_last_error != ''"
)
).fetchall()
for row in rows:
acc_id, err_text, current_kind = row[0], row[1], row[2]
new_kind = classify_failure(err_text)
if new_kind and new_kind != current_kind:
conn.execute(
sa.text("UPDATE accounts SET relogin_failure_kind = :k WHERE id = :id"),
{"k": new_kind, "id": acc_id},
)
# 2. 查询 login_tasks 中有 message 的记录
# 检查 login_tasks 是否有 relogin_failure_kind 列
col_exists = conn.execute(
sa.text(
"SELECT COUNT(*) FROM information_schema.columns "
"WHERE table_schema = DATABASE() "
"AND table_name = 'login_tasks' AND column_name = 'relogin_failure_kind'"
)
).scalar()
if col_exists:
task_rows = conn.execute(
sa.text(
"SELECT id, message, relogin_failure_kind "
"FROM login_tasks "
"WHERE message IS NOT NULL AND message != ''"
)
).fetchall()
for row in task_rows:
task_id, msg, current_kind = row[0], row[1], row[2]
new_kind = classify_failure(msg)
if new_kind and new_kind != current_kind:
conn.execute(
sa.text(
"UPDATE login_tasks SET relogin_failure_kind = :k WHERE id = :id"
),
{"k": new_kind, "id": task_id},
)
def downgrade() -> None:
pass
@@ -25,8 +25,8 @@ from __future__ import annotations
import sqlalchemy as sa
from alembic import op
revision: str = "20261007_0052"
down_revision: str | None = "20261004_0051"
revision: str = "20261008_0053"
down_revision: str | None = "20261008_0052"
branch_labels: str | None = None
depends_on: str | None = None