|
@@ -1,188 +0,0 @@
|
|
|
-<template>
|
|
|
- <v-card class="default-width pa-5 mb-5" style="min-height: 75vh; margin-top: 70px;">
|
|
|
- <div>
|
|
|
- <!-- 头部地址选择【配送地址】【自提地址】 -->
|
|
|
- <AddressSelection v-model="addressState" class="addressBox elevation-3" />
|
|
|
-
|
|
|
- <!-- 购买的商品信息 -->
|
|
|
- <v-card class="goodsListBox my-3 pa-3 elevation-5">
|
|
|
- <s-goods-item
|
|
|
- v-for="(item, index) in state.orderInfo.items"
|
|
|
- :key="item.skuId"
|
|
|
- :img="item.picUrl"
|
|
|
- :title="item.spuName"
|
|
|
- :skuText="item.properties.map((property) => property.valueName).join(' ')"
|
|
|
- :price="item.price"
|
|
|
- :num="item.count"
|
|
|
- :style="{'marginTop': index ? '8px' : '0px'}"
|
|
|
- />
|
|
|
- </v-card>
|
|
|
-
|
|
|
- <!-- 价格信息 -->
|
|
|
- <div>
|
|
|
- <div>
|
|
|
- <!-- <div class="order-item d-flex color-666">
|
|
|
- <div class="item-title mr-3 ">商品金额:</div>
|
|
|
- <div>¥{{ fen2yuan(state.orderInfo.price.totalPrice) }}</div>
|
|
|
- </div> -->
|
|
|
- <!-- 快递配置时,信息的展示 -->
|
|
|
- <!-- <div
|
|
|
- class="order-item d-flex"
|
|
|
- v-if="addressState.deliveryType === 1"
|
|
|
- >
|
|
|
- <div class="item-title mr-3">运{{ spaces() }}费:</div>
|
|
|
- <div>
|
|
|
- <span class="text-red" v-if="state.orderInfo.price.deliveryPrice > 0">
|
|
|
- +¥{{ fen2yuan(state.orderInfo.price.deliveryPrice) }}
|
|
|
- </span>
|
|
|
- <div class="item-value" v-else>免运费</div>
|
|
|
- </div>
|
|
|
- </div> -->
|
|
|
- <!-- 门店自提时,需要填写姓名和手机号 -->
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="mt-5">
|
|
|
- <v-text-field
|
|
|
- v-model="state.orderPayload.remark"
|
|
|
- label="订单备注"
|
|
|
- placeholder="建议留言前先与商家沟通"
|
|
|
- variant="outlined"
|
|
|
- density="compact"
|
|
|
- color="primary"
|
|
|
- ></v-text-field>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="total-box-footer d-flex flex-column align-end">
|
|
|
- <div class="d-flex">
|
|
|
- <div class="mr-3">
|
|
|
- <span class="total-num">共</span>
|
|
|
- <span class="mx-1" style="color: var(--v-primary-base);">{{ state.orderInfo.items.reduce((acc, item) => acc + item.count, 0) }}</span>
|
|
|
- <span class="total-num">件</span>
|
|
|
- </div>
|
|
|
- <div>合计支付:</div>
|
|
|
- <div class="total-num text-red"> ¥{{ fen2yuan(state.orderInfo.price.payPrice) }}元</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="text-center">
|
|
|
- <div>请在30分钟内完成支付,支付成功后可以随机抽取赠送的房券。</div>
|
|
|
- <v-btn class="elevation-5" color="primary" width="250">立即支付</v-btn>
|
|
|
- <div>支付时间还剩余30分27秒</div>
|
|
|
- </div>
|
|
|
-
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </v-card>
|
|
|
-</template>
|
|
|
-
|
|
|
-<script setup>
|
|
|
-defineOptions({ name: 'mall-order-settlement' })
|
|
|
-import { useRoute, useRouter } from 'vue-router'
|
|
|
-import { reactive, ref, onMounted, watch } from 'vue'
|
|
|
-import AddressSelection from '@/views/mall/components/details/order/addressSelection.vue'
|
|
|
-import sGoodsItem from '@/views/mall/components/s-goods-item'
|
|
|
-import { fen2yuan } from '@/hooks/web/useGoods'
|
|
|
-import { spaces } from '@/utils/index.js'
|
|
|
-import { getTradeConfig, createOrder, settlementOrder } from '@/api/mall/trade'
|
|
|
-import Snackbar from '@/plugins/snackbar'
|
|
|
-
|
|
|
-const route = useRoute()
|
|
|
-const router = useRouter()
|
|
|
-const { id } = route.params
|
|
|
-const { count } = route.query
|
|
|
-
|
|
|
-const state = reactive({
|
|
|
- orderPayload: {},
|
|
|
- orderInfo: {
|
|
|
- items: [], // 商品项列表
|
|
|
- price: {}, // 价格信息
|
|
|
- },
|
|
|
- showCoupon: false, // 是否展示优惠劵
|
|
|
- couponInfo: [], // 优惠劵列表
|
|
|
- showDiscount: false, // 是否展示营销活动
|
|
|
- // ========== 积分 ==========
|
|
|
- pointStatus: false, //是否使用积分
|
|
|
-});
|
|
|
-// 检测支付环境
|
|
|
-const payState = reactive({
|
|
|
- orderType: 'goods', // 订单类型; goods - 商品订单, recharge - 充值订单
|
|
|
- orderInfo: {}, // 支付单信息
|
|
|
- payStatus: 0, // 0=检测支付环境, -2=未查询到支付单信息, -1=支付已过期, 1=待支付,2=订单已支付
|
|
|
- payMethods: [], // 可选的支付方式
|
|
|
- payment: '', // 选中的支付方式
|
|
|
-});
|
|
|
-const addressState = ref({
|
|
|
- addressInfo: {}, // 选择的收货地址
|
|
|
- deliveryType: undefined, // 收货方式:1-快递配送,2-门店自提
|
|
|
- isPickUp: true, // 门店自提是否开启
|
|
|
- pickUpInfo: {}, // 选择的自提门店信息
|
|
|
- receiverName: '', // 收件人名称
|
|
|
- receiverMobile: '', // 收件人手机
|
|
|
-});
|
|
|
-async function tradeConfig () {
|
|
|
- // 获取交易配置
|
|
|
- const data = await getTradeConfig();
|
|
|
- addressState.value.isPickUp = data.deliveryPickUpEnabled;
|
|
|
- // 价格计算
|
|
|
- // 情况一:先自动选择“快递物流”
|
|
|
- addressState.value.deliveryType = 1;
|
|
|
- let orderCode = await getOrderInfo();
|
|
|
- if (orderCode === 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
- // 情况二:失败,再自动选择“门店自提”
|
|
|
- if (addressState.value.isPickUp) {
|
|
|
- addressState.value.deliveryType = 2;
|
|
|
- let orderCode = await getOrderInfo();
|
|
|
- if (orderCode === 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- // 情况三:都失败,则不选择
|
|
|
- addressState.value.deliveryType = undefined;
|
|
|
- await getOrderInfo()
|
|
|
-}
|
|
|
-
|
|
|
-// 检查库存 & 计算订单价格
|
|
|
-async function getOrderInfo() {
|
|
|
- // 计算价格
|
|
|
- const data = await settlementOrder({
|
|
|
- items: [{ skuId: id, count }],
|
|
|
- couponId: state.orderPayload.couponId,
|
|
|
- deliveryType: addressState.value.deliveryType,
|
|
|
- addressId: addressState.value.addressInfo.id, // 收件地址编号
|
|
|
- pickUpStoreId: addressState.value.pickUpInfo.id, //自提门店编号
|
|
|
- receiverName: addressState.value.receiverName, // 选择门店自提时,该字段为联系人名
|
|
|
- receiverMobile: addressState.value.receiverMobile, // 选择门店自提时,该字段为联系人手机
|
|
|
- pointStatus: state.pointStatus,
|
|
|
- combinationActivityId: state.orderPayload.combinationActivityId,
|
|
|
- combinationHeadId: state.orderPayload.combinationHeadId,
|
|
|
- seckillActivityId: state.orderPayload.seckillActivityId,
|
|
|
- pointActivityId: state.orderPayload.pointActivityId,
|
|
|
- });
|
|
|
- state.orderInfo = data;
|
|
|
- state.couponInfo = data.coupons || [];
|
|
|
- // 设置收货地址
|
|
|
- if (state.orderInfo.address) {
|
|
|
- addressState.value.addressInfo = state.orderInfo.address;
|
|
|
- }
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- // 使用 watch 监听地址和配送方式的变化
|
|
|
- watch(addressState, async (newAddress, oldAddress) => {
|
|
|
- // 如果收货地址或配送方式有变化,则重新计算价格
|
|
|
- if (
|
|
|
- newAddress.addressInfo.id !== oldAddress.addressInfo.id ||
|
|
|
- newAddress.deliveryType !== oldAddress.deliveryType
|
|
|
- ) {
|
|
|
- await getOrderInfo();
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
-onMounted(async () => {
|
|
|
- if (!id || !count) return router.go(-1)
|
|
|
- await tradeConfig()
|
|
|
-})
|
|
|
-
|
|
|
-</script>
|