/** * 资料 / 择偶条件枚举码 → 中文简体 唯一字典 * ============================================================ * 铁律:界面上不允许出现任何英文枚举码(如 never_married / bachelor / * government / any / accept / reject)。所有会展示给用户的状态码、选项码 * 都必须在本文件里有中文 label。 * * 为什么要集中: * - 小程序里最典型的缺陷是「后端枚举码直接当展示值」上屏(例如某卡片 * 直接渲染 educationCode=bachelor)。静态类型检查 / WXSS 编译 / 结构 * 守卫都发现不了,只有人眼在真机才看得见。 * - 后端 demo 种子与实际表单存的码存在历史不一致(表单用 occasional, * 种子用 sometimes;表单用 yes/no,种子用 是/否)。labelOf 统一覆盖 * 两套并集,保证详情页无论后端返回哪种都显示中文。 * * labelOf(group, code): * - 空值返回 '' * - 已知码返回中文 * - 未知码返回原值(便于排查;生产路径不应触发,否则说明字典需补) */ // ============ 婚姻状况 ============ const MARITAL = { never_married: '未婚', divorced: '离异', widowed: '丧偶', single: '未婚', // profile-confirm 旧别名 } // ============ 子女情况 ============ const CHILDREN_STATUS = { none: '无子女', has: '有子女', } // ============ 学历 ============ // 覆盖表单值(high_school) 与种子实际值(senior_high/junior_high) 及别名 const EDUCATION = { high_school: '高中/中专', senior_high: '高中/中专', junior_high: '初中', college: '大专', bachelor: '本科', master: '硕士', phd: '博士', doctor: '博士', // profile-confirm 旧别名 } // ============ 职业 ============ // 表单类目(生产路径)+ demo 种子实际值(自由英文词) const OCCUPATION = { government: '机关事业单位', education: '教育', medical: '医疗', enterprise: '企业职员', technical: '技术人员', self_employed: '个体经营', freelance: '自由职业', service: '服务行业', agriculture: '农业', other: '其他', // demo 种子实际值 clerical: '行政文职', designer: '设计', factory: '工厂生产', nurse: '医护', engineer: '工程师', programmer: '程序员', sales: '销售', doctor: '医生', researcher: '科研', teacher: '教师', } // ============ 择偶条件:是否接受有孩(preference-editor 子女下拉) ============ const ACCEPT_CHILDREN = { any: '不限', accept: '可接受', reject: '不接受', } // ============ 吸烟 / 饮酒 ============ // 覆盖表单值(occasional) 与种子实际值(sometimes) const SMOKING = { never: '不吸烟', occasional: '偶尔吸烟', sometimes: '偶尔吸烟', often: '经常吸烟', } const DRINKING = { never: '不喝酒', occasional: '偶尔喝酒', sometimes: '偶尔喝酒', often: '经常喝酒', } // ============ 红娘服务状态(matchmaker 历史服务) ============ const MATCHMAKER_SERVICE_STATUS_LABEL = { submitted: '已提交', assigned: '已分配', in_service: '服务中', waiting_user: '待您确认', completed: '已完成', cancelled: '已取消', } // ============ 红娘服务类型(matchmaker 工作台待处理卡片) ============ // 取值须与后端 chk_matchmaker_service_type 白名单一致:recommend_partner / review_preference / contact_intention const MATCHMAKER_SERVICE_TYPE_LABEL = { recommend_partner: '推荐对象', review_preference: '择偶指导', contact_intention: '牵线意向', } const GROUPS = { maritalStatus: MARITAL, childrenStatus: CHILDREN_STATUS, educationCode: EDUCATION, occupationCode: OCCUPATION, acceptChildren: ACCEPT_CHILDREN, smokingStatus: SMOKING, drinkingStatus: DRINKING, } /** * 通用映射:已知码→中文,未知→原值 * @param {string} group GROUPS 的键 * @param {*} code 后端返回的原始码 * @returns {string} */ function labelOf(group, code) { if (code === undefined || code === null || code === '') return '' const map = GROUPS[group] if (!map) return String(code) return map[code] !== undefined ? map[code] : String(code) } /** 是/否类(长期居住丹阳等):兼容布尔、yes/no、是/否 三种来源 */ function yesNoLabel(v) { if (v === true) return '是' if (v === false) return '否' if (v === 'yes') return '是' if (v === 'no') return '否' if (v === '是' || v === '否') return v return v === undefined || v === null || v === '' ? '' : String(v) } /** 未来规划(未来是否愿意继续在丹阳):willing/uncertain/unwilling 或 是/否 */ function futureDanyangLabel(v) { if (v === 'willing' || v === '是') return '愿意' if (v === 'uncertain') return '不确定' if (v === 'unwilling' || v === '否') return '不愿意' return v === undefined || v === null || v === '' ? '' : String(v) } /** 红娘服务类型 → 中文(未知码回退原值,便于排查) */ function serviceTypeLabel(code) { if (code === undefined || code === null || code === '') return '' return MATCHMAKER_SERVICE_TYPE_LABEL[code] !== undefined ? MATCHMAKER_SERVICE_TYPE_LABEL[code] : String(code) } // ============ picker 选项数组(value/label 形式,供 wxml range + range-key 使用) ============ const ACCEPT_CHILDREN_OPTIONS = [ { value: 'any', label: '不限' }, { value: 'accept', label: '可接受' }, { value: 'reject', label: '不接受' }, ] const MARITAL_OPTIONS = [ { value: 'never_married', label: '未婚' }, { value: 'divorced', label: '离异' }, { value: 'widowed', label: '丧偶' }, ] const EDUCATION_OPTIONS = [ { value: 'senior_high', label: '高中/中专' }, { value: 'junior_high', label: '初中' }, { value: 'college', label: '大专' }, { value: 'bachelor', label: '本科' }, { value: 'master', label: '硕士' }, { value: 'doctor', label: '博士' }, ] // ============ 服务区域(GB/T 2260 行政区划代码) ============ // 仅收录有权威依据的单值区划码:321181=丹阳、321100=镇江(市区)来自 demo 种子, // 320100=南京市。当前小程序选项里的「镇江其他辖区」「不限」不是单值区划码, // 故不纳入本表 —— 待在 UAT 报告中确认区域模型后再补(不要臆造区划码)。 const REGION_CODES = { '丹阳': '321181', '镇江市区': '321100', '南京': '320100', } function regionCodeOf(name) { if (!name) return '' return REGION_CODES[name] || '' } const OCCUPATION_OPTIONS = Object.keys(OCCUPATION).map((v) => ({ value: v, label: OCCUPATION[v] })) module.exports = { MARITAL, CHILDREN_STATUS, EDUCATION, OCCUPATION, ACCEPT_CHILDREN, SMOKING, DRINKING, MATCHMAKER_SERVICE_STATUS_LABEL, MATCHMAKER_SERVICE_TYPE_LABEL, GROUPS, labelOf, yesNoLabel, futureDanyangLabel, serviceTypeLabel, REGION_CODES, regionCodeOf, ACCEPT_CHILDREN_OPTIONS, MARITAL_OPTIONS, EDUCATION_OPTIONS, OCCUPATION_OPTIONS, }