进件代码调整,增加进件列表页面和筛选

This commit is contained in:
2026-01-12 15:33:08 +08:00
parent 684014e183
commit 1a16b0b3dd
11 changed files with 1192 additions and 324 deletions

View File

@@ -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>

View File

@@ -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
} }
} }

View File

@@ -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(() => {
}) })

View File

@@ -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">

View File

@@ -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">

View File

@@ -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'])

View File

@@ -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
View 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: ''
}
}

View 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>

View File

@@ -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>

View File

@@ -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",