refactor(login): move match-route logic to dedicated service and fix import
- 提取登录回跳、产品对比的路由匹配逻辑至独立的 match-route.uts 服务 - 修复登录页面导入对比服务的错误,改为导入新的 match-route 模块 - 保持原有的路由参数校验和跳转逻辑不变,仅重构代码结构
This commit is contained in:
+18
-4
@@ -1,12 +1,13 @@
|
||||
import { getSession } from './api.uts'
|
||||
import { readAssessmentFlow, writeAssessmentFlow, clearAssessmentFlow } from './assessment-flow.uts'
|
||||
export { clearAssessmentFlow } from './assessment-flow.uts'
|
||||
import { contributionBaseVisible, contributionBaseValid, contributionBaseYuan } from './contribution.uts'
|
||||
import { wanAmountValid, wanToYuan, wanToCents } from './money.uts'
|
||||
|
||||
export type AssessmentForm = {
|
||||
name: string, idCard: string, phone: string, city: string, maritalStatus: string,
|
||||
occupation: string, company: string, monthlyIncome: string, socialSecurity: string,
|
||||
housingFund: string, house: string, car: string, savings: string, creditCard: string,
|
||||
housingFund: string, socialSecurityBase: string, housingFundBase: string, house: string, car: string, savings: string, creditCard: string,
|
||||
creditLoanCount: string, totalDebtBalance: string, monthlyLoanPayment: string,
|
||||
creditCardCount: string, creditCardTotalLimit: string, creditCardUsedLimit: string,
|
||||
otherAssets: string, enterpriseName: string, businessCode: string, annualRevenue: string, operatingYears: string, operatingMonths: string
|
||||
@@ -15,7 +16,7 @@ export type SelectedDocument = { name: string, path: string }
|
||||
export type DataAuthorization = { key: string, name: string, selected: boolean }
|
||||
|
||||
export function emptyAssessmentForm(): AssessmentForm {
|
||||
return { name: '', idCard: '', phone: '', city: '', maritalStatus: '', occupation: '', company: '', monthlyIncome: '', socialSecurity: '', housingFund: '', house: '', car: '', savings: '', creditCard: '', otherAssets: '', creditLoanCount: '', totalDebtBalance: '', monthlyLoanPayment: '', creditCardCount: '', creditCardTotalLimit: '', creditCardUsedLimit: '', enterpriseName: '', businessCode: '', annualRevenue: '', operatingYears: '', operatingMonths: '' }
|
||||
return { name: '', idCard: '', phone: '', city: '', maritalStatus: '', occupation: '', company: '', monthlyIncome: '', socialSecurity: '', housingFund: '', socialSecurityBase: '', housingFundBase: '', house: '', car: '', savings: '', creditCard: '', otherAssets: '', creditLoanCount: '', totalDebtBalance: '', monthlyLoanPayment: '', creditCardCount: '', creditCardTotalLimit: '', creditCardUsedLimit: '', enterpriseName: '', businessCode: '', annualRevenue: '', operatingYears: '', operatingMonths: '' }
|
||||
}
|
||||
export function draftText(saved: UTSJSONObject, key: string): string {
|
||||
const value = saved[key]
|
||||
@@ -38,12 +39,14 @@ export function assessmentApiPayload(saved: UTSJSONObject): UTSJSONObject {
|
||||
const value = draftText(normalized, key)
|
||||
result[key] = value.length > 0 ? wanToYuan(value) : ''
|
||||
})
|
||||
const baseKeys = ['socialSecurityBase', 'housingFundBase']
|
||||
baseKeys.forEach((key) => { const value = draftText(normalized, key); result[key] = value.length > 0 ? contributionBaseYuan(value) : '' })
|
||||
return result
|
||||
}
|
||||
export function formFromInput(saved: UTSJSONObject): AssessmentForm {
|
||||
return {
|
||||
name: draftText(saved, 'name'), idCard: draftText(saved, 'idCard'), phone: draftText(saved, 'phone'), city: draftText(saved, 'city'), maritalStatus: draftText(saved, 'maritalStatus'),
|
||||
occupation: draftText(saved, 'occupation'), company: draftText(saved, 'company'), monthlyIncome: draftText(saved, 'monthlyIncome'), socialSecurity: draftText(saved, 'socialSecurity'), housingFund: draftText(saved, 'housingFund'),
|
||||
occupation: draftText(saved, 'occupation'), company: draftText(saved, 'company'), monthlyIncome: draftText(saved, 'monthlyIncome'), socialSecurity: draftText(saved, 'socialSecurity'), housingFund: draftText(saved, 'housingFund'), socialSecurityBase: draftText(saved, 'socialSecurityBase'), housingFundBase: draftText(saved, 'housingFundBase'),
|
||||
house: ownershipFromInput(saved, 'house'), car: ownershipFromInput(saved, 'car'), savings: draftText(saved, 'savings'), creditCard: draftText(saved, 'creditCard'), otherAssets: draftText(saved, 'otherAssets'),
|
||||
creditLoanCount: draftText(saved, 'creditLoanCount'), totalDebtBalance: draftText(saved, 'totalDebtBalance'), monthlyLoanPayment: draftText(saved, 'monthlyLoanPayment'),
|
||||
creditCardCount: draftText(saved, 'creditCardCount'), creditCardTotalLimit: draftText(saved, 'creditCardTotalLimit'), creditCardUsedLimit: draftText(saved, 'creditCardUsedLimit'),
|
||||
@@ -57,6 +60,17 @@ export function ownershipFromInput(saved: UTSJSONObject, key: string): string {
|
||||
if (['全款房产', '按揭房产', '全款车辆', '按揭车辆'].includes(value)) return '有'
|
||||
return ''
|
||||
}
|
||||
export function contributionValidationMessage(form: AssessmentForm): string {
|
||||
const bases = [form.socialSecurityBase, form.housingFundBase]
|
||||
const durations = [form.socialSecurity, form.housingFund]
|
||||
const labels = ['社保', '公积金']
|
||||
for (let i = 0; i < bases.length; i++) {
|
||||
if (bases[i].length == 0) continue
|
||||
if (!contributionBaseVisible(durations[i])) return labels[i] + '基数须与缴纳情况一致'
|
||||
if (!contributionBaseValid(bases[i])) return labels[i] + '基数请输入大于 0 的万元金额,最多六位小数'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
export function assetValidationMessage(form: AssessmentForm): string {
|
||||
const counts = [form.creditLoanCount, form.creditCardCount]
|
||||
const countLabels = ['信用贷款笔数', '银行信用卡张数']
|
||||
@@ -86,7 +100,7 @@ export function setAssessmentInput(type: string, step: number, form: AssessmentF
|
||||
const grants: string[] = authorizations.filter((item) => item.selected).map((item) => item.key)
|
||||
const payload: UTSJSONObject = {
|
||||
type, step, editAssessmentId, baseRevisionId, moneyUnit: 'wan', name: form.name, idCard: form.idCard, phone: form.phone, city: form.city, maritalStatus: form.maritalStatus,
|
||||
occupation: form.occupation, company: form.company, monthlyIncome: form.monthlyIncome, socialSecurity: form.socialSecurity, housingFund: form.housingFund,
|
||||
occupation: form.occupation, company: form.company, monthlyIncome: form.monthlyIncome, socialSecurity: form.socialSecurity, housingFund: form.housingFund, socialSecurityBase: form.socialSecurityBase, housingFundBase: form.housingFundBase,
|
||||
house: form.house, car: form.car, savings: form.savings, creditCard: form.creditCard, otherAssets: form.otherAssets,
|
||||
creditLoanCount: form.creditLoanCount, totalDebtBalance: form.totalDebtBalance, monthlyLoanPayment: form.monthlyLoanPayment,
|
||||
creditCardCount: form.creditCardCount, creditCardTotalLimit: form.creditCardTotalLimit, creditCardUsedLimit: form.creditCardUsedLimit,
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import { wanAmountValid, wanToCents, wanToYuan } from './money.uts'
|
||||
|
||||
// 新选项不推断历史“6个月以上”的具体月数;历史值只在修改回填时保留。
|
||||
export const contributionLabels = ['未缴纳', '不足6个月', '连续6-12个月', '连续12-24个月', '连续24个月以上', '连续6个月以上']
|
||||
export const contributionCodes = ['none', 'under_six_months', 'six_to_twelve_months', 'twelve_to_twenty_four_months', 'twenty_four_months_plus', 'six_months_plus']
|
||||
export function contributionOptions(current: string): string[] {
|
||||
return current == contributionLabels[5] ? contributionLabels.slice() : contributionLabels.slice(0, 5)
|
||||
}
|
||||
export function contributionLabel(code: string): string {
|
||||
const index = contributionCodes.indexOf(code)
|
||||
return index < 0 ? code : contributionLabels[index]
|
||||
}
|
||||
export function contributionBaseVisible(duration: string): boolean {
|
||||
return contributionLabels.includes(duration) && duration != '未缴纳'
|
||||
}
|
||||
export function contributionBaseValid(value: string): boolean {
|
||||
return wanAmountValid(value) && wanToCents(value) > 0
|
||||
}
|
||||
export function contributionBaseYuan(value: string): string {
|
||||
if (!contributionBaseValid(value)) throw new Error('缴存基数请输入大于 0 的万元金额,最多六位小数')
|
||||
return wanToYuan(value)
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
function validRecordId(value: string): boolean { return /^[1-9][0-9]{0,9}$/.test(value) }
|
||||
|
||||
export function parseCompareIds(raw: string): string[] {
|
||||
if (raw.length == 0) return []
|
||||
const ids = raw.split(',')
|
||||
if (ids.length > 3) throw new Error('每次最多对比3个产品,请返回重新选择。')
|
||||
const seen: string[] = []
|
||||
ids.forEach((id: string) => {
|
||||
if (!validRecordId(id) || seen.includes(id)) throw new Error('对比产品编号无效或重复,请返回重新选择。')
|
||||
seen.push(id)
|
||||
})
|
||||
return ids
|
||||
}
|
||||
|
||||
export function compareQuery(assessmentId: string, ids: string[], revisionId: string = ''): string {
|
||||
return '?assessmentId=' + encodeURIComponent(assessmentId) + '&productIds=' + ids.join(',') + (revisionId.length > 0 ? '&revisionId=' + revisionId : '')
|
||||
}
|
||||
|
||||
// 主包共享的纯路由逻辑,账号分包登录时无需加载融资分包;不接受任意URL。
|
||||
export function matchReturnPath(page: string, assessmentId: string, rawIds: string, revisionId: string, productId: string = '', group: string = 'eligible', tab: string = 'explanation', from: string = ''): string {
|
||||
if (!['matches','product','compare'].includes(page) || (revisionId.length > 0 && !validRecordId(revisionId))) return ''
|
||||
if (assessmentId.length > 0 ? !validRecordId(assessmentId) : page != 'product') return ''
|
||||
let ids: string[] = []
|
||||
try { ids = parseCompareIds(rawIds) } catch (err) { return '' }
|
||||
if (assessmentId.length == 0 && (revisionId.length > 0 || ids.length > 0)) return ''
|
||||
if (page == 'matches' && !['eligible','ineligible','unknown'].includes(group)) return ''
|
||||
if (page == 'product' && (!validRecordId(productId) || !['explanation','details','conditions'].includes(tab) || (assessmentId.length == 0 && tab == 'explanation') || !['','matches','product','compare','report','next-step','archive'].includes(from))) return ''
|
||||
const query = assessmentId.length > 0 ? compareQuery(assessmentId, ids, revisionId) : '?'
|
||||
if (page == 'matches') return '/packages/finance/matches/matches' + query + '&group=' + group
|
||||
if (page == 'compare') return '/packages/finance/compare/compare' + query
|
||||
return '/packages/finance/product/product' + query + (assessmentId.length > 0 ? '&' : '') + 'productId=' + productId + '&tab=' + tab + '&from=' + from
|
||||
}
|
||||
Reference in New Issue
Block a user