From 09ca1c96d748980770be63000837eff4a52e05dc Mon Sep 17 00:00:00 2001
From: xiaolipro <2357729423@qq.com>
Date: Tue, 13 Oct 2026 16:25:22 +0800
Subject: [PATCH] fix
---
Directory.Build.props | 2 +-
Fake.Local.EventBus.props | 4 +-
.../DataPerm/DataPermRepository.cs | 61 +++++++++----------
src/Oms.Application/DataPerm/DataPermStore.cs | 25 ++++----
.../Rbac/CustomerServiceAdvisorResolver.cs | 10 +--
.../Rbac/InternalUserRepository.cs | 27 ++++----
.../Rbac/UserProfileRepository.cs | 31 +++++-----
.../Services/Customers/CustomerService.cs | 14 +++--
.../Services/System/NoticeService.cs | 18 +++---
.../Shared/OmsRbacRegistrationGuard.cs | 57 +++++++++--------
.../Shared/OmsRbacUserDisplayNameResolver.cs | 3 +-
.../Shared/StaffAdvisorBinder.cs | 5 +-
src/SimpleAdmin.Api/Auth/AuthService.cs | 9 +--
src/SimpleAdmin.Api/SimpleAdminApiModule.cs | 2 +-
src/SimpleAdmin.Api/SimpleJwtService.cs | 5 +-
.../WeChat/WeChatCustomerService.cs | 5 +-
16 files changed, 142 insertions(+), 136 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 9220097..3814d0b 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -3,6 +3,6 @@
- 8.0.5.21
+ 8.0.5.22
diff --git a/Fake.Local.EventBus.props b/Fake.Local.EventBus.props
index 9e0099b..b6bfbf2 100644
--- a/Fake.Local.EventBus.props
+++ b/Fake.Local.EventBus.props
@@ -6,8 +6,8 @@
C:\Users\BSI\RiderProjects\fake2
- false
+ true
- false
+ true
diff --git a/src/Oms.Application/DataPerm/DataPermRepository.cs b/src/Oms.Application/DataPerm/DataPermRepository.cs
index b0975bb..b59b71c 100644
--- a/src/Oms.Application/DataPerm/DataPermRepository.cs
+++ b/src/Oms.Application/DataPerm/DataPermRepository.cs
@@ -1,5 +1,6 @@
using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oms.Application.Dtos.DataPerm;
@@ -11,7 +12,7 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
public async Task GetUserSnapshotAsync(Guid userId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT
u.`Id` AS `Id`,
u.`userid` AS `MapId`,
@@ -19,22 +20,21 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
u.`Name` AS `Name`,
u.`OrganizationId` AS `OrganizationId`,
o.`Name` AS `OrganizationName`
- FROM `user` u
- LEFT JOIN `organization` o ON o.`Id` = u.`OrganizationId` AND o.`IsDeleted` = 0
+ FROM `{{FakeTables.User}}` u
+ LEFT JOIN `{{FakeTables.Organization}}` o ON o.`Id` = u.`OrganizationId` AND o.`IsDeleted` = 0
WHERE u.`Id` = {0} AND u.`IsDeleted` = 0
LIMIT 1
""";
-
return await Db.Database.SqlQueryRaw(sql, userId.ToString())
.FirstOrDefaultAsync(cancellationToken);
}
public async Task IsPureCustomerUserAsync(Guid userId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT COUNT(*) AS `Value`
- FROM `user_role` ur
- INNER JOIN `role` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
+ FROM `{{FakeTables.UserRole}}` ur
+ INNER JOIN `{{FakeTables.Role}}` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
WHERE ur.`UserId` = {0}
AND r.`Code` <> 'Customer'
AND r.`Code` NOT LIKE 'CustomerSub_%'
@@ -47,12 +47,11 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
return false;
}
- const string hasRoleSql = """
+ var hasRoleSql = $$"""
SELECT COUNT(*) AS `Value`
- FROM `user_role` ur
+ FROM `{{FakeTables.UserRole}}` ur
WHERE ur.`UserId` = {0}
""";
-
var roleCount = await Db.Database.SqlQueryRaw(hasRoleSql, userId.ToString())
.FirstAsync(cancellationToken);
return roleCount > 0;
@@ -60,10 +59,10 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
public async Task IsAdminUserAsync(Guid userId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT COUNT(*) AS `Value`
- FROM `user_role` ur
- INNER JOIN `role` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
+ FROM `{{FakeTables.UserRole}}` ur
+ INNER JOIN `{{FakeTables.Role}}` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
WHERE ur.`UserId` = {0}
AND r.`Code` = 'Admin'
""";
@@ -74,21 +73,20 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
public async Task> GetUserRoleIdsAsync(Guid userId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT ur.`RoleId` AS `Value`
- FROM `user_role` ur
+ FROM `{{FakeTables.UserRole}}` ur
WHERE ur.`UserId` = {0}
""";
-
return await Db.Database.SqlQueryRaw(sql, userId.ToString())
.ToListAsync(cancellationToken);
}
public async Task> GetUserIdsByRoleAsync(Guid roleId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT ur.`UserId` AS `Value`
- FROM `user_role` ur
+ FROM `{{FakeTables.UserRole}}` ur
WHERE ur.`RoleId` = {0}
""";
@@ -115,7 +113,6 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
WHERE p.`IsDeleted` = 0
AND p.`RoleId` IN ({inClause})
""";
-
return await Db.Database.SqlQueryRaw(sql).ToListAsync(cancellationToken);
}
@@ -385,14 +382,14 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
public async Task> GetOrganizationSubtreeIdsAsync(Guid rootOrganizationId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
WITH RECURSIVE org_tree AS (
SELECT o.`Id`
- FROM `organization` o
+ FROM `{{FakeTables.Organization}}` o
WHERE o.`Id` = {0} AND o.`IsDeleted` = 0
UNION ALL
SELECT c.`Id`
- FROM `organization` c
+ FROM `{{FakeTables.Organization}}` c
INNER JOIN org_tree t ON c.`ParentId` = t.`Id`
WHERE c.`IsDeleted` = 0
)
@@ -414,22 +411,21 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
}
var inClause = string.Join(",", ids.Select(x => $"'{x}'"));
- var sql = $"""
+ var sql = $$"""
SELECT o.`Id` AS `Id`, o.`Name` AS `Name`
- FROM `organization` o
+ FROM `{{FakeTables.Organization}}` o
WHERE o.`IsDeleted` = 0
AND o.`Id` IN ({inClause})
""";
-
var rows = await Db.Database.SqlQueryRaw(sql).ToListAsync(cancellationToken);
return rows.ToDictionary(x => x.Id, x => x.Name ?? x.Id.ToString());
}
public async Task OrganizationExistsAndEnabledAsync(Guid organizationId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT COUNT(*) AS `Value`
- FROM `organization` o
+ FROM `{{FakeTables.Organization}}` o
WHERE o.`Id` = {0}
AND o.`IsDeleted` = 0
""";
@@ -450,13 +446,12 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
if (dataScope == DataPermConstants.DataScopeTeam)
{
- const string sql = """
+ var sql = $$"""
SELECT u.`userid` AS `Value`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`OrganizationId` = {0}
""";
-
return await Db.Database.SqlQueryRaw(sql, organizationId.ToString())
.ToListAsync(cancellationToken);
}
@@ -470,9 +465,9 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
}
var inClause = string.Join(",", orgIds.Select(x => $"'{x}'"));
- var sql = $"""
+ var sql = $$"""
SELECT u.`userid` AS `Value`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`OrganizationId` IN ({inClause})
""";
@@ -485,7 +480,7 @@ public class DataPermRepository(FakeRbacDbContext dbContext) : IScopedDependency
public async Task> GetDataResourcesAsync(CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $"""
SELECT
r.`Code` AS `Code`,
r.`Name` AS `Name`,
diff --git a/src/Oms.Application/DataPerm/DataPermStore.cs b/src/Oms.Application/DataPerm/DataPermStore.cs
index c2afb49..dd8da2c 100644
--- a/src/Oms.Application/DataPerm/DataPermStore.cs
+++ b/src/Oms.Application/DataPerm/DataPermStore.cs
@@ -2,6 +2,7 @@ using System.Text.Json;
using Fake.Application;
using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Oms.Application.Dtos.DataPerm;
@@ -20,21 +21,21 @@ public class DataPermStore(FakeRbacDbContext dbContext, DataPermContextCache cac
public async Task GetUserDataPermAsync(Guid userId, CancellationToken cancellationToken = default)
{
- var user = await dbContext.Database.SqlQueryRaw("""
+ var user = await dbContext.Database.SqlQueryRaw($$"""
SELECT
u.`Id` AS `UserId`,
u.`Name` AS `UserName`,
u.`OrganizationId` AS `OrganizationId`,
o.`Name` AS `OrganizationName`
- FROM `user` u
- LEFT JOIN `organization` o ON o.`Id` = u.`OrganizationId` AND o.`IsDeleted` = 0
+ FROM `{{FakeTables.User}}` u
+ LEFT JOIN `{{FakeTables.Organization}}` o ON o.`Id` = u.`OrganizationId` AND o.`IsDeleted` = 0
WHERE u.`Id` = {0} AND u.`IsDeleted` = 0
LIMIT 1
""", userId.ToString()).FirstOrDefaultAsync(cancellationToken)
?? throw new BusinessException("用户不存在");
var now = DateTime.UtcNow;
- var orgRows = await dbContext.Database.SqlQueryRaw("""
+ var orgRows = await dbContext.Database.SqlQueryRaw($$"""
SELECT
p.`Id` AS `Id`,
p.`OrganizationId` AS `OrganizationId`,
@@ -44,11 +45,11 @@ public class DataPermStore(FakeRbacDbContext dbContext, DataPermContextCache cac
p.`ExpireTime` AS `ExpireTime`,
p.`IsTemporary` AS `IsTemporary`
FROM `user_org_perm` p
- LEFT JOIN `organization` o ON o.`Id` = p.`OrganizationId` AND o.`IsDeleted` = 0
+ LEFT JOIN `{{FakeTables.Organization}}` o ON o.`Id` = p.`OrganizationId` AND o.`IsDeleted` = 0
WHERE p.`IsDeleted` = 0 AND p.`UserId` = {0}
""", userId.ToString()).ToListAsync(cancellationToken);
- var scopeRows = await dbContext.Database.SqlQueryRaw("""
+ var scopeRows = await dbContext.Database.SqlQueryRaw($"""
SELECT p.`Id` AS `Id`, p.`DataScope` AS `DataScope`, p.`DataResourceCode` AS `DataResourceCode`, p.`ExpireTime` AS `ExpireTime`
FROM `user_data_scope` p
WHERE p.`IsDeleted` = 0 AND p.`UserId` = {0}
@@ -129,16 +130,16 @@ public class DataPermStore(FakeRbacDbContext dbContext, DataPermContextCache cac
{
var role = await dbContext.Database.SqlQueryRaw("""
SELECT r.`Id` AS `RoleId`, r.`Name` AS `RoleName`
- FROM `role` r
+ FROM `{{FakeTables.Role}}` r
WHERE r.`Id` = {0} AND r.`IsDeleted` = 0
LIMIT 1
""", roleId.ToString()).FirstOrDefaultAsync(cancellationToken)
?? throw new BusinessException("角色不存在");
- var orgRows = await dbContext.Database.SqlQueryRaw("""
+ var orgRows = await dbContext.Database.SqlQueryRaw($$"""
SELECT p.`Id` AS `Id`, p.`OrganizationId` AS `OrganizationId`, o.`Name` AS `OrganizationName`, p.`OrgScope` AS `OrgScope`
FROM `role_org_perm` p
- LEFT JOIN `organization` o ON o.`Id` = p.`OrganizationId` AND o.`IsDeleted` = 0
+ LEFT JOIN `{{FakeTables.Organization}}` o ON o.`Id` = p.`OrganizationId` AND o.`IsDeleted` = 0
WHERE p.`IsDeleted` = 0 AND p.`RoleId` = {0}
""", roleId.ToString()).ToListAsync(cancellationToken);
@@ -520,7 +521,7 @@ public class DataPermStore(FakeRbacDbContext dbContext, DataPermContextCache cac
public async Task> GetFieldMasksAsync(string dataResourceCode, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $"""
SELECT m.`FieldName` AS `FieldName`, m.`SecretLevel` AS `SecretLevel`, m.`MaskType` AS `MaskType`, m.`MaskPattern` AS `MaskPattern`
FROM `data_perm_field_mask` m
WHERE m.`IsDeleted` = 0 AND m.`IsEnabled` = 1 AND m.`DataResourceCode` = {0}
@@ -640,7 +641,7 @@ public class DataPermStore(FakeRbacDbContext dbContext, DataPermContextCache cac
public async Task GetTemplateDetailAsync(Guid templateId, CancellationToken cancellationToken = default)
{
- const string headerSql = """
+ var headerSql = $"""
SELECT t.`Id` AS `Id`, t.`Name` AS `Name`, t.`Code` AS `Code`, t.`Description` AS `Description`,
t.`RoleCode` AS `RoleCode`, t.`IsBuiltIn` AS `IsBuiltIn`
FROM `data_perm_template` t
@@ -652,7 +653,7 @@ public class DataPermStore(FakeRbacDbContext dbContext, DataPermContextCache cac
.FirstOrDefaultAsync(cancellationToken)
?? throw new BusinessException("模板不存在");
- const string itemSql = """
+ var itemSql = $"""
SELECT i.`Id` AS `Id`, i.`DimensionType` AS `DimensionType`, CAST(i.`ItemContent` AS CHAR) AS `ItemContentJson`, i.`SortOrder` AS `SortOrder`
FROM `data_perm_template_item` i
WHERE i.`TemplateId` = {0} AND i.`IsDeleted` = 0
diff --git a/src/Oms.Application/Rbac/CustomerServiceAdvisorResolver.cs b/src/Oms.Application/Rbac/CustomerServiceAdvisorResolver.cs
index ea7f768..8cce024 100644
--- a/src/Oms.Application/Rbac/CustomerServiceAdvisorResolver.cs
+++ b/src/Oms.Application/Rbac/CustomerServiceAdvisorResolver.cs
@@ -1,5 +1,6 @@
using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oms.Application.Dtos.Customers;
@@ -41,18 +42,17 @@ public class CustomerServiceAdvisorResolver(FakeRbacDbContext dbContext) : IScop
return null;
}
- const string sql = """
+ var sql = $$"""
SELECT
u.`Name` AS `Name`,
u.`WechatId` AS `WechatId`,
u.`WechatQrCode` AS `WechatQrCode`,
u.`WecomKfUrl` AS `WecomKfUrl`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`userid` = {0}
LIMIT 1
""";
-
return await dbContext.Database
.SqlQueryRaw(sql, userId)
.FirstOrDefaultAsync(cancellationToken);
@@ -60,13 +60,13 @@ public class CustomerServiceAdvisorResolver(FakeRbacDbContext dbContext) : IScop
private async Task FindByNameOrAccountAsync(string key, CancellationToken cancellationToken)
{
- const string sql = """
+ var sql = $$"""
SELECT
u.`Name` AS `Name`,
u.`WechatId` AS `WechatId`,
u.`WechatQrCode` AS `WechatQrCode`,
u.`WecomKfUrl` AS `WecomKfUrl`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND (u.`Name` = {0} OR u.`Account` = {0})
ORDER BY u.`CreateTime` ASC
diff --git a/src/Oms.Application/Rbac/InternalUserRepository.cs b/src/Oms.Application/Rbac/InternalUserRepository.cs
index 2c48839..18f7784 100644
--- a/src/Oms.Application/Rbac/InternalUserRepository.cs
+++ b/src/Oms.Application/Rbac/InternalUserRepository.cs
@@ -1,5 +1,6 @@
using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oms.Application.Dtos.Rbac;
@@ -7,20 +8,19 @@ namespace Oms.Application.Rbac;
public class InternalUserRepository(FakeRbacDbContext dbContext) : IScopedDependency
{
- private const string InternalUserFilter = """
+ private static readonly string InternalUserFilter = $$"""
(
- NOT EXISTS (SELECT 1 FROM `user_role` ur0 WHERE ur0.`UserId` = u.`Id`)
+ NOT EXISTS (SELECT 1 FROM `{{FakeTables.UserRole}}` ur0 WHERE ur0.`UserId` = u.`Id`)
OR EXISTS (
SELECT 1
- FROM `user_role` ur
- INNER JOIN `role` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
+ FROM `{{FakeTables.UserRole}}` ur
+ INNER JOIN `{{FakeTables.Role}}` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
WHERE ur.`UserId` = u.`Id`
AND r.`Code` <> 'Customer'
AND r.`Code` NOT LIKE 'CustomerSub\_%'
)
)
""";
-
public async Task GetInternalUsersAsync(
string? keyword,
Guid? organizationId,
@@ -45,16 +45,16 @@ public class InternalUserRepository(FakeRbacDbContext dbContext) : IScopedDepend
args.Add(organizationId.Value.ToString());
}
- var countSql = $"""
+ var countSql = $$"""
SELECT COUNT(*) AS `Value`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
{where}
""";
var total = await dbContext.Database.SqlQueryRaw(countSql, args.ToArray())
.FirstAsync(cancellationToken);
var offset = Math.Max(page - 1, 0) * pageSize;
- var listSql = $"""
+ var listSql = $$"""
SELECT
u.`Id` AS `Id`,
u.`Name` AS `Name`,
@@ -67,13 +67,12 @@ public class InternalUserRepository(FakeRbacDbContext dbContext) : IScopedDepend
u.`OrganizationId` AS `OrganizationId`,
o.`Name` AS `OrganizationName`,
u.`CreateTime` AS `CreatedAt`
- FROM `user` u
- LEFT JOIN `organization` o ON o.`Id` = u.`OrganizationId` AND o.`IsDeleted` = 0
+ FROM `{{FakeTables.User}}` u
+ LEFT JOIN `{{FakeTables.Organization}}` o ON o.`Id` = u.`OrganizationId` AND o.`IsDeleted` = 0
{where}
ORDER BY u.`CreateTime` DESC
LIMIT {pageSize} OFFSET {offset}
""";
-
var rows = await dbContext.Database.SqlQueryRaw(listSql, args.ToArray())
.ToListAsync(cancellationToken);
if (rows.Count == 0)
@@ -112,14 +111,14 @@ public class InternalUserRepository(FakeRbacDbContext dbContext) : IScopedDepend
}
var inClause = string.Join(",", userIds.Select(x => $"'{x}'"));
- var sql = $"""
+ var sql = $$"""
SELECT
ur.`UserId` AS `UserId`,
r.`Id` AS `RoleId`,
r.`Name` AS `RoleName`,
r.`Code` AS `RoleCode`
- FROM `user_role` ur
- INNER JOIN `role` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
+ FROM `{{FakeTables.UserRole}}` ur
+ INNER JOIN `{{FakeTables.Role}}` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
WHERE ur.`UserId` IN ({inClause})
ORDER BY r.`Name`
""";
diff --git a/src/Oms.Application/Rbac/UserProfileRepository.cs b/src/Oms.Application/Rbac/UserProfileRepository.cs
index 7115b11..303e4e9 100644
--- a/src/Oms.Application/Rbac/UserProfileRepository.cs
+++ b/src/Oms.Application/Rbac/UserProfileRepository.cs
@@ -1,6 +1,7 @@
using System.Text.RegularExpressions;
using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oms.Application.Dtos.Rbac;
@@ -15,18 +16,17 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
public async Task GetAsync(Guid userId, CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT
u.`Phone` AS `Phone`,
u.`EmployeeNo` AS `EmployeeNo`,
u.`WechatId` AS `WechatId`,
u.`WechatQrCode` AS `WechatQrCode`,
u.`WecomKfUrl` AS `WecomKfUrl`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`Id` = {0} AND u.`IsDeleted` = 0
LIMIT 1
""";
-
var row = await dbContext.Database
.SqlQueryRaw(sql, userId.ToString())
.FirstOrDefaultAsync(cancellationToken);
@@ -56,7 +56,7 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
}
var inClause = string.Join(",", userIds.Select(x => $"'{x}'"));
- var sql = $"""
+ var sql = $$"""
SELECT
u.`Id` AS `UserId`,
u.`Phone` AS `Phone`,
@@ -64,7 +64,7 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
u.`WechatId` AS `WechatId`,
u.`WechatQrCode` AS `WechatQrCode`,
u.`WecomKfUrl` AS `WecomKfUrl`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`Id` IN ({inClause}) AND u.`IsDeleted` = 0
""";
@@ -83,8 +83,8 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
public async Task SaveAsync(Guid userId, UserProfileData profile, CancellationToken cancellationToken = default)
{
- const string sql = """
- UPDATE `user`
+ var sql = $$"""
+ UPDATE `{{FakeTables.User}}`
SET
`Phone` = {1},
`EmployeeNo` = {2},
@@ -93,7 +93,6 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
`WecomKfUrl` = {5}
WHERE `Id` = {0} AND `IsDeleted` = 0
""";
-
await dbContext.Database.ExecuteSqlRawAsync(
sql,
[
@@ -113,8 +112,8 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
UserProfileData profile,
CancellationToken cancellationToken = default)
{
- const string sql = """
- UPDATE `user`
+ var sql = $$"""
+ UPDATE `{{FakeTables.User}}`
SET
`Phone` = {1},
`WechatId` = {2},
@@ -142,16 +141,16 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
{
var normalized = employeeNo.Trim().ToUpperInvariant();
var sql = excludeUserId.HasValue
- ? """
+ ? $$"""
SELECT COUNT(*) AS `Value`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`EmployeeNo` = {0}
AND u.`Id` <> {1}
"""
- : """
+ : $$"""
SELECT COUNT(*) AS `Value`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`EmployeeNo` = {0}
""";
@@ -166,9 +165,9 @@ public class UserProfileRepository(FakeRbacDbContext dbContext) : IScopedDepende
public async Task GenerateNextEmployeeNoAsync(CancellationToken cancellationToken = default)
{
- const string sql = """
+ var sql = $$"""
SELECT u.`EmployeeNo` AS `EmployeeNo`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`EmployeeNo` IS NOT NULL
AND u.`EmployeeNo` <> ''
diff --git a/src/Oms.Application/Services/Customers/CustomerService.cs b/src/Oms.Application/Services/Customers/CustomerService.cs
index dd14bec..e58bc83 100644
--- a/src/Oms.Application/Services/Customers/CustomerService.cs
+++ b/src/Oms.Application/Services/Customers/CustomerService.cs
@@ -5,6 +5,7 @@ using Fake.Rbac.Application.Dtos.User;
using Fake.Rbac.Application.Services;
using Fake.Rbac.Infrastructure;
using Fake.Security.Claims;
+using Fake.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Oms.Application.Dtos.Customers;
@@ -203,8 +204,9 @@ public class CustomerService : ApplicationService
// 同步 RBAC 登录邮箱,覆盖注册时的 @noemail.local 占位
try
{
- await RbacDbContext.Database.ExecuteSqlInterpolatedAsync(
- $"UPDATE `user` SET `Email` = {email} WHERE `userid` = {customer.UserId} AND `IsDeleted` = 0");
+ await RbacDbContext.Database.ExecuteSqlRawAsync(
+ $"UPDATE `{FakeTables.User}` SET `Email` = {{0}} WHERE `userid` = {{1}} AND `IsDeleted` = 0",
+ email, customer.UserId);
}
catch
{
@@ -390,8 +392,8 @@ public class CustomerService : ApplicationService
private async Task GetRbacUserGuidByMapIdAsync(int mapId)
{
- return await RbacDbContext.Database.SqlQuery(
- $"select `Id` as `Value` from `user` where `userid` = {mapId} and `IsDeleted` = 0")
+ return await RbacDbContext.Database.SqlQueryRaw(
+ $"select `Id` as `Value` from `{FakeTables.User}` where `userid` = {{0}} and `IsDeleted` = 0", mapId)
.FirstOrDefaultAsync();
}
@@ -495,8 +497,8 @@ public class CustomerService : ApplicationService
private async Task GetRbacUserMapIdOrThrowAsync(Guid id)
{
- var userId = await RbacDbContext.Database.SqlQuery(
- $"select `userid` as `Value` from `user` where `Id` = {id}")
+ var userId = await RbacDbContext.Database.SqlQueryRaw(
+ $"select `userid` as `Value` from `{FakeTables.User}` where `Id` = {{0}}", id)
.FirstOrDefaultAsync();
if (!userId.HasValue || userId.Value <= 0)
{
diff --git a/src/Oms.Application/Services/System/NoticeService.cs b/src/Oms.Application/Services/System/NoticeService.cs
index d804de4..b8f30ac 100644
--- a/src/Oms.Application/Services/System/NoticeService.cs
+++ b/src/Oms.Application/Services/System/NoticeService.cs
@@ -1,6 +1,7 @@
using System.Linq.Expressions;
using Fake.Application;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Oms.Application.Dtos.Shared;
@@ -24,20 +25,19 @@ public class NoticeService : ApplicationService
private const string ReceiverTypeUser = "user";
private const string ReceiverTypeCustomer = "customer";
- private const string InternalUserFilter = """
+ private static readonly string InternalUserFilter = $$"""
(
- NOT EXISTS (SELECT 1 FROM `user_role` ur0 WHERE ur0.`UserId` = u.`Id`)
+ NOT EXISTS (SELECT 1 FROM `{{FakeTables.UserRole}}` ur0 WHERE ur0.`UserId` = u.`Id`)
OR EXISTS (
SELECT 1
- FROM `user_role` ur
- INNER JOIN `role` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
+ FROM `{{FakeTables.UserRole}}` ur
+ INNER JOIN `{{FakeTables.Role}}` r ON r.`Id` = ur.`RoleId` AND r.`IsDeleted` = 0
WHERE ur.`UserId` = u.`Id`
AND r.`Code` <> 'Customer'
AND r.`Code` NOT LIKE 'CustomerSub\_%'
)
)
""";
-
private INoticeRepository NoticeRepository => LazyServiceProvider.GetRequiredService();
private INoticeReadRepository NoticeReadRepository => LazyServiceProvider.GetRequiredService();
private ICustomerRepository CustomerRepository => LazyServiceProvider.GetRequiredService();
@@ -239,15 +239,15 @@ public class NoticeService : ApplicationService
args.Add(pattern);
}
- var countSql = $"SELECT COUNT(*) AS `Value` FROM `user` u {where}";
+ var countSql = $"SELECT COUNT(*) AS `Value` FROM `{{FakeTables.User}}` u {where}";
var total = await RbacDbContext.Database.SqlQueryRaw(countSql, args.ToArray()).FirstAsync();
var offset = Math.Max(pageIndex - 1, 0) * pageSize;
- var listSql = $"""
+ var listSql = $$"""
SELECT
u.`userid` AS `Value`,
u.`Name` AS `Label`,
u.`Account` AS `Extra`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
{where}
ORDER BY u.`Name`, u.`userid`
LIMIT {pageSize} OFFSET {offset}
@@ -465,7 +465,7 @@ public class NoticeService : ApplicationService
return [];
}
- var sql = $"SELECT `userid` AS `UserId` FROM `user` WHERE `IsDeleted` = 0 AND `userid` IN ({string.Join(",", userIds)})";
+ var sql = $"SELECT `userid` AS `UserId` FROM `{{FakeTables.User}}` WHERE `IsDeleted` = 0 AND `userid` IN ({string.Join(",", userIds)})";
return await RbacDbContext.Database.SqlQueryRaw(sql)
.Select(x => x.UserId)
.ToListAsync();
diff --git a/src/Oms.Application/Shared/OmsRbacRegistrationGuard.cs b/src/Oms.Application/Shared/OmsRbacRegistrationGuard.cs
index 6241a72..ae9c203 100644
--- a/src/Oms.Application/Shared/OmsRbacRegistrationGuard.cs
+++ b/src/Oms.Application/Shared/OmsRbacRegistrationGuard.cs
@@ -2,6 +2,7 @@ using System.Net.Mail;
using System.Text.RegularExpressions;
using Fake.Application;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace Oms.Application.Shared;
@@ -167,13 +168,13 @@ public static class OmsRbacRegistrationGuard
}
var hit = await rbacDbContext.Database
- .SqlQuery(
- $"""
+ .SqlQueryRaw(
+ $$"""
SELECT 1 AS Value
- FROM `organization`
- WHERE `Id` = {organizationId.Value.ToString()} AND `IsDeleted` = 0
+ FROM `{{FakeTables.Organization}}`
+ WHERE `Id` = {0} AND `IsDeleted` = 0
LIMIT 1
- """)
+ """, organizationId.Value.ToString())
.FirstOrDefaultAsync(cancellationToken);
if (!hit.HasValue)
@@ -201,13 +202,13 @@ public static class OmsRbacRegistrationGuard
foreach (var roleId in ids)
{
var hit = await rbacDbContext.Database
- .SqlQuery(
- $"""
+ .SqlQueryRaw(
+ $$"""
SELECT 1 AS Value
- FROM `role`
- WHERE `Id` = {roleId.ToString()} AND `IsDeleted` = 0
+ FROM `{{FakeTables.Role}}`
+ WHERE `Id` = {0} AND `IsDeleted` = 0
LIMIT 1
- """)
+ """, roleId.ToString())
.FirstOrDefaultAsync(cancellationToken);
if (!hit.HasValue)
@@ -492,15 +493,16 @@ public static class OmsRbacRegistrationGuard
if (excludeUserId is Guid id && id != Guid.Empty)
{
var hit = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `Account` = {account} AND `Id` <> {id.ToString()} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `Account` = {0} AND `Id` <> {1} LIMIT 1",
+ account, id.ToString())
.FirstOrDefaultAsync(cancellationToken);
return hit.HasValue;
}
var any = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `Account` = {account} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `Account` = {0} LIMIT 1", account)
.FirstOrDefaultAsync(cancellationToken);
return any.HasValue;
}
@@ -514,15 +516,16 @@ public static class OmsRbacRegistrationGuard
if (excludeUserId is Guid id && id != Guid.Empty)
{
var hit = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `Email` = {email} AND `Id` <> {id.ToString()} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `Email` = {0} AND `Id` <> {1} LIMIT 1",
+ email, id.ToString())
.FirstOrDefaultAsync(cancellationToken);
return hit.HasValue;
}
var any = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `Email` = {email} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `Email` = {0} LIMIT 1", email)
.FirstOrDefaultAsync(cancellationToken);
return any.HasValue;
}
@@ -536,15 +539,16 @@ public static class OmsRbacRegistrationGuard
if (excludeUserId is Guid id && id != Guid.Empty)
{
var hit = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `Phone` = {phone} AND `Id` <> {id.ToString()} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `Phone` = {0} AND `Id` <> {1} LIMIT 1",
+ phone, id.ToString())
.FirstOrDefaultAsync(cancellationToken);
return hit.HasValue;
}
var any = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `Phone` = {phone} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `Phone` = {0} LIMIT 1", phone)
.FirstOrDefaultAsync(cancellationToken);
return any.HasValue;
}
@@ -558,15 +562,16 @@ public static class OmsRbacRegistrationGuard
if (excludeUserId is Guid id && id != Guid.Empty)
{
var hit = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `WechatId` = {wechatId} AND `Id` <> {id.ToString()} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `WechatId` = {0} AND `Id` <> {1} LIMIT 1",
+ wechatId, id.ToString())
.FirstOrDefaultAsync(cancellationToken);
return hit.HasValue;
}
var any = await rbacDbContext.Database
- .SqlQuery(
- $"SELECT 1 AS Value FROM `user` WHERE `WechatId` = {wechatId} LIMIT 1")
+ .SqlQueryRaw(
+ $"SELECT 1 AS Value FROM `{{FakeTables.User}}` WHERE `WechatId` = {0} LIMIT 1", wechatId)
.FirstOrDefaultAsync(cancellationToken);
return any.HasValue;
}
diff --git a/src/Oms.Application/Shared/OmsRbacUserDisplayNameResolver.cs b/src/Oms.Application/Shared/OmsRbacUserDisplayNameResolver.cs
index 1b5b92d..38c277b 100644
--- a/src/Oms.Application/Shared/OmsRbacUserDisplayNameResolver.cs
+++ b/src/Oms.Application/Shared/OmsRbacUserDisplayNameResolver.cs
@@ -1,5 +1,6 @@
using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace Oms.Application.Shared;
@@ -40,7 +41,7 @@ public class OmsRbacUserDisplayNameResolver : IScopedDependency
try
{
var sql =
- $"SELECT `userid` AS `{nameof(RbacUserNameRow.UserId)}`, `Name` AS `{nameof(RbacUserNameRow.DisplayName)}` FROM `user` WHERE `IsDeleted` = 0 AND `userid` IN ({string.Join(",", ids)})";
+ $"SELECT `userid` AS `{nameof(RbacUserNameRow.UserId)}`, `Name` AS `{nameof(RbacUserNameRow.DisplayName)}` FROM `{FakeTables.User}` WHERE `IsDeleted` = 0 AND `userid` IN ({string.Join(",", ids)})";
var rows = await _rbacDbContext.Database
.SqlQueryRaw(sql)
.ToListAsync(cancellationToken);
diff --git a/src/Oms.Application/Shared/StaffAdvisorBinder.cs b/src/Oms.Application/Shared/StaffAdvisorBinder.cs
index 48c9719..0dafc40 100644
--- a/src/Oms.Application/Shared/StaffAdvisorBinder.cs
+++ b/src/Oms.Application/Shared/StaffAdvisorBinder.cs
@@ -1,4 +1,5 @@
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Oms.Domain.CustomersAggregate.Entities;
@@ -44,9 +45,9 @@ public static class StaffAdvisorBinder
string key,
CancellationToken cancellationToken)
{
- const string sql = """
+ var sql = $$"""
SELECT u.`Account` AS `Account`
- FROM `user` u
+ FROM `{{FakeTables.User}}` u
WHERE u.`IsDeleted` = 0
AND u.`Account` = {0}
ORDER BY u.`CreateTime` ASC
diff --git a/src/SimpleAdmin.Api/Auth/AuthService.cs b/src/SimpleAdmin.Api/Auth/AuthService.cs
index 632f352..d94eccf 100644
--- a/src/SimpleAdmin.Api/Auth/AuthService.cs
+++ b/src/SimpleAdmin.Api/Auth/AuthService.cs
@@ -12,6 +12,7 @@ using Fake.Rbac.Domain.UserAggregate;
using Fake.Rbac.Infrastructure;
using Fake.Security.Claims;
using Fake.Users;
+using Fake.EntityFrameworkCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
@@ -904,15 +905,15 @@ public partial class AuthService(
private async Task GetRbacUserGuidByMapIdAsync(int userId, CancellationToken cancellationToken)
{
- return await rbacDbContext.Database.SqlQuery(
- $"select `Id` as `Value` from `user` where `IsDeleted` = 0 and `userid` = {userId}")
+ return await rbacDbContext.Database.SqlQueryRaw(
+ $"select `Id` as `Value` from `{FakeTables.User}` where `IsDeleted` = 0 and `userid` = {{0}}", userId)
.FirstOrDefaultAsync(cancellationToken);
}
private async Task GetMapIdByUserGuidAsync(Guid userId, CancellationToken cancellationToken)
{
- return await rbacDbContext.Database.SqlQuery(
- $"select `userid` as `Value` from `user` where `Id` = {userId}")
+ return await rbacDbContext.Database.SqlQueryRaw(
+ $"select `userid` as `Value` from `{FakeTables.User}` where `Id` = {{0}}", userId)
.FirstOrDefaultAsync(cancellationToken);
}
diff --git a/src/SimpleAdmin.Api/SimpleAdminApiModule.cs b/src/SimpleAdmin.Api/SimpleAdminApiModule.cs
index 19726d7..d55ca7b 100644
--- a/src/SimpleAdmin.Api/SimpleAdminApiModule.cs
+++ b/src/SimpleAdmin.Api/SimpleAdminApiModule.cs
@@ -187,7 +187,7 @@ public class SimpleAdminApiModule : FakeModule
// 路由 - 必须在认证和授权之前
app.UseRouting();
- // EventBus Dashboard(CAP 风格;也可依赖 IStartupFilter 自动挂载,这里显式保证顺序)
+ // EventBus Dashboard:必须在 UsePathBase 之后,否则 /admin/eventbus 会 404
app.UseFakeEventBusDashboard();
// OpenAPI 验签需读取原始 Body,允许二次读流
diff --git a/src/SimpleAdmin.Api/SimpleJwtService.cs b/src/SimpleAdmin.Api/SimpleJwtService.cs
index adfe75f..9283a2f 100644
--- a/src/SimpleAdmin.Api/SimpleJwtService.cs
+++ b/src/SimpleAdmin.Api/SimpleJwtService.cs
@@ -5,6 +5,7 @@ using Fake.Rbac.Application.Jwt;
using Fake.Rbac.Application.Services;
using Fake.Rbac.Infrastructure;
using Fake.Security.Claims;
+using Fake.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
@@ -21,8 +22,8 @@ public class SimpleJwtService(IOptions jwtOptions, UserService u
CancellationToken cancellationToken)
{
var claims = await base.GenerateClaimsByUserIdAsync(userId, cancellationToken);
- var mapId = await rbacDbContext.Database.SqlQuery(
- $"select `userid` as `Value` from `user` where `Id` = {userId}")
+ var mapId = await rbacDbContext.Database.SqlQueryRaw(
+ $"select `userid` as `Value` from `{FakeTables.User}` where `Id` = {{0}}", userId)
.FirstOrDefaultAsync(cancellationToken);
if (mapId.HasValue)
{
diff --git a/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs b/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs
index f76a3ed..f8fb209 100644
--- a/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs
+++ b/src/SimpleAdmin.Api/WeChat/WeChatCustomerService.cs
@@ -4,6 +4,7 @@ using Fake.Rbac.Application.Dtos.Role;
using Fake.Rbac.Application.Dtos.User;
using Fake.Rbac.Application.Services;
using Fake.Rbac.Infrastructure;
+using Fake.EntityFrameworkCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
@@ -323,8 +324,8 @@ public class WeChatCustomerService(
private async Task GetRbacUserMapIdOrThrowAsync(Guid id, CancellationToken cancellationToken)
{
- var userId = await rbacDbContext.Database.SqlQuery(
- $"select `userid` as `Value` from `user` where `Id` = {id}")
+ var userId = await rbacDbContext.Database.SqlQueryRaw(
+ $"select `userid` as `Value` from `{FakeTables.User}` where `Id` = {{0}}", id)
.FirstOrDefaultAsync(cancellationToken);
if (!userId.HasValue || userId.Value <= 0)
{