Files
QSY-lvjuxcx/utils/contract-display.js
liangjian 9fee2c3a74 feat: 优化首页服务入口与租住业务流程
补齐首页待办跳转、押金支付引导和多类租住服务页面能力,统一租客端关键业务流程体验。
2026-08-25 13:53:12 +08:00

113 lines
3.1 KiB
JavaScript

import { contractDetail } from '@/api/index.js'
const contractNameCache = Object.create(null)
const contractDetailCache = Object.create(null)
function pickFirstText(...values) {
for (let index = 0; index < values.length; index += 1) {
const value = values[index]
if (value === undefined || value === null) continue
const text = String(value).trim()
if (text) return text
}
return ''
}
function parseContractDetailResponse(response) {
const payload = response && response.data ? response.data : response
if (payload && payload.data && typeof payload.data === 'object' && !Array.isArray(payload.data)) {
return payload.data
}
if (payload && typeof payload === 'object' && !Array.isArray(payload)) {
return payload
}
return {}
}
function resolveContractNameFromSource(source = {}) {
return pickFirstText(
source.contractDisplayName,
source.contractName,
source.contractTemplateName,
source.contractTypeName,
source.contractType,
source.type,
source.typeName,
source.templateName,
source.title
)
}
function resolveContractNo(source = {}) {
return pickFirstText(source.no, source.contractNo)
}
export function getContractDisplayName(source = {}, fallbackText = '') {
const directName = resolveContractNameFromSource(source)
if (directName) return directName
const contractNo = resolveContractNo(source)
if (contractNo && contractNameCache[contractNo]) return contractNameCache[contractNo]
return fallbackText || ''
}
export async function fetchContractDisplayInfo(contractNo = '', language) {
const normalizedContractNo = String(contractNo || '').trim()
if (!normalizedContractNo) {
return {
contractDisplayName: '',
detail: {}
}
}
if (contractDetailCache[normalizedContractNo]) {
const cachedDetail = contractDetailCache[normalizedContractNo]
return {
contractDisplayName: resolveContractNameFromSource(cachedDetail) || contractNameCache[normalizedContractNo] || '',
detail: cachedDetail
}
}
const response = await contractDetail({ contractNo: normalizedContractNo }, language)
const detail = parseContractDetailResponse(response)
const contractDisplayName = resolveContractNameFromSource(detail)
contractDetailCache[normalizedContractNo] = detail
contractNameCache[normalizedContractNo] = contractDisplayName
return {
contractDisplayName,
detail
}
}
export async function enrichContractDisplayNames(list = [], language) {
const sourceList = Array.isArray(list) ? list : []
const pendingNos = [...new Set(
sourceList
.filter(item => !resolveContractNameFromSource(item))
.map(item => resolveContractNo(item))
.filter(Boolean)
)]
await Promise.all(
pendingNos.map((contractNo) =>
fetchContractDisplayInfo(contractNo, language).catch(() => ({
contractDisplayName: '',
detail: {}
}))
)
)
return sourceList.map((item) => {
const contractNo = resolveContractNo(item)
return {
...item,
contractDisplayName: getContractDisplayName(item, '')
|| (contractNo ? contractNameCache[contractNo] : '')
|| ''
}
})
}