content.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import { dateFormatter, formatMoney, getQueryParam } from '@jy/util'
  2. import BaseModel from '../../../core/base'
  3. class CommonContentModel extends BaseModel {
  4. createModel() {
  5. const contentModel = {
  6. id: '',
  7. title: '',
  8. // 项目信息
  9. projectName: '',
  10. projectCode: '',
  11. // 高亮词组
  12. highlightKeys: [],
  13. tags: [],
  14. titleHighlighted: '',
  15. contentHighlighted: '',
  16. time: '',
  17. // 计算信息
  18. isSelfSite: false,
  19. // 正文
  20. content: '',
  21. // 是否需要展示原文链接
  22. originalShow: false,
  23. // 附件列表
  24. attachments: [],
  25. // 是否需要展示供应商报名
  26. recommendedService: false,
  27. // 拟建,采购意向
  28. isNiJian: false,
  29. isCaigouyixiang: false,
  30. isCanRead: false,
  31. // TDK
  32. tdk: {
  33. title: '',
  34. keywords: '',
  35. description: ''
  36. }
  37. }
  38. return contentModel
  39. }
  40. formatModel(data) {
  41. const result = this.createModel()
  42. const { baseInfo, detailInfo, abstract } = data
  43. const fromSunList = getQueryParam('fromlist') === 'sun'
  44. result.id = baseInfo.id ? decodeURIComponent(baseInfo.id) : ''
  45. result.title = baseInfo.title
  46. result.projectName = baseInfo?.projectName
  47. result.projectCode = baseInfo?.projectCode
  48. result.isSelfSite = baseInfo?.site === '剑鱼信息发布平台'
  49. result.time = baseInfo?.publishTime
  50. ? dateFormatter(baseInfo.publishTime * 1000, 'yyyy-MM-dd')
  51. : ''
  52. result.highlightKeys = this.splitUrlKeys()
  53. result.content = detailInfo.detail || ''
  54. // 附件列表
  55. result.attachments = detailInfo.attachments || []
  56. // 原文链接是否显示
  57. result.originalShow = detailInfo.originalShow || false
  58. result.originalUrl = detailInfo.originalHref || ''
  59. // 是否显示供应商报名
  60. result.recommendedService = baseInfo?.recommendedService === 1
  61. // 拟建,采购意向
  62. result.isNiJian = this.isNiJianCheck(baseInfo?.subType)
  63. result.isCaigouyixiang = this.isCaigouyixiangCheck(baseInfo?.subType)
  64. result.isCanRead = data?.canRead || false
  65. result.IsCustomTopNet = data?.topnet || false
  66. result.publicType = baseInfo.publicType
  67. // 是否有阳光直采权限
  68. result.hasPowerToReadSunPublishContent = data?.purchase // 阳光直采-采购信息
  69. // 是否阳光直采相关的标讯
  70. result.IsSunPublishContent = baseInfo.infoAttribute === 'zc_cgxx' // 阳光直采-采购信息
  71. // 是否运营商专版详情页
  72. result.yyszbContent = location.pathname.includes('/yyszb')
  73. result.bId = baseInfo.bId || ''
  74. // 阳光直采过来的小程序分享标题处理
  75. if (fromSunList) {
  76. result.listShareTitle = this.getSunListTitle([baseInfo.id, result.id])
  77. }
  78. if (result.IsSunPublishContent) {
  79. // 处理拆条信息
  80. const changedTitle = this.changeChaiTitle(abstract, result.listShareTitle)
  81. if (changedTitle) {
  82. result.title = changedTitle
  83. result.changedTitle = changedTitle
  84. }
  85. }
  86. // TDK
  87. result.tdk.title = result.title
  88. result.tdk.description = baseInfo?.description
  89. result.tdk.keywords = baseInfo?.keywords
  90. // Tags
  91. result.tags = this.tranTags(data, result)
  92. result._ob = baseInfo
  93. result._od = detailInfo
  94. return result
  95. }
  96. isNiJianCheck(type) {
  97. return type === '拟建'
  98. }
  99. isCaigouyixiangCheck(type) {
  100. return type === '采购意向'
  101. }
  102. tranTags(data, result) {
  103. const { IsSunPublishContent, yyszbContent } = result
  104. const { baseInfo, abstract } = data
  105. const defaultURL = 'javascript:void(0);'
  106. const area = [baseInfo?.area, baseInfo?.city, baseInfo?.district]
  107. .filter(v => v)
  108. .join('-')
  109. const typeItem = {
  110. label: baseInfo?.topType,
  111. link: defaultURL
  112. }
  113. if (baseInfo?.subType) {
  114. typeItem.label = baseInfo.subType
  115. typeItem.link = baseInfo?.subTypeUrl || defaultURL
  116. }
  117. const amountItem = {
  118. label: formatMoney(baseInfo?.bidAmount || baseInfo?.budget || ''),
  119. link: defaultURL
  120. }
  121. let originTags = [
  122. // 地区
  123. {
  124. label: area,
  125. link: baseInfo?.areaUrl || defaultURL
  126. },
  127. // type
  128. IsSunPublishContent ? {} : typeItem,
  129. // buyer_class
  130. {
  131. label: baseInfo?.buyerClass,
  132. link: defaultURL
  133. },
  134. // amount
  135. amountItem
  136. ]
  137. if (yyszbContent) {
  138. originTags = [
  139. {
  140. label: area,
  141. link: baseInfo?.areaUrl || defaultURL
  142. },
  143. {
  144. label: baseInfo?.subType || baseInfo?.topType,
  145. link: defaultURL
  146. },
  147. {
  148. label: baseInfo?.industry || '',
  149. link: defaultURL
  150. }
  151. ]
  152. }
  153. if (IsSunPublishContent) {
  154. // 取时间
  155. const signEndTime = abstract?.default?.signEndTime
  156. if (signEndTime) {
  157. const now = Date.now()
  158. const signupEnd = signEndTime * 1000 < now
  159. if (signupEnd) {
  160. const jiezhi = {
  161. label: '报名已截止',
  162. link: defaultURL
  163. }
  164. originTags.push(jiezhi)
  165. }
  166. else {
  167. const jiezhi = {
  168. label: '报名未截止',
  169. className: 'tag-orange border orange-deep',
  170. link: defaultURL
  171. }
  172. originTags.push(jiezhi)
  173. }
  174. }
  175. }
  176. const tags = originTags.filter(v => v.label)
  177. return tags.map((t) => {
  178. return {
  179. ...t,
  180. // 是否有正确格式的链接
  181. hasLink: t.link !== defaultURL
  182. }
  183. })
  184. }
  185. // 获取url高亮字符, 并截取
  186. splitUrlKeys() {
  187. const kds = getQueryParam('kds')
  188. const keywords = getQueryParam('keywords')
  189. const s_words = kds || keywords
  190. let keysList = []
  191. // 移动端订阅预览等跳转过来传的词
  192. const subKeyReg = /^subkey_/
  193. if (subKeyReg.test(s_words)) {
  194. keysList = s_words.replace(subKeyReg, '').split('_')
  195. let keyListArr = []
  196. keysList.forEach((v) => {
  197. const vArr = v.split('+')
  198. keyListArr = keyListArr.concat(vArr)
  199. })
  200. }
  201. else {
  202. const reg = /[_+\s]/ // 匹配 _+空格
  203. if (reg.test(s_words)) {
  204. keysList = s_words.split(reg).filter(w => !!w)
  205. }
  206. else {
  207. keysList.push(s_words)
  208. }
  209. }
  210. return keysList
  211. }
  212. // 处理拆条信息:详情页中需要判断purchasingList长度>1,就使用列表页标题+‘等’。
  213. changeChaiTitle(abstract, title) {
  214. const purchasingList = abstract?.default?.purchasingList
  215. if (Array.isArray(purchasingList) && purchasingList.length > 0) {
  216. if (title) {
  217. return title
  218. }
  219. }
  220. return ''
  221. }
  222. getSunListTitle(idArr = []) {
  223. const key = 'sun_list_info_clicked'
  224. const saved = sessionStorage.getItem(key)
  225. if (saved) {
  226. const list = JSON.parse(saved)
  227. if (Array.isArray(list)) {
  228. const r = list.find(
  229. item => idArr.includes(item.id)
  230. )
  231. if (r && r.title) {
  232. return r.title
  233. }
  234. }
  235. }
  236. return ''
  237. }
  238. }
  239. function useCommonContentModel() {
  240. return new CommonContentModel()
  241. }
  242. export default useCommonContentModel