This commit is contained in:
Mrx
2026-03-28 12:39:57 +08:00
3 changed files with 114 additions and 8 deletions

View File

@@ -113,6 +113,17 @@ export namespace OrderQueryApi {
export interface UpdateQueryCleanupConfigResponse {
success: boolean;
}
// 运维补删接口:按 QueryId+FeatureApiId 删除单条查询中的指定模块数据
export interface AdminDeleteQueryFeatureDataRequest {
query_id: string;
feature_api_id: string;
}
export interface AdminDeleteQueryFeatureDataResponse {
success: boolean;
message: string;
}
}
/**
@@ -175,10 +186,23 @@ async function updateQueryCleanupConfig(
);
}
/**
* 运维补删:按 QueryId + FeatureApiId 删除单条查询中的指定模块数据
*/
async function adminDeleteQueryFeatureData(
data: OrderQueryApi.AdminDeleteQueryFeatureDataRequest,
) {
return requestClient.post<OrderQueryApi.AdminDeleteQueryFeatureDataResponse>(
'/query/cleanup/delete/feature',
data,
);
}
export {
getOrderQueryDetail,
getQueryCleanupConfigList,
getQueryCleanupDetailList,
getQueryCleanupLogList,
updateQueryCleanupConfig,
adminDeleteQueryFeatureData,
};

View File

@@ -14,17 +14,25 @@ import {
Card,
Collapse,
Descriptions,
Input,
message,
Modal,
Tag,
} from 'ant-design-vue';
import { getOrderQueryDetail } from '#/api/order/query';
import {
adminDeleteQueryFeatureData,
getOrderQueryDetail,
} from '#/api/order/query';
const route = useRoute();
const router = useRouter();
const orderId = route.params.id as string;
const loading = ref(false);
const queryDetail = ref<OrderQueryApi.QueryDetail>();
const deleteModalVisible = ref(false);
const deleteFeatureApiId = ref('');
const deleting = ref(false);
// 查询状态配置
const queryStateConfig = [
@@ -104,6 +112,39 @@ function handleCopied(_event: JsonViewerAction) {
onMounted(() => {
fetchQueryDetail();
});
async function handleOpenDeleteModal(apiId?: string) {
deleteFeatureApiId.value = apiId || '';
deleteModalVisible.value = true;
}
async function handleConfirmDelete() {
if (!queryDetail.value) return;
if (!deleteFeatureApiId.value) {
message.warning('请填写要删除的模块 API 标识');
return;
}
deleting.value = true;
try {
const res = await adminDeleteQueryFeatureData({
query_id: queryDetail.value.id,
feature_api_id: deleteFeatureApiId.value,
});
if (res.success) {
message.success(res.message || '删除成功');
deleteModalVisible.value = false;
deleteFeatureApiId.value = '';
// 重新拉取详情,刷新前端数据
await fetchQueryDetail();
} else {
message.error(res.message || '删除失败');
}
} catch {
message.error('删除失败');
} finally {
deleting.value = false;
}
}
</script>
<template>
@@ -122,11 +163,16 @@ onMounted(() => {
<template #title>
<div class="flex items-center justify-between">
<span class="text-lg font-medium">订单查询详情</span>
<div class="flex items-center gap-2">
<span class="text-gray-500">查询状态:</span>
<Tag v-if="queryDetail" :color="getQueryStateConfig(queryDetail.query_state).color">
{{ getQueryStateConfig(queryDetail.query_state).label }}
</Tag>
<div class="flex items-center gap-3">
<div class="flex items-center gap-2">
<span class="text-gray-500">查询状态:</span>
<Tag v-if="queryDetail" :color="getQueryStateConfig(queryDetail.query_state).color">
{{ getQueryStateConfig(queryDetail.query_state).label }}
</Tag>
</div>
<Button v-if="queryDetail" danger type="primary" @click="handleOpenDeleteModal()">
运维补删模块数据
</Button>
</div>
</div>
</template>
@@ -198,6 +244,15 @@ onMounted(() => {
</template>
<div class="grid gap-4">
<div class="flex justify-end">
<Button
size="small"
danger
@click.stop="handleOpenDeleteModal(item.data.apiID)"
>
补删当前模块数据
</Button>
</div>
<div v-if="item.data.data">
<div class="mb-2 font-medium">查询结果:</div>
<JsonViewer :value="item.data.data" copyable :expand-depth="2" boxed @copied="handleCopied" />
@@ -219,6 +274,33 @@ onMounted(() => {
</div>
</Card>
</template>
<!-- 运维补删模块数据弹窗 -->
<Modal
v-model:open="deleteModalVisible"
:confirm-loading="deleting"
title="运维补删模块数据"
ok-text="确认删除"
cancel-text="取消"
@ok="handleConfirmDelete"
>
<div class="space-y-3">
<p class="text-red-500 text-sm">
该操作仅用于运维场景,按照 QueryId + FeatureApiId 精确删除单条查询中的某个模块数据,请谨慎使用。
</p>
<div>
<div class="mb-1 text-sm text-gray-600">Query ID</div>
<Input :value="queryDetail?.id" readonly />
</div>
<div>
<div class="mb-1 text-sm text-gray-600">模块 API 标识feature_api_id</div>
<Input
v-model:value="deleteFeatureApiId"
placeholder="例如credit_score credit_score_detail"
/>
</div>
</div>
</Modal>
</div>
</Page>
</template>

View File

@@ -10,8 +10,8 @@ export default defineConfig(async () => {
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
// mock代理目标地址
target: 'http://localhost:8888/api',
// target: 'https://www.onecha.cn/api',
// target: 'http://localhost:8888/api',
target: 'https://www.onecha.cn/api',
ws: true,
},
},