赛事管理新增bug

This commit is contained in:
马梓彭 2026-03-30 21:28:49 +08:00
parent 4276180a08
commit dfbd252ed1
2 changed files with 149 additions and 9 deletions

View File

@ -295,6 +295,14 @@ const rules = {
const validate = async () => {
if (!formRef.value) return false;
// 1. 验证必须选择至少一个项目
if (!localFormData.value.projects || localFormData.value.projects.length === 0) {
ElMessage.warning('请至少选择一个项目');
return false;
}
// 2. 验证表单字段(限报数等)
return await formRef.value.validate();
};

View File

@ -17,10 +17,11 @@
<el-divider content-position="center" style="margin: 60px 0 40px;">账户信息</el-divider>
<div v-if="localFormData.chargeMode !== 0" class="account-panel">
<el-form-item label="收款商户" prop="merchantId" required style="margin-bottom: 14px;">
<el-select v-model="localFormData.merchantId" filterable placeholder="请选择商户" @change="syncMerchantInfo" style="width: 100%">
<el-option v-for="m in merchantOptions" :key="m.value" :label="m.label" :value="m.value" />
</el-select>
<el-form-item label="收款账户" prop="merchantId" required style="margin-bottom: 14px;">
<div style="display: flex; align-items: center; gap: 12px;">
<el-input v-model="localFormData.merchantName" disabled placeholder="-" style="flex: 1;" />
<el-button type="primary" @click="openMerchantDialog">选择账户</el-button>
</div>
</el-form-item>
<div class="account-grid">
@ -29,15 +30,15 @@
<el-input v-model="localFormData.merchantName" disabled placeholder="-" />
</div>
<div class="account-item">
<div class="account-item__label">统一信用代码</div>
<div class="account-item__label">统一社会信用代码</div>
<el-input v-model="localFormData.creditCode" disabled placeholder="-" />
</div>
<div class="account-item">
<div class="account-item__label">开户银行</div>
<div class="account-item__label">开户行</div>
<el-input v-model="localFormData.bankName" disabled placeholder="-" />
</div>
<div class="account-item">
<div class="account-item__label">银行账号</div>
<div class="account-item__label">收款账号</div>
<el-input v-model="localFormData.accountNumber" disabled placeholder="-" />
</div>
<div class="account-item">
@ -58,6 +59,70 @@
</el-form-item>
</el-col>
</el-row> -->
<!-- 商户选择弹窗 -->
<el-dialog
v-model="merchantDialogVisible"
title="选择收款账户"
width="1200px"
:close-on-click-modal="false"
>
<div class="merchant-search">
<el-form :inline="true" :model="searchForm">
<el-form-item label="商户名称">
<el-input v-model="searchForm.merchantName" placeholder="请输入" clearable />
</el-form-item>
<el-form-item label="账号">
<el-input v-model="searchForm.accountNumber" placeholder="请输入" clearable />
</el-form-item>
<el-form-item>
<el-button @click="resetSearch">重置</el-button>
<el-button type="primary" @click="searchMerchants">查询</el-button>
</el-form-item>
</el-form>
</div>
<div class="merchant-table">
<el-table :data="merchantList" style="width: 100%" border>
<el-table-column prop="index" label="序号" width="80" align="center">
<template #default="{ $index }">
{{ (merchantPage.PageNo - 1) * merchantPage.PageSize + $index + 1 }}
</template>
</el-table-column>
<el-table-column prop="merchantName" label="商户名称" min-width="220" />
<el-table-column prop="creditCode" label="统一社会信用代码" min-width="200" />
<el-table-column prop="bankName" label="开户行" min-width="180" />
<el-table-column prop="accountNumber" label="收款账号" min-width="220" />
<el-table-column prop="businessLicenseUrl" label="营业执照" width="120" align="center">
<template #default="{ row }">
<el-image
v-if="row.businessLicenseUrl"
:src="row.businessLicenseUrl"
:preview-src-list="[row.businessLicenseUrl]"
style="width: 60px; height: 60px;"
fit="cover"
/>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="操作" width="100" align="center">
<template #default="{ row }">
<el-button type="primary" link @click="selectMerchant(row)">使用</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="merchant-pagination" style="margin-top: 20px; display: flex; justify-content: flex-end;">
<el-pagination
v-model:current-page="merchantPage.PageNo"
v-model:page-size="merchantPage.PageSize"
:page-sizes="[10, 20, 50, 100]"
:total="merchantPage.Total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="searchMerchants"
@current-change="searchMerchants"
/>
</div>
</el-dialog>
</el-form>
</template>
@ -123,9 +188,9 @@ const syncMerchantInfo = () => {
localFormData.value.creditCode = '';
localFormData.value.bankName = '';
localFormData.value.accountNumber = '';
businessLicenseUrl.value = '';
return;
}
// el-select 可能返回 string/number,这里做宽松匹配避免找不到
const m = (merchantOptions.value ?? []).find((x) => x?.value == id);
localFormData.value.merchantName = m?.merchantName ?? '';
localFormData.value.creditCode = m?.creditCode ?? '';
@ -134,7 +199,60 @@ const syncMerchantInfo = () => {
businessLicenseUrl.value = m?.businessLicenseUrl ?? '';
};
// watch(() => localFormData.value.merchantId, syncMerchantInfo, { immediate: true , deep: true});
// 商户选择弹窗相关
const merchantDialogVisible = ref(false);
const merchantList = ref([]);
const merchantPage = ref({
PageNo: 1,
PageSize: 10,
Total: 0
});
const searchForm = ref({
merchantName: '',
accountNumber: ''
});
const openMerchantDialog = () => {
merchantDialogVisible.value = true;
merchantPage.value.PageNo = 1;
searchMerchants();
};
const searchMerchants = async () => {
try {
const params = {
PageNo: merchantPage.value.PageNo,
PageSize: merchantPage.value.PageSize
};
if (searchForm.value.merchantName) {
params.merchantName = searchForm.value.merchantName;
}
const res = await merchantPageGet(params);
merchantList.value = res?.data?.rows ?? [];
merchantPage.value.Total = res?.data?.total ?? 0;
} catch {
merchantList.value = [];
merchantPage.value.Total = 0;
}
};
const resetSearch = () => {
searchForm.value.merchantName = '';
searchForm.value.accountNumber = '';
merchantPage.value.PageNo = 1;
searchMerchants();
};
const selectMerchant = (row) => {
localFormData.value.merchantId = row.id;
localFormData.value.merchantName = row.merchantName ?? row.name ?? '';
localFormData.value.creditCode = row.creditCode ?? '';
localFormData.value.bankName = row.bankName ?? '';
localFormData.value.accountNumber = row.accountNumber ?? '';
businessLicenseUrl.value = row.businessLicenseUrl ?? '';
merchantDialogVisible.value = false;
};
watch(merchantOptions, syncMerchantInfo, { deep: true });
const rules = {
@ -234,4 +352,18 @@ defineExpose({ validate });
margin: 8px 0;
line-height: 1.6;
}
/* 商户选择弹窗样式 */
.merchant-search {
margin-bottom: 20px;
}
.merchant-search .el-form-item {
margin-bottom: 0;
}
.merchant-table {
max-height: 500px;
overflow-y: auto;
}
</style>