summary.js 5.0 KB

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