/** * 审核未通过页 U17 / H11(Phase 05 P05-T17) * * 重构要点(遵循 AGENTS.md 不变量): * - 数据:userStore.fetchReviewStatus(取 items[] 逐项驳回原因) * - 展示:每项明确 itemType → 中文标签 + reasonText + "立即修改"跳转对应资料页 * - 路由守卫:onShow 检查 userState,若状态变为 approved → reLaunch 首页; * 若变为 pending → redirectTo 审核中页 * - AGENTS 第 9 条:DB 是 Source of Truth——审核结果以服务端 items 为准, * 本地不缓存驳回原因;每次进入页面重新拉取 * - AGENTS 第 2 条:Required 不可自动放宽——本页仅引导修改,不修改任何择偶条件 */ const { userStore, appStore, getReviewRedirectPath } = require('../../stores'); const { ROUTE, PROFILE_REVIEW } = require('../../constants'); // itemType → 中文标签 + 对应资料编辑页路由 // 路由跳转目标用 ONBOARDING.* 系列(与 profile-confirm 一致) const ITEM_TYPE_MAP = { avatar: { label: '头像', route: ROUTE.ONBOARDING.PROFILE_PHOTOS }, photos: { label: '生活照', route: ROUTE.ONBOARDING.PROFILE_PHOTOS }, self_intro: { label: '个人介绍', route: ROUTE.ONBOARDING.PROFILE_INTRO }, basic: { label: '基础资料', route: ROUTE.ONBOARDING.PROFILE_BASIC }, region: { label: '居住区域', route: ROUTE.ONBOARDING.PROFILE_BASIC }, height: { label: '身高', route: ROUTE.ONBOARDING.PROFILE_BASIC }, marital: { label: '婚姻状况', route: ROUTE.ONBOARDING.PROFILE_BASIC }, children: { label: '子女情况', route: ROUTE.ONBOARDING.PROFILE_BASIC }, education: { label: '学历', route: ROUTE.ONBOARDING.PROFILE_BASIC }, occupation: { label: '职业', route: ROUTE.ONBOARDING.PROFILE_BASIC }, lifestyle: { label: '生活方式', route: ROUTE.ONBOARDING.PROFILE_LIFESTYLE }, smoking: { label: '吸烟情况', route: ROUTE.ONBOARDING.PROFILE_LIFESTYLE }, drinking: { label: '饮酒情况', route: ROUTE.ONBOARDING.PROFILE_LIFESTYLE }, settlement: { label: '定居意向', route: ROUTE.ONBOARDING.PROFILE_LIFESTYLE }, intent: { label: '婚恋意愿', route: ROUTE.ONBOARDING.PROFILE_INTENT }, relationship_goal: { label: '婚恋目标', route: ROUTE.ONBOARDING.PROFILE_INTENT }, marriage_plan: { label: '结婚计划', route: ROUTE.ONBOARDING.PROFILE_INTENT }, preference: { label: '择偶条件', route: ROUTE.ONBOARDING.PROFILE_PREFERENCE }, interests: { label: '兴趣标签', route: ROUTE.ONBOARDING.PROFILE_INTERESTS }, }; // 项状态 → 中文标签 + StatusBadge kind const ITEM_STATUS_MAP = { pending: { label: '审核中', kind: 'warning' }, approved: { label: '已通过', kind: 'success' }, need_edit: { label: '需修改', kind: 'warning' }, rejected: { label: '未通过', kind: 'danger' }, }; Page({ data: { statusBarHeight: 20, navBarHeight: 44, loading: true, reviewStatus: PROFILE_REVIEW.NEED_EDIT, reviewStatusLabel: '需要修改', issueItems: [], // need_edit/rejected 项(待修改) otherItems: [], // approved/pending 项(其他审核结果) hasIssues: false, hasOtherItems: false, showAllItems: false, }, onLoad() { this._initSystemInfo(); }, onShow() { // 路由守卫:状态变化时引导至合适页面 const redirect = getReviewRedirectPath(); if (redirect === ROUTE.REVIEW.PENDING) { // 状态变为 pending(用户重新提交了审核) wx.redirectTo({ url: redirect }); return; } if (!redirect) { // 状态变为 approved wx.reLaunch({ url: ROUTE.TAB.HOME }); return; } // 仍为 need_edit/rejected,正常加载 this.loadReviewResult(); }, _initSystemInfo() { try { const sysInfo = wx.getSystemInfoSync(); this.setData({ statusBarHeight: sysInfo.statusBarHeight || 20, navBarHeight: 44, }); } catch (e) { /* 使用默认值 */ } }, // ============ 数据加载 ============ async loadReviewResult() { this.setData({ loading: true }); try { const review = await userStore.fetchReviewStatus(); const reviewStatus = (review && review.status) || PROFILE_REVIEW.NEED_EDIT; // 取到最新状态后重新校验是否需要跳转 if (reviewStatus === PROFILE_REVIEW.APPROVED) { wx.reLaunch({ url: ROUTE.TAB.HOME }); return; } if (reviewStatus === PROFILE_REVIEW.PENDING) { wx.redirectTo({ url: ROUTE.REVIEW.PENDING }); return; } if (reviewStatus === PROFILE_REVIEW.NOT_SUBMITTED) { wx.redirectTo({ url: ROUTE.ONBOARDING.PROFILE_CONFIRM }); return; } const rawItems = (review && review.items) || []; // 派生展示项,并按 isIssue 拆分为两组(避免 WXML wx:for+wx:if 同元素) const issueItems = []; const otherItems = []; rawItems.forEach((raw) => { const typeMeta = ITEM_TYPE_MAP[raw.itemType] || { label: raw.itemType, route: ROUTE.ONBOARDING.PROFILE_BASIC }; const statusMeta = ITEM_STATUS_MAP[raw.status] || { label: raw.status, kind: 'disabled' }; const item = { itemType: raw.itemType, label: typeMeta.label, statusLabel: statusMeta.label, kind: statusMeta.kind, reasonText: raw.reasonText || '', reasonCode: raw.reasonCode || '', route: typeMeta.route, }; if (raw.status === 'need_edit' || raw.status === 'rejected') { issueItems.push(item); } else { otherItems.push(item); } }); const hasIssues = issueItems.length > 0; const hasOtherItems = otherItems.length > 0; const reviewStatusLabelMap = { need_edit: '需要修改', rejected: '审核未通过', }; this.setData({ loading: false, reviewStatus, reviewStatusLabel: reviewStatusLabelMap[reviewStatus] || '需要修改', issueItems, otherItems, hasIssues, hasOtherItems, }); } catch (err) { this.setData({ loading: false }); appStore.toastError(err, '加载失败'); } }, // ============ 展开/收起其他审核结果 ============ onToggleItems() { this.setData({ showAllItems: !this.data.showAllItems }); }, // ============ 跳转修改 ============ /** * 跳转对应资料页修改 * AGENTS 第 2 条:仅引导跳转,不放宽任何 Required 约束 */ onEditItem(e) { const route = e.currentTarget.dataset.route; if (route) { wx.navigateTo({ url: route }); } }, /** * 全部修改完后重新提交审核 */ onResubmit() { wx.redirectTo({ url: ROUTE.ONBOARDING.PROFILE_CONFIRM }); }, onBack() { wx.navigateBack(); }, });