ykt-wxapp/utils/form-alias.js

67 lines
1.7 KiB
JavaScript
Raw Normal View History

2026-01-29 13:36:43 +08:00
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;
},
});
}