进件代码调整,增加进件列表页面和筛选
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="min-page bg-f7 u-font-28 color-333">
|
<view class="min-page bg-f7 u-font-28 color-333">
|
||||||
<steps v-model="step" />
|
<steps v-model="step" @itemClick="stepItemClick" />
|
||||||
<view class="u-m-t-32">
|
<view class="u-m-t-32">
|
||||||
<basicInfo v-if="step==0" :data="form.merchantBaseInfo" :maxSize="maxSize"
|
<basicInfo v-if="step==0" :data="form.merchantBaseInfo" :maxSize="maxSize"
|
||||||
@update="update($event,'merchantBaseInfo')">
|
@update="update($event,'merchantBaseInfo')">
|
||||||
@@ -30,6 +30,17 @@
|
|||||||
import settlementInfo from './components/settlement-info.vue'
|
import settlementInfo from './components/settlement-info.vue'
|
||||||
import bottomBtnGroup from './components/bottom-btn-group.vue'
|
import bottomBtnGroup from './components/bottom-btn-group.vue'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
|
import {
|
||||||
|
onLoad
|
||||||
|
} from '@dcloudio/uni-app'
|
||||||
|
import {
|
||||||
|
rules,
|
||||||
|
isEmptyValue,
|
||||||
|
returnKey,
|
||||||
|
getNestedValue,
|
||||||
|
verifyValue,
|
||||||
|
verifyData
|
||||||
|
} from './data.js'
|
||||||
import {
|
import {
|
||||||
reactive,
|
reactive,
|
||||||
ref,
|
ref,
|
||||||
@@ -38,8 +49,8 @@
|
|||||||
computed
|
computed
|
||||||
} from 'vue';
|
} from 'vue';
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
"shopId": 0,
|
"shopId": '',
|
||||||
"merchantCode": "",
|
"merchantCode": '',
|
||||||
"merchantBaseInfo": {
|
"merchantBaseInfo": {
|
||||||
"userType": "0",
|
"userType": "0",
|
||||||
"shortName": "",
|
"shortName": "",
|
||||||
@@ -128,10 +139,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"settlementInfo": {
|
"settlementInfo": {
|
||||||
"settlementType": "",
|
"settlementType": "0",
|
||||||
"noLegalName": "",
|
"noLegalName": "",
|
||||||
"noLegalId": "",
|
"noLegalId": "",
|
||||||
"settlementCardType": "",
|
"settlementCardType": "21",
|
||||||
"settlementCardNo": "",
|
"settlementCardNo": "",
|
||||||
"settlementName": "",
|
"settlementName": "",
|
||||||
"bankMobile": "",
|
"bankMobile": "",
|
||||||
@@ -183,268 +194,257 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const maxSize = ref(2)
|
|
||||||
const step = ref(1)
|
|
||||||
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
addEntryManager
|
addEntryManager,
|
||||||
|
getEntryManager
|
||||||
} from '@/http/api/order/entryManager.js'
|
} from '@/http/api/order/entryManager.js'
|
||||||
|
onLoad((opt) => {
|
||||||
|
if (opt.licenceNo && opt.shopId) {
|
||||||
|
getEntryManager(opt).then(res => {
|
||||||
|
|
||||||
const rules = {
|
res.merchantBaseInfo.contactPersonIdEndDate = dayjs(res.merchantBaseInfo
|
||||||
merchantBaseInfo: {
|
.contactPersonIdEndDate).valueOf()
|
||||||
userType: {
|
res.merchantBaseInfo.contactPersonIdStartDate = dayjs(res.merchantBaseInfo
|
||||||
required: true,
|
.contactPersonIdStartDate).valueOf()
|
||||||
errorMsg: '请选择商户类型',
|
|
||||||
},
|
|
||||||
shortName: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写商户简称',
|
|
||||||
},
|
|
||||||
mccCode: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请选择行业类目',
|
|
||||||
},
|
|
||||||
alipayAccount: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写支付宝账号',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
legalPersonInfo: {
|
|
||||||
'idCardHandPic.url': {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请上传身份证手持图片',
|
|
||||||
},
|
|
||||||
'idCardFrontPic.url': {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请上传身份证正面图片',
|
|
||||||
},
|
|
||||||
'idCardBackPic.url': {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请上传身份证反面图片',
|
|
||||||
},
|
|
||||||
legalPersonName: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人姓名',
|
|
||||||
},
|
|
||||||
legalPersonId: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人身份证号',
|
|
||||||
},
|
|
||||||
legalIdPersonStartDate: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人身份证开始日期',
|
|
||||||
},
|
|
||||||
legalPersonIdEndDate: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人身份证到期日期',
|
|
||||||
},
|
|
||||||
legalPersonPhone: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人电话',
|
|
||||||
},
|
|
||||||
legalPersonEmail: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人邮箱',
|
|
||||||
},
|
|
||||||
legalGender: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人性别',
|
|
||||||
},
|
|
||||||
legalAddress: {
|
|
||||||
required: true,
|
|
||||||
errorMsg: '请填写法人地址',
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
res.legalPersonInfo.legalIdPersonStartDate = dayjs(res.legalPersonInfo
|
||||||
storeInfo: {
|
.legalIdPersonStartDate).valueOf()
|
||||||
mercProvCode: {
|
res.legalPersonInfo.legalPersonIdEndDate = dayjs(res.legalPersonInfo
|
||||||
required: true,
|
.legalPersonIdEndDate).valueOf()
|
||||||
errorMsg: '请选择归属地',
|
res.businessLicenceInfo.licenceStartDate = dayjs(res.businessLicenceInfo
|
||||||
},
|
.licenceStartDate).valueOf()
|
||||||
mercCityCode: {
|
res.businessLicenceInfo.licenceEndDate = dayjs(res.businessLicenceInfo
|
||||||
required: true,
|
.licenceEndDate).valueOf()
|
||||||
errorMsg: '请选择归属地',
|
|
||||||
},
|
|
||||||
mercAreaCode: {
|
Object.assign(form, res)
|
||||||
required: true,
|
})
|
||||||
errorMsg: '请选择归属地',
|
|
||||||
},
|
} else {
|
||||||
mercProv: {
|
// const data = uni.getStorageSync('entryManager_submit_data')
|
||||||
required: true,
|
// if (data) {
|
||||||
errorMsg: '请选择归属地',
|
// Object.assign(form, data)
|
||||||
},
|
// }
|
||||||
mercCity: {
|
form.shopId = opt.shopId || ''
|
||||||
required: true,
|
}
|
||||||
errorMsg: '请选择归属地',
|
|
||||||
},
|
watch(() => form, (newval) => {
|
||||||
mercArea: {
|
uni.setStorageSync('entryManager_submit_data', form)
|
||||||
required: true,
|
}, {
|
||||||
errorMsg: '请选择归属地',
|
deep: true,
|
||||||
},
|
immediate: true
|
||||||
businessAddress: {
|
})
|
||||||
required: true,
|
})
|
||||||
errorMsg: '请填写营业地址',
|
|
||||||
},
|
function returnSettlementInfoRule() {
|
||||||
'insidePic.url': {
|
let rule = {
|
||||||
required: true,
|
...rules.settlementInfo
|
||||||
errorMsg: '请上传经营场所内设照片',
|
}
|
||||||
},
|
if (form.settlementType * 1 == 0) {
|
||||||
'doorPic.url': {
|
rule = {
|
||||||
required: true,
|
...rule,
|
||||||
errorMsg: '请上传门头照',
|
'noLegalHandSettleAuthPic.url': {
|
||||||
},
|
required: true,
|
||||||
'cashierDeskPic.url': {
|
errorMsg: '请上传非法人手持结算授权书',
|
||||||
required: true,
|
},
|
||||||
errorMsg: '请上传收银台照片',
|
'noLegalSettleAuthPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传非法人结算授权书',
|
||||||
|
},
|
||||||
|
'noLegalIdCardFrontPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传非法人身份证正面',
|
||||||
|
},
|
||||||
|
'noLegalIdCardBackPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传非法人身份证反面',
|
||||||
|
},
|
||||||
|
noLegalName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写非法人姓名',
|
||||||
|
},
|
||||||
|
noLegalName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写非法人身份证号码',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (form.settlementCardType * 1 == 21) {
|
||||||
}
|
rule = {
|
||||||
|
'bankCardBackPic.url': {
|
||||||
function isEmptyValue(val) {
|
required: true,
|
||||||
if (val === '' || val === undefined || val === null) {
|
errorMsg: '请上传银行卡反面照片',
|
||||||
return true
|
}
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 解析属性路径,返回数组格式的路径片段
|
|
||||||
* @param {string} str - 属性路径(如 'userType' 或 'idCardHandPic.url')
|
|
||||||
* @returns {Array<string>} 属性路径片段数组(如 ['userType'] 或 ['idCardHandPic', 'url'])
|
|
||||||
*/
|
|
||||||
function returnKey(str) {
|
|
||||||
// 无论是否包含'.',都返回数组,方便后续统一处理
|
|
||||||
return str.includes('.') ? str.split('.') : [str];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据属性路径数组,安全获取对象的嵌套属性值
|
|
||||||
* @param {Object} obj - 目标对象(如 form.legalPersonInfo)
|
|
||||||
* @param {Array<string>} keyPath - 属性路径数组(如 ['idCardHandPic', 'url'])
|
|
||||||
* @returns {*} 嵌套属性的值(若路径不存在,返回 undefined)
|
|
||||||
*/
|
|
||||||
function getNestedValue(obj, keyPath) {
|
|
||||||
// 边界处理:obj不是对象,直接返回undefined
|
|
||||||
if (typeof obj !== 'object' || obj === null) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 逐层遍历属性路径,获取最终值
|
|
||||||
return keyPath.reduce((currentObj, key) => {
|
|
||||||
// 中间层级不存在,直接返回undefined,避免报错
|
|
||||||
if (currentObj === undefined || currentObj === null) {
|
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
return currentObj[key];
|
}
|
||||||
}, obj);
|
return rule
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function returnMerchantBaseInfoRule() {
|
||||||
|
let rule = rules.merchantBaseInfo
|
||||||
function verifyValue(val, ruleItem) {
|
if (form.merchantBaseInfo.contactPersonType == 'SUPER') {
|
||||||
const isEmpty = isEmptyValue(val)
|
rule = {
|
||||||
let result = {
|
...rule,
|
||||||
ispas: true,
|
'contactIdCardFrontPic.url': {
|
||||||
errorMsg: ''
|
required: true,
|
||||||
|
errorMsg: '请上传联系人身份证正面照片',
|
||||||
|
},
|
||||||
|
'contactIdCardBackPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传联系人身份证正面照片',
|
||||||
|
},
|
||||||
|
contactName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人姓名',
|
||||||
|
},
|
||||||
|
contactPersonId: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人身份证号',
|
||||||
|
},
|
||||||
|
contactPersonIdStartDate: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人身份证开始日期',
|
||||||
|
},
|
||||||
|
contactPersonIdEndDate: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人身份证到期日期',
|
||||||
|
},
|
||||||
|
contactPhone: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人电话',
|
||||||
|
},
|
||||||
|
contactAddr: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人通讯地址',
|
||||||
|
},
|
||||||
|
contactEmail: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写联系人邮箱',
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ruleItem.required) {
|
console.log('rule', rule);
|
||||||
|
return rule
|
||||||
|
}
|
||||||
|
const maxSize = ref(2)
|
||||||
|
const step = ref(0)
|
||||||
|
|
||||||
if (isEmpty) {
|
|
||||||
result.ispas = false
|
const ruleArr=['merchantBaseInfo','legalPersonInfo','businessLicenceInfo','storeInfo','settlementInfo']
|
||||||
result.errorMsg = ruleItem.errorMsg
|
function stepItemClick(newStep) {
|
||||||
|
|
||||||
|
const arr=ruleArr.slice(0,newStep-1)
|
||||||
|
let isPas = true
|
||||||
|
let result = null
|
||||||
|
for (let index in arr) {
|
||||||
|
const key=arr[index]
|
||||||
|
if (key == 'settlementInfo') {
|
||||||
|
result = verifyData(form[key], returnSettlementInfoRule())
|
||||||
|
} else if (key == 'merchantBaseInfo') {
|
||||||
|
result = verifyData(form[key], returnMerchantBaseInfoRule())
|
||||||
|
} else {
|
||||||
|
result = verifyData(form[key], rules[key])
|
||||||
|
}
|
||||||
|
if (!result.ispas) {
|
||||||
|
uni.showToast({
|
||||||
|
title: result.errorMsg || '请完善必填内容',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
result.step = index
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
step.value = newStep
|
||||||
}
|
}
|
||||||
|
|
||||||
function verifyData(data, rule) {
|
|
||||||
// 边界处理:data不是对象,直接返回校验失败(若有必填规则)
|
|
||||||
if (typeof data !== 'object' || data === null) {
|
function verifyForm(step = null) {
|
||||||
// 遍历规则,返回第一个必填项的错误信息
|
let result = {
|
||||||
for (let ruleKey in rule) {
|
ispas: true,
|
||||||
const ruleItem = rule[ruleKey];
|
errorMsg: '',
|
||||||
if (ruleItem.required) {
|
step: -1,
|
||||||
return {
|
}
|
||||||
ispas: false,
|
if (step != null) {
|
||||||
errorMsg: ruleItem.errorMsg || '数据格式错误,无法校验'
|
if (step == 0) {
|
||||||
};
|
result = verifyData(form.merchantBaseInfo, returnMerchantBaseInfoRule())
|
||||||
|
result.step = 0;
|
||||||
|
}
|
||||||
|
if (step == 1) {
|
||||||
|
result = verifyData(form.legalPersonInfo, rules.legalPersonInfo)
|
||||||
|
result.step = 1;
|
||||||
|
}
|
||||||
|
if (step == 2) {
|
||||||
|
result = verifyData(form.businessLicenceInfo, rules.businessLicenceInfo)
|
||||||
|
result.step = 2;
|
||||||
|
}
|
||||||
|
if (step == 3) {
|
||||||
|
result = verifyData(form.storeInfo, rules.storeInfo)
|
||||||
|
result.step = 3;
|
||||||
|
}
|
||||||
|
if (step == 4) {
|
||||||
|
result = verifyData(form.storeInfo, returnSettlementInfoRule())
|
||||||
|
result.step = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
let isPas = true
|
||||||
|
let errorMsg = '';
|
||||||
|
let result = null
|
||||||
|
let index = -1;
|
||||||
|
for (let key in rules) {
|
||||||
|
index++
|
||||||
|
if (key == 'settlementInfo') {
|
||||||
|
result = verifyData(form[key], returnSettlementInfoRule())
|
||||||
|
} else if (key == 'merchantBaseInfo') {
|
||||||
|
result = verifyData(form[key], returnMerchantBaseInfoRule())
|
||||||
|
} else {
|
||||||
|
result = verifyData(form[key], rules[key])
|
||||||
|
}
|
||||||
|
if (!result.ispas) {
|
||||||
|
uni.showToast({
|
||||||
|
title: errorMsg || '请完善必填内容',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
result.step = index
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
|
||||||
ispas: true,
|
|
||||||
errorMsg: ''
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let ruleKey in rule) {
|
return result;
|
||||||
const ruleItem = rule[ruleKey];
|
|
||||||
// 1. 获取属性路径数组(如 ['idCardHandPic', 'url'])
|
|
||||||
const keyPath = returnKey(ruleKey);
|
|
||||||
// 2. 安全获取嵌套属性值(核心:支持深层级属性)
|
|
||||||
const targetValue = getNestedValue(data, keyPath);
|
|
||||||
// 3. 校验属性值
|
|
||||||
const result = verifyValue(targetValue, ruleItem);
|
|
||||||
|
|
||||||
// 4. 校验失败,直接返回结果
|
|
||||||
if (!result.ispas) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
ispas: true,
|
|
||||||
errorMsg: ''
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveClick() {
|
function saveClick() {
|
||||||
if (step.value == 0) {
|
|
||||||
|
if (step.value == 4) {
|
||||||
const {
|
const {
|
||||||
ispas,
|
ispas,
|
||||||
errorMsg
|
errorMsg,
|
||||||
} = verifyData(form.merchantBaseInfo, rules.merchantBaseInfo)
|
step: errorStep
|
||||||
if (!ispas) {
|
} = verifyForm()
|
||||||
uni.showToast({
|
console.log(form.settlementInfo);
|
||||||
title: errorMsg || '请完善必填内容',
|
if (!ispas) {
|
||||||
icon: 'none'
|
uni.showToast({
|
||||||
})
|
title: errorMsg || '请完善必填内容',
|
||||||
return
|
icon: 'none'
|
||||||
}
|
})
|
||||||
}
|
step.value = errorStep
|
||||||
if (step.value == 1) {
|
return
|
||||||
const {
|
}
|
||||||
ispas,
|
}
|
||||||
errorMsg
|
if (step.value < 4) {
|
||||||
} = verifyData(form.legalPersonInfo, rules.legalPersonInfo)
|
const {
|
||||||
if (!ispas) {
|
ispas,
|
||||||
uni.showToast({
|
errorMsg,
|
||||||
title: errorMsg || '请完善必填内容',
|
step: errorStep
|
||||||
icon: 'none'
|
} = verifyForm(step.value)
|
||||||
})
|
console.log('ispas', ispas);
|
||||||
return
|
console.log('errorMsg', errorMsg);
|
||||||
}
|
console.log('errorStep', errorStep);
|
||||||
}
|
|
||||||
if (step.value == 2) {
|
|
||||||
const {
|
|
||||||
ispas,
|
|
||||||
errorMsg
|
|
||||||
} = verifyData(form.businessLicenceInfo, rules.businessLicenceInfo)
|
|
||||||
if (!ispas) {
|
|
||||||
uni.showToast({
|
|
||||||
title: errorMsg || '请完善必填内容',
|
|
||||||
icon: 'none'
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (step.value == 3) {
|
|
||||||
const {
|
|
||||||
ispas,
|
|
||||||
errorMsg
|
|
||||||
} = verifyData(form.storeInfo, rules.storeInfo)
|
|
||||||
if (!ispas) {
|
if (!ispas) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: errorMsg || '请完善必填内容',
|
title: errorMsg || '请完善必填内容',
|
||||||
@@ -453,16 +453,57 @@
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (step.value != 4) {
|
if (step.value != 4) {
|
||||||
step.value++
|
step.value++
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
addEntryManager(form)
|
|
||||||
|
const merchantBaseInfo = {
|
||||||
|
...form.merchantBaseInfo,
|
||||||
|
contactPersonIdEndDate: dayjs(form.merchantBaseInfo.contactPersonIdEndDate).format('YYY-MM-DD'),
|
||||||
|
contactPersonIdStartDate: dayjs(form.merchantBaseInfo.contactPersonIdStartDate).format('YYY-MM-DD'),
|
||||||
|
}
|
||||||
|
const legalPersonInfo = {
|
||||||
|
...form.legalPersonInfo,
|
||||||
|
legalIdPersonStartDate: dayjs(form.legalPersonInfo.legalIdPersonStartDate).format('YYYY-MM-DD'),
|
||||||
|
legalPersonIdEndDate: dayjs(form.legalPersonInfo.legalPersonIdEndDate).format('YYYY-MM-DD'),
|
||||||
|
}
|
||||||
|
const businessLicenceInfo = {
|
||||||
|
...form.businessLicenceInfo,
|
||||||
|
licenceStartDate: dayjs(form.businessLicenceInfo.licenceStartDate).format('YYYY-MM-DD'),
|
||||||
|
licenceEndDate: dayjs(form.businessLicenceInfo.licenceEndDate).format('YYYY-MM-DD'),
|
||||||
|
}
|
||||||
|
|
||||||
|
addEntryManager({
|
||||||
|
...form,
|
||||||
|
merchantBaseInfo,
|
||||||
|
legalPersonInfo,
|
||||||
|
businessLicenceInfo
|
||||||
|
}).then(res => {
|
||||||
|
if (res) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '提交成功',
|
||||||
|
})
|
||||||
|
uni.removeStorageSync('entryManager_submit_data')
|
||||||
|
setTimeout(() => {
|
||||||
|
uni.navigateBack()
|
||||||
|
}, 1000)
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: '提交失败',
|
||||||
|
icon: 'error'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
function cancelClick() {
|
function cancelClick() {
|
||||||
|
if (step.value == 0) {
|
||||||
|
return uni.navigateBack()
|
||||||
|
}
|
||||||
step.value--;
|
step.value--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,12 +513,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(() => form, (newval) => {
|
|
||||||
uni.setStorageSync('entryManager_submit_data', form)
|
|
||||||
}, {
|
|
||||||
deep: true,
|
|
||||||
immediate: true
|
|
||||||
})
|
|
||||||
const cancelText = computed(() => {
|
const cancelText = computed(() => {
|
||||||
if (step.value == 0) {
|
if (step.value == 0) {
|
||||||
return '返回'
|
return '返回'
|
||||||
@@ -491,10 +527,7 @@
|
|||||||
return '下一步'
|
return '下一步'
|
||||||
})
|
})
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// const data=uni.getStorageSync('entryManager_submit_data')
|
|
||||||
// if(data){
|
|
||||||
// Object.assign(form,data)
|
|
||||||
// }
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,10 @@
|
|||||||
|
|
||||||
const bankInstId = defineModel('bankInstId');
|
const bankInstId = defineModel('bankInstId');
|
||||||
|
|
||||||
|
|
||||||
|
const bankAliasCode=defineModel('bankAliasCode')
|
||||||
|
|
||||||
|
const wxProvinceCode=defineModel('wxProvinceCode')
|
||||||
|
|
||||||
|
|
||||||
const selid = ref('')
|
const selid = ref('')
|
||||||
@@ -86,6 +89,7 @@
|
|||||||
function submit() {
|
function submit() {
|
||||||
modelValue.value = selItem.value.bankAlias
|
modelValue.value = selItem.value.bankAlias
|
||||||
bankInstId.value = selItem.value.bankCode
|
bankInstId.value = selItem.value.bankCode
|
||||||
|
bankAliasCode.value=selItem.value.bankAliasCode;
|
||||||
console.log('modelValue', modelValue.value);
|
console.log('modelValue', modelValue.value);
|
||||||
console.log('bankInstId', bankInstId.value);
|
console.log('bankInstId', bankInstId.value);
|
||||||
show.value = false;
|
show.value = false;
|
||||||
@@ -105,6 +109,9 @@
|
|||||||
if (findShop) {
|
if (findShop) {
|
||||||
selid.value = 'shop_' + findShop.id
|
selid.value = 'shop_' + findShop.id
|
||||||
selItem.value = findShop
|
selItem.value = findShop
|
||||||
|
bankInstId.value = findShop.bankCode
|
||||||
|
bankAliasCode.value = findShop.bankAliasCode
|
||||||
|
wxProvinceCode.value=findShop.wxProvinceCode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,13 +47,13 @@
|
|||||||
</view>
|
</view>
|
||||||
|
|
||||||
<template v-if="form.contactPersonType=='SUPER'">
|
<template v-if="form.contactPersonType=='SUPER'">
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人身份证正面</view>
|
<view class="title"> 联系人身份证正面</view>
|
||||||
<my-upload-img v-model="form.contactIdCardFrontPic.url" :size="200"
|
<my-upload-img v-model="form.contactIdCardFrontPic.url" :size="200"
|
||||||
@uploadSuccess="uploadSuccess($event,'IdCard','contactIdCardFrontPic')"></my-upload-img>
|
@uploadSuccess="uploadSuccess($event,'IdCard','contactIdCardFrontPic')"></my-upload-img>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人身份证背面</view>
|
<view class="title"> 联系人身份证背面</view>
|
||||||
<my-upload-img v-model="form.contactIdCardBackPic.url" :size="200"
|
<my-upload-img v-model="form.contactIdCardBackPic.url" :size="200"
|
||||||
@uploadSuccess="uploadSuccess($event,'IdCard','contactIdCardBackPic')"></my-upload-img>
|
@uploadSuccess="uploadSuccess($event,'IdCard','contactIdCardBackPic')"></my-upload-img>
|
||||||
@@ -66,17 +66,17 @@
|
|||||||
</up-radio>
|
</up-radio>
|
||||||
</up-radio-group>
|
</up-radio-group>
|
||||||
</view> -->
|
</view> -->
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人姓名</view>
|
<view class="title"> 联系人姓名</view>
|
||||||
<up-input placeholder="联系人姓名" :placeholder-class="placeholderClass"
|
<up-input placeholder="联系人姓名" :placeholder-class="placeholderClass"
|
||||||
v-model="form.contactName"></up-input>
|
v-model="form.contactName"></up-input>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人身份证号</view>
|
<view class="title"> 联系人身份证号</view>
|
||||||
<up-input placeholder="联系人身份证号" :placeholder-class="placeholderClass"
|
<up-input placeholder="联系人身份证号" :placeholder-class="placeholderClass"
|
||||||
v-model="form.contactPersonId"></up-input>
|
v-model="form.contactPersonId"></up-input>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人身份证开始日期</view>
|
<view class="title"> 联系人身份证开始日期</view>
|
||||||
<up-datetime-picker hasInput :minDate="minDate" :maxDate="maxDate" format="YYYY-MM-DD"
|
<up-datetime-picker hasInput :minDate="minDate" :maxDate="maxDate" format="YYYY-MM-DD"
|
||||||
placeholder="请选择" v-model="form.contactPersonIdStartDate" mode="date">
|
placeholder="请选择" v-model="form.contactPersonIdStartDate" mode="date">
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人身份证到期日期</view>
|
<view class="title"> 联系人身份证到期日期</view>
|
||||||
<view class="u-m-b-16">
|
<view class="u-m-b-16">
|
||||||
<up-radio-group v-model="contactPersonIdEndDateType">
|
<up-radio-group v-model="contactPersonIdEndDateType">
|
||||||
@@ -100,19 +100,19 @@
|
|||||||
|
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item required ">
|
||||||
<view class="title"> 联系人电话</view>
|
<view class="title"> 联系人电话</view>
|
||||||
<up-input placeholder="联系人电话" :placeholder-class="placeholderClass"
|
<up-input placeholder="联系人电话" :placeholder-class="placeholderClass"
|
||||||
v-model="form.contactPhone"></up-input>
|
v-model="form.contactPhone"></up-input>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人通讯地址</view>
|
<view class="title"> 联系人通讯地址</view>
|
||||||
<up-input placeholder="联系人通讯地址" :placeholder-class="placeholderClass"
|
<up-input placeholder="联系人通讯地址" :placeholder-class="placeholderClass"
|
||||||
v-model="form.contactAddr"></up-input>
|
v-model="form.contactAddr"></up-input>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 联系人邮箱
|
<view class="title"> 联系人邮箱
|
||||||
</view>
|
</view>
|
||||||
<up-input placeholder="联系人邮箱" :placeholder-class="placeholderClass"
|
<up-input placeholder="联系人邮箱" :placeholder-class="placeholderClass"
|
||||||
@@ -266,7 +266,11 @@
|
|||||||
deep: true,
|
deep: true,
|
||||||
immediate: true
|
immediate: true
|
||||||
})
|
})
|
||||||
|
watch(()=>form.contactPersonIdEndDate,(newval)=>{
|
||||||
|
if(dayjs(newval).format('YYYY-MM-DD')==='2099-12-31'){
|
||||||
|
contactPersonIdEndDateType.value=2
|
||||||
|
}
|
||||||
|
})
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -169,6 +169,12 @@
|
|||||||
}, {
|
}, {
|
||||||
deep: true
|
deep: true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(()=>form.licenceEndDate,(newval)=>{
|
||||||
|
if(dayjs(newval).format('YYYY-MM-DD')==='2099-12-31'){
|
||||||
|
licenceEndDateType.value=2
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|||||||
@@ -251,6 +251,12 @@ import { includes } from 'lodash';
|
|||||||
}, {
|
}, {
|
||||||
deep: true
|
deep: true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(()=>form.legalPersonIdEndDate,(newval)=>{
|
||||||
|
if(dayjs(newval).format('YYYY-MM-DD')==='2099-12-31'){
|
||||||
|
endDateType.value=2
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<view>
|
<view>
|
||||||
<view class="u-font-32 font-bold u-m-32 text-center">结算信息</view>
|
<view class="u-font-32 font-bold u-m-32 text-center">结算信息</view>
|
||||||
<view class="container">
|
<view class="container">
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 结算类型</view>
|
<view class="title"> 结算类型</view>
|
||||||
<up-radio-group v-model="form.settlementType">
|
<up-radio-group v-model="form.settlementType">
|
||||||
<up-radio v-for="(value,key) in settlementTypes" :label="value" :name="key">
|
<up-radio v-for="(value,key) in settlementTypes" :label="value" :name="key">
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<view class="form-item ">
|
<view class="form-item required" >
|
||||||
<view class="title"> 结算卡类型</view>
|
<view class="title"> 结算卡类型</view>
|
||||||
<up-radio-group v-model="form.settlementCardType">
|
<up-radio-group v-model="form.settlementCardType">
|
||||||
<up-radio v-for="(value,key) in settlementCardTypes" :label="value" :name="key">
|
<up-radio v-for="(value,key) in settlementCardTypes" :label="value" :name="key">
|
||||||
@@ -80,35 +80,38 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="form-item required">
|
<view class="form-item required">
|
||||||
<view class="title"> 银行</view>
|
<view class="title"> 银行</view>
|
||||||
<bankSelect v-model="form.bankName" v-model:bankInstId="form.bankInstId"></bankSelect>
|
<bankSelect v-model="form.bankName" v-model:bankInstId="form.bankInstId"
|
||||||
|
v-model:wxProvinceCode="wxProvinceCode"
|
||||||
|
v-model:bankAliasCode="form.bankType"
|
||||||
|
></bankSelect>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item " v-if="pro_city_area&&form.bankName">
|
<view class="form-item " v-if="pro_city_area&&form.bankName">
|
||||||
<view class="title"> 支行</view>
|
<view class="title"> 支行</view>
|
||||||
<bankBranchList :query="bankBranchListQuery" v-model:bankBranchName="form.bankBranchName"
|
<bankBranchList :query="bankBranchListQuery" v-model:bankBranchName="form.bankBranchName"
|
||||||
v-model:bankBranchCode="form.bankBranchCode"></bankBranchList>
|
v-model:bankBranchCode="form.bankBranchCode"></bankBranchList>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 结算账户卡号</view>
|
<view class="title"> 结算账户卡号</view>
|
||||||
<up-input placeholder="结算账户卡号" :placeholder-class="placeholderClass"
|
<up-input placeholder="结算账户卡号" :placeholder-class="placeholderClass"
|
||||||
v-model="form.settlementCardNo"></up-input>
|
v-model="form.settlementCardNo"></up-input>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 结算账户户名</view>
|
<view class="title"> 结算账户户名</view>
|
||||||
<up-input placeholder="结算账户户名" :placeholder-class="placeholderClass"
|
<up-input placeholder="结算账户户名" :placeholder-class="placeholderClass"
|
||||||
v-model="form.settlementName"></up-input>
|
v-model="form.settlementName"></up-input>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item required">
|
||||||
<view class="title"> 结算银行预留手机号</view>
|
<view class="title"> 结算银行预留手机号</view>
|
||||||
<up-input placeholder="结算银行预留手机号" :placeholder-class="placeholderClass"
|
<up-input placeholder="结算银行预留手机号" :placeholder-class="placeholderClass"
|
||||||
v-model="form.bankMobile"></up-input>
|
v-model="form.bankMobile"></up-input>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<!-- <view class="form-item ">
|
||||||
<view class="title"> 开户行行别名称</view>
|
<view class="title"> 开户行行别名称</view>
|
||||||
<up-input placeholder="开户行行别名称" :placeholder-class="placeholderClass"
|
<up-input placeholder="开户行行别名称" :placeholder-class="placeholderClass"
|
||||||
v-model="form.bankName"></up-input>
|
v-model="form.bankName"></up-input>
|
||||||
</view>
|
</view> -->
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
<view class="form-item ">
|
<view class="form-item ">
|
||||||
<view class="title"> 开户行缩写</view>
|
<view class="title"> 开户行缩写</view>
|
||||||
<up-input placeholder="开户行缩写" :placeholder-class="placeholderClass"></up-input>
|
<up-input placeholder="开户行缩写" :placeholder-class="placeholderClass"></up-input>
|
||||||
@@ -117,7 +120,7 @@
|
|||||||
<view class="title"> 开户行编号
|
<view class="title"> 开户行编号
|
||||||
</view>
|
</view>
|
||||||
<up-input placeholder="开户行编号" :placeholder-class="placeholderClass" v-model="form.bankType"></up-input>
|
<up-input placeholder="开户行编号" :placeholder-class="placeholderClass" v-model="form.bankType"></up-input>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item ">
|
<view class="form-item ">
|
||||||
<view class="title"> 支行开户行行别名称
|
<view class="title"> 支行开户行行别名称
|
||||||
|
|
||||||
@@ -133,15 +136,17 @@
|
|||||||
<up-input placeholder="支行开户行编号" :placeholder-class="placeholderClass"
|
<up-input placeholder="支行开户行编号" :placeholder-class="placeholderClass"
|
||||||
v-model="form.bankBranchCode"></up-input>
|
v-model="form.bankBranchCode"></up-input>
|
||||||
</view>
|
</view>
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<template v-if="form.settlementCardType*1==21">
|
||||||
|
<view class="form-item required">
|
||||||
|
<view class="title"> 开户许可证</view>
|
||||||
|
<my-upload-img v-model="form.openAccountLicencePic.url" :size="200"></my-upload-img>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<view class="form-item ">
|
|
||||||
<view class="title"> 开户许可证</view>
|
|
||||||
<my-upload-img v-model="form.openAccountLicencePic.url" :size="200"></my-upload-img>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -180,6 +185,8 @@
|
|||||||
} from '@/http/api/order/entryManager.js'
|
} from '@/http/api/order/entryManager.js'
|
||||||
const showCitySelect = ref(false)
|
const showCitySelect = ref(false)
|
||||||
const showBankSelect = ref(true)
|
const showBankSelect = ref(true)
|
||||||
|
|
||||||
|
const wxProvinceCode=ref('')
|
||||||
|
|
||||||
function uploadSuccess(url, type, key) {
|
function uploadSuccess(url, type, key) {
|
||||||
uni.showLoading({
|
uni.showLoading({
|
||||||
@@ -307,7 +314,8 @@
|
|||||||
}
|
}
|
||||||
console.log(form);
|
console.log(form);
|
||||||
}, {
|
}, {
|
||||||
deep: true,immediate:true
|
deep: true,
|
||||||
|
immediate: true
|
||||||
})
|
})
|
||||||
|
|
||||||
const emits = defineEmits(['update'])
|
const emits = defineEmits(['update'])
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
<scroll-view scroll-x="true" scroll-with-animation :scroll-left="scrollLeft" class="steps-scroll-container"
|
<scroll-view scroll-x="true" scroll-with-animation :scroll-left="scrollLeft" class="steps-scroll-container"
|
||||||
ref="scrollViewRef">
|
ref="scrollViewRef">
|
||||||
<view class="steps-content" ref="contentRef">
|
<view class="steps-content" ref="contentRef">
|
||||||
<view v-for="(item,index) in list" class="step-item" :key="index" :data-index="index" ref="stepItemRefs">
|
<view v-for="(item,index) in list" class="step-item" :key="index" :data-index="index"
|
||||||
|
:class="'step_'+index"
|
||||||
|
ref="stepItemRefs">
|
||||||
<view class="step-inner">
|
<view class="step-inner">
|
||||||
<view class="index" :class="{active:index<=cur}">
|
<view class="index" :class="{active:index<=cur}">
|
||||||
<text>{{index+1}}</text>
|
<text>{{index+1}}</text>
|
||||||
@@ -23,12 +25,13 @@
|
|||||||
import {
|
import {
|
||||||
ref,
|
ref,
|
||||||
nextTick,
|
nextTick,
|
||||||
getCurrentInstance
|
getCurrentInstance,
|
||||||
|
watch
|
||||||
} from 'vue';
|
} from 'vue';
|
||||||
|
|
||||||
const cur = defineModel({
|
const cur = defineModel({
|
||||||
default:0
|
default: 0
|
||||||
})
|
})
|
||||||
const scrollLeft = ref(0)
|
const scrollLeft = ref(0)
|
||||||
const scrollViewRef = ref(null)
|
const scrollViewRef = ref(null)
|
||||||
const contentRef = ref(null) // 内容容器ref
|
const contentRef = ref(null) // 内容容器ref
|
||||||
@@ -36,60 +39,66 @@
|
|||||||
const instance = getCurrentInstance()
|
const instance = getCurrentInstance()
|
||||||
|
|
||||||
function isActive(index) {
|
function isActive(index) {
|
||||||
return cur.value === index
|
return index <= cur.value
|
||||||
}
|
}
|
||||||
|
|
||||||
// 核心:精准居中计算(基于元素相对于内容容器的偏移)
|
// 核心:精准居中计算(基于元素相对于内容容器的偏移)
|
||||||
const calcScrollCenter = (index) => {
|
const calcScrollCenter = async (index) => {
|
||||||
nextTick(async () => {
|
try {
|
||||||
try {
|
console.log('calcScrollCenter');
|
||||||
const query = uni.createSelectorQuery().in(instance)
|
const query = uni.createSelectorQuery().in(instance)
|
||||||
|
|
||||||
// 1. 获取滚动容器宽度
|
// 1. 获取滚动容器宽度
|
||||||
const [scrollViewRect] = await new Promise(resolve => {
|
const [scrollViewRect] = await new Promise(resolve => {
|
||||||
query.select('.steps-scroll-container').boundingClientRect(rect => resolve([
|
query.select('.steps-scroll-container').boundingClientRect(rect => resolve([
|
||||||
rect
|
rect
|
||||||
])).exec()
|
])).exec()
|
||||||
})
|
})
|
||||||
const scrollViewWidth = scrollViewRect?.width || 0
|
const scrollViewWidth = scrollViewRect?.width || 0
|
||||||
|
// 2. 获取当前步骤项的布局信息
|
||||||
|
const [itemRect] = await new Promise(resolve => {
|
||||||
|
query.select(`.step_${index}`).boundingClientRect(rect =>
|
||||||
|
resolve([rect])).exec()
|
||||||
|
})
|
||||||
|
console.log('itemRect',itemRect);
|
||||||
|
// 3. 获取内容容器的布局信息
|
||||||
|
const [contentRect] = await new Promise(resolve => {
|
||||||
|
query.select('.steps-content').boundingClientRect(rect => resolve([rect]))
|
||||||
|
.exec()
|
||||||
|
})
|
||||||
|
|
||||||
// 2. 获取当前步骤项的布局信息
|
if (!itemRect || !contentRect) return
|
||||||
const [itemRect] = await new Promise(resolve => {
|
|
||||||
query.select(`.step-item[data-index="${index}"]`).boundingClientRect(rect =>
|
|
||||||
resolve([rect])).exec()
|
|
||||||
})
|
|
||||||
|
|
||||||
// 3. 获取内容容器的布局信息
|
// 关键修正:元素相对于内容容器的左偏移(而非视口)
|
||||||
const [contentRect] = await new Promise(resolve => {
|
const itemOffsetLeft = itemRect.left - contentRect.left
|
||||||
query.select('.steps-content').boundingClientRect(rect => resolve([rect]))
|
// 居中公式:滚动距离 = 元素偏移 - (容器宽度/2) + (元素宽度/2)
|
||||||
.exec()
|
let targetScrollLeft = itemOffsetLeft - (scrollViewWidth / 2) + (itemRect.width / 2)
|
||||||
})
|
|
||||||
|
|
||||||
if (!itemRect || !contentRect) return
|
// 4. 计算最大可滚动距离(边界限制)
|
||||||
|
const maxScrollLeft = Math.max(0, contentRect.width - scrollViewWidth)
|
||||||
|
// 限制滚动范围,避免超出边界
|
||||||
|
targetScrollLeft = Math.max(0, Math.min(targetScrollLeft, maxScrollLeft))
|
||||||
|
|
||||||
// 关键修正:元素相对于内容容器的左偏移(而非视口)
|
// 5. 设置滚动距离(强制整数,避免小数导致的偏移)
|
||||||
const itemOffsetLeft = itemRect.left - contentRect.left
|
scrollLeft.value = Math.round(targetScrollLeft)
|
||||||
// 居中公式:滚动距离 = 元素偏移 - (容器宽度/2) + (元素宽度/2)
|
|
||||||
let targetScrollLeft = itemOffsetLeft - (scrollViewWidth / 2) + (itemRect.width / 2)
|
|
||||||
|
|
||||||
// 4. 计算最大可滚动距离(边界限制)
|
console.log('scrollLeft', scrollLeft.value);
|
||||||
const maxScrollLeft = Math.max(0, contentRect.width - scrollViewWidth)
|
} catch (e) {
|
||||||
// 限制滚动范围,避免超出边界
|
console.error('计算居中失败:', e)
|
||||||
targetScrollLeft = Math.max(0, Math.min(targetScrollLeft, maxScrollLeft))
|
}
|
||||||
|
|
||||||
// 5. 设置滚动距离(强制整数,避免小数导致的偏移)
|
|
||||||
scrollLeft.value = Math.round(targetScrollLeft)
|
|
||||||
} catch (e) {
|
|
||||||
console.error('计算居中失败:', e)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const emits = defineEmits(['itemClick'])
|
||||||
// 点击事件
|
// 点击事件
|
||||||
const handleClick = (index) => {
|
const handleClick = (index) => {
|
||||||
if (cur.value === index) return
|
if (cur.value === index) return
|
||||||
|
if (index > cur.value) {
|
||||||
|
emits('itemClick', index)
|
||||||
|
return
|
||||||
|
}
|
||||||
cur.value = index
|
cur.value = index
|
||||||
calcScrollCenter(index)
|
// calcScrollCenter(index)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化居中
|
// 初始化居中
|
||||||
@@ -97,6 +106,10 @@
|
|||||||
calcScrollCenter(cur.value)
|
calcScrollCenter(cur.value)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(() => cur.value, (newval) => {
|
||||||
|
calcScrollCenter(newval)
|
||||||
|
})
|
||||||
|
|
||||||
// 步骤列表
|
// 步骤列表
|
||||||
const list = ref(['基础信息', '法人信息', '营业执照信息', '门店信息', '结算信息'])
|
const list = ref(['基础信息', '法人信息', '营业执照信息', '门店信息', '结算信息'])
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
288
entryManager/add/data.js
Normal file
288
entryManager/add/data.js
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
export const rules = {
|
||||||
|
merchantBaseInfo: {
|
||||||
|
userType: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择商户类型',
|
||||||
|
},
|
||||||
|
shortName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写商户简称',
|
||||||
|
},
|
||||||
|
mccCode: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择行业类目',
|
||||||
|
},
|
||||||
|
alipayAccount: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写支付宝账号',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legalPersonInfo: {
|
||||||
|
'idCardHandPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传身份证手持图片',
|
||||||
|
},
|
||||||
|
'idCardFrontPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传身份证正面图片',
|
||||||
|
},
|
||||||
|
'idCardBackPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传身份证反面图片',
|
||||||
|
},
|
||||||
|
legalPersonName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人姓名',
|
||||||
|
},
|
||||||
|
legalPersonId: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人身份证号',
|
||||||
|
},
|
||||||
|
legalIdPersonStartDate: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人身份证开始日期',
|
||||||
|
},
|
||||||
|
legalPersonIdEndDate: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人身份证到期日期',
|
||||||
|
},
|
||||||
|
legalPersonPhone: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人电话',
|
||||||
|
},
|
||||||
|
legalPersonEmail: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人邮箱',
|
||||||
|
},
|
||||||
|
legalGender: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人性别',
|
||||||
|
},
|
||||||
|
legalAddress: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写法人地址',
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
businessLicenceInfo:{
|
||||||
|
'licensePic.url':{
|
||||||
|
required: true,
|
||||||
|
errorMsg:'请上传营业执照照片'
|
||||||
|
},
|
||||||
|
licenceName:{
|
||||||
|
required: true,
|
||||||
|
errorMsg:'请输入营业执照全称'
|
||||||
|
},
|
||||||
|
licenceNo:{
|
||||||
|
required: true,
|
||||||
|
errorMsg:'请输入营业执照号码'
|
||||||
|
},
|
||||||
|
licenceStartDate:{
|
||||||
|
required: true,
|
||||||
|
errorMsg:'请选择营业执照开始日期'
|
||||||
|
},
|
||||||
|
registeredAddress:{
|
||||||
|
required: true,
|
||||||
|
errorMsg:'请填写营业执照注册地址'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
storeInfo: {
|
||||||
|
mercProvCode: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择归属地',
|
||||||
|
},
|
||||||
|
mercCityCode: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择归属地',
|
||||||
|
},
|
||||||
|
mercAreaCode: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择归属地',
|
||||||
|
},
|
||||||
|
mercProv: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择归属地',
|
||||||
|
},
|
||||||
|
mercCity: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择归属地',
|
||||||
|
},
|
||||||
|
mercArea: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择归属地',
|
||||||
|
},
|
||||||
|
businessAddress: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写营业地址',
|
||||||
|
},
|
||||||
|
'insidePic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传经营场所内设照片',
|
||||||
|
},
|
||||||
|
'doorPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传门头照',
|
||||||
|
},
|
||||||
|
'cashierDeskPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传收银台照片',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
settlementInfo: {
|
||||||
|
settlementType: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择结算类型',
|
||||||
|
},
|
||||||
|
settlementCardType: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择结算卡类型',
|
||||||
|
},
|
||||||
|
'bankCardFrontPic.url': {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请上传银行卡正面照片',
|
||||||
|
},
|
||||||
|
openAccProvinceId: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择地区',
|
||||||
|
},
|
||||||
|
openAccCityId: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择地区',
|
||||||
|
},
|
||||||
|
openAccAreaId: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择地区',
|
||||||
|
},
|
||||||
|
openAccProvince: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择地区',
|
||||||
|
},
|
||||||
|
openAccCity: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择地区',
|
||||||
|
},
|
||||||
|
openAccArea: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择地区',
|
||||||
|
},
|
||||||
|
bankType: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择银行',
|
||||||
|
},
|
||||||
|
bankInstId: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择银行',
|
||||||
|
},
|
||||||
|
bankName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请选择银行',
|
||||||
|
},
|
||||||
|
settlementCardNo: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写结算账户卡号',
|
||||||
|
},
|
||||||
|
settlementName: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写结算账户户名',
|
||||||
|
},
|
||||||
|
bankMobile: {
|
||||||
|
required: true,
|
||||||
|
errorMsg: '请填写结算银行预留手机号',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isEmptyValue(val) {
|
||||||
|
if (val === '' || val === undefined || val === null) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 解析属性路径,返回数组格式的路径片段
|
||||||
|
* @param {string} str - 属性路径(如 'userType' 或 'idCardHandPic.url')
|
||||||
|
* @returns {Array<string>} 属性路径片段数组(如 ['userType'] 或 ['idCardHandPic', 'url'])
|
||||||
|
*/
|
||||||
|
export function returnKey(str) {
|
||||||
|
// 无论是否包含'.',都返回数组,方便后续统一处理
|
||||||
|
return str.includes('.') ? str.split('.') : [str];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据属性路径数组,安全获取对象的嵌套属性值
|
||||||
|
* @param {Object} obj - 目标对象(如 form.legalPersonInfo)
|
||||||
|
* @param {Array<string>} keyPath - 属性路径数组(如 ['idCardHandPic', 'url'])
|
||||||
|
* @returns {*} 嵌套属性的值(若路径不存在,返回 undefined)
|
||||||
|
*/
|
||||||
|
export function getNestedValue(obj, keyPath) {
|
||||||
|
// 边界处理:obj不是对象,直接返回undefined
|
||||||
|
if (typeof obj !== 'object' || obj === null) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 逐层遍历属性路径,获取最终值
|
||||||
|
return keyPath.reduce((currentObj, key) => {
|
||||||
|
// 中间层级不存在,直接返回undefined,避免报错
|
||||||
|
if (currentObj === undefined || currentObj === null) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return currentObj[key];
|
||||||
|
}, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function verifyValue(val, ruleItem) {
|
||||||
|
const isEmpty = isEmptyValue(val)
|
||||||
|
let result = {
|
||||||
|
ispas: true,
|
||||||
|
errorMsg: ''
|
||||||
|
}
|
||||||
|
if (ruleItem.required) {
|
||||||
|
|
||||||
|
if (isEmpty) {
|
||||||
|
result.ispas = false
|
||||||
|
result.errorMsg = ruleItem.errorMsg
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
export function verifyData(data, rule) {
|
||||||
|
// 边界处理:data不是对象,直接返回校验失败(若有必填规则)
|
||||||
|
if (typeof data !== 'object' || data === null) {
|
||||||
|
// 遍历规则,返回第一个必填项的错误信息
|
||||||
|
for (let ruleKey in rule) {
|
||||||
|
const ruleItem = rule[ruleKey];
|
||||||
|
if (ruleItem.required) {
|
||||||
|
return {
|
||||||
|
ispas: false,
|
||||||
|
errorMsg: ruleItem.errorMsg || '数据格式错误,无法校验'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
ispas: true,
|
||||||
|
errorMsg: ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let ruleKey in rule) {
|
||||||
|
const ruleItem = rule[ruleKey];
|
||||||
|
// 1. 获取属性路径数组(如 ['idCardHandPic', 'url'])
|
||||||
|
const keyPath = returnKey(ruleKey);
|
||||||
|
// 2. 安全获取嵌套属性值(核心:支持深层级属性)
|
||||||
|
const targetValue = getNestedValue(data, keyPath);
|
||||||
|
// 3. 校验属性值
|
||||||
|
const result = verifyValue(targetValue, ruleItem);
|
||||||
|
|
||||||
|
// 4. 校验失败,直接返回结果
|
||||||
|
if (!result.ispas) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
ispas: true,
|
||||||
|
errorMsg: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
203
entryManager/components/shop-select.vue
Normal file
203
entryManager/components/shop-select.vue
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
|
||||||
|
<up-popup :show="show" placement="bottom" round="18rpx" closeOnClickOverlay @close="close">
|
||||||
|
<view class="u-p-30">
|
||||||
|
<view class="font-bold color-333 u-font-32">选择门店</view>
|
||||||
|
<view class="u-m-t-24">
|
||||||
|
<up-search v-model="query.shopName" @search="search" @clear="search" @custom="search"></up-search>
|
||||||
|
</view>
|
||||||
|
<scroll-view @scrolltolower="scrolltolower" scroll-with-animation :scroll-into-view="selShopId"
|
||||||
|
class="scroll-view u-m-t-30" scroll-y="true" style="max-height :60vh;">
|
||||||
|
<view class="u-m-b-10 u-flex item" v-for="item in list" :key="item.shopId" @click="itemClick(item)"
|
||||||
|
:id="'shop_'+item.shopId" :class="{active:selShop==item.shopId}">
|
||||||
|
<view class="checkbox">
|
||||||
|
<up-icon name="checkbox-mark" color="#fff"></up-icon>
|
||||||
|
</view>
|
||||||
|
<view class="u-flex-1">{{item.shopName}}</view>
|
||||||
|
</view>
|
||||||
|
<template v-if="query.shopName!==''">
|
||||||
|
<up-empty v-if="list.length==0" text="未搜索到相关店铺"></up-empty>
|
||||||
|
<up-loadmore v-else :status="isEnd?'nomor':'loading'"></up-loadmore>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<up-loadmore :status="isEnd?'nomor':'loading'"></up-loadmore>
|
||||||
|
</template>
|
||||||
|
</scroll-view>
|
||||||
|
<view class="u-flex gap-20 u-m-t-30">
|
||||||
|
<view class="u-flex-1">
|
||||||
|
<my-button type="default" @click="close">取消</my-button>
|
||||||
|
</view>
|
||||||
|
<view class="u-flex-1">
|
||||||
|
<my-button type="primary" @click="submit">确定</my-button>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</up-popup>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {
|
||||||
|
computed,
|
||||||
|
onMounted,
|
||||||
|
reactive,
|
||||||
|
ref,
|
||||||
|
watch
|
||||||
|
} from 'vue';
|
||||||
|
import {
|
||||||
|
adminShopList
|
||||||
|
} from '@/http/api/shop.js';
|
||||||
|
|
||||||
|
const customStyle = ref({
|
||||||
|
marginRight: '20px'
|
||||||
|
});
|
||||||
|
|
||||||
|
const show = defineModel(false)
|
||||||
|
let selShop = defineModel('selShop', {
|
||||||
|
default: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const selShopId = ref('')
|
||||||
|
|
||||||
|
function returnLabel() {
|
||||||
|
const findShop = list.value.find(v => v.shopId == selShop.value)
|
||||||
|
return findShop ? findShop.shopName : ''
|
||||||
|
}
|
||||||
|
|
||||||
|
function itemClick(shop) {
|
||||||
|
selShop.value = shop.shopId
|
||||||
|
}
|
||||||
|
|
||||||
|
function returnShopName(shopId) {
|
||||||
|
const item = list.value.find((v) => v.shopId == shopId);
|
||||||
|
return item?.shopName || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function close() {
|
||||||
|
show.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const emits=defineEmits(['confirm'])
|
||||||
|
function submit() {
|
||||||
|
show.value = false;
|
||||||
|
if(!selShop.value){
|
||||||
|
return uni.showToast({
|
||||||
|
title:'请选择门店',
|
||||||
|
icon:'none'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const findShop = list.value.find(v => v.shopId == selShop.value)
|
||||||
|
emits('confirm',findShop)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const list = ref([]);
|
||||||
|
|
||||||
|
function openPopup() {
|
||||||
|
selShopId.value = 'shop_' + selShop.value
|
||||||
|
show.value = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = reactive({
|
||||||
|
page: 1,
|
||||||
|
size: 10,
|
||||||
|
shopName: '',
|
||||||
|
})
|
||||||
|
const isEnd = ref(false)
|
||||||
|
|
||||||
|
function scrolltolower() {
|
||||||
|
if (!isEnd.value) {
|
||||||
|
query.page++
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function search() {
|
||||||
|
selShop.value = '';
|
||||||
|
query.page = 1;
|
||||||
|
isEnd.value = false
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
async function init() {
|
||||||
|
const res = await adminShopList(query);
|
||||||
|
if (res) {
|
||||||
|
const arr = res.records.map((item) => ({
|
||||||
|
shopId: item.id,
|
||||||
|
shopName: item.shopName,
|
||||||
|
}));
|
||||||
|
isEnd.value = query.page >= res.totalPage * 1
|
||||||
|
if (query.page == 1) {
|
||||||
|
list.value = arr
|
||||||
|
} else {
|
||||||
|
list.value.push(...arr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onMounted(init);
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.box {
|
||||||
|
border-radius: 8upx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: top;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 10rpx 24rpx;
|
||||||
|
border: 2rpx solid #e5e5e5;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 24rpx;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-item {
|
||||||
|
padding: 4rpx 8rpx 4rpx 16rpx;
|
||||||
|
border-radius: 4rpx;
|
||||||
|
border: 2rpx solid #f0f0f0;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
margin-bottom: 16rpx;
|
||||||
|
margin-left: 16rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scroll-view {
|
||||||
|
.item {
|
||||||
|
border: 1px solid #eee;
|
||||||
|
padding: 20rpx;
|
||||||
|
border-radius: 12rpx;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
border-color: $my-main-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox {
|
||||||
|
margin-right: 10rpx;
|
||||||
|
width: 40rpx;
|
||||||
|
height: 40rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
border-radius: 6rpx;
|
||||||
|
border: 1px solid #999;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
&.active {
|
||||||
|
.checkbox {
|
||||||
|
background-color: $my-main-color;
|
||||||
|
border-color: $my-main-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,17 +1,305 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="min-page bg-f7 u-font-28 color-333">
|
<view class="min-page bg-f7 u-font-28 color-333">
|
||||||
<view class="container">1</view>
|
<up-sticky>
|
||||||
|
<view class="top u-flex">
|
||||||
|
<up-select :options="statusList" @select="statusListSelect">
|
||||||
|
<template #text>
|
||||||
|
<text v-if="query.status">{{returnStatusLabel(query.status)}}</text>
|
||||||
|
<text v-else>状态</text>
|
||||||
|
</template>
|
||||||
|
</up-select>
|
||||||
|
<view class="u-flex-1 u-p-l-32">
|
||||||
|
<up-search placeholder="店铺名称" v-model="query.shopName" @search="search" @clear="search" @custom="search"></up-search>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</up-sticky>
|
||||||
|
<view class="box">
|
||||||
|
<view class="container" v-for="(item,index) in list" :key="index">
|
||||||
|
<view>
|
||||||
|
<view class="">
|
||||||
|
<text class="color-666">商户号:</text>
|
||||||
|
<text class="font-bold">{{item.merchantCode}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="u-m-t-24">
|
||||||
|
<text class="color-666">商户简称:</text>
|
||||||
|
<text class="font-bold">{{item.shortName}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="u-m-t-24">
|
||||||
|
<text class="color-666">店铺名称:</text>
|
||||||
|
<text class="font-bold">{{item.shopName}}</text>
|
||||||
|
</view>
|
||||||
|
<view class="u-m-t-24 u-flex u-col-center">
|
||||||
|
<text class="color-666">商户类型:</text>
|
||||||
|
<view class="types font-bold">{{returnType(item.userType)}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="status">
|
||||||
|
<view class="u-flex u-row-between ">
|
||||||
|
<text class="font-bold">支付宝进件状态</text>
|
||||||
|
<view class="state" :class="returnStatusClass(item.alipayStatus)">
|
||||||
|
{{returnStatusLabel(item.alipayStatus)}}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="u-m-t-14" v-if="item.alipayErrorMsg">
|
||||||
|
<up-alert title="拒绝原因" type="error" :description="item.alipayErrorMsg"></up-alert>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="status">
|
||||||
|
<view class="u-flex u-row-between">
|
||||||
|
<text class="font-bold">微信进件状态</text>
|
||||||
|
<view class="state" :class="returnStatusClass(item.wechatStatus)">
|
||||||
|
{{returnStatusLabel(item.wechatStatus)}}
|
||||||
|
</view>
|
||||||
|
|
||||||
|
</view>
|
||||||
|
<view class="u-m-t-14" v-if="item.wechatErrorMsg">
|
||||||
|
<up-alert title="拒绝原因" type="error" :description="item.wechatErrorMsg"></up-alert>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="u-m-t-24 u-flex u-col-center">
|
||||||
|
<text class="color-666">最后提交时间:</text>
|
||||||
|
<view class=" font-bold">{{item.updateTime}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="u-m-t-24 u-flex u-col-center">
|
||||||
|
<text class="color-666">创建时间:</text>
|
||||||
|
<view class=" font-bold">{{item.createTime}}</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="u-flex u-m-t-32 u-row-right">
|
||||||
|
<view style="min-width: 160rpx;">
|
||||||
|
<my-button @click="toEdit(item)" >编辑</my-button>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<template v-if="query.shopName">
|
||||||
|
<up-empty v-if="list.length<=0" text="未搜索到相关信息"></up-empty>
|
||||||
|
<up-loadmore :status="isEnd?'nomore':'loading'" v-else></up-loadmore>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<up-empty v-if="list.length<=0" text="未搜索到相关信息"></up-empty>
|
||||||
|
<up-loadmore v-else :status="isEnd?'nomore':'loading'"></up-loadmore>
|
||||||
|
</template>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view style="height: 140rpx;"></view>
|
||||||
|
<view class="bottom">
|
||||||
|
<my-button @click="showShopSelect=true">添加进件</my-button>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<shopSelect v-model="showShopSelect" @confirm="toAdd"></shopSelect>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import {
|
||||||
|
userTypes
|
||||||
|
} from '../data.js'
|
||||||
|
|
||||||
|
function returnType(type) {
|
||||||
|
if (userTypes[type]) {
|
||||||
|
return userTypes[type]
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
import {
|
||||||
|
reactive,
|
||||||
|
ref,
|
||||||
|
watch
|
||||||
|
} from 'vue';
|
||||||
|
import shopSelect from '../components/shop-select.vue'
|
||||||
|
import {
|
||||||
|
onReachBottom,onShow
|
||||||
|
} from '@dcloudio/uni-app'
|
||||||
|
import {
|
||||||
|
getList
|
||||||
|
} from '@/http/api/order/entryManager.js'
|
||||||
|
|
||||||
|
// WAIT 待提交
|
||||||
|
// INIT 待处理
|
||||||
|
// AUDIT 待审核
|
||||||
|
// SIGN 待签约
|
||||||
|
// FINISH 已完成
|
||||||
|
// REJECTED 失败
|
||||||
|
const statusList = [{
|
||||||
|
value: 'WAIT',
|
||||||
|
name: '待提交',
|
||||||
|
class: 'gray'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'INIT',
|
||||||
|
name: '待处理',
|
||||||
|
class: 'warning'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'AUDIT',
|
||||||
|
name: '待审核',
|
||||||
|
class: 'warning'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'SIGN',
|
||||||
|
name: '待签约',
|
||||||
|
class: 'warning'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'FINISH',
|
||||||
|
name: '已完成',
|
||||||
|
class: 'success'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'REJECTED',
|
||||||
|
name: '失败',
|
||||||
|
class: 'error'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
function statusListSelect(e){
|
||||||
|
query.status=e.value
|
||||||
|
}
|
||||||
|
const statusLabelJson = {
|
||||||
|
'REJECTED': '已拒绝'
|
||||||
|
}
|
||||||
|
const statusClassJson = {
|
||||||
|
'REJECTED': 'error'
|
||||||
|
}
|
||||||
|
|
||||||
|
function returnStatusLabel(state) {
|
||||||
|
const item = statusList.find(v => v.value == state)
|
||||||
|
if (item) {
|
||||||
|
return item.name
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
function returnStatusClass(state) {
|
||||||
|
const item = statusList.find(v => v.value == state)
|
||||||
|
if (item) {
|
||||||
|
return item.class
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const showShopSelect = ref(false)
|
||||||
|
|
||||||
|
const query = reactive({
|
||||||
|
page: 1,
|
||||||
|
size: 10,
|
||||||
|
shopName: '',
|
||||||
|
status: ''
|
||||||
|
})
|
||||||
|
watch(()=>query.status,(newval)=>{
|
||||||
|
search()
|
||||||
|
})
|
||||||
|
const isEnd = ref(false)
|
||||||
|
const list = ref([])
|
||||||
|
|
||||||
|
function search() {
|
||||||
|
isEnd.value = false
|
||||||
|
query.page = 1
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
|
||||||
|
function toAdd(shop) {
|
||||||
|
console.log(shop)
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/entryManager/add/add?shopId=' + shop.shopId
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function toEdit(shop){
|
||||||
|
console.log(shop)
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/entryManager/add/add?shopId=' + shop.shopId+'&licenceNo='+shop.licenceNo
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getData() {
|
||||||
|
getList(query).then(res => {
|
||||||
|
isEnd.value = query.page >= res.totalPage * 1
|
||||||
|
if (query.page == 1) {
|
||||||
|
list.value = res.records
|
||||||
|
} else {
|
||||||
|
list.value.push(...res.records)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
onReachBottom(() => {
|
||||||
|
if (!isEnd.value) {
|
||||||
|
query.page++
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
onShow(getData)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.min-page {
|
||||||
|
.box {
|
||||||
|
padding: 32rpx 28rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
padding: 32rpx 28rpx;
|
padding: 32rpx 28rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
margin-bottom: 32rpx;
|
margin-bottom: 32rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background-color: #fff;
|
||||||
|
z-index: 100;
|
||||||
|
padding: 32rpx 28rpx;
|
||||||
|
padding-bottom:40rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.types {}
|
||||||
|
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.top {
|
||||||
|
padding: 32rpx 28rpx;
|
||||||
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -3,6 +3,18 @@ const request = http.request;
|
|||||||
const urlType = "order";
|
const urlType = "order";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export function getList(data) {
|
||||||
|
return request({
|
||||||
|
url: urlType + '/admin/data/entryManager/list',
|
||||||
|
method: "GET",
|
||||||
|
data: {
|
||||||
|
...data,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ocr识别填充
|
// ocr识别填充
|
||||||
export function getInfoByImg(data) {
|
export function getInfoByImg(data) {
|
||||||
return request({
|
return request({
|
||||||
@@ -26,7 +38,7 @@ export function bankBranchList(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取进件信息
|
// 获取进件信息
|
||||||
export function entryManager(data) {
|
export function getEntryManager(data) {
|
||||||
return request({
|
return request({
|
||||||
url: urlType + '/admin/data/entryManager',
|
url: urlType + '/admin/data/entryManager',
|
||||||
method: "GET",
|
method: "GET",
|
||||||
|
|||||||
Reference in New Issue
Block a user