Files
inquiry_robot/deploy/_remote_clear_demo_data.ps1
T

178 lines
7.1 KiB
PowerShell

# 清空 inquiry_robot:询价工单及相关、员工岗位;账号仅保留 admin。
# 只动业务/账号数据,不动角色菜单、报价模板、机器人回复语。
# 禁止对现网 jeecg-boot 执行。
$ErrorActionPreference = "Stop"
$mysql = "C:\yutongda\tools\mysql-8.0.39-winx64\bin\mysql.exe"
if (-not (Test-Path $mysql)) {
$alt = Get-ChildItem "C:\yutongda\tools" -Recurse -Filter "mysql.exe" -ErrorAction SilentlyContinue | Select-Object -First 1
if ($alt) { $mysql = $alt.FullName }
}
if (-not (Test-Path $mysql)) { throw "mysql.exe not found" }
$envFile = "E:\wwwroot\.env"
if (-not (Test-Path $envFile)) { throw "missing $envFile" }
$hostn = "10.206.0.14"
$user = "inquiry_robot"
$pass = $null
$db = "inquiry_robot"
$port = "3306"
Get-Content $envFile | ForEach-Object {
if ($_ -match '^MYSQL_HOST=(.+)$') { $hostn = $Matches[1].Trim() }
if ($_ -match '^MYSQL_PORT=(.+)$') { $port = $Matches[1].Trim() }
if ($_ -match '^MYSQL_USER=(.+)$') { $user = $Matches[1].Trim() }
if ($_ -match '^MYSQL_PASSWORD=(.+)$') { $pass = $Matches[1].Trim() }
if ($_ -match '^MYSQL_DB=(.+)$') { $db = $Matches[1].Trim() }
}
if (-not $pass) { throw "MYSQL_PASSWORD missing in .env" }
if ($db -ne "inquiry_robot") { throw "refuse: MYSQL_DB=$db (must be inquiry_robot)" }
Write-Output ("target=" + $hostn + ":" + $port + "/" + $db + " user=" + $user)
# 先看清除前计数(表不存在则跳过)
$beforeSql = @"
SELECT 'BEFORE' AS phase;
SELECT 'inq_ticket' AS t, COUNT(*) AS c FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_ticket'
AND (SELECT COUNT(*) FROM inq_ticket) IS NOT NULL;
"@
function Invoke-Mysql([string]$sql) {
$out = & $mysql -h $hostn -P $port -u $user "-p$pass" --default-character-set=utf8mb4 --batch --raw $db -e $sql 2>&1
$out | ForEach-Object {
$s = "$_"
if ($s -match "Warning|Using a password") { return }
$s
}
if ($LASTEXITCODE -ne 0) {
throw ("mysql failed exit=" + $LASTEXITCODE + " sql_head=" + $sql.Substring(0, [Math]::Min(80, $sql.Length)))
}
}
# 动态:仅对已存在的表做 TRUNCATE / DELETE
$clearSql = @"
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS=0;
-- ---------- 工单及附属 ----------
DELETE FROM inq_exception_case WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_exception_case');
DELETE FROM inq_attachment WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_attachment');
DELETE FROM inq_quote WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_quote');
DELETE FROM inq_ticket_status_log WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_ticket_status_log');
DELETE FROM inq_ticket_segment WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_ticket_segment');
DELETE FROM inq_ticket WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_ticket');
DELETE FROM inq_dashboard_snapshot WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_dashboard_snapshot');
-- ---------- 员工岗位 ----------
DELETE FROM inq_staff_role WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='inq_staff_role');
-- ---------- 账号:仅保留 admin ----------
-- 先删非 admin 的关联,再删非 admin 用户
DELETE ur FROM sys_user_role ur
INNER JOIN sys_user u ON u.id = ur.user_id
WHERE LOWER(u.username) <> 'admin';
DELETE ut FROM sys_user_tenant ut
INNER JOIN sys_user u ON u.id = ut.user_id
WHERE LOWER(u.username) <> 'admin';
DELETE ud FROM sys_user_depart ud
INNER JOIN sys_user u ON u.id = ud.user_id
WHERE LOWER(u.username) <> 'admin';
DELETE FROM sys_user WHERE LOWER(username) <> 'admin';
SET FOREIGN_KEY_CHECKS=1;
SELECT 'AFTER_COUNTS' AS phase;
SELECT 'inq_ticket' AS t, (SELECT COUNT(*) FROM inq_ticket) AS c
UNION ALL SELECT 'inq_ticket_status_log', (SELECT COUNT(*) FROM inq_ticket_status_log)
UNION ALL SELECT 'inq_ticket_segment', (SELECT COUNT(*) FROM inq_ticket_segment)
UNION ALL SELECT 'inq_quote', (SELECT COUNT(*) FROM inq_quote)
UNION ALL SELECT 'inq_attachment', (SELECT COUNT(*) FROM inq_attachment)
UNION ALL SELECT 'inq_exception_case', (SELECT COUNT(*) FROM inq_exception_case)
UNION ALL SELECT 'inq_staff_role', (SELECT COUNT(*) FROM inq_staff_role)
UNION ALL SELECT 'sys_user', (SELECT COUNT(*) FROM sys_user)
UNION ALL SELECT 'sys_user_role', (SELECT COUNT(*) FROM sys_user_role);
SELECT id, username, realname, status FROM sys_user;
"@
# 部分环境可能没有某附属表:改用逐表安全清理
$probe = Invoke-Mysql "SHOW TABLES;"
Write-Output "=== tables ==="
$probe | ForEach-Object { $_ }
$tables = @($probe | Where-Object { $_ -and $_ -ne "Tables_in_inquiry_robot" })
function Table-Exists([string]$name) {
return $tables -contains $name
}
$stmts = New-Object System.Collections.Generic.List[string]
$stmts.Add("SET NAMES utf8mb4;")
$stmts.Add("SET FOREIGN_KEY_CHECKS=0;")
# 工单相关
foreach ($t in @(
"inq_exception_case",
"inq_attachment",
"inq_quote",
"inq_ticket_status_log",
"inq_ticket_segment",
"inq_ticket",
"inq_dashboard_snapshot",
"inq_staff_role"
)) {
if (Table-Exists $t) {
$stmts.Add("DELETE FROM ``$t``;")
Write-Output ("will_clear=" + $t)
} else {
Write-Output ("skip_missing=" + $t)
}
}
if (Table-Exists "sys_user") {
if (Table-Exists "sys_user_role") {
$stmts.Add("DELETE ur FROM sys_user_role ur INNER JOIN sys_user u ON u.id = ur.user_id WHERE LOWER(u.username) <> 'admin';")
}
if (Table-Exists "sys_user_tenant") {
$stmts.Add("DELETE ut FROM sys_user_tenant ut INNER JOIN sys_user u ON u.id = ut.user_id WHERE LOWER(u.username) <> 'admin';")
}
if (Table-Exists "sys_user_depart") {
$stmts.Add("DELETE ud FROM sys_user_depart ud INNER JOIN sys_user u ON u.id = ud.user_id WHERE LOWER(u.username) <> 'admin';")
}
$stmts.Add("DELETE FROM sys_user WHERE LOWER(username) <> 'admin';")
Write-Output "will_clear_sys_user_keep_admin=1"
} else {
Write-Output "skip_missing=sys_user"
}
$stmts.Add("SET FOREIGN_KEY_CHECKS=1;")
# 执行前计数
Write-Output "=== BEFORE ==="
foreach ($t in @("inq_ticket","inq_staff_role","sys_user")) {
if (Table-Exists $t) {
Invoke-Mysql "SELECT '$t' AS t, COUNT(*) AS c FROM ``$t``;" | ForEach-Object { $_ }
}
}
if (Table-Exists "sys_user") {
Invoke-Mysql "SELECT username, realname FROM sys_user;" | ForEach-Object { $_ }
}
$execSql = ($stmts -join "`n")
Write-Output "=== EXEC ==="
Invoke-Mysql $execSql | ForEach-Object { $_ }
Write-Output "=== AFTER ==="
foreach ($t in @("inq_ticket","inq_ticket_status_log","inq_ticket_segment","inq_quote","inq_attachment","inq_exception_case","inq_staff_role","sys_user","sys_user_role")) {
if (Table-Exists $t) {
Invoke-Mysql "SELECT '$t' AS t, COUNT(*) AS c FROM ``$t``;" | ForEach-Object { $_ }
}
}
if (Table-Exists "sys_user") {
Invoke-Mysql "SELECT id, username, realname, status FROM sys_user;" | ForEach-Object { $_ }
}
Write-Output "CLEAR_DEMO_DATA_DONE"