Browse Source

fix(s0): remove work center domain requirement

工作中心主列表补做 S0-DOMAIN-FILTER-REMOVAL-READONLY-1「去 domain 化」,
该批次此前遗漏了 WorkCenter 一条链。

问题:页面首屏对所有非 AIDOP 租户恒为 0 条。
- AdoS0WorkCtrMasterQueryDto 是 10 个制造域查询 DTO 中唯一 [Required] Domain 的
- AdoS0MfgWorkCentersController 唯一使用无条件 .Where(x => x.Domain == domain)
- WorkCenterList.vue 是全 S0 唯一硬编码 domain: '8010' 的页面,且空 domain 时
  直接返空不发请求
而 '8010' 只匹配 AIDOP;AIDOPB / UATTEST_CHL / UATTEST_CHLB 的 WorkCtrMaster
Domain 均为 '2410',故三个租户该页均为空。

修复(与已上线的 4 个兄弟 controller / DTO / 页面写法一致):
- DTO:Domain 放宽为 string?,去掉 [Required]
- Controller:改用 WhereIF,显式传 Domain 时仍按其过滤
- 前端:domain 初值改空、去掉空 domain 不请求的 guard、空值不下传该参数

租户边界不变:仍由 ScopedTo(tenantId) + ITenantIdFilter 保证。
实测 UATTEST_CHL:不传 domain → 7;domain=2410 → 7;domain=8010 → 0;
返回 RecID 32-38 均属本租户(其它租户存在同名 WC000005-11 但未泄漏)。
写入路径 Upsert DTO 仍要求 Domain,未放宽。

chore: bump version server 1.0.404 / Web 2.4.328
YY968XX 2 days ago
parent
commit
05e3b45646

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 {
 	"name": "admin.net",
 	"name": "admin.net",
 	"type": "module",
 	"type": "module",
-	"version": "2.4.327",
+	"version": "2.4.328",
 	"packageManager": "pnpm@10.32.1",
 	"packageManager": "pnpm@10.32.1",
 	"lastBuildTime": "2026.03.15",
 	"lastBuildTime": "2026.03.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 4 - 7
Web/src/views/aidop/s0/manufacturing/WorkCenterList.vue

@@ -97,7 +97,8 @@ type Row = Record<string, any>;
 
 
 const query = reactive({
 const query = reactive({
 	keyword: '',
 	keyword: '',
-	domain: '8010',
+	// 去 domain 化(S0-DOMAIN-FILTER-REMOVAL-READONLY-1):首屏不预设工厂域,按租户返回全部工作中心。
+	domain: '',
 	page: 1,
 	page: 1,
 	pageSize: 20,
 	pageSize: 20,
 });
 });
@@ -127,16 +128,12 @@ const rules: FormRules = {
 async function loadList() {
 async function loadList() {
 	loading.value = true;
 	loading.value = true;
 	try {
 	try {
-		if (!query.domain.trim()) {
-			rows.value = [];
-			total.value = 0;
-			return;
-		}
+		// 去 domain 化:首屏直接请求,不再按工厂域过滤;用户显式填写工厂域时仍作为次级筛选条件下传。
 		const data = await s0MfgWorkCentersApi.list({
 		const data = await s0MfgWorkCentersApi.list({
 			page: query.page,
 			page: query.page,
 			pageSize: query.pageSize,
 			pageSize: query.pageSize,
 			keyword: query.keyword || undefined,
 			keyword: query.keyword || undefined,
-			domain: query.domain.trim(),
+			domain: query.domain.trim() || undefined,
 		});
 		});
 		rows.value = data.list as Row[];
 		rows.value = data.list as Row[];
 		total.value = data.total;
 		total.value = data.total;

+ 3 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.403</AssemblyVersion>
-    <FileVersion>1.0.403</FileVersion>
-    <Version>1.0.403</Version>
+    <AssemblyVersion>1.0.404</AssemblyVersion>
+    <FileVersion>1.0.404</FileVersion>
+    <Version>1.0.404</Version>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>

+ 4 - 2
server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/S0/Manufacturing/AdoS0MfgWorkCentersController.cs

@@ -27,9 +27,11 @@ public class AdoS0MfgWorkCentersController : ControllerBase
         var pageSize = q.PageSize;
         var pageSize = q.PageSize;
         (page, pageSize) = PagingGuard.Normalize(page, pageSize);
         (page, pageSize) = PagingGuard.Normalize(page, pageSize);
 
 
-        var domain = q.Domain.Trim();
+        // 去 domain 化(S0-DOMAIN-FILTER-REMOVAL-READONLY-1):主列表不再强制 Domain、不再因缺 domain 返空;
+        // 租户边界仍由 ScopedTo(tenantId) 显式保证。显式传入 Domain 时继续按其过滤(次级可选筛选)。
+        var domain = q.Domain?.Trim();
         var query = _rep.ScopedTo(tenantId)
         var query = _rep.ScopedTo(tenantId)
-            .Where(x => x.Domain == domain)
+            .WhereIF(!string.IsNullOrWhiteSpace(domain), x => x.Domain == domain)
             .WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
             .WhereIF(!string.IsNullOrWhiteSpace(q.Keyword),
                 x => x.WorkCtr.Contains(q.Keyword!)
                 x => x.WorkCtr.Contains(q.Keyword!)
                     || (x.Descr != null && x.Descr.Contains(q.Keyword!))
                     || (x.Descr != null && x.Descr.Contains(q.Keyword!))

+ 2 - 2
server/Plugins/Admin.NET.Plugin.AiDOP/Dto/S0/Manufacturing/AdoS0ManufacturingDtos.cs

@@ -563,9 +563,9 @@ public class AdoS0MfgLineMaterialUpsertDto
 /// </summary>
 /// </summary>
 public class AdoS0WorkCtrMasterQueryDto
 public class AdoS0WorkCtrMasterQueryDto
 {
 {
-    [Required(ErrorMessage = "工厂域不能为空")]
+    // 去 domain 化(S0-DOMAIN-FILTER-REMOVAL-READONLY-1):查询不再要求 Domain,放宽 [Required] 为可空;租户隔离由实体保证。
     [MaxLength(50)]
     [MaxLength(50)]
-    public string Domain { get; set; } = string.Empty;
+    public string? Domain { get; set; }
 
 
     public string? Keyword { get; set; }
     public string? Keyword { get; set; }