Files
danyang-match/miniapp/pages/review-rejected/review-rejected.js
T

188 lines
6.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 审核未通过页 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();
},
});