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', diagnosis: 'textarea', 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; }