summary.js 5.1 KB

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