summary.js 5.3 KB

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