|
@@ -206,6 +206,7 @@ import { computed, nextTick, onMounted, reactive, ref, watch } from 'vue';
|
|
|
import { useRoute } from 'vue-router';
|
|
import { useRoute } from 'vue-router';
|
|
|
import { ElMessage, ElMessageBox, type FormInstance, type FormRules, type TableInstance } from 'element-plus';
|
|
import { ElMessage, ElMessageBox, type FormInstance, type FormRules, type TableInstance } from 'element-plus';
|
|
|
import AidopDemoShell from '../../components/AidopDemoShell.vue';
|
|
import AidopDemoShell from '../../components/AidopDemoShell.vue';
|
|
|
|
|
+import { filterFactoriesForCompany, loadCompanyFactoryOptions } from '../composables/useS0MfgOrgScope';
|
|
|
import {
|
|
import {
|
|
|
loadOrgList,
|
|
loadOrgList,
|
|
|
s0ContractReviewCyclesApi,
|
|
s0ContractReviewCyclesApi,
|
|
@@ -250,6 +251,7 @@ const formRef = ref<FormInstance>();
|
|
|
|
|
|
|
|
const companyOptions = ref<OrgOption[]>([]);
|
|
const companyOptions = ref<OrgOption[]>([]);
|
|
|
const factoryOptions = ref<OrgOption[]>([]);
|
|
const factoryOptions = ref<OrgOption[]>([]);
|
|
|
|
|
+const singleOrgMode = ref(false);
|
|
|
|
|
|
|
|
// ── 同步开关(工厂级) ─────────────────────────────────────────────────
|
|
// ── 同步开关(工厂级) ─────────────────────────────────────────────────
|
|
|
const syncEnabled = ref(false);
|
|
const syncEnabled = ref(false);
|
|
@@ -275,10 +277,12 @@ const breakdownTitle = computed(() =>
|
|
|
currentStageName.value ? `${currentStageName.value} — 部门/组 PI 配置` : '部门/组 PI 配置'
|
|
currentStageName.value ? `${currentStageName.value} — 部门/组 PI 配置` : '部门/组 PI 配置'
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
-const filteredFactoryOptions = computed(() => {
|
|
|
|
|
- if (!query.companyRefId) return factoryOptions.value;
|
|
|
|
|
- return factoryOptions.value.filter((item) => item.pid === query.companyRefId);
|
|
|
|
|
-});
|
|
|
|
|
|
|
+// 单-org 兼容:根组织 pid 为 '0',其"公司"即自身,按 pid 等值过滤会得到空集,
|
|
|
|
|
+// 进而被下方 watch 清空 factoryRefId、令 breakdown 永远不发请求。
|
|
|
|
|
+// 统一复用 S0 Structural Closure 的 filterFactoriesForCompany(singleOrgMode 下允许 self-match)。
|
|
|
|
|
+const filteredFactoryOptions = computed(() =>
|
|
|
|
|
+ filterFactoriesForCompany(factoryOptions.value, query.companyRefId, singleOrgMode.value)
|
|
|
|
|
+);
|
|
|
|
|
|
|
|
function emptyForm(): S0ContractReviewCycleUpsert {
|
|
function emptyForm(): S0ContractReviewCycleUpsert {
|
|
|
return {
|
|
return {
|
|
@@ -343,10 +347,16 @@ watch(
|
|
|
}
|
|
}
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+// 组织候选沿用 S0 Structural Closure 已确立的 single-org 兼容契约:
|
|
|
|
|
+// typed(201/501) 有值 → 用 typed;typed 全空且租户恰好 1 个组织 → 安全回落;
|
|
|
|
|
+// 多组织却取不到 typed → 暴露歧义不臆造(见 useS0MfgOrgScope.applySingleOrgFallback)。
|
|
|
|
|
+// 修复:此前直接用裸 loadOrgList('201'/'501'),UAT 单组织租户两者均为空 →
|
|
|
|
|
+// factoryRefId 永远为空 → loadBreakdown() 早退 → 15 条分解从不发请求。
|
|
|
async function loadOptions() {
|
|
async function loadOptions() {
|
|
|
- const [companies, factories] = await Promise.all([loadOrgList('201'), loadOrgList('501')]);
|
|
|
|
|
|
|
+ const { companies, factories, singleOrgMode: single } = await loadCompanyFactoryOptions();
|
|
|
companyOptions.value = companies;
|
|
companyOptions.value = companies;
|
|
|
factoryOptions.value = factories;
|
|
factoryOptions.value = factories;
|
|
|
|
|
+ singleOrgMode.value = single;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 默认选中第一个工厂(私有云单工厂口径),公司随之带出,杜绝多工厂重复列表
|
|
// 默认选中第一个工厂(私有云单工厂口径),公司随之带出,杜绝多工厂重复列表
|
|
@@ -354,7 +364,11 @@ function applyDefaultFactory() {
|
|
|
if (query.factoryRefId) return;
|
|
if (query.factoryRefId) return;
|
|
|
const first = factoryOptions.value[0];
|
|
const first = factoryOptions.value[0];
|
|
|
if (!first) return;
|
|
if (!first) return;
|
|
|
- query.companyRefId = first.pid ?? query.companyRefId;
|
|
|
|
|
|
|
+ // 单-org 兼容:根组织的 pid 为 '0'(非法公司 id),直接取 pid 会让后端按
|
|
|
|
|
+ // CompanyRefId == 0 过滤而查不到任何数据。与 filterFactoriesForCompany 的
|
|
|
|
|
+ // self-match 口径一致——pid 缺失或为 '0' 时,公司即该组织自身。
|
|
|
|
|
+ const pid = first.pid && first.pid !== '0' ? first.pid : undefined;
|
|
|
|
|
+ query.companyRefId = pid ?? first.id;
|
|
|
query.factoryRefId = first.id;
|
|
query.factoryRefId = first.id;
|
|
|
}
|
|
}
|
|
|
|
|
|