ybKnowledge.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. import { removeDuplicate } from '@/utils/arrayOperation';
  86. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  87. const props = defineProps({
  88. type: {
  89. // 知识库类型 (中心|部门)
  90. type: String,
  91. default: '',
  92. },
  93. formData: {
  94. // 表单填写的数据
  95. type: Object,
  96. default: () => {
  97. return {};
  98. },
  99. },
  100. });
  101. const storesThemeConfig = useThemeConfig();
  102. const { themeConfig } = storeToRefs(storesThemeConfig);
  103. const state = reactive<any>({
  104. loading: false, // 知识检索加载状态
  105. knowledgeList: [],
  106. knowledgeTotal: 0,
  107. queryParams: {
  108. PageIndex: 1,
  109. PageSize: 5,
  110. Keyword: null,
  111. RetrievalType: 0, // 检索类型
  112. Attribution: '',
  113. Sort: '1',
  114. recommendType: '1',
  115. },
  116. });
  117. // 手动查询,将页码设置为1
  118. const handleQuery = () => {
  119. state.queryParams.PageIndex = 1;
  120. knowledgeRetrievalPaged();
  121. };
  122. // 知识查询
  123. const knowledgeRetrievalPaged = throttle(async () => {
  124. try {
  125. state.loading = true;
  126. let request: EmptyObjectType = {};
  127. if (state.queryParams.recommendType === '1') {
  128. //关键词
  129. request = {
  130. ...state.queryParams,
  131. Content: props.formData.content,
  132. };
  133. Reflect.deleteProperty(request, 'HotspotId');
  134. }
  135. if (state.queryParams.recommendType === '2') {
  136. //关键词
  137. request = {
  138. ...state.queryParams,
  139. HotspotId: props.formData.hotspotId,
  140. };
  141. Reflect.deleteProperty(request, 'Content');
  142. }
  143. const { result } = await knowledgeRetrievalAccept(request);
  144. state.knowledgeList = result?.items ?? [];
  145. state.knowledgeTotal = result?.total ?? 0;
  146. if (props.formData.knowledgeQuote) {
  147. for (let i of state.knowledgeList) {
  148. for (let j of props.formData.knowledgeQuote) {
  149. if (i.id === j.key) {
  150. i.isChoose = true;
  151. }
  152. }
  153. }
  154. }
  155. state.loading = false;
  156. } catch (error) {
  157. console.log(error);
  158. state.loading = false;
  159. }
  160. }, 300);
  161. const router = useRouter(); //
  162. // 预览知识
  163. const onPreview = (row: any) => {
  164. router.push({
  165. name: 'knowledgePreview',
  166. params: {
  167. id: row.id,
  168. tagsViewName: '知识查看',
  169. },
  170. });
  171. };
  172. // 提供外部查询
  173. const HotspotName = ref('');
  174. const querySearch = async (name: string) => {
  175. try {
  176. // state.queryParams.Keyword = name;
  177. HotspotName.value = name;
  178. state.loading = true;
  179. const request = {
  180. ...state.queryParams,
  181. HotspotName: name,
  182. };
  183. const res: any = await knowledgeRetrieval(request);
  184. state.knowledgeList = res.result?.items ?? [];
  185. state.knowledgeTotal = res.result?.total ?? 0;
  186. if (props.formData.knowledgeQuote) {
  187. for (let i of state.knowledgeList) {
  188. for (let j of props.formData.knowledgeQuote) {
  189. if (i.id === j.key) {
  190. i.isChoose = true;
  191. }
  192. }
  193. }
  194. }
  195. state.loading = false;
  196. } catch (error) {
  197. console.log(error);
  198. state.loading = false;
  199. }
  200. };
  201. // 切换推荐类型查询
  202. const changeRecommendType = () => {
  203. knowledgeRetrievalPaged();
  204. };
  205. const emit = defineEmits(['changeYYType']);
  206. const chooseArray = ref<EmptyArrayType>([]);
  207. const changeYYType = (row: any) => {
  208. // 为了实现分页也能选中
  209. row.isChoose = !row.isChoose;
  210. if (row.isChoose) {
  211. chooseArray.value.push(row);
  212. removeDuplicate(chooseArray.value, row.id);
  213. }
  214. // 获取选中的数据
  215. const data = chooseArray.value.filter((v: any) => v.isChoose);
  216. const reData = data.map((v: any) => {
  217. return {
  218. key: v.id,
  219. value: v.title,
  220. };
  221. });
  222. console.log(reData);
  223. emit('changeYYType', reData);
  224. };
  225. watch(
  226. () => props.formData.hotspotId,
  227. () => {
  228. knowledgeRetrievalPaged();
  229. },
  230. { immediate: true, deep: true }
  231. );
  232. onMounted(() => {
  233. knowledgeRetrievalPaged();
  234. });
  235. defineExpose({
  236. knowledgeRetrievalPaged,
  237. querySearch,
  238. });
  239. </script>
  240. <style scoped lang="scss">
  241. .knowledge-container {
  242. position: relative;
  243. .el-radio {
  244. margin-right: 10px;
  245. line-height: 32px;
  246. }
  247. .knowledge-search-button {
  248. height: calc(100% - 6px);
  249. }
  250. .retrieval-content {
  251. &-item {
  252. border-bottom: var(--el-border);
  253. padding: 5px 15px;
  254. margin-bottom: 10px;
  255. cursor: pointer;
  256. &:last-child {
  257. margin-bottom: 0;
  258. border: none;
  259. }
  260. &:hover {
  261. color: var(--el-color-primary);
  262. }
  263. }
  264. }
  265. }
  266. </style>