|
@@ -0,0 +1,521 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div class="order-content">
|
|
|
|
|
+ <div class="order-goods">
|
|
|
|
|
+ <div class="title">商品信息</div>
|
|
|
|
|
+ <div class="goods-list__box">
|
|
|
|
|
+ <div v-for="(item, index) in mainData.goodsList" :key="index" class="list-item">
|
|
|
|
|
+ <div class="goods-image">
|
|
|
|
|
+ <img :src="item.imgUrl" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="goods-content">
|
|
|
|
|
+ <div class="goods-name">{{ item.goodsName }}</div>
|
|
|
|
|
+ <div class="goods-desc">{{ item.specValue }}</div>
|
|
|
|
|
+ <a-flex align="center" justify="space-between">
|
|
|
|
|
+ <div v-if="item.goodsSpecNewPrice && item.goodsSpecNewPrice > 0 && item.goodsSpecNewPrice != item.goodsPrice">
|
|
|
|
|
+ <div class="goods-price">¥{{ formatPriceText(item.goodsSpecNewPrice) }}</div>
|
|
|
|
|
+ <div class="goods-old__price">¥{{ formatPriceText(item.price) }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-else class="goods-price">¥{{ formatPriceText(item.price) }}</div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <a-input-number
|
|
|
|
|
+ :value="item.num"
|
|
|
|
|
+ style="width: 140px;"
|
|
|
|
|
+ :min="1"
|
|
|
|
|
+ :step="1"
|
|
|
|
|
+ disabled
|
|
|
|
|
+ >
|
|
|
|
|
+ <template #addonBefore>
|
|
|
|
|
+ <MinusOutlined />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template #addonAfter>
|
|
|
|
|
+ <PlusOutlined />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-input-number>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </a-flex>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <a-form
|
|
|
|
|
+ ref="formRef"
|
|
|
|
|
+ :model="mainData"
|
|
|
|
|
+ name="basic"
|
|
|
|
|
+ :label-col="{style: { width: '100px' }}"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ v-if="mainData.takeGoodsType == TakeTypeEnum.DISPATCH"
|
|
|
|
|
+ label="收货地址"
|
|
|
|
|
+ name="userAddressId"
|
|
|
|
|
+ :rules="[{ required: true, validator: checkAddress }]"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-select
|
|
|
|
|
+ v-model:value="mainData.userAddressId"
|
|
|
|
|
+ style="width: 100%"
|
|
|
|
|
+ placeholder="请选择收货地址"
|
|
|
|
|
+ :options="mainData.addressList"
|
|
|
|
|
+ />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ label="出货仓库"
|
|
|
|
|
+ name="storageName"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div>{{ storageName }}</div>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ label="提货方式"
|
|
|
|
|
+ name="takeGoodsType"
|
|
|
|
|
+ :rules="[{ required: true, validator: checkTakeGoodsType }]"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-radio-group v-model:value="mainData.takeGoodsType" name="takeGoodsType">
|
|
|
|
|
+ <a-radio :value="TakeTypeEnum.PICK">自提</a-radio>
|
|
|
|
|
+ <a-radio
|
|
|
|
|
+ v-if="mainData.payType === PayTypeEnum.STORE || mainData.payType === PayTypeEnum.CREDIT"
|
|
|
|
|
+ :value="TakeTypeEnum.DISPATCH"
|
|
|
|
|
+ >商家配送</a-radio>
|
|
|
|
|
+ </a-radio-group>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ v-if="mainData.takeGoodsType === TakeTypeEnum.PICK"
|
|
|
|
|
+ label="提货时间"
|
|
|
|
|
+ name="pickTime"
|
|
|
|
|
+ :rules="[{ required: true, validator: checkPickTime }]"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-cascader
|
|
|
|
|
+ style="width: 100%;"
|
|
|
|
|
+ v-model:value="mainData.pickTime"
|
|
|
|
|
+ :options="mainData.pickTimeOptions"
|
|
|
|
|
+ placeholder="请选择选择提货时间"
|
|
|
|
|
+ allowClear
|
|
|
|
|
+ />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ v-if="mainData.takeGoodsType === TakeTypeEnum.DISPATCH"
|
|
|
|
|
+ label="配送时间"
|
|
|
|
|
+ name="dispatchTime"
|
|
|
|
|
+ :rules="[{ required: true, validator: checkDispatchTime }]"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-cascader
|
|
|
|
|
+ style="width: 100%;"
|
|
|
|
|
+ v-model:value="mainData.dispatchTime"
|
|
|
|
|
+ :options="mainData.dispatchTimeOptions"
|
|
|
|
|
+ placeholder="请选择配送时间"
|
|
|
|
|
+ allowClear
|
|
|
|
|
+ />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ label="卖家留言"
|
|
|
|
|
+ name="remark"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-textarea
|
|
|
|
|
+ v-model:value="mainData.remark"
|
|
|
|
|
+ placeholder="选填,留言建议50字内"
|
|
|
|
|
+ allowClear
|
|
|
|
|
+ :auto-size="{ minRows: 2, maxRows: 5 }"
|
|
|
|
|
+ />
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ label="支付方式"
|
|
|
|
|
+ name="payType"
|
|
|
|
|
+ :rules="[{ required: true, validator: checkPayType }]"
|
|
|
|
|
+ >
|
|
|
|
|
+ <a-radio-group v-model:value="mainData.payType" name="payType">
|
|
|
|
|
+ <a-radio v-if="isCreditPay" :value="PayTypeEnum.CREDIT">授信支付(额度: {{ userDetail.availableCredit }})</a-radio>
|
|
|
|
|
+ <a-radio v-if="userDetail.storePay" :value="PayTypeEnum.STORE">到店支付</a-radio>
|
|
|
|
|
+ </a-radio-group>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ label="商品金额"
|
|
|
|
|
+ name="totalAmount"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="price-text">¥{{ formatPriceText(mainData.orderInfo.totalAmount) }}</div>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ v-if="mainData.takeGoodsType === TakeTypeEnum.DISPATCH"
|
|
|
|
|
+ label="运费"
|
|
|
|
|
+ name="freight"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="price-text">¥{{ formatPriceText(mainData.orderInfo.freight) }}</div>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ <a-form-item
|
|
|
|
|
+ label="订单总金额"
|
|
|
|
|
+ name="payAmount"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="price-text">¥{{ formatPriceText(Math.max(0, mainData.orderInfo.payAmount + (mainData.takeGoodsType === 1 ? (mainData.orderInfo.freight || 0) : 0))) }}</div>
|
|
|
|
|
+ </a-form-item>
|
|
|
|
|
+ </a-form>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="order-footer">
|
|
|
|
|
+ <a-flex align="center" justify="space-between">
|
|
|
|
|
+ <a-flex align="center">
|
|
|
|
|
+ <div style="margin-right: 5px;">共{{ mainData.orderInfo.totalNum }}件,合计:</div>
|
|
|
|
|
+ <div class="price-text">¥{{ formatPriceText(Math.max(0, mainData.orderInfo.payAmount + (mainData.takeGoodsType == TakeTypeEnum.DISPATCH ? (mainData.orderInfo.freight || 0) : 0) - (mainData.tradeInfo && mainData.tradeInfo.yjhxDkFlag == 1 ? mainData.tradeInfo.payAmount : 0))) }}</div>
|
|
|
|
|
+ </a-flex>
|
|
|
|
|
+ <a-flex align="center">
|
|
|
|
|
+ <a-button type="primary" :disabled="mainData.disabled" @click="handleSubmit">提交订单</a-button>
|
|
|
|
|
+ </a-flex>
|
|
|
|
|
+ </a-flex>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script setup lang="js">
|
|
|
|
|
+import dayjs from 'dayjs';
|
|
|
|
|
+import { message } from 'ant-design-vue';
|
|
|
|
|
+import { MinusOutlined, PlusOutlined } from '@ant-design/icons-vue';
|
|
|
|
|
+import { ref, reactive, onMounted, computed } from 'vue';
|
|
|
|
|
+import { ackOrder, orderBuy } from '@/api/order';
|
|
|
|
|
+import { getAddressList, getPickTimeList } from '@/api/user';
|
|
|
|
|
+import { useUserStore } from '@/store/user'
|
|
|
|
|
+import { useStorageStore } from '@/store/storage'
|
|
|
|
|
+
|
|
|
|
|
+const emits = defineEmits(['prev-step', 'finish']);
|
|
|
|
|
+
|
|
|
|
|
+const TakeTypeEnum = {
|
|
|
|
|
+ PICK: 0,// 自提
|
|
|
|
|
+ DISPATCH: 1,// 商家配送
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const PayTypeEnum = {
|
|
|
|
|
+ STORE: 2,// 到店
|
|
|
|
|
+ CREDIT: 3,// 授信
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const userStore = useUserStore();
|
|
|
|
|
+const storageStore = useStorageStore();
|
|
|
|
|
+
|
|
|
|
|
+const props = defineProps({
|
|
|
|
|
+ userId: {
|
|
|
|
|
+ type: String,
|
|
|
|
|
+ default: ''
|
|
|
|
|
+ },
|
|
|
|
|
+ storageId: {
|
|
|
|
|
+ type: String,
|
|
|
|
|
+ default: ''
|
|
|
|
|
+ },
|
|
|
|
|
+ buyGoods: {
|
|
|
|
|
+ type: Array,
|
|
|
|
|
+ default: () => []
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const formRef = ref(null)
|
|
|
|
|
+const mainData = reactive({
|
|
|
|
|
+ goodsList: [],
|
|
|
|
|
+ addressList: [],
|
|
|
|
|
+ orderInfo: {},
|
|
|
|
|
+ userAddressId: null,
|
|
|
|
|
+ takeGoodsType: '',
|
|
|
|
|
+ pickTime: '',
|
|
|
|
|
+ dispatchTime: '',
|
|
|
|
|
+ remark: '',
|
|
|
|
|
+ payType: PayTypeEnum.STORE,
|
|
|
|
|
+ pickTimeOptions: [],
|
|
|
|
|
+ dispatchTimeOptions: [],
|
|
|
|
|
+ isSeckill: '',
|
|
|
|
|
+ freight: '',
|
|
|
|
|
+ isGiftGoods: false,
|
|
|
|
|
+ isFullPieceGoods: false,
|
|
|
|
|
+ disabled: false
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const storageName = computed(() => {
|
|
|
|
|
+ return storageStore.list.find(item => item.storageId == storageStore.activedId)?.storageName || ''
|
|
|
|
|
+})
|
|
|
|
|
+const userDetail = computed(() => userStore.userDetail)
|
|
|
|
|
+const isCreditPay = computed(() => {
|
|
|
|
|
+ const payTotalAmount = Math.max(0, mainData.orderInfo.payAmount - (mainData.tradeInfo && mainData.tradeInfo.yjhxDkFlag == 1 ? mainData.tradeInfo.payAmount : 0))
|
|
|
|
|
+ return userDetail.value.isCreditEnabled && (userDetail.value.availableCredit - payTotalAmount > 0)
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+const fetchAddressList = async() => {
|
|
|
|
|
+ const res = await getAddressList({
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 100,
|
|
|
|
|
+ userId: props.userId
|
|
|
|
|
+ })
|
|
|
|
|
+ mainData.addressList = (res.data?.records || []).map(item => {
|
|
|
|
|
+ return {
|
|
|
|
|
+ label: `${item.province}${item.city}${item.area}${item.street}${item.address}${item.houseNo}`,
|
|
|
|
|
+ value: item.userAddressId,
|
|
|
|
|
+ ...item
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ mainData.userAddressId = mainData.addressList.find(item => item.defaultAddr)?.userAddressId || '';
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const fetchPickTimeList = async () => {
|
|
|
|
|
+ const res = await getPickTimeList({
|
|
|
|
|
+ storageId: props.storageId
|
|
|
|
|
+ })
|
|
|
|
|
+ const list = res.data || [];
|
|
|
|
|
+ const validList = list.filter(item => item.overCurTime);
|
|
|
|
|
+ const dateList = validList.length > 0 ? validList[0].countList : [];
|
|
|
|
|
+ dateList.forEach((item, index) => {
|
|
|
|
|
+ mainData.pickTimeOptions[index] = {};
|
|
|
|
|
+ list.forEach(child => {
|
|
|
|
|
+ if (item.count < child.limitNum) {
|
|
|
|
|
+ mainData.pickTimeOptions[index].value = item.date;
|
|
|
|
|
+ mainData.pickTimeOptions[index].label = item.date;
|
|
|
|
|
+ if (mainData.pickTimeOptions[index].children === undefined) {
|
|
|
|
|
+ mainData.pickTimeOptions[index].children = []
|
|
|
|
|
+ }
|
|
|
|
|
+ mainData.pickTimeOptions[index].children.push({
|
|
|
|
|
+ value: `${child.startTime}-${child.endTime}`,
|
|
|
|
|
+ label: `${child.startTime}-${child.endTime}`
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ mainData.pickTimeOptions = mainData.pickTimeOptions.filter(item => item.children && item.children.length > 0)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const fetchOrderInfo = async () => {
|
|
|
|
|
+ const res = await ackOrder({
|
|
|
|
|
+ storageId: props.storageId,
|
|
|
|
|
+ buyGoods: props.buyGoods,
|
|
|
|
|
+ userAddressId: '',
|
|
|
|
|
+ userCouponId: '',
|
|
|
|
|
+ })
|
|
|
|
|
+ if (res.code == 1100) {
|
|
|
|
|
+ return message.error(res.message)
|
|
|
|
|
+ } else if (res.code !== 200) {
|
|
|
|
|
+ emits('prev-step')
|
|
|
|
|
+ }
|
|
|
|
|
+ if (res.data.promotionFullPriceRemark) {
|
|
|
|
|
+ let str = res.data.promotionFullPriceRemark
|
|
|
|
|
+ let str1 = str.substring(0, str.indexOf('打') + 1)
|
|
|
|
|
+ let str2 = str.substring(str.indexOf('折') + 1, str.indexOf('折'))
|
|
|
|
|
+ let num = str.substring(str.indexOf('打') + 1, str.indexOf('折'))
|
|
|
|
|
+ res.data.promotionFullPriceRemark = str1 + Number(num) + str2
|
|
|
|
|
+ }
|
|
|
|
|
+ mainData.orderInfo = res.data
|
|
|
|
|
+ mainData.goodsList = res.data.goods
|
|
|
|
|
+ mainData.isSeckill = res.data.isSecKill
|
|
|
|
|
+ mainData.freight = res.data.freight
|
|
|
|
|
+ mainData.isGiftGoods = findElem(res.data.goods, 'isGift', true) >= 0
|
|
|
|
|
+ mainData.isFullPieceGoods = findElem(res.data.goods, 'promotionFullPiece', true) >= 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const findElem = (array, attr, val) => {
|
|
|
|
|
+ for (var i = 0; i < array.length; i++) {
|
|
|
|
|
+ if (array[i][attr] == val) {
|
|
|
|
|
+ return i //返回当前索引值
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return -1
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const setDispatchTimeRange = () => {
|
|
|
|
|
+ for (let i = 1; i <= 7; i++) {
|
|
|
|
|
+ const dayTimestamp = 1 * 24 * 60 * 60 * 1000
|
|
|
|
|
+ const date = dayjs(new Date().getTime() + dayTimestamp * i)
|
|
|
|
|
+ mainData.dispatchTimeOptions.push({
|
|
|
|
|
+ value: date.format('YYYY-MM-DD'),
|
|
|
|
|
+ label: date.format('YYYY-MM-DD'),
|
|
|
|
|
+ children: [
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'AM',
|
|
|
|
|
+ label: '上午'
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'PM',
|
|
|
|
|
+ label: '下午'
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const getSendTime = () => {
|
|
|
|
|
+ if (mainData.takeGoodsType === TakeTypeEnum.DISPATCH) {
|
|
|
|
|
+ const amStart = mainData.dispatchTime[1] === 'AM' ? ' 00:00:00' : ' 12:00:01';
|
|
|
|
|
+ const amEnd = mainData.dispatchTime[1] === 'AM' ? ' 12:00:00' : ' 23:59:59';
|
|
|
|
|
+ return {
|
|
|
|
|
+ startTime: mainData.dispatchTime[0] + amStart,
|
|
|
|
|
+ endTime: mainData.dispatchTime[0] + amEnd
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const hourMinArr = (mainData.pickTime[1] || '').split('-');
|
|
|
|
|
+ return {
|
|
|
|
|
+ startTime: mainData.pickTime[0] + ` ${hourMinArr[0]}:00`,
|
|
|
|
|
+ endTime: mainData.pickTime[0] + ` ${hourMinArr[1]}:00`
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const handleSubmit = () => {
|
|
|
|
|
+ formRef.value?.validate().then(() => {
|
|
|
|
|
+ const obj = getSendTime()
|
|
|
|
|
+ const params = {
|
|
|
|
|
+ userId: props.userId,
|
|
|
|
|
+ storageId: props.storageId,
|
|
|
|
|
+ takeGoodsType: mainData.takeGoodsType,
|
|
|
|
|
+ buyGoods: props.buyGoods,
|
|
|
|
|
+ buyerMsg: mainData.remark,
|
|
|
|
|
+ userCouponId: '',
|
|
|
|
|
+ payTypeId: ['','ONLINE','STORE','CREDIT'][mainData.payType],
|
|
|
|
|
+ pickTimeId: '',
|
|
|
|
|
+ appointmentPickStartTime: obj.startTime,
|
|
|
|
|
+ appointmentPickEndTime: obj.endTime
|
|
|
|
|
+ }
|
|
|
|
|
+ if (mainData.takeGoodsType === TakeTypeEnum.PICK) {
|
|
|
|
|
+ params.userAddressId = mainData.userAddressId
|
|
|
|
|
+ }
|
|
|
|
|
+ mainData.disabled = false
|
|
|
|
|
+ orderBuy(params).then(res => {
|
|
|
|
|
+ if (res.code === 1100) {
|
|
|
|
|
+ return message.info(res.message)
|
|
|
|
|
+ }
|
|
|
|
|
+ if (res.data.isPay === false) {
|
|
|
|
|
+ if (mainData.payType === PayTypeEnum.STORE) {
|
|
|
|
|
+ message.success('购买成功,待商家确认')
|
|
|
|
|
+ emits('finish')
|
|
|
|
|
+ } else if (mainData.payType === PayTypeEnum.CREDIT) {
|
|
|
|
|
+ message.success('购买成功')
|
|
|
|
|
+ emits('finish')
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }).finally(() => {
|
|
|
|
|
+ mainData.disabled = false
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const formatPriceText = price => {
|
|
|
|
|
+ if (!price) return '0.00'
|
|
|
|
|
+ price = Number(price)
|
|
|
|
|
+ return price.toFixed(2)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const checkAddress = (rule, value) => {
|
|
|
|
|
+ if (mainData.takeGoodsType != TakeTypeEnum.DISPATCH) return Promise.resolve()
|
|
|
|
|
+ if (!value) return Promise.reject('收获地址不能为空')
|
|
|
|
|
+ return Promise.resolve()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const checkTakeGoodsType = (rule, value) => {
|
|
|
|
|
+ if (value === '') return Promise.reject('提货方式不能为空')
|
|
|
|
|
+ return Promise.resolve()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const checkPickTime = (rule, value) => {
|
|
|
|
|
+ if (mainData.takeGoodsType != TakeTypeEnum.PICK) return Promise.resolve()
|
|
|
|
|
+ if (!value) return Promise.reject('提货时间不能为空')
|
|
|
|
|
+ return Promise.resolve()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const checkDispatchTime = (rule, value) => {
|
|
|
|
|
+ if (mainData.takeGoodsType != TakeTypeEnum.DISPATCH) return Promise.resolve()
|
|
|
|
|
+ if (!value) return Promise.reject('配送时间不能为空')
|
|
|
|
|
+ return Promise.resolve()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const checkPayType = (rule, value) => {
|
|
|
|
|
+ return Promise.resolve()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+onMounted(async() => {
|
|
|
|
|
+ // 获取配送时间范围(默认7天)
|
|
|
|
|
+ setDispatchTimeRange()
|
|
|
|
|
+ // 获取用户信息
|
|
|
|
|
+ // 进入页面先获取默认地址
|
|
|
|
|
+ await fetchAddressList()
|
|
|
|
|
+ // 获取提货时间列表
|
|
|
|
|
+ await fetchPickTimeList()
|
|
|
|
|
+ // 获取订单信息
|
|
|
|
|
+ await fetchOrderInfo()
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="less" scoped>
|
|
|
|
|
+@price-color: #ff577e;
|
|
|
|
|
+.order-content {
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ .order-goods {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ min-height: 1;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+ .title {
|
|
|
|
|
+ color: #222;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .goods-list__box {
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
+ .list-item {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 10px 0;
|
|
|
|
|
+ border-bottom: 1px solid @border-color;
|
|
|
|
|
+ .check-box {
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ padding-right: 10px;
|
|
|
|
|
+ .check-item {
|
|
|
|
|
+ color: #969696;
|
|
|
|
|
+ font-size: 24px;
|
|
|
|
|
+ &.actived {
|
|
|
|
|
+ color: @theme-color;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .goods-image {
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+ width: 80px;
|
|
|
|
|
+ height: 80px;
|
|
|
|
|
+ margin-right: 8px;
|
|
|
|
|
+ img {
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .goods-content {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ min-width: 1px;
|
|
|
|
|
+ word-break: break-all;
|
|
|
|
|
+ .goods-name {
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ line-height: 1.5;
|
|
|
|
|
+ margin-bottom: 5px;
|
|
|
|
|
+ color: @theme-color;
|
|
|
|
|
+ }
|
|
|
|
|
+ .goods-desc {
|
|
|
|
|
+ color: #666;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
|
+ }
|
|
|
|
|
+ .goods-price {
|
|
|
|
|
+ color: @price-color;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .goods-old__price {
|
|
|
|
|
+ margin-top: 5px;
|
|
|
|
|
+ color: #666;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ text-decoration: line-through;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .order-footer {
|
|
|
|
|
+ padding-top: 10px;
|
|
|
|
|
+ border-top: 1px solid @border-color;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.price-text {
|
|
|
|
|
+ color: @price-color;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|