diff --git a/src/components/CrudTable.vue b/src/components/CrudTable.vue index c69593a..a6bbd40 100644 --- a/src/components/CrudTable.vue +++ b/src/components/CrudTable.vue @@ -89,12 +89,27 @@ const { // vxe-table 实例引用(用于获取选中行) const xTableRef = ref() +// 父级 query 中匹配列定义的关联字段(如 DeptUUID/UserUUID/WorkgroupUUID): +// 详情页子表场景自动注入新增/编辑表单,保证新记录归属当前详情上下文; +// 注入后隐藏表单项(值由父级上下文决定,不允许用户修改)。 +const inheritedQueryFields = computed(() => { + const q = props.query ?? {} + const colFields = new Set(columns.value.map((c) => c.field)) + const result: Record = {} + for (const [k, v] of Object.entries(q)) { + if (v !== undefined && v !== null && v !== '' && colFields.has(k)) { + result[k] = v + } + } + return result +}) + // 可见表格列(排除 hidden) const tableColumns = computed(() => columns.value.filter((c: ColumnSchema) => c.visible !== false && c.type !== 'hidden'), ) -// 弹窗表单可见列(排除隐藏/主键隐藏/不可编辑/divider/html) +// 弹窗表单可见列(排除隐藏/主键隐藏/不可编辑/divider/html/父级注入字段) const formColumns = computed(() => { const pkField = columns.value.find((c) => c.isPrimary || c.primaryKey)?.field || 'Id' return columns.value.filter( @@ -104,10 +119,23 @@ const formColumns = computed(() => { c.type !== 'hidden' && c.type !== 'divider' && c.type !== 'html' && - c.field !== pkField, + c.field !== pkField && + !(c.field in inheritedQueryFields.value), ) }) +// 新增:先走 useCrudTable 初始化,再注入父级上下文关联字段 +function onHandleCreate(): void { + handleCreate() + Object.assign(editingRow, inheritedQueryFields.value) +} + +// 提交:保证父级上下文关联字段始终存在(编辑时用户可能误删) +function onHandleSubmit(): void { + Object.assign(editingRow, inheritedQueryFields.value) + handleSubmit() +} + // vxe-table checkbox 变化:同步到 selectedRows function onCheckboxChange(): void { const records = xTableRef.value?.getCheckboxRecords?.() || [] @@ -163,7 +191,7 @@ function renderSelectLabel(col: ColumnSchema, value: unknown): string {
{{ title || table }}
- + 新增 取消 - 保存 + 保存
diff --git a/src/views/company/CompanyDetail.vue b/src/views/company/CompanyDetail.vue index 4370115..65a2c59 100644 --- a/src/views/company/CompanyDetail.vue +++ b/src/views/company/CompanyDetail.vue @@ -60,8 +60,8 @@ const resolvedNames = ref>>({}) /** 错误信息(缺参 / 加载失败时展示) */ const errorMsg = ref('') -/** 从路由 query 读取公司 UUID */ -const companyUUID = (route.query.CompanyUUID as string) || '' +/** 从路由 query 读取公司 UUID(computed 响应式:同一 tab 复用且 query 变化时自动更新) */ +const companyUUID = computed(() => (route.query.CompanyUUID as string) || '') /** 公司主键字段名 */ const PK_FIELD = 'CompanyUUID' @@ -96,7 +96,7 @@ function pickList(res: unknown): T[] { /** 拉取公司主数据 + 解析关联 UUID */ async function loadCompany(): Promise { - if (!companyUUID) { + if (!companyUUID.value) { errorMsg.value = '缺少 CompanyUUID 参数,无法加载公司详情。' return } @@ -104,11 +104,11 @@ async function loadCompany(): Promise { errorMsg.value = '' try { const res = await formApi.list('Company', { - CompanyUUID: companyUUID, + CompanyUUID: companyUUID.value, pageSize: 1, }) const list = pickList(res) - const data = list.find((c) => c.CompanyUUID === companyUUID) || list[0] + const data = list.find((c) => c.CompanyUUID === companyUUID.value) || list[0] if (!data) { errorMsg.value = '未找到公司数据' return @@ -209,6 +209,15 @@ async function copyUUID(uuid: string): Promise { } onMounted(loadCompany) + +// 同一 tab 复用(v-show 常驻)时 query 变化:重新加载(防展示旧公司数据 / 缺参报错) +watch(companyUUID, () => { + if (!companyUUID.value) { + errorMsg.value = '缺少 CompanyUUID 参数,无法加载公司详情。' + return + } + void loadCompany() +})