From 5705f3c4a819a4407cd5530a4af8fd312308617f Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Sun, 28 Apr 2024 14:35:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E6=A1=A3=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=91=BD=E4=B8=AD=E5=A4=84=E7=90=86=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=20(#293)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serializers/document_serializers.py | 13 +++ apps/dataset/swagger_api/document_api.py | 27 ++++++ apps/dataset/urls.py | 1 + apps/dataset/views/document.py | 19 ++++ ui/src/api/document.ts | 17 +++- .../component/BatchEditDocumentDialog.vue | 96 +++++++++++++++++++ ui/src/views/document/index.vue | 21 +++- 7 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 apps/dataset/swagger_api/document_api.py create mode 100644 ui/src/views/document/component/BatchEditDocumentDialog.vue diff --git a/apps/dataset/serializers/document_serializers.py b/apps/dataset/serializers/document_serializers.py index f2acfb9df..7d0149468 100644 --- a/apps/dataset/serializers/document_serializers.py +++ b/apps/dataset/serializers/document_serializers.py @@ -713,6 +713,19 @@ class DocumentSerializers(ApiMixin, serializers.Serializer): ListenerManagement.delete_embedding_by_document_list_signal.send(document_id_list) return True + def batch_edit_hit_handling(self, instance: Dict, with_valid=True): + if with_valid: + BatchSerializer(data=instance).is_valid(model=Document, raise_exception=True) + hit_handling_method = instance.get('hit_handling_method') + if hit_handling_method is None: + raise AppApiException(500, '命中处理方式必填') + if hit_handling_method != 'optimization' and hit_handling_method != 'directly_return': + raise AppApiException(500, '命中处理方式必须为directly_return|optimization') + self.is_valid(raise_exception=True) + document_id_list = instance.get("id_list") + hit_handling_method = instance.get('hit_handling_method') + QuerySet(Document).filter(id__in=document_id_list).update(hit_handling_method=hit_handling_method) + class FileBufferHandle: buffer = None diff --git a/apps/dataset/swagger_api/document_api.py b/apps/dataset/swagger_api/document_api.py new file mode 100644 index 000000000..1463a61c2 --- /dev/null +++ b/apps/dataset/swagger_api/document_api.py @@ -0,0 +1,27 @@ +# coding=utf-8 +""" + @project: maxkb + @Author:虎 + @file: document_api.py + @date:2024/4/28 13:56 + @desc: +""" +from drf_yasg import openapi + +from common.mixins.api_mixin import ApiMixin + + +class DocumentApi(ApiMixin): + class BatchEditHitHandlingApi(ApiMixin): + @staticmethod + def get_request_body_api(): + return openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + 'id_list': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING), + title="主键id列表", + description="主键id列表"), + 'hit_handling_method': openapi.Schema(type=openapi.TYPE_STRING, title="命中处理方式", + description="directly_return|optimization") + } + ) diff --git a/apps/dataset/urls.py b/apps/dataset/urls.py index 5ed09a199..be68ccdc4 100644 --- a/apps/dataset/urls.py +++ b/apps/dataset/urls.py @@ -14,6 +14,7 @@ urlpatterns = [ path('dataset//document', views.Document.as_view(), name='document'), path('dataset//document/web', views.WebDocument.as_view()), path('dataset//document/_bach', views.Document.Batch.as_view()), + path('dataset//document/batch_hit_handling', views.Document.BatchEditHitHandling.as_view()), path('dataset//document//', views.Document.Page.as_view()), path('dataset//document/', views.Document.Operate.as_view(), name="document_operate"), diff --git a/apps/dataset/views/document.py b/apps/dataset/views/document.py index fd6797b01..a727a31fa 100644 --- a/apps/dataset/views/document.py +++ b/apps/dataset/views/document.py @@ -19,6 +19,7 @@ from common.response import result from common.util.common import query_params_to_single_dict from dataset.serializers.common_serializers import BatchSerializer from dataset.serializers.document_serializers import DocumentSerializers, DocumentWebInstanceSerializer +from dataset.swagger_api.document_api import DocumentApi class WebDocument(APIView): @@ -71,6 +72,24 @@ class Document(APIView): d.is_valid(raise_exception=True) return result.success(d.list()) + class BatchEditHitHandling(APIView): + authentication_classes = [TokenAuth] + + @action(methods=['POST'], detail=False) + @swagger_auto_schema(operation_summary="批量修改文档命中处理方式", + operation_id="批量修改文档命中处理方式", + request_body= + DocumentApi.BatchEditHitHandlingApi.get_request_body_api(), + manual_parameters=DocumentSerializers.Create.get_request_params_api(), + responses=result.get_default_response(), + tags=["知识库/文档"]) + @has_permissions( + lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, + dynamic_tag=k.get('dataset_id'))) + def put(self, request: Request, dataset_id: str): + return result.success( + DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_edit_hit_handling(request.data)) + class Batch(APIView): authentication_classes = [TokenAuth] diff --git a/ui/src/api/document.ts b/ui/src/api/document.ts index fdd070573..8affd3742 100644 --- a/ui/src/api/document.ts +++ b/ui/src/api/document.ts @@ -206,6 +206,20 @@ const putMigrateMulDocument: ( ) } +/** + * 批量修改命中方式 + * @param dataset_id 知识库id + * @param data {id_list:[],hit_handling_method:'directly_return|optimization'} + * @param loading + * @returns + */ +const batchEditHitHandling: ( + dataset_id: string, + data: any, + loading?: Ref +) => Promise> = (dataset_id, data, loading) => { + return put(`${prefix}/${dataset_id}/document/batch_hit_handling`, data, undefined, loading) +} export default { postSplitDocument, getDocument, @@ -219,5 +233,6 @@ export default { putDocumentRefresh, delMulSyncDocument, postWebDocument, - putMigrateMulDocument + putMigrateMulDocument, + batchEditHitHandling } diff --git a/ui/src/views/document/component/BatchEditDocumentDialog.vue b/ui/src/views/document/component/BatchEditDocumentDialog.vue new file mode 100644 index 000000000..55c0de0a5 --- /dev/null +++ b/ui/src/views/document/component/BatchEditDocumentDialog.vue @@ -0,0 +1,96 @@ + + + diff --git a/ui/src/views/document/index.vue b/ui/src/views/document/index.vue index 02a0434ec..65a5f2cc1 100644 --- a/ui/src/views/document/index.vue +++ b/ui/src/views/document/index.vue @@ -21,10 +21,13 @@ >同步文档 批量迁移迁移 + 设置 批量删除删除 @@ -212,6 +215,10 @@ + @@ -225,6 +232,7 @@ import documentApi from '@/api/document' import ImportDocumentDialog from './component/ImportDocumentDialog.vue' import SyncWebDialog from '@/views/dataset/component/SyncWebDialog.vue' import SelectDatasetDialog from './component/SelectDatasetDialog.vue' +import BatchEditDocumentDialog from './component/BatchEditDocumentDialog.vue' import { numberFormat } from '@/utils/utils' import { datetimeFormat } from '@/utils/time' import { hitHandlingMethod } from './utils' @@ -257,7 +265,7 @@ onBeforeRouteLeave((to: any, from: any) => { }) const beforePagination = computed(() => common.paginationConfig[storeKey]) const beforeSearch = computed(() => common.search[storeKey]) - +const batchEditDocumentDialogRef = ref>() const SyncWebDialogRef = ref() const loading = ref(false) let interval: any @@ -317,6 +325,13 @@ const handleSelectionChange = (val: any[]) => { multipleSelection.value = val } +function openBatchEditDocument() { + const arr: string[] = multipleSelection.value.map((v) => v.id) + if (batchEditDocumentDialogRef) { + batchEditDocumentDialogRef?.value?.open(arr) + } +} + /** * 初始化轮询 */