Files
HTFX-CRM-APP/pages/activity/shop/exchange.vue

398 lines
9.8 KiB
Vue
Raw Normal View History

2025-07-07 15:55:44 +08:00
<template>
<NavBar />
<view class="container">
<view class="title">
<PageTitle :title="$t('activity.pointExchange')" />
</view>
<view class="content">
<Spin v-show="loading" />
<view class="goods-info" v-if="info">
<image :src="info.imgs.split(',')[0]" class="img"></image>
<view class="info">
<view class="order-title">{{ info.goods_name }}</view>
<view class="order-point">
<text class="point">{{ info.integral }}</text>
<text>{{ ' ' + $t('activity.point') + ' x1' }}</text>
</view>
</view>
</view>
<view class="address-info" v-if="info">
<view class="item">
<image src="../../../static/shop/recipients.svg" class="icon"></image>
<view class="item-content">
<view class="label">{{ $t('activity.recipients') }}</view>
<view class="value">{{ addr.user_name }}</view>
</view>
<view class="item-btn">
<button class="mini-btn" size="mini" style="flex-grow: 0; margin-right: 0; font-size: 24upx; font-weight: 400" @click="goAddress">
{{ $t('activity.addrMgr') }}
</button>
</view>
</view>
<view class="item">
<image src="../../../static/shop/phone.svg" class="icon"></image>
<view class="item-content">
<view class="label">{{ $t('activity.phone') }}</view>
<view class="value">{{ addr.user_phone }}</view>
</view>
</view>
<view class="item">
<image src="../../../static/shop/addr.svg" class="icon"></image>
<view class="item-content">
<view class="label">{{ $t('activity.addr') }}</view>
<view class="value">
{{ (addr.userCountry ? addr.userCountry + ' ' : '') + (addr.userCity ? addr.userCity + ' ' : '') + (addr.userAddr ? addr.userAddr : '') }}
</view>
</view>
</view>
</view>
<view style="margin-top: 76upx" v-if="info">
<button class="primaryButton" style="font-size: 32upx; font-weight: 400" @click="openApplyDialog">
{{ $t('activity.exchange') }}
</button>
</view>
</view>
</view>
<uni-popup ref="applyDialog" mask-background-color="transparent" :isMaskClick="false">
<view class="formDialog">
<view class="searchForm">
<uni-forms ref="searchForm" :modelValue="applyFormData">
<uni-row>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.goodsName')">
<view style="height: 100%; display: flex; align-items: center">{{ info.goods_name }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.point')">
<view style="height: 100%; display: flex; align-items: center">{{ info.integral }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.country')">
<view style="height: 100%; display: flex; align-items: center">{{ addr.userCountry }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.userCity')">
<view style="height: 100%; display: flex; align-items: center">{{ addr.userCity }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.addr')">
<view style="height: 100%; display: flex; align-items: center">{{ addr.userAddr }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.phone')">
<view style="height: 100%; display: flex; align-items: center">{{ addr.user_phone }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('activity.recipients')">
<view style="height: 100%; display: flex; align-items: center">{{ addr.user_name }}</view>
</uni-forms-item>
</uni-col>
<uni-col :span="24">
<uni-forms-item :label="$t('form.remark.label')">
<uni-easyinput primaryColor="#29BBE4" v-model="applyFormData.remark" />
</uni-forms-item>
</uni-col>
</uni-row>
</uni-forms>
<view class="submitter">
<button :disabled="submitBtnLoading" class="primaryButton" @click="save">
<image v-show="submitBtnLoading" src="/static/loadingCircle.svg" mode="aspectFit" style="width: 16px; height: 16px"></image>
{{ $t('common.okText') }}
</button>
<button class="secondaryButton" @click="closeApplyDialog">
{{ $t('common.cancelText') }}
</button>
</view>
</view>
</view>
</uni-popup>
</template>
<script>
import { getGoodsInfo, dh } from '@/services/activity/shop';
export default {
data() {
return {
id: undefined,
info: null,
addr: null,
loading: false,
submitBtnLoading: false,
applyFormData: {
id: undefined,
remark: undefined
}
};
},
methods: {
openApplyDialog() {
this.applyFormData.id = this.info.id;
this.applyFormData.remark = undefined;
this.$refs.applyDialog.open();
},
closeApplyDialog() {
this.$refs.applyDialog.close();
this.applyFormData.id = undefined;
this.applyFormData.remark = undefined;
},
isEmpty(str) {
if (this.isNumber(str)) str = str + '' //改为字符串避免传入Number判定为空 add by mb 0526
if (str == "undefined" || str == 'null' || str == null || str == "" || str == undefined) {
return true;
} else {
return false;
}
},
isNumber(value) {
return typeof value === 'number' && !isNaN(value);
},
async save() {
this.submitBtnLoading = true;
let data = {
...this.applyFormData,
delivery_address: this.addr.userAddr,
phone: this.addr.user_phone,
recipients: this.addr.user_name,
country: this.addr.userCountry,
city: this.addr.userCity
};
if (this.isEmpty(data.delivery_address) || this.isEmpty(data.phone) || this.isEmpty(data.recipients)) {
this.closeApplyDialog();
this.$nextTick(() => {
this.$cusModal.showModal({
type: 'message',
status: 'warning',
contentText: this.$t('activity.addressErrorTips')
});
})
return
}
const resp = await dh(data);
this.submitBtnLoading = false;
if (resp.code == 0) {
this.closeApplyDialog();
this.$nextTick(() => {
this.$cusModal.showModal({
type: 'message',
status: 'success',
contentText: this.$t('activity.dh'),
onClose() {
uni.redirectTo({
url: '/pages/activity/shop/myOrder'
});
}
});
})
} else if (resp.msg == 'kcbz' || resp.msg == 'jfbz' || resp.msg == 'sqgd') {
this.closeApplyDialog();
this.$nextTick(() => {
this.$cusModal.showModal({
type: 'message',
status: 'warning',
contentText: this.$t('activity.' + resp.msg)
});
})
} else {
this.closeApplyDialog();
this.$nextTick(() => {
this.$cusModal.showModal({
type: 'message',
status: 'warning',
contentText: resp.msg ?? this.$t('common.error.sysError')
});
})
}
},
goAddress() {
uni.navigateTo({
url: '/pages/activity/shop/address'
});
}
},
onLoad(options) {
uni.$on('changeAddr', (data) => {
this.addr = {
userCountry: data.country,
userCity: data.city,
user_name: data.recipients,
userAddr: data.delivery_address,
user_phone: data.phone
};
});
const { goods } = options;
this.id = goods;
this.loading = true;
getGoodsInfo({ id: goods })
.then((resp) => {
if (resp.code == 0) {
this.info = resp.data.info;
resp.data.info = null;
this.addr = resp.data;
}
this.loading = false;
})
.catch(() => {
this.loading = false;
});
},
onUnload() {
uni.$off('changeAddr');
}
};
</script>
<style lang="scss" scoped>
.container {
padding: 0 40upx 162upx;
.title {
margin: 14px 0 15px;
}
.content {
display: flex;
flex-direction: column;
margin-top: 40upx;
}
}
.goods-info {
width: 100%;
display: flex;
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.15);
padding: 32upx;
box-sizing: border-box;
margin-bottom: 34upx;
.img {
width: 272upx;
height: 152upx;
vertical-align: bottom;
margin-right: 40upx;
flex-shrink: 0;
}
.info {
flex-grow: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
.order-title {
font-size: 40upx;
font-weight: 700;
color: rgba(51, 51, 51, 1);
}
.order-point {
margin-top: 20upx;
color: rgba(102, 102, 102, 1);
font-size: 28upx;
font-weight: 400;
.point {
color: rgba(41, 187, 228, 1);
font-size: 28upx;
font-weight: 400;
}
}
}
}
.address-info {
width: 100%;
display: flex;
flex-direction: column;
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.15);
padding: 40upx;
box-sizing: border-box;
.item:not(:last-of-type) {
margin-bottom: 40upx;
}
.item {
display: flex;
flex-wrap: nowrap;
.icon {
width: 40upx;
height: 40upx;
vertical-align: bottom;
margin-right: 28upx;
flex-shrink: 0;
}
.item-content {
flex-shrink: 1;
flex-grow: 1;
.label {
font-size: 36upx;
font-weight: 700;
color: rgba(51, 51, 51, 1);
margin-bottom: 10upx;
}
.value {
font-size: 32upx;
font-weight: 400;
color: rgba(119, 119, 119, 1);
}
}
.item-btn {
flex-shrink: 0;
}
}
}
.mini-btn {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
// height: 40px;
color: #fff;
background-color: rgba(41, 187, 228, 1);
border-radius: 0px;
cursor: pointer;
&::after {
border: none;
}
}
.formDialog {
padding: 0 14px;
.searchForm {
padding: 28px 16px;
background: #fff;
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.15);
}
.submitter {
display: flex;
column-gap: 10px;
color: #fff;
.confirmBtn,
.cancelBtn {
display: flex;
justify-content: center;
align-items: center;
height: 40px;
flex: 1;
}
.confirmBtn {
background-color: rgba(77, 192, 229, 1);
}
.cancelBtn {
background-color: rgba(15, 54, 117, 1);
}
}
}
</style>