Compare commits
8 Commits
db467815dd
...
test
| Author | SHA1 | Date | |
|---|---|---|---|
| 527cfcdcf8 | |||
| 5d28477db9 | |||
| 92c3a45049 | |||
| 042dacec98 | |||
| ed8be8a16a | |||
| 3b19d58f27 | |||
| c95ab6fda5 | |||
| 084084c008 |
@@ -1,10 +1,11 @@
|
||||
import request from "@/utils/request";
|
||||
import { Account_BaseUrl } from "@/api/config";
|
||||
import { Account_BaseUrl, Order_BaseUrl } from "@/api/config";
|
||||
const baseURL = Account_BaseUrl + "/admin/shopMerchant";
|
||||
const orderURL = Order_BaseUrl + "/admin/shopMerchant";
|
||||
const API = {
|
||||
get(shopId: string | number) {
|
||||
return request({
|
||||
url: `${baseURL}`,
|
||||
url: `${orderURL}`,
|
||||
method: "get",
|
||||
params: {
|
||||
shopId: shopId
|
||||
@@ -14,7 +15,7 @@ const API = {
|
||||
edit(shopId: string | number, data: shopMerchantType) {
|
||||
delete data.id
|
||||
return request({
|
||||
url: `${baseURL}`,
|
||||
url: `${orderURL}`,
|
||||
method: "put",
|
||||
data: { ...data, shopId },
|
||||
});
|
||||
|
||||
@@ -124,4 +124,43 @@ export const queryEntry = (params: Object) => {
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 商户支付信息获取
|
||||
* @data { params }
|
||||
* @returns
|
||||
*/
|
||||
export const shopMerchantGet = (params: Object) => {
|
||||
return request<any, any[]>({
|
||||
url: `/order/admin/shopMerchant`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 商户支付信息修改 修改聚合支付信息
|
||||
* @data { params }
|
||||
* @returns
|
||||
*/
|
||||
export const shopMerchantPut = (data: Object) => {
|
||||
return request<any, any[]>({
|
||||
url: `/order/admin/shopMerchant`,
|
||||
method: "put",
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前店铺的主店进件信息
|
||||
* @data { params }
|
||||
* @returns
|
||||
*/
|
||||
export const getMainMerchant = (params: Object) => {
|
||||
return request<any, any[]>({
|
||||
url: `/order/admin/shopMerchant/getMainMerchant`,
|
||||
method: "get",
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ export function searchstorestatus(type) {
|
||||
return request_php({
|
||||
method: "post",
|
||||
headers: {
|
||||
clint_type: type
|
||||
'ClintType': type
|
||||
},
|
||||
url: "/meituan/searchstorestatus"
|
||||
});
|
||||
@@ -79,7 +79,7 @@ export function getuisdk(data) {
|
||||
return request_php({
|
||||
method: "post",
|
||||
headers: {
|
||||
clint_type: 2
|
||||
'ClintType': 2
|
||||
},
|
||||
url: "/douyin/getuisdk",
|
||||
data,
|
||||
@@ -214,7 +214,7 @@ export function thirdPartyCoupon_bindUrl(data) {
|
||||
return request_php({
|
||||
method: "post",
|
||||
headers: {
|
||||
clint_type: 1
|
||||
'ClintType': 1
|
||||
},
|
||||
url: "/meituan/getuisdkurl",
|
||||
data,
|
||||
|
||||
@@ -3,7 +3,6 @@ import { Order_BaseUrl } from "@/api/config";
|
||||
const baseURL = Order_BaseUrl + "/pay";
|
||||
const Api = {
|
||||
// h5支付
|
||||
|
||||
h5Pay(data: h5PayRequest) {
|
||||
return request<any>({
|
||||
url: `${baseURL}/h5Pay`,
|
||||
@@ -67,7 +66,6 @@ const Api = {
|
||||
params
|
||||
});
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
export default Api;
|
||||
|
||||
@@ -91,7 +91,7 @@ service.interceptors.response.use(
|
||||
return;
|
||||
}
|
||||
ElMessage.error(formatErrorMsg(msg || "Error"));
|
||||
return Promise.reject(new Error(formatErrorMsg(msg || "Error")));
|
||||
return Promise.reject(response.data);
|
||||
},
|
||||
async (error: any) => {
|
||||
|
||||
|
||||
@@ -311,13 +311,14 @@ const longTime = ref('2099-12-31')
|
||||
const wxProvinceCode = ref('')
|
||||
|
||||
// 获取进件详情
|
||||
async function getDetailAjax(shopId: string, licenceNo: string) {
|
||||
async function getDetailAjax(shopId: string) {
|
||||
try {
|
||||
const res: any = await entryManagerDetail({
|
||||
shopId: shopId,
|
||||
licenceNo: licenceNo
|
||||
shopId: shopId
|
||||
})
|
||||
form.value = res
|
||||
if (res && res.shopId) {
|
||||
form.value = res
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
@@ -325,8 +326,6 @@ async function getDetailAjax(shopId: string, licenceNo: string) {
|
||||
|
||||
// 获取containerDomInfo信息
|
||||
function getContainerDomInfo() {
|
||||
console.log('getContainerDomInfo');
|
||||
|
||||
containerDomInfo.value = containerRef.value?.getBoundingClientRect() ?? {}
|
||||
}
|
||||
|
||||
@@ -336,14 +335,18 @@ onMounted(() => {
|
||||
getContainerDomInfo()
|
||||
window.addEventListener('resize', debouncedCheckWidth)
|
||||
|
||||
const type = route.query.type
|
||||
const shopId: string = String(route.query.shopId ?? '')
|
||||
const licenceNo: string = String(route.query.licenceNo ?? '')
|
||||
if (shopId && licenceNo) {
|
||||
formType.value = 'editor'
|
||||
getDetailAjax(shopId, licenceNo)
|
||||
|
||||
if (shopId) {
|
||||
getDetailAjax(shopId)
|
||||
}
|
||||
|
||||
if (licenceNo && type && type == 'editor') {
|
||||
formType.value = 'editor'
|
||||
}
|
||||
|
||||
const type = route.query.type
|
||||
if (type && type == 'check') {
|
||||
formType.value = 'check'
|
||||
}
|
||||
|
||||
@@ -233,7 +233,7 @@ import shopExtendApi from "@/api/account/shopExtend";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tableActive: "",
|
||||
tableActive: "ticket_logo",
|
||||
tableData: [],
|
||||
selectItem: {},
|
||||
imageUrl: "",
|
||||
@@ -248,7 +248,10 @@ export default {
|
||||
methods: {
|
||||
// 刷新列表数据
|
||||
async doSubmit() {
|
||||
this.selectItem.value = JSON.stringify(this.imgList)
|
||||
// console.log('this.selectItem.value', this.selectItem.value);
|
||||
// return
|
||||
|
||||
// this.selectItem.value = JSON.stringify(this.imgList)
|
||||
await shopExtendApi.edit({
|
||||
...this.selectItem,
|
||||
autokey: this.selectItem.autoKey,
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-select v-model="query.payType" placeholder="支付类型">
|
||||
<el-option label="微信支付" value="wechatPay" />
|
||||
<el-option label="支付宝支付" value="aliPay" />
|
||||
<el-option label="微信支付" value="WECHAT" />
|
||||
<el-option label="支付宝支付" value="ALIPAY" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
@@ -135,11 +135,11 @@ export default {
|
||||
},
|
||||
payTypes: [
|
||||
{
|
||||
value: "wechatPay",
|
||||
value: "WECHAT",
|
||||
label: "微信支付"
|
||||
},
|
||||
{
|
||||
value: "aliPay",
|
||||
value: "ALIPAY",
|
||||
label: "支付宝支付"
|
||||
}
|
||||
],
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<div class="item">
|
||||
<div class="t">订单类型</div>
|
||||
<div class="b">
|
||||
{{ sendTypeFilter(detail.sendType) }}
|
||||
{{ sendTypeFilter(detail.dineMode) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -46,12 +46,12 @@
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="t">下单时间</div>
|
||||
<div class="b">{{ timeFilter(detail.createdAt) }}</div>
|
||||
<div class="b">{{ timeFilter(detail.createTime) }}</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="t">支付时间</div>
|
||||
<div class="b">
|
||||
{{ timeFilter(detail.createdAt) }}
|
||||
{{ timeFilter(detail.paidTime) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -51,15 +51,15 @@ export default {
|
||||
label: "快递",
|
||||
},
|
||||
{
|
||||
key: "takeaway",
|
||||
key: "take-away",
|
||||
label: "外卖",
|
||||
},
|
||||
{
|
||||
key: "takeself",
|
||||
key: "take-out",
|
||||
label: "自提",
|
||||
},
|
||||
{
|
||||
key: "table",
|
||||
key: "dine-in",
|
||||
label: "堂食",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -245,8 +245,8 @@ const tableData = reactive({
|
||||
// 支付方式类型
|
||||
function payTypeFilter(t) {
|
||||
const m = {
|
||||
wechatPay: '微信支付',
|
||||
aliPay: '支付宝支付'
|
||||
WECHAT: '微信支付',
|
||||
ALIPAY: '支付宝支付'
|
||||
}
|
||||
return m[t]
|
||||
}
|
||||
|
||||
@@ -1,156 +1,110 @@
|
||||
<template>
|
||||
<el-dialog v-model="dialogVisible" :show-close="false" @close="reset">
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="聚合支付" name="pay">
|
||||
<el-form ref="form" :model="form" label-width="120px" label-position="left">
|
||||
<el-form-item label="店铺id">
|
||||
<el-input v-model="form.storeId" placeholder="请输入店铺id"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="商户名称">
|
||||
<el-input v-model="form.merchantName" placeholder="请输入支付系统商户名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="商户应用id">
|
||||
<el-input v-model="form.appId" placeholder="请输入商户应用id"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="商户密钥">
|
||||
<el-input
|
||||
type="textarea"
|
||||
v-model="form.appSecret"
|
||||
placeholder="请输入商户密钥"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付密码">
|
||||
<el-input v-model="form.payPassword" placeholder="请输入支付密码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="微信appid">
|
||||
<el-input
|
||||
v-model="form.wechatSmallAppid"
|
||||
placeholder="请输入微信小程序appid"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付宝appid">
|
||||
<el-input
|
||||
v-model="form.alipaySmallAppid"
|
||||
placeholder="请输入支付宝小程序appid"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="支付宝商户号">
|
||||
<el-input v-model="form.alipayAppId" placeholder="请输入支付宝商户号"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付宝商户密钥">
|
||||
<el-input v-model="form.alipayAppToken" placeholder="请输入支付宝商户密钥"></el-input>
|
||||
</el-form-item> -->
|
||||
|
||||
<!-- <el-form-item label="状态">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio :value="1">启用</el-radio>
|
||||
<el-radio :value="-1">禁用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item> -->
|
||||
</el-form>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="close">取消</el-button>
|
||||
<el-button type="primary" @click="submitHandle" :loading="formLoading">
|
||||
<span v-if="!formLoading">保存</span>
|
||||
<span v-else>保存中...</span>
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<div class="row mt14">
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px" label-position="left">
|
||||
<el-form-item label="店铺ID" prop="storeId">
|
||||
<el-input v-model="form.storeId" placeholder="请输入店铺ID" :style="inputStyle"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="商户名称" prop="merchantName">
|
||||
<el-input v-model="form.merchantName" placeholder="请输入商户名称" :style="inputStyle"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="appId" prop="appId">
|
||||
<el-input v-model="form.appId" placeholder="请输入appId" :style="inputStyle"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="appSecret" prop="appSecret">
|
||||
<el-input type="textarea" :rows="4" v-model="form.appSecret" placeholder="请输入appSecret"
|
||||
:style="inputStyle"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submitHandle" v-loading="loading">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import { tbMerchantThirdApply, tbMerchantThirdApplyPut } from "@/api/shop";
|
||||
import ShopApi from "@/api/account/shop";
|
||||
import shopMerchantApi from "@/api/account/shopMerchant";
|
||||
import { ElNotification } from "element-plus";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
activeName: "pay",
|
||||
formLoading: false,
|
||||
form: {
|
||||
appSecret: "",
|
||||
id: "",
|
||||
payPassword: "",
|
||||
status: 1,
|
||||
appId: "",
|
||||
wechatSmallAppid: "",
|
||||
storeId: "",
|
||||
alipaySmallAppid: "",
|
||||
alipayAppToken: "",
|
||||
alipayAppId: "",
|
||||
},
|
||||
shopId: "",
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
// 保存
|
||||
async submitHandle() {
|
||||
this.formLoading = true;
|
||||
try {
|
||||
await shopMerchantApi.edit(this.shopId, this.form);
|
||||
this.$emit("success");
|
||||
this.formLoading = false;
|
||||
ElNotification({
|
||||
title: "成功",
|
||||
message: `修改成功`,
|
||||
type: "success",
|
||||
});
|
||||
this.close();
|
||||
} catch (error) {
|
||||
this.formLoading = false;
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
close() {
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
reset() {
|
||||
this.form.appSecret = "";
|
||||
this.form.id = "";
|
||||
this.form.payPassword = "";
|
||||
this.form.status = 1;
|
||||
this.form.appId = "";
|
||||
this.shopId = "";
|
||||
},
|
||||
// 详情(配置三方支付)
|
||||
async getDetail(id) {
|
||||
console.log(id);
|
||||
this.shopId = id;
|
||||
try {
|
||||
const res = await shopMerchantApi.get(id);
|
||||
this.form.appSecret = res.appSecret || "";
|
||||
this.form.payPassword = res.payPassword || "";
|
||||
this.form.status = res.status || "";
|
||||
this.form.appId = res.appId || "";
|
||||
this.form.wechatSmallAppid = res.wechatSmallAppid || "";
|
||||
this.form.alipaySmallAppid = res.alipaySmallAppid || "";
|
||||
this.form.merchantName = res.merchantName || "";
|
||||
//this.form.alipayAppToken = res.alipayAppToken
|
||||
//this.form.alipayAppId = res.alipayAppId
|
||||
this.form.storeId = res.storeId || "";
|
||||
this.dialogVisible = true;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
show(obj) {
|
||||
if (obj && obj.id) {
|
||||
this.form.id = obj.id;
|
||||
this.getDetail(obj.id);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { shopMerchantPut } from '@/api/common'
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-dialog__header) {
|
||||
padding: 0;
|
||||
const inputStyle = {
|
||||
width: '500px'
|
||||
}
|
||||
</style>
|
||||
|
||||
const props = defineProps({
|
||||
detail: {
|
||||
type: Object,
|
||||
default: {}
|
||||
}
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
const formRef = ref(null)
|
||||
|
||||
const form = defineModel({
|
||||
storeId: '',
|
||||
merchantName: '',
|
||||
appId: '',
|
||||
appSecret: '',
|
||||
})
|
||||
|
||||
const rules = ref({
|
||||
storeId: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入店铺ID',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
merchantName: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入店铺名称',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
appId: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入appId',
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
appSecret: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入appSecret',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
// 验证表单
|
||||
function submitHandle() {
|
||||
formRef.value.validate(valid => {
|
||||
if (valid) {
|
||||
shopMerchantPostAjax()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 更新聚合支付
|
||||
const loading = ref(false)
|
||||
async function shopMerchantPostAjax() {
|
||||
try {
|
||||
loading.value = true
|
||||
const res = await shopMerchantPut({
|
||||
shopId: route.query.shopId,
|
||||
polyMerchantDTO: form.value
|
||||
})
|
||||
ElNotification({
|
||||
title: '注意',
|
||||
message: '更新成功',
|
||||
type: 'success'
|
||||
})
|
||||
} catch (error) {
|
||||
console.log('shopMerchantPostAjax=', error);
|
||||
}
|
||||
loading.value = false
|
||||
}
|
||||
</script>
|
||||
325
src/views/shop/list/components/payStatusCard.vue
Normal file
325
src/views/shop/list/components/payStatusCard.vue
Normal file
@@ -0,0 +1,325 @@
|
||||
<template>
|
||||
<div class="row mt14">
|
||||
<el-form label-width="150" label-position="left" v-loading="loading">
|
||||
<el-form-item label="信息来源" v-if="isHeadShop != 1">
|
||||
<el-radio-group :model-value="typeValue" @change="typeValueChange">
|
||||
<el-radio label="进件信息" :value="route.query.shopId"></el-radio>
|
||||
<el-radio label="复用主店信息" :value="route.query.mainId" v-if="mainInfo && mainInfo.shopId"></el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<template v-if="!form.shopId">
|
||||
<el-form-item label-width="0">
|
||||
<el-text>您还未申请进件</el-text>
|
||||
</el-form-item>
|
||||
<el-form-item label-width="0">
|
||||
<el-button type="primary" @click="toApplyment">去申请</el-button>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-form-item label="商户号">
|
||||
<el-text>{{ form.merchantCode }}</el-text>
|
||||
</el-form-item>
|
||||
<el-form-item label="商户类型">
|
||||
<el-text>{{ userTypeListFilter(form.userType).label }}</el-text>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付宝进件状态">
|
||||
<div class="column">
|
||||
<el-text :type="statusListFilter(form.alipayStatus).type">
|
||||
{{ statusListFilter(form.alipayStatus).label }}
|
||||
</el-text>
|
||||
<div class="center" v-if="form.alipayStatus == 'SIGN'">
|
||||
<el-text>待签约</el-text>
|
||||
<el-link type="primary" @click="singCodeDialogRef?.show(form.alipaySignUrl, 1)">查看签约码</el-link>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="微信进件状态">
|
||||
<div class="column">
|
||||
<el-text :type="statusListFilter(form.wechatStatus).type">
|
||||
{{ statusListFilter(form.wechatStatus).label }}
|
||||
</el-text>
|
||||
<div class="center" v-if="form.wechatStatus == 'SIGN'">
|
||||
<el-text>待签约</el-text>
|
||||
<el-link type="primary" @click="singCodeDialogRef?.show(form.wechatSignUrl, 2)">查看签约码</el-link>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="最后提交时间">
|
||||
<el-text>{{ form.updateTime }}</el-text>
|
||||
</el-form-item>
|
||||
<el-form-item label="创建时间">
|
||||
<el-text>{{ form.createTime }}</el-text>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="typeValue == shopId">
|
||||
<el-button link type="primary"
|
||||
v-if="form.wechatStatus == 'INIT' || form.wechatStatus == 'AUDIT' || form.wechatStatus == 'SIGN' || form.alipayStatus == 'INIT' || form.alipayStatus == 'AUDIT' || form.alipayStatus == 'SIGN'"
|
||||
@click="checkStatusHandle()">查询</el-button>
|
||||
<el-button type="primary" @click="toDetail('check')">查看详情</el-button>
|
||||
<el-button type="primary" @click="toDetail('editor')"
|
||||
v-if="form.alipayStatus == 'REJECTED' || form.wechatStatus == 'REJECTED'">修改</el-button>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-form>
|
||||
<singCodeDialog ref="singCodeDialogRef" />
|
||||
<!-- 分店复用主店信息弹窗 -->
|
||||
<el-dialog title="注意" width="400px" top="40vh" v-model="mainDialogVisable">
|
||||
<span>是否复用主店?</span>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="toApplymentRouter">自己申请</el-button>
|
||||
<el-button type="primary" @click="shopMerchantPutAjax" :loading="mainDialogVisableLoading">复用主店信息</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { shopMerchantGet, getMainMerchant, shopMerchantPut, entryManagerDetail } from '@/api/common'
|
||||
import singCodeDialog from '@/views/applyments/components/singCodeDialog.vue';
|
||||
|
||||
const singCodeDialogRef = ref(null)
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const shopId = ref(route.query.shopId)
|
||||
const userTypeList = ref([
|
||||
{
|
||||
value: '0',
|
||||
label: '个体商户'
|
||||
},
|
||||
{
|
||||
value: '1',
|
||||
label: '企业商户'
|
||||
},
|
||||
])
|
||||
function userTypeListFilter(userType) {
|
||||
let obj = userTypeList.value.find(item => item.value == userType)
|
||||
if (obj) {
|
||||
return obj
|
||||
} else {
|
||||
return {
|
||||
label: userType,
|
||||
value: userType
|
||||
}
|
||||
}
|
||||
}
|
||||
const statusList = ref([
|
||||
{
|
||||
value: 'WAIT',
|
||||
label: '待提交',
|
||||
type: 'info'
|
||||
},
|
||||
{
|
||||
value: 'INIT',
|
||||
label: '待处理',
|
||||
type: 'info'
|
||||
},
|
||||
{
|
||||
value: 'AUDIT',
|
||||
label: '待审核',
|
||||
type: 'warning'
|
||||
},
|
||||
{
|
||||
value: 'SIGN',
|
||||
label: '待签约',
|
||||
type: 'primary'
|
||||
},
|
||||
{
|
||||
value: 'FINISH',
|
||||
label: '已完成',
|
||||
type: 'success'
|
||||
},
|
||||
{
|
||||
value: 'REJECTED',
|
||||
label: '失败',
|
||||
type: 'danger'
|
||||
},
|
||||
])
|
||||
function statusListFilter(status) {
|
||||
let obj = statusList.value.find(item => item.value == status)
|
||||
if (obj) {
|
||||
return obj
|
||||
} else {
|
||||
return {
|
||||
label: status,
|
||||
value: status
|
||||
}
|
||||
}
|
||||
}
|
||||
const loading = ref(false)
|
||||
const form = ref({})
|
||||
|
||||
|
||||
// 查询状态
|
||||
async function checkStatusHandle() {
|
||||
try {
|
||||
loading.value = true
|
||||
const businessLicenceInfo = form.value.businessLicenceInfo
|
||||
await queryEntry({
|
||||
shopId: form.value.shopId,
|
||||
licenceNo: businessLicenceInfo.licenceNo
|
||||
})
|
||||
updateData()
|
||||
} catch (error) {
|
||||
loading.value = false
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取主店进件信息
|
||||
const mainInfo = ref({})
|
||||
async function headShopApplmentInfo() {
|
||||
try {
|
||||
if (route.query.mainId) {
|
||||
const res = await getMainMerchant({
|
||||
shopId: route.query.mainId
|
||||
})
|
||||
mainInfo.value = res
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
|
||||
// 跳转进件逻辑处理
|
||||
const mainDialogVisable = ref(false)
|
||||
const mainDialogVisableLoading = ref(false)
|
||||
const isHeadShop = ref(route.query.isHeadShop)
|
||||
async function toApplyment() {
|
||||
let shopType = route.query.shopType
|
||||
if (shopType == 'chain' || shopType == 'join') {
|
||||
if (isHeadShop == 1) {
|
||||
toApplymentRouter()
|
||||
} else {
|
||||
// 分店弹窗选择
|
||||
await headShopApplmentInfo()
|
||||
if (mainInfo.value && mainInfo.value.shopId) {
|
||||
mainDialogVisable.value = true
|
||||
} else {
|
||||
toApplymentRouter()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
toApplymentRouter()
|
||||
}
|
||||
}
|
||||
|
||||
// 跳转进件
|
||||
function toApplymentRouter() {
|
||||
router.push({ name: 'applyment_in', query: { shopId: shopId.value } });
|
||||
}
|
||||
|
||||
// 复用主店的进件信息
|
||||
async function shopMerchantPutAjax() {
|
||||
try {
|
||||
mainDialogVisableLoading.value = true
|
||||
await shopMerchantPut({
|
||||
shopId: shopId.value,
|
||||
relatedId: mainInfo.value.shopId,
|
||||
nativeMerchantDTO: {
|
||||
wechatMerchantId: mainInfo.value.wechatMerchantId,
|
||||
alipayMerchantId: mainInfo.value.alipayMerchantId,
|
||||
alipayAuthInfo: mainInfo.value.alipayAuthInfo
|
||||
}
|
||||
})
|
||||
ElNotification({
|
||||
title: '注意',
|
||||
message: '复用成功',
|
||||
type: 'success'
|
||||
})
|
||||
mainDialogVisable.value = false
|
||||
updateData()
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
mainDialogVisableLoading.value = false
|
||||
}
|
||||
|
||||
// 跳转编辑页面
|
||||
function toDetail(type) {
|
||||
const businessLicenceInfo = form.value.businessLicenceInfo
|
||||
router.push({
|
||||
name: 'applyment_in',
|
||||
query: {
|
||||
shopId: shopId.value,
|
||||
licenceNo: businessLicenceInfo.licenceNo,
|
||||
type: type
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 切换进件类型
|
||||
const typeValue = ref('')
|
||||
async function typeValueChange(e) {
|
||||
await ElMessageBox.confirm('确定要切换进件类型吗?', '注意').then(async () => {
|
||||
try {
|
||||
try {
|
||||
loading.value = true
|
||||
await shopMerchantPut({
|
||||
shopId: shopId.value,
|
||||
relatedId: e,
|
||||
})
|
||||
typeValue.value = e
|
||||
updateData()
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
loading.value = false
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}).catch(() => { })
|
||||
}
|
||||
|
||||
// 刷新进件数据
|
||||
async function updateData() {
|
||||
try {
|
||||
loading.value = true
|
||||
const res = await shopMerchantGet({
|
||||
shopId: shopId.value
|
||||
})
|
||||
|
||||
if (res && res.shopDirectMerchant) {
|
||||
form.value = res.shopDirectMerchant
|
||||
typeValue.value = res.relatedId
|
||||
} else {
|
||||
typeValue.value = shopId.value
|
||||
const applymentRes = await entryManagerDetail({ shopId: shopId.value })
|
||||
if (applymentRes && applymentRes.shopId) {
|
||||
form.value = applymentRes
|
||||
} else {
|
||||
form.value = ''
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
updateData()
|
||||
headShopApplmentInfo()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.row {
|
||||
&.mt14 {
|
||||
margin-top: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
gap: 14px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
</style>
|
||||
@@ -25,7 +25,7 @@
|
||||
<el-button type="primary" icon="plus" @click="addShopShow">添加店铺</el-button>
|
||||
</div>
|
||||
<div class="head-container">
|
||||
<el-table v-loading="state.tableData.loading" :data="state.tableData.list">
|
||||
<el-table v-loading="state.tableData.loading" :data="state.tableData.list" stripe border>
|
||||
<el-table-column label="店铺信息" width="200">
|
||||
<template v-slot="scope">
|
||||
<div class="shop_info">
|
||||
@@ -57,23 +57,25 @@
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="登录账号" prop="phone"></el-table-column>
|
||||
<el-table-column prop="registerType" label="经营模式">
|
||||
<template v-slot="scope">
|
||||
<span v-if="scope.row.registerType == 'before'">快餐版</span>
|
||||
<span v-if="scope.row.registerType == 'after'">餐饮版</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="address" label="商户号" />
|
||||
<el-table-column prop="status" label="店铺类型" align="center">
|
||||
<template v-slot="scope">
|
||||
<div>
|
||||
<span v-if="scope.row.shopType == 'only'">单店</span>
|
||||
<span v-if="scope.row.shopType == 'chain'">连锁店</span>
|
||||
<span v-if="scope.row.shopType == 'join'">加盟店</span>
|
||||
<div v-if="scope.row.shopType != 'only'&&scope.row.isHeadShop == 0">(主店:{{ scope.row.headShopName }})</div>
|
||||
<div v-if="scope.row.shopType != 'only' && scope.row.isHeadShop == 0">(主店:{{ scope.row.headShopName }})
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="address" label="商户号" />
|
||||
<el-table-column prop="status" label="店铺状态">
|
||||
<template v-slot="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0" disabled />
|
||||
@@ -113,7 +115,7 @@
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item v-if="scope.row.isHeadShop == 1" :command="0">添加分店</el-dropdown-item>
|
||||
<el-dropdown-item :command="{ row: scope.row, command: 1 }">
|
||||
三方配置
|
||||
支付配置
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item :command="2">续费记录</el-dropdown-item>
|
||||
<el-dropdown-item :command="3">前往店铺</el-dropdown-item>
|
||||
@@ -132,7 +134,7 @@
|
||||
layout="total, sizes , prev, pager ,next, jumper " @current-change="paginationChange" />
|
||||
</div>
|
||||
<addShop ref="refAddShop" @success="getTableData" />
|
||||
<detailModal ref="refDetailModal" />
|
||||
<!-- <detailModal ref="refDetailModal" /> -->
|
||||
<!-- 激活码 -->
|
||||
<activateCode ref="refActivateCode" @success="getTableData" />
|
||||
</div>
|
||||
@@ -145,6 +147,10 @@ import ShopApi from "@/api/account/shop";
|
||||
import { ElNotification, ElMessageBox } from "element-plus";
|
||||
import addShop from "./components/addShop.vue";
|
||||
import detailModal from "./components/detailModal.vue";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
const refActivateCode = ref(null);
|
||||
function activateCodeShow(row) {
|
||||
refActivateCode.value.open(row);
|
||||
@@ -186,12 +192,24 @@ function dropdownClick(e, row) {
|
||||
console.log(e);
|
||||
console.log(row);
|
||||
if (e == 0) {
|
||||
refAddShop.value.show({mainId:row.id,shopType:row.shopType,isHeadShop:0},'addBranch');
|
||||
refAddShop.value.show({ mainId: row.id, shopType: row.shopType, isHeadShop: 0 }, 'addBranch');
|
||||
|
||||
return;
|
||||
}
|
||||
if (e.command == 1) {
|
||||
refDetailModal.value.show(e.row);
|
||||
console.log('row===', row);
|
||||
|
||||
// refDetailModal.value.show(e.row);
|
||||
router.push({
|
||||
name: 'pay_setting',
|
||||
query: {
|
||||
shopId: row.id,
|
||||
shopType: row.shopType,
|
||||
isHeadShop: row.isHeadShop,
|
||||
mainId: row.mainId,
|
||||
shopName: row.shopName
|
||||
}
|
||||
})
|
||||
return;
|
||||
}
|
||||
if (e == 5) {
|
||||
|
||||
149
src/views/shop/list/pay_setting.vue
Normal file
149
src/views/shop/list/pay_setting.vue
Normal file
@@ -0,0 +1,149 @@
|
||||
<!-- 支付配置页面 -->
|
||||
<template>
|
||||
<div class="gyq_container">
|
||||
<div class="header_wrap">
|
||||
<div class="left_btn" @click="router.back()">
|
||||
<el-icon size="22" color="#333">
|
||||
<Back />
|
||||
</el-icon>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="t">{{ route.query.shopName }} | 支付配置</div>
|
||||
<div class="intro">管理您的支付渠道和进件信息</div>
|
||||
</div>
|
||||
<div class="center">
|
||||
<el-text size="large">当前模式:</el-text>
|
||||
<el-radio-group size="large" :model-value="payModel" @change="handleRadioChange">
|
||||
<el-radio :label="item.label" :value="item.value" v-for="item in tabList" :key="item.value"></el-radio>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gyq_content row mt14">
|
||||
<tabHeader v-model="tabActiveIndex" :list="tabList" />
|
||||
<payStatusCard name="payStatusCard" key="payStatusCard" ref="payStatusCardRef" v-if="tabActiveIndex == 0" />
|
||||
<detailModal name="detailModal" key="detailModal" ref="detailModalRef" v-model="detail"
|
||||
v-if="tabActiveIndex == 1" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, watch, onMounted } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import detailModal from './components/detailModal.vue';
|
||||
import payStatusCard from './components/payStatusCard.vue';
|
||||
import { shopMerchantGet, shopMerchantPut } from '@/api/common'
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const payModel = ref('')
|
||||
const tabActiveIndex = ref(0)
|
||||
const tabList = ref([
|
||||
{
|
||||
label: '支付进件',
|
||||
value: 'native'
|
||||
},
|
||||
{
|
||||
label: '聚合支付',
|
||||
value: 'poly'
|
||||
}
|
||||
])
|
||||
|
||||
// 二次确认支付模式 更换支付模式
|
||||
async function handleRadioChange(value) {
|
||||
await ElMessageBox.confirm('确定要选择该模式吗?', '注意').then(async () => {
|
||||
try {
|
||||
await shopMerchantPut({
|
||||
shopId: route.query.shopId,
|
||||
channel: value
|
||||
})
|
||||
payModel.value = value
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}).catch(() => { })
|
||||
}
|
||||
|
||||
// 与子组件的form绑定
|
||||
const detail = ref({})
|
||||
async function shopMerchantGetAjax() {
|
||||
try {
|
||||
const res = await shopMerchantGet({ shopId: route.query.shopId })
|
||||
console.log('shopMerchantGetAjax===', res);
|
||||
if (res && res.shopId) {
|
||||
payModel.value = res.channel
|
||||
|
||||
if (res && res.polyMerchantDTO) {
|
||||
detail.value = res.polyMerchantDTO
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
shopMerchantGetAjax()
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.gyq_container {
|
||||
padding: 14px;
|
||||
|
||||
.gyq_content {
|
||||
padding: 14px;
|
||||
background-color: #fff;
|
||||
border-radius: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.row {
|
||||
&.mt14 {
|
||||
margin-top: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.header_wrap {
|
||||
background-color: #fff;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-right: 14px;
|
||||
|
||||
.left_btn {
|
||||
height: 73px;
|
||||
padding: 14px 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.info {
|
||||
flex: 1;
|
||||
padding: 14px 14px 14px 0;
|
||||
|
||||
.t {
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.intro {
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
.form {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -47,9 +47,9 @@
|
||||
{{ multiplyAndFormat(scope.row.amount || 0) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="积分" prop="accountPoints">
|
||||
<el-table-column label="积分" prop="pointBalance">
|
||||
<template #default="scope">
|
||||
{{ scope.row.accountPoints || 0 }}
|
||||
{{ scope.row.pointBalance || 0 }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="90" fixed="right">
|
||||
|
||||
@@ -220,6 +220,25 @@
|
||||
<popup-coupon ref="refCoupon" :user="carts.vipUser" @confirm="refCouponConfirm"></popup-coupon>
|
||||
<!-- 挂账 -->
|
||||
<chooseGuaZahng ref="refGuaZhang" :payMoney="currentpayMoney" @confirm="refGuaZhangConfirm"></chooseGuaZahng>
|
||||
<!-- 扫码等待用户支付转台查询 -->
|
||||
<el-dialog v-model="showCheckPayStauts" width="400" title="订单支付状态查询中..." :close-on-click-modal="false"
|
||||
:show-close="false">
|
||||
<div class="pay_status_content">
|
||||
<div class="loading" v-loading="checkPayStautsLoading" element-loading-text="用户支付中..."></div>
|
||||
<div class="btn">
|
||||
<el-button style="width: 100%" :disabled="!closeState" type="primary" @click="resetScanCode">
|
||||
<span v-if="!closeState">{{ closeStateTime }}秒后可重新扫码</span>
|
||||
<span v-else>重新扫码</span>
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="btn">
|
||||
<el-button style="width: 100%" :disabled="!closeState" @click="closeScanCode">
|
||||
<span v-if="!closeState">{{ closeStateTime }}秒后可关闭</span>
|
||||
<span v-else>关闭</span>
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -243,6 +262,7 @@ import discount from "./discount.vue";
|
||||
import { ElLoading } from "element-plus";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { BigNumber } from "bignumber.js";
|
||||
import { onUnmounted } from 'vue'
|
||||
|
||||
// 配置BigNumber精度
|
||||
BigNumber.set({
|
||||
@@ -439,11 +459,17 @@ async function pointsInit() {
|
||||
|
||||
// 保险取值
|
||||
const eq = pointsConfig?.equivalentPoints || 0;
|
||||
const maxRatio = pointsConfig?.maxDeductionRatio || 0;
|
||||
const rawMaxRatio = pointsConfig?.maxDeductionRatio || 0;
|
||||
// 兼容后端返回的百分比或小数两种形式:如果大于1,则视为百分比(如100表示100%),需除以100
|
||||
const maxRatio = rawMaxRatio > 1 ? rawMaxRatio / 100 : rawMaxRatio;
|
||||
const minPay = pointsConfig?.minPaymentAmount || 0;
|
||||
|
||||
// 计算当前订单可抵扣金额上限(元)
|
||||
// 使用“抵扣前实付金额”作为门槛判断(即把当前已应用的积分抵扣金额加回),
|
||||
// 避免在已经抵扣导致 finalPay 变小后错误地判定为不可用。
|
||||
let finalPay = Number(carts.orderCostSummary.finalPayAmount) || 0;
|
||||
const currentPointDeduction = Number(carts.orderCostSummary.pointDeductionAmount) || 0;
|
||||
const basePay = finalPay + currentPointDeduction;
|
||||
|
||||
const res = {
|
||||
usable: true,
|
||||
@@ -455,8 +481,9 @@ async function pointsInit() {
|
||||
unusableReason: "",
|
||||
};
|
||||
|
||||
// 如果订单实付低于最小使用门槛,则不可用
|
||||
if (finalPay <= 0 || (minPay > 0 && finalPay < minPay)) {
|
||||
// 如果订单实付低于最小使用门槛,则不可用(门槛仅作为启用条件)
|
||||
// 这里使用 basePay(抵扣前实付)进行判断,确保已填写积分后不会回退为不可用
|
||||
if (basePay <= 0 || (minPay > 0 && basePay < minPay)) {
|
||||
res.usable = false;
|
||||
res.unusableReason = `订单实付金额低于 ${minPay} 元,无法使用积分抵扣`;
|
||||
} else if (eq <= 0) {
|
||||
@@ -464,23 +491,22 @@ async function pointsInit() {
|
||||
res.unusableReason = `积分换算比例配置错误,无法使用积分抵扣`;
|
||||
} else {
|
||||
// 计算基于比例限制的最大抵扣金额(元)
|
||||
let maxByRatio = finalPay * maxRatio;
|
||||
// 保证抵扣后剩余金额 >= minPaymentAmount
|
||||
if (minPay > 0) {
|
||||
const allowed = finalPay - minPay;
|
||||
if (allowed <= 0) {
|
||||
res.usable = false;
|
||||
res.unusableReason = `抵扣后实付金额必须大于等于 ${minPay} 元,当前不可使用积分`;
|
||||
} else {
|
||||
maxByRatio = Math.min(maxByRatio, allowed);
|
||||
}
|
||||
}
|
||||
// 注意:此处不再减少 minPaymentAmount,minPaymentAmount 仅用作是否可用的门槛;
|
||||
// 真正的最大抵扣由 maxRatio(抵扣比例)与用户积分数量共同决定。
|
||||
// 计算基于比例限制的最大抵扣金额(元),基于抵扣前实付金额
|
||||
let maxByRatio = basePay * maxRatio;
|
||||
|
||||
if (res.usable) {
|
||||
// 可用积分上限(向下取整为 eq 的倍数)
|
||||
// 可用积分上限(按等价积分步长对齐到 eq 的倍数)
|
||||
const maxByMoney = Math.floor(maxByRatio * eq);
|
||||
const userPoints = carts.vipUser.pointBalance || 0;
|
||||
res.maxUsablePoints = Math.min(userPoints, maxByMoney);
|
||||
let computedMax = Math.min(userPoints, maxByMoney);
|
||||
// 对齐到等价积分步长,保证输入步长生效
|
||||
if (eq > 0) {
|
||||
computedMax = Math.floor(computedMax / eq) * eq;
|
||||
}
|
||||
res.maxUsablePoints = computedMax;
|
||||
console.debug("pointsInit debug:", { finalPay: finalPay, basePay: basePay, eq, rawMaxRatio, maxRatio, maxByMoney, userPoints, computedMax });
|
||||
// 最小抵扣积分为配置值或等于换算比
|
||||
res.minDeductionPoints = pointsConfig?.minDeductionPoints || eq;
|
||||
if (res.maxUsablePoints < res.minDeductionPoints) {
|
||||
@@ -498,8 +524,20 @@ async function pointsInit() {
|
||||
return res;
|
||||
}
|
||||
|
||||
// 如果可用则默认填充可用最大值,否则清零
|
||||
usePointsNumber.value = res.usable ? res.maxUsablePoints : 0;
|
||||
// 如果可用则默认填充可用最大值(对齐步长),否则清零
|
||||
if (res.usable) {
|
||||
// 计算默认填充值:基于抵扣前实付的比例上限与等价比计算需要的积分数
|
||||
const defaultMaxByMoney = Math.floor(basePay * res.maxDeductionRatio * res.equivalentPoints);
|
||||
let defaultPts = Math.min(res.maxUsablePoints || 0, defaultMaxByMoney || 0);
|
||||
if (res.equivalentPoints > 0) {
|
||||
defaultPts = Math.floor(defaultPts / res.equivalentPoints) * res.equivalentPoints;
|
||||
}
|
||||
// 最终确保不超过用户积分
|
||||
const userPts = carts.vipUser.pointBalance || 0;
|
||||
usePointsNumber.value = Math.min(defaultPts, userPts);
|
||||
} else {
|
||||
usePointsNumber.value = 0;
|
||||
}
|
||||
if (!res.usable) score.sel = -1;
|
||||
|
||||
return res;
|
||||
@@ -532,17 +570,15 @@ function pointsToMoney(val) {
|
||||
// 再次校验不超过允许的最大抵扣金额(基于比例或门槛)
|
||||
let finalPay = Number(carts.orderCostSummary.finalPayAmount) || 0;
|
||||
let maxByRatio = finalPay * cfg.maxDeductionRatio;
|
||||
if (cfg.minPaymentAmount > 0) {
|
||||
const allowed = finalPay - cfg.minPaymentAmount;
|
||||
if (allowed <= 0) {
|
||||
usePointsNumber.value = 0;
|
||||
carts.orderCostSummary.pointUsed = 0;
|
||||
carts.orderCostSummary.pointDeductionAmount = 0;
|
||||
return;
|
||||
}
|
||||
maxByRatio = Math.min(maxByRatio, allowed);
|
||||
// 对于单笔抵扣:若订单实付低于配置的最小门槛,则不可使用(作为启用条件)
|
||||
if (cfg.minPaymentAmount > 0 && finalPay < cfg.minPaymentAmount) {
|
||||
usePointsNumber.value = 0;
|
||||
carts.orderCostSummary.pointUsed = 0;
|
||||
carts.orderCostSummary.pointDeductionAmount = 0;
|
||||
return;
|
||||
}
|
||||
const maxAllowedMoney = new BigNumber(maxByRatio).decimalPlaces(2, BigNumber.ROUND_DOWN).toNumber();
|
||||
console.debug("pointsToMoney debug:", { finalPay, cfg, pts, money, maxByRatio, maxAllowedMoney });
|
||||
if (money > maxAllowedMoney) {
|
||||
// 调整积分到允许的最大金额对应的积分
|
||||
const allowedPts = Math.floor(maxAllowedMoney * cfg.equivalentPoints);
|
||||
@@ -735,7 +771,12 @@ async function payOrder(payType, isScan, guazhangren) {
|
||||
}
|
||||
carts.clear();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.log('payOrder===', error);
|
||||
// 启动状态查询
|
||||
if (error.code == 211) {
|
||||
showCheckPayStauts.value = true
|
||||
autoCheckOrder()
|
||||
}
|
||||
clearTimeout(payTimer);
|
||||
loading.close();
|
||||
}
|
||||
@@ -746,6 +787,102 @@ async function payOrder(payType, isScan, guazhangren) {
|
||||
}
|
||||
}
|
||||
|
||||
function clearAutoCheckOrder() {
|
||||
clearInterval(timer.value)
|
||||
timer.value = null
|
||||
}
|
||||
|
||||
// 关闭查询
|
||||
function closeScanCode() {
|
||||
showCheckPayStauts.value = false;
|
||||
reset()
|
||||
}
|
||||
|
||||
// 重新扫码
|
||||
function resetScanCode() {
|
||||
reset()
|
||||
showCheckPayStauts.value = false;
|
||||
clearInterval(timer.value)
|
||||
timer.value = null
|
||||
|
||||
clearInterval(closeStateTimer.value)
|
||||
closeStateTimer.value = null
|
||||
|
||||
setTimeout(() => {
|
||||
refScanPay.value.open(returnPayParams(), "scanCode")
|
||||
}, 500)
|
||||
}
|
||||
|
||||
const closeState = ref(false)
|
||||
const closeStateTime = ref(5);
|
||||
const closeStateTimer = ref(null)
|
||||
|
||||
function closeStateTimerFuc() {
|
||||
closeStateTimer.value = setInterval(() => {
|
||||
closeStateTime.value--
|
||||
if (closeStateTime.value <= 0) {
|
||||
clearInterval(closeStateTimer.value)
|
||||
closeStateTimer.value = null
|
||||
closeState.value = true
|
||||
}
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
// 自动查询订单状态
|
||||
const timer = ref(null)
|
||||
function autoCheckOrder() {
|
||||
closeStateTimerFuc()
|
||||
timer.value = setInterval(() => {
|
||||
// 开始锁单
|
||||
// goodsStore.isOrderLock({
|
||||
// table_code: table_code.value
|
||||
// }, 'pay_lock')
|
||||
checkPayStauts(false)
|
||||
}, 2000)
|
||||
}
|
||||
|
||||
function reset() {
|
||||
checkPayStautsLoading.value = true;
|
||||
closeState.value = false
|
||||
closeStateTime.value = 5
|
||||
}
|
||||
|
||||
// 查询订单支付状态
|
||||
const showCheckPayStauts = ref(false)
|
||||
const checkPayStautsLoading = ref(true)
|
||||
async function checkPayStauts(tips = true) {
|
||||
try {
|
||||
// 扫码下单
|
||||
const res = await payApi.queryOrderStatus({ orderId: props.orderInfo.id });
|
||||
if (res == "done") {
|
||||
// 支付成功,解锁订单
|
||||
// await goodsStore.isOrderLock({
|
||||
// table_code: table_code.value
|
||||
// }, 'pay_unlock')
|
||||
|
||||
// userPayWait.value = false
|
||||
checkPayStautsLoading.value = false;
|
||||
// scanCode.value = "";
|
||||
showCheckPayStauts.value = false;
|
||||
clearAutoCheckOrder()
|
||||
paysuccess();
|
||||
return;
|
||||
}
|
||||
if (res == "unpaid") {
|
||||
if (tips) {
|
||||
ElMessage.warning("用户支付中...");
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
clearAutoCheckOrder()
|
||||
ElMessage.warning(res.msg || '');
|
||||
return;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
|
||||
function paysuccess() {
|
||||
clearTimeout(payTimer);
|
||||
ElMessage.success("支付成功");
|
||||
@@ -806,6 +943,10 @@ watch(
|
||||
}
|
||||
);
|
||||
|
||||
onUnmounted(() => {
|
||||
clearAutoCheckOrder()
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
carts.payParamsInit();
|
||||
getPaytype();
|
||||
@@ -858,9 +999,13 @@ defineExpose({
|
||||
.order-info {
|
||||
font-size: 14px;
|
||||
|
||||
.title {}
|
||||
.title {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.value {}
|
||||
.value {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.price {
|
||||
color: #fa5555;
|
||||
@@ -879,4 +1024,30 @@ defineExpose({
|
||||
color: #666;
|
||||
padding: 8px 10px 8px 20px;
|
||||
}
|
||||
|
||||
.pay_status_content {
|
||||
flex: 1;
|
||||
padding: 0 var(--el-font-size-base);
|
||||
height: 400px;
|
||||
padding-bottom: 100px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.loading {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
--el-loading-spinner-size: 100px;
|
||||
|
||||
:deep(.el-loading-text) {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn {
|
||||
width: 200px;
|
||||
padding-top: var(--el-font-size-base);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -2,12 +2,8 @@
|
||||
<el-dialog width="400px" :title="title" v-model="show" @close="reset">
|
||||
<div class="u-p-15">
|
||||
<div v-if="openSwitch" class="u-m-b-20">
|
||||
<el-button
|
||||
@click="changeKey('paysSel', index)"
|
||||
v-for="(item, index) in pays"
|
||||
:key="index"
|
||||
:type="paysSel == index ? 'primary' : ''"
|
||||
>
|
||||
<el-button @click="changeKey('paysSel', index)" v-for="(item, index) in pays" :key="index"
|
||||
:type="paysSel == index ? 'primary' : ''">
|
||||
{{ item.text }}
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -21,13 +17,8 @@
|
||||
<el-input :value="form.money" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="付款码">
|
||||
<el-input
|
||||
v-model="form.code"
|
||||
@change="codeInputChange"
|
||||
autofocus
|
||||
placeholder="请扫码或者输入付款码"
|
||||
ref="refInputCode"
|
||||
></el-input>
|
||||
<el-input v-model="form.code" @change="inputChange" autofocus placeholder="请扫码或者输入付款码"
|
||||
ref="refInputCode"></el-input>
|
||||
</el-form-item>
|
||||
<div class="u-flex u-row-center u-m-t-50">
|
||||
<el-button @click="close">取消</el-button>
|
||||
@@ -46,7 +37,9 @@
|
||||
</div>
|
||||
<div class="color-333 u-font-20 u-m-t-20">{{ form.money }}元</div>
|
||||
<div class="color-aaa u-font-12 u-m-t-10">
|
||||
<el-icon class="loading-ani"><Loading /></el-icon>
|
||||
<el-icon class="loading-ani">
|
||||
<Loading />
|
||||
</el-icon>
|
||||
<span>等待用户支付</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -55,7 +48,8 @@
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script>
|
||||
<script>
|
||||
import _ from 'lodash'
|
||||
import QRCode from "qrcode";
|
||||
import orderApi from "@/api/order/order";
|
||||
import payApi from "@/api/order/pay";
|
||||
@@ -128,6 +122,9 @@ export default {
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
inputChange: _.debounce(function (e) {
|
||||
this.confirm();
|
||||
}, 100),
|
||||
to2(n) {
|
||||
return n.toFixed(2);
|
||||
},
|
||||
@@ -175,7 +172,6 @@ export default {
|
||||
changeKey(key, val) {
|
||||
this[key] = val;
|
||||
},
|
||||
|
||||
confirm() {
|
||||
if (!this.form.code) {
|
||||
return ElMessage.error("请输入或扫付款码");
|
||||
@@ -239,14 +235,15 @@ export default {
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.codeImg {
|
||||
width: 164px;
|
||||
border: 1px solid rgb(220, 223, 230);
|
||||
height: 164px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@keyframes rotating {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
@@ -258,6 +255,7 @@ export default {
|
||||
transform: rotate(1turn);
|
||||
}
|
||||
}
|
||||
|
||||
.loading-ani {
|
||||
animation: rotating 2s linear infinite;
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ const contentConfig: IContentConfig<any> = {
|
||||
{
|
||||
label: "消费次数累计",
|
||||
align: "center",
|
||||
prop: "consumeAmount",
|
||||
prop: "consumeCount",
|
||||
},
|
||||
{
|
||||
label: "注册时间",
|
||||
|
||||
Reference in New Issue
Block a user