67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
export const GLOBAL_FIELD_ALIASES = {
|
||
// 内部信息 / HIS 相关字段可能后续改名:这里做最小兜底,保证“有值就能显示”
|
||
hisCardNo: ['hisOutpatientNo', 'hisClinicNo', 'hisCardNumber'],
|
||
idCard: ['idNo', 'idNumber'],
|
||
sex: ['gender'],
|
||
cardType: ['idType'],
|
||
};
|
||
|
||
function isEmpty(v) {
|
||
if (v === null || v === undefined) return true;
|
||
if (Array.isArray(v)) return v.length === 0;
|
||
if (typeof v === 'string') return v.trim() === '';
|
||
return false;
|
||
}
|
||
|
||
function buildAliasCandidates(items) {
|
||
const itemList = Array.isArray(items) ? items : [];
|
||
const map = {};
|
||
|
||
// 支持模板项自带别名:aliasTitles / aliases
|
||
itemList.forEach((it) => {
|
||
const title = it?.title;
|
||
if (!title) return;
|
||
const aliases = Array.isArray(it?.aliasTitles)
|
||
? it.aliasTitles
|
||
: Array.isArray(it?.aliases)
|
||
? it.aliases
|
||
: [];
|
||
if (!aliases.length) return;
|
||
map[String(title)] = aliases.map((i) => String(i)).filter(Boolean);
|
||
});
|
||
|
||
return map;
|
||
}
|
||
|
||
function uniq(arr) {
|
||
const out = [];
|
||
const seen = new Set();
|
||
arr.forEach((i) => {
|
||
const v = String(i || '');
|
||
if (!v || seen.has(v)) return;
|
||
seen.add(v);
|
||
out.push(v);
|
||
});
|
||
return out;
|
||
}
|
||
|
||
export function createAliasedForm(form, items) {
|
||
const local = buildAliasCandidates(items);
|
||
return new Proxy(form || {}, {
|
||
get(target, prop) {
|
||
if (typeof prop !== 'string') return target[prop];
|
||
|
||
const direct = target[prop];
|
||
if (!isEmpty(direct)) return direct;
|
||
|
||
const candidates = uniq([...(local[prop] || []), ...(GLOBAL_FIELD_ALIASES[prop] || [])]);
|
||
for (const k of candidates) {
|
||
const v = target[k];
|
||
if (!isEmpty(v)) return v;
|
||
}
|
||
return direct;
|
||
},
|
||
});
|
||
}
|
||
|