Browse Source

reactor:知识库调整;

zhangchong 3 months ago
parent
commit
b80fc9583a

+ 1 - 1
.env.development

@@ -3,7 +3,7 @@ VITE_MODE_NAME=development
 # 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
 VITE_STORAGE_NAME=dev
 # 业务系统基础请求地址
-VITE_API_URL=http://110.188.24.28:50100
+VITE_API_URL=http://110.188.24.28:50300
 # 业务系统socket请求地址
 VITE_API_SOCKET_URL=http://110.188.24.28:50100/hubs/hotline
 # 业务系统文件上传上传请求地址

+ 40 - 0
src/api/knowledge/audit.ts

@@ -0,0 +1,40 @@
+/*
+ * @Author: zc
+ * @description 知识管理 - 审核管理
+ */
+import request from '@/utils/request';
+/**
+ * @description 查询知识库审批列表
+ * @param params
+ * @return {*}
+ */
+export const knowledgeAuditList = (params: object) => {
+	return request({
+		url: '/api/v1/Knowledge/approve-paged',
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 查询审核历史
+ * @param id
+ * @return {*}
+ */
+export const knowledgeAuditHistory = (id: string) => {
+	return request({
+		url: `/api/v1/Knowledge/approve-history/{id}`,
+		method: 'get',
+	});
+};
+/**
+ * @description 批量审核
+ * @param data
+ * @return {*}
+ */
+export const knowledgeAuditBatch = (data: object) => {
+	return request({
+		url: '/api/v1/Knowledge/approve-batch',
+		method: 'post',
+		data,
+	});
+};

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

@@ -98,6 +98,18 @@ export const KnowledgeOffShelf = (data: object) => {
 		data,
 	});
 };
+/**
+ * @description 知识库下架不走流程
+ * @param {string} data
+ * @return {*}
+ */
+export const KnowledgeOffShelfNew = (data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/offshelf`,
+		method: 'put',
+		data,
+	});
+};
 /*export const KnowledgeOffShelf = (Id: string) => {
 	return request({
 		url: `/api/v1/Knowledge/offshelf?Id=${Id}`,
@@ -313,3 +325,75 @@ export const knowledgeBatchAudit = (data: object) => {
 		data,
 	});
 };
+/**
+ * @description  知识库新增草稿
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeDraft = (data: object) => {
+	return request({
+		url: `/api/v1/Knowledge`,
+		method: 'post',
+		data,
+	});
+};
+/**
+ * @description  知识库新增发起审批
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeDraftAudit = (data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/add-and-approve`,
+		method: 'post',
+		data,
+	});
+};
+/**
+ * @description  知识库编辑草稿
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeDraftEdit = (data: object) => {
+	return request({
+		url: `/api/v1/Knowledge`,
+		method: 'put',
+		data,
+	});
+};
+/**
+ * @description  知识库编辑提交审批
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeDraftEditAudit = (data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/update-and-approve`,
+		method: 'put',
+		data,
+	});
+};
+/**
+ * @description  知识库删除提交审核
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeDraftDeleteAudit = (data: object) => {
+	return request({
+		url: `/api/v1/Knowledge/remove`,
+		method: 'delete',
+		data,
+	});
+};
+/**
+ * @description  知识库批量更新是否公开状态
+ * @param {object} data
+ * @return {*}
+ */
+export const knowledgeDraftUpdatePublic = (data: object) => {
+	return request({
+		url: `//api/v1/Knowledge/publish-batch`,
+		method: 'post',
+		data,
+	});
+};

+ 1 - 1
src/views/case/index/edit.vue

@@ -393,7 +393,7 @@ const onSubmitReview = async (formEl: FormInstance | undefined) => {
 			state.loading = true;
 			addCaseDraftAudit(submitObj)
 				.then(() => {
-					ElMessage.success('新增案例审核成功');
+					ElMessage.success('新增案例审核提交成功');
 					processSuccess();
 				})
 				.catch(() => {

+ 135 - 0
src/views/knowledge/audit/components/Knowledge-audit.vue

@@ -0,0 +1,135 @@
+<template>
+	<el-dialog :title="dialogTitle" v-model="state.dialogVisible" draggable append-to-body destroy-on-close @close="close">
+		<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="80px" v-loading="state.loading">
+			<el-form-item :label="textTip" v-if="[1, 2].includes(planInfo.applyStatus)">{{ applyReason }}</el-form-item>
+			<el-form-item label="审批结果" prop="state" :rules="[{ required: true, message: '请选择审批结果', trigger: 'change' }]">
+				<el-radio-group v-model="state.ruleForm.state">
+					<el-radio :value="1">同意</el-radio>
+					<el-radio :value="0">不同意</el-radio>
+				</el-radio-group>
+			</el-form-item>
+			<el-form-item label="审批意见" prop="examinOpinion" :rules="[{ required: true, message: '请填写审批意见', trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.examinOpinion" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写审批意见">
+				</el-input>
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { computed, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { planAudit, planReason } from '@/api/plan';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗
+	ruleForm: {
+		state: 1, // 默认同意
+		examinOpinion: null, //审核意见
+	},
+	loading: false, // 加载
+});
+const planType = ref('update');
+const textTip = computed(() => {
+	if (planType.value === 'update') {
+		return '更新说明';
+	} else if (planType.value === 'delete') {
+		return '删除说明';
+	}
+});
+// 查询申请审批意见
+const applyReason = ref<any>('');
+const getTips = async (row: any) => {
+	try {
+		const { result } = await planReason(row.id);
+		applyReason.value = result.applyReason;
+	} catch (e) {
+		console.log(e);
+	}
+};
+// 打开弹窗
+const ruleFormRef = ref<any>(); // 表单ref
+const planInfo = ref<any>();
+const dialogTitle = ref('预案更新审批');
+/*[
+	{
+		"key": -1,
+		"value": "全部"
+	},
+	{
+		"key": 0,
+		"value": "新增审核"
+	},
+	{
+		"key": 1,
+		"value": "修改审核"
+	},
+	{
+		"key": 2,
+		"value": "删除审核"
+	}
+]*/
+const openDialog = (row: any) => {
+	switch (row.applyStatus) {
+		case 0:
+			dialogTitle.value = '预案新增审批';
+			break;
+		case 1:
+			planType.value = 'update';
+			dialogTitle.value = '预案修改审批';
+			break;
+		case 2:
+			planType.value = 'delete';
+			dialogTitle.value = '预案删除审批';
+			break;
+	}
+	planInfo.value = row;
+	getTips(row);
+	state.dialogVisible = true;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 新增
+const onSubmit = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		planAudit({
+			id: planInfo.value.id,
+			state: state.ruleForm.state,
+			examinOpinion: state.ruleForm.examinOpinion,
+		})
+			.then(() => {
+				emit('updateList');
+				closeDialog(); // 关闭弹窗
+				ElMessage.success('审核成功');
+				state.loading = false;
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 11 - 0
src/views/knowledge/audit/index.vue

@@ -0,0 +1,11 @@
+<script setup lang="ts">
+
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 64 - 124
src/views/knowledge/index/YBIndex.vue

@@ -32,7 +32,7 @@
 								<el-skeleton :loading="state.orgLoading" animated :rows="10" v-if="state.activeName === '0'">
 									<template #default>
 										<el-auto-resizer>
-											<template #default="{ height, width }">
+											<template #default="{ height }">
 												<el-tree-v2
 													:data="state.orgData"
 													highlight-current
@@ -56,7 +56,7 @@
 								<el-skeleton :loading="state.typeLoading" animated :rows="10" v-if="state.activeName === '1'">
 									<template #default>
 										<el-auto-resizer>
-											<template #default="{ height, width }">
+											<template #default="{ height }">
 												<el-tree-v2
 													:data="state.knowledgeOptions"
 													highlight-current
@@ -129,7 +129,7 @@
 								<el-skeleton :loading="state.orgLoading" animated :rows="10">
 									<template #default>
 										<el-auto-resizer>
-											<template #default="{ height, width }">
+											<template #default="{ height }">
 												<el-tree-v2
 													:data="state.orgData"
 													highlight-current
@@ -159,7 +159,7 @@
 							<el-skeleton :loading="state.typeLoading" animated :rows="10">
 								<template #default>
 									<el-auto-resizer>
-										<template #default="{ height, width }">
+										<template #default="{ height }">
 											<el-tree-v2
 												:data="state.knowledgeOptions"
 												highlight-current
@@ -250,15 +250,14 @@
 									</el-dropdown-menu>
 								</template>
 							</el-dropdown>
-							<el-button
-								type="primary"
-								@click="onAuditBatch"
-								v-if="state.queryParams.Status === 1"
-								v-auth="'knowledge:index:audit:batch'"
-								:loading="state.loading"
-								:disabled="isChecked"
-							>
-								<SvgIcon name="ele-Edit" class="mr5" />批量审核
+							<el-button type="primary" @click="onOpen" v-auth="'knowledge:index:open:batch'" :loading="state.loading" :disabled="isChecked">
+								批量公开
+							</el-button>
+							<el-button type="primary" @click="onPrivate" v-auth="'knowledge:index:private:batch'" :loading="state.loading" :disabled="isChecked">
+								批量不公开
+							</el-button>
+							<el-button type="primary" @click="onImport" v-auth="'knowledge:index:import'" :loading="state.tableLoading">
+								<SvgIcon name="ele-Upload" class="mr5" />知识导入
 							</el-button>
 						</template>
 					</vxe-toolbar>
@@ -338,7 +337,7 @@
 										type="danger"
 										@click="onRowDel(row)"
 										title="删除"
-										v-if="[0, 2, 4, 5, 6].includes(row.newStatus) && row.status !== 1 && ['YiBin'].includes(themeConfig.appScope)"
+										v-if="[0, 2, 4, 5, 6].includes(row.newStatus) && row.status !== 1"
 										v-auth="'knowledge:index:delete'"
 									>
 										删除
@@ -363,20 +362,6 @@
 									>
 										上架
 									</el-button>
-									<el-button link type="primary" @click="onprogress(row)" title="查看审核记录" v-if="[5].includes(row.newStatus)">
-										审核记录
-									</el-button>
-									<!--									<el-button
-										link
-										type="primary"
-										@click="onAudit(row)"
-										title="审批"
-										v-if="[1, 2].includes(row.status) && row.isCanHandle"
-										v-auth="'business:order:handle'"
-									>
-										审批
-									</el-button>-->
-									<el-button link type="primary" @click="onPreview(row)" title="查看"> 查看 </el-button>
 								</template>
 							</vxe-column>
 						</vxe-table>
@@ -456,12 +441,10 @@
 				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 			</template>
 		</el-drawer>
-		<!-- 流程审批 -->
-		<process-audit ref="processAuditRef" @orderProcessSuccess="queryList" />
-		<!-- 审核记录 -->
-		<audit-progress ref="auditProgressRef" />
-		<!-- 批量审批 -->
-		<to-end ref="toEndRef" @updateList="queryList" />
+		<!-- 知识导入 -->
+		<knowledge-import ref="knowledgeImportRef" @updateList="queryList" />
+		<!-- 删除或者更新提交审核 -->
+		<edit-submit-audit ref="editSubmitAuditRef" @updateList="handleQuery" />
 	</div>
 </template>
 
@@ -473,12 +456,10 @@ import type { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import {
 	KnowledgePaged,
-	KnowledgeOffShelf,
 	KnowledgeOnTheShelf,
 	baseData,
-	KnowledgeDel,
 	knowledgeExport,
-	knowledgeDetailExport,
+	knowledgeDetailExport, KnowledgeOffShelfNew, knowledgeDraftUpdatePublic,
 } from '@/api/knowledge';
 import { knowledgeDepartmentList, knowledgeHotSpotList, knowledgeHotSpotSearch, treeList } from '@/api/knowledge/type';
 import { Splitpanes, Pane } from 'splitpanes';
@@ -487,21 +468,17 @@ import { useUserInfo } from '@/stores/userInfo';
 import { storeToRefs } from 'pinia';
 import Other from '@/utils/other';
 import { debounce, downloadFileByStream } from '@/utils/tools';
-import { useThemeConfig } from '@/stores/themeConfig';
 import { VxeUI } from 'vxe-pc-ui';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 
 // 引入组件
-const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
-const AuditProgress = defineAsyncComponent(() => import('@/views/knowledge/components/Audit-progress.vue')); // 编写规范
 const TextTooltip = defineAsyncComponent(() => import('@/components/TextTooltip/index.vue'));
-const ToEnd = defineAsyncComponent(() => import('@/views/knowledge/index/components/To-end.vue')); // 批量审批
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+const KnowledgeImport = defineAsyncComponent(() => import('@/views/knowledge/index/components/knowledge-import.vue')); // 知识导入
+const EditSubmitAudit = defineAsyncComponent(() => import('@/views/plan/index/components/Edit-submit-audit.vue')); // 删除或者更新 提交审核
 
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
-const storesThemeConfig = useThemeConfig();
-const { themeConfig } = storeToRefs(storesThemeConfig);
 // 定义变量内容
 const state = reactive<any>({
 	queryParams: {
@@ -803,36 +780,9 @@ const onPreview = (row: any) => {
 		},
 	});
 };
-// 审批
-const processAuditRef = ref<RefType>(); //审核记录ref
-const onAudit = (row: any) => {
-	const params = {
-		id: row.workflowId,
-		processType: '工单办理',
-		orderDetail: {},
-		extra: {
-			dialogTitle: '知识审批',
-			inputPlaceholder: '办理意见',
-			annexName: '知识附件',
-		},
-	};
-	processAuditRef.value.openDialog(params);
-};
 // 下架
 const offShelfFn = (row: any) => {
-	// 如果有流程id,说明是审批中的知识
-	const params = {
-		id: row.workflowId,
-		processType: '知识下架',
-		extra: {
-			dialogTitle: '知识下架',
-			inputPlaceholder: '下架原因',
-			annexName: '知识附件',
-		},
-		orderDetail: row,
-	};
-	processAuditRef.value.openDialog(params);
-	/*	ElMessageBox.confirm(`是否确定要下架【${row.title}】?知识下架后,将不会被检索到!`, '提示', {
+	ElMessageBox.confirm(`是否确定要下架【${row.title}】?知识下架后,将不会被检索到!`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -840,12 +790,12 @@ const offShelfFn = (row: any) => {
 		cancelButtonClass: 'default-button',
 	})
 		.then(() => {
-			KnowledgeOffShelf(row.id).then(() => {
+			KnowledgeOffShelfNew(row.id).then(() => {
 				ElMessage.success('操作成功');
 				handleQuery();
 			});
 		})
-		.catch(() => {});*/
+		.catch(() => {});
 };
 // 上架
 const groundingFn = (row: any) => {
@@ -865,54 +815,9 @@ const groundingFn = (row: any) => {
 		.catch(() => {});
 };
 // 删除知识
+const editSubmitAuditRef = ref<RefType>();
 const onRowDel = (row: any) => {
-	// 如果有流程id,说明是审批中的知识
-	const params = {
-		id: row.workflowId,
-		processType: '删除知识',
-		extra: {
-			dialogTitle: '删除知识',
-			inputPlaceholder: '删除原因',
-			annexName: '知识附件',
-		},
-		orderDetail: row,
-	};
-	processAuditRef.value.openDialog(params);
-	/*	if (row.workflowId) {
-		// 如果有流程id,说明是审批中的知识
-		const params = {
-			id: row.workflowId,
-			processType: '删除知识',
-			extra: {
-				dialogTitle: '删除知识',
-				inputPlaceholder: '删除原因',
-				annexName: '知识附件',
-			},
-			orderDetail: row,
-		};
-		processAuditRef.value.openDialog(params);
-	} else {
-		// 否则直接删除
-		ElMessageBox.confirm(`是否确定要删除【${row.title}】?`, '提示', {
-			confirmButtonText: '确认',
-			cancelButtonText: '取消',
-			type: 'warning',
-			draggable: true,
-			cancelButtonClass: 'default-button',
-		})
-			.then(() => {
-				KnowledgeDel({ data: row }).then(() => {
-					ElMessage.success('操作成功');
-					handleQuery();
-				});
-			})
-			.catch(() => {});
-	}*/
-};
-// 查看审核记录
-const auditProgressRef = ref<RefType>(); //审核记录ref
-const onprogress = (row: any) => {
-	auditProgressRef.value.openDialog(row.id);
+	editSubmitAuditRef.value.openDialog(row, 'delete');
 };
 // 导出详情
 const onExportDetail = (command: string | number | object) => {
@@ -943,11 +848,46 @@ const onExportDetail = (command: string | number | object) => {
 			});
 		});
 };
-// 批量审核
-const toEndRef = ref<RefType>();
-const onAuditBatch = () => {
+// 批量公开
+const onOpen = () => {
+	const ids = checkTable.value.map((item: any) => item.id);
+	ElMessageBox.confirm(`是否确定要批量公开知识?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			knowledgeDraftUpdatePublic({ knowledgeIds: ids, isPublic: true }).then(() => {
+				ElMessage.success('操作成功');
+				handleQuery();
+			});
+		})
+		.catch(() => {});
+};
+// 批量不公开
+const onPrivate = () => {
 	const ids = checkTable.value.map((item: any) => item.id);
-	toEndRef.value.openDialog(ids);
+	ElMessageBox.confirm(`是否确定要批量不公开知识?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			knowledgeDraftUpdatePublic({ knowledgeIds: ids, isPublic: false }).then(() => {
+				ElMessage.success('操作成功');
+				handleQuery();
+			});
+		})
+		.catch(() => {});
+};
+// 知识导入
+const knowledgeImportRef = ref<RefType>();
+const onImport = () => {
+	knowledgeImportRef.value.openDialog();
 };
 const tableRef = ref<RefType>();
 const checkTable = ref<EmptyArrayType>([]);

+ 95 - 154
src/views/knowledge/index/ZGIndex.vue

@@ -21,7 +21,7 @@
 							<el-skeleton :loading="state.orgLoading" animated :rows="10" v-if="state.activeName === '0'">
 								<template #default>
 									<el-auto-resizer>
-										<template #default="{ height, width }">
+										<template #default="{ height }">
 											<el-tree-v2
 												:data="state.orgData"
 												highlight-current
@@ -35,7 +35,7 @@
 												:height="height"
 											>
 												<template #default="{ node }">
-													<text-tooltip :content="node.label+'('+node.data.knowledgeNum+')'" effect="dark" placement="top"></text-tooltip>
+													<text-tooltip :content="node.label + '(' + node.data.knowledgeNum + ')'" effect="dark" placement="top"></text-tooltip>
 												</template>
 											</el-tree-v2>
 										</template>
@@ -45,7 +45,7 @@
 							<el-skeleton :loading="state.typeLoading" animated :rows="10" v-if="state.activeName === '1'">
 								<template #default>
 									<el-auto-resizer>
-										<template #default="{ height, width }">
+										<template #default="{ height }">
 											<el-tree-v2
 												:data="state.knowledgeOptions"
 												highlight-current
@@ -60,7 +60,7 @@
 												node-key="id"
 											>
 												<template #default="{ node }">
-													<text-tooltip :content="node.label+'('+node.data.knowledgeNum+')'" effect="dark" placement="top"></text-tooltip>
+													<text-tooltip :content="node.label + '(' + node.data.knowledgeNum + ')'" effect="dark" placement="top"></text-tooltip>
 												</template>
 											</el-tree-v2>
 										</template>
@@ -77,7 +77,7 @@
 										:props="{
 											label: 'hotSpotFullName',
 											children: 'children',
-											isLeaf: 'hasChild',
+											isLeaf: 'hasChild'
 										}"
 										:filter-node-method="filterNodeHot"
 										@node-click="handleNodeClick"
@@ -85,9 +85,10 @@
 										check-strictly
 										:expand-on-click-node="false"
 										ref="hotRef"
-									>	<template #default="{ node }">
-										<text-tooltip :content="node.label + '(' + node.data.knowledgeNum + ')'" effect="dark" placement="top"></text-tooltip>
-									</template>
+									>
+										<template #default="{ node }">
+											<text-tooltip :content="node.label + '(' + node.data.knowledgeNum + ')'" effect="dark" placement="top"></text-tooltip>
+										</template>
 									</el-tree>
 									<el-tree
 										ref="hotRef"
@@ -98,7 +99,7 @@
 										highlight-current
 										:props="{
 											label: 'hotSpotFullName',
-											children: 'children',
+											children: 'children'
 										}"
 										:filter-node-method="filterNodeHot"
 										@node-click="handleNodeClick"
@@ -119,7 +120,7 @@
 							<el-skeleton :loading="state.typeLoading" animated :rows="10">
 								<template #default>
 									<el-auto-resizer>
-										<template #default="{ height, width }">
+										<template #default="{ height }">
 											<el-tree-v2
 												:data="state.knowledgeOptions"
 												highlight-current
@@ -133,7 +134,7 @@
 												:height="height"
 											>
 												<template #default="{ node }">
-													<text-tooltip :content="node.label+'('+node.data.knowledgeNum+')'" effect="dark" placement="top"></text-tooltip>
+													<text-tooltip :content="node.label + '(' + node.data.knowledgeNum + ')'" effect="dark" placement="top"></text-tooltip>
 												</template>
 											</el-tree-v2>
 										</template>
@@ -181,7 +182,7 @@
 						</el-form-item>
 						<el-form-item>
 							<el-button type="primary" @click="handleQuery" :loading="state.tableLoading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-<!--							<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.tableLoading">
+							<!--							<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.tableLoading">
 								<SvgIcon name="ele-Refresh" class="mr5" />重置
 							</el-button>-->
 							<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
@@ -210,15 +211,14 @@
 									</el-dropdown-menu>
 								</template>
 							</el-dropdown>
-							<el-button
-								type="primary"
-								@click="onAuditBatch"
-								v-if="state.queryParams.Status === 1"
-								v-auth="'knowledge:index:audit:batch'"
-								:loading="state.loading"
-								:disabled="isChecked"
-							>
-								<SvgIcon name="ele-Edit" class="mr5" />批量审核
+							<el-button type="primary" @click="onOpen" v-auth="'knowledge:index:open:batch'" :loading="state.loading" :disabled="isChecked">
+								批量公开
+							</el-button>
+							<el-button type="primary" @click="onPrivate" v-auth="'knowledge:index:private:batch'" :loading="state.loading" :disabled="isChecked">
+								批量不公开
+							</el-button>
+							<el-button type="primary" @click="onImport" v-auth="'knowledge:index:import'" :loading="state.tableLoading">
+								<SvgIcon name="ele-Upload" class="mr5" />知识导入
 							</el-button>
 						</template>
 					</vxe-toolbar>
@@ -228,7 +228,7 @@
 							:loading="state.tableLoading"
 							:data="state.tableData"
 							:column-config="{ resizable: true }"
-							:row-config="{ isCurrent: true, isHover: true, height: 30,useKey:true }"
+							:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
 							ref="tableRef"
 							height="auto"
 							auto-resize
@@ -299,7 +299,7 @@
 										type="danger"
 										@click="onRowDel(row)"
 										title="删除"
-										v-if="[0, 2, 4, 5, 6].includes(row.newStatus) && row.status !== 1 && ['YiBin'].includes(themeConfig.appScope)"
+										v-if="[0, 2, 4, 5, 6].includes(row.newStatus) && row.status !== 1"
 										v-auth="'knowledge:index:delete'"
 									>
 										删除
@@ -324,20 +324,6 @@
 									>
 										上架
 									</el-button>
-									<el-button link type="primary" @click="onprogress(row)" title="查看审核记录" v-if="[5].includes(row.newStatus)">
-										审核记录
-									</el-button>
-									<!--									<el-button
-										link
-										type="primary"
-										@click="onAudit(row)"
-										title="审批"
-										v-if="[1, 2].includes(row.status) && row.isCanHandle"
-										v-auth="'business:order:handle'"
-									>
-										审批
-									</el-button>-->
-									<el-button link type="primary" @click="onPreview(row)" title="查看"> 查看 </el-button>
 								</template>
 							</vxe-column>
 						</vxe-table>
@@ -417,12 +403,10 @@
 				<el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 			</template>
 		</el-drawer>
-		<!-- 流程审批 -->
-		<process-audit ref="processAuditRef" @orderProcessSuccess="queryList" />
-		<!-- 审核记录 -->
-		<audit-progress ref="auditProgressRef" />
-		<!-- 批量审批 -->
-		<to-end ref="toEndRef" @updateList="queryList" />
+		<!-- 知识导入 -->
+		<knowledge-import ref="knowledgeImportRef" @updateList="queryList" />
+		<!-- 删除或者更新提交审核 -->
+		<edit-submit-audit ref="editSubmitAuditRef" @updateList="handleQuery" />
 	</div>
 </template>
 
@@ -434,39 +418,33 @@ import type { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import {
 	KnowledgePaged,
-	KnowledgeOffShelf,
 	KnowledgeOnTheShelf,
 	baseData,
-	KnowledgeDel,
 	knowledgeExport,
 	knowledgeDetailExport,
+	knowledgeDraftUpdatePublic,
+	KnowledgeOffShelfNew,
 } from '@/api/knowledge';
-import { getOrgListByUser } from '@/api/system/organize';
 import { knowledgeDepartmentList, knowledgeHotSpotList, knowledgeHotSpotSearch, treeList } from '@/api/knowledge/type';
-import { hotSpotSearch, hotSpotType } from '@/api/business/order';
 import { Splitpanes, Pane } from 'splitpanes';
 import 'splitpanes/dist/splitpanes.css';
 import { useUserInfo } from '@/stores/userInfo';
 import { storeToRefs } from 'pinia';
 import Other from '@/utils/other';
-import { debounce, downloadFileByStream, throttle } from '@/utils/tools';
-import { useThemeConfig } from '@/stores/themeConfig';
+import { debounce, downloadFileByStream } from '@/utils/tools';
 import { VxeUI } from 'vxe-pc-ui';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 
 // 引入组件
-const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
-const AuditProgress = defineAsyncComponent(() => import('@/views/knowledge/components/Audit-progress.vue')); // 编写规范
 const TextTooltip = defineAsyncComponent(() => import('@/components/TextTooltip/index.vue'));
-const ToEnd = defineAsyncComponent(() => import('@/views/knowledge/index/components/To-end.vue')); // 批量审批
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+const KnowledgeImport = defineAsyncComponent(() => import('@/views/knowledge/index/components/knowledge-import.vue')); // 知识导入
+const EditSubmitAudit = defineAsyncComponent(() => import('@/views/plan/index/components/Edit-submit-audit.vue')); // 删除或者更新 提交审核
 
 const router = useRouter(); //路由
 const horizontal = ref(false);
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
-const storesThemeConfig = useThemeConfig();
-const { themeConfig } = storeToRefs(storesThemeConfig);
 
 // 定义变量内容
 const state = reactive<any>({
@@ -483,18 +461,18 @@ const state = reactive<any>({
 		ModuleCode: '',
 		NewDraftsStatus: -1,
 		Attribution: userInfos.value.isCenter ? '中心知识库' : '部门知识库',
-		sjTime:[], // 上架时间
-		StartOnShelfTime:null,
-		EndOnShelfTime:null,
-		xjTime:[], // 下架时间
-		StartOffShelfTime:null,
-		EndOffShelfTime:null,
-		cjTime:[], // 创建时间
-		CreationStartTime:null,
-		CreationEndTime:null,
-		gxTime:[], // 更新时间
-		StartUpdateTime:null,
-		EndUpdateTime:null,
+		sjTime: [], // 上架时间
+		StartOnShelfTime: null,
+		EndOnShelfTime: null,
+		xjTime: [], // 下架时间
+		StartOffShelfTime: null,
+		EndOffShelfTime: null,
+		cjTime: [], // 创建时间
+		CreationStartTime: null,
+		CreationEndTime: null,
+		gxTime: [], // 更新时间
+		StartUpdateTime: null,
+		EndUpdateTime: null,
 	},
 	activeName: '1', //tab切换 默认知识分类
 	tableData: [], //表格数据
@@ -505,8 +483,8 @@ const state = reactive<any>({
 	knowledgeOptions: [], //知识库类型数据
 	statusOptions: [], //状态数据
 	hotSpotData: [], //热点数据
-	hotspotLoading:false, // 热点loading
-	orgLoading:false, // 部门loading
+	hotspotLoading: false, // 热点loading
+	orgLoading: false, // 部门loading
 	typeLoading: false, // 知识类型loading
 });
 
@@ -555,10 +533,10 @@ const filterNodeHot = (value: string, data: any) => {
 	return data.hotSpotName.includes(value);
 };
 const lazyShow = ref(true);
-const inputHotspot = debounce((val:string)=>{
+const inputHotspot = debounce((val: string) => {
 	state.hotspotLoading = true;
 	if (val) {
-		knowledgeHotSpotSearch({name:val,Attribution:state.queryParams.Attribution})
+		knowledgeHotSpotSearch({ name: val, Attribution: state.queryParams.Attribution })
 			.then((res) => {
 				//获取后端搜索的数据
 				state.hotSpotData.length = 0;
@@ -572,12 +550,12 @@ const inputHotspot = debounce((val:string)=>{
 	} else if (val == '' || val == ' ' || val == null) {
 		state.hotspotLoading = false;
 	}
-},500)
+}, 500);
 // 热点分类懒加载
 const loadNode = async (node: any, resolve: any) => {
 	try {
 		if (node.isLeaf) return resolve([]);
-		const {result} = await knowledgeHotSpotList({ id: node.data.id ? node.data.id : null,Attribution:state.queryParams.Attribution });
+		const { result } = await knowledgeHotSpotList({ id: node.data.id ? node.data.id : null, Attribution: state.queryParams.Attribution });
 		resolve(result);
 	} catch (error) {
 		resolve([]);
@@ -610,7 +588,7 @@ const getOrgListApi = async () => {
 const getKnowledgeType = async () => {
 	state.typeLoading = true;
 	try {
-		const { result } = await treeList({ IsEnable: true,Attribution: state.queryParams.Attribution });
+		const { result } = await treeList({ IsEnable: true, Attribution: state.queryParams.Attribution });
 		state.knowledgeOptions = result ?? [];
 		state.typeLoading = false;
 	} catch (error) {
@@ -746,36 +724,9 @@ const onPreview = (row: any) => {
 		},
 	});
 };
-// 审批
-const processAuditRef = ref<RefType>(); //审核记录ref
-const onAudit = (row: any) => {
-	const params = {
-		id: row.workflowId,
-		processType: '工单办理',
-		orderDetail: {},
-		extra: {
-			dialogTitle: '知识审批',
-			inputPlaceholder: '办理意见',
-			annexName: '知识附件',
-		},
-	};
-	processAuditRef.value.openDialog(params);
-};
 // 下架
 const offShelfFn = (row: any) => {
-	// 如果有流程id,说明是审批中的知识
-	const params = {
-		id: row.workflowId,
-		processType: '知识下架',
-		extra: {
-			dialogTitle: '知识下架',
-			inputPlaceholder: '下架原因',
-			annexName: '知识附件',
-		},
-		orderDetail: row,
-	};
-	processAuditRef.value.openDialog(params);
-	/*	ElMessageBox.confirm(`是否确定要下架【${row.title}】?知识下架后,将不会被检索到!`, '提示', {
+	ElMessageBox.confirm(`是否确定要下架【${row.title}】?知识下架后,将不会被检索到!`, '提示', {
 		confirmButtonText: '确认',
 		cancelButtonText: '取消',
 		type: 'warning',
@@ -783,12 +734,12 @@ const offShelfFn = (row: any) => {
 		cancelButtonClass: 'default-button',
 	})
 		.then(() => {
-			KnowledgeOffShelf(row.id).then(() => {
+			KnowledgeOffShelfNew(row.id).then(() => {
 				ElMessage.success('操作成功');
 				handleQuery();
 			});
 		})
-		.catch(() => {});*/
+		.catch(() => {});
 };
 // 上架
 const groundingFn = (row: any) => {
@@ -808,54 +759,9 @@ const groundingFn = (row: any) => {
 		.catch(() => {});
 };
 // 删除知识
+const editSubmitAuditRef = ref<RefType>();
 const onRowDel = (row: any) => {
-	// 如果有流程id,说明是审批中的知识
-	const params = {
-		id: row.workflowId,
-		processType: '删除知识',
-		extra: {
-			dialogTitle: '删除知识',
-			inputPlaceholder: '删除原因',
-			annexName: '知识附件',
-		},
-		orderDetail: row,
-	};
-	processAuditRef.value.openDialog(params);
-	/*	if (row.workflowId) {
-		// 如果有流程id,说明是审批中的知识
-		const params = {
-			id: row.workflowId,
-			processType: '删除知识',
-			extra: {
-				dialogTitle: '删除知识',
-				inputPlaceholder: '删除原因',
-				annexName: '知识附件',
-			},
-			orderDetail: row,
-		};
-		processAuditRef.value.openDialog(params);
-	} else {
-		// 否则直接删除
-		ElMessageBox.confirm(`是否确定要删除【${row.title}】?`, '提示', {
-			confirmButtonText: '确认',
-			cancelButtonText: '取消',
-			type: 'warning',
-			draggable: true,
-			cancelButtonClass: 'default-button',
-		})
-			.then(() => {
-				KnowledgeDel({ data: row }).then(() => {
-					ElMessage.success('操作成功');
-					handleQuery();
-				});
-			})
-			.catch(() => {});
-	}*/
-};
-// 查看审核记录
-const auditProgressRef = ref<RefType>(); //审核记录ref
-const onprogress = (row: any) => {
-	auditProgressRef.value.openDialog(row.id);
+	editSubmitAuditRef.value.openDialog(row, 'delete');
 };
 // 导出详情
 const onExportDetail = (command: string | number | object) => {
@@ -886,11 +792,46 @@ const onExportDetail = (command: string | number | object) => {
 			});
 		});
 };
-// 批量审核
-const toEndRef = ref<RefType>();
-const onAuditBatch = () => {
+// 批量公开
+const onOpen = () => {
 	const ids = checkTable.value.map((item: any) => item.id);
-	toEndRef.value.openDialog(ids);
+	ElMessageBox.confirm(`是否确定要批量公开知识?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			knowledgeDraftUpdatePublic({ knowledgeIds: ids, isPublic: true }).then(() => {
+				ElMessage.success('操作成功');
+				handleQuery();
+			});
+		})
+		.catch(() => {});
+};
+// 批量不公开
+const onPrivate = () => {
+	const ids = checkTable.value.map((item: any) => item.id);
+	ElMessageBox.confirm(`是否确定要批量不公开知识?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+	})
+		.then(() => {
+			knowledgeDraftUpdatePublic({ knowledgeIds: ids, isPublic: false }).then(() => {
+				ElMessage.success('操作成功');
+				handleQuery();
+			});
+		})
+		.catch(() => {});
+};
+// 知识导入
+const knowledgeImportRef = ref<RefType>();
+const onImport = () => {
+	knowledgeImportRef.value.openDialog();
 };
 const tableRef = ref<RefType>();
 const checkTable = ref<EmptyArrayType>([]);

+ 109 - 0
src/views/knowledge/index/components/Edit-submit-audit.vue

@@ -0,0 +1,109 @@
+<template>
+	<el-dialog :title="dialogTitle" v-model="state.dialogVisible" width="30%" draggable append-to-body destroy-on-close @close="close">
+		<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="80px" v-loading="state.loading">
+			<el-form-item :label="textTip" prop="content" :rules="[{ required: true, message: '请填写' + textTip, trigger: 'blur' }]">
+				<el-input v-model="state.ruleForm.content" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" :placeholder="'请填写' + textTip">
+				</el-input>
+			</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">提 交</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { computed, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { knowledgeDraftDeleteAudit, knowledgeDraftEditAudit } from '@/api/knowledge';
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗
+	ruleForm: {
+		content: '', // 内容
+	},
+	loading: false, // 加载
+	planInfo: {}, // 预案详情内容
+});
+const planType = ref('update');
+const dialogTitle = computed(() => {
+	if (planType.value === 'update') {
+		return '更新知识';
+	} else if (planType.value === 'delete') {
+		return '删除知识';
+	}
+});
+const textTip = computed(() => {
+	if (planType.value === 'update') {
+		return '更新说明';
+	} else if (planType.value === 'delete') {
+		return '删除说明';
+	}
+});
+// 打开弹窗
+const ruleFormRef = ref<any>(); // 表单ref
+const openDialog = (row: any, type = 'update') => {
+	state.planInfo = row;
+	planType.value = type;
+	state.dialogVisible = true;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 新增
+const onSubmit = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		if (planType.value === 'update') {
+			// 更新提交审核
+			knowledgeDraftEditAudit({
+				...state.planInfo,
+				applyReason: state.ruleForm.content,
+			})
+				.then(() => {
+					emit('updateList');
+					closeDialog(); // 关闭弹窗
+					ElMessage.success('更新审核提交成功');
+					state.loading = false;
+				})
+				.catch(() => {
+					state.loading = false;
+				});
+		} else {
+			// 删除提交审核
+			knowledgeDraftDeleteAudit({
+				id: state.planInfo.id,
+				applyReason: state.ruleForm.content,
+			})
+				.then(() => {
+					emit('updateList');
+					closeDialog(); // 关闭弹窗
+					ElMessage.success('删除审核提交成功');
+					state.loading = false;
+				})
+				.catch(() => {
+					state.loading = false;
+				});
+		}
+	});
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 109 - 0
src/views/knowledge/index/components/knowledge-import.vue

@@ -0,0 +1,109 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" width="50%" draggable title="知识导入" destroy-on-close append-to-body @close="close">
+
+		<p class="flex-center-align">步骤一:点击  <el-link type="primary" @click="onDownload">下载模板</el-link>,并按格式填写</p>
+		<p class="flex-center-align mt20">步骤二:上传编辑好的文件</p>
+		<el-upload
+			v-model:file-list="fileList"
+			action="#"
+			:multiple="false"
+			ref="uploadListRef"
+			name="file"
+			:http-request="onImport"
+			:show-file-list="false"
+			class="mt10"
+			:disabled="state.loading"
+		>
+			<el-button type="primary" :loading="state.loading"> <SvgIcon name="ele-Upload" class="mr5" /> 上传文件 </el-button>
+		</el-upload>
+		<vxe-tip title="注意" status="error" class="mt10">
+			<p>1、文件大小不超过xxM,导入知识内容不超过xx条</p>
+			<p>2、如需导入分类,请现在分类管理中创建好分类再导入;</p>
+			<p>3、导入可能需要一段时间,请耐心等待(数据越多越久);</p>
+		</vxe-tip>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSave" :loading="state.loading">导入</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue';
+import { ElNotification } from 'element-plus';
+import { externalCitizenImport, externalCitizenTemplate } from '@/api/auxiliary/externalCitizen';
+import { downloadFileByStream } from '@/utils/tools';
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false,
+	ruleForm: {
+		systemAreaId: null, // 所属区域
+		systemAreaName: null, // 所属区域名称
+		street: null, // 所属镇/街
+		name: null, // 姓名
+		phoneNumber: null, // 联系方式
+		gender: 1, // 性别
+	},
+	loading: false,
+});
+// 打开弹窗
+const ruleFormRef = ref<RefType>();
+const openDialog = () => {
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.resetFields();
+	ruleFormRef.value?.resetFields();
+};
+// 模板下载
+const onDownload = () => {
+	externalCitizenTemplate()
+		.then((res: any) => {
+			state.loading = false;
+			downloadFileByStream(res);
+		})
+		.catch(() => {
+			state.loading = false;
+		});
+};
+// 导入
+const fileList = ref<EmptyArrayType>([]);
+const uploadListRef = ref<RefType>(); // 上传组件ref
+const onImport = async (file: any) => {
+	state.loading = true;
+	let fileObj = file.file; // 相当于input里取得的files
+	let fd = new FormData(); // FormData 对象
+	fd.append('file', fileObj); // 文件对象
+	try {
+		const { result } = await externalCitizenImport(fd);
+		ElNotification({
+			title: '导入完成',
+			message: `总条数:${result.count}条,新增:${result.addCount}条,失败:${result.errorCount}条`,
+			type: 'success',
+		});
+		closeDialog();
+		emit('updateList');
+		state.loading = false;
+	} catch (e) {
+		console.log(e);
+		state.loading = false;
+	}
+};
+// 导入
+const onSave=  ()=>{
+
+}
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 117 - 47
src/views/knowledge/index/edit.vue

@@ -153,6 +153,92 @@
 							</template>
 						</el-skeleton>
 					</el-col>
+					<!--		自贡标书需求			-->
+					<template v-if="['ZiGong'].includes(themeConfig.appScope)">
+						<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="planTypeId" :rules="[{ required: false, message: '请选择预案分类', trigger: 'change' }]">
+										<VTreeDrop
+											:data="state.planTreeData"
+											keyField="id"
+											titleField="name"
+											v-model="state.ruleForm.planTypeId"
+											:dropHeight="400"
+											dropPlaceholder="预案分类"
+											dropdownWidthFixed
+											clearable
+											searchPlaceholder="预案分类名称"
+											:show-footer="false"
+											selectable
+										>
+										</VTreeDrop>
+									</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="documentNo" :rules="[{ required: false, message: '请填写文档号', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.documentNo" placeholder="请填写文档号" clearable></el-input>
+									</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="versionDescription" :rules="[{ required: false, message: '请填写版本说明', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.versionDescription" placeholder="请填写版本说明" clearable></el-input>
+									</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="indexNo" :rules="[{ required: false, message: '请填写索引号', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.indexNo" placeholder="请填写索引号" clearable></el-input>
+									</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="fileNo" :rules="[{ required: false, message: '请填写文号', trigger: 'blur' }]">
+										<el-input v-model="state.ruleForm.fileNo" placeholder="请填写文号" clearable></el-input>
+									</el-form-item>
+								</template>
+							</el-skeleton>
+						</el-col>
+					</template>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-skeleton :loading="state.loading" animated>
 							<template #template>
@@ -334,6 +420,8 @@
 		<process-audit ref="processAuditRef" @orderProcessSuccess="knowledgeProcessSuccess" />
 		<!-- 关键词 -->
 		<knowledge-keywords ref="knowledgeKeywordsRef" @selectKeyword="selectKeyword" />
+		<!-- 删除或者更新提交审核 -->
+		<edit-submit-audit ref="editSubmitAuditRef" @updateList="knowledgeProcessSuccess" />
 	</div>
 </template>
 
@@ -349,12 +437,14 @@ import { Local } from '@/utils/storage';
 import other from '@/utils/other';
 import { throttle, transformFile } from '@/utils/tools';
 import { treeList } from '@/api/knowledge/type';
-import { KnowledgeAdd, knowledgeContent, KnowledgeInfo, knowledgeKeyword, KnowledgeUpdate } from '@/api/knowledge';
+import { KnowledgeAdd, knowledgeContent, knowledgeDraft, knowledgeDraftAudit, knowledgeDraftEdit, KnowledgeInfo, knowledgeKeyword, KnowledgeUpdate } from '@/api/knowledge';
 import { templateList } from '@/views/knowledge/index/template';
 import { disabledDate } from '@/utils/constants';
 import { removeDuplicate } from '@/utils/arrayOperation';
 import { useThemeConfig } from '@/stores/themeConfig';
 import { VTreeDrop } from '@wsfe/vue-tree';
+import { planTreeList } from '@/api/plan/type';
+import { addPlanDraftAudit } from '@/api/plan';
 // 引入组件
 const Editor = defineAsyncComponent(() => import('@/components/Editor/index.vue')); // 富文本编辑器
 const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
@@ -362,6 +452,9 @@ const KnowledgeStandard = defineAsyncComponent(() => import('@/views/knowledge/c
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件组件
 const KnowledgeKeywords = defineAsyncComponent(() => import('@/views/knowledge/components/Knowledge-keywords.vue')); // 关键词组件
 const HotSpotSelect = defineAsyncComponent(() => import('@/components/Hotspot/index.vue')); // 选择热点
+const EditSubmitAudit = defineAsyncComponent(() => import('@/views/plan/index/components/Edit-submit-audit.vue')); // 删除或者更新 提交审核
+
+
 const stores = useUserInfo(); // 用户信息
 const { userInfos } = storeToRefs(stores); // 用户信息
 
@@ -382,11 +475,17 @@ const state = reactive<any>({
 		sourceOrganizeId: null, // 知识来源部门
 		title: null, // 知识标题
 		source: null, // 知识来源
+		documentNo: null, // 文档号
+		versionDescription: null, // 版本说明
+		indexNo: null, // 索引号
+		fileNo: null, // 文号
+		planTypeId:null, // 预案分类
 	},
 	typeData: [], // 知识分类
 	loading: false,
 	hotspotExternal: [],
 	knowledgeOptions: [], //关联知识
+	planTreeData: [], // 预案分类
 });
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
@@ -472,7 +571,7 @@ const getKnowledgeListData1 = (value: any) => {
 		return { KnowledgeTypeName: item.name, KnowledgeTypeId: item.id, KnowledgeTypeSpliceName: item.spliceName };
 	});
 	state.ruleForm.knowledgeTypeId = value.map((item: any) => item.id);
-	ruleFormRef.value.validateField('knowledgeTypeId')
+	ruleFormRef.value.validateField('knowledgeTypeId');
 };
 // 添加关键词
 const knowledgeKeywordsRef = ref<RefType>();
@@ -500,6 +599,7 @@ const selectTemplate = (val: any) => {
 	state.ruleForm.content = state.ruleForm.content + val;
 };
 // 提交审核
+const editSubmitAuditRef = ref<RefType>();  // 编辑提交审核
 const processAuditRef = ref<RefType>(); // 流程组件
 const route = useRoute(); // 获取路由
 const router = useRouter(); // 路由跳转
@@ -514,48 +614,16 @@ const onSubmitReview = async (formEl: FormInstance | undefined) => {
 		Reflect.deleteProperty(submitObj, 'creationTime');
 		//如果已经有ID 说明是已经提交过的数据 提交更新流程
 		if (route.params.id) {
-			if (submitObj.status !== 0) {
-				//不是草稿
-				const params = {
-					id: submitObj.workflowId ?? '',
-					processType: '更新知识',
-					extra: {
-						dialogTitle: '更新知识',
-						inputPlaceholder: '办理意见',
-						annexName: '知识附件',
-					},
-					orderDetail: submitObj,
-				};
-				processAuditRef.value.openDialog(params);
-				state.loading = false;
-			} else {
-				// 草稿 (特殊逻辑)
-				const params = {
-					id: submitObj.workflowId ?? '',
-					processType: '更新新增知识',
-					extra: {
-						dialogTitle: '更新知识',
-						inputPlaceholder: '办理意见',
-						annexName: '知识附件',
-					},
-					orderDetail: submitObj,
-				};
-				processAuditRef.value.openDialog(params);
-				state.loading = false;
-			}
+			editSubmitAuditRef.value.openDialog(submitObj, 'update');
 		} else {
-			// 新增
-			const params = {
-				id: '',
-				processType: '新增知识',
-				extra: {
-					dialogTitle: '新增知识',
-					inputPlaceholder: '办理意见',
-					annexName: '知识附件',
-				},
-				orderDetail: submitObj,
-			};
-			processAuditRef.value.openDialog(params);
+			knowledgeDraftAudit(submitObj)
+				.then(() => {
+					ElMessage.success('新增知识审核提交成功');
+					knowledgeProcessSuccess();
+				})
+				.catch(() => {
+					state.loading = false;
+				});
 			state.loading = false;
 		}
 	});
@@ -596,15 +664,15 @@ const onSaveOnly = throttle(async (formEl: FormInstance | undefined) => {
 		const submitObj = other.deepClone(state.ruleForm);
 		Reflect.deleteProperty(submitObj, 'creationTime');
 		if (route.params.id) {
-			// 更新
-			KnowledgeUpdate({ data: { ...submitObj, status: 0 } })
+			// 更新草稿
+			knowledgeDraftEdit(submitObj )
 				.then(handleSuccess)
 				.catch(() => {
 					state.loading = false;
 				});
 		} else {
 			// 新增
-			KnowledgeAdd({ data: submitObj })
+			knowledgeDraft(submitObj )
 				.then(handleSuccess)
 				.catch(() => {
 					state.loading = false;
@@ -637,12 +705,14 @@ const orgsOptions = ref<EmptyArrayType>([]); // 来源单位
 const getKnowledgeType = async () => {
 	state.loading = true;
 	try {
-		const [typeDataRes] = await Promise.all([
+		const [typeDataRes, planTreeData] = await Promise.all([
 			treeList({ IsEnable: true }),
+			planTreeList({ IsEnable: true }),
 			// KnowledgeGetKnowledge(),
 			// getCanUseOrg(),
 		]);
 		state.typeData = typeDataRes.result ?? [];
+		state.planTreeData = planTreeData.result ?? []; // 预案分类
 		// state.knowledgeOptions = knowledgeOptionsRes.result ?? [];
 		// orgsOptions.value = orgsOptionsRes.result ?? [];
 

+ 1 - 1
src/views/plan/index/edit.vue

@@ -247,7 +247,7 @@ const onSubmitReview = async (formEl: FormInstance | undefined) => {
 			state.loading = true;
 			addPlanDraftAudit(submitObj)
 				.then(() => {
-					ElMessage.success('新增预案审核成功');
+					ElMessage.success('新增预案审核提交成功');
 					processSuccess();
 				})
 				.catch(() => {