Эх сурвалжийг харах

feat: 三级页通用逻辑调整

cuiyalong 1 жил өмнө
parent
commit
19fd4ea88e

+ 9 - 3
data/data-models/modules/article/model/content.js

@@ -1,5 +1,5 @@
 import BaseModel from '../../../core/base'
 import BaseModel from '../../../core/base'
-import useSummaryModel from '../transform/summary'
+import useSummaryModel from '../transform/summary2'
 import useCommonTitleModel from '../transform/content'
 import useCommonTitleModel from '../transform/content'
 import { replaceKeyword } from '@jy/util'
 import { replaceKeyword } from '@jy/util'
 
 
@@ -16,13 +16,17 @@ class ContentModel extends BaseModel {
 
 
   formatModel(data, isInit = false) {
   formatModel(data, isInit = false) {
     const result = this.createModel()
     const result = this.createModel()
+
+    const commonTitleModel = useCommonTitleModel()
+    const summaryModel = useSummaryModel()
+
     // 基础信息
     // 基础信息
     if (data?.baseInfo) {
     if (data?.baseInfo) {
-      result.content = useCommonTitleModel().transformModel(data)
+      result.content = commonTitleModel.transformModel(data)
     }
     }
     // 摘要
     // 摘要
     if (data?.abstract) {
     if (data?.abstract) {
-      result.summary = useSummaryModel().transformModel(data)
+      result.summary = summaryModel.transformModel(data)
     }
     }
 
 
     if (result.content) {
     if (result.content) {
@@ -93,6 +97,8 @@ class ContentModel extends BaseModel {
     if(content.length > 10 && content.substring(0,6).toLowerCase() === '<tbody' && content.substring(content.length-8).toLowerCase() == '</tbody>'){
     if(content.length > 10 && content.substring(0,6).toLowerCase() === '<tbody' && content.substring(content.length-8).toLowerCase() == '</tbody>'){
       content = '<table>' + content + '</table>'
       content = '<table>' + content + '</table>'
     }
     }
+    // 表格外面添加盒子
+    content = content.replace(/<table/g, `<div class="content-table-container"><table`).replace(/<\/table>/g, `</table></div>`)
 
 
     // ------------------
     // ------------------
     // 关键词高亮
     // 关键词高亮

+ 4 - 0
data/data-models/modules/article/transform/content.js

@@ -23,6 +23,8 @@ class CommonContentModel extends BaseModel {
       isSelfSite: false,
       isSelfSite: false,
       // 正文
       // 正文
       content: '',
       content: '',
+      // 是否需要展示供应商报名
+      recommendedService: false,
       // TDK
       // TDK
       tdk: {
       tdk: {
         title: '',
         title: '',
@@ -47,6 +49,8 @@ class CommonContentModel extends BaseModel {
     result.highlightKeys = this.splitUrlKeys()
     result.highlightKeys = this.splitUrlKeys()
     result.content = detailInfo.detail || ''
     result.content = detailInfo.detail || ''
 
 
+    result.recommendedService = baseInfo?.recommendedService === 1
+
     // TDK
     // TDK
     result.tdk.title = baseInfo.title
     result.tdk.title = baseInfo.title
     result.tdk.description = baseInfo?.description
     result.tdk.description = baseInfo?.description

+ 1 - 1
data/data-models/modules/article/transform/project-progress.js

@@ -27,7 +27,7 @@ function tranProjectProgress(data) {
     name: ''
     name: ''
   }
   }
 
 
-  projectProgressModel.list = data.list.map((item) =>
+  projectProgressModel.list = data.list?.map((item) =>
     tranProjectProgressItem(item)
     tranProjectProgressItem(item)
   )
   )
   projectProgressModel.name = data.projectName
   projectProgressModel.name = data.projectName

+ 9 - 1
data/data-models/modules/article/transform/summary.js

@@ -58,6 +58,8 @@ class SummaryModel extends BaseModel {
 
 
   createModel() {
   createModel() {
     return {
     return {
+      // 是否超前项目
+      isProposed: false,
       // 原始数据
       // 原始数据
       originMap: {},
       originMap: {},
       list: [],
       list: [],
@@ -70,13 +72,18 @@ class SummaryModel extends BaseModel {
 
 
   formatModel(data, isInit = false) {
   formatModel(data, isInit = false) {
     const { baseInfo, abstract } = data
     const { baseInfo, abstract } = data
-    const isProposed = baseInfo?.subType === '拟建'
+    const isProposed = this.isProposedCheck(baseInfo?.subType)
     const model = isProposed
     const model = isProposed
       ? this.tranSummaryOfProposed(abstract.proposed)
       ? this.tranSummaryOfProposed(abstract.proposed)
       : this.tranSummaryOfDefault(abstract.default)
       : this.tranSummaryOfDefault(abstract.default)
+    model.isProposed = isProposed
     return model
     return model
   }
   }
 
 
+  isProposedCheck(type) {
+    return type === '拟建' || type === '采购意向'
+  }
+
   tranSummaryOfDefault(summary) {
   tranSummaryOfDefault(summary) {
     const result = this.createModel()
     const result = this.createModel()
     const summaryMap = {
     const summaryMap = {
@@ -96,6 +103,7 @@ class SummaryModel extends BaseModel {
     }
     }
 
 
     const summaryItem = new SummaryItem(summaryMap, summary)
     const summaryItem = new SummaryItem(summaryMap, summary)
+
     // 特殊字段处理
     // 特殊字段处理
     summaryItem.append('buyer', {
     summaryItem.append('buyer', {
       type: 'unit'
       type: 'unit'

+ 244 - 0
data/data-models/modules/article/transform/summary2.js

@@ -0,0 +1,244 @@
+import BaseModel from '../../../core/base'
+import { dateFormatter, formatMoney, splitMoney } from '@jy/util'
+
+/**
+ * 摘要 Item 基础类
+ */
+class SummaryItem {
+  constructor(key, label, value) {
+    this.key = key
+    this.label = label
+    this.value = value || '-' // 如果为空,默认值则改为'-'
+  }
+  addKey(key, value) {
+    this[key] = value
+  }
+}
+// 联系人类
+class PersonTelSummaryItem extends SummaryItem {
+  constructor(key, label, value, tel) {
+    super(key, label, value)
+    if (tel) {
+      this.showMore = true
+      this.tel = tel
+    }
+  }
+}
+
+class Unit {
+  constructor(name, id) {
+    this.name = name || '-'
+    this.id = id
+  }
+}
+class Buyer extends Unit {
+  constructor(name, id, { link }) {
+    super(name, id)
+    this.link = link
+  }
+}
+class Winner extends Unit {
+  constructor(name, id, { seoId, winnerPerson, winnerTel, isCandidate }) {
+    super(name, id)
+
+    this.seoId = seoId || ''
+    this.winnerPerson = winnerPerson || ''
+    this.winnerTel = winnerTel || ''
+    this.isCandidate = isCandidate
+  }
+}
+
+
+class SummaryModel extends BaseModel {
+  constructor(config) {
+    super(config)
+  }
+
+  createModel() {
+    return {
+      // 是否超前项目
+      isProposed: false,
+      // 原始数据
+      originMap: {},
+      list: [],
+      // 采购单位
+      buyers: [],
+      // 中标单位
+      winners: []
+    }
+  }
+
+  formatModel(data, isInit = false) {
+    const { baseInfo, abstract } = data
+    const isProposed = this.isProposedCheck(baseInfo?.subType)
+    const model = isProposed
+      ? this.tranSummaryOfProposed(abstract.proposed)
+      : this.tranSummaryOfDefault(abstract.default)
+    model.isProposed = isProposed
+    return model
+  }
+
+  isProposedCheck(type) {
+    return type === '拟建' || type === '采购意向'
+  }
+
+  formatTime(time) {
+    if (time) {
+      return dateFormatter(time * 1000, 'yyyy-MM-dd')
+    } else {
+      return time
+    }
+  }
+
+  formatMoney(m) {
+    return splitMoney(m, -1, true)
+  }
+
+  formatTel(name, tel) {
+    const arr = [name, tel]
+    return arr.filter((item) => !!item).join(' / ')
+  }
+
+  tranSummaryOfDefault(summary) {
+    const result = this.createModel()
+
+    const list = []
+
+    // 采购单位
+    const buyerInfo = new SummaryItem('buyer', '采购单位', summary?.buyer)
+    // 是否可进行跳转
+    buyerInfo.addKey('link', summary?.buyerPortraitShow)
+    list.push(buyerInfo)
+    result.buyers.push(
+      new Buyer(summary?.buyer, summary?.buyer, { link: summary?.buyerPortraitShow })
+    )
+
+    // 采购人/联系电话
+    const buyerContactInfoValue = this.formatTel(summary?.buyerPerson, summary?.buyerTel)
+    const buyerContactInfo = new PersonTelSummaryItem('buyerContactInfo', '采购人 / 联系电话', buyerContactInfoValue, summary?.buyerTel)
+    list.push(buyerContactInfo)
+
+    // 招标代理机构
+    list.push(
+      new SummaryItem('agency', '招标代理机构', summary?.agency)
+    )
+
+    // 代理联系人
+    const agencyContactInfoValue = this.formatTel(summary?.agencyPerson, summary?.agencyTel)
+    const agencyContactInfo = new PersonTelSummaryItem('agencyContactInfo', '代理联系人 / 联系电话', agencyContactInfoValue, summary?.agencyTel)
+    list.push(agencyContactInfo)
+
+    // 截止日期
+    list.push(
+      new SummaryItem('signEndTime', '报名截止日期', this.formatTime(summary?.signEndTime))
+    )
+
+    // 投标截止日期
+    list.push(
+      new SummaryItem('bidEndTime', '投标截止日期', this.formatTime(summary?.bidEndTime))
+    )
+
+    // 中标单位
+    if (Array.isArray(summary.winnerInfos) && summary.winnerInfos.length > 0) {
+      const winnerList = []
+      summary.winnerInfos.forEach((w, index) => {
+        const summaryWinner = new SummaryItem('winner', '中标单位', w.winner)
+        // 是否可跳转
+        summaryWinner.addKey('link', !!w.winnerId)
+        summaryWinner.addKey('id', w.winnerId)
+        
+        const wContactInfoValue = this.formatTel(w?.winnerPerson, summary?.winnerTel)
+        const winnerContactInfo = new PersonTelSummaryItem(`winnerContactInfo-${index}`, '代理联系人 / 联系电话', wContactInfoValue, w?.winnerTel)
+
+        list.push(summaryWinner)
+        list.push(winnerContactInfo)
+
+        const seoId = winnerSeoId[w.winner]
+        winnerList.push(
+          new Winner('winner', '中标单位', {
+            seoId: seoId || '',
+            winnerPerson: w.winnerPerson || '',
+            winnerTel: w.winnerTel || '',
+            isCandidate: w.isCandidate || false
+          })
+        )
+      })
+
+      result.winners = winnerList
+    }
+
+    // 中标金额
+    list.push(
+      new SummaryItem('bidAmount', '中标金额(元)', this.formatMoney(summary?.bidAmount))
+    )
+
+    result.list = list
+    result.originMap = summary
+
+    console.log(result)
+
+    return result
+  }
+
+  tranSummaryOfProposed(summary) {
+    const result = this.createModel()
+
+    const list = []
+
+    const summaryMap = {
+      projectName: '项目名称',
+      area: '省份',
+      buyer: '业主单位',
+      buyerClass: '业主类型',
+      totalInvestment: '总投资',
+      projectPeriod: '建设年限',
+      address: '建设地点',
+      approveDept: '审批机关',
+      approveContent: '审批事项',
+      approveCode: '审批代码',
+      approvalNumber: '批准文号',
+      approveTime: '审批时间',
+      approveStatus: '审批结果',
+      content: '建设内容'
+    }
+
+    for (const key in summaryMap) {
+      const label = summaryMap[item]
+      let s = null
+      if (key === 'buyerClass') {
+        s = new SummaryItem(key, label, summary?.buyerClass === '其它' ? '' : summary?.buyerClass)
+      } else if (key === 'totalInvestment') {
+        s = new SummaryItem(key, label, formatMoney(summary[key]))
+      } else {
+        s = new SummaryItem(key, label, summary[key] || '')
+      }
+
+      if (key === 'buyer') {
+        s.addKey('link', summary?.buyerPortraitShow) // 是否可进行跳转
+        result.buyers.push(
+          new Buyer(summary?.buyer, summary?.buyer, { link: summary?.buyerPortraitShow })
+        )
+      } else if (key === 'address') {
+        s.addKey('row', true)
+      } else if (key === 'content') {
+        s.addKey('row', true)
+      }
+
+
+      if (s) {
+        list.push(s)
+      }
+    }
+
+    result.list = list
+    result.originMap = summary
+
+    return result
+  }
+}
+
+function useSummaryModel() {
+  return new SummaryModel()
+}
+
+export default useSummaryModel

+ 20 - 0
packages/util/modules/format/money.js

@@ -118,3 +118,23 @@ export function formatNumber(number) {
 export function yuan2Fen(v) {
 export function yuan2Fen(v) {
   return formatNumber((v * 10000) / 100)
   return formatNumber((v * 10000) / 100)
 }
 }
+
+// 金额3位逗号分隔  ------------>
+/**
+ * @param s 要格式化的数字(四舍五入)
+ * @param n 保留几位小数(不传或者传-1 --> 如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
+ * @param comma 是否小数点前每3位添加逗号
+ */
+export function splitMoney(s = 0, n = -1, comma = false) {
+  n = n === -1 ? 0 : n
+  if (n > 20 || n < -1) {
+    n = 2
+  }
+  s = Number(s)
+  return s.toLocaleString('zh-CN', {
+    style: 'decimal',
+    useGrouping: comma,
+    minimumFractionDigits: n,
+    maximumFractionDigits: n
+  })
+}