index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <script setup lang="ts">
  2. import { clearCart, getOrderPayMent, getWxCommonPayment, handleCommonPayMent, payError, paySuccess } from '../utils/confirm-order'
  3. import router from '@/router'
  4. definePage({
  5. name: 'xsb-confirmOrder',
  6. islogin: true,
  7. style: {
  8. navigationBarTitleText: '提交订单',
  9. },
  10. })
  11. const { selectedAddress, userInfo } = storeToRefs(useUserStore())
  12. const { SelectShopInfo } = storeToRefs(useSysXsbStore())
  13. const orderInfo = ref<Api.shoppingCartOrderConfirm>()
  14. const { totalProduct } = storeToRefs(useSmqjhCartStore())
  15. const isPay = ref(false)
  16. const remarks = ref('')
  17. const offsetPoints = computed(() => {
  18. const money = (Number(unref(orderInfo)?.transfee) * 100) + (Number(unref(orderInfo)?.price) * 100)
  19. if (Number(unref(orderInfo)?.offsetPoints) > money) {
  20. return money
  21. }
  22. return Number(unref(orderInfo)?.offsetPoints)
  23. })
  24. const deliveryType = ref(1)
  25. onLoad((options: any) => {
  26. console.log(options.data)
  27. orderInfo.value = JSON.parse(options.data)
  28. })
  29. onShow(() => {
  30. useUserStore().getuserAddresslist()
  31. if (selectedAddress.value) {
  32. getDevryList()
  33. }
  34. })
  35. async function getDevryList() {
  36. const res = await Apis.xsb.delivery({
  37. data: {
  38. memberId: userInfo.value.id,
  39. shopId: SelectShopInfo.value.shopId,
  40. addressId: selectedAddress.value?.id,
  41. },
  42. })
  43. deliveryType.value = res.data.deliveryType
  44. console.log(res)
  45. }
  46. async function handlePay() {
  47. if (!selectedAddress.value) {
  48. useGlobalToast().show({ msg: '请选择收货地址' })
  49. return
  50. }
  51. if (!orderInfo.value) {
  52. useGlobalToast().show({ msg: '网络异常!请联系客服' })
  53. return
  54. }
  55. isPay.value = true
  56. try {
  57. const orderItemList = orderInfo.value?.skuList.map((it) => {
  58. return {
  59. prodCount: it.num,
  60. skuId: it.skuId,
  61. }
  62. })
  63. const orderNumber = await getOrderPayMent(orderInfo.value.transfee, 'XSB', deliveryType.value, Number(orderInfo.value?.skuList[0].shopId || SelectShopInfo.value.shopId), orderItemList, unref(remarks))
  64. const res = await handleCommonPayMent(orderNumber)
  65. await clearCart(orderInfo.value.skuList)
  66. totalProduct.value = null
  67. if (res.payType !== 1) {
  68. await getWxCommonPayment(res)
  69. await paySuccess()
  70. isPay.value = false
  71. }
  72. else {
  73. await paySuccess()
  74. isPay.value = false
  75. }
  76. }
  77. catch {
  78. await payError()
  79. isPay.value = false
  80. }
  81. }
  82. </script>
  83. <template>
  84. <view class="page px20rpx py20rpx">
  85. <view class="mb20rpx rounded-16rpx bg-white p24rpx" @click="router.push({ name: 'common-addressList', params: { type: 'select' } })">
  86. <view class="flex items-center justify-between">
  87. <view v-if="!selectedAddress" class="flex items-center">
  88. <wd-icon name="location" size="18px" />
  89. <view class="ml10rpx text-28rpx">
  90. 请添加收货地址
  91. </view>
  92. </view>
  93. <view v-else>
  94. <view class="flex items-center">
  95. <view v-if="selectedAddress.defaulted" class="mr20rpx">
  96. <wd-tag type="primary">
  97. 默认
  98. </wd-tag>
  99. </view>
  100. <view class="flex items-center text-28rpx font-semibold">
  101. <view>{{ selectedAddress?.consigneeName }} </view>
  102. <view class="ml20rpx">
  103. {{ selectedAddress?.consigneeMobile }}
  104. </view>
  105. </view>
  106. </view>
  107. <view class="mt20rpx flex items-center text-24rpx text-#AAAAAA">
  108. {{ selectedAddress?.province }} {{ selectedAddress?.city }} {{ selectedAddress?.detailAddress }}
  109. </view>
  110. </view>
  111. <wd-icon name="arrow-right" size="18px" color="#aaa" />
  112. </view>
  113. </view>
  114. <view class="rounded-16rpx bg-white p24rpx">
  115. <view class="flex items-center text-28rpx font-semibold">
  116. {{ orderInfo?.shopName }}
  117. </view>
  118. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  119. <CollapsePanel :line-height="150">
  120. <view v-for="item in orderInfo?.skuList" :key="item.id" class="mb20rpx w-full flex items-center">
  121. <view class="mr20rpx w120rpx flex-shrink-0">
  122. <image
  123. :src="item.pic"
  124. class="h120rpx w120rpx"
  125. />
  126. </view>
  127. <view class="flex-1">
  128. <view class="w-full flex items-center justify-between font-semibold">
  129. <view class="text-28rpx">
  130. {{ item.skuName }}
  131. </view>
  132. <view class="text-32rpx text-#FF4D3A">
  133. ¥{{ item.price }}
  134. </view>
  135. </view>
  136. <view class="text-24rpx text-#AAAAAA">
  137. 规格:{{ item.spec }}
  138. </view>
  139. <view class="text-24rpx text-#AAAAAA">
  140. ×{{ item.num || 1 }}
  141. </view>
  142. </view>
  143. </view>
  144. </CollapsePanel>
  145. </view>
  146. <view class="mt20rpx rounded-16rpx bg-white p24rpx">
  147. <view class="mb28rpx flex items-center justify-between text-28rpx">
  148. <view>商品金额</view>
  149. <view class="text-#FF4D3A font-semibold">
  150. ¥{{ orderInfo?.price }}
  151. </view>
  152. </view>
  153. <view class="mb28rpx flex items-center justify-between text-28rpx">
  154. <view v-if="deliveryType == 3">
  155. 配送费(即时配送)
  156. </view>
  157. <view v-if="deliveryType == 1">
  158. 快递
  159. </view>
  160. <view class="text-#FF4D3A font-semibold">
  161. ¥{{ orderInfo?.transfee }}
  162. </view>
  163. </view>
  164. <view class="flex items-center justify-between text-28rpx">
  165. <view>积分({{ orderInfo?.offsetPoints }})</view>
  166. <view class="text-#FF4D3A font-semibold">
  167. - ¥{{ offsetPoints / 100 }}
  168. </view>
  169. </view>
  170. <view class="my24rpx h2rpx w-full bg-#F0F0F0" />
  171. <view class="flex items-center justify-between text-28rpx">
  172. <view class="font-semibold">
  173. 总计:
  174. </view>
  175. <view class="text-#FF4D3A font-semibold">
  176. ¥ {{ orderInfo?.totalPrice }}
  177. </view>
  178. </view>
  179. </view>
  180. <view class="mt20rpx flex items-center rounded-16rpx bg-white p24rpx">
  181. <view class="w80rpx">
  182. 备注
  183. </view>
  184. <view class="flex-1">
  185. <wd-input v-model="remarks" placeholder="选填,请先和商家协商一致,付款后商家可见" no-border clearable />
  186. </view>
  187. </view>
  188. <view class="h250rpx" />
  189. <view class="ios footer fixed bottom-0 left-0 box-border w-full rounded-t-16rpx bg-white px24rpx">
  190. <view class="box-border w-full flex items-center justify-between py20rpx">
  191. <view class="flex items-center text-#FF4D3A">
  192. <view class="font-semibold10 flex items-baseline text-36rpx">
  193. <text class="text-24rpx">
  194. </text> {{ orderInfo?.totalPrice }}
  195. </view>
  196. <view class="ml20rpx text-22rpx">
  197. 共减¥{{ offsetPoints / 100 }}
  198. </view>
  199. </view>
  200. <view class="w180rpx">
  201. <wd-button size="large" :loading="isPay" :disabled="isPay" @click="handlePay">
  202. 立即支付
  203. </wd-button>
  204. </view>
  205. </view>
  206. </view>
  207. </view>
  208. </template>
  209. <style scoped lang="scss">
  210. .footer{
  211. box-shadow: 0rpx -6rpx 12rpx 2rpx rgba(0,0,0,0.05);
  212. }
  213. .page{
  214. :deep(){
  215. .wd-button{
  216. width: 180rpx !important;
  217. }
  218. }
  219. }
  220. </style>