index.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /**
  2. * 知识库
  3. */
  4. import { Text, View, Image, ScrollView } from "@tarojs/components";
  5. import PageCustom from "@/components/page-custom/index";
  6. import NavBarNormal from "@/components/nav-bar-normal/index";
  7. import BottomBar from "@/components/BottomBar";
  8. import FigureListItem from "@/components/list/figure-list-item";
  9. import IconEye from "@/components/icon/IconEye";
  10. import IconA from "@/components/icon/IconA";
  11. import IconQ from "@/components/icon/IconQ";
  12. import WemetaSwitch from "@/components/wemeta-switch";
  13. import { useEffect, useState } from "react";
  14. import CardEditable from "@/components/card/card-editable/index";
  15. import Taro, { useRouter, useDidShow } from "@tarojs/taro";
  16. import {
  17. getMyKnowledgeDetail,
  18. getEntKnowledgeDetail,
  19. deleteKnowledgeQa,
  20. updateExactAnswer,
  21. deleteKnowledge,
  22. shareToEnt,
  23. } from "@/service/knowledge";
  24. import { TKnowledgeDetail,TQAListItem } from "@/types/knowledge";
  25. import { isSuccess } from "@/utils";
  26. import { useModalStore } from "@/store/modalStore";
  27. import style from "./index.module.less";
  28. export default function Index() {
  29. const router = useRouter();
  30. const { knowledgeId, entId } = router.params;
  31. const [checked, setChecked] = useState(false);
  32. const [detail, setDetail] = useState<TKnowledgeDetail | null>(null);
  33. const isEnt = (entId !== undefined)
  34. const { showModal } = useModalStore();
  35. const handleEdit = (qaId: number | string) => {
  36. Taro.navigateTo({
  37. url: `/pages/knowledge-item-editor/index?knowledgeId=${knowledgeId}&qaId=${qaId}&knowledgeTitle=${detail?.title}`,
  38. });
  39. };
  40. const shareKnowledgeToEnt = async (entId: string|number) => {
  41. await shareToEnt({
  42. knowledgeIds: [knowledgeId],
  43. toEntId: entId,
  44. })
  45. }
  46. const handleShare = async () => {
  47. };
  48. // 删除问答项
  49. const handleDeleteItem = async (qaId: number | string) => {
  50. if (!detail) {
  51. return;
  52. }
  53. showModal({
  54. content: "确定删除该问答项吗?",
  55. onConfirm: async () => {
  56. const { status } = await deleteKnowledgeQa(detail.knowledgeId, qaId);
  57. if (isSuccess(status)) {
  58. Taro.showToast({ title: "删除成功", icon: "success" });
  59. getDetail(detail.knowledgeId);
  60. }
  61. },
  62. });
  63. };
  64. // 获取详情
  65. const getDetail = async (knowledgeId: number) => {
  66. const response = !isEnt ? await getMyKnowledgeDetail(knowledgeId) : await getEntKnowledgeDetail(knowledgeId, entId);
  67. if (isSuccess(response.status) && response.data) {
  68. setDetail(response.data);
  69. setChecked(response.data.enableExactAnswer);
  70. }
  71. };
  72. // 开启/关闭 精准问答模式
  73. const handleEnableExactAnswer = async () => {
  74. if (!detail?.knowledgeId) {
  75. return;
  76. }
  77. const { status } = await updateExactAnswer(detail.knowledgeId, !checked);
  78. if (isSuccess(status)) {
  79. setChecked(!checked);
  80. }
  81. };
  82. const handleDeleteKnowledge = async () => {
  83. if (!detail) {
  84. return;
  85. }
  86. showModal({
  87. content: "确定删除该问答项吗?",
  88. onConfirm: async () => {
  89. const { status } = await deleteKnowledge(detail.knowledgeId);
  90. if (isSuccess(status)) {
  91. await Taro.showToast({ title: "删除成功", icon: "success" });
  92. setTimeout(() => {
  93. Taro.navigateBack();
  94. }, 2000);
  95. }
  96. },
  97. });
  98. };
  99. useDidShow(() => {
  100. knowledgeId && getDetail(parseInt(knowledgeId));
  101. });
  102. const createCardOptions = (item: TQAListItem) => {
  103. if(isEnt){
  104. return []
  105. }
  106. return [
  107. <View onClick={() => handleDeleteItem(item.qaId)}>
  108. 删除
  109. </View>,
  110. <View onClick={() => handleEdit(item.qaId)}>编辑</View>,
  111. ]
  112. }
  113. return (
  114. <PageCustom>
  115. <NavBarNormal backText="知识库"></NavBarNormal>
  116. <View className="w-full overflow-hidden">
  117. <View className="p-16">
  118. <View className="mb-16">
  119. <FigureListItem
  120. figure={() => {
  121. return (
  122. <>
  123. {detail?.icon && (
  124. <Image
  125. src={detail?.icon}
  126. mode="widthFix"
  127. style={{ width: "36px", height: "36px" }}
  128. ></Image>
  129. )}
  130. </>
  131. );
  132. }}
  133. rightRenderer={() => (
  134. !isEnt ? <View>
  135. <IconEye />
  136. </View> : <></>
  137. )}
  138. >
  139. <View className="text-14 leading-22 truncate">
  140. {detail?.title}
  141. </View>
  142. <View className="text-12 leading-20 text-gray-45">
  143. {detail?.createTime} | {detail?.fileSizeStr}
  144. </View>
  145. </FigureListItem>
  146. </View>
  147. {!isEnt && <View className="flex rounded-12 p-16 gap-16 bg-white">
  148. <View className="flex-1">
  149. <View className="text-14 font-medium leading-22 text-black pb-2">
  150. 精准QA模式
  151. </View>
  152. <View className="text-12 leading-20 text-gray-45">
  153. 知识转问答,助力AI更高效作答
  154. </View>
  155. </View>
  156. <View className="flex-center">
  157. <WemetaSwitch
  158. checked={checked}
  159. onChange={handleEnableExactAnswer}
  160. ></WemetaSwitch>
  161. </View>
  162. </View>}
  163. </View>
  164. <View className="pb-100">
  165. <View className="rounded-container-header">
  166. <View className="text-14 font-medium leading-22 px-16 pb-16">
  167. 问答列表共
  168. <Text className="text-primary">{detail?.qaList.length}</Text>条
  169. </View>
  170. </View>
  171. <View className={isEnt ? style.scrollContainerHigher : style.scrollContainer}>
  172. {detail?.qaList.map((item) => {
  173. return (
  174. <View className="flex flex-col gap-16 px-16 mb-16">
  175. <CardEditable
  176. buttons={createCardOptions(item)}
  177. >
  178. <View className="flex items-start mb-8 gap-8">
  179. <View className="flex-center h-28">
  180. <IconQ />
  181. </View>
  182. <View className="flex-1 font-medium text-14 leading-28">
  183. {item.questions[0]}
  184. </View>
  185. </View>
  186. <View className="flex items-start gap-8">
  187. <View className="flex-center h-28">
  188. <IconA />
  189. </View>
  190. <View className="flex-1 text-12 leading-20 text-gray-45 truncate">
  191. <View className="truncate">{item.answer}</View>
  192. {!!item.links.length && (
  193. <View className="pb-12">
  194. {item.links.map((link) => {
  195. return (
  196. <View>
  197. 查看链接 <Text>{link}</Text>
  198. </View>
  199. );
  200. })}
  201. </View>
  202. )}
  203. {!!item.pics.length && (
  204. <View className="pb-12">
  205. {item.pics.map((pic) => {
  206. return (
  207. <View>
  208. <Image
  209. src={pic}
  210. mode="widthFix"
  211. className="w-full"
  212. ></Image>
  213. </View>
  214. );
  215. })}
  216. </View>
  217. )}
  218. </View>
  219. </View>
  220. </CardEditable>
  221. </View>
  222. );
  223. })}
  224. </View>
  225. {/* <View className="flex flex-col gap-16 px-16">
  226. <CardEditable buttons={[<View>删除</View>, <View onClick={handleEdit}>编辑</View>]}>
  227. <View className="flex items-start mb-8 gap-8">
  228. <View className="flex-center h-28"><IconQ/></View>
  229. <View className="flex-1 font-medium text-14 leading-28">你们医院可以做哪些近视手术?</View>
  230. </View>
  231. <View className="flex items-start gap-8">
  232. <View className="flex-center h-28"><IconA/></View>
  233. <View className="flex-1 text-12 leading-20 text-gray-45">我们医院目前开展的近视手术包括:全飞秒SMILE、半飞秒LASIK、ICL人工晶体植入术等。医生会根据您的角膜厚度、度数、眼部条件推荐最适合您的手术方式。</View>
  234. </View>
  235. </CardEditable>
  236. </View> */}
  237. </View>
  238. {!isEnt && <BottomBar>
  239. <View
  240. className="button-rounded button-plain button-warn w-88"
  241. onClick={handleDeleteKnowledge}
  242. >
  243. 删除
  244. </View>
  245. <View className="button-rounded button-primary flex-1" onClick={handleShare}>
  246. 共享到企业知识
  247. </View>
  248. </BottomBar>}
  249. </View>
  250. </PageCustom>
  251. );
  252. }