feat: 优化首页服务入口与租住业务流程
补齐首页待办跳转、押金支付引导和多类租住服务页面能力,统一租客端关键业务流程体验。
This commit is contained in:
112
utils/contract-display.js
Normal file
112
utils/contract-display.js
Normal file
@@ -0,0 +1,112 @@
|
||||
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] : '')
|
||||
|| ''
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user