Browse Source

reactor:383 敏感词展示

zhangchong 1 tháng trước cách đây
mục cha
commit
896b55efce

+ 68 - 46
src/api/business/lzRXFZ.ts

@@ -8,73 +8,95 @@ import { Cookie } from '@/utils/storage';
  * @description  认证授权
  */
 export const lzRXFZAuth = (data: object) => {
-	return request({
-		baseURL: 'http://110.188.24.28:50107/lzhcp',
-		url: `/third/user/auth/token`,
-		method: 'post',
-		data,
-	});
+	return request(
+		{
+			baseURL: import.meta.env.VITE_RXFZ_API_URL,
+			url: `/user/auth/token`,
+			method: 'post',
+			data,
+		},
+		{
+			is_need_token: false,
+		}
+	);
 };
 /**
  * @description  知识推荐
  */
 export const lzRXFZKnowledge = (data: object) => {
-	return request({
-		baseURL: import.meta.env.VITE_RXFZ_API_URL,
-		url: `/knowledge/knowledge_following`,
-		method: 'post',
-		data,
-		headers: {
-			Authentication: `Bearer ${Cookie.get('lzRXFZToken')}`,
+	return request(
+		{
+			baseURL: import.meta.env.VITE_RXFZ_API_URL,
+			url: `/knowledge/knowledge_following`,
+			method: 'post',
+			data,
+			headers: {
+				Authorization: `Bearer ${Cookie.get('lzRXFZToken')}`,
+			},
 		},
-	},{
-		error_message_show: false,
-	});
+		{
+			error_message_show: false,
+			is_need_token: false,
+		}
+	);
 };
 /**
  * @description  办事指南文档类型
  */
-export const lzRXFZDocumentType = () => {
-	return request({
-		baseURL: import.meta.env.VITE_RXFZ_API_URL,
-		url: `/guide/contentType`,
-		method: 'get',
-		headers: {
-			Authentication: `Bearer ${Cookie.get('lzRXFZToken')}`,
+export const lzRXFZDocumentType = (params: object) => {
+	return request(
+		{
+			baseURL: import.meta.env.VITE_RXFZ_API_URL,
+			url: `/guide/contentType`,
+			method: 'get',
+			headers: {
+				Authorization: `Bearer ${Cookie.get('lzRXFZToken')}`,
+			},
+			params
 		},
-	},{
-		error_message_show: false,
-	});
+		{
+			error_message_show: false,
+			is_need_token: false,
+		}
+	);
 };
 /**
  * @description  办事指南列表
  */
 export const lzRXFZDocumentList = (data: object) => {
-	return request({
-		baseURL: import.meta.env.VITE_RXFZ_API_URL,
-		url: ` /guide/documentList`,
-		method: 'post',
-		data,
-		headers: {
-			Authentication: `Bearer ${Cookie.get('lzRXFZToken')}`,
+	return request(
+		{
+			baseURL: import.meta.env.VITE_RXFZ_API_URL,
+			url: `/guide/documentList`,
+			method: 'post',
+			data,
+			headers: {
+				Authorization: `Bearer ${Cookie.get('lzRXFZToken')}`,
+			},
 		},
-	},{
-		error_message_show: false,
-	});
+		{
+			error_message_show: false,
+			is_need_token: false,
+		}
+	);
 };
 /**
  * @description  办事指南详情
  */
 export const lzRXFZDocumentDetail = (params: object) => {
-	return request({
-		baseURL: import.meta.env.VITE_RXFZ_API_URL,
-		url: `/guide/documentDetail`,
-		method: 'get',
-		params,
-		headers: {
-			Authentication: `Bearer ${Cookie.get('lzRXFZToken')}`,
+	return request(
+		{
+			baseURL: import.meta.env.VITE_RXFZ_API_URL,
+			url: `/guide/documentDetail`,
+			method: 'get',
+			params,
+			headers: {
+				Authorization: `Bearer ${Cookie.get('lzRXFZToken')}`,
+			},
 		},
-	},{
-		error_message_show: false,
-	});
+		{
+			error_message_show: false,
+			is_need_token: false,
+		}
+	);
 };

+ 5 - 1
src/utils/request.ts

@@ -15,6 +15,7 @@ type customOptionsType = {
 	reduce_data_format?: boolean; // 是否开启简洁的数据结构响应 减少一层data, 默认为true
 	error_message_show?: boolean; // 是否开启接口错误信息展示,默认为true
 	code_message_show?: boolean; // 是否开启code不为0时的信息提示, 默认为false
+	is_need_token?: boolean; // 是否需要token
 };
 export default function myAxios(axiosConfig: any, customOptions?: customOptionsType, loadingOptions?: LoadingOptionsResolved) {
 	// 配置新建一个 axios 实例
@@ -32,6 +33,7 @@ export default function myAxios(axiosConfig: any, customOptions?: customOptionsT
 			reduce_data_format: true, // 是否开启简洁的数据结构响应 减少一层data, 默认为true
 			error_message_show: true, // 是否开启接口错误信息展示,默认为true
 			code_message_show: false, // 是否开启code不为0时的信息提示, 默认为false
+			is_need_token: true, // 是否需要token
 		},
 		customOptions
 	);
@@ -50,7 +52,9 @@ export default function myAxios(axiosConfig: any, customOptions?: customOptionsT
 			}
 			// 在发送请求之前做些什么 token
 			if (Cookie.get('token')) {
-				(<any>config.headers)['Authorization'] = `Bearer ${Cookie.get('token')}`;
+				if(custom_options.is_need_token){
+					(<any>config.headers)['Authorization'] = `Bearer ${Cookie.get('token')}`;
+				}
 			}
 			return config;
 		},

+ 1 - 1
src/views/business/discern/YBApply.vue

@@ -88,7 +88,7 @@
 					</vxe-column>
 					<vxe-column field="order.isUrgentText" title="是否紧急" width="90">
 						<template #default="{ row }">
-							<span class="color-danger font-bold">{{row.isUrgentText}}</span>
+							<span class="color-danger font-bold">{{row.order?.isUrgentText}}</span>
 						</template>
 					</vxe-column>
 					<vxe-column field="order.sensitiveText" title="敏感词" width="150"></vxe-column>

+ 1 - 1
src/views/business/discern/todo.vue

@@ -91,7 +91,7 @@
 					</vxe-column>
 					<vxe-column field="order.isUrgentText" title="是否紧急" width="90">
 						<template #default="{ row }">
-							<span class="color-danger font-bold">{{row.isUrgentText}}</span>
+							<span class="color-danger font-bold">{{row.order?.isUrgentText}}</span>
 						</template>
 					</vxe-column>
 					<vxe-column field="order.sensitiveText" title="敏感词" width="150"></vxe-column>

+ 1 - 1
src/views/business/visit/todo.vue

@@ -339,7 +339,7 @@ const gridOptions = reactive<any>({
 			width: 90,
 			slots: {
 				default: ({ row }) => {
-					return <span class="color-danger font-bold">{row.order.isUrgentText}</span>;
+					return <span class="color-danger font-bold">{row.order?.isUrgentText}</span>;
 				},
 			},
 		},

+ 155 - 23
src/views/todo/seats/accept/Knowledge.vue

@@ -46,7 +46,7 @@
 				<div v-for="(v, i) in state.knowledgeList" :key="i" class="retrieval-content-item" @click="onPreview(v)">
 					<div class="mb10" style="display: flex">
 						<p class="text-no-wrap" style="flex: 1">{{ v.title }}</p>
-						<el-button type="primary" size="small" @click.stop="changeYYType(v)" v-if="['ZiGong','YiBin'].includes(themeConfig.appScope)">{{
+						<el-button type="primary" size="small" @click.stop="changeYYType(v)" v-if="['ZiGong', 'YiBin'].includes(themeConfig.appScope)">{{
 							v.isChoose ? '取消引用' : '引用'
 						}}</el-button>
 					</div>
@@ -75,30 +75,65 @@
 		class="pt10"
 		v-if="['', '中心知识库', '部门知识库'].includes(state.queryParams.Attribution)"
 	/>
-	<div v-if="['guide'].includes(state.queryParams.Attribution)">
-		<el-input v-model="guideKeyword" placeholder="请输入搜索内容" clearable class="mr10 w100" @keyup.enter="sendGuide">
-			<template #prepend>
-				<el-select v-model="selectType" style="width: 80px">
-					<el-option label="个人" value="1" />
-					<el-option label="企业" value="2" />
-				</el-select>
-			</template>
+	<!--	办事指南 -->
+	<div v-if="['guide'].includes(state.queryParams.Attribution)" class="guide">
+		<div class="flex flex-center-between mt10">
+			<el-radio-group v-model="selectType" @change="getGuideType">
+				<el-radio-button label="个人" value="1" />
+				<el-radio-button label="企业" value="2" />
+			</el-radio-group>
+			<el-select v-model="guideType" placeholder="请选择办事分类" style="width: 240px" @change="handleQueryGuide">
+				<el-option v-for="item in guideTypeList" :key="item.code" :label="item.describe" :value="item.code" />
+			</el-select>
+		</div>
+		<el-input v-model="guideKeyword" placeholder="请输入文档名称" clearable class="mr10 mt10 w100" @keyup.enter="sendGuide">
 			<template #append>
 				<el-button type="primary" @click="sendGuide" size="small" round>搜索</el-button>
 			</template>
 		</el-input>
-		<el-empty description="暂无数据" v-if="!guideList.length" class="mb20"> </el-empty>
-		<el-scrollbar max-height="400px"> </el-scrollbar>
+		<div v-loading="state.loading" class="guide-content">
+			<el-empty description="暂无数据" v-if="!guideList.length" class="mb20"> </el-empty>
+			<el-scrollbar max-height="350px">
+				<div v-for="(item, index) in guideList" :key="index" class="guide-content-item">
+					<el-button link type="primary" @click="guideDetail(item)">{{ item.name }}</el-button>
+				</div>
+			</el-scrollbar>
+			<pagination
+				@pagination="getGuideDataList"
+				:total="guideListTotal"
+				v-model:current-page="guidePageIndex"
+				v-model:page-size="guidePageSize"
+				class="pt10"
+			/>
+		</div>
 	</div>
-	<div v-if="['recommend'].includes(state.queryParams.Attribution)">
+	<!--	推荐知识 -->
+	<div v-if="['recommend'].includes(state.queryParams.Attribution)" class="recommend">
 		<el-input v-model="recommendKeyword" placeholder="请输入问题内容" clearable class="mr10 w100" @keyup.enter="sendRecommend">
 			<template #append>
 				<el-button type="primary" @click="sendRecommend" size="small" round>搜索</el-button>
 			</template>
 		</el-input>
-		<el-empty description="暂无数据" v-if="!recommendList.length" class="mb20"> </el-empty>
-		<el-scrollbar max-height="400px"> </el-scrollbar>
+		<div v-loading="state.loading" class="recommend-content">
+			<el-empty description="暂无数据" v-if="!recommendList.length" class="mb20"> </el-empty>
+			<el-scrollbar max-height="400px">
+				<div v-for="(item, index) in recommendList" :key="index" class="recommend-content-item">
+					<div class="recommend-content-item-question">问:{{ item.question }}</div>
+					<div class="recommend-content-item-answer" v-html="item.answer" style="text-indent: 1em"></div>
+				</div>
+			</el-scrollbar>
+		</div>
 	</div>
+	<el-dialog :title="dialogTitle" v-model="dialogVisible" draggable destroy-on-close append-to-body>
+		<div v-loading="loading" class="formatted-text">
+			{{documentContent}}
+		</div>
+		<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="dialogVisible = false" class="default-button">关闭</el-button>
+				</span>
+		</template>
+	</el-dialog>
 </template>
 <script setup lang="ts" name="orderAcceptKnowledge">
 // 定义变量内容
@@ -110,8 +145,9 @@ import { throttle } from '@/utils/tools';
 import { useThemeConfig } from '@/stores/themeConfig';
 import { storeToRefs } from 'pinia';
 import { removeDuplicate } from '@/utils/arrayOperation';
-import { lzRXFZAuth } from '@/api/business/lzRXFZ';
+import { lzRXFZAuth, lzRXFZDocumentDetail, lzRXFZDocumentList, lzRXFZDocumentType, lzRXFZKnowledge } from '@/api/business/lzRXFZ';
 import { useUserInfo } from '@/stores/userInfo';
+import { Cookie } from '@/utils/storage';
 
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
@@ -148,7 +184,11 @@ const state = reactive<any>({
 });
 // 手动查询,将页码设置为1
 const handleQuery = () => {
-	if (['guide', 'recommend'].includes(state.queryParams.Attribution)) return;
+	if (['recommend'].includes(state.queryParams.Attribution)) return;
+	if (state.queryParams.Attribution === 'guide') {
+		getGuideType();
+		return;
+	}
 	state.queryParams.PageIndex = 1;
 	knowledgeRetrievalPaged();
 };
@@ -267,12 +307,70 @@ watch(
 // 指南关键词
 const guideKeyword = ref('');
 const selectType = ref('1'); // 选择类型 1 个人 2 企业
-// 发送问题
+const guideType = ref(null); // 指南类型
+const guideTypeList = ref<EmptyArrayType>([]); // 指南类型列表
+// 获取指南类型列表
+const getGuideType = () => {
+	lzRXFZDocumentType({ type: selectType.value })
+		.then((res: any) => {
+			guideTypeList.value = res.data;
+			guideType.value = res.data[0].code;
+			handleQueryGuide();
+		})
+		.catch((err: any) => {
+			console.log(err);
+		});
+};
+// 根据分类获取指南数据列表
+const guideListTotal = ref(0);
+const guidePageIndex = ref(1);
+const guidePageSize = ref(10);
 const guideList = ref<EmptyArrayType>([]); // 指南列表
+const handleQueryGuide = () => {
+	guidePageIndex.value = 1;
+	getGuideDataList();
+};
+const getGuideDataList = () => {
+	state.loading = true;
+	lzRXFZDocumentList({
+		type: selectType.value,
+		contentType: guideType.value,
+		pageNum: guidePageIndex.value,
+		pageSize: guidePageSize.value,
+		name: guideKeyword.value,
+	})
+		.then((res: any) => {
+			guideListTotal.value = parseInt(res.data?.total);
+			guideList.value = res.data.rows;
+			state.loading = false;
+		})
+		.catch((err: any) => {
+			console.log(err);
+			state.loading = false;
+		});
+};
+// 发送问题
 const sendGuide = () => {
-	if (!guideKeyword.value) {
-		return;
-	}
+	handleQueryGuide();
+};
+// 点击查看文档详情
+const dialogVisible = ref(false);
+const dialogTitle = ref('文档详情');
+const loading = ref(false); // 加载
+const documentContent = ref(null);
+const guideDetail = (item: any) => {
+	dialogVisible.value = true;
+	loading.value = true;
+	dialogTitle.value =  `文档详情(${item.name})`;
+	lzRXFZDocumentDetail({ documentId: item.id })
+		.then((res: any) => {
+			documentContent.value = res.data.content;
+			loading.value = false;
+		})
+		.catch((err: any) => {
+			console.log(err);
+			loading.value = false;
+		});
 };
 // 推荐知识关键词
 const recommendKeyword = ref('');
@@ -280,17 +378,27 @@ const recommendKeyword = ref('');
 const recommendList = ref<EmptyArrayType>([]); // 推荐列表
 const sendRecommend = () => {
 	if (!recommendKeyword.value) {
+		recommendList.value = [];
 		return;
 	}
+	state.loading = true;
+	lzRXFZKnowledge({ content: recommendKeyword.value })
+		.then((res: any) => {
+			recommendList.value = res.data;
+			state.loading = false;
+		})
+		.catch((err: any) => {
+			console.log(err);
+			state.loading = false;
+		});
 };
 // 热线赋值授权
 const stores = useUserInfo(); // 用户信息
 const { userInfos } = storeToRefs(stores); // 用户信息
 const getRXFZAuth = () => {
-	console.log(userInfos.value, '111');
-	lzRXFZAuth({ uuid: '08dbba85-02b4-4c0d-83e9-a6e35977c105' })
+	lzRXFZAuth({ uuid: userInfos.value.id })
 		.then((res: any) => {
-			console.log(res);
+			Cookie.set('lzRXFZToken', res.data.accessToken);
 		})
 		.catch((err: any) => {
 			console.log(err);
@@ -334,4 +442,28 @@ defineExpose({
 		}
 	}
 }
+.recommend-content {
+	margin-top: 10px;
+	.recommend-content-item {
+		padding: 5px;
+		border-bottom: var(--el-border);
+		&:last-child {
+			border: none;
+		}
+		.recommend-content-item-question {
+			font-weight: bold;
+			margin-bottom: 5px;
+		}
+	}
+}
+.guide-content {
+	margin-top: 10px;
+	.guide-content-item {
+		padding: 5px;
+		border-bottom: var(--el-border);
+		&:last-child {
+			border: none;
+		}
+	}
+}
 </style>