178 lines
7.1 KiB
PowerShell
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"
|