summary.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. buyers: [],
  53. // 中标单位
  54. winners: []
  55. })
  56. function tranSummaryOfDefault(summary) {
  57. const summaryMap = {
  58. buyer: '采购单位',
  59. buyerContactInfo: '采购联系人/电话',
  60. agency: '代理机构',
  61. agencyContactInfo: '代理联系人/电话',
  62. signEndTime: '报名截止日期',
  63. bidEndTime: '投标截止日期'
  64. }
  65. // 采购单位
  66. if (summary?.buyer) {
  67. summaryModel.value.buyers.push({
  68. name: summary.buyer
  69. })
  70. }
  71. const summaryItem = new SummaryItem(summaryMap, summary)
  72. // 特殊字段处理
  73. summaryItem.append('buyer', {
  74. type: 'unit'
  75. })
  76. summaryItem.append('buyerContactInfo', {
  77. type: 'contact'
  78. })
  79. const formatFn = (time) => {
  80. if (time) {
  81. return dateFormatter(time * 1000, 'yyyy-MM-dd')
  82. } else {
  83. return time
  84. }
  85. }
  86. summaryItem.append('signEndTime', {
  87. formatter: formatFn
  88. })
  89. summaryItem.append('bidEndTime', {
  90. formatter: formatFn
  91. })
  92. const list = summaryItem.createList()
  93. // 特殊字段处理
  94. // TODO 中标候选人公示时,需要特殊处理
  95. if (Array.isArray(summary?.winnerInfos)) {
  96. summary.winnerInfos.forEach((item) => {
  97. // 中标单位
  98. if (item?.winner) {
  99. summaryModel.value.winners.push({
  100. name: item?.winner,
  101. id: item?.winnerId
  102. })
  103. }
  104. list.push(
  105. summaryItem.customCreate({
  106. label: '中标单位',
  107. type: 'unit',
  108. expands: {
  109. value: item?.winner,
  110. id: item?.winnerId,
  111. _origin: item
  112. }
  113. })
  114. )
  115. list.push(
  116. summaryItem.customCreate({
  117. label: '中标联系人/电话',
  118. type: 'contact',
  119. expands: {
  120. value: item?.winnerContactInfo,
  121. id: item?.winnerId,
  122. _origin: item
  123. }
  124. })
  125. )
  126. })
  127. }
  128. // TODO 确认金额字段
  129. list.push(
  130. summaryItem.customCreate({
  131. label: '中标金额(元)',
  132. expands: {
  133. value: '测试金额'
  134. }
  135. })
  136. )
  137. return list
  138. }
  139. function tranSummaryOfProposed(summary) {
  140. const summaryMap = {
  141. projectName: '项目名称',
  142. area: '省份',
  143. buyer: '业主单位',
  144. buyerClass: '业主类型',
  145. totalInvestment: '总投资',
  146. projectPeriod: '建设年限',
  147. address: '建设地点',
  148. approveDept: '审批机关',
  149. approveContent: '审批事项',
  150. approveCode: '审批代码',
  151. approvalNumber: '批准文号',
  152. approveTime: '审批时间',
  153. approveStatus: '审批结果',
  154. content: '建设内容'
  155. }
  156. // 采购单位
  157. if (summary?.buyer) {
  158. summaryModel.value.buyers.push({
  159. name: summary.buyer
  160. })
  161. }
  162. const summaryItem = new SummaryItem(summaryMap, summary)
  163. // 特殊字段处理
  164. summaryItem.append('address', {
  165. expands: {
  166. row: true
  167. }
  168. })
  169. summaryItem.append('content', {
  170. expands: {
  171. row: true
  172. }
  173. })
  174. summaryItem.append('totalInvestment', {
  175. formatter: formatMoney
  176. })
  177. const list = summaryItem.createList()
  178. return list
  179. }
  180. function tranSummary(data) {
  181. const { baseInfo, abstract } = data
  182. const isProposed = baseInfo?.subType === '拟建'
  183. summaryModel.value.list = isProposed
  184. ? tranSummaryOfProposed(abstract.proposed)
  185. : tranSummaryOfDefault(abstract.default)
  186. }
  187. export { summaryModel, tranSummary, SummaryItem }