Knowledge.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <template>
  2. <div class="knowledge-container">
  3. <el-tabs v-model="state.queryParams.Attribution" @tab-change="handleQuery">
  4. <el-tab-pane label="推荐知识库" name=""> </el-tab-pane>
  5. <el-tab-pane label="中心知识库" name="中心知识库"> </el-tab-pane>
  6. <el-tab-pane label="部门知识库" name="部门知识库"> </el-tab-pane>
  7. </el-tabs>
  8. <div class="knowledge-input">
  9. <el-input v-model="state.queryParams.Keyword" placeholder="关键词" clearable class="mr10 w100" @keyup.enter="knowledgeRetrievalPaged">
  10. <template #prefix>
  11. <SvgIcon name="ele-Search" size="16px" />
  12. </template>
  13. <template #append>
  14. <el-button type="primary" @click="knowledgeRetrievalPaged" class="search-button" size="small" round
  15. ><SvgIcon name="ele-Search" class="mr4" /> 查询
  16. </el-button>
  17. </template>
  18. </el-input>
  19. </div>
  20. <div class="mt5" style="display: flex; flex-wrap: wrap; justify-content: space-between" v-if="state.queryParams.Attribution === ''">
  21. <div style="display: flex">
  22. <div style="height: 32px; line-height: 32px">推荐类型:</div>
  23. <el-radio-group v-model="state.queryParams.recommendType" @change="changeRecommendType">
  24. <el-radio value="1">关键词推荐</el-radio>
  25. <el-radio value="2">热点推荐</el-radio>
  26. </el-radio-group>
  27. </div>
  28. <div style="display: flex">
  29. <div style="height: 32px; line-height: 32px">排序:</div>
  30. <el-radio-group v-model="state.queryParams.Sort" @change="handleQuery">
  31. <el-radio value="1">浏览量</el-radio>
  32. <el-radio value="2">收藏量</el-radio>
  33. <el-radio value="3">创建时间</el-radio>
  34. </el-radio-group>
  35. </div>
  36. </div>
  37. <div class="mt10 retrieval-content" v-loading="state.loading">
  38. <el-empty description="暂无数据" v-if="!state.knowledgeList.length" class="mb20">
  39. <template #image>
  40. <span></span>
  41. </template>
  42. </el-empty>
  43. <el-scrollbar>
  44. <div v-for="(v, i) in state.knowledgeList" :key="i" class="retrieval-content-item" @click="onPreview(v)">
  45. <div class="mb10" style="display: flex">
  46. <p class="text-no-wrap" style="flex: 1">{{ v.title }}</p>
  47. <el-button type="primary" size="small" @click.stop="changeYYType(v)" v-if="['ZiGong'].includes(themeConfig.appScope)">{{
  48. v.isChoose ? '取消引用' : '引用'
  49. }}</el-button>
  50. </div>
  51. <!-- <div class="text-ellipsis2">{{ v.summary }}</div>-->
  52. <div class="flex-center-between mt10 color-info">
  53. <div>
  54. <span class="mr10">创建部门:{{ v.creatorOrgName }}</span>
  55. <span>创建时间:{{ formatDate(v.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  56. </div>
  57. <div class="flex-center-align">
  58. <span class="flex-center-align"><SvgIcon name="ele-StarFilled" size="18px" class="mr3" />{{ v.score }}</span>
  59. <!-- <span class="flex-center-align ml10"><SvgIcon name="ele-ChatDotSquare" size="16px" class="mr3" />{{ v.commentNum }}</span>-->
  60. <span class="flex-center-align ml10"><SvgIcon name="ele-View" size="16px" class="mr3" />{{ v.pageView }}</span>
  61. </div>
  62. </div>
  63. </div>
  64. </el-scrollbar>
  65. </div>
  66. </div>
  67. <pagination
  68. @pagination="knowledgeRetrievalPaged"
  69. :total="state.knowledgeTotal"
  70. v-model:current-page="state.queryParams.PageIndex"
  71. v-model:page-size="state.queryParams.PageSize"
  72. layout="prev, pager, next"
  73. class="pt10"
  74. />
  75. </template>
  76. <script setup lang="ts" name="orderAcceptKnowledge">
  77. // 定义变量内容
  78. import { onMounted, reactive, defineAsyncComponent, ref, watch } from 'vue';
  79. import { useRouter } from 'vue-router';
  80. import { formatDate } from '@/utils/formatTime';
  81. import { knowledgeRetrieval, knowledgeRetrievalAccept } from '@/api/knowledge/retrieval';
  82. import { throttle } from '@/utils/tools';
  83. import { useThemeConfig } from '@/stores/themeConfig';
  84. import { storeToRefs } from 'pinia';
  85. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  86. const props = defineProps({
  87. type: {
  88. // 知识库类型 (中心|部门)
  89. type: String,
  90. default: '',
  91. },
  92. formData: {
  93. // 表单填写的数据
  94. type: Object,
  95. default: () => {
  96. return {};
  97. },
  98. },
  99. });
  100. const storesThemeConfig = useThemeConfig();
  101. const { themeConfig } = storeToRefs(storesThemeConfig);
  102. const state = reactive<any>({
  103. loading: false, // 知识检索加载状态
  104. knowledgeList: [],
  105. knowledgeTotal: 0,
  106. queryParams: {
  107. PageIndex: 1,
  108. PageSize: 5,
  109. Keyword: null,
  110. RetrievalType: 0, // 检索类型
  111. Attribution: '',
  112. Sort: '1',
  113. recommendType: '1',
  114. },
  115. });
  116. // 手动查询,将页码设置为1
  117. const handleQuery = () => {
  118. state.queryParams.PageIndex = 1;
  119. knowledgeRetrievalPaged();
  120. };
  121. // 知识查询
  122. const knowledgeRetrievalPaged = throttle(async () => {
  123. try {
  124. state.loading = true;
  125. let request: EmptyObjectType = {};
  126. if (state.queryParams.recommendType === '1') {
  127. //关键词
  128. request = {
  129. ...state.queryParams,
  130. Content: props.formData.content,
  131. };
  132. Reflect.deleteProperty(request, 'HotspotId');
  133. }
  134. if (state.queryParams.recommendType === '2') {
  135. //关键词
  136. request = {
  137. ...state.queryParams,
  138. HotspotId: props.formData.hotspotId,
  139. };
  140. Reflect.deleteProperty(request, 'Content');
  141. }
  142. const { result } = await knowledgeRetrievalAccept(request);
  143. state.knowledgeList = result?.items ?? [];
  144. state.knowledgeTotal = result?.total ?? 0;
  145. if (props.formData.knowledgeQuote) {
  146. for (let i of state.knowledgeList) {
  147. for (let j of props.formData.knowledgeQuote) {
  148. if (i.id === j.key) {
  149. i.isChoose = true;
  150. }
  151. }
  152. }
  153. }
  154. state.loading = false;
  155. } catch (error) {
  156. console.log(error)
  157. state.loading = false;
  158. }
  159. }, 300);
  160. const router = useRouter(); //
  161. // 预览知识
  162. const onPreview = (row: any) => {
  163. router.push({
  164. name: 'knowledgePreview',
  165. params: {
  166. id: row.id,
  167. tagsViewName: '知识查看',
  168. },
  169. });
  170. };
  171. // 提供外部查询
  172. const HotspotName = ref('');
  173. const querySearch = async (name: string) => {
  174. try {
  175. // state.queryParams.Keyword = name;
  176. HotspotName.value = name;
  177. state.loading = true;
  178. const request = {
  179. ...state.queryParams,
  180. HotspotName: name,
  181. };
  182. const res: any = await knowledgeRetrieval(request);
  183. state.knowledgeList = res.result?.items ?? [];
  184. state.knowledgeTotal = res.result?.total ?? 0;
  185. if (props.formData.knowledgeQuote) {
  186. for (let i of state.knowledgeList) {
  187. for (let j of props.formData.knowledgeQuote) {
  188. if (i.id === j.key) {
  189. i.isChoose = true;
  190. }
  191. }
  192. }
  193. }
  194. state.loading = false;
  195. } catch (error) {
  196. console.log(error)
  197. state.loading = false;
  198. }
  199. };
  200. // 切换推荐类型查询
  201. const changeRecommendType = () => {
  202. knowledgeRetrievalPaged();
  203. };
  204. const emit = defineEmits(['changeYYType']);
  205. const changeYYType = (row: any) => {
  206. row.isChoose = !row.isChoose;
  207. // 获取选中的数据
  208. const data = state.knowledgeList.filter((v: any) => v.isChoose);
  209. const reData = data.map((v: any) => {
  210. return {
  211. key: v.id,
  212. value: v.title,
  213. };
  214. });
  215. emit('changeYYType', reData);
  216. };
  217. watch(
  218. () => props.formData.hotspotId,
  219. () => {
  220. knowledgeRetrievalPaged();
  221. },
  222. { immediate: true, deep: true }
  223. );
  224. onMounted(() => {
  225. knowledgeRetrievalPaged();
  226. });
  227. defineExpose({
  228. knowledgeRetrievalPaged,
  229. querySearch,
  230. });
  231. </script>
  232. <style scoped lang="scss">
  233. .knowledge-container {
  234. position: relative;
  235. .el-radio {
  236. margin-right: 10px;
  237. line-height: 32px;
  238. }
  239. .knowledge-search-button {
  240. height: calc(100% - 6px);
  241. }
  242. .retrieval-content {
  243. &-item {
  244. border-bottom: var(--el-border);
  245. padding: 5px 15px;
  246. margin-bottom: 10px;
  247. cursor: pointer;
  248. &:last-child {
  249. margin-bottom: 0;
  250. border: none;
  251. }
  252. &:hover {
  253. color: var(--el-color-primary);
  254. }
  255. }
  256. }
  257. }
  258. </style>