Bläddra i källkod

fix(s0): 归属默认值回落当前租户组织,并关闭下拉为空的用户提示

问题:getDefaultS0OrgScope 按固定种子编码 S0-C001 / S0-F001 求默认公司/工厂,
未铺该种子组织的租户(如 UATTEST_CHL,SysOrg 仅一个未标 Type 的根节点)取不到
默认归属,新增时 companyRefId / factoryRefId 为空,被后端 DTO 的
[Range(1, long.MaxValue)] 必填校验拦下,保存无法完成。

修复一:getDefaultS0OrgScope 找不到种子公司时回落到当前登录租户自身组织
(userInfo.orgId)。取 orgId 而非 tenantId,是因为这些租户既有 S0 数据的
company_ref_id / factory_ref_id 存的就是该值,沿用可与既有数据保持同一口径。
该函数由 applyDefaultOrgScopeForCreate / normalizeOrgScopeForSubmit 共用,
15 个 S0 页面一并生效。

修复二:公司/工厂已降级为前台隐藏的后台归属字段,下拉为空属这类租户的预期状态,
不应向用户弹警告。CustomerList / SupplierList / MaterialList 三处
ElMessage.warning 改为 console.warn,保留排查线索但不打扰用户。

不改后端、不动必填校验、不新建组织、不回填历史数据。

chore: bump version Web 2.4.318
YY968XX 1 dag sedan
förälder
incheckning
e92102bfee

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 {
 	"name": "admin.net",
 	"name": "admin.net",
 	"type": "module",
 	"type": "module",
-	"version": "2.4.317",
+	"version": "2.4.318",
 	"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 通用权限开发框架",

+ 29 - 3
Web/src/views/aidop/s0/composables/useS0MfgOrgScope.ts

@@ -1,4 +1,5 @@
 import { ref } from 'vue';
 import { ref } from 'vue';
+import { useUserInfo } from '/@/stores/userInfo';
 import { loadOrgList, type OrgOption } from '../api/s0SalesApi';
 import { loadOrgList, type OrgOption } from '../api/s0SalesApi';
 
 
 /**
 /**
@@ -59,12 +60,37 @@ function isEmptyScopeValue(v: unknown): boolean {
 }
 }
 
 
 /**
 /**
- * 从已加载组织列表按 code 求默认归属;取不到默认组织时返回空对象(不脑补 id/domainCode)。
- * domainCode 口径沿用页面既有约定:新记录取工厂 code。
+ * 兜底归属:当前登录租户自身的组织 Id(sysAuth/userInfo 的 orgId)。
+ *
+ * 适用于未铺设 S0-C001 / S0-F001 种子组织的租户(如 UAT 系列):这类租户的
+ * SysOrg 只有一个未标 Type 的根节点,公司(201)/工厂(501) 下拉均为空,
+ * 新增时取不到默认归属,会被后端 [Range(1, long.MaxValue)] 必填校验拦下。
+ *
+ * 取 orgId 而非 tenantId:这些租户既有 S0 数据的 company_ref_id / factory_ref_id
+ * 存的就是本值(SysTenant.OrgId),沿用可与既有数据保持同一口径,不引入新值。
+ */
+function getCurrentTenantOrgId(): string | undefined {
+	try {
+		const orgId = useUserInfo().userInfos?.orgId;
+		if (orgId == null || orgId === '' || orgId === '0') return undefined;
+		return String(orgId);
+	} catch {
+		// store 未就绪(例如单测直接调用本函数)时不阻断,退回无默认归属。
+		return undefined;
+	}
+}
+
+/**
+ * 从已加载组织列表按 code 求默认归属;取不到种子组织时回落到当前租户自身组织。
+ * 两者都取不到才返回空对象(不脑补 id/domainCode)。
+ * domainCode 口径沿用页面既有约定:新记录取工厂 code;兜底路径下不臆造,留空。
  */
  */
 export function getDefaultS0OrgScope(companyOptions: OrgOption[], factoryOptions: OrgOption[]): S0OrgScope {
 export function getDefaultS0OrgScope(companyOptions: OrgOption[], factoryOptions: OrgOption[]): S0OrgScope {
 	const company = companyOptions.find((item) => item.code === S0_DEFAULT_COMPANY_CODE);
 	const company = companyOptions.find((item) => item.code === S0_DEFAULT_COMPANY_CODE);
-	if (!company) return {};
+	if (!company) {
+		const tenantOrgId = getCurrentTenantOrgId();
+		return tenantOrgId ? { companyRefId: tenantOrgId, factoryRefId: tenantOrgId } : {};
+	}
 	const factory = factoryOptions.find((item) => item.code === S0_DEFAULT_FACTORY_CODE && item.pid === company.id);
 	const factory = factoryOptions.find((item) => item.code === S0_DEFAULT_FACTORY_CODE && item.pid === company.id);
 	return {
 	return {
 		companyRefId: company.id,
 		companyRefId: company.id,

+ 7 - 1
Web/src/views/aidop/s0/sales/CustomerList.vue

@@ -392,8 +392,14 @@ async function loadOptions() {
 	factoryOptions.value = factories.filter((item) => item.id && item.id !== '0');
 	factoryOptions.value = factories.filter((item) => item.id && item.id !== '0');
 	currencyOptions.value = currencies;
 	currencyOptions.value = currencies;
 
 
+	// 公司/工厂已降级为后台归属字段(前台隐藏、新增由 applyDefaultOrgScopeForCreate 兜底补当前租户组织),
+	// 未铺 S0-C001/S0-F001 种子组织的租户下拉本就为空,属预期状态,不再向用户弹提示,仅留控制台线索。
 	if (!companies.length || !factories.length || !currencies.length) {
 	if (!companies.length || !factories.length || !currencies.length) {
-		ElMessage.warning('部分下拉数据加载失败,请检查平台字典或组织种子');
+		console.warn('[s0] 客户信息维护:部分下拉数据为空', {
+			companies: companies.length,
+			factories: factories.length,
+			currencies: currencies.length,
+		});
 	}
 	}
 }
 }
 
 

+ 6 - 1
Web/src/views/aidop/s0/sales/MaterialList.vue

@@ -410,8 +410,13 @@ async function loadOptions() {
 	stockTypeOptions.value = stockTypes;
 	stockTypeOptions.value = stockTypes;
 	ownerApplicationOptions.value = ownerApplications;
 	ownerApplicationOptions.value = ownerApplications;
 
 
+	// 公司/工厂为后台归属字段,未铺种子组织的租户下拉本就为空,属预期状态,不再向用户弹提示。
 	if (!companies.length || !factories.length || !materialTypes.length) {
 	if (!companies.length || !factories.length || !materialTypes.length) {
-		ElMessage.warning('部分下拉数据加载失败,请检查平台种子数据');
+		console.warn('[s0] 物料维护:部分下拉数据为空', {
+			companies: companies.length,
+			factories: factories.length,
+			materialTypes: materialTypes.length,
+		});
 	}
 	}
 }
 }
 
 

+ 6 - 1
Web/src/views/aidop/s0/supply/SupplierList.vue

@@ -440,8 +440,13 @@ async function loadOptions() {
 	crTermsOptions.value = crTerms;
 	crTermsOptions.value = crTerms;
 	taxClassOptions.value = taxClass;
 	taxClassOptions.value = taxClass;
 
 
+	// 公司/工厂为后台归属字段,未铺种子组织的租户下拉本就为空,属预期状态,不再向用户弹提示。
 	if (!companies.length || !factories.length || !currencies.length) {
 	if (!companies.length || !factories.length || !currencies.length) {
-		ElMessage.warning('部分下拉数据加载失败,请检查平台字典或组织种子');
+		console.warn('[s0] 供应商维护:部分下拉数据为空', {
+			companies: companies.length,
+			factories: factories.length,
+			currencies: currencies.length,
+		});
 	}
 	}
 }
 }