巴青农资商城

cartDisplay.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { resolveFileUrl } from '@/utils/image'
  2. import { formatPrice } from '@/utils/format'
  3. import {
  4. CART_INVALID_NONE,
  5. CART_INVALID_OUT_OF_STOCK,
  6. CART_INVALID_OFF_SHELF,
  7. CART_INVALID_SHOP_CLOSED,
  8. CART_INVALID_CATEGORY_HIDDEN,
  9. CART_INVALID_GOODS_DELETED,
  10. CART_INVALID_SHOP_DELETED
  11. } from '@/constants/cart'
  12. import { SHOP_STATUS_CLOSED } from '@/constants/shop'
  13. import { parseCartSpecText } from '@/utils/cartSpec'
  14. const GOODS_PLACEHOLDER = '/static/logo.png'
  15. const INVALID_LABEL_MAP = {
  16. [CART_INVALID_OUT_OF_STOCK]: '缺货',
  17. [CART_INVALID_OFF_SHELF]: '已下架',
  18. [CART_INVALID_SHOP_CLOSED]: '休息中',
  19. [CART_INVALID_CATEGORY_HIDDEN]: '不可购买',
  20. [CART_INVALID_GOODS_DELETED]: '已失效',
  21. [CART_INVALID_SHOP_DELETED]: '店铺失效'
  22. }
  23. export function getCartInvalidLabel(invalidType, invalidMsg) {
  24. if (!invalidType || invalidType === CART_INVALID_NONE) return ''
  25. return invalidMsg || INVALID_LABEL_MAP[invalidType] || '不可购买'
  26. }
  27. function mapCartItem(row) {
  28. if (!row) return null
  29. const invalidType = row.invalidType || CART_INVALID_NONE
  30. const purchasable = !!row.purchasable && invalidType === CART_INVALID_NONE
  31. return {
  32. cartItemId: row.cartItemId,
  33. goodsId: row.goodsId,
  34. goodsName: row.goodsName || '',
  35. displayPic: resolveFileUrl(row.mainPic) || GOODS_PLACEHOLDER,
  36. specText: (row.specText || '').trim() || '默认',
  37. specList: parseCartSpecText(row.specText),
  38. salePrice: row.salePrice,
  39. priceText: formatPrice(row.salePrice),
  40. quantity: Number(row.quantity) || 1,
  41. subtotal: row.subtotal,
  42. subtotalText: formatPrice(row.subtotal),
  43. checked: !!row.checked,
  44. purchasable,
  45. invalidType,
  46. invalidMsg: row.invalidMsg || '',
  47. invalidLabel: getCartInvalidLabel(invalidType, row.invalidMsg)
  48. }
  49. }
  50. function mapShopGroup(group) {
  51. if (!group) return null
  52. return {
  53. shopId: group.shopId,
  54. shopName: group.shopName || '',
  55. shopStatus: group.shopStatus,
  56. isClosed: String(group.shopStatus) === SHOP_STATUS_CLOSED,
  57. items: (group.items || []).map(mapCartItem).filter(Boolean)
  58. }
  59. }
  60. function mapCheckedSummary(summary) {
  61. const s = summary || {}
  62. const amount = s.checkedAmount
  63. return {
  64. checkedCount: Number(s.checkedCount) || 0,
  65. checkedQuantity: Number(s.checkedQuantity) || 0,
  66. checkedAmount: amount,
  67. checkedAmountText: formatPrice(amount)
  68. }
  69. }
  70. /** 列表接口 data → 页面模型 */
  71. export function mapCartList(data) {
  72. if (!data) {
  73. return { groups: [], checkedSummary: mapCheckedSummary(null) }
  74. }
  75. return {
  76. groups: (data.groups || []).map(mapShopGroup).filter(Boolean),
  77. checkedSummary: mapCheckedSummary(data.checkedSummary)
  78. }
  79. }
  80. /** 是否存在失效行 */
  81. export function hasInvalidCartItems(groups) {
  82. if (!Array.isArray(groups)) return false
  83. return groups.some((g) => (g.items || []).some((item) => !item.purchasable))
  84. }
  85. /** 当前勾选的可购行 shopId 集合 */
  86. export function getCheckedShopIds(groups) {
  87. const ids = new Set()
  88. if (!Array.isArray(groups)) return ids
  89. groups.forEach((g) => {
  90. ;(g.items || []).forEach((item) => {
  91. if (item.checked && item.purchasable) {
  92. ids.add(g.shopId)
  93. }
  94. })
  95. })
  96. return ids
  97. }
  98. /** 已勾选且可购的 cartItemId */
  99. export function getCheckedPurchasableIds(groups) {
  100. const ids = []
  101. if (!Array.isArray(groups)) return ids
  102. groups.forEach((g) => {
  103. ;(g.items || []).forEach((item) => {
  104. if (item.checked && item.purchasable) {
  105. ids.push(item.cartItemId)
  106. }
  107. })
  108. })
  109. return ids
  110. }
  111. /** 全部可购行 */
  112. export function getAllPurchasableItems(groups) {
  113. const list = []
  114. if (!Array.isArray(groups)) return list
  115. groups.forEach((g) => {
  116. ;(g.items || []).forEach((item) => {
  117. if (item.purchasable) {
  118. list.push({ ...item, shopId: g.shopId })
  119. }
  120. })
  121. })
  122. return list
  123. }