This commit is contained in:
2026-06-19 12:40:56 +08:00
parent 62aa9090a0
commit 347dbd615c
2 changed files with 108 additions and 9 deletions

View File

@@ -1,13 +1,34 @@
import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { QueryWhitelistApi } from '#/api/product-manage';
import type { FeatureApi } from '#/api/product-manage/feature';
export const actionOptions = [
{ label: '创建规则', value: 'create' },
{ label: '追加接口', value: 'append' },
];
export function useConfigFormSchema(): VbenFormSchema[] {
export type FeatureOption = { label: string; value: string };
/** 将模块列表转为下拉选项 */
export function buildFeatureOptions(
features: FeatureApi.FeatureItem[],
): FeatureOption[] {
return features.map((item) => ({
label: `${item.api_id}${item.name}`,
value: item.api_id,
}));
}
/** 司法类模块:名称含「司法」的 feature与模块列表配置保持一致 */
export function getJudicialApiCodes(features: FeatureApi.FeatureItem[]): string[] {
return features
.filter((item) => item.name.includes('司法'))
.map((item) => item.api_id);
}
export function useConfigFormSchema(
featureOptions: FeatureOption[] = [],
): VbenFormSchema[] {
return [
{
component: 'Input',
@@ -33,12 +54,17 @@ export function useConfigFormSchema(): VbenFormSchema[] {
component: 'Select',
fieldName: 'api_codes',
label: '产品编码',
defaultValue: [],
rules: 'required',
help: '从模块列表多选;可点击下方快捷按钮一键选中司法类模块',
componentProps: {
mode: 'tags',
placeholder: '输入产品编码后回车添加',
tokenSeparators: [',', ' '],
open: false,
mode: 'multiple',
placeholder: '请选择产品编码',
options: featureOptions,
optionFilterProp: 'label',
showSearch: true,
allowClear: true,
maxTagCount: 'responsive',
},
},
{

View File

@@ -2,7 +2,7 @@
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { QueryWhitelistApi } from '#/api/product-manage';
import { computed, ref } from 'vue';
import { computed, onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
@@ -13,13 +13,22 @@ import { useVbenVxeGrid } from '#/adapter/vxe-table';
import {
appendQueryWhitelist,
createQueryWhitelist,
getFeatureList,
getQueryWhitelistOpLogList,
} from '#/api/product-manage';
import { useConfigFormSchema, useLogColumns, useLogGridFormSchema } from './data';
import {
buildFeatureOptions,
getJudicialApiCodes,
useConfigFormSchema,
useLogColumns,
useLogGridFormSchema,
} from './data';
const lastResult = ref<QueryWhitelistApi.OpResponse | null>(null);
const submitting = ref(false);
const featureLoading = ref(false);
const judicialApiCodes = ref<string[]>([]);
const [ConfigForm, configFormApi] = useVbenForm({
commonConfig: {
@@ -35,6 +44,57 @@ const [ConfigForm, configFormApi] = useVbenForm({
const resultSuccess = computed(() => lastResult.value?.tianyuan_code === 0);
async function loadFeatureOptions() {
featureLoading.value = true;
try {
const res = await getFeatureList({ page: 1, pageSize: 500 });
const features = res.items || [];
const options = buildFeatureOptions(features);
judicialApiCodes.value = getJudicialApiCodes(features);
await configFormApi.updateSchema([
{
fieldName: 'api_codes',
componentProps: {
mode: 'multiple',
placeholder: '请选择产品编码',
options,
optionFilterProp: 'label',
showSearch: true,
allowClear: true,
maxTagCount: 'responsive',
loading: false,
},
},
]);
} catch {
message.error('加载模块列表失败,请刷新页面重试');
} finally {
featureLoading.value = false;
}
}
async function selectJudicialApiCodes() {
if (judicialApiCodes.value.length === 0) {
message.warning('当前模块列表中未找到司法类模块');
return;
}
const values = await configFormApi.getValues();
const merged = [
...new Set([...(values.api_codes || []), ...judicialApiCodes.value]),
];
await configFormApi.setValues({ api_codes: merged });
message.success(`已选中 ${judicialApiCodes.value.length} 个司法类模块`);
}
async function clearApiCodes() {
await configFormApi.setValues({ api_codes: [] });
}
onMounted(() => {
loadFeatureOptions();
});
async function submitAction(action: 'create' | 'append') {
const { valid } = await configFormApi.validate();
if (!valid) return;
@@ -44,7 +104,7 @@ async function submitAction(action: 'create' | 'append') {
(code: string) => code && String(code).trim(),
);
if (apiCodes.length === 0) {
message.warning('请至少添加一个产品编码');
message.warning('请至少选择一个产品编码');
return;
}
@@ -114,6 +174,19 @@ const [Grid, gridApi] = useVbenVxeGrid({
<Col :span="14">
<Card title="配置规则">
<ConfigForm />
<div class="mt-2 flex flex-wrap gap-2">
<Button
:loading="featureLoading"
size="small"
@click="selectJudicialApiCodes"
>
一键选中司法
</Button>
<Button size="small" @click="clearApiCodes">清空编码</Button>
<span v-if="judicialApiCodes.length" class="text-xs text-gray-400">
司法类{{ judicialApiCodes.join('') }}
</span>
</div>
<div class="mt-4 flex gap-3">
<Button
:loading="submitting"