index.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <!-- 商品详情 -->
  2. <template>
  3. <teleport :to="teleportTo">
  4. <app-view class="app-details" v-bind="$attrs">
  5. <template #header>
  6. <div v-if="details">
  7. <el-button @click="emit('closed')">返回</el-button>
  8. <template v-if="showButton && details.wrtradeorderid">
  9. <el-button type="primary" @click="openComponent('favorite')"
  10. v-if="!hasFavorite(details.goodsno)">收藏</el-button>
  11. <el-button type="primary" @click="openComponent('buy')">立即购买</el-button>
  12. <el-button type="primary" @click="openComponent('bargain')">询价申请</el-button>
  13. </template>
  14. </div>
  15. </template>
  16. <template v-if="details">
  17. <div class="app-details__intro" style="line-height:normal;margin-bottom:48px">
  18. <div class="gallery">
  19. </div>
  20. <div class="info">
  21. <h1>【{{ details.zscategorydisplay }}】 商品编号 {{ details.goodsno }}</h1>
  22. <table>
  23. <tbody>
  24. <tr>
  25. <td>商品备注</td>
  26. <td>{{ details.remark }}</td>
  27. </tr>
  28. <tr>
  29. <td>克拉重量</td>
  30. <td>{{ details.weight }}克拉</td>
  31. </tr>
  32. <tr>
  33. <td>价格</td>
  34. <td>{{ details.zscurrencytypedisplayunit + formatDecimal(details.price) }}</td>
  35. </tr>
  36. <tr>
  37. <td>克拉单价</td>
  38. <td>{{ details.zscurrencytypedisplayunit + formatDecimal(details.priceper) }}</td>
  39. </tr>
  40. <tr>
  41. <td>市场价</td>
  42. <td>{{ details.zscurrencytypedisplayunit + formatDecimal(details.marketprice) }}
  43. </td>
  44. </tr>
  45. <tr v-if="details.zscurrencytype !== CurrencyType.CNY">
  46. <td>{{ exchangeRate(details.zscurrencytype, details.price) }}</td>
  47. <td>汇率:{{ getExrate(details.zscurrencytype) }}</td>
  48. </tr>
  49. <tr>
  50. <td>卖家名称</td>
  51. <td>{{ details.sellusername }}</td>
  52. </tr>
  53. <tr>
  54. <td>联系电话</td>
  55. <td>{{ details.mobile }}</td>
  56. </tr>
  57. <tr>
  58. <td>仓库地址</td>
  59. <td>{{ [details.provincename, details.cityname, details.districtname,
  60. details.address].join(' ')
  61. }}</td>
  62. </tr>
  63. </tbody>
  64. </table>
  65. </div>
  66. </div>
  67. <div class="rule" style="margin-bottom:48px" v-if="details.performancetemplateid !== 0">
  68. <h1>履约规则</h1>
  69. <app-performance-rule :item="getPerformanceTemplateById(details.performancetemplateid)" />
  70. </div>
  71. <div class="property" style="line-height:normal">
  72. <h1>钻石属性</h1>
  73. <table>
  74. <tbody>
  75. <tr>
  76. <td>形状</td>
  77. <td>{{ details.zsshapetypedisplay }}</td>
  78. </tr>
  79. <tr>
  80. <td>颜色</td>
  81. <td>{{ details.zscolortype1display }}</td>
  82. </tr>
  83. <tr>
  84. <td>净度</td>
  85. <td>{{ details.zsclaritytype1display }}</td>
  86. </tr>
  87. <tr>
  88. <td>切工</td>
  89. <td>{{ details.zscuttype1display }}</td>
  90. </tr>
  91. <tr>
  92. <td>对称度</td>
  93. <td>{{ details.zssymmetrytype1display }}</td>
  94. </tr>
  95. <tr>
  96. <td>抛光度</td>
  97. <td>{{ details.zspolishtype1display }}</td>
  98. </tr>
  99. <tr>
  100. <td>荧光</td>
  101. <td>{{ details.zsfluorescencetype1display }}</td>
  102. </tr>
  103. <tr>
  104. <td>尺寸</td>
  105. <td>{{ details.sizedisplay }}</td>
  106. </tr>
  107. <tr>
  108. <td>证书类型</td>
  109. <td>{{ details.zscerttypedisplay }}</td>
  110. </tr>
  111. <tr>
  112. <td>证书编号</td>
  113. <td>{{ details.cerno }}</td>
  114. </tr>
  115. </tbody>
  116. </table>
  117. </div>
  118. </template>
  119. </app-view>
  120. <component :is="componentMap.get(componentId)" v-bind="{ selectedRow: details }" @closed="closeComponent"
  121. v-if="componentId" />
  122. </teleport>
  123. </template>
  124. <script lang="ts" setup>
  125. import { computed, PropType, defineAsyncComponent } from 'vue'
  126. import { formatDecimal } from '@/filters'
  127. import { CurrencyType } from '@/constants/diamond'
  128. import { useLoginStore, useFavoriteStore, useExrateStore, usePerformanceStore } from '@/stores'
  129. import { useComponent } from '@/hooks/component'
  130. import { useDiamondDetails } from '@/business/goods'
  131. import AppPerformanceRule from '@pc/components/modules/performance-rule/index.vue'
  132. const componentMap = new Map<string, unknown>([
  133. ['favorite', defineAsyncComponent(() => import('../favorite/index.vue'))], // 收藏
  134. ['buy', defineAsyncComponent(() => import('../buy/index.vue'))], // 立即购买
  135. ['bargain', defineAsyncComponent(() => import('../bargain/index.vue'))] // 询价申请
  136. ])
  137. const props = defineProps({
  138. teleportTo: {
  139. type: String,
  140. default: '#appPageTeleport'
  141. },
  142. selectedRow: {
  143. type: Object as PropType<{ goodsno: string }>,
  144. required: true
  145. },
  146. })
  147. const emit = defineEmits(['closed'])
  148. const { getUserId } = useLoginStore()
  149. const { getExrate, exchangeRate } = useExrateStore()
  150. const { hasFavorite } = useFavoriteStore()
  151. const { getPerformanceTemplateById } = usePerformanceStore()
  152. const { details, getDiamondDetails } = useDiamondDetails(props.selectedRow.goodsno)
  153. const { componentId, openComponent, closeComponent } = useComponent((componentName) => {
  154. if (componentName === 'buy') {
  155. // 摘牌成功后关闭详情页同时刷新列表页
  156. emit('closed', true)
  157. } else {
  158. getDiamondDetails()
  159. }
  160. })
  161. // 不能购买自己上架的商品
  162. const showButton = computed(() => {
  163. if (details.value) {
  164. return details.value.userid !== getUserId()
  165. }
  166. return false
  167. })
  168. getDiamondDetails()
  169. </script>