import BaseModel from '../../../core/base' import { dateFormatter, formatMoney } from '@jy/util' /** * 摘要 Item 基础类 */ class SummaryItem { constructor(map, data, config = { formatter: null, expands: {}, type: '' }) { this.map = map this.data = data this.configMap = {} this.config = config } append(key, { formatter = null, expands = {}, type } = {}) { this.configMap[key] = { formatter, expands, type } } customCreate({ label, type, key, value, expands, formatter } = {}) { return { label, type, data: { key, value: typeof formatter === 'function' ? formatter(value) : value, ...expands } } } create(key) { const formatter = this.configMap[key]?.formatter || this.config.formatter const value = this.data[key] const expands = this.configMap[key]?.expands || this.config.expands const type = this.configMap[key]?.type || this.config.type return this.customCreate({ label: this.map[key], type, key, value, expands, formatter }) } createList(list = Object.keys(this.map)) { return list.map((key) => this.create(key)) } } class SummaryModel extends BaseModel { constructor(config) { super(config) } createModel() { return { list: [], // 采购单位 buyers: [], // 中标单位 winners: [] } } formatModel(data, isInit = false) { const { baseInfo, abstract } = data const isProposed = baseInfo?.subType === '拟建' const model = isProposed ? this.tranSummaryOfProposed(abstract.proposed) : this.tranSummaryOfDefault(abstract.default) return model } tranSummaryOfDefault(summary) { const result = this.createModel() const summaryMap = { buyer: '采购单位', buyerContactInfo: '采购联系人/电话', agency: '代理机构', agencyContactInfo: '代理联系人/电话', signEndTime: '报名截止日期', bidEndTime: '投标截止日期' } // 采购单位 if (summary?.buyer) { result.buyers.push({ name: summary.buyer }) } const summaryItem = new SummaryItem(summaryMap, summary) // 特殊字段处理 summaryItem.append('buyer', { type: 'unit' }) summaryItem.append('buyerContactInfo', { type: 'contact' }) const formatFn = (time) => { if (time) { return dateFormatter(time * 1000, 'yyyy-MM-dd') } else { return time } } summaryItem.append('signEndTime', { formatter: formatFn }) summaryItem.append('bidEndTime', { formatter: formatFn }) const list = summaryItem.createList() // 特殊字段处理 // TODO 中标候选人公示时,需要特殊处理 if (Array.isArray(summary?.winnerInfos)) { summary.winnerInfos.forEach((item) => { // 中标单位 if (item?.winner) { result.winners.push({ name: item?.winner, id: item?.winnerId }) } list.push( summaryItem.customCreate({ label: '中标单位', type: 'unit', expands: { value: item?.winner, id: item?.winnerId, _origin: item } }) ) list.push( summaryItem.customCreate({ label: '中标联系人/电话', type: 'contact', expands: { value: item?.winnerContactInfo, id: item?.winnerId, _origin: item } }) ) }) } // TODO 确认金额字段 list.push( summaryItem.customCreate({ label: '中标金额(元)', expands: { value: '测试金额' } }) ) result.list = list return result } tranSummaryOfProposed(summary) { const result = this.createModel() const summaryMap = { projectName: '项目名称', area: '省份', buyer: '业主单位', buyerClass: '业主类型', totalInvestment: '总投资', projectPeriod: '建设年限', address: '建设地点', approveDept: '审批机关', approveContent: '审批事项', approveCode: '审批代码', approvalNumber: '批准文号', approveTime: '审批时间', approveStatus: '审批结果', content: '建设内容' } // 采购单位 if (summary?.buyer) { result.buyers.push({ name: summary.buyer }) } const summaryItem = new SummaryItem(summaryMap, summary) // 特殊字段处理 summaryItem.append('address', { expands: { row: true } }) summaryItem.append('content', { expands: { row: true } }) summaryItem.append('totalInvestment', { formatter: formatMoney }) result.list = summaryItem.createList() return result } } function useSummaryModel() { return new SummaryModel() } export default useSummaryModel