功能:完善用户服务关系展示与组织联动
统一平台、气站和配送点后台的服务关系业务名称展示。 新增气站、配送点、服务人员三级联动及暂未分配语义。 后端补充组织归属、人员角色和启用状态的严格校验。 补充前后端测试、项目文档、操作日志及本机日志忽略规则。
This commit is contained in:
@@ -10,6 +10,8 @@ import {
|
||||
optionParentIdentity,
|
||||
relationIdentity,
|
||||
shouldClearLinkedOption,
|
||||
staffOrganizationFilters,
|
||||
staffOrganizationValidationMessage,
|
||||
} from './resource-relation-linkage-policy';
|
||||
import type { ResourceRelations } from './use-resource-relations';
|
||||
|
||||
@@ -23,6 +25,7 @@ export function useResourceRelationLinkage(
|
||||
relations: ResourceRelations,
|
||||
) {
|
||||
let active: ActiveLinkage | undefined;
|
||||
let organizationStaffField: ResourceField | undefined;
|
||||
let initialized = false;
|
||||
|
||||
function findOption(resource: string, identity: string) {
|
||||
@@ -33,6 +36,9 @@ export function useResourceRelationLinkage(
|
||||
|
||||
function configure(fields: ResourceField[]) {
|
||||
const childField = fields.find((field) => field.relationLinkage);
|
||||
organizationStaffField = fields.find(
|
||||
(field) => field.staffRelation?.organizationScoped,
|
||||
);
|
||||
if (!childField?.relationLinkage) {
|
||||
active = undefined;
|
||||
return;
|
||||
@@ -45,6 +51,49 @@ export function useResourceRelationLinkage(
|
||||
};
|
||||
}
|
||||
|
||||
function staffRequest() {
|
||||
const staffIdentity = relationIdentity(
|
||||
organizationStaffField ? form[organizationStaffField.key] : '',
|
||||
);
|
||||
return {
|
||||
filters: staffOrganizationFilters(
|
||||
relationIdentity(form.gas_basic_identity),
|
||||
relationIdentity(form.delivery_basic_identity),
|
||||
),
|
||||
preserveIdentities: staffIdentity ? [staffIdentity] : [],
|
||||
};
|
||||
}
|
||||
|
||||
async function reloadStaffOptions() {
|
||||
const field = organizationStaffField;
|
||||
if (!field?.relation) return;
|
||||
relations.cancelSearch(field.relation);
|
||||
await relations.loadField(field, '', staffRequest());
|
||||
}
|
||||
|
||||
/** 组织变化后清理不再匹配的服务人员,并刷新精确范围选项。 */
|
||||
async function synchronizeStaff() {
|
||||
const field = organizationStaffField;
|
||||
if (!field?.relation) return;
|
||||
const staffIdentity = relationIdentity(form[field.key]);
|
||||
if (staffIdentity) {
|
||||
const option =
|
||||
findOption(field.relation, staffIdentity) ??
|
||||
(await relations.ensure(field.relation, staffIdentity));
|
||||
const warning = staffOrganizationValidationMessage(
|
||||
relationIdentity(form.gas_basic_identity),
|
||||
relationIdentity(form.delivery_basic_identity),
|
||||
staffIdentity,
|
||||
option,
|
||||
);
|
||||
if (warning && relationIdentity(form[field.key]) === staffIdentity) {
|
||||
form[field.key] = '';
|
||||
Message.info(`${warning},已清空原服务人员`);
|
||||
}
|
||||
}
|
||||
await reloadStaffOptions();
|
||||
}
|
||||
|
||||
function childRequest() {
|
||||
if (!active?.childField.relationLinkage) return {};
|
||||
const linkage = active.childField.relationLinkage;
|
||||
@@ -69,14 +118,21 @@ export function useResourceRelationLinkage(
|
||||
initialized = false;
|
||||
configure(fields);
|
||||
if (!active?.childField.relationLinkage || !active.childField.relation) {
|
||||
await relations.preload(fields);
|
||||
await relations.preload(
|
||||
fields.filter((field) => field.key !== organizationStaffField?.key),
|
||||
);
|
||||
await relations.ensureValues(fields, form);
|
||||
await reloadStaffOptions();
|
||||
initialized = true;
|
||||
return;
|
||||
}
|
||||
|
||||
await relations.preload(
|
||||
fields.filter((field) => field.key !== active?.childField.key),
|
||||
fields.filter(
|
||||
(field) =>
|
||||
field.key !== active?.childField.key &&
|
||||
field.key !== organizationStaffField?.key,
|
||||
),
|
||||
);
|
||||
const linkage = active.childField.relationLinkage;
|
||||
const parentIdentity = relationIdentity(form[linkage.parentKey]);
|
||||
@@ -87,7 +143,14 @@ export function useResourceRelationLinkage(
|
||||
if (childIdentity) {
|
||||
await relations.ensure(active.childField.relation, childIdentity);
|
||||
}
|
||||
const staffIdentity = relationIdentity(
|
||||
organizationStaffField ? form[organizationStaffField.key] : '',
|
||||
);
|
||||
if (staffIdentity && organizationStaffField?.relation) {
|
||||
await relations.ensure(organizationStaffField.relation, staffIdentity);
|
||||
}
|
||||
await reloadChildOptions();
|
||||
await reloadStaffOptions();
|
||||
initialized = true;
|
||||
|
||||
const warning = validationMessage();
|
||||
@@ -158,8 +221,12 @@ export function useResourceRelationLinkage(
|
||||
const identity = relationIdentity(value);
|
||||
if (field.key === active.childField.relationLinkage.parentKey) {
|
||||
await handleParentChange(identity);
|
||||
await synchronizeStaff();
|
||||
} else if (field.key === active.childField.key) {
|
||||
await handleChildChange(identity);
|
||||
await synchronizeStaff();
|
||||
} else if (field.key === organizationStaffField?.key) {
|
||||
await synchronizeStaff();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,6 +237,10 @@ export function useResourceRelationLinkage(
|
||||
relations.searchField(field, keyword, childRequest());
|
||||
return;
|
||||
}
|
||||
if (field.key === organizationStaffField?.key) {
|
||||
relations.searchField(field, keyword, staffRequest());
|
||||
return;
|
||||
}
|
||||
relations.searchField(field, keyword);
|
||||
}
|
||||
|
||||
@@ -181,12 +252,22 @@ export function useResourceRelationLinkage(
|
||||
const parentIdentity = relationIdentity(form[linkage.parentKey]);
|
||||
const childIdentity = relationIdentity(form[active.childField.key]);
|
||||
const option = findOption(active.childField.relation, childIdentity);
|
||||
return linkedRelationValidationMessage(
|
||||
const linkedMessage = linkedRelationValidationMessage(
|
||||
parentIdentity,
|
||||
childIdentity,
|
||||
option,
|
||||
linkage.optionParentKey,
|
||||
);
|
||||
if (linkedMessage) return linkedMessage;
|
||||
const staffField = organizationStaffField;
|
||||
if (!staffField?.relation) return '';
|
||||
const staffIdentity = relationIdentity(form[staffField.key]);
|
||||
return staffOrganizationValidationMessage(
|
||||
parentIdentity,
|
||||
childIdentity,
|
||||
staffIdentity,
|
||||
findOption(staffField.relation, staffIdentity),
|
||||
);
|
||||
}
|
||||
|
||||
return { preload, change, search, validationMessage };
|
||||
|
||||
Reference in New Issue
Block a user