Procházet zdrojové kódy

feat:未找到页面提示;

zhangchong před 1 rokem
rodič
revize
79f1c73597

+ 21 - 24
src/components/LogicFlow/index.vue

@@ -323,6 +323,23 @@ const initEvent = () => {
 	// })
 	// })
 };
+const closePage = () => {
+  // 更新
+  ElMessage.success('操作成功');
+  // 关闭当前 tagsView
+  mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
+  mittBus.emit('clearCache', 'systemWorkflow');
+  if(!router.hasRoute('systemWorkflow')){
+    ElMessage.warning('未找到流程模板列表页面');
+    return;
+  }
+  router.push({
+    name: 'systemWorkflow',
+    state:{
+      index:'1'
+    }
+  });
+};
 // 暂存(保存为草稿)
 const saveOnly = throttle((formEl: FormInstance | undefined) => {
 	const lf = unref(lfInstance);
@@ -344,32 +361,12 @@ const saveOnly = throttle((formEl: FormInstance | undefined) => {
       return;
     }
     if (route.params.id) {
-      workflowUpdate(submitData).then(() => {
-        // 更新
-        ElMessage.success('操作成功');
-        // 关闭当前 tagsView
-        mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
-        mittBus.emit('clearCache', 'systemWorkflow');
-        router.push({
-          name: 'systemWorkflow',
-          state:{
-            index:'1'
-          }
-        });
+      workflowUpdate(submitData).then(() => { //更新
+        closePage();
       });
     } else {
-      workflowAdd(submitData).then(() => {
-        //保存
-        ElMessage.success('操作成功');
-        // 关闭当前 tagsView
-        mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
-        mittBus.emit('clearCache', 'systemWorkflow');
-        router.push({
-          name: 'systemWorkflow',
-          state:{
-            index:'1'
-          }
-        });
+      workflowAdd(submitData).then(() => {//保存
+        closePage()
       });
     }
 

+ 4 - 0
src/layout/navBars/breadcrumb/telControl.vue

@@ -993,6 +993,10 @@ const onMessage = (event: any) => {
 
           // 来电才展示弹屏
           // 跳转到录入工单页面
+          if(!router.hasRoute('orderAccept')){
+            ElMessage.warning('请先配置工单受理页面');
+            return;
+          }
           router.push({
             name: 'orderAccept',
             state: {

+ 27 - 22
src/layout/navBars/breadcrumb/userNews.vue

@@ -4,27 +4,28 @@
 			<div class="head-box-title">通知</div>
 			<!--					<div class="head-box-btn" v-if="state.newsList.length > 0" @click="onAllReadClick">全部已读</div>-->
 		</div>
-    <el-scrollbar class="mt5 content-box">
-      <template v-if="state.newsList.length > 0">
-        <div class="content-box-item" v-for="(v, k) in state.newsList" :key="k" @click="linkNews(v)">
-          <div class="text-no-wrap">{{ v.title }} ({{v.circularTypeText}})</div>
-          <div class="content-box-msg">
-            <div class="text-ellipsis2" v-html="v.content"></div>
-          </div>
-          <div class="content-box-time">{{ dayjs(v.circularTime).format('YYYY-MM-DD HH:mm:ss') }}</div>
-        </div>
-      </template>
-      <el-empty description="暂无通知" v-else></el-empty>
-    </el-scrollbar>
+		<el-scrollbar class="mt5 content-box">
+			<template v-if="state.newsList.length > 0">
+				<div class="content-box-item" v-for="(v, k) in state.newsList" :key="k" @click="linkNews(v)">
+					<div class="text-no-wrap">{{ v.title }} ({{ v.circularTypeText }})</div>
+					<div class="content-box-msg">
+						<div class="text-ellipsis2" v-html="v.content"></div>
+					</div>
+					<div class="content-box-time">{{ dayjs(v.circularTime).format('YYYY-MM-DD HH:mm:ss') }}</div>
+				</div>
+			</template>
+			<el-empty description="暂无通知" v-else></el-empty>
+		</el-scrollbar>
 	</div>
 </template>
 
 <script setup lang="ts" name="layoutBreadcrumbUserNews">
-import {onMounted, reactive} from 'vue';
+import { onMounted, reactive } from 'vue';
 import signalR from '/@/utils/signalR';
-import {useRouter} from 'vue-router';
-import {muquery} from '/@/api/auxiliary/notice';
-import dayjs from "dayjs";
+import { useRouter } from 'vue-router';
+import { muquery } from '/@/api/auxiliary/notice';
+import dayjs from 'dayjs';
+import { ElMessage } from 'element-plus';
 
 const emit = defineEmits(['hideNws']);
 
@@ -48,6 +49,10 @@ const getNumAndList = async () => {
 // 点击消息通知
 const router = useRouter();
 const linkNews = (v: any) => {
+	if (!router.hasRoute('auxiliaryNoticeRead')) {
+		ElMessage.warning('未找到通知详情页面');
+		return;
+	}
 	emit('hideNws');
 	router.push({
 		name: 'auxiliaryNoticeRead',
@@ -60,17 +65,17 @@ const linkNews = (v: any) => {
 };
 onMounted(() => {
 	getNumAndList();
-  signalR.SR.on('CircularRecord', (data: any) => {
-    // 小红点数量消息通知
-    console.log(data, '小红点数量消息通知');
-    getNumAndList();
-  });
+	signalR.SR.on('CircularRecord', (data: any) => {
+		// 小红点数量消息通知
+		console.log(data, '小红点数量消息通知');
+		getNumAndList();
+	});
 });
 </script>
 
 <style lang="scss" scoped>
 .layout-navBars-breadcrumb-user-news {
-  height: 325px;
+	height: 325px;
 	.head-box {
 		display: flex;
 		border-bottom: 1px solid var(--el-border-color-lighter);

+ 66 - 71
src/views/auxiliary/notice/detail.vue

@@ -31,27 +31,30 @@
 						</el-col>
 						<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
 							<el-form-item label="已阅读数量:">
-                <el-popover :width="450" trigger="click" popper-class="notice-container">
-                  <template #reference>
-                    <el-button  placement="right" link type="primary">{{ state.ruleForm?.readedNum + '/' + state.ruleForm?.needReadNum }}</el-button>
-                  </template>
-                  <div class="notice-container-box">
-                    <div class="notice-container-box-inner">
-                      已读:{{ state.ruleForm?.readedNum }}
-                      <el-scrollbar class="mt5" v-if="state.ruleForm?.circularReadGroups?.length">
-                        <el-tag v-for="item in state.ruleForm?.circularReadGroups.filter(i=>i.isRead)">{{state.ruleForm.circularType === 1 ? item.userName : item.orgName}}
-                          <span v-if="item.isTimeOut" class="color-danger">(超时阅读)</span>
-                        </el-tag>
-                      </el-scrollbar>
-                    </div>
-                    <div class="notice-container-box-inner">
-                      未读:{{ state.ruleForm?.needReadNum - state.ruleForm?.readedNum }}
-                      <el-scrollbar class="mt5 mb10" v-if="state.ruleForm.circularReadGroups?.length">
-                        <el-tag v-for="item in state.ruleForm.circularReadGroups.filter(i=>!i.isRead)">{{state.ruleForm.circularType === 1 ? item.userName : item.orgName}}</el-tag>
-                      </el-scrollbar>
-                    </div>
-                  </div>
-                </el-popover>
+								<el-popover :width="450" trigger="click" popper-class="notice-container">
+									<template #reference>
+										<el-button placement="right" link type="primary">{{ state.ruleForm?.readedNum + '/' + state.ruleForm?.needReadNum }}</el-button>
+									</template>
+									<div class="notice-container-box">
+										<div class="notice-container-box-inner">
+											已读:{{ state.ruleForm?.readedNum }}
+											<el-scrollbar class="mt5" v-if="state.ruleForm?.circularReadGroups?.length">
+												<el-tag v-for="item in state.ruleForm?.circularReadGroups.filter((i) => i.isRead)"
+													>{{ state.ruleForm.circularType === 1 ? item.userName : item.orgName }}
+													<span v-if="item.isTimeOut" class="color-danger">(超时阅读)</span>
+												</el-tag>
+											</el-scrollbar>
+										</div>
+										<div class="notice-container-box-inner">
+											未读:{{ state.ruleForm?.needReadNum - state.ruleForm?.readedNum }}
+											<el-scrollbar class="mt5 mb10" v-if="state.ruleForm.circularReadGroups?.length">
+												<el-tag v-for="item in state.ruleForm.circularReadGroups.filter((i) => !i.isRead)">{{
+													state.ruleForm.circularType === 1 ? item.userName : item.orgName
+												}}</el-tag>
+											</el-scrollbar>
+										</div>
+									</div>
+								</el-popover>
 							</el-form-item>
 						</el-col>
 						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
@@ -96,24 +99,12 @@
 					</el-row>
 				</template>
 			</el-form>
-			<el-button
-				type="primary"
-				@click="onAudit"
-				title="通知审批"
-				v-if="state.ruleForm?.circularState == 1"
-        v-auth="'auxiliary:notice:audit'"
-			>
+			<el-button type="primary" @click="onAudit" title="通知审批" v-if="state.ruleForm?.circularState == 1" v-auth="'auxiliary:notice:audit'">
+				审批
+			</el-button>
+			<el-button type="primary" @click="onAudit" title="公告审批" v-if="state.ruleForm?.bulletinState == 1" v-auth="'auxiliary:bulletin:audit'">
 				审批
 			</el-button>
-      <el-button
-          type="primary"
-          @click="onAudit"
-          title="公告审批"
-          v-if="state.ruleForm?.bulletinState == 1"
-          v-auth="'auxiliary:bulletin:audit'"
-      >
-        审批
-      </el-button>
 		</el-card>
 		<el-dialog v-model="state.dialogVisible" width="500px" draggable :title="noticeType" @close="close">
 			<el-form :model="state.examineForm" label-width="110px" ref="examineFormRef">
@@ -125,7 +116,7 @@
 				<span class="dialog-footer">
 					<el-button @click="state.dialogVisible = false" class="default-button">取 消</el-button>
 					<el-button type="primary" @click="onReject(examineFormRef)" :loading="loading">审核驳回</el-button>
-          <el-button type="primary" @click="onPass(examineFormRef)" :loading="loading">审核通过</el-button>
+					<el-button type="primary" @click="onPass(examineFormRef)" :loading="loading">审核通过</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -139,7 +130,7 @@ import { useRoute, useRouter } from 'vue-router';
 import { formatDate } from '/@/utils/formatTime';
 import { bulletinAudit, bulletinDetail, circularAudit, circularDetail, circularRead } from '/@/api/auxiliary/notice';
 import mittBus from '/@/utils/mitt';
-import { ElInput, FormInstance } from 'element-plus';
+import { ElInput, ElMessage, FormInstance } from 'element-plus';
 import { throttle } from '/@/utils/tools';
 const ProcessAudit = defineAsyncComponent(() => import('/@/components/ProcessAudit/index.vue')); // 流程审批
 // 定义变量内容
@@ -189,19 +180,23 @@ const closePage = () => {
 	state.dialogVisible = false;
 	// 关闭当前 tagsView
 	mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
-	mittBus.emit('clearCache', 'auxiliaryNoticeAudit');
-  if(noticeType.value === '通知详情'){
-    router.push({
-      path: '/auxiliary/noticeAudit',
-    });
-  }else if(noticeType.value === '公告详情'){
-    router.push({
-      name: 'auxiliaryNoticeAudit',
-      state: {
-        index: '1',
-      },
-    });
-  }
+	mittBus.emit('clearCache', 'auxiliaryNotice');
+	if (noticeType.value === '通知详情') {
+		router.push({
+			path: '/auxiliary/noticeAudit',
+		});
+	} else if (noticeType.value === '公告详情') {
+		if (!router.hasRoute('auxiliaryNotice')) {
+			ElMessage.warning('未找到公告详情页面');
+			return;
+		}
+		router.push({
+			name: 'auxiliaryNotice',
+			state: {
+				index: '1',
+			},
+		});
+	}
 };
 const examineFormRef = ref<RefType>();
 // 审核通过
@@ -237,8 +232,8 @@ const onPass = throttle(async (formEl: FormInstance | undefined) => {
 					});
 				break;
 			default:
-        state.dialogVisible = false;
-        loading.value = false;
+				state.dialogVisible = false;
+				loading.value = false;
 				break;
 		}
 	});
@@ -276,8 +271,8 @@ const onReject = throttle(async (formEl: FormInstance | undefined) => {
 					});
 				break;
 			default:
-        state.dialogVisible = false;
-        loading.value = false;
+				state.dialogVisible = false;
+				loading.value = false;
 				break;
 		}
 	});
@@ -294,20 +289,20 @@ onMounted(() => {
 </script>
 <style lang="scss">
 .notice-container {
-  &-box{
-    display: flex;
-    padding: 10px;
-    max-height: 300px;
-    &-inner{
-      flex:1;
-      padding: 10px 0 10px  10px;
-      &:last-child{
-        border-left: var(--el-border);
-      }
-      .el-tag{
-        margin:0 5px 5px 0;
-      }
-    }
-  }
+	&-box {
+		display: flex;
+		padding: 10px;
+		max-height: 300px;
+		&-inner {
+			flex: 1;
+			padding: 10px 0 10px 10px;
+			&:last-child {
+				border-left: var(--el-border);
+			}
+			.el-tag {
+				margin: 0 5px 5px 0;
+			}
+		}
+	}
 }
 </style>

+ 9 - 0
src/views/home/component/Notice.vue

@@ -31,6 +31,7 @@ import { formatDate } from '/@/utils/formatTime';
 import { useRouter } from 'vue-router';
 import { KnowledgePaged } from '/@/api/knowledge';
 import { bulletinList } from '/@/api/auxiliary/notice';
+import { ElMessage } from 'element-plus';
 const state = reactive({
 	noticeList: [], // 通知公告
 	noticeLoading: false, // 公告
@@ -72,6 +73,10 @@ const handleClick = (val: string) => {
 const goLink = (item: any) => {
 	switch (activeName.value) {
 		case '0':
+			if (!router.hasRoute('knowledgePreview')) {
+				ElMessage.warning('未找到知识查看页面');
+				return;
+			}
 			router.push({
 				name: 'knowledgePreview',
 				params: {
@@ -81,6 +86,10 @@ const goLink = (item: any) => {
 			});
 			break;
 		case '1':
+			if (!router.hasRoute('auxiliaryNoticeRead')) {
+				ElMessage.warning('未找到公告详情页面');
+				return;
+			}
 			router.push({
 				name: 'auxiliaryNoticeRead',
 				params: {

+ 7 - 3
src/views/knowledge/index/edit.vue

@@ -52,8 +52,8 @@
 								placeholder="请选择失效时间"
 								class="w100"
 								value-format="YYYY-MM-DD[T]HH:mm:ss"
-                :disabled-date="disabledDate"
-                popper-class="no-atTheMoment"
+								:disabled-date="disabledDate"
+								popper-class="no-atTheMoment"
 							/>
 						</el-form-item>
 					</el-col>
@@ -196,7 +196,7 @@ import { KnowledgeAdd, KnowledgeGetKnowledge, KnowledgeInfo, knowledgeTitle, Kno
 import { hotSpotType } from '/@/api/business/order';
 import { getCanUseOrg } from '/@/api/system/user';
 import { templateList } from '/@/views/knowledge/index/template';
-import {disabledDate} from "/@/utils/constants";
+import { disabledDate } from '/@/utils/constants';
 // 引入组件
 const Editor = defineAsyncComponent(() => import('/@/components/Editor/index.vue')); // 富文本编辑器
 const ProcessAudit = defineAsyncComponent(() => import('/@/components/ProcessAudit/index.vue')); // 流程审批
@@ -387,6 +387,10 @@ const onPreview = () => {
 		state.ruleForm.creatorOrgName = userInfos.value?.orgName ?? '';
 	}
 	Local.set('previewForm', state.ruleForm);
+	if (!router.hasRoute('knowledgePreview')) {
+		ElMessage.warning('未找到知识预览页面');
+		return;
+	}
 	router.push({
 		name: 'knowledgePreview',
 		params: {

+ 12 - 0
src/views/knowledge/index/index.vue

@@ -401,6 +401,10 @@ const resetNode = () => {
 };
 // 新增知识
 const onOpenAddUser = () => {
+	if (!router.hasRoute('knowledgeEdit')) {
+		ElMessage.warning('未找到新增知识页面');
+		return;
+	}
 	router.push({
 		name: 'knowledgeEdit',
 		params: {
@@ -410,6 +414,10 @@ const onOpenAddUser = () => {
 };
 // 修改知识
 const onEdit = (row: any) => {
+	if (!router.hasRoute('knowledgeEdit')) {
+		ElMessage.warning('未找到知识编辑页面');
+		return;
+	}
 	router.push({
 		name: 'knowledgeEdit',
 		params: {
@@ -420,6 +428,10 @@ const onEdit = (row: any) => {
 };
 // 预览
 const onPreview = (row: any) => {
+	if (!router.hasRoute('knowledgePreview')) {
+		ElMessage.warning('未找到知识查看页面');
+		return;
+	}
 	router.push({
 		name: 'knowledgePreview',
 		params: {

+ 4 - 0
src/views/knowledge/index/preview.vue

@@ -130,6 +130,10 @@ const onQuestion = () => {
 // 预览
 const router = useRouter();
 const onPreview = (row: any) => {
+  if(!router.hasRoute('knowledgePreview')){
+    ElMessage.warning('未找到知识查看页面');
+    return;
+  }
   router.push({
     name: 'knowledgePreview',
     params: {

+ 67 - 59
src/views/knowledge/question/index.vue

@@ -3,15 +3,15 @@
 		<el-card shadow="never">
 			<el-form :model="state.queryParams" ref="ruleFormRef" :inline="true" @submit.native.prevent>
 				<el-form-item label="知识分类" prop="KnowledgeTypeId">
-            <el-cascader
-                :options="state.typeData"
-                filterable
-                :props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'children' }"
-                placeholder="请选择知识分类"
-                v-model="state.queryParams.KnowledgeTypeId"
-                ref="cascadeRef"
-            >
-            </el-cascader>
+					<el-cascader
+						:options="state.typeData"
+						filterable
+						:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, children: 'children' }"
+						placeholder="请选择知识分类"
+						v-model="state.queryParams.KnowledgeTypeId"
+						ref="cascadeRef"
+					>
+					</el-cascader>
 				</el-form-item>
 				<el-form-item label="提问人" prop="CreatorName">
 					<el-input v-model="state.queryParams.CreatorName" placeholder="请输入提问人" clearable @keyup.enter="queryList" style="width: 250px" />
@@ -25,30 +25,30 @@
 		<el-card shadow="never">
 			<!-- 表格 -->
 			<el-table :data="state.tableData" v-loading="state.loading">
-        <el-table-column prop="knowledge.title" label="知识标题" show-overflow-tooltip width="130"></el-table-column>
-        <el-table-column prop="knowledgeTypeText" label="知识分类" show-overflow-tooltip width="120"></el-table-column>
-        <el-table-column prop="knowledge.statusText" label="知识状态" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="stateText" label="答复状态" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="creatorName" label="提问人" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="creationTime" label="提问时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="content" label="提问内容" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="replyContent" label="答复内容" show-overflow-tooltip></el-table-column>
-        <el-table-column label="答复时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.replyTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
+				<el-table-column prop="knowledge.title" label="知识标题" show-overflow-tooltip width="130"></el-table-column>
+				<el-table-column prop="knowledgeTypeText" label="知识分类" show-overflow-tooltip width="120"></el-table-column>
+				<el-table-column prop="knowledge.statusText" label="知识状态" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="stateText" label="答复状态" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="creatorName" label="提问人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="creationTime" label="提问时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="content" label="提问内容" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="replyContent" label="答复内容" show-overflow-tooltip></el-table-column>
+				<el-table-column label="答复时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.replyTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
 				<el-table-column label="操作" width="180" fixed="right" align="center">
 					<template #default="{ row }">
 						<el-button link type="primary" @click="onPreview(row)" title="知识详情"> 知识详情 </el-button>
-						<el-button link type="primary" @click="onReply(row)" v-auth="'knowledge:question:reply'" title="答复" v-if="[0].includes(row.state)"> 答复 </el-button>
-            <el-button link type="primary" @click="onEdit(row)" title="编辑" v-if="[0, 4].includes(row.knowledge?.status)">
-              编辑
-            </el-button>
+						<el-button link type="primary" @click="onReply(row)" v-auth="'knowledge:question:reply'" title="答复" v-if="[0].includes(row.state)">
+							答复
+						</el-button>
+						<el-button link type="primary" @click="onEdit(row)" title="编辑" v-if="[0, 4].includes(row.knowledge?.status)"> 编辑 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -63,19 +63,19 @@
 				@pagination="queryList"
 			/>
 		</el-card>
-    <!-- 知识提问 -->
-    <question-add ref="questionRef" @submitSuccess="queryList"/>
+		<!-- 知识提问 -->
+		<question-add ref="questionRef" @submitSuccess="queryList" />
 	</div>
 </template>
 
 <script lang="ts" setup name="knowledgeQuestion">
-import {defineAsyncComponent, onMounted, reactive, ref} from 'vue';
-import {ElMessage, FormInstance} from 'element-plus';
-import {formatDate} from '/@/utils/formatTime';
-import {auth} from '/@/utils/authFunction';
-import {useRouter} from "vue-router";
-import {questionList} from '/@/api/knowledge/question';
-import {treeList} from "/@/api/knowledge/type";
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { formatDate } from '/@/utils/formatTime';
+import { auth } from '/@/utils/authFunction';
+import { useRouter } from 'vue-router';
+import { questionList } from '/@/api/knowledge/question';
+import { treeList } from '/@/api/knowledge/type';
 
 // 引入组件
 const QuestionAdd = defineAsyncComponent(() => import('/@/views/knowledge/question/components/Question-add.vue')); // 知识提问
@@ -87,18 +87,18 @@ const state = reactive<any>({
 		// 查询参数
 		PageIndex: 1,
 		PageSize: 10,
-    KnowledgeTypeId: null, // 知识分类
-    CreatorName: null, // 提问人
+		KnowledgeTypeId: null, // 知识分类
+		CreatorName: null, // 提问人
 	},
 	total: 0, // 总条数
 	tableData: [], // 表格数据
-  typeData: [], // 知识分类
+	typeData: [], // 知识分类
 });
 const ruleFormRef = ref<RefType>(null); // 表单ref
 const getBaseData = async () => {
 	try {
 		const typeDataRes = await treeList({ IsEnable: true });
-    state.typeData = typeDataRes.result ?? [];
+		state.typeData = typeDataRes.result ?? [];
 	} catch (error) {
 		console.log(error);
 	}
@@ -108,7 +108,7 @@ const queryList = () => {
 	state.loading = true;
 	if (!auth('knowledge:question:query')) ElMessage.error('抱歉,您没有权限获取知识提问列表!');
 	else {
-    questionList(state.queryParams)
+		questionList(state.queryParams)
 			.then((res) => {
 				state.loading = false;
 				state.tableData = res.result.items ?? [];
@@ -128,28 +128,36 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 // 答复
 const questionRef = ref<RefType>();
 const onReply = (row: any) => {
-  questionRef.value.openDialog(row,true);
+	questionRef.value.openDialog(row, true);
 };
 // 知识详情
 const router = useRouter();
 const onPreview = (row: any) => {
-  router.push({
-    name: 'knowledgePreview',
-    params: {
-      id: row.knowledge.id,
-      tagsViewName: '知识详情',
-    },
-  });
+	if (!router.hasRoute('knowledgePreview')) {
+		ElMessage.warning('未找到知识详情页面');
+		return;
+	}
+	router.push({
+		name: 'knowledgePreview',
+		params: {
+			id: row.knowledge.id,
+			tagsViewName: '知识详情',
+		},
+	});
 };
 // 编辑
 const onEdit = (row: any) => {
-  router.push({
-    name: 'knowledgeEdit',
-    params: {
-      id: row.knowledge.id,
-      tagsViewName: '编辑知识',
-    },
-  });
+	if (!router.hasRoute('knowledgeEdit')) {
+		ElMessage.warning('未找到编辑知识页面');
+		return;
+	}
+	router.push({
+		name: 'knowledgeEdit',
+		params: {
+			id: row.knowledge.id,
+			tagsViewName: '编辑知识',
+		},
+	});
 };
 // 页面加载时
 onMounted(() => {

+ 17 - 13
src/views/knowledge/retrieval/index.vue

@@ -93,7 +93,7 @@
 									@select="handleSelect"
 									class="mr10 w100"
 									clearable
-                  value-key="title"
+									value-key="title"
 								>
 									<template #default="{ item }">
 										<template v-if="state.queryParams.RetrievalType === 0">
@@ -195,7 +195,7 @@ import { onMounted, reactive, ref, watch } from 'vue';
 import { useRouter } from 'vue-router';
 import { ElMessage } from 'element-plus';
 import { auth } from '/@/utils/authFunction';
-import { knowledgeRetrieval, searchNumList,searchNumAdd } from '/@/api/knowledge/retrieval';
+import { knowledgeRetrieval, searchNumList, searchNumAdd } from '/@/api/knowledge/retrieval';
 import { hotSpotType } from '/@/api/business/order';
 import { getOrgList } from '/@/api/system/organize';
 import { treeList } from '/@/api/knowledge/type';
@@ -295,6 +295,10 @@ const handleNodeClick = (data: any) => {
 };
 // 预览
 const onPreview = (row: any) => {
+	if (!router.hasRoute('knowledgePreview')) {
+		ElMessage.warning('未找到知识查看页面');
+		return;
+	}
 	router.push({
 		name: 'knowledgePreview',
 		params: {
@@ -343,7 +347,7 @@ const querySearchAsync = (queryString: string, cb: (arg: any) => void) => {
 };
 const handleSelect = (item: Record<string, any>) => {
 	state.queryParams.Keyword = item.title;
-  searchNumAdd({id: item.id});
+	searchNumAdd({ id: item.id });
 	queryList();
 };
 const queryList = () => {
@@ -385,16 +389,16 @@ const resetQuery = throttle(() => {
 }, 500);
 // 重置选中的节点
 const resetNode = () => {
-  state.queryParams.CreateOrgId = null;
-  state.queryParams.KnowledgeTypeId = null;
-  state.queryParams.HotspotId = null;
-  filterOrg.value = '';
-  filterType.value = '';
-  filterHot.value = '';
-  typeRef.value?.setCurrentKey(null);
-  orgRef.value?.setCurrentKey(null);
-  hotRef.value?.setCurrentKey(null);
-  queryList();
+	state.queryParams.CreateOrgId = null;
+	state.queryParams.KnowledgeTypeId = null;
+	state.queryParams.HotspotId = null;
+	filterOrg.value = '';
+	filterType.value = '';
+	filterHot.value = '';
+	typeRef.value?.setCurrentKey(null);
+	orgRef.value?.setCurrentKey(null);
+	hotRef.value?.setCurrentKey(null);
+	queryList();
 };
 onMounted(() => {
 	getOrgListApi();

+ 152 - 99
src/views/system/config/workflow/index.vue

@@ -4,7 +4,7 @@
 			<el-tabs v-model="state.activeName" @tab-change="handleClick" class="h100">
 				<el-tab-pane label="流程业务" name="0"></el-tab-pane>
 				<el-tab-pane label="流程模板" name="1"></el-tab-pane>
-<!--				<el-tab-pane label="流程实例" name="2"></el-tab-pane>-->
+				<!--				<el-tab-pane label="流程实例" name="2"></el-tab-pane>-->
 				<div class="flex-column">
 					<el-form
 						:model="state.queryParams"
@@ -12,17 +12,22 @@
 						:inline="true"
 						@submit.native.prevent
 						class="mt15"
-            v-if="['1','2'].includes(state.activeName)"
+						v-if="['1', '2'].includes(state.activeName)"
 					>
 						<el-form-item label="关键字查询" prop="Keyword">
-							<el-input v-model="state.queryParams.Keyword" :placeholder="state.activeName ==='1' ? '模板名称/模板编码' : '流程标题/流程ID'" clearable @keyup.enter="queryList" />
+							<el-input
+								v-model="state.queryParams.Keyword"
+								:placeholder="state.activeName === '1' ? '模板名称/模板编码' : '流程标题/流程ID'"
+								clearable
+								@keyup.enter="queryList"
+							/>
 						</el-form-item>
-            <el-form-item label="模板状态" prop="Status"  v-show="state.activeName === '1'">
-              <el-select v-model="state.queryParams.Status" class="w100" placeholder="请选择模板状态" v-show="state.activeName === '1'">
-                <el-option v-for="item in state.statusList" :key="item.value" :label="item.label" :value="item.value" />
-              </el-select>
-            </el-form-item>
-						<el-form-item label="业务模块" prop="ModuleCode"  v-show="state.activeName === '2'">
+						<el-form-item label="模板状态" prop="Status" v-show="state.activeName === '1'">
+							<el-select v-model="state.queryParams.Status" class="w100" placeholder="请选择模板状态" v-show="state.activeName === '1'">
+								<el-option v-for="item in state.statusList" :key="item.value" :label="item.label" :value="item.value" />
+							</el-select>
+						</el-form-item>
+						<el-form-item label="业务模块" prop="ModuleCode" v-show="state.activeName === '2'">
 							<el-select v-model="state.queryParams.ModuleCode" class="w100" placeholder="请选择业务模块">
 								<el-option v-for="item in state.moduleOptions" :key="item.key" :label="item.value" :value="item.key" />
 							</el-select>
@@ -31,7 +36,9 @@
 							<el-button type="primary" @click="queryList" :loading="state.loading" v-waves>
 								<SvgIcon name="ele-Search" class="mr5" />查询
 							</el-button>
-							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
+								<SvgIcon name="ele-Refresh" class="mr5" />重置
+							</el-button>
 						</el-form-item>
 					</el-form>
 					<div class="mb20">
@@ -46,15 +53,26 @@
 							<el-table-column prop="name" label="业务模块" show-overflow-tooltip></el-table-column>
 							<el-table-column prop="code" label="编码" show-overflow-tooltip></el-table-column>
 							<el-table-column prop="remark" label="备注" show-overflow-tooltip></el-table-column>
-              <el-table-column prop="definition.name" label="模板名称" show-overflow-tooltip></el-table-column>
-              <el-table-column prop="definition.code" label="模板编码" show-overflow-tooltip></el-table-column>
-              <el-table-column prop="definition.version" label="模板版本" show-overflow-tooltip></el-table-column>
-              <el-table-column label="操作" width="160" fixed="right" align="center">
-                <template #default="{ row }">
-                  <el-button link type="primary" @click="onConfig(row)"  title="配置模板" v-auth="'system:workflow:template:config'"> 配置模板</el-button>
-                  <el-button link type="danger" @click="configClear(row)"  title="清除配置" v-if="row.definition" v-auth="'system:workflow:template:clear'"> 清除配置 </el-button>
-                </template>
-              </el-table-column>
+							<el-table-column prop="definition.name" label="模板名称" show-overflow-tooltip></el-table-column>
+							<el-table-column prop="definition.code" label="模板编码" show-overflow-tooltip></el-table-column>
+							<el-table-column prop="definition.version" label="模板版本" show-overflow-tooltip></el-table-column>
+							<el-table-column label="操作" width="160" fixed="right" align="center">
+								<template #default="{ row }">
+									<el-button link type="primary" @click="onConfig(row)" title="配置模板" v-auth="'system:workflow:template:config'">
+										配置模板</el-button
+									>
+									<el-button
+										link
+										type="danger"
+										@click="configClear(row)"
+										title="清除配置"
+										v-if="row.definition"
+										v-auth="'system:workflow:template:clear'"
+									>
+										清除配置
+									</el-button>
+								</template>
+							</el-table-column>
 						</template>
 						<!-- 模板 -->
 						<template v-if="state.activeName === '1'">
@@ -71,11 +89,25 @@
 								<!-- 草稿0 启用1 禁用2 -->
 								<template #default="{ row }">
 									<el-button link type="primary" @click="onEditTemp(row)" title="修改" v-auth="'system:workflow:template:edit'"> 修改 </el-button>
-									<el-button link type="success" v-if="row.status === 0" @click="onReleaseTemp(row)" title="发布" v-auth="'system:workflow:template:publish'" >
+									<el-button
+										link
+										type="success"
+										v-if="row.status === 0"
+										@click="onReleaseTemp(row)"
+										title="发布"
+										v-auth="'system:workflow:template:publish'"
+									>
 										发布
 									</el-button>
 									<!-- 发布之后不能修改 -->
-									<el-button link v-if="row.status === 0" type="danger" @click="onDeleteTemp(row)" title="删除" v-auth="'system:workflow:template:delete'">
+									<el-button
+										link
+										v-if="row.status === 0"
+										type="danger"
+										@click="onDeleteTemp(row)"
+										title="删除"
+										v-auth="'system:workflow:template:delete'"
+									>
 										删除
 									</el-button>
 								</template>
@@ -139,23 +171,33 @@
 				</div>
 			</el-tabs>
 		</el-card>
-    <!--  流程跳转 -->
+		<!--  流程跳转 -->
 		<workflow-jump ref="workflowJumpRef" @updateList="queryList" />
 
-    <!--  配置模板  -->
-    <Workflow-config ref="workflowConfigRef" @updateList="queryList"/>
+		<!--  配置模板  -->
+		<Workflow-config ref="workflowConfigRef" @updateList="queryList" />
 	</div>
 </template>
 
 <script lang="ts" setup name="systemWorkflow">
-import {defineAsyncComponent, onActivated, onMounted, reactive, ref} from 'vue';
-import {useRoute, useRouter} from 'vue-router';
-import type {FormInstance} from 'element-plus';
-import {ElMessage, ElMessageBox} from 'element-plus';
-import {formatDate} from '/@/utils/formatTime';
-import {throttle} from '/@/utils/tools';
-import {baseData, publishOnList, wfmodules, wfmodulesMatch, workflowDelete, workflowDisable, workflowEnable, workflowList, workflowPaged, workflowTerminate,} from '/@/api/system/workflow';
-
+import { defineAsyncComponent, onActivated, onMounted, reactive, ref } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import type { FormInstance } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { formatDate } from '/@/utils/formatTime';
+import { throttle } from '/@/utils/tools';
+import {
+	baseData,
+	publishOnList,
+	wfmodules,
+	wfmodulesMatch,
+	workflowDelete,
+	workflowDisable,
+	workflowEnable,
+	workflowList,
+	workflowPaged,
+	workflowTerminate,
+} from '/@/api/system/workflow';
 
 // 引入组件
 const WorkflowJump = defineAsyncComponent(() => import('/@/views/system/config/workflow/component/Workflow-jump.vue')); // 流程跳转
@@ -164,11 +206,12 @@ const WorkflowConfig = defineAsyncComponent(() => import('/@/views/system/config
 // 定义变量内容
 const state = reactive(<any>{
 	activeName: '0', // 0:模板 1:实例 2:历史
-	queryParams: { // 查询参数
+	queryParams: {
+		// 查询参数
 		PageIndex: 1, // 当前页
 		PageSize: 10, // 每页条数
-		Keyword: null,// 关键字
-    Status:null,
+		Keyword: null, // 关键字
+		Status: null,
 		ModuleCode: null, // 模块编码
 	},
 	tableList: [], // 表格数据
@@ -176,13 +219,14 @@ const state = reactive(<any>{
 	total: 0, // 总条数
 	multipleSelection: [], // 多选
 	moduleOptions: [], // 模块下拉
-  statusList:[ // 状态下拉
-    {label:'启用',value:'1'},
-    {label:'草稿',value:'0'},
-  ]
+	statusList: [
+		// 状态下拉
+		{ label: '启用', value: '1' },
+		{ label: '草稿', value: '0' },
+	],
 });
 
-const ruleFormRef = ref<FormInstance>();  // 表单ref
+const ruleFormRef = ref<FormInstance>(); // 表单ref
 const workflowJumpRef = ref(null as any); // 跳转ref
 const workflowConfigRef = ref(null as any); // 配置ref
 const router = useRouter(); // 路由
@@ -190,11 +234,11 @@ const route = useRoute();
 /** 获取列表 */
 const queryList = () => {
 	state.loading = true;
-  let req:any = {
-    PageIndex: state.queryParams.PageIndex,
-    PageSize: state.queryParams.PageSize,
-    Keyword: state.queryParams.Keyword,
-  }
+	let req: any = {
+		PageIndex: state.queryParams.PageIndex,
+		PageSize: state.queryParams.PageSize,
+		Keyword: state.queryParams.Keyword,
+	};
 	switch (state.activeName) {
 		case '0':
 			wfmodules()
@@ -207,10 +251,10 @@ const queryList = () => {
 				});
 			break;
 		case '1':
-      req = {
-        ...req,
-        Status:state.queryParams.Status
-      }
+			req = {
+				...req,
+				Status: state.queryParams.Status,
+			};
 			workflowList(req)
 				.then((response: any) => {
 					state.tableList = response.result.items ?? [];
@@ -222,10 +266,10 @@ const queryList = () => {
 				});
 			break;
 		case '2':
-      req = {
-        ...req,
-        ModuleCode:state.queryParams.ModuleCode
-      }
+			req = {
+				...req,
+				ModuleCode: state.queryParams.ModuleCode,
+			};
 			workflowPaged(req)
 				.then((response: any) => {
 					state.tableList = response.result?.items ?? [];
@@ -248,13 +292,17 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 }, 500);
 // 切换tab 查询列表
 const handleClick = () => {
-  state.queryParams.Keyword = '';
-  state.queryParams.Status = '';
-  state.queryParams.ModuleCode = '';
+	state.queryParams.Keyword = '';
+	state.queryParams.Status = '';
+	state.queryParams.ModuleCode = '';
 	queryList();
 };
 // 新增模板
 const onAddTemp = () => {
+	if (!router.hasRoute('workflowAddEdit')) {
+		ElMessage.warning('未找到新增流程模板页面');
+		return;
+	}
 	router.push({
 		name: 'workflowAddEdit',
 		params: {
@@ -264,6 +312,10 @@ const onAddTemp = () => {
 };
 // 修改模板
 const onEditTemp = (row: any) => {
+	if (!router.hasRoute('workflowAddEdit')) {
+		ElMessage.warning('未找到流程编辑页面');
+		return;
+	}
 	router.push({
 		name: 'workflowAddEdit',
 		params: {
@@ -292,22 +344,22 @@ const onDeleteTemp = (row: any) => {
 };
 // 发布模板
 const onReleaseTemp = async (row: any) => {
-  console.log(row)
-		ElMessageBox.confirm(`此操作将发布模板:“${row.name}”,是否继续?`, '提示', {
-			confirmButtonText: '确认',
-			cancelButtonText: '取消',
-			type: 'warning',
-			draggable: true,
-			cancelButtonClass: 'default-button',
-			autofocus: false,
+	console.log(row);
+	ElMessageBox.confirm(`此操作将发布模板:“${row.name}”,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			publishOnList(row.id).then(() => {
+				ElMessage.success('发布成功');
+				queryList();
+			});
 		})
-			.then(() => {
-				publishOnList(row.id).then(() => {
-					ElMessage.success('发布成功');
-					queryList();
-				});
-			})
-			.catch(() => {});
+		.catch(() => {});
 };
 // 跳转流程
 const onLink = (row: any) => {
@@ -353,44 +405,45 @@ const onStopProcess = (row: any) => {
 		.catch(() => {});
 };
 
-
 // 配置模板
-const onConfig = (row:any)=>{
-  workflowConfigRef.value.openDialog(row);
-}
+const onConfig = (row: any) => {
+	workflowConfigRef.value.openDialog(row);
+};
 // 清除配置
-const configClear = (row:any)=>{
-  ElMessageBox.confirm(`确认清除${row.name} 的配置?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-      .then(() => {
-        wfmodulesMatch({code:row.code,definitionId:''}).then(()=>{
-          ElMessage.success('操作成功');
-          queryList();
-        }).catch(()=>{})
-      })
-      .catch(() => {});
-}
+const configClear = (row: any) => {
+	ElMessageBox.confirm(`确认清除${row.name} 的配置?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			wfmodulesMatch({ code: row.code, definitionId: '' })
+				.then(() => {
+					ElMessage.success('操作成功');
+					queryList();
+				})
+				.catch(() => {});
+		})
+		.catch(() => {});
+};
 const params = history.state;
 onMounted(async () => {
 	queryList();
 	// 获取页面基础信息
 	const res: any = await baseData();
 	state.moduleOptions = res.result?.moduleOptions ?? [];
-  if(params.index){
-    state.activeName = params.index as string;
-  }
+	if (params.index) {
+		state.activeName = params.index as string;
+	}
 });
 onActivated(() => {
-  if(params.index){
-    state.activeName = params.index as string;
-    queryList();
-  }
+	if (params.index) {
+		state.activeName = params.index as string;
+		queryList();
+	}
 });
 </script>
 <style lang="scss" scoped>

+ 5 - 0
src/views/todo/seats/accept/Knowledge.vue

@@ -64,6 +64,7 @@ import { onMounted, reactive, ref } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { formatDate } from '/@/utils/formatTime';
 import { knowledgeRetrieval } from '/@/api/knowledge/retrieval';
+import { ElMessage } from 'element-plus';
 
 const props = defineProps({
 	type: {
@@ -131,6 +132,10 @@ const router = useRouter(); // 路由
 const route = useRoute(); // 路由
 // 预览知识
 const onPreview = (row: any) => {
+	if (!router.hasRoute('knowledgePreview')) {
+		ElMessage.warning('未找到知识查看页面');
+		return;
+	}
 	router.push({
 		name: 'knowledgePreview',
 		params: {

+ 8 - 1
src/views/todo/seats/index.vue

@@ -209,7 +209,10 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 }, 300);
 // 新增工单
 const onAddOrder = () => {
-	// 跳转到录入工单页面
+	if (!router.hasRoute('orderAccept')) {
+		ElMessage.warning('未找到工单受理页面');
+		return;
+	}
 	router.push({
 		name: 'orderAccept',
 		params: {
@@ -229,6 +232,10 @@ const onExport = () => {
 };
 // 编辑工单
 const onOrderEdit = (row: any) => {
+	if (!router.hasRoute('orderAccept')) {
+		ElMessage.warning('未找到工单受理页面');
+		return;
+	}
 	router.push({
 		name: 'orderAccept',
 		params: {