|
@@ -0,0 +1,223 @@
|
|
|
+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
|