巴青农资商城

goodsDetail.js 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { resolveFileUrl } from '@/utils/image'
  2. import { formatPrice } from '@/utils/format'
  3. import { PAGE_GOODS_DETAIL } from '@/utils/pageRoute'
  4. import { joinCartSpecParts } from '@/utils/cartSpec'
  5. const GOODS_PLACEHOLDER = '/static/logo.png'
  6. const SHOP_AVATAR_PLACEHOLDER = '/static/logo.png'
  7. /** 跳转商品详情 */
  8. export function goGoodsDetail(goodsId) {
  9. if (!goodsId) return
  10. uni.navigateTo({
  11. url: `${PAGE_GOODS_DETAIL}?goodsId=${goodsId}`
  12. })
  13. }
  14. export function mapDetailPics(pics) {
  15. if (!Array.isArray(pics) || !pics.length) {
  16. return [GOODS_PLACEHOLDER]
  17. }
  18. return pics.map((p) => resolveFileUrl(p) || GOODS_PLACEHOLDER).filter(Boolean)
  19. }
  20. /** 详情接口 data → 页面模型 */
  21. export function mapGoodsDetail(data) {
  22. if (!data) return null
  23. const logistics = data.logistics || {}
  24. const shop = data.shop || {}
  25. const purchase = data.purchase || {}
  26. return {
  27. goodsId: data.goodsId,
  28. goodsSn: data.goodsSn,
  29. goodsName: data.goodsName,
  30. goodsBrief: data.goodsBrief,
  31. pics: mapDetailPics(data.pics),
  32. salePrice: data.salePrice,
  33. priceText: formatPrice(data.salePrice),
  34. stock: Number(data.stock) || 0,
  35. salesCount: data.salesCount,
  36. goodsStatus: data.goodsStatus,
  37. goodsStatusLabel: data.goodsStatusLabel,
  38. categoryPath: data.categoryPath,
  39. detailContent: data.detailContent || '',
  40. attributes: data.attributes || [],
  41. specDisplay: data.specDisplay || [],
  42. services: (data.services || []).map(mapService),
  43. logistics: {
  44. shipPromise: logistics.shipPromise,
  45. freightDesc: logistics.freightDesc,
  46. shipCity: logistics.shipCity
  47. },
  48. shop: {
  49. shopId: shop.shopId,
  50. shopName: shop.shopName,
  51. shopAvatar: resolveFileUrl(shop.shopAvatar) || SHOP_AVATAR_PLACEHOLDER,
  52. shopStatus: shop.shopStatus,
  53. shopPhone: shop.shopPhone,
  54. rating: shop.rating,
  55. fansCount: shop.fansCount
  56. },
  57. purchase: {
  58. allowed: !!purchase.allowed,
  59. reason: purchase.reason || ''
  60. },
  61. afterSalePhone: data.afterSalePhone || shop.shopPhone || '',
  62. isOnSale: String(data.goodsStatus) === '2',
  63. isOffShelf: String(data.goodsStatus) === '4'
  64. }
  65. }
  66. /**
  67. * 详情 specDisplay({ itemName, values[] })→ 加购 specText
  68. * 多条规格用 CART_SPEC_SEPARATOR(§)拼接,购物车再拆开展示
  69. */
  70. export function formatSpecDisplayText(specDisplay) {
  71. if (!Array.isArray(specDisplay) || !specDisplay.length) {
  72. return '默认'
  73. }
  74. const parts = specDisplay
  75. .map((spec) => {
  76. if (!spec || typeof spec !== 'object') {
  77. return spec != null && spec !== '' ? String(spec) : ''
  78. }
  79. const name = spec.itemName || spec.name || ''
  80. const vals = spec.values
  81. const valText = Array.isArray(vals)
  82. ? vals.filter((v) => v != null && v !== '').join('、')
  83. : vals != null && vals !== ''
  84. ? String(vals)
  85. : ''
  86. if (name && valText) return `${name}:${valText}`
  87. return name || valText
  88. })
  89. .filter(Boolean)
  90. return joinCartSpecParts(parts)
  91. }
  92. function mapService(row) {
  93. return {
  94. serviceId: row.serviceId,
  95. serviceName: row.serviceName,
  96. serviceIntro: row.serviceIntro,
  97. serviceIcon: resolveFileUrl(row.serviceIcon)
  98. }
  99. }
  100. export function mapReviewRow(row) {
  101. if (!row) return null
  102. let pics = row.pics
  103. if (typeof pics === 'string' && pics) {
  104. pics = pics.split(',').map((s) => s.trim()).filter(Boolean)
  105. }
  106. if (!Array.isArray(pics)) {
  107. pics = []
  108. }
  109. return {
  110. reviewId: row.reviewId,
  111. memberNickName: row.memberNickName || '匿名用户',
  112. memberAvatar: resolveFileUrl(row.memberAvatar),
  113. content: row.content,
  114. pics: pics.map((p) => resolveFileUrl(p)).filter(Boolean),
  115. score: row.score,
  116. goodsMainPic: resolveFileUrl(row.goodsMainPic),
  117. goodsSpec: row.goodsSpec,
  118. replyContent: row.replyContent,
  119. replyTime: row.replyTime,
  120. createTime: row.createTime
  121. }
  122. }
  123. export function mapReviewList(list) {
  124. if (!Array.isArray(list)) return []
  125. return list.map(mapReviewRow).filter(Boolean)
  126. }
  127. /** 售后服务说明文案 */
  128. export function buildAfterSaleText(phone) {
  129. const contact = phone ? `【${phone}】` : '【平台客服】'
  130. return `售后无忧有保障,让您购物更放心!签收后若遇任何问题,随时联系我们${contact},专业售后团队为您妥善处理!`
  131. }