|
@@ -1,8 +1,20 @@
|
|
<template>
|
|
<template>
|
|
<div>
|
|
<div>
|
|
<!-- 头部地址选择【配送地址】【自提地址】 -->
|
|
<!-- 头部地址选择【配送地址】【自提地址】 -->
|
|
- <AddressSelection v-model="addressState" class="addressBox" />
|
|
|
|
|
|
+ <AddressSelection v-if="!goodsType" v-model="addressState" class="addressBox" />
|
|
|
|
|
|
|
|
+ <!-- 表头 -->
|
|
|
|
+ <div class="d-flex px-6 mb-2">
|
|
|
|
+ <div class="img">小图</div>
|
|
|
|
+ <div class="headerTitleList">
|
|
|
|
+ <div class="title">商品名称</div>
|
|
|
|
+ <div class="skuString">商品属性</div>
|
|
|
|
+ <div class="price">单价</div>
|
|
|
|
+ <div class="buyNum">数量</div>
|
|
|
|
+ <div class="subtotal">小计</div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
<!-- 购买的商品信息 -->
|
|
<!-- 购买的商品信息 -->
|
|
<v-card class="goodsListBox mb-3 pa-3">
|
|
<v-card class="goodsListBox mb-3 pa-3">
|
|
<s-goods-item
|
|
<s-goods-item
|
|
@@ -40,6 +52,10 @@
|
|
<!-- 门店自提时,需要填写姓名和手机号 -->
|
|
<!-- 门店自提时,需要填写姓名和手机号 -->
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
+ <div v-if="goodsType" class="mt-5" style="width: 800px;">
|
|
|
|
+ <TextUI v-model="email" :item="emailObj"></TextUI>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
<div class="mt-5">
|
|
<div class="mt-5">
|
|
<v-text-field
|
|
<v-text-field
|
|
v-model="state.orderPayload.remark"
|
|
v-model="state.orderPayload.remark"
|
|
@@ -74,6 +90,9 @@
|
|
import { spaces } from '@/utils/index.js'
|
|
import { spaces } from '@/utils/index.js'
|
|
import { getTradeConfig, createOrder, settlementOrder } from '@/api/mall/trade'
|
|
import { getTradeConfig, createOrder, settlementOrder } from '@/api/mall/trade'
|
|
import Snackbar from '@/plugins/snackbar'
|
|
import Snackbar from '@/plugins/snackbar'
|
|
|
|
+ import { isNumber } from '@/utils/is'
|
|
|
|
+ import { checkCompanyEmail } from '@/utils/validate'
|
|
|
|
+ import TextUI from '@/components/FormUI/TextInput'
|
|
const emit = defineEmits(['orderCreated'])
|
|
const emit = defineEmits(['orderCreated'])
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
data: {
|
|
data: {
|
|
@@ -82,6 +101,9 @@
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
|
|
|
|
+ const goodsType = ref(0)
|
|
|
|
+ const email = ref('') // 如果商品spu的type不是0(不是普通商品)则要填这个邮箱
|
|
|
|
+
|
|
const state = reactive({
|
|
const state = reactive({
|
|
orderPayload: {},
|
|
orderPayload: {},
|
|
orderInfo: {
|
|
orderInfo: {
|
|
@@ -94,7 +116,23 @@
|
|
// ========== 积分 ==========
|
|
// ========== 积分 ==========
|
|
pointStatus: false, //是否使用积分
|
|
pointStatus: false, //是否使用积分
|
|
});
|
|
});
|
|
-
|
|
|
|
|
|
+ const emailObj = {
|
|
|
|
+ type: 'text',
|
|
|
|
+ key: 'email',
|
|
|
|
+ value: '',
|
|
|
|
+ label: '接收邮箱 *(虚拟商品会发送到填写的邮箱,填写错误的邮箱会导致接收失败,请注意检查!)',
|
|
|
|
+ rules: [
|
|
|
|
+ value => {
|
|
|
|
+ if (value) return true
|
|
|
|
+ return '请输入邮箱'
|
|
|
|
+ },
|
|
|
|
+ value => {
|
|
|
|
+ if (checkCompanyEmail(value)) return true
|
|
|
|
+ return '请输入正确的邮箱'
|
|
|
|
+ }
|
|
|
|
+ ],
|
|
|
|
+ }
|
|
|
|
+
|
|
// 检测支付环境
|
|
// 检测支付环境
|
|
// const payState = reactive({
|
|
// const payState = reactive({
|
|
// orderType: 'goods', // 订单类型; goods - 商品订单, recharge - 充值订单
|
|
// orderType: 'goods', // 订单类型; goods - 商品订单, recharge - 充值订单
|
|
@@ -115,10 +153,17 @@
|
|
|
|
|
|
watch(
|
|
watch(
|
|
() => props.data,
|
|
() => props.data,
|
|
- (newVal) => {
|
|
|
|
|
|
+ async (newVal) => {
|
|
if (newVal) {
|
|
if (newVal) {
|
|
state.orderPayload = JSON.parse(newVal);
|
|
state.orderPayload = JSON.parse(newVal);
|
|
- tradeConfig()
|
|
|
|
|
|
+ // 是否是普通快递商品
|
|
|
|
+ goodsType.value = state.orderPayload && isNumber(state.orderPayload?.goodsType-0) ? state.orderPayload.goodsType-0 : 0
|
|
|
|
+
|
|
|
|
+ if (!goodsType.value) tradeConfig()
|
|
|
|
+ else {
|
|
|
|
+ // addressState.value.deliveryType = null
|
|
|
|
+ getOrderInfo()
|
|
|
|
+ }
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{ immediate: true },
|
|
{ immediate: true },
|
|
@@ -155,12 +200,20 @@
|
|
Snackbar.warning('请选择收货地址')
|
|
Snackbar.warning('请选择收货地址')
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ if (goodsType.value && !email.value) {
|
|
|
|
+ Snackbar.warning('请填写邮箱')
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (goodsType.value && !checkCompanyEmail(email.value)) {
|
|
|
|
+ Snackbar.warning('请输入正确的邮箱')
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
submitOrder()
|
|
submitOrder()
|
|
}
|
|
}
|
|
|
|
|
|
// 创建订单&跳转
|
|
// 创建订单&跳转
|
|
async function submitOrder() {
|
|
async function submitOrder() {
|
|
- const data = await createOrder({
|
|
|
|
|
|
+ let query = {
|
|
items: state.orderPayload.items,
|
|
items: state.orderPayload.items,
|
|
couponId: state.orderPayload.couponId,
|
|
couponId: state.orderPayload.couponId,
|
|
remark: state.orderPayload.remark,
|
|
remark: state.orderPayload.remark,
|
|
@@ -174,7 +227,10 @@
|
|
combinationHeadId: state.orderPayload.combinationHeadId,
|
|
combinationHeadId: state.orderPayload.combinationHeadId,
|
|
seckillActivityId: state.orderPayload.seckillActivityId,
|
|
seckillActivityId: state.orderPayload.seckillActivityId,
|
|
pointActivityId: state.orderPayload.pointActivityId,
|
|
pointActivityId: state.orderPayload.pointActivityId,
|
|
- });
|
|
|
|
|
|
+ }
|
|
|
|
+ if (email.value) query = Object.assign(query, { receiverExtend: { email: email.value} })
|
|
|
|
+
|
|
|
|
+ const data = await createOrder(query)
|
|
if (!data.payOrderId && data.payOrderId > 0) return
|
|
if (!data.payOrderId && data.payOrderId > 0) return
|
|
emit('orderCreated', data.payOrderId, data.id) // 更新购物车列表,如果来自购物车
|
|
emit('orderCreated', data.payOrderId, data.id) // 更新购物车列表,如果来自购物车
|
|
// payImmediately(data.payOrderId)
|
|
// payImmediately(data.payOrderId)
|
|
@@ -240,4 +296,27 @@
|
|
color: #7a7a7a;
|
|
color: #7a7a7a;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ .img {
|
|
|
|
+ width: 92px
|
|
|
|
+ }
|
|
|
|
+ .headerTitleList {
|
|
|
|
+ width: 100%;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ .title {
|
|
|
|
+ width: 30%;
|
|
|
|
+ }
|
|
|
|
+ .skuString {
|
|
|
|
+ width: 25%;
|
|
|
|
+ }
|
|
|
|
+ .price {
|
|
|
|
+ width: 15%;
|
|
|
|
+ }
|
|
|
|
+ .buyNum {
|
|
|
|
+ width: 10%;
|
|
|
|
+ }
|
|
|
|
+ .subtotal {
|
|
|
|
+ width: 15%;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
</style>
|
|
</style>
|