2026-09-09 22:05:00 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* PreferenceEditor 择偶条件编辑器(规范 §30)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 每条条件有两个 importance 等级:
|
|
|
|
|
|
* - required:必须符合(AGENTS 第 2 条硬约束)
|
|
|
|
|
|
* - preferred:最好符合(软约束,后端可适度放宽匹配)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 不变量(AGENTS.md 第 2 条):用户已勾选"必须符合"的字段不可被前端自动放宽为
|
|
|
|
|
|
* "最好符合",UI 必须显式提示用户此操作将影响匹配精度。
|
|
|
|
|
|
*/
|
2026-09-23 11:19:17 +08:00
|
|
|
|
const { ACCEPT_CHILDREN_OPTIONS } = require('../../constants')
|
|
|
|
|
|
|
2026-09-09 22:05:00 +08:00
|
|
|
|
Component({
|
|
|
|
|
|
options: { addGlobalClass: true },
|
|
|
|
|
|
properties: {
|
|
|
|
|
|
preference: { type: Object, value: null },
|
|
|
|
|
|
readonly: { type: Boolean, value: false },
|
|
|
|
|
|
},
|
|
|
|
|
|
data: {
|
|
|
|
|
|
importanceLabelMap: {
|
|
|
|
|
|
required: '必须符合',
|
|
|
|
|
|
preferred: '最好符合',
|
|
|
|
|
|
},
|
2026-09-23 11:19:17 +08:00
|
|
|
|
// 子女(是否接受有孩)下拉:选项均为中文,value 为后端枚举码
|
|
|
|
|
|
childrenOptions: ACCEPT_CHILDREN_OPTIONS,
|
|
|
|
|
|
childrenLabelMap: {
|
|
|
|
|
|
any: '不限',
|
|
|
|
|
|
accept: '可接受',
|
|
|
|
|
|
reject: '不接受',
|
|
|
|
|
|
},
|
|
|
|
|
|
childrenIndex: -1,
|
|
|
|
|
|
},
|
|
|
|
|
|
observers: {
|
|
|
|
|
|
preference(pref) {
|
|
|
|
|
|
if (!pref) {
|
|
|
|
|
|
this.setData({ childrenIndex: -1 })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
const idx = this.data.childrenOptions.findIndex((o) => o.value === pref.acceptChildren)
|
|
|
|
|
|
this.setData({ childrenIndex: idx })
|
|
|
|
|
|
},
|
2026-09-09 22:05:00 +08:00
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
// 切换某字段的 importance:required ↔ preferred
|
|
|
|
|
|
onToggleImportance(e) {
|
|
|
|
|
|
if (this.data.readonly) return;
|
|
|
|
|
|
const { field } = e.currentTarget.dataset;
|
|
|
|
|
|
const pref = this.data.preference || {};
|
|
|
|
|
|
const current = pref[field];
|
|
|
|
|
|
if (!current) return;
|
|
|
|
|
|
const next = current === 'required' ? 'preferred' : 'required';
|
|
|
|
|
|
this.triggerEvent('change', {
|
|
|
|
|
|
field,
|
|
|
|
|
|
importance: next,
|
|
|
|
|
|
// 必须符合 → 最好符合,需用户二次确认(AGENTS 第 2 条)
|
|
|
|
|
|
needConfirmRelax: current === 'required',
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
onAgeChange(e) {
|
|
|
|
|
|
if (this.data.readonly) return;
|
|
|
|
|
|
const { bound } = e.currentTarget.dataset;
|
|
|
|
|
|
this.triggerEvent('change', {
|
|
|
|
|
|
field: bound === 'min' ? 'ageMin' : 'ageMax',
|
|
|
|
|
|
value: Number(e.detail.value),
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
onHeightChange(e) {
|
|
|
|
|
|
if (this.data.readonly) return;
|
|
|
|
|
|
const { bound } = e.currentTarget.dataset;
|
|
|
|
|
|
this.triggerEvent('change', {
|
|
|
|
|
|
field: bound === 'min' ? 'heightMin' : 'heightMax',
|
|
|
|
|
|
value: Number(e.detail.value) || null,
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
onAcceptChildrenChange(e) {
|
|
|
|
|
|
if (this.data.readonly) return;
|
2026-09-23 11:19:17 +08:00
|
|
|
|
const idx = Number(e.detail.value)
|
|
|
|
|
|
const opt = this.data.childrenOptions[idx]
|
|
|
|
|
|
if (!opt) return
|
|
|
|
|
|
this.setData({ childrenIndex: idx })
|
2026-09-09 22:05:00 +08:00
|
|
|
|
this.triggerEvent('change', {
|
|
|
|
|
|
field: 'acceptChildren',
|
2026-09-23 11:19:17 +08:00
|
|
|
|
value: opt.value,
|
2026-09-09 22:05:00 +08:00
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|