Ver código fonte

feature/1002177

lizi 2 anos atrás
pai
commit
8a63a32491

+ 11 - 0
src/client/duplicateCheck.client.ts

@@ -0,0 +1,11 @@
+import httpClient from "@/services/httpClient";
+import type { DuplicateCheckResponse , DuplicateCheckRequest} from "@/types/report.types";
+import type { Response } from "@/types/response.types";
+import * as urlHelper from "@/libs/url.lib"
+
+const _url = urlHelper.withPrefix('/gw/user/duplicateCheck');
+
+export async function duplicateCheck(duplicateCheckRequest: DuplicateCheckRequest){
+  const resp = await httpClient.post<Response<DuplicateCheckResponse>>(_url(), duplicateCheckRequest);
+  return resp.data.data;
+}

+ 6 - 1
src/services/report.service.ts

@@ -1,5 +1,6 @@
 import * as reportClient from "@/client/report.client";
-import type { ReportCreateRequest, ReportSaveRequest } from "@/types/report.types";
+import * as duplicateCheckClient from "@/client/duplicateCheck.client";
+import type { ReportCreateRequest, ReportSaveRequest, DuplicateCheckRequest } from "@/types/report.types";
 
 export async function get(id: number): Promise<ReportSaveRequest> {
   const resp = await reportClient.get(id);
@@ -25,3 +26,7 @@ export async function updateStatus(id: number){
 export async function remove(id: number) {
   return reportClient.remove(id);
 }
+
+export function duplicateCheck(duplicateCheckRequest: DuplicateCheckRequest){
+  return duplicateCheckClient.duplicateCheck(duplicateCheckRequest);
+}

+ 12 - 0
src/types/report.types.ts

@@ -184,3 +184,15 @@ export interface Logo {
   name: string;
   url: string;
 }
+
+export interface DuplicateCheckRequest{
+  from?: number;
+  size?: number;
+  reportId: string;
+  similarity?: string;
+  contents: string[];
+}
+
+export interface DuplicateCheckResponse{
+  totals: number[];
+}

+ 36 - 1
src/views/report/ReportEditorView.vue

@@ -8,7 +8,7 @@ import ReportField from "./components/report-create/ReportField.vue"
 import DynamicMeta from './components/dynamic-meta/DynamicMeta.vue';
 import ChapterTypeSelect from "./components/ChapterTypeSelect.vue";
 import LogoComponent from "./components/LogoComponent.vue";
-import type { Chapter, ChapterType, ReportMetadataItem, ReportSaveRequest, ReportTemplateSave } from "@/types/report.types";
+import type { Chapter, ChapterType, ReportMetadataItem, ReportSaveRequest, ReportTemplateSave, DuplicateCheckRequest, ReportChapterRequest } from "@/types/report.types";
 import { ChapterManager } from "@/models/report.model";
 import ChapterEditor from "./components/ChapterEditor.vue";
 import * as reportService from "@/services/report.service";
@@ -32,12 +32,18 @@ const reportExport = useReportExport()
 // 权限store
 const authStore = useAuthStore()
 
+const chapterEditors = ref<any | null>([])
+
 const report: Ref<ReportSaveRequest | null> = ref(null);
 const relationCompanyEl = ref<HTMLInputElement | null>(null);
 const reportCategoryEl = ref<HTMLInputElement | null>(null);
 const reportNameEl = ref<HTMLInputElement | null>(null);
 const supervisorEl = ref<HTMLInputElement | null>(null);
 const keywordsEl = ref<HTMLInputElement | null>(null);
+const duplicateCheckRequest: Ref<DuplicateCheckRequest> = ref({
+  reportId: "",
+  contents: []
+});
 
 // 报告元数据
 const metadata: Ref<ReportMetadataItem[]> = ref([]);
@@ -236,6 +242,33 @@ function getStatus(){
   reportStatus.value = reportStatus.value == 0 ? 1 : 0;
 }
 
+function duplicateCheck() {
+  if (report.value) {
+    extract(report.value.chapters, report.value.id +"")
+  }
+ if (duplicateCheckRequest?.value) {
+  reportService.duplicateCheck(duplicateCheckRequest.value).then((data: any) => {
+    let index = 0;
+    for (let item of data.totals) {
+      console.log(item)
+      if (item && item > 0) {
+        chapterEditors.value[index]?.pointer();
+      }
+      index += 1;
+    }
+  })
+ }
+}
+
+function extract(chapters: ReportChapterRequest[], id: string) {
+  for (var i = 0; i < chapters.length; i ++) {
+    duplicateCheckRequest.value?.contents.push(chapters[i].content)
+  }
+  if (duplicateCheckRequest?.value) {
+      duplicateCheckRequest.value.reportId = id;
+  }
+}
+
 onMounted(() => {
   const id = parseInt(route.params.id as string);
   if (id && id > 0) {
@@ -286,6 +319,7 @@ onUnmounted(() => {
       v-for="(item, index) in chapterManager.getChapters()"
       :key="index"
       :data="item"
+      ref="chapterEditors"
       :reportKeywords="report.keywords"
       @change="onChapterChange(index, $event)"
       @move-up="onChapterMoveUp(index)"
@@ -309,6 +343,7 @@ onUnmounted(() => {
       <a-button @click="onPreview">预览</a-button>
       <a-button @click="onExport" :loading="exporting">导出</a-button>
       <a-button @click="showTemplateSaveModal">另保存为模板</a-button>
+      <a-button @click="duplicateCheck">查重</a-button>
     </a-space>
   </div>
   <ChapterTypeSelect @ok="onChapterTypeSelected" v-model:visible="chapterTypeSelectVisible" />

+ 9 - 0
src/views/report/components/ChapterEditor.vue

@@ -125,6 +125,15 @@ function onReferenceDrawClose() {
 function onSectionRecordUse(sectionId: number) {
   emits("sectionRecordUse", sectionId)
 }
+
+function pointer(){
+  contentEditor.value?.createErrorNotification()
+}
+
+defineExpose({
+  pointer
+})
+
 </script>
 
 <template>

+ 15 - 0
src/views/report/components/ContentEditor.vue

@@ -35,6 +35,9 @@ const editInit = {
   file_picker_types: 'image',
   file_picker_callback: filePickerCallback,
   height: 260,
+  init_instance_callback : function(editor:any){
+    tinymce.value = editor
+  }
 }
 
 /**
@@ -73,6 +76,8 @@ function onChange() {
 
 const editor = ref<any>(null)
 
+const tinymce = ref<any>(null)
+
 function onInit(event: any, editorIn: any) {
   editor.value = editorIn
 }
@@ -85,6 +90,15 @@ function insert(text: string) {
   editor.value.insertContent(text)
 }
 
+function createErrorNotification() {
+  if (tinymce.value) {
+    tinymce.value.notificationManager.open({
+      text: '该章节重复率过高',
+      type: 'warning'
+    });
+  }
+}
+
 onMounted(() => {
   content.value = props.data;
 
@@ -99,6 +113,7 @@ onMounted(() => {
 defineExpose({
   focus,
   insert,
+  createErrorNotification
 })
 </script>