Files
cashier_app/pagesShops/pay-config/pay-config.vue
2026-01-17 09:40:26 +08:00

638 lines
18 KiB
Vue

<template>
<view class="min-page bg-f7 u-font-28">
<template v-if="loadingFinish">
<up-form :model="form" :rules="rules" ref="refForm" label-width="auto" label-position="top"
errorType="toast" :label-style="labelStyle">
<view class="container">
<up-form-item label="当前模式">
<up-radio-group v-model="form.channel">
<up-radio v-for="(value,key) in channels" :key="key" :name="key" :label="value"></up-radio>
</up-radio-group>
</up-form-item>
<template v-if="form.channel=='native'">
<up-form-item label="使用信息"
v-if="shopInfo.shopType!='only'&& !shopInfo.isHeadShop && mainEntryManagerRes">
<up-radio-group v-model="useInfo">
<up-radio v-for="(value,key) in useInfos" :key="key" :name="key*1"
:label="value"></up-radio>
</up-radio-group>
</up-form-item>
</template>
</view>
<template v-if="form.channel=='poly'">
<view class="container">
<up-form-item label="店铺id" prop="polyMerchantDTO.storeId"
:required="returnIsRequired('polyMerchantDTO.storeId')">
<up-input v-model="form.polyMerchantDTO.storeId"></up-input>
</up-form-item>
<up-form-item label="商户名称" prop="polyMerchantDTO.merchantName"
:required="returnIsRequired('polyMerchantDTO.merchantName')">
<up-input v-model="form.polyMerchantDTO.merchantName"></up-input>
</up-form-item>
<up-form-item label="商户应用id" prop="polyMerchantDTO.appId"
:required="returnIsRequired('polyMerchantDTO.appId')">
<up-input v-model="form.polyMerchantDTO.appId"></up-input>
</up-form-item>
<up-form-item label="商户密钥" prop="polyMerchantDTO.appSecret"
:required="returnIsRequired('polyMerchantDTO.appSecret')">
<up-input v-model="form.polyMerchantDTO.appSecret"></up-input>
</up-form-item>
<!-- <up-form-item label="支付密码" prop="polyMerchantDTO.payPassword"
:required="returnIsRequired('polyMerchantDTO.payPassword')">
<up-input v-model="form.polyMerchantDTO.payPassword"></up-input>
</up-form-item> -->
</view>
</template>
<template v-else>
<template v-if="useInfo==0">
<template v-if="entryManagerRes">
<view class="container container1">
<view class="u-flex u-row-between">
<text class="font-bold">商户号</text>
<text class="">{{entryManagerRes.merchantCode}}</text>
</view>
<view class="u-flex u-row-between u-m-t-24">
<text class="font-bold">商户类型</text>
<text class="">{{returnType(entryManagerRes.userType)}}</text>
</view>
<view class="status">
<view class="u-flex u-row-between ">
<text class="font-bold">支付宝进件状态</text>
<view class="state" :class="returnStatusClass(entryManagerRes.alipayStatus)">
{{returnStatusLabel(entryManagerRes.alipayStatus)}}
</view>
</view>
<view v-if="entryManagerRes.alipayStatus==='SIGN'" class="u-m-t-16">
<my-button @click="showCode(entryManagerRes,'aliPay')">查看签约码</my-button>
</view>
<view class="u-m-t-14" v-if="entryManagerRes.alipayErrorMsg">
<up-alert title="拒绝原因" type="error"
:description="entryManagerRes.alipayErrorMsg"></up-alert>
</view>
</view>
<view class="status">
<view class="">
<view class="u-flex u-row-between">
<text class="font-bold">微信进件状态</text>
<view class="state"
:class="returnStatusClass(entryManagerRes.wechatStatus)">
{{returnStatusLabel(entryManagerRes.wechatStatus)}}
</view>
</view>
<view v-if="entryManagerRes.wechatStatus==='SIGN'" class="u-m-t-16">
<my-button @click="showCode(entryManagerRes,'wx')">查看签约码</my-button>
</view>
</view>
<view class="u-m-t-14" v-if="entryManagerRes.wechatErrorMsg">
<up-alert title="拒绝原因" type="error"
:description="entryManagerRes.wechatErrorMsg"></up-alert>
</view>
</view>
<view class="u-flex u-row-between u-m-t-24">
<text class="font-bold">最后提交时间</text>
<text class="">{{entryManagerRes.updateTime}}</text>
</view>
<view class="u-flex u-row-between u-m-t-24">
<text class="font-bold">创建时间</text>
<text class="">{{entryManagerRes.createTime}}</text>
</view>
<view class="u-flex u-row-right gap-20 u-m-t-32">
<my-button @click="toEdit(entryManagerRes)">查看详情</my-button>
<my-button @click="toEdit(entryManagerRes)">修改</my-button>
</view>
</view>
</template>
<view class="container container1" v-if="!entryManagerRes">
<view class="color-red font-bold text-center">您还未申请进件</view>
<view class="u-m-t-32">
<my-button @click="toEdit()">去申请</my-button>
</view>
</view>
</template>
<template v-if="useInfo==1">
<view class="container container1">
<view class="u-flex u-row-between u-m-b-24">
<text class="font-bold">复用信息</text>
<up-tag type="primary" plain text="复用主店信息"></up-tag>
</view>
<view class="u-flex u-row-between">
<text class="font-bold">商户号</text>
<text class="">{{mainEntryManagerRes.merchantCode}}</text>
</view>
<view class="u-flex u-row-between u-m-t-24">
<text class="font-bold">商户类型</text>
<text class="">{{returnType(mainEntryManagerRes.userType)}}</text>
</view>
<view class="status">
<view class="u-flex u-row-between ">
<text class="font-bold">支付宝进件状态</text>
<view class="state" :class="returnStatusClass(mainEntryManagerRes.alipayStatus)">
{{returnStatusLabel(mainEntryManagerRes.alipayStatus)}}
</view>
</view>
<view v-if="mainEntryManagerRes.alipayStatus==='SIGN'" class="u-m-t-16">
<my-button @click="showCode(mainEntryManagerRes,'aliPay')">查看签约码</my-button>
</view>
<view class="u-m-t-14" v-if="mainEntryManagerRes.alipayErrorMsg">
<up-alert title="拒绝原因" type="error"
:description="mainEntryManagerRes.alipayErrorMsg"></up-alert>
</view>
</view>
<view class="status">
<view class="">
<view class="u-flex u-row-between">
<text class="font-bold">微信进件状态</text>
<view class="state"
:class="returnStatusClass(mainEntryManagerRes.wechatStatus)">
{{returnStatusLabel(mainEntryManagerRes.wechatStatus)}}
</view>
</view>
<view v-if="mainEntryManagerRes.wechatStatus==='SIGN'" class="u-m-t-16">
<my-button @click="showCode(mainEntryManagerRes,'wx')">查看签约码</my-button>
</view>
</view>
<view class="u-m-t-14" v-if="mainEntryManagerRes.wechatErrorMsg">
<up-alert title="拒绝原因" type="error"
:description="mainEntryManagerRes.wechatErrorMsg"></up-alert>
</view>
</view>
<view class="u-flex u-row-between u-m-t-24">
<text class="font-bold">最后提交时间</text>
<text class="">{{mainEntryManagerRes.updateTime}}</text>
</view>
<view class="u-flex u-row-between u-m-t-24">
<text class="font-bold">创建时间</text>
<text class="">{{mainEntryManagerRes.createTime}}</text>
</view>
</view>
</template>
</template>
<!-- <up-form-item label="微信appid" prop="polyMerchantDTO.wechatSmallAppid"
:required="returnIsRequired('polyMerchantDTO.wechatSmallAppid')">
<up-input v-model="form.polyMerchantDTO.wechatSmallAppid"></up-input>
</up-form-item>
<up-form-item label="微信支付宝appid" prop="polyMerchantDTO.alipaySmallAppid"
:required="returnIsRequired('polyMerchantDTO.alipaySmallAppid')">
<up-input v-model="form.polyMerchantDTO.alipaySmallAppid"></up-input>
</up-form-item> -->
</up-form>
<up-popup :show="codeShow" mode="center" @close="codeShow=false" round="16rpx"
:close-on-click-overlay="true">
<view style="border-radius: 16rpx;overflow: hidden;" class="u-p-b-30">
<up-image width="200" height="200" :src="code"></up-image>
<view class="u-m-t-0 text-center" v-if="codeType=='wx'">请打开微信扫码</view>
<view class="u-m-t-0 text-center" v-if="codeType=='aliPay'">请打开支付宝扫码</view>
</view>
</up-popup>
<my-bottom-btn-group @cancel="uni.navigateBack()" @save="submit"></my-bottom-btn-group>
</template>
<my-page-loading v-else></my-page-loading>
</view>
</template>
<script setup>
import {
reactive,
ref,
watch
} from 'vue'
import {
companyChildTypes,
userTypes,
statusList
} from '@/commons/data/entryManager.js'
import * as shopMerchantApi from '@/http/api/order/shopMerchant.js'
import {
getEntryManager
} from '@/http/api/order/entryManager.js'
import {
channels
} from '../data.js'
import {
onLoad
} from '@dcloudio/uni-app'
import * as shopInfoApi from '@/http/api/account/shopInfo.js'
const useInfo = ref(0)
const useInfos = {
0: '当前店铺',
1: '主店'
}
function toEdit(shop) {
console.log(shop)
if (shop) {
uni.navigateTo({
url: '/entryManager/add/add?shopId=' + shop.shopId + '&licenceNo=' + shop.businessLicenceInfo
.licenceNo
})
} else {
return uni.navigateTo({
url: '/entryManager/add/add?shopId=' + query.shopId
})
// if (mainEntryManagerRes.value) {
// uni.showModal({
// title: '提示',
// content: '是否复用主店信息',
// showCancel: true,
// cancelText: '复用主店信息',
// confirmText: '继续进件',
// success(res) {
// if (res.confirm) {
// uni.navigateTo({
// url: '/entryManager/add/add?shopId=' + query.shopId
// })
// } else {
// mainEntryManagerRes = mainEntryManagerRes.value
// }
// }
// })
// return
// } else {
// uni.navigateTo({
// url: '/entryManager/add/add?shopId=' + query.shopId
// })
// }
}
}
const code = ref('')
const codeShow = ref(false)
const codeType = ref('')
function returnStatusLabel(state) {
const item = statusList.find(v => v.value == state)
if (item) {
return item.name
}
return ''
}
function returnIsRequired(key) {
if (rules[key] && rules[key].required) {
return true
}
return false
}
function returnType(type) {
if (userTypes[type]) {
return userTypes[type]
}
return ''
}
function showCode(item, type) {
if (type == 'wx') {
code.value = item.wechatSignUrl
}
if (type == 'aliPay') {
code.value = item.alipaySignUrl
}
codeType.value = type
codeShow.value = true
}
function returnStatusClass(state) {
const item = statusList.find(v => v.value == state)
if (item) {
return item.class
}
return ''
}
const labelStyle = {
fontWeight: "700"
}
const query = reactive({
shopId: ''
})
const rules = reactive({
"polyMerchantDTO.merchantName": {
type: 'string',
required: true,
message: '请输入商户名称',
trigger: ['blur', 'change'],
},
"polyMerchantDTO.storeId": {
type: 'string',
required: true,
message: '请输入店铺id',
trigger: ['blur', 'change'],
},
"polyMerchantDTO.appId": {
type: 'string',
required: true,
message: '请输入商户应用id',
trigger: ['blur', 'change'],
},
"polyMerchantDTO.appSecret": {
type: 'string',
required: true,
message: '请输入商户密钥',
trigger: ['blur', 'change'],
},
// "polyMerchantDTO.payPassword": {
// type: 'string',
// required: true,
// message: '请输入支付密钥',
// trigger: ['blur', 'change'],
// },
// "polyMerchantDTO.wechatSmallAppid": {
// type: 'string',
// required: true,
// message: '请输入微信小程序appid',
// trigger: ['blur', 'change'],
// },
// "polyMerchantDTO.alipaySmallAppid": {
// type: 'string',
// required: true,
// message: '请输入支付宝小程序appid',
// trigger: ['blur', 'change'],
// }
})
const form = reactive({
shopId: 0,
channel: "native",
relatedId: "",
nativeMerchantDTO: {
wechatMerchantId: "",
alipayMerchantId: "",
alipayAuthInfo: {
user_id: "",
open_id: "",
auth_app_id: "",
app_auth_token: "",
expires_in: "",
app_refresh_token: "",
re_expires_in: "",
order_no: "",
},
},
polyMerchantDTO: {
storeId: "",
merchantName: "",
appId: "",
appSecret: "",
payPassword: "",
wechatSmallAppid: "",
alipaySmallAppid: "",
},
shopDirectMerchant: {
shopId: 0,
shopName: "",
licenceNo: "",
alipayAccount: "",
merchantCode: "",
userType: "",
shortName: "",
merchantBaseInfo: "",
legalPersonInfo: "",
businessLicenceInfo: "",
storeInfo: "",
settlementInfo: "",
createTime: "",
updateTime: "",
errorMsg: "",
wechatApplyId: "",
wechatStatus: "",
wechatErrorMsg: "",
wechatSignUrl: "",
alipayOrderId: "",
alipayStatus: "",
alipayErrorMsg: "",
alipaySignUrl: "",
alipayAuthInfo: "",
wechatMerchantId: "",
alipayMerchantId: "",
},
});
const refForm = ref(null)
const entryManagerRes = ref(null)
const mainEntryManagerRes = ref(null)
const shopInfo = ref(null)
const shopMerchant = ref(null)
async function init() {
const shopInfoRes = await shopInfoApi.getShopDetail({
id: query.shopId
})
shopInfo.value = shopInfoRes
//不是单店且不是主店
if (shopInfoRes && shopInfo.shopType != 'only' && !shopInfoRes.isHeadShop) {
const res = await shopMerchantApi.getMainMerchant({
shopId: query.shopId
})
mainEntryManagerRes.value = res
}
const res = await getEntryManager({
shopId: query.shopId
})
entryManagerRes.value = res
shopMerchantApi.shopMerchant({
shopId: query.shopId
}).then(res => {
if (res) {
if (res.shopDirectMerchant) {
useInfo.value = 1
} else {
useInfo.value = 0
}
shopMerchant.value = res
if (res.relatedId == shopInfo.value.id) {
useInfo.value = 0
}
if (mainEntryManagerRes.value && res.relatedId == mainEntryManagerRes.value.shopId) {
useInfo.value = 1
}
Object.assign(form, res)
}
loadingFinish.value = true
})
}
const loadingFinish = ref(false)
onLoad((opt) => {
query.shopId = opt.shopId
form.shopId = opt.shopId
init()
})
async function save() {
let res = null
if (form.channel == 'poly') {
res = await shopMerchantApi.editShopMerchant({
shopId: form.shopId,
channel: form.channel,
relatedId:shopInfo.value.id,
polyMerchantDTO: {
storeId: form.polyMerchantDTO.storeId,
merchantName: form.polyMerchantDTO.merchantName,
appId: form.polyMerchantDTO.appId,
appSecret: form.polyMerchantDTO.appSecret,
}
})
} else {
if (useInfo.value == 1) {
//使用主店
}
res = await shopMerchantApi.editShopMerchant({
shopId: form.shopId,
channel: form.channel,
relatedId: useInfo.value == 1 ? mainEntryManagerRes.value.shopId : query.shopId,
// nativeMerchantDTO: {
// wechatMerchantId: form.nativeMerchantDTO.wechatMerchantId,
// alipayMerchantId: form.nativeMerchantDTO.alipayMerchantId,
// alipayAuthInfo: {
// user_id: form.nativeMerchantDTO.alipayAuthInfo.user_id,
// open_id: form.nativeMerchantDTO.alipayAuthInfo.open_id,
// auth_app_id: form.nativeMerchantDTO.alipayAuthInfo.auth_app_id,
// app_auth_token: form.nativeMerchantDTO.alipayAuthInfo.app_auth_token,
// expires_in: form.nativeMerchantDTO.alipayAuthInfo.expires_in,
// app_refresh_token: form.nativeMerchantDTO.alipayAuthInfo.app_refresh_token,
// re_expires_in: form.nativeMerchantDTO.alipayAuthInfo.re_expires_in,
// order_no: form.nativeMerchantDTO.alipayAuthInfo.order_no,
// }
// }
})
}
if (res) {
uni.$u.toast('保存成功')
setTimeout(() => {
uni.navigateBack()
}, 1000)
}
}
function submit() {
if (useInfo.value == 0 && form.channel == 'native' && !entryManagerRes.value) {
return uni.$u.toast('您还未申请进件,清先申请进件')
}
refForm.value.validate().then(valid => {
console.log('valid', valid);
if (valid) {
// uni.$u.toast('校验通过')
save()
} else {}
}).catch(() => {
// 处理验证错误
});
}
watch(() => form.channel, (newval) => {
for (let key in rules) {
console.log('key', key)
rules[key].required = newval == 'poly' ? true : false;
}
if (newval == 'poly') {
form.polyMerchantDTO =shopMerchant.value.polyMerchantDTO|| {
storeId: "",
merchantName: "",
appId: "",
appSecret: "",
payPassword: "",
wechatSmallAppid: "",
alipaySmallAppid: "",
}
}
})
watch(() => useInfo.value, (newval) => {
console.log('newval', newval);
if (newval) {
} else {
}
})
</script>
<style lang="scss" scoped>
.min-page {
padding: 32rpx 28rpx;
}
.container {
background-color: #fff;
padding: 12rpx 28rpx;
border-radius: 16rpx;
margin-bottom: 32rpx;
&.container1 {
padding: 32rpx 28rpx;
}
}
:deep(.input-placeholder) {
font-size: 28rpx;
}
:deep(.u-form-item__body) {
padding: 10px 0 0 0;
}
.status {
margin-top: 24rpx;
background-color: #f7f7f7;
padding: 24rpx 28rpx;
border-radius: 4rpx;
.state {
padding: 8rpx 18rpx;
border-radius: 8rpx;
border: 2rpx solid #333;
&.success {
border-color: rgba(123, 209, 54, 1);
color: rgba(123, 209, 54, 1);
background: rgba(123, 209, 54, 0.12);
}
&.warning {
border-color: rgba(255, 141, 40, 1);
color: rgba(255, 141, 40, 1);
background: rgba(255, 141, 40, 0.12);
}
&.error {
border-color: #FF1C1C;
color: #FF1C1C;
background: rgba(255, 28, 28, 0.18);
}
&.gray {
color: #bbb;
background-color: #f7f7f7;
border-color: #bbb;
}
}
}
:deep(.u-alert__content__desc) {
word-break: break-all;
}
</style>