summary.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { ref } from 'vue'
  2. import { dateFormatter, formatMoney } from '@jy/util'
  3. /**
  4. * 摘要 Item 基础类
  5. */
  6. class SummaryItem {
  7. constructor(map, data, config = { formatter: null, expands: {}, type: '' }) {
  8. this.map = map
  9. this.data = data
  10. this.configMap = {}
  11. this.config = config
  12. }
  13. append(key, { formatter = null, expands = {}, type } = {}) {
  14. this.configMap[key] = {
  15. formatter,
  16. expands,
  17. type
  18. }
  19. }
  20. customCreate({ label, type, key, value, expands, formatter } = {}) {
  21. return {
  22. label,
  23. type,
  24. data: {
  25. key,
  26. value: typeof formatter === 'function' ? formatter(value) : value,
  27. ...expands
  28. }
  29. }
  30. }
  31. create(key) {
  32. const formatter = this.configMap[key]?.formatter || this.config.formatter
  33. const value = this.data[key]
  34. const expands = this.configMap[key]?.expands || this.config.expands
  35. const type = this.configMap[key]?.type || this.config.type
  36. return this.customCreate({
  37. label: this.map[key],
  38. type,
  39. key,
  40. value,
  41. expands,
  42. formatter
  43. })
  44. }
  45. createList(list = Object.keys(this.map)) {
  46. return list.map((key) => this.create(key))
  47. }
  48. }
  49. const summaryModel = ref({
  50. list: []
  51. })
  52. function tranSummaryOfDefault(summary) {
  53. const summaryMap = {
  54. buyer: '采购单位',
  55. buyerContactInfo: '采购联系人/电话',
  56. agency: '代理机构',
  57. agencyContactInfo: '代理联系人/电话',
  58. signEndTime: '报名截止日期',
  59. bidEndTime: '投标截止日期'
  60. }
  61. const summaryItem = new SummaryItem(summaryMap, summary)
  62. // 特殊字段处理
  63. summaryItem.append('buyer', {
  64. type: 'unit'
  65. })
  66. summaryItem.append('buyerContactInfo', {
  67. type: 'contact'
  68. })
  69. const formatFn = (time) => {
  70. if (time) {
  71. return dateFormatter(time * 1000, 'yyyy-MM-dd')
  72. } else {
  73. return time
  74. }
  75. }
  76. summaryItem.append('signEndTime', {
  77. formatter: formatFn
  78. })
  79. summaryItem.append('bidEndTime', {
  80. formatter: formatFn
  81. })
  82. const list = summaryItem.createList()
  83. // 特殊字段处理
  84. // TODO 中标候选人公示时,需要特殊处理
  85. if (Array.isArray(summary?.winnerInfos)) {
  86. summary.winnerInfos.forEach((item) => {
  87. console.log('item', item);
  88. list.push(
  89. summaryItem.customCreate({
  90. label: '中标单位',
  91. type: 'unit',
  92. expands: {
  93. value: item?.winner,
  94. id: item?.winnerId,
  95. _origin: item
  96. }
  97. })
  98. )
  99. list.push(
  100. summaryItem.customCreate({
  101. label: '中标联系人/电话',
  102. type: 'contact',
  103. expands: {
  104. value: item?.winnerContactInfo,
  105. id: item?.winnerId,
  106. _origin: item
  107. }
  108. })
  109. )
  110. })
  111. }
  112. // TODO 确认金额字段
  113. list.push(
  114. summaryItem.customCreate({
  115. label: '中标金额(元)',
  116. expands: {
  117. value: '测试金额'
  118. }
  119. })
  120. )
  121. return list
  122. }
  123. function tranSummaryOfProposed(summary) {
  124. const summaryMap = {
  125. projectName: '项目名称',
  126. area: '省份',
  127. buyer: '业主单位',
  128. buyerClass: '业主类型',
  129. totalInvestment: '总投资',
  130. projectPeriod: '建设年限',
  131. address: '建设地点',
  132. approveDept: '审批机关',
  133. approveContent: '审批事项',
  134. approveCode: '审批代码',
  135. approvalNumber: '批准文号',
  136. approveTime: '审批时间',
  137. approveStatus: '审批结果',
  138. content: '建设内容'
  139. }
  140. const summaryItem = new SummaryItem(summaryMap, summary)
  141. // 特殊字段处理
  142. summaryItem.append('address', {
  143. expands: {
  144. row: true
  145. }
  146. })
  147. summaryItem.append('content', {
  148. expands: {
  149. row: true
  150. }
  151. })
  152. summaryItem.append('totalInvestment', {
  153. formatter: formatMoney
  154. })
  155. const list = summaryItem.createList()
  156. return list
  157. }
  158. function tranSummary(data) {
  159. const { baseInfo, abstract } = data
  160. const isProposed = baseInfo?.subType === '拟建'
  161. summaryModel.value.list = isProposed
  162. ? tranSummaryOfProposed(abstract.proposed)
  163. : tranSummaryOfDefault(abstract.default)
  164. }
  165. export { summaryModel, tranSummary, SummaryItem }