From f2f4cbf35bccb4452499fd72d9e6122f1e64f6f6 Mon Sep 17 00:00:00 2001 From: zzh <1368735060@qq.com> Date: Wed, 29 Jul 2026 18:28:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=97=A0=E9=82=AE=E7=AE=B1=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=94=B9=E7=94=A8=E5=8D=A0=E4=BD=8D=E9=82=AE=E7=AE=B1?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E7=A9=BA=E4=B8=B2=E6=92=9E=20uk=5Fu?= =?UTF-8?q?ser=5Femail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- sql/20260729_fix_user_empty_email.sql | 12 ++++++++ .../Services/Customers/CustomerService.cs | 11 ++++++++ .../Shared/CustomerContactHelper.cs | 28 +++++++++++++++++++ .../WeChat/WeChatCustomerService.cs | 3 +- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 sql/20260729_fix_user_empty_email.sql diff --git a/sql/20260729_fix_user_empty_email.sql b/sql/20260729_fix_user_empty_email.sql new file mode 100644 index 0000000..3485f95 --- /dev/null +++ b/sql/20260729_fix_user_empty_email.sql @@ -0,0 +1,12 @@ +-- 修复:微信注册无邮箱时曾写入 user.Email='',撞 uk_user_email 导致后续注册提示「邮箱已被占用」 +-- 将空邮箱改为「客户编号@noemail.local」占位(与 CustomerContactHelper.ResolveRbacEmailOrPlaceholder 一致) + +UPDATE `user` u +INNER JOIN `t_customer` c ON c.`UserId` = u.`userid` +SET u.`Email` = CONCAT(LOWER(TRIM(c.`CustomerCode`)), '@noemail.local') +WHERE u.`Email` IS NULL OR TRIM(u.`Email`) = ''; + +-- 无客户关联的残留空邮箱 +UPDATE `user` +SET `Email` = CONCAT('u', `userid`, '@noemail.local') +WHERE `Email` IS NULL OR TRIM(`Email`) = ''; diff --git a/src/Oms.Application/Services/Customers/CustomerService.cs b/src/Oms.Application/Services/Customers/CustomerService.cs index 8772f4f..5428b8f 100644 --- a/src/Oms.Application/Services/Customers/CustomerService.cs +++ b/src/Oms.Application/Services/Customers/CustomerService.cs @@ -193,6 +193,17 @@ public class CustomerService : ApplicationService customer.Phone = phone; customer.Email = email; await CustomerRepository.UpdateAsync(customer); + + // 同步 RBAC 登录邮箱,覆盖注册时的 @noemail.local 占位 + try + { + await RbacDbContext.Database.ExecuteSqlInterpolatedAsync( + $"UPDATE `user` SET `Email` = {email} WHERE `userid` = {customer.UserId} AND `IsDeleted` = 0"); + } + catch + { + // 客户资料已更新;RBAC 同步失败不阻断补全 + } } /// diff --git a/src/Oms.Application/Shared/CustomerContactHelper.cs b/src/Oms.Application/Shared/CustomerContactHelper.cs index 4237453..28bf55c 100644 --- a/src/Oms.Application/Shared/CustomerContactHelper.cs +++ b/src/Oms.Application/Shared/CustomerContactHelper.cs @@ -37,4 +37,32 @@ public static class CustomerContactHelper if (trimmed.Equals("undefined", StringComparison.OrdinalIgnoreCase)) return null; return trimmed; } + + /// + /// RBAC user.Email 有唯一索引,空串会撞库。 + /// 无真实邮箱时用客户编号生成占位,禁止写入 ''。 + /// + public static string ResolveRbacEmailOrPlaceholder(string? email, string customerCode) + { + var normalized = NormalizeOptionalContact(email); + if (normalized != null) + { + return normalized; + } + + var code = (customerCode ?? string.Empty).Trim().ToLowerInvariant(); + if (string.IsNullOrEmpty(code)) + { + code = Guid.NewGuid().ToString("N")[..12]; + } + + return $"{code}@noemail.local"; + } + + public static bool IsPlaceholderRbacEmail(string? email) + { + var value = email?.Trim(); + return !string.IsNullOrEmpty(value) + && value.EndsWith("@noemail.local", StringComparison.OrdinalIgnoreCase); + } } diff --git a/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs b/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs index e7eb8b2..8849424 100644 --- a/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs +++ b/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs @@ -130,7 +130,8 @@ public class WeChatCustomerService( Name = customerName, Account = customerCode, Password = password, - Email = email ?? string.Empty, + // 禁止 Email='':uk_user_email 会把第二条空邮箱当成占用 + Email = CustomerContactHelper.ResolveRbacEmailOrPlaceholder(email, customerCode), RoleIds = [customerRoleId] });