2026-02-06 17:15:09 +08:00
|
|
|
function normalizeOptions(options) {
|
|
|
|
|
if (!Array.isArray(options)) return [];
|
|
|
|
|
if (!options.length) return [];
|
|
|
|
|
if (typeof options[0] === 'string') return options.filter((i) => typeof i === 'string');
|
|
|
|
|
if (typeof options[0] === 'object') {
|
|
|
|
|
return options
|
|
|
|
|
.map((i) => {
|
|
|
|
|
const label = i?.label ?? i?.name ?? i?.text ?? i?.title ?? '';
|
|
|
|
|
const value = i?.value ?? i?.id ?? i?.key ?? label;
|
|
|
|
|
if (!label && (value === undefined || value === null || value === '')) return null;
|
|
|
|
|
return { label: String(label || value), value: String(value) };
|
|
|
|
|
})
|
|
|
|
|
.filter(Boolean);
|
|
|
|
|
}
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function normalizeTemplateItem(item) {
|
|
|
|
|
const next = { ...(item || {}) };
|
|
|
|
|
|
|
|
|
|
if (next.operateType === 'custom') next.operateType = 'formCell';
|
|
|
|
|
|
|
|
|
|
const originalType = next.type;
|
|
|
|
|
const customTypeMap = {
|
|
|
|
|
customerSource: 'select',
|
|
|
|
|
customerStage: 'select',
|
|
|
|
|
tag: 'multiSelectAndOther',
|
|
|
|
|
reference: 'input',
|
|
|
|
|
selectWwuser: 'select',
|
|
|
|
|
files: 'files',
|
|
|
|
|
corpProject: 'select',
|
2026-02-09 15:40:03 +08:00
|
|
|
diagnosis: 'diagnosis',
|
2026-02-06 17:15:09 +08:00
|
|
|
BMI: 'input',
|
|
|
|
|
bloodPressure: 'textarea',
|
|
|
|
|
selfMultipleDiseases: 'textarea',
|
|
|
|
|
};
|
|
|
|
|
if (originalType && customTypeMap[originalType]) {
|
|
|
|
|
next.__originType = originalType;
|
|
|
|
|
next.type = customTypeMap[originalType];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const aliasTypeMap = {
|
|
|
|
|
text: 'input',
|
|
|
|
|
string: 'input',
|
|
|
|
|
number: 'input',
|
|
|
|
|
integer: 'input',
|
|
|
|
|
int: 'input',
|
|
|
|
|
};
|
|
|
|
|
if (next.type && aliasTypeMap[next.type]) {
|
|
|
|
|
next.type = aliasTypeMap[next.type];
|
|
|
|
|
if (!next.inputType && (originalType === 'number' || originalType === 'integer' || originalType === 'int')) next.inputType = 'number';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const rawRange = next.range || next.options || next.optionList || next.values || [];
|
|
|
|
|
const range = normalizeOptions(rawRange);
|
|
|
|
|
|
|
|
|
|
if (next.type === 'select' || next.type === 'selectAndOther' || next.type === 'selectAndImage') {
|
|
|
|
|
next.range = range;
|
|
|
|
|
} else if (next.type === 'radio') {
|
|
|
|
|
// wxapp 目前 radio 组件只支持字符串列表;模板如为对象选项则降级为 select
|
|
|
|
|
if (range.length && typeof range[0] === 'object') {
|
|
|
|
|
next.type = 'select';
|
|
|
|
|
next.range = range;
|
|
|
|
|
} else {
|
|
|
|
|
next.range = Array.isArray(rawRange) ? rawRange : [];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!next.operateType) next.operateType = 'formCell';
|
|
|
|
|
next.required = Boolean(next.required);
|
|
|
|
|
|
|
|
|
|
if (next.type === 'input' && (next.wordLimit === undefined || next.wordLimit === null || next.wordLimit === '')) next.wordLimit = 20;
|
|
|
|
|
if (next.type === 'textarea' && (next.wordLimit === undefined || next.wordLimit === null || next.wordLimit === '')) next.wordLimit = 200;
|
|
|
|
|
return next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function unwrapTemplateResponse(res) {
|
|
|
|
|
const d = res?.data;
|
|
|
|
|
if (d && typeof d === 'object') {
|
|
|
|
|
if (d.data && typeof d.data === 'object') return d.data;
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
return res && typeof res === 'object' ? res : {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function normalizeTemplate(temp) {
|
|
|
|
|
const t = temp && typeof temp === 'object' ? { ...temp } : {};
|
|
|
|
|
const list = Array.isArray(t.templateList) ? t.templateList : [];
|
|
|
|
|
t.templateList = list
|
|
|
|
|
.filter((i) => i && i.fieldStatus !== 'disable')
|
|
|
|
|
.filter((i) => i.operateType !== 'onlyRead')
|
|
|
|
|
.map(normalizeTemplateItem);
|
|
|
|
|
return t;
|
|
|
|
|
}
|