修复配送合同候选范围与失效联动

This commit is contained in:
czl231
2026-08-13 23:38:29 +08:00
parent 029724a46c
commit 4d2acbaf46
10 changed files with 243 additions and 10 deletions

View File

@@ -3,6 +3,7 @@
* 版本v1.1.0
*/
import { Message } from '@arco-design/web-vue';
import { ref } from 'vue';
import type { ResourceField } from '@/api/resources';
import {
linkedRelationFilters,
@@ -25,6 +26,7 @@ export function useResourceRelationLinkage(
relations: ResourceRelations,
) {
let active: ActiveLinkage[] = [];
const configuredFields = ref<ResourceField[]>([]);
let organizationStaffField: ResourceField | undefined;
let initialized = false;
@@ -36,6 +38,7 @@ export function useResourceRelationLinkage(
/** 收集页面内全部显式联动,允许一个父字段同时驱动多个业务子项。 */
function configure(fields: ResourceField[]) {
configuredFields.value = fields;
active = fields
.filter((field) => field.relationLinkage)
.map((childField) => ({
@@ -147,15 +150,49 @@ export function useResourceRelationLinkage(
field.key !== organizationStaffField?.key,
),
);
await relations.ensureValues(fields, form);
await relations.ensureValues(
fields.filter((field) => !field.relationStrictFilter),
form,
);
await Promise.all(active.map((item) => reloadChildOptions(item)));
await reloadStaffOptions();
clearInvalidStrictSelections();
initialized = true;
const warning = validationMessage();
if (warning) Message.warning(`当前组织归属需要确认:${warning}`);
}
/** 严格候选中不存在当前值时清空,避免补载详情绕过业务筛选。 */
function clearInvalidStrictSelections() {
for (const field of configuredFields.value) {
if (!field.relationStrictFilter || !field.relation) continue;
const rawValue = form[field.key];
const identities = (Array.isArray(rawValue) ? rawValue : [rawValue])
.map(relationIdentity)
.filter(Boolean);
if (identities.length === 0) continue;
const valid = new Set(
(relations.options[field.relation] ?? []).map((option) =>
relationIdentity(option.identity),
),
);
if (identities.some((identity) => !valid.has(identity))) {
form[field.key] = field.type === 'identity-list' ? [] : '';
for (const linkageItem of active.filter(
(item) => item.childField.relationLinkage?.parentKey === field.key,
)) {
const childField = linkageItem.childField;
form[childField.key] = childField.type === 'identity-list' ? [] : '';
relations.clear(childField.relation);
}
Message.info(
field.relationInvalidMessage ?? '所选关联数据已失效,已清空',
);
}
}
}
async function handleParentChange(
linkageItem: ActiveLinkage,
parentIdentity: string,
@@ -292,19 +329,22 @@ export function useResourceRelationLinkage(
/** 必填联动候选为空时返回业务引导,用于阻止提交无效表单。 */
function unavailableMessage() {
for (const linkageItem of active) {
const field = linkageItem.childField;
for (const field of configuredFields.value) {
const linkage = field.relationLinkage;
if (
!field.required ||
!field.relation ||
!field.relationEmptyText ||
!linkage?.requiresParent ||
!relationIdentity(form[linkage.parentKey]) ||
relations.loading[field.relation]
) {
continue;
}
if (
linkage?.requiresParent &&
!relationIdentity(form[linkage.parentKey])
) {
continue;
}
if ((relations.options[field.relation] ?? []).length === 0) {
return field.relationEmptyText;
}

View File

@@ -89,6 +89,7 @@ export function useResourceRelations(
return load(field.relation, keyword, {
...request,
filters: {
...(field.relationFilters ?? {}),
...staffRelationFilters(field, context()),
...(request.filters ?? {}),
},
@@ -170,6 +171,7 @@ export function useResourceRelations(
search(field.relation, keyword, {
...request,
filters: {
...(field.relationFilters ?? {}),
...staffRelationFilters(field, context()),
...(request.filters ?? {}),
},