Kaynağa Gözat

reactor:新增知识查重功能;

zhangchong 11 ay önce
ebeveyn
işleme
bc40c71442

+ 12 - 0
src/api/knowledge/index.ts

@@ -212,6 +212,18 @@ export const knowledgeTitle = (params: object) => {
 		params,
 	});
 };
+/**
+ * @description  校验知识标题摘要内容是否重复
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeContent = (data:object) => {
+	return request({
+		url: `/api/v1/Knowledge/finding_duplicate`,
+		method: 'post',
+		data,
+	});
+};
 /**
  * @description  获取知识库审批信息
  * @param {object} params

+ 21 - 15
src/components/Editor/index.vue

@@ -8,6 +8,7 @@
 			v-model="state.editorVal"
 			@onCreated="handleCreated"
 			@onChange="handleChange"
+			@onBlur="handleBlur"
 		/>
 	</div>
 </template>
@@ -18,7 +19,7 @@ import { IDomEditor, Boot } from '@wangeditor/editor';
 import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
 import { Cookie } from '@/utils/storage';
 import { uploadFile } from '@/api/public/upload';
-import {ElMessage} from "element-plus";
+import { ElMessage } from 'element-plus';
 //  全局配置
 // 定义父组件传过来的值
 const props = defineProps({
@@ -49,7 +50,7 @@ const props = defineProps({
 	getText: String,
 });
 // 定义子组件向父组件传值/事件
-const emit = defineEmits(['update:getHtml', 'update:getText']);
+const emit = defineEmits(['update:getHtml', 'update:getText', 'blur']);
 
 const editorRef = shallowRef<RefType>();
 const state = reactive<any>({
@@ -70,19 +71,21 @@ type InsertFnType = (url: string, alt: string, href: string) => void;
 state.editorConfig.MENU_CONF['uploadImage'] = {
 	// 自定义上传
 	async customUpload(file: File, insertFn: InsertFnType) {
-    // 限制文件不能大于100M
-    if (file.size > 10 * 1024 * 1024) {
-      ElMessage.error('上传图片不能大于10M');
-      return;
-    }
-    const formData = new FormData();
-    formData.append('fileData', file);
-		uploadFile(formData).then((res) => {
-			insertFn( import.meta.env.VITE_FILE_PREFIX+res.result.path,'加载失败','')
-		}).catch((err) => {
-      ElMessage.error(err);
-    });
-	}
+		// 限制文件不能大于100M
+		if (file.size > 10 * 1024 * 1024) {
+			ElMessage.error('上传图片不能大于10M');
+			return;
+		}
+		const formData = new FormData();
+		formData.append('fileData', file);
+		uploadFile(formData)
+			.then((res) => {
+				insertFn(import.meta.env.VITE_FILE_PREFIX + res.result.path, '加载失败', '');
+			})
+			.catch((err) => {
+				ElMessage.error(err);
+			});
+	},
 };
 
 // //上传视频
@@ -169,6 +172,9 @@ nextTick(() => {
 		}
 	);
 });
+const handleBlur = (editor) => {
+	emit('blur', editor);
+};
 // 默认为空字符串
 function withEmptyHtml<T extends IDomEditor>(editor: T): T {
 	const { getHtml } = editor;

+ 305 - 287
src/views/knowledge/index/edit.vue

@@ -11,287 +11,292 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识归属">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="知识归属" prop="attribution" :rules="[{ required: true, message: '请选择知识归属', trigger: 'change' }]">
-                  <!--  是否是中心 -->
-                  <el-select v-model="state.ruleForm.attribution" placeholder="请选择知识归属" class="w100" :disabled="userInfos.isCenter">
-                    <el-option label="中心知识库" value="中心知识库" />
-                    <el-option label="部门知识库" value="部门知识库" />
-                  </el-select>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识归属">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="知识归属" prop="attribution" :rules="[{ required: true, message: '请选择知识归属', trigger: 'change' }]">
+									<!--  是否是中心 -->
+									<el-select v-model="state.ruleForm.attribution" placeholder="请选择知识归属" class="w100" :disabled="userInfos.isCenter">
+										<el-option label="中心知识库" value="中心知识库" />
+										<el-option label="部门知识库" value="部门知识库" />
+									</el-select>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8" >
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识分类">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="知识分类" prop="knowledgeTypeId" :rules="[{ required: true, message: '请选择知识分类', trigger: 'change' }]">
-                  <el-cascader
-                    :options="state.typeData"
-                    filterable
-                    :props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'children',multiple: true }"
-                    placeholder="请选择知识分类"
-                    clearable
-                    class="w100"
-                    v-model="state.ruleForm.knowledgeTypeId"
-                    ref="cascadeRef"
-                    @change="getKnowledgeList"
-                    collapse-tags
-                    collapse-tags-tooltip
-                    :max-collapse-tags="2"
-
-                  >
-                  </el-cascader>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识分类">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="知识分类" prop="knowledgeTypeId" :rules="[{ required: true, message: '请选择知识分类', trigger: 'change' }]">
+									<el-cascader
+										:options="state.typeData"
+										filterable
+										:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'children', multiple: true }"
+										placeholder="请选择知识分类"
+										clearable
+										class="w100"
+										v-model="state.ruleForm.knowledgeTypeId"
+										ref="cascadeRef"
+										@change="getKnowledgeList"
+										collapse-tags
+										collapse-tags-tooltip
+										:max-collapse-tags="2"
+									>
+									</el-cascader>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item>
-                  <template #label>
-                    <div style="height: 34px; display: flex; align-items: center">
-                      失效时间
-                      <el-tooltip placement="top-start">
-                        <SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
-                        <template #content> 不设置则代表永久有效;到达预设失效时间,知识将自动下架 </template>
-                      </el-tooltip>
-                    </div>
-                  </template>
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="失效时间" prop="expiredTime" :rules="[{ required: false, message: '请选择失效时间', trigger: 'change' }]">
-                  <template #label>
-                    <div style="height: 34px; display: flex; align-items: center">
-                      失效时间
-                      <el-tooltip placement="top-start">
-                        <SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
-                        <template #content> 不设置则代表永久有效;到达预设失效时间,知识将自动下架 </template>
-                      </el-tooltip>
-                    </div>
-                  </template>
-                  <el-date-picker
-                    v-model="state.ruleForm.expiredTime"
-                    type="datetime"
-                    placeholder="请选择失效时间"
-                    class="w100"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
-                    :disabled-date="disabledDate"
-                    popper-class="no-atTheMoment"
-                  />
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item>
+									<template #label>
+										<div style="height: 34px; display: flex; align-items: center">
+											失效时间
+											<el-tooltip placement="top-start">
+												<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
+												<template #content> 不设置则代表永久有效;到达预设失效时间,知识将自动下架 </template>
+											</el-tooltip>
+										</div>
+									</template>
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="失效时间" prop="expiredTime" :rules="[{ required: false, message: '请选择失效时间', trigger: 'change' }]">
+									<template #label>
+										<div style="height: 34px; display: flex; align-items: center">
+											失效时间
+											<el-tooltip placement="top-start">
+												<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
+												<template #content> 不设置则代表永久有效;到达预设失效时间,知识将自动下架 </template>
+											</el-tooltip>
+										</div>
+									</template>
+									<el-date-picker
+										v-model="state.ruleForm.expiredTime"
+										type="datetime"
+										placeholder="请选择失效时间"
+										class="w100"
+										value-format="YYYY-MM-DD[T]HH:mm:ss"
+										:disabled-date="disabledDate"
+										popper-class="no-atTheMoment"
+									/>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="是否公开">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="是否公开" prop="isPublic" :rules="[{ required: false, message: '请选择是否公开', trigger: 'change' }]">
-                  <el-radio-group v-model="state.ruleForm.isPublic">
-                    <el-radio :label="true">是</el-radio>
-                    <el-radio :label="false">否</el-radio>
-                  </el-radio-group>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="是否公开">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="是否公开" prop="isPublic" :rules="[{ required: false, message: '请选择是否公开', trigger: 'change' }]">
+									<el-radio-group v-model="state.ruleForm.isPublic">
+										<el-radio :label="true">是</el-radio>
+										<el-radio :label="false">否</el-radio>
+									</el-radio-group>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="来源部门" prop="sourceOrganizeId" :rules="[{ required: true, message: '请选择来源部门', trigger: 'change' }]">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="来源部门" prop="sourceOrganizeId" :rules="[{ required: true, message: '请选择来源部门', trigger: 'change' }]">
-                  <el-cascader
-                    :options="orgsOptions"
-                    filterable
-                    :props="{ value: 'id', label: 'name', emitPath: false, checkStrictly: true }"
-                    placeholder="请选择来源部门"
-                    class="w100"
-                    v-model="state.ruleForm.sourceOrganizeId"
-                    ref="orgRef"
-                  >
-                  </el-cascader>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="来源部门" prop="sourceOrganizeId" :rules="[{ required: true, message: '请选择来源部门', trigger: 'change' }]">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="来源部门" prop="sourceOrganizeId" :rules="[{ required: true, message: '请选择来源部门', trigger: 'change' }]">
+									<el-cascader
+										:options="orgsOptions"
+										filterable
+										:props="{ value: 'id', label: 'name', emitPath: false, checkStrictly: true }"
+										placeholder="请选择来源部门"
+										class="w100"
+										v-model="state.ruleForm.sourceOrganizeId"
+										ref="orgRef"
+									>
+									</el-cascader>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="热点分类">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="热点分类" prop="hotspotId" :rules="[{ required: true, message: '请选择热点分类', trigger: 'change' }]">
-                  <hot-spot-select
-                    v-model="state.ruleForm.hotspotId"
-                    class="w100"
-                    :externalArr="state.hotspotExternal"
-                    @choose="chooseHotSpot"
-                  />
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="热点分类">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="热点分类" prop="hotspotId" :rules="[{ required: true, message: '请选择热点分类', trigger: 'change' }]">
+									<hot-spot-select v-model="state.ruleForm.hotspotId" class="w100" :externalArr="state.hotspotExternal" @choose="chooseHotSpot" />
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识标题">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="知识标题" prop="title" :rules="[{ required: true, validator: validatePass, trigger: 'blur' }]">
-                  <el-input v-model="state.ruleForm.title" placeholder="请输入知识标题" clearable @blur="isRepeat"></el-input>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识标题">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="知识标题" prop="title" :rules="[{ required: true, validator: validatePassTitle, trigger: 'blur' }]">
+									<el-input v-model="state.ruleForm.title" placeholder="请输入知识标题" clearable @blur="isRepeat('title')"></el-input>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识摘要">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="知识摘要" prop="summary" :rules="[{ required: false, message: '请输入知识摘要', trigger: 'blur' }]">
-                  <el-input v-model="state.ruleForm.summary" placeholder="请输入知识摘要" clearable></el-input>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识摘要">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="知识摘要" prop="summary" :rules="[{ required: false, validator: validatePassSummary, trigger: 'blur' }]">
+									<el-input v-model="state.ruleForm.summary" placeholder="请输入知识摘要" clearable @blur="isRepeat('summary')"></el-input>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识摘要">
-                  <template #label>
-                    <div style="height: 34px; display: flex; align-items: center">
-                      关联知识
-                      <el-tooltip placement="top-start">
-                        <SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
-                        <template #content> 关联其它相似或业务相关的知识,方便话务员可以查询其他相似的知识 </template>
-                      </el-tooltip>
-                    </div>
-                  </template>
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="关联知识" prop="knowledges" :rules="[{ required: false, message: '请选择关联知识', trigger: 'change' }]">
-                  <template #label>
-                    <div style="height: 34px; display: flex; align-items: center">
-                      关联知识
-                      <el-tooltip placement="top-start">
-                        <SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
-                        <template #content> 关联其它相似或业务相关的知识,方便话务员可以查询其他相似的知识 </template>
-                      </el-tooltip>
-                    </div>
-                  </template>
-                  <el-select-v2
-                    v-model="state.ruleForm.knowledges"
-                    filterable
-                    clearable
-                    :options="state.knowledgeOptions"
-                    placeholder="请选择关联知识"
-                    class="w100"
-                    multiple
-                    collapse-tags
-                    collapse-tags-tooltip
-                    :max-collapse-tags="5"
-                    :props="{
-                  label: 'title',
-                  value: 'id',
-                }"
-                  />
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识摘要">
+									<template #label>
+										<div style="height: 34px; display: flex; align-items: center">
+											关联知识
+											<el-tooltip placement="top-start">
+												<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
+												<template #content> 关联其它相似或业务相关的知识,方便话务员可以查询其他相似的知识 </template>
+											</el-tooltip>
+										</div>
+									</template>
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="关联知识" prop="knowledges" :rules="[{ required: false, message: '请选择关联知识', trigger: 'change' }]">
+									<template #label>
+										<div style="height: 34px; display: flex; align-items: center">
+											关联知识
+											<el-tooltip placement="top-start">
+												<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
+												<template #content> 关联其它相似或业务相关的知识,方便话务员可以查询其他相似的知识 </template>
+											</el-tooltip>
+										</div>
+									</template>
+									<el-select-v2
+										v-model="state.ruleForm.knowledges"
+										filterable
+										clearable
+										:options="state.knowledgeOptions"
+										placeholder="请选择关联知识"
+										class="w100"
+										multiple
+										collapse-tags
+										collapse-tags-tooltip
+										:max-collapse-tags="5"
+										:props="{
+											label: 'title',
+											value: 'id',
+										}"
+									/>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="关键词">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="关键词" prop="keywordsName" :rules="[{ required: false, message: '请添加关键词', trigger: 'change' }]">
-                  <el-input v-model="state.ruleForm.keywordsName" readonly placeholder="请添加关键词" max-length="200" clearable>
-                    <template #append>
-                      <el-button @click="addKeywords">添加</el-button>
-                    </template>
-                  </el-input>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="关键词">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="关键词" prop="keywordsName" :rules="[{ required: false, message: '请添加关键词', trigger: 'change' }]">
+									<el-input v-model="state.ruleForm.keywordsName" readonly placeholder="请添加关键词" max-length="200" clearable>
+										<template #append>
+											<el-button @click="addKeywords">添加</el-button>
+										</template>
+									</el-input>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识库模板">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="知识库模板" prop="template" :rules="[{ required: false, message: '请选择知识库模板', trigger: 'change' }]">
-                  <el-select v-model="state.ruleForm.template" placeholder="请选择知识库模板" class="w100" @change="selectTemplate" clearable>
-                    <el-option :label="item.label" :value="item.value" v-for="item in templateList" :key="item.id" />
-                  </el-select>
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识库模板">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="知识库模板" prop="template" :rules="[{ required: false, message: '请选择知识库模板', trigger: 'change' }]">
+									<el-select v-model="state.ruleForm.template" placeholder="请选择知识库模板" class="w100" @change="selectTemplate" clearable>
+										<el-option :label="item.label" :value="item.value" v-for="item in templateList" :key="item.id" />
+									</el-select>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="知识内容">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="知识内容" prop="content" :rules="[{ required: true, message: '请输入知识内容', trigger: 'blur' }]">
-                  <editor v-model:get-html="state.ruleForm.content" :disable="state.disable" placeholder="请输入知识内容" />
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="知识内容">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="知识内容" prop="content" :rules="[{ required: true, validator: validatePassContent, trigger: 'blur' }]">
+									<editor
+										v-model:get-html="state.ruleForm.content"
+										:disable="state.disable"
+										placeholder="请输入知识内容"
+										@blur="isRepeat('content')"
+									/>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-skeleton :loading="state.loading" animated>
-              <template #template>
-                <el-form-item label="附件">
-                  <el-skeleton-item variant="h1"/>
-                </el-form-item>
-              </template>
-              <template #default>
-                <el-form-item label="附件" prop="files" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
-                  <annex-list name="知识附件" v-model="state.ruleForm.files" v-model:format="filesFormat" :businessId="state.ruleForm.id" classify="知识附件" />
-                </el-form-item>
-              </template>
-            </el-skeleton>
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="附件">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="附件" prop="files" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
+									<annex-list
+										name="知识附件"
+										v-model="state.ruleForm.files"
+										v-model:format="filesFormat"
+										:businessId="state.ruleForm.id"
+										classify="知识附件"
+									/>
+								</el-form-item>
+							</template>
+						</el-skeleton>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item>
@@ -323,10 +328,9 @@ import { storeToRefs } from 'pinia';
 import { useUserInfo } from '@/stores/userInfo';
 import { Local } from '@/utils/storage';
 import other from '@/utils/other';
-import {throttle, transformFile} from '@/utils/tools';
+import { throttle, transformFile } from '@/utils/tools';
 import { treeList } from '@/api/knowledge/type';
-import { KnowledgeAdd, KnowledgeGetKnowledge, KnowledgeInfo, knowledgeTitle, KnowledgeUpdate } from '@/api/knowledge';
-import { hotSpotType } from '@/api/business/order';
+import { KnowledgeAdd, knowledgeContent, KnowledgeGetKnowledge, KnowledgeInfo, KnowledgeUpdate } from '@/api/knowledge';
 import { getCanUseOrg } from '@/api/system/user';
 import { templateList } from '@/views/knowledge/index/template';
 import { disabledDate } from '@/utils/constants';
@@ -350,7 +354,7 @@ const state = reactive<any>({
 		knowledgeTypeId: [], // 知识分类
 		hotspotId: '', // 热点分类
 		knowledges: [], // 关联知识
-    files: [], // 附件
+		files: [], // 附件
 		template: '', // 知识库模板
 		content: '', // 知识内容
 		sourceOrganizeId: '', // 知识来源部门
@@ -364,12 +368,12 @@ const state = reactive<any>({
 const ruleFormRef = ref<any>(); // 表单ref
 // 选择热点分类
 const chooseHotSpot = (val: any, e: any) => {
-  state.ruleForm.hotspotSpliceName = val.hotSpotFullName; // 热点分类拼接名称
-  state.ruleForm.hotspotName = val.hotSpotName; // 热点分类名称
-  state.ruleForm.hotspotCode = val.provinceCode; // 热点分类code
-  state.ruleForm.hotspotExternal = val?.externalArr?.join(',') ?? ''; // 热点分类默认展开项
+	state.ruleForm.hotspotSpliceName = val.hotSpotFullName; // 热点分类拼接名称
+	state.ruleForm.hotspotName = val.hotSpotName; // 热点分类名称
+	state.ruleForm.hotspotCode = val.provinceCode; // 热点分类code
+	state.ruleForm.hotspotExternal = val?.externalArr?.join(',') ?? ''; // 热点分类默认展开项
 };
-const validatePass = (rule: any, value: any, callback: any) => {
+const validatePassTitle = (rule: any, value: any, callback: any) => {
 	if (value === '' || value === null) {
 		callback(new Error('请输入知识标题'));
 	} else if (Repeat.value) {
@@ -378,18 +382,33 @@ const validatePass = (rule: any, value: any, callback: any) => {
 		callback();
 	}
 };
+const validatePassSummary = (rule: any, value: any, callback: any) => {
+	if (Repeat.value) {
+		callback(new Error('有相似摘要,请检查!'));
+	} else {
+		callback();
+	}
+};
+const validatePassContent = (rule: any, value: any, callback: any) => {
+	if (value === '' || value === null) {
+		callback(new Error('请输入知识内容'));
+	} else if (Repeat.value) {
+		callback(new Error('有相似内容,请检查!'));
+	} else {
+		callback();
+	}
+};
 // 校验标题是否重复
 const Repeat = ref<boolean>(false);
-const isRepeat = () => {
-	if (state.ruleForm.title) {
-		const id = state.ruleForm.id ? state.ruleForm.id : '';
-		knowledgeTitle({ Id: id, Title: state.ruleForm.title })
+const isRepeat = (type: string) => {
+	if (state.ruleForm[type]) {
+		knowledgeContent({ [type]: state.ruleForm[type] })
 			.then((res: any) => {
 				Repeat.value = res.result;
-				ruleFormRef.value.validateField('title');
+				ruleFormRef.value.validateField(type);
 			})
 			.catch(() => {
-				state.ruleForm.title = '';
+				state.ruleForm[type] = '';
 			});
 	}
 };
@@ -402,9 +421,9 @@ const cascadeRef = ref<RefType>();
 // 获取选择name值
 const getKnowledgeList = () => {
 	let currentNode = cascadeRef.value.getCheckedNodes();
-  state.ruleForm.knowledgeType = currentNode.map((item: any) => {
-    return {value:item.label,key: item.value,splice: item.data.spliceName}
-  })
+	state.ruleForm.knowledgeType = currentNode.map((item: any) => {
+		return { value: item.label, key: item.value, splice: item.data.spliceName };
+	});
 };
 // 添加关键词
 const knowledgeKeywordsRef = ref<RefType>();
@@ -430,8 +449,7 @@ const onSubmitReview = async (formEl: FormInstance | undefined) => {
 	await formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		state.loading = true;
-    isRepeat();
-    state.ruleForm.files = filesFormat.value;
+		state.ruleForm.files = filesFormat.value;
 		const submitObj = other.deepClone(state.ruleForm);
 		Reflect.deleteProperty(submitObj, 'creationTime');
 		//如果已经有ID 说明是已经提交过的数据 提交更新流程
@@ -513,12 +531,12 @@ const onSaveOnly = throttle(async (formEl: FormInstance | undefined) => {
 	await formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		state.loading = true;
-    state.ruleForm.files = filesFormat.value;
+		state.ruleForm.files = filesFormat.value;
 		const submitObj = other.deepClone(state.ruleForm);
 		Reflect.deleteProperty(submitObj, 'creationTime');
 		if (route.params.id) {
 			// 更新
-			KnowledgeUpdate({ data: {...submitObj,status:0} })
+			KnowledgeUpdate({ data: { ...submitObj, status: 0 } })
 				.then(handleSuccess)
 				.catch(() => {
 					state.loading = false;
@@ -566,7 +584,7 @@ const getKnowledgeType = async () => {
 		state.typeData = typeDataRes.result ?? [];
 		state.knowledgeOptions = knowledgeOptionsRes.result ?? [];
 		orgsOptions.value = orgsOptionsRes.result ?? [];
-    await getDetail();
+		await getDetail();
 		state.loading = false;
 	} catch (error) {
 		state.loading = false;
@@ -576,16 +594,16 @@ const getDetail = async () => {
 	if (route.params.id) {
 		const res: any = await KnowledgeInfo(route.params.id); //知识详情
 		state.ruleForm = res.result ?? {};
-    state.ruleForm.files = transformFile(state.ruleForm.files);
-    if (state.ruleForm.hotspotExternal) {
-      //热点分类默认展开
-      state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
-    }
+		state.ruleForm.files = transformFile(state.ruleForm.files);
+		if (state.ruleForm.hotspotExternal) {
+			//热点分类默认展开
+			state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
+		}
 		state.ruleForm.knowledges = state.ruleForm.knowledges ?? [];
 		if (state.ruleForm.keywordsDto && state.ruleForm.keywordsDto.length) {
 			state.ruleForm.keywordsName = state.ruleForm.keywordsDto.map((item: any) => item.tag).join(',');
 		}
-    state.ruleForm.knowledgeTypeId = state.ruleForm.knowledgeType.map((item: any) => item.key);
+		state.ruleForm.knowledgeTypeId = state.ruleForm.knowledgeType.map((item: any) => item.key);
 	}
 };
 onMounted(() => {