113 lines
3.1 KiB
JavaScript
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] : '')
|
|
|| ''
|
|
}
|
|
})
|
|
}
|