summary2.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import BaseModel from '../../../core/base'
  2. import { dateFormatter, formatMoney, splitMoney } from '@jy/util'
  3. /**
  4. * 摘要 Item 基础类
  5. */
  6. class SummaryItem {
  7. constructor(key, label, value) {
  8. this.key = key
  9. this.label = label
  10. this.value = value || '-' // 如果为空,默认值则改为'-'
  11. }
  12. addKey(key, value) {
  13. this[key] = value
  14. }
  15. }
  16. // 联系人类
  17. class PersonTelSummaryItem extends SummaryItem {
  18. constructor(key, label, value, tel) {
  19. super(key, label, value)
  20. if (tel) {
  21. this.showMore = true
  22. this.tel = tel
  23. }
  24. }
  25. }
  26. class Unit {
  27. constructor(name, id) {
  28. this.name = name || '-'
  29. this.id = id
  30. }
  31. }
  32. class Buyer extends Unit {
  33. constructor(name, id, { link }) {
  34. super(name, id)
  35. this.link = link
  36. }
  37. }
  38. class Winner extends Unit {
  39. constructor(name, id, { seoId, winnerPerson, winnerTel, isCandidate, personTel }) {
  40. super(name, id)
  41. this.seoId = seoId || ''
  42. this.winnerPerson = winnerPerson || ''
  43. this.winnerTel = winnerTel || ''
  44. this.isCandidate = isCandidate
  45. this.personTel = personTel
  46. }
  47. }
  48. class SummaryModel extends BaseModel {
  49. constructor(config) {
  50. super(config)
  51. }
  52. createModel() {
  53. return {
  54. // 是否超前项目
  55. isProposed: false,
  56. // 原始数据
  57. originMap: {},
  58. list: [],
  59. // 采购单位
  60. buyers: [],
  61. // 中标单位
  62. winners: []
  63. }
  64. }
  65. formatModel(data, isInit = false) {
  66. const { baseInfo, abstract } = data
  67. const isProposed = this.isProposedCheck(baseInfo?.subType)
  68. const model = isProposed
  69. ? this.tranSummaryOfProposed(abstract.proposed)
  70. : this.tranSummaryOfDefault(abstract.default)
  71. model.isProposed = isProposed
  72. return model
  73. }
  74. isProposedCheck(type) {
  75. return type === '拟建' || type === '采购意向'
  76. }
  77. formatTime(time) {
  78. if (time) {
  79. return dateFormatter(time * 1000, 'yyyy-MM-dd')
  80. } else {
  81. return time
  82. }
  83. }
  84. formatMoney(m) {
  85. return splitMoney(m, -1, true)
  86. }
  87. formatTel(name, tel) {
  88. const arr = [name, tel]
  89. return arr.filter((item) => !!item).join(' / ')
  90. }
  91. tranSummaryOfDefault(summary) {
  92. const result = this.createModel()
  93. const list = []
  94. // 采购单位
  95. const buyerInfo = new SummaryItem('buyer', '采购单位', summary?.buyer)
  96. // 是否可进行跳转
  97. buyerInfo.addKey('link', summary?.buyerPortraitShow)
  98. list.push(buyerInfo)
  99. result.buyers.push(
  100. new Buyer(summary?.buyer, summary?.buyer, { link: summary?.buyerPortraitShow })
  101. )
  102. // 采购人/联系电话
  103. const buyerContactInfoValue = this.formatTel(summary?.buyerPerson, summary?.buyerTel)
  104. const buyerContactInfo = new PersonTelSummaryItem('buyerContactInfo', '采购人 / 联系电话', buyerContactInfoValue, summary?.buyerTel)
  105. list.push(buyerContactInfo)
  106. // 招标代理机构
  107. list.push(
  108. new SummaryItem('agency', '招标代理机构', summary?.agency)
  109. )
  110. // 代理联系人
  111. const agencyContactInfoValue = this.formatTel(summary?.agencyPerson, summary?.agencyTel)
  112. const agencyContactInfo = new PersonTelSummaryItem('agencyContactInfo', '代理联系人 / 联系电话', agencyContactInfoValue, summary?.agencyTel)
  113. list.push(agencyContactInfo)
  114. // 截止日期
  115. list.push(
  116. new SummaryItem('signEndTime', '报名截止日期', this.formatTime(summary?.signEndTime))
  117. )
  118. // 投标截止日期
  119. list.push(
  120. new SummaryItem('bidEndTime', '投标截止日期', this.formatTime(summary?.bidEndTime))
  121. )
  122. // 中标单位
  123. if (Array.isArray(summary.winnerInfos) && summary.winnerInfos.length > 0) {
  124. const winnerList = []
  125. summary.winnerInfos.forEach((w, index) => {
  126. const summaryWinner = new SummaryItem('winner', '中标单位', w.winner)
  127. // 是否可跳转
  128. summaryWinner.addKey('link', !!w.winnerId)
  129. summaryWinner.addKey('id', w.winnerId)
  130. const wContactInfoValue = this.formatTel(w?.winnerPerson, summary?.winnerTel)
  131. const winnerContactInfo = new PersonTelSummaryItem(`winnerContactInfo-${index}`, '代理联系人 / 联系电话', wContactInfoValue, w?.winnerTel)
  132. list.push(summaryWinner)
  133. list.push(winnerContactInfo)
  134. let seoId = ''
  135. if (summary?.winnerSeoId) {
  136. seoId = summary?.winnerSeoId[w.winner]
  137. }
  138. winnerList.push(
  139. new Winner(w.winner, w.winnerId, {
  140. seoId: seoId || '',
  141. winnerPerson: w.winnerPerson || '',
  142. winnerTel: w.winnerTel || '',
  143. isCandidate: w.isCandidate || false,
  144. personTel: winnerContactInfo
  145. })
  146. )
  147. })
  148. result.winners = winnerList
  149. }
  150. // 中标金额
  151. list.push(
  152. new SummaryItem('bidAmount', '中标金额(元)', this.formatMoney(summary?.bidAmount))
  153. )
  154. result.list = list
  155. result.originMap = summary
  156. return result
  157. }
  158. tranSummaryOfProposed(summary) {
  159. const result = this.createModel()
  160. const list = []
  161. const summaryMap = {
  162. projectName: '项目名称',
  163. area: '省份',
  164. buyer: '业主单位',
  165. buyerClass: '业主类型',
  166. totalInvestment: '总投资',
  167. projectPeriod: '建设年限',
  168. address: '建设地点',
  169. approveDept: '审批机关',
  170. approveContent: '审批事项',
  171. approveCode: '审批代码',
  172. approvalNumber: '批准文号',
  173. approveTime: '审批时间',
  174. approveStatus: '审批结果',
  175. content: '建设内容'
  176. }
  177. for (const key in summaryMap) {
  178. const label = summaryMap[key]
  179. let s = null
  180. if (key === 'buyerClass') {
  181. s = new SummaryItem(key, label, summary?.buyerClass === '其它' ? '' : summary?.buyerClass)
  182. } else if (key === 'totalInvestment') {
  183. s = new SummaryItem(key, label, formatMoney(summary[key]))
  184. } else {
  185. s = new SummaryItem(key, label, summary[key] || '')
  186. }
  187. if (key === 'buyer') {
  188. s.addKey('link', summary?.buyerPortraitShow) // 是否可进行跳转
  189. if (summary?.buyer) {
  190. result.buyers.push(
  191. new Buyer(summary?.buyer, summary?.buyer, { link: summary?.buyerPortraitShow })
  192. )
  193. }
  194. } else if (key === 'address') {
  195. s.addKey('row', true)
  196. } else if (key === 'content') {
  197. s.addKey('row', true)
  198. }
  199. if (s) {
  200. list.push(s)
  201. }
  202. }
  203. result.list = list
  204. result.originMap = summary
  205. return result
  206. }
  207. }
  208. function useSummaryModel() {
  209. return new SummaryModel()
  210. }
  211. export default useSummaryModel