Files
xo_user_client/pages/plugins/scanpay/index/index.vue
2025-04-25 09:49:53 +08:00

463 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view :class="theme_view">
<view v-if="(data || null) !== null" class="page-pay-fixed">
<view class="padding-main">
<block v-if="(data.scanpay_info || null) !== null">
<view class="flex-row align-c margin-top-main margin-bottom-xl">
<image v-if="data.scanpay_info.logo" :src="data.scanpay_info.logo" mode="widthFix" class="circle scanpay-logo br margin-right-main" />
<div class="flex-1 flex-width flex-row align-c">
<text class="text-size fw-b single-text">{{ data.scanpay_info.name }}</text>
<text v-if="(data.scanpay_info.alias || null) !== null" class="cr-white badge tc margin-left-sm">{{ data.scanpay_info.alias }}</text>
</div>
</view>
</block>
<view class="bg-white border-radius-main padding-main spacing-mb">
<view class="flex-row jc-sb align-c">
<view class="text-size cr-grey-9 title-padding">{{$t('promotion-user.promotion-user.32bf15')}}</view>
<view class="flex-1 flex-width tr">
<view class="pay-price" :class="form.price ? '' : 'cr-grey-9'">
<text class="unit">{{ currency_symbol }}</text>
<text class="price fw-b text-size-xl"> {{ form.price || '0.00' }} </text>
</view>
</view>
</view>
</view>
<view class="bg-white border-radius-main padding-main spacing-mb">
<view class="text-size fw-b spacing-mb">{{$t('user-order-detail.user-order-detail.0e1sfs')}}</view>
<view class="flex-col" :class="is_more ? 'pay-scroll' : ''">
<view v-for="(item, index) in is_more ? data.payment_list : data.payment_list.slice(0, 2)" :key="index" class="flex-row jc-sb align-c padding-vertical-sm" @tap="change_event(index, item.id)">
<div class="flex-1 flex-width flex-row align-c">
<image v-if="item.logo" :src="item.logo" mode="widthFix" class="circle img-pay margin-right-main" />
<view>{{ item.name }}</view>
<view v-if="(item.tips || null) !== null" class="va-m cr-red text-size-xs">{{ item.tips }}</view>
</div>
<iconfont :name="checked === index ? 'icon-zhifu-yixuan' : 'icon-zhifu-weixuan'" size="40rpx" :color="checked === index ? '#E83B11' : '#ddd'"></iconfont>
</view>
</view>
<view v-if="data.payment_list.length > 2" class="br-t margin-top-sm padding-top-main tc cr-grey-9" @tap="more_event">
<text>{{$t('common.more')}}</text>
<iconfont :name="is_more ? 'icon-arrow-bottom' : 'icon-arrow-top'" size="24rpx"></iconfont>
</view>
</view>
</view>
<view class="bottom-fixed sub-key" :style="bottom_fixed_style">
<view class="tc text-size-xs spacing-mb">
<block v-if="!form.note">
<view class="cr-blue" @tap="add_desc_event">{{$t('index.index.1e582h')}}</view>
</block>
<block v-else>
<view class="flex-row align-c jc-c padding-horizontal-main">
<text class="cr-grey-9 single-text tc">{{ form.note }}</text>
<view class="cr-blue margin-left-sm edit-width" @tap="add_desc_event">{{$t('user.user.567lwz')}}</view>
</view>
</block>
<!-- 输入框示例 -->
<uni-popup ref="inputDialog" type="dialog" :animation="false">
<view class="dialog-container">
<view class="dialog-title">
<text>{{$t('common.note')}}</text>
</view>
<view class="dialog-content">
<input type="text" class="dialog-input" maxlength="200" @input="input_change" />
</view>
<view class="dialog-btn-group">
<view class="dialog-btn cr-grey-9" @tap="input_dialog_colse">{{$t('common.cancel')}}</view>
<view class="dialog-btn divider-l" @tap="input_dialog_open">{{$t('index.index.7w75zb')}}</view>
</view>
</view>
</uni-popup>
</view>
<view class="bg-white tc text-size-xl fw-b sub-key-content">
<view class="flex-row">
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('1')">1</view>
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('2')">2</view>
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('3')">3</view>
<view class="flex-1 key-1 br-b-f5 key-num" @tap="key_up_event('del')">
<iconfont name="icon-keyboard-backspace" color="#333" size="68rpx" class="fw-n"></iconfont>
</view>
</view>
<view class="flex-row">
<view class="flex-3">
<view class="flex-row">
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('4')">4</view>
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('5')">5</view>
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('6')">6</view>
</view>
<view class="flex-row">
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('7')">7</view>
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('8')">8</view>
<view class="flex-1 key-1 br-r-f5 br-b-f5 key-num" @tap="key_up_event('9')">9</view>
</view>
<view class="flex-row">
<view class="flex-2 key-1 br-r-f5 key-num" @tap="key_up_event('0')">0</view>
<view class="flex-1 key-1 repair br-r-f5 key-num" @tap="key_up_event('.')">.</view>
</view>
</view>
<view class="flex-1 key-num sub" @tap="key_up_event('sub')">
<button type="default" class="flex-col jc-c ht-auto wh-auto radius-0 bg-red cr-white" :disabled="form_submit_loading">{{$t('order.order.1i873j')}}</button>
</view>
</view>
</view>
</view>
<!-- 支付弹窗 -->
<component-payment
ref="payment"
:propPayUrl="pay_url"
:propQrcodeUrl="qrcode_url"
:propPaymentList="data.payment_list"
:propTempPayValue="temp_pay_value"
:propPayPrice="pay_price"
:propPaymentId="payment_id"
:propIsRedirectTo="true"
:propIsFailAlert="false"
:propToPage="to_page"
:propToFailPage="to_fail_page"
:propToAppointPage="to_appoint_page"
:propIsShowPayment="is_show_payment_popup"
@close-payment-popup="payment_popup_event_close"
@pay-success="pay_back_event"
@pay-fail="pay_back_event"
></component-payment>
</view>
<block v-else>
<!-- 提示信息 -->
<component-no-data :propStatus="data_list_loding_status" :propMsg="data_list_loding_msg"></component-no-data>
</block>
<!-- 公共 -->
<component-common ref="common"></component-common>
</view>
</template>
<script>
const app = getApp();
import componentCommon from '@/components/common/common';
import componentNoData from '@/components/no-data/no-data';
import componentPayment from '@/components/payment/payment';
export default {
data() {
return {
theme_view: app.globalData.get_theme_value_view(),
currency_symbol: app.globalData.currency_symbol(),
data: null,
data_list_loding_status: 1,
data_list_loding_msg: '',
bottom_fixed_style: '',
form_submit_loading: false,
checked: 0,
is_more: false,
form: {
price: '',
note: '',
payment_id: '',
},
params: {},
// 支付弹窗参数
pay_url: '',
qrcode_url: '',
temp_pay_value: '',
is_show_payment_popup: false,
pay_price: 0,
payment_id: 0,
// 指定所有页面跳转到指定页面------除现金支付外
to_page: '',
// 现金支付跳转的页面
to_appoint_page: '',
// 失败跳转
to_fail_page: '',
input_value: '',
};
},
components: {
componentCommon,
componentNoData,
componentPayment,
},
onLoad(params) {
// 调用公共事件方法
app.globalData.page_event_onload_handle(params);
// 设置参数
this.setData({
params: params || {},
});
},
onShow() {
// 调用公共事件方法
app.globalData.page_event_onshow_handle();
// 加载数据
this.init();
// 公共onshow事件
if ((this.$refs.common || null) != null) {
this.$refs.common.on_show();
}
},
// 下拉刷新
onPullDownRefresh() {
this.init();;
},
methods: {
init() {
var user = app.globalData.get_user_info(this, 'init');
if (user != false) {
this.setData({
pay_url: app.globalData.get_request_url('pay', 'index', 'scanpay'),
qrcode_url: app.globalData.get_request_url('paycheck', 'index', 'scanpay'),
});
this.get_data();
}
},
// 获取数据
get_data() {
// 加载loding
uni.showLoading({
title: this.$t('common.loading_in_text')
});
uni.request({
url: app.globalData.get_request_url('index', 'index', 'scanpay'),
method: 'POST',
data: this.params,
dataType: 'json',
success: (res) => {
uni.hideLoading();
uni.stopPullDownRefresh();
if (res.data.code == 0) {
var temp_form = this.form;
var data = res.data.data || null;
if (data != null && (data.payment_list || null) != null && data.payment_list.length > 0) {
temp_form.payment_id = data.payment_list[0]['id'];
}
this.setData({
data: res.data.data,
form: temp_form,
data_list_loding_msg: '',
data_list_loding_status: 0,
});
// 标题
if (data != null && (data.scanpay_info || null) != null) {
uni.setNavigationBarTitle({
title: data.scanpay_info.name + this.$t('index.index.6941e7'),
});
}
} else {
this.setData({
data_list_loding_status: 2,
data_list_loding_msg: res.data.msg,
});
if (app.globalData.is_login_check(res.data, this, 'get_data')) {
app.globalData.showToast(res.data.msg);
}
}
},
fail: () => {
uni.hideLoading();
uni.stopPullDownRefresh();
this.setData({
data_list_loding_status: 2,
data_list_loding_msg: this.$t('common.internet_error_tips'),
});
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
},
// 选择支付方式
change_event(i, id) {
var new_data = this.form;
new_data.payment_id = id;
this.setData({
checked: i,
form: new_data,
});
},
// 更多
more_event() {
this.setData({
is_more: !this.is_more,
});
},
// 备注
add_desc_event() {
this.$refs.inputDialog.open();
},
input_change(e) {
this.setData({
input_value: e.detail.value,
});
},
// 提交备注
input_dialog_colse(val) {
this.setData({
input_value: this.form.note,
});
// 关闭窗口后,恢复默认内容
this.$refs.inputDialog.close();
},
// 打开备注框
input_dialog_open() {
var new_data = this.form;
new_data.note = this.input_value;
this.setData({
form: new_data,
});
// 关闭窗口后,恢复默认内容
this.$refs.inputDialog.close();
},
// 键盘点击事件
key_up_event(v) {
var price = this.form.price;
if (v === 'del') {
this.concat_string(price.slice(0, -1));
} else if (v === '.') {
// 判断输入框是否有值,如果没值则不允许输入
if (price.length > 0) {
// 判断是否已经存在‘。’如果存在则不允许输入
if (price.indexOf(v) == -1) {
this.concat_string(price + v);
}
} else {
this.concat_string('0' + v);
}
} else if (v === '0') {
if (price.length > 0) {
this.control_price(price, v);
} else {
this.concat_string(price + v);
}
} else if (v === 'sub') {
this.form_submit();
} else {
if (price.length > 0) {
this.control_price(price, v);
} else {
this.concat_string(price + v);
}
}
// 触感振动
uni.vibrateShort();
},
// 提交订单
form_submit() {
var new_data = {
...this.params,
...this.form,
};
var validation = [{ fields: 'price', msg: this.$t('index.index.t1o84g') }];
if (app.globalData.fields_check(new_data, validation)) {
// 加载loding
uni.showLoading({
title: this.$t('common.loading_in_text'),
mask: true
});
this.setData({
form_submit_loading: true
});
uni.request({
url: app.globalData.get_request_url('created', 'index', 'scanpay'),
method: 'POST',
data: new_data,
dataType: 'json',
success: (res) => {
uni.hideLoading();
uni.stopPullDownRefresh();
if (res.data.code == 0) {
var data = res.data.data;
this.setData({
to_page: '/pages/plugins/scanpay/tips/tips?id=' + data.id,
to_appoint_page: '/pages/plugins/scanpay/tips/tips?id=' + data.id,
to_fail_page: '/pages/plugins/scanpay/tips/tips?id=' + data.id,
});
this.$refs.payment.pay_handle(data.id, this.form.payment_id, this.data.payment_list);
} else {
if (app.globalData.is_login_check(res.data, this, 'form_submit')) {
app.globalData.showToast(res.data.msg);
} else {
this.setData({
form_submit_loading: false
});
}
}
},
fail: () => {
this.setData({
form_submit_loading: false
});
uni.hideLoading();
uni.stopPullDownRefresh();
app.globalData.showToast(this.$t('common.internet_error_tips'));
},
});
}
},
// 支付成功失败回调
pay_back_event(params) {
this.setData({
form_submit_loading: false
});
},
// 消费金额更新
concat_string(price) {
var new_data = this.form;
new_data.price = price;
this.setData({
form: new_data,
});
},
// 数字键盘业务处理
control_price(price, num) {
// 判断输入框第一个字符是否是0
if (price.substring(0, 1) == '0') {
if (price.indexOf('.') !== -1) {
var index = price.lastIndexOf('.');
if (price.substring(index + 1, price.length).length < 2) {
this.concat_string(price + num);
}
}
} else {
if (price.indexOf('.') !== -1) {
// 判断是否含有小数点
var index = price.lastIndexOf('.');
if (price.substring(index + 1, price.length).length < 2) {
this.concat_string(price + num);
}
} else {
if (price.length < 8) {
this.concat_string(price + num);
}
}
}
},
// 支付弹窗关闭
payment_popup_event_close() {
this.setData({
is_show_payment_popup: false,
});
},
},
};
</script>
<style scoped>
@import './index.css';
</style>