feat:【antd】【ai】工作流的代码优化

This commit is contained in:
YunaiV
2025-11-15 08:54:25 +08:00
parent 02f2e90d43
commit dc68abd4d9
18 changed files with 96 additions and 67 deletions

View File

@@ -2,28 +2,48 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export function getWorkflowPage(params: PageParam) {
return requestClient.get<PageResult<any>>('/ai/workflow/page', {
params,
});
export namespace AiWorkflowApi {
/** 工作流 */
export interface Workflow {
id?: number; // 编号
name: string; // 工作流名称
code: string; // 工作流标识
graph: string; // 工作流模型 JSON 数据
remark?: string; // 备注
status: number; // 状态
createTime?: Date; // 创建时间
}
}
export const getWorkflow = (id: number | string) => {
return requestClient.get(`/ai/workflow/get?id=${id}`);
};
/** 查询工作流管理列表 */
export function getWorkflowPage(params: PageParam) {
return requestClient.get<PageResult<AiWorkflowApi.Workflow>>(
'/ai/workflow/page',
{ params },
);
}
export const createWorkflow = (data: any) => {
/** 查询工作流详情 */
export function getWorkflow(id: number) {
return requestClient.get<AiWorkflowApi.Workflow>(`/ai/workflow/get?id=${id}`);
}
/** 新增工作流 */
export function createWorkflow(data: AiWorkflowApi.Workflow) {
return requestClient.post('/ai/workflow/create', data);
};
}
export const updateWorkflow = (data: any) => {
/** 修改工作流 */
export function updateWorkflow(data: AiWorkflowApi.Workflow) {
return requestClient.put('/ai/workflow/update', data);
};
}
export const deleteWorkflow = (id: number | string) => {
/** 删除工作流 */
export function deleteWorkflow(id: number) {
return requestClient.delete(`/ai/workflow/delete?id=${id}`);
};
}
export const testWorkflow = (data: any) => {
/** 测试工作流 */
export function testWorkflow(data: any) {
return requestClient.post('/ai/workflow/test', data);
};
}

View File

@@ -203,7 +203,7 @@ async function updateConversationTitle(
filterConversationList.length > 0 &&
filterConversationList[0] && // tip避免切换对话
activeConversationId.value ===
(filterConversationList[0].id as number)
(filterConversationList[0].id!)
) {
emits('onConversationClick', filterConversationList[0]);
}

View File

@@ -24,7 +24,7 @@ async function handleDelete(row: AiImageApi.Image) {
duration: 0,
});
try {
await deleteImage(row.id as number);
await deleteImage(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -55,7 +55,7 @@ async function handleDelete(row: AiKnowledgeDocumentApi.KnowledgeDocument) {
duration: 0,
});
try {
await deleteKnowledgeDocument(row.id as number);
await deleteKnowledgeDocument(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.name]));
handleRefresh();
} finally {

View File

@@ -45,7 +45,7 @@ async function handleDelete(row: AiKnowledgeKnowledgeApi.Knowledge) {
duration: 0,
});
try {
await deleteKnowledge(row.id as number);
await deleteKnowledge(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.name]));
handleRefresh();
} finally {

View File

@@ -51,7 +51,7 @@ async function handleDelete(row: AiKnowledgeSegmentApi.KnowledgeSegment) {
duration: 0,
});
try {
await deleteKnowledgeSegment(row.id as number);
await deleteKnowledgeSegment(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -31,7 +31,7 @@ async function handleDelete(row: AiMindmapApi.MindMap) {
duration: 0,
});
try {
await deleteMindMap(row.id as number);
await deleteMindMap(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -24,7 +24,7 @@ async function handleDelete(row: AiMusicApi.Music) {
duration: 0,
});
try {
await deleteMusic(row.id as number);
await deleteMusic(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -13,19 +13,28 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'code',
label: '流程标识',
component: 'Input',
componentProps: {
placeholder: '请输入流程标识',
allowClear: true,
},
},
{
fieldName: 'name',
label: '流程名称',
component: 'Input',
componentProps: {
placeholder: '请输入流程名称',
allowClear: true,
},
},
{
fieldName: 'status',
label: '状态',
component: 'Select',
componentProps: {
allowClear: true,
options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
placeholder: '请选择状态',
allowClear: true,
},
},
{
@@ -46,27 +55,33 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{
field: 'id',
title: '编号',
minWidth: 100,
},
{
field: 'code',
title: '流程标识',
minWidth: 150,
},
{
field: 'name',
title: '流程名称',
minWidth: 200,
},
{
field: 'createTime',
title: '创建时间',
minWidth: 180,
formatter: 'formatDateTime',
},
{
field: 'remark',
title: '备注',
minWidth: 200,
},
{
field: 'status',
title: '状态',
minWidth: 100,
cellRender: {
name: 'CellDict',
props: { type: DICT_TYPE.COMMON_STATUS },

View File

@@ -25,10 +25,27 @@ const route = useRoute();
const workflowId = ref<string>('');
const actionType = ref<string>('');
// 基础信息组件引用
const basicInfoRef = ref<InstanceType<typeof BasicInfo>>();
// 工作流设计组件引用
const workflowDesignRef = ref<InstanceType<typeof WorkflowDesign>>();
const basicInfoRef = ref<InstanceType<typeof BasicInfo>>(); // 基础信息组件引用
const workflowDesignRef = ref<InstanceType<typeof WorkflowDesign>>(); // 工作流设计组件引用
const currentStep = ref(-1); // 步骤控制。-1 用于,一开始全部不展示等当前页面数据初始化完成
const steps = [
{ title: '基本信息', validator: validateBasic },
{ title: '工作流设计', validator: validateWorkflow },
];
const formData: any = ref({
id: undefined,
name: '',
code: '',
remark: '',
graph: '',
status: CommonStatusEnum.ENABLE,
}); // 表单数据
const llmProvider = ref<any>([]);
const workflowData = ref<any>({});
provide('workflowData', workflowData);
/** 步骤校验函数 */
async function validateBasic() {
@@ -40,30 +57,9 @@ async function validateWorkflow() {
await workflowDesignRef.value?.validate();
}
const currentStep = ref(-1); // 步骤控制。-1 用于,一开始全部不展示等当前页面数据初始化完成
const steps = [
{ title: '基本信息', validator: validateBasic },
{ title: '工作流设计', validator: validateWorkflow },
];
// 表单数据
const formData: any = ref({
id: undefined,
name: '',
code: '',
remark: '',
graph: '',
status: CommonStatusEnum.ENABLE,
});
const llmProvider = ref<any>([]);
const workflowData = ref<any>({});
provide('workflowData', workflowData);
async function initData() {
if (actionType.value === 'update' && workflowId.value) {
formData.value = await getWorkflow(workflowId.value);
formData.value = await getWorkflow(workflowId.value as any);
workflowData.value = JSON.parse(formData.value.graph);
}
const models = await getModelSimpleList(AiModelTypeEnum.CHAT);

View File

@@ -8,10 +8,8 @@ import { getDictOptions } from '@vben/hooks';
import { Form, Input, Select } from 'ant-design-vue';
// 创建本地数据副本
const modelData = defineModel<any>();
// 表单引用
const formRef = ref();
const modelData = defineModel<any>(); // 创建本地数据副本
const formRef = ref(); // 表单引用
const rules: Record<string, Rule[]> = {
code: [{ required: true, message: '流程标识不能为空', trigger: 'blur' }],
name: [{ required: true, message: '流程名称不能为空', trigger: 'blur' }],

View File

@@ -1,5 +1,6 @@
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { AiWorkflowApi } from '#/api/ai/workflow';
import { Page } from '@vben/common-ui';
@@ -17,14 +18,14 @@ function handleRefresh() {
gridApi.query();
}
/** 创建 */
/** 创建工作流 */
function handleCreate() {
router.push({
name: 'AiWorkflowCreate',
});
}
/** 编辑 */
/** 编辑工作流 */
function handleEdit(row: any) {
router.push({
name: 'AiWorkflowCreate',
@@ -32,17 +33,15 @@ function handleEdit(row: any) {
});
}
/** 删除 */
/** 删除工作流 */
async function handleDelete(row: any) {
const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]),
duration: 0,
});
try {
await deleteWorkflow(row.id as number);
message.success({
content: $t('ui.actionMessage.deleteSuccess', [row.name]),
});
await deleteWorkflow(row.id!);
message.success($t('ui.actionMessage.deleteSuccess', [row.name]));
handleRefresh();
} finally {
hideLoading();
@@ -70,12 +69,13 @@ const [Grid, gridApi] = useVbenVxeGrid({
},
rowConfig: {
keyField: 'id',
isHover: true,
},
toolbarConfig: {
refresh: true,
search: true,
},
} as VxeTableGridOptions<any>,
} as VxeTableGridOptions<AiWorkflowApi.Workflow>,
});
</script>

View File

@@ -23,7 +23,7 @@ async function handleDelete(row: AiImageApi.Image) {
text: $t('ui.actionMessage.deleting', [row.id]),
});
try {
await deleteImage(row.id as number);
await deleteImage(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -54,7 +54,7 @@ async function handleDelete(row: AiKnowledgeDocumentApi.KnowledgeDocument) {
text: $t('ui.actionMessage.deleting', [row.name]),
});
try {
await deleteKnowledgeDocument(row.id as number);
await deleteKnowledgeDocument(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name]));
handleRefresh();
} finally {

View File

@@ -44,7 +44,7 @@ async function handleDelete(row: AiKnowledgeKnowledgeApi.Knowledge) {
text: $t('ui.actionMessage.deleting', [row.name]),
});
try {
await deleteKnowledge(row.id as number);
await deleteKnowledge(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.name]));
handleRefresh();
} finally {

View File

@@ -50,7 +50,7 @@ async function handleDelete(row: AiKnowledgeSegmentApi.KnowledgeSegment) {
text: $t('ui.actionMessage.deleting', [row.id]),
});
try {
await deleteKnowledgeSegment(row.id as number);
await deleteKnowledgeSegment(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -30,7 +30,7 @@ async function handleDelete(row: AiMindmapApi.MindMap) {
text: $t('ui.actionMessage.deleting', [row.id]),
});
try {
await deleteMindMap(row.id as number);
await deleteMindMap(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {

View File

@@ -23,7 +23,7 @@ async function handleDelete(row: AiMusicApi.Music) {
text: $t('ui.actionMessage.deleting', [row.id]),
});
try {
await deleteMusic(row.id as number);
await deleteMusic(row.id!);
ElMessage.success($t('ui.actionMessage.deleteSuccess', [row.id]));
handleRefresh();
} finally {