浏览代码

fix: 生成形象未带提示文本

王晓东 1 月之前
父节点
当前提交
000dde28af
共有 37 个文件被更改,包括 447 次插入232 次删除
  1. 7 7
      README.md
  2. 11 3
      src/components/AgentPage/components/AgentSwap/index.tsx
  3. 7 3
      src/components/KnowledgeIcon/index.tsx
  4. 51 3
      src/components/chat-message/MessageRobot.tsx
  5. 4 3
      src/components/chat-message/index.tsx
  6. 1 1
      src/components/icon/IconCopy/index.tsx
  7. 7 0
      src/components/icon/IconDislike/index.tsx
  8. 7 0
      src/components/icon/IconDislikeBlue/index.tsx
  9. 7 0
      src/components/icon/IconLike/index.tsx
  10. 7 0
      src/components/icon/IconLikeBlue/index.tsx
  11. 4 3
      src/components/popup/popup/index.tsx
  12. 0 0
      src/images/svgs/IconCopy.svg
  13. 3 0
      src/images/svgs/IconDislike.svg
  14. 3 0
      src/images/svgs/IconDislikeBlue.svg
  15. 3 0
      src/images/svgs/IconLike.svg
  16. 3 0
      src/images/svgs/IconLikeBlue.svg
  17. 8 3
      src/pages/agent-avatars/index.tsx
  18. 10 9
      src/pages/agent-gen/components/step/StepConfirm.tsx
  19. 3 1
      src/pages/agent-gen/components/step/StepPick.tsx
  20. 21 14
      src/pages/agent-gen/components/step/StepStart.tsx
  21. 7 1
      src/pages/agent-gen/components/step/index.module.less
  22. 2 2
      src/pages/agent/components/AgentSetting/components/AgentCard/index.tsx
  23. 13 0
      src/pages/chat/index.module.less
  24. 88 72
      src/pages/chat/index.tsx
  25. 99 0
      src/pages/knowledge-item/components/ShareToEntPopup/index.tsx
  26. 12 38
      src/pages/knowledge-item/index.tsx
  27. 4 4
      src/pages/knowledge/components/view-style/ViewStyleChat.tsx
  28. 4 0
      src/pages/knowledge/components/view-style/ViewStyleList.tsx
  29. 3 1
      src/pages/knowledge/components/view-style/ViewStyleListEnt.tsx
  30. 11 6
      src/pages/login/index.tsx
  31. 3 23
      src/pages/voice/components/MyVoiceList/components/popup-recorder/index.module.less
  32. 3 16
      src/pages/voice/components/MyVoiceList/components/popup-recorder/index.tsx
  33. 9 8
      src/service/bot.ts
  34. 1 1
      src/service/knowledge.ts
  35. 8 4
      src/store/textChat.ts
  36. 1 1
      src/store/voiceStore.ts
  37. 12 5
      src/utils/avatar.ts

+ 7 - 7
README.md

@@ -28,11 +28,6 @@ pnpm devbuild:weapp
 pnpm build:weapp 
 pnpm build:weapp 
 ```
 ```
 
 
-
-### API 文档
-Link:  https://n25yh4s6dw.apidog.io
-Access password: 3zs5Gwlu
-
 ### Taro 
 ### Taro 
 https://taro-docs.jd.com/docs/h5
 https://taro-docs.jd.com/docs/h5
 
 
@@ -74,7 +69,7 @@ https://developers.weixin.qq.com/miniprogram/dev/component/store-product.html
 
 
 * 个人主页
 * 个人主页
 
 
-  /pages/profile/index?profileId=xxxx
+  /pages/profile/index?agentId=xxxx&shareKey=xxx
 
 
 
 
 
 
@@ -83,4 +78,9 @@ https://developers.weixin.qq.com/miniprogram/dev/component/store-product.html
 
 
 后台接口文档 https://bluebook.feishu.cn/docx/Ckh0dLOBzo0rjyxrUkrc0ffdn2c
 后台接口文档 https://bluebook.feishu.cn/docx/Ckh0dLOBzo0rjyxrUkrc0ffdn2c
 
 
-开发进度在线文档 https://www.kdocs.cn/l/cgHRgaGkRuJu
+开发进度在线文档 https://www.kdocs.cn/l/cgHRgaGkRuJu
+
+
+# bug 文档
+
+https://bluebook.feishu.cn/sheets/BW1dsW5NLhQKj7t3fnjc0xvsnpd

+ 11 - 3
src/components/AgentPage/components/AgentSwap/index.tsx

@@ -9,6 +9,7 @@ import { useAgentStore } from "@/store/agentStore";
 import { TAgent } from "@/types/agent";
 import { TAgent } from "@/types/agent";
 import Taro from "@tarojs/taro";
 import Taro from "@tarojs/taro";
 import ContactIcon from "@/components/ContactIcon";
 import ContactIcon from "@/components/ContactIcon";
+import { useEffect } from "react";
 interface IProps {
 interface IProps {
   show: boolean;
   show: boolean;
   setShow: (show: boolean) => void;
   setShow: (show: boolean) => void;
@@ -62,12 +63,15 @@ export default ({ show, setShow }: IProps) => {
     }
     }
   }
   }
 
 
+  useEffect(()=> {
+    fetchAgents()
+  }, [show])
+
   const renderCard = (item: TAgent, isEnt: boolean) => {
   const renderCard = (item: TAgent, isEnt: boolean) => {
     return (
     return (
-      <View className={item.isDefault ? style.cardActive : style.card}>
+      <View className={item.isDefault ? style.cardActive : style.card} onClick={() => handleClick(item)}>
         <View
         <View
           className="flex items-start mb-24"
           className="flex items-start mb-24"
-          onClick={() => handleClick(item)}
         >
         >
           <View className="flex flex-col flex-1">
           <View className="flex flex-col flex-1">
             <View className="flex items-end gap-8 text-gray-65">
             <View className="flex items-end gap-8 text-gray-65">
@@ -117,7 +121,11 @@ export default ({ show, setShow }: IProps) => {
           <View className="text-12 text-gray-45 leading-20 mb-24">
           <View className="text-12 text-gray-45 leading-20 mb-24">
             企业小蓝本由公司创建并授权,可引用企业知识内容
             企业小蓝本由公司创建并授权,可引用企业知识内容
           </View>
           </View>
-          <View className="text-primary font-medium leading-22">联系我们</View>
+          <View className="text-primary font-medium leading-22" onClick={() => {
+            Taro.navigateTo({
+              url: "/pages/contact-us/index",
+            });
+          }}>联系我们</View>
         </View>
         </View>
       </View>
       </View>
     );
     );

+ 7 - 3
src/components/KnowledgeIcon/index.tsx

@@ -5,9 +5,13 @@ import IconFilePDF from "@/components/icon/IconFilePDF";
 import IconFileXLSX from "@/components/icon/IconFileXLSX";
 import IconFileXLSX from "@/components/icon/IconFileXLSX";
 import { TKnowledgeItem } from "@/types/knowledge";
 import { TKnowledgeItem } from "@/types/knowledge";
 export interface Iprops {
 export interface Iprops {
-  data: TKnowledgeItem
+  data?: TKnowledgeItem | null
 }
 }
 const KnowledgeIcon = ({data}:Iprops) => {
 const KnowledgeIcon = ({data}:Iprops) => {
+  if(!data){
+    return <></>
+  }
+
   // todo: 更多类型
   // todo: 更多类型
   const renderIcon = ()=> {
   const renderIcon = ()=> {
     const type = data.type
     const type = data.type
@@ -24,8 +28,8 @@ const KnowledgeIcon = ({data}:Iprops) => {
       return <IconFileLink/>
       return <IconFileLink/>
     }
     }
 
 
-    // 默认使用 icon 字段
-    return <Image src={data.icon} mode="widthFix" style={{width: '36px', height: '36px'}}></Image>    
+    // 默认使用 doc 
+    return <IconFileTxt />
 
 
   }
   }
 
 

+ 51 - 3
src/components/chat-message/MessageRobot.tsx

@@ -1,16 +1,27 @@
 import { View, Image, Text } from "@tarojs/components";
 import { View, Image, Text } from "@tarojs/components";
 import style from './index.module.less'
 import style from './index.module.less'
-import IconCopy from "@/components/icon/icon-copy";
+import IconCopy from "@/components/icon/IconCopy";
+import IconDislike from "@/components/icon/IconDislike";
+import IconDislikeBlue from "@/components/icon/IconDislikeBlue";
+import IconLike from "@/components/icon/IconLike";
+import IconLikeBlue from "@/components/icon/IconLikeBlue";
 import IconSpeaker from "@/components/icon/icon-speaker";
 import IconSpeaker from "@/components/icon/icon-speaker";
 import { TAgentDetail } from "@/types/agent";
 import { TAgentDetail } from "@/types/agent";
 import Taro from "@tarojs/taro";
 import Taro from "@tarojs/taro";
 import ThinkAnimation from '../think-animation/index'
 import ThinkAnimation from '../think-animation/index'
+import { dislikeMessage, likeMessage } from "@/service/bot";
+import { TMessage } from "@/types/bot";
+import { getLoginId, isSuccess } from "@/utils";
+import { useState } from "react";
 interface Props {
 interface Props {
   agent?: TAgentDetail,
   agent?: TAgentDetail,
   text: string,
   text: string,
   textReasoning: string,
   textReasoning: string,
+  message: TMessage
 }
 }
-export default ({agent, text, textReasoning=''}:Props) => {
+export default ({agent, text, message, textReasoning=''}:Props) => {
+  const [isDislike, setIsDislike] = useState(message.isDislike)
+  const [isLike, setIsLike] = useState(message.isLike)
   const handleCopy = (e: any)=> {
   const handleCopy = (e: any)=> {
     e.stopPropagation();
     e.stopPropagation();
     // 手动复制并 toast 提示
     // 手动复制并 toast 提示
@@ -32,6 +43,37 @@ export default ({agent, text, textReasoning=''}:Props) => {
       })
       })
     }
     }
   }
   }
+  const loginId = getLoginId();
+  const handleDislike = async (disLike: boolean) => {
+    if(!agent?.agentId){
+      return;  
+    }
+    const response = await dislikeMessage({
+      agentId: agent?.agentId,
+      dislikeReason: '',
+      isDislike: !disLike,
+      loginId,
+      msgUk: message.msgUk
+    })
+    if(isSuccess(response.status)){
+      setIsDislike(!disLike)
+    }
+  }
+  const handleLike = async (like: boolean) => {
+    if(!agent?.agentId){
+      return;  
+    }
+    const response = await likeMessage({
+      agentId: agent?.agentId,
+      isLike: !like,
+      loginId,
+      msgUk: message.msgUk
+    })
+    if(isSuccess(response.status)){
+      setIsLike(!like)
+    }
+  }
+
   return <View>
   return <View>
       {agent && <View className="flex gap-8 mb-10">
       {agent && <View className="flex gap-8 mb-10">
         <View className={style.avatarContainer}>
         <View className={style.avatarContainer}>
@@ -59,8 +101,14 @@ export default ({agent, text, textReasoning=''}:Props) => {
           <Text>{text}</Text>
           <Text>{text}</Text>
         </View>
         </View>
         <View className="flex gap-8">
         <View className="flex gap-8">
-          <View onClick={handleCopy}><IconCopy></IconCopy></View>
+          <View onClick={handleCopy}><IconCopy /></View>
           {/* <IconSpeaker></IconSpeaker> */}
           {/* <IconSpeaker></IconSpeaker> */}
+          <View onClick={()=> handleDislike(message.isDislike)}>
+            {isDislike ? <IconDislikeBlue/> : <IconDislike/>}
+          </View>
+          <View onClick={()=> handleLike(message.isLike)}>
+            {isLike ? <IconLikeBlue/> : <IconLike/>}
+          </View>
         </View>
         </View>
     </View>
     </View>
   </View>
   </View>

+ 4 - 3
src/components/chat-message/index.tsx

@@ -1,5 +1,5 @@
 
 
-import { EChatRole, TChatRole } from "@/types/bot";
+import { EChatRole, TChatRole, TMessage } from "@/types/bot";
 import Message from "./Message";
 import Message from "./Message";
 import MessageRobot from "./MessageRobot";
 import MessageRobot from "./MessageRobot";
 import { TAgentDetail } from "@/types/agent";
 import { TAgentDetail } from "@/types/agent";
@@ -8,12 +8,13 @@ interface Props {
   role: TChatRole,
   role: TChatRole,
   text: string
   text: string
   textReasoning?: string
   textReasoning?: string
+  message: TMessage
 }
 }
-export default ({agent, text, role, textReasoning=''}:Props) => {
+export default ({agent, text, role, message, textReasoning=''}:Props) => {
   if(role === EChatRole.User ){
   if(role === EChatRole.User ){
     return <Message text={text}/>
     return <Message text={text}/>
   }
   }
-  return <MessageRobot textReasoning={textReasoning} text={text} agent={agent}/>
+  return <MessageRobot message={message} textReasoning={textReasoning} text={text} agent={agent}/>
 }
 }
 
 
 
 

+ 1 - 1
src/components/icon/icon-copy/index.tsx → src/components/icon/IconCopy/index.tsx

@@ -1,5 +1,5 @@
 import { Image } from '@tarojs/components'
 import { Image } from '@tarojs/components'
-import Icon from '@/images/svgs/icon-copy.svg'
+import Icon from '@/images/svgs/IconCopy.svg'
 export default () => {
 export default () => {
   return (
   return (
     <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
     <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>

+ 7 - 0
src/components/icon/IconDislike/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconDislike.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 7 - 0
src/components/icon/IconDislikeBlue/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconDislikeBlue.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 7 - 0
src/components/icon/IconLike/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconLike.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 7 - 0
src/components/icon/IconLikeBlue/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconLikeBlue.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 4 - 3
src/components/popup/popup/index.tsx

@@ -6,9 +6,10 @@ interface Props {
   title?: string
   title?: string
   setShow: (show: boolean)=>void
   setShow: (show: boolean)=>void
   show: boolean,
   show: boolean,
+  showCloseButton?: boolean
   children?: JSX.Element|JSX.Element[]
   children?: JSX.Element|JSX.Element[]
 }
 }
-export default ({title = '', show, setShow, children}:Props)=> {
+export default ({title = '', showCloseButton = true, show, setShow, children}:Props)=> {
   const [slideUp, setSlideUp] = useState(false)
   const [slideUp, setSlideUp] = useState(false)
   const handleClose = (b: boolean) => {
   const handleClose = (b: boolean) => {
     setSlideUp(false)
     setSlideUp(false)
@@ -33,9 +34,9 @@ export default ({title = '', show, setShow, children}:Props)=> {
       <View className={`${style.container} ${slideUp ? style.show : ''}`}>
       <View className={`${style.container} ${slideUp ? style.show : ''}`}>
         <View className={style.titleBar}>
         <View className={style.titleBar}>
           <View className={style.title}>{title}</View>
           <View className={style.title}>{title}</View>
-          <View className={style.closeButton} onClick={()=>handleClose(false)}>
+          {showCloseButton && <View className={style.closeButton} onClick={()=>handleClose(false)}>
             <Image src={closeIcon} mode="widthFix" className={style.closeIcon} />
             <Image src={closeIcon} mode="widthFix" className={style.closeIcon} />
-          </View>
+          </View>}
         </View>
         </View>
         <View className={style.content}>
         <View className={style.content}>
           {children}
           {children}

+ 0 - 0
src/images/svgs/icon-copy.svg → src/images/svgs/IconCopy.svg


+ 3 - 0
src/images/svgs/IconDislike.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.5 3.7C5.12518 3.7 3.2 5.62518 3.2 8C3.2 10.3748 5.12518 12.3 7.5 12.3H7.6656C8.58217 12.3 9.27938 13.123 9.1287 14.0271L8.79916 16.0044C8.75466 16.2713 9.05856 16.4561 9.27507 16.2937L13.48 13.14C13.6814 12.9889 13.8 12.7518 13.8 12.5V4.66667C13.8 4.13279 13.3672 3.7 12.8333 3.7H7.5ZM2 8C2 4.96243 4.46243 2.5 7.5 2.5H12.8333C14.03 2.5 15 3.47005 15 4.66667V12.5C15 13.1295 14.7036 13.7223 14.2 14.1L9.99508 17.2537C8.91248 18.0656 7.39301 17.1419 7.61548 15.8071L7.94502 13.8299C7.9738 13.6572 7.84065 13.5 7.6656 13.5H7.5C4.46243 13.5 2 11.0376 2 8ZM17.6 3.25C17.6 2.91863 17.3314 2.65 17 2.65C16.6686 2.65 16.4 2.91863 16.4 3.25V12.25C16.4 12.5814 16.6686 12.85 17 12.85C17.3314 12.85 17.6 12.5814 17.6 12.25V3.25Z" fill="black"/>
+</svg>

+ 3 - 0
src/images/svgs/IconDislikeBlue.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.5 3.7C5.12518 3.7 3.2 5.62518 3.2 8C3.2 10.3748 5.12518 12.3 7.5 12.3H7.6656C8.58217 12.3 9.27938 13.123 9.1287 14.0271L8.79916 16.0044C8.75466 16.2713 9.05856 16.4561 9.27507 16.2937L13.48 13.14C13.6814 12.9889 13.8 12.7518 13.8 12.5V4.66667C13.8 4.13279 13.3672 3.7 12.8333 3.7H7.5ZM2 8C2 4.96243 4.46243 2.5 7.5 2.5H12.8333C14.03 2.5 15 3.47005 15 4.66667V12.5C15 13.1295 14.7036 13.7223 14.2 14.1L9.99508 17.2537C8.91248 18.0656 7.39301 17.1419 7.61548 15.8071L7.94502 13.8299C7.9738 13.6572 7.84065 13.5 7.6656 13.5H7.5C4.46243 13.5 2 11.0376 2 8ZM17.6 3.25C17.6 2.91863 17.3314 2.65 17 2.65C16.6686 2.65 16.4 2.91863 16.4 3.25V12.25C16.4 12.5814 16.6686 12.85 17 12.85C17.3314 12.85 17.6 12.5814 17.6 12.25V3.25Z" fill="rgba(49, 124, 250, 1)"/>
+</svg>

+ 3 - 0
src/images/svgs/IconLike.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5 16.3C14.8748 16.3 16.8 14.3748 16.8 12C16.8 9.62518 14.8748 7.7 12.5 7.7H12.3344C11.4178 7.7 10.7206 6.87698 10.8713 5.97287L11.2008 3.99563C11.2453 3.72866 10.9414 3.54392 10.7249 3.70631L6.52 6.86C6.31855 7.01108 6.2 7.24819 6.2 7.5V15.3333C6.2 15.8672 6.63279 16.3 7.16667 16.3H12.5ZM18 12C18 15.0376 15.5376 17.5 12.5 17.5H7.16667C5.97005 17.5 5 16.53 5 15.3333V7.5C5 6.87049 5.29639 6.27771 5.8 5.9L10.0049 2.74631C11.0875 1.93436 12.607 2.85808 12.3845 4.1929L12.055 6.17015C12.0262 6.34282 12.1594 6.5 12.3344 6.5H12.5C15.5376 6.5 18 8.96243 18 12ZM2.4 16.75C2.4 17.0814 2.66863 17.35 3 17.35C3.33137 17.35 3.6 17.0814 3.6 16.75V7.75C3.6 7.41863 3.33137 7.15 3 7.15C2.66863 7.15 2.4 7.41863 2.4 7.75V16.75Z" fill="black"/>
+</svg>

+ 3 - 0
src/images/svgs/IconLikeBlue.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5 16.3C14.8748 16.3 16.8 14.3748 16.8 12C16.8 9.62518 14.8748 7.7 12.5 7.7H12.3344C11.4178 7.7 10.7206 6.87698 10.8713 5.97287L11.2008 3.99563C11.2453 3.72866 10.9414 3.54392 10.7249 3.70631L6.52 6.86C6.31855 7.01108 6.2 7.24819 6.2 7.5V15.3333C6.2 15.8672 6.63279 16.3 7.16667 16.3H12.5ZM18 12C18 15.0376 15.5376 17.5 12.5 17.5H7.16667C5.97005 17.5 5 16.53 5 15.3333V7.5C5 6.87049 5.29639 6.27771 5.8 5.9L10.0049 2.74631C11.0875 1.93436 12.607 2.85808 12.3845 4.1929L12.055 6.17015C12.0262 6.34282 12.1594 6.5 12.3344 6.5H12.5C15.5376 6.5 18 8.96243 18 12ZM2.4 16.75C2.4 17.0814 2.66863 17.35 3 17.35C3.33137 17.35 3.6 17.0814 3.6 16.75V7.75C3.6 7.41863 3.33137 7.15 3 7.15C2.66863 7.15 2.4 7.41863 2.4 7.75V16.75Z" fill="rgba(49, 124, 250, 1)"/>
+</svg>

+ 8 - 3
src/pages/agent-avatars/index.tsx

@@ -4,17 +4,19 @@ import { Image, View, ScrollView } from "@tarojs/components";
 import PageCustom from "@/components/page-custom/index";
 import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 
 
-import { uploadAndGenNewAvatar } from "@/utils/avatar";
+import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
 import { useAvatars } from "./useAvatars";
 import { useAvatars } from "./useAvatars";
 import IconPlusBig from "@/components/icon/icon-plus-big";
 import IconPlusBig from "@/components/icon/icon-plus-big";
 
 
 import { editAgentAvatar } from "@/service/agent";
 import { editAgentAvatar } from "@/service/agent";
+import { deleteAvatar } from "@/service/storage";
 
 
 import style from "./index.module.less";
 import style from "./index.module.less";
 import { TAvatarItem } from "@/service/storage";
 import { TAvatarItem } from "@/service/storage";
 import { useAgentStore } from "@/store/agentStore";
 import { useAgentStore } from "@/store/agentStore";
 import useSWRMutation from "swr/mutation";
 import useSWRMutation from "swr/mutation";
 import Taro from "@tarojs/taro";
 import Taro from "@tarojs/taro";
+import { isSuccess } from "@/utils";
 
 
 export default function Index() {
 export default function Index() {
   const { agent, fetchAgent } = useAgentStore();
   const { agent, fetchAgent } = useAgentStore();
@@ -55,7 +57,7 @@ export default function Index() {
     // }
     // }
 
 
     Taro.showLoading();
     Taro.showLoading();
-    await editAvatar({
+    const result = await editAvatar({
       agentId: agent.agentId,
       agentId: agent.agentId,
       avatarId: item.avatarId,
       avatarId: item.avatarId,
       enabledChatBg: false,
       enabledChatBg: false,
@@ -63,12 +65,15 @@ export default function Index() {
     await fetchAgent(agent.agentId)
     await fetchAgent(agent.agentId)
     Taro.hideLoading();
     Taro.hideLoading();
     setCurrent(item);
     setCurrent(item);
+    if(isSuccess(result.status)){
+      Taro.navigateBack();
+    }
   };
   };
   const onScrollToLower = () => {
   const onScrollToLower = () => {
     loadAvatars();
     loadAvatars();
   };
   };
   const handleCreate = () => {
   const handleCreate = () => {
-    uploadAndGenNewAvatar();
+    uploadAndNavToGenNewAvatar();
   };
   };
 
 
   useEffect(() => {
   useEffect(() => {

+ 10 - 9
src/pages/agent-gen/components/step/StepConfirm.tsx

@@ -12,21 +12,20 @@ interface IProps {
 }
 }
 export default React.memo(function Index({prev, pickedAvatar}:IProps) {
 export default React.memo(function Index({prev, pickedAvatar}:IProps) {
   const {agent, fetchAgent} = useAgentStore()
   const {agent, fetchAgent} = useAgentStore()
-  const [enabledChatBg, setEnabledChatBg] = useState(false)
+  const [enabledChatBg, setEnabledChatBg] = useState(true)
 
 
   const handleConfirm = async () => {
   const handleConfirm = async () => {
     if(!agent?.agentId){
     if(!agent?.agentId){
       return
       return
     }
     }
-    Taro.showLoading();
     await editAgentAvatar(
     await editAgentAvatar(
       agent.agentId,
       agent.agentId,
       pickedAvatar.avatarId,
       pickedAvatar.avatarId,
       enabledChatBg,
       enabledChatBg,
     );
     );
     await fetchAgent(agent.agentId)
     await fetchAgent(agent.agentId)
-    Taro.hideLoading();
-    Taro.navigateTo({url: '/pages/agent/index'})
+    
+    Taro.redirectTo({url: '/pages/agent/index'})
   }
   }
   return (
   return (
     <View>
     <View>
@@ -39,11 +38,13 @@ export default React.memo(function Index({prev, pickedAvatar}:IProps) {
           ></Image>
           ></Image>
         </View>
         </View>
         <View className={style.confirmChatAvatarBg}>
         <View className={style.confirmChatAvatarBg}>
-          <Image
-            mode="widthFix"
-            className="w-full"
-            src={pickedAvatar.avatarUrl}
-          ></Image>
+          <View className={style.confirmChatAvatarImage}>
+            <Image
+              mode="widthFix"
+              className="w-full"
+              src={pickedAvatar.avatarUrl}
+            ></Image>
+          </View>
           <View className={style.confirmChatAvatarBgCover}>
           <View className={style.confirmChatAvatarBgCover}>
               <View className={style.block1}></View>
               <View className={style.block1}></View>
               <View className={style.block2}></View>
               <View className={style.block2}></View>

+ 3 - 1
src/pages/agent-gen/components/step/StepPick.tsx

@@ -4,6 +4,7 @@ import style from "./index.module.less";
 import IconStarColor from "@/components/icon/icon-star-color";
 import IconStarColor from "@/components/icon/icon-star-color";
 import { getUploadedAvatarStatus, TAvatarItem } from '@/service/storage'
 import { getUploadedAvatarStatus, TAvatarItem } from '@/service/storage'
 import useSWR from 'swr';
 import useSWR from 'swr';
+import Taro from "@tarojs/taro";
 interface IProps {
 interface IProps {
   prev: () => void;
   prev: () => void;
   next: () => void;
   next: () => void;
@@ -23,9 +24,10 @@ export default React.memo(function Index({ prev, next, taskId, setPickedAvatar }
     next()
     next()
   }
   }
   
   
+  Taro.hideLoading()
 
 
   const { data } = useSWR(
   const { data } = useSWR(
-    shouldPoll ? 'getUploadedAvatarStatus' : null,
+    shouldPoll ? `getUploadedAvatarStatus${taskId}` : null,
     ()=> getUploadedAvatarStatus(taskId),
     ()=> getUploadedAvatarStatus(taskId),
     {
     {
       revalidateOnFocus: false,
       revalidateOnFocus: false,

+ 21 - 14
src/pages/agent-gen/components/step/StepStart.tsx

@@ -7,6 +7,7 @@ import WemetaTextarea from "@/components/wemeta-textarea/index";
 import Taro, { useRouter } from "@tarojs/taro";
 import Taro, { useRouter } from "@tarojs/taro";
 import { uploadAvatar } from '@/service/storage'
 import { uploadAvatar } from '@/service/storage'
 import { isSuccess } from "@/utils";
 import { isSuccess } from "@/utils";
+import { getNewAvatarPic } from "@/utils/avatar";
 interface IProps {
 interface IProps {
   next: () =>void
   next: () =>void
   setTaskId: (value:any)=> void 
   setTaskId: (value:any)=> void 
@@ -17,27 +18,33 @@ export default React.memo(function StepStart({ next, setTaskId }: IProps) {
   const router = useRouter();
   const router = useRouter();
   const { avatarUrl } = router.params
   const { avatarUrl } = router.params
   const uploadedAvatarUrl = decodeURIComponent(avatarUrl ?? '')
   const uploadedAvatarUrl = decodeURIComponent(avatarUrl ?? '')
-  const [value, setValue] = useState("职场精英,频频点头微笑,且桀骜不驯");
-  
-  console.log('StepStart render', { value });
+  const [currentAvatarUrl, setCurrentAvatarUrl] = useState(uploadedAvatarUrl)
+  const [value, setValue] = useState('');
 
 
-  useEffect(() => {
-    console.log('StepStart mounted/updated');
-  });
+  const handleChange = () => {
+    getNewAvatarPic((picUrl)=> {
+      setCurrentAvatarUrl(picUrl)
+    })
+  }
 
 
-  const handleInput = useCallback((value: string) => {
+  const handleInput = (value: string) => {
     setValue(value);
     setValue(value);
-  }, []);
+  }
 
 
-  const handleClick = useCallback(async () => {
-    if(!uploadedAvatarUrl){
+  const handleClick = async () => {
+    if(!currentAvatarUrl){
       return
       return
     }
     }
     
     
     Taro.showLoading();
     Taro.showLoading();
+    console.log({
+      aiGenerated: true,
+      avatarUrl: currentAvatarUrl,
+      description: value,
+    })
     const response = await uploadAvatar({
     const response = await uploadAvatar({
       aiGenerated: true,
       aiGenerated: true,
-      avatarUrl: uploadedAvatarUrl,
+      avatarUrl: currentAvatarUrl,
       description: value,
       description: value,
     })
     })
     Taro.hideLoading();
     Taro.hideLoading();
@@ -45,16 +52,16 @@ export default React.memo(function StepStart({ next, setTaskId }: IProps) {
       setTaskId(response.data.taskId)
       setTaskId(response.data.taskId)
       next();
       next();
     }
     }
-  }, [next]);
+  };
 
 
   return (
   return (
     <View>
     <View>
       <View className={style.startContainer}>
       <View className={style.startContainer}>
         <View className={style.startCard}>
         <View className={style.startCard}>
-          <View className={style.startIconChange}>
+          <View className={style.startIconChange} onClick={handleChange}>
             <IconChange />
             <IconChange />
           </View>
           </View>
-          <Image className={style.startCard} src={uploadedAvatarUrl} mode="widthFix"></Image>
+          <Image className={style.startCard} src={currentAvatarUrl} mode="widthFix"></Image>
         </View>
         </View>
       </View>
       </View>
       <View className="mb-24">
       <View className="mb-24">

+ 7 - 1
src/pages/agent-gen/components/step/index.module.less

@@ -145,6 +145,12 @@
   min-height: 373px;
   min-height: 373px;
   margin-bottom: 16px;
   margin-bottom: 16px;
   border-radius: 24px;
   border-radius: 24px;
+  overflow: hidden;
+}
+.confirmChatAvatarImage{
+  width: 240px;
+  min-height: 373px;
+  overflow: hidden;
 }
 }
 .confirmChatAvatarBgCover{
 .confirmChatAvatarBgCover{
   position: absolute;
   position: absolute;
@@ -153,7 +159,7 @@
   justify-content: flex-end;
   justify-content: flex-end;
   position: absolute;
   position: absolute;
   left: 0;
   left: 0;
-  top: 0;
+  bottom: 0;
   right: 0;
   right: 0;
   z-index: 1;
   z-index: 1;
   width: 240px;
   width: 240px;

+ 2 - 2
src/pages/agent/components/AgentSetting/components/AgentCard/index.tsx

@@ -2,7 +2,7 @@ import { Image, View } from "@tarojs/components";
 import style from "./index.module.less";
 import style from "./index.module.less";
 import IconPlusBig from "@/components/icon/icon-plus-big";
 import IconPlusBig from "@/components/icon/icon-plus-big";
 import Taro from "@tarojs/taro";
 import Taro from "@tarojs/taro";
-import { uploadAndGenNewAvatar } from "@/utils/avatar";
+import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
 import { useAgentStore } from "@/store/agentStore";
 import { useAgentStore } from "@/store/agentStore";
 
 
 export default () => {
 export default () => {
@@ -12,7 +12,7 @@ export default () => {
     if (agent?.avatarUrl) {
     if (agent?.avatarUrl) {
       return;
       return;
     }
     }
-    uploadAndGenNewAvatar()
+    uploadAndNavToGenNewAvatar()
     
     
   };
   };
 
 

+ 13 - 0
src/pages/chat/index.module.less

@@ -16,4 +16,17 @@
   .deepMindMark();
   .deepMindMark();
   background: rgba(#CBF706, .2);
   background: rgba(#CBF706, .2);
   color: #547500;
   color: #547500;
+}
+
+.topBg{
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  z-index: 1;
+  height: 652px;
+  width: 100%;
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: 100%;
 }
 }

+ 88 - 72
src/pages/chat/index.tsx

@@ -17,9 +17,8 @@ import PersonalCard from "./components/personal-card";
 import { useAgentStore } from "@/store/agentStore";
 import { useAgentStore } from "@/store/agentStore";
 
 
 import { useLoadMore } from "@/utils/loadMore";
 import { useLoadMore } from "@/utils/loadMore";
-import {
-  getMessageHistories,
-} from "@/service/bot";
+import { getMessageHistories } from "@/service/bot";
+import { useAppStore } from "@/store/appStore";
 
 
 // 类型谓词函数
 // 类型谓词函数
 function isRobotMessage(
 function isRobotMessage(
@@ -29,103 +28,99 @@ function isRobotMessage(
 }
 }
 
 
 export default function Index() {
 export default function Index() {
-  const router = useRouter()
-  const {agentId} = router.params
-  
-  if(!agentId){
-    return <View>没有相应的智能体</View>
-  }
-  const {fetchAgent} = useAgentStore()
-  const agent = useAgentStore((state) =>  state.agent)
+  const router = useRouter();
+  const { agentId } = router.params;
 
 
+  if (!agentId) {
+    return <View>没有相应的智能体</View>;
+  }
+  const headerHeight = useAppStore((state) => state.headerHeight);
+  const { fetchAgent } = useAgentStore();
+  const agent = useAgentStore((state) => state.agent);
 
 
   const [deepThink, setDeepThink] = useState(EAI_MODEL.DeepseekChat);
   const [deepThink, setDeepThink] = useState(EAI_MODEL.DeepseekChat);
 
 
-  const [histories, setHistories] = useState<(TMessage|TRobotMessage)[]>([]);
-  
+  const [histories, setHistories] = useState<(TMessage | TRobotMessage)[]>([]);
+
   const [keyboardHeight, setKeyboardHeight] = useState(0);
   const [keyboardHeight, setKeyboardHeight] = useState(0);
   const [contentHeight, setContentHeight] = useState(0);
   const [contentHeight, setContentHeight] = useState(0);
   const [scrollViewHeight, setScrollViewHeight] = useState(0);
   const [scrollViewHeight, setScrollViewHeight] = useState(0);
 
 
   const scrollViewRef = useRef<any>(null);
   const scrollViewRef = useRef<any>(null);
-  // const headerHeight = useAppStore((state) => state.headerHeight);
-  
+
   const messageList = useTextChat((state) => state.list);
   const messageList = useTextChat((state) => state.list);
-  const { destroy, setScrollTop  } = useTextChat();
+  const { destroy, setScrollTop, genSessionId } = useTextChat();
   const scrollTop = useTextChat((state) => state.scrollTop);
   const scrollTop = useTextChat((state) => state.scrollTop);
 
 
   const fetcher = async ([_url, nextId, page, pageSize]) => {
   const fetcher = async ([_url, nextId, page, pageSize]) => {
-    if(!agent){
-      return null
+    if (!agent) {
+      return null;
     }
     }
-    const _nextId = nextId ? decodeURIComponent(nextId) : nextId
+    const _nextId = nextId ? decodeURIComponent(nextId) : nextId;
     const res = await getMessageHistories({
     const res = await getMessageHistories({
       agentId,
       agentId,
-      startId:  _nextId,
+      startId: _nextId,
       pageSize,
       pageSize,
     });
     });
     return res.data;
     return res.data;
   };
   };
   const { data, loadMore, page } = useLoadMore<{
   const { data, loadMore, page } = useLoadMore<{
-    data?: (TMessage|TRobotMessage)[]
-    nextId?: string,
-    totalCount?: number
+    data?: (TMessage | TRobotMessage)[];
+    nextId?: string;
+    totalCount?: number;
   }>({
   }>({
-    url: '/blue-aiagent/api/v1/my/messeagehistories',
+    url: "/blue-aiagent/api/v1/my/messeagehistories",
     fetcher,
     fetcher,
   });
   });
-  
+
   const [showWelcome, setShowWelcome] = useState(!histories.length);
   const [showWelcome, setShowWelcome] = useState(!histories.length);
-  
-  
+
   //  加载更多
   //  加载更多
   const onScrollToUpper = () => {
   const onScrollToUpper = () => {
-    console.log('onscroll')
-    loadMore()
+    console.log("onscroll");
+    loadMore();
   };
   };
 
 
-  
-  useEffect(()=> {
-    agentId && fetchAgent(agentId)
-  }, [agentId])
+  useEffect(() => {
+    agentId && fetchAgent(agentId);
+  }, [agentId]);
 
 
-  useEffect(()=> {
-    setShowWelcome(!histories.length)
-  }, [histories])
+  useEffect(() => {
+    setShowWelcome(!histories.length);
+  }, [histories]);
 
 
   useEffect(() => {
   useEffect(() => {
     if (data?.data) {
     if (data?.data) {
       setHistories([...data.data.reverse(), ...histories]);
       setHistories([...data.data.reverse(), ...histories]);
-      if(page === 1){
-        setTimeout(()=> {
-          setScrollTop()
-        }, 300)
+      if (page === 1) {
+        setTimeout(() => {
+          setScrollTop();
+        }, 300);
       }
       }
     }
     }
   }, [data, page]);
   }, [data, page]);
-  
-  
+
   // 计算 marginTopOffset 偏移的距离
   // 计算 marginTopOffset 偏移的距离
   const marginTopOffset = (() => {
   const marginTopOffset = (() => {
     if (keyboardHeight <= 0) return 0;
     if (keyboardHeight <= 0) return 0;
     // 如果内容超过滚动容器,取键盘弹起高度
     // 如果内容超过滚动容器,取键盘弹起高度
-    if(contentHeight > scrollViewHeight){
-      return  -(keyboardHeight)
+    if (contentHeight > scrollViewHeight) {
+      return -keyboardHeight;
     }
     }
     // 如果内容+键盘弹起高度超过滚动容器, 则取其差值
     // 如果内容+键盘弹起高度超过滚动容器, 则取其差值
-    if( contentHeight + keyboardHeight > scrollViewHeight){ 
+    if (contentHeight + keyboardHeight > scrollViewHeight) {
       // 内容+键盘弹起高度 - 滚动容器高度
       // 内容+键盘弹起高度 - 滚动容器高度
-      return -(contentHeight + keyboardHeight - scrollViewHeight)  
+      return -(contentHeight + keyboardHeight - scrollViewHeight);
     }
     }
   })();
   })();
-  
+
   useEffect(() => {
   useEffect(() => {
     // 监听键盘高度变化
     // 监听键盘高度变化
     Taro.onKeyboardHeightChange((res) => {
     Taro.onKeyboardHeightChange((res) => {
-      if(res.height <= 0){
+      if (res.height <= 0) {
         return setKeyboardHeight(0);
         return setKeyboardHeight(0);
       }
       }
-      
+
       setKeyboardHeight(res.height - 24);
       setKeyboardHeight(res.height - 24);
     });
     });
 
 
@@ -140,22 +135,29 @@ export default function Index() {
     if (scrollViewRef.current) {
     if (scrollViewRef.current) {
       const query = Taro.createSelectorQuery();
       const query = Taro.createSelectorQuery();
       // 获取聊天内容高度
       // 获取聊天内容高度
-      query.select('#message-list').boundingClientRect((rect: any) => {
-        if (rect) {
-          setContentHeight(rect.height);
-        }
-      }).exec();
+      query
+        .select("#message-list")
+        .boundingClientRect((rect: any) => {
+          if (rect) {
+            setContentHeight(rect.height);
+          }
+        })
+        .exec();
       // 获取滚动容器高度
       // 获取滚动容器高度
-      query.select('#scroll-view').boundingClientRect((rect: any) => {
-        if (rect) {
-          setScrollViewHeight(rect.height);
-        }
-      }).exec();
+      query
+        .select("#scroll-view")
+        .boundingClientRect((rect: any) => {
+          if (rect) {
+            setScrollViewHeight(rect.height);
+          }
+        })
+        .exec();
     }
     }
   }, [messageList]);
   }, [messageList]);
 
 
-  
-  
+  useEffect(() => {
+    genSessionId();
+  }, []);
 
 
   useUnload(() => {
   useUnload(() => {
     destroy();
     destroy();
@@ -171,7 +173,10 @@ export default function Index() {
 
 
   const renderNavLeft = () => {
   const renderNavLeft = () => {
     return (
     return (
-      <View className="flex items-center gap-8" onClick={()=>Taro.navigateBack()}>
+      <View
+        className="flex items-center gap-8"
+        onClick={() => Taro.navigateBack()}
+      >
         <IconArrowLeft />
         <IconArrowLeft />
         <View className={showWelcome ? "hidden" : "block"}>
         <View className={showWelcome ? "hidden" : "block"}>
           <PersonalCard size="mini" />
           <PersonalCard size="mini" />
@@ -180,10 +185,19 @@ export default function Index() {
     );
     );
   };
   };
 
 
+  // 自定义背景样式
+  const bgImageStyle = {
+    backgroundImage: `url(${agent?.avatarUrl})`,
+  };
+
   return (
   return (
-    <PageCustom>
-      <NavBarNormal scrollFadeIn leftColumn={renderNavLeft}></NavBarNormal>
-      <View className="flex flex-col w-full h-screen" style={{marginTop: `${marginTopOffset}px`}}>
+    <PageCustom fullPage style={{ overflow: "hidden" }}>
+      <NavBarNormal leftColumn={renderNavLeft}></NavBarNormal>
+      {(!!agent?.enabledChatBg) ? <View className={style.topBg} style={bgImageStyle}></View> : <></>}
+      <View
+        className="flex flex-col w-full h-screen relative z-10"
+        style={{ marginTop: `${marginTopOffset}px` }}
+      >
         <ScrollView
         <ScrollView
           ref={scrollViewRef}
           ref={scrollViewRef}
           scrollY
           scrollY
@@ -198,7 +212,6 @@ export default function Index() {
         >
         >
           {showWelcome && <ChatWelcome />}
           {showWelcome && <ChatWelcome />}
           <View id="messageList" className="flex flex-col gap-8 px-18 pb-140">
           <View id="messageList" className="flex flex-col gap-8 px-18 pb-140">
-            
             {[...histories, ...messageList].map((message) => {
             {[...histories, ...messageList].map((message) => {
               const robotMessage = isRobotMessage(message) ? message : null;
               const robotMessage = isRobotMessage(message) ? message : null;
               return (
               return (
@@ -208,6 +221,7 @@ export default function Index() {
                   agent={agent}
                   agent={agent}
                   role={message.role}
                   role={message.role}
                   text={message.content}
                   text={message.content}
+                  message={message}
                 ></ChatMessage>
                 ></ChatMessage>
               );
               );
             })}
             })}
@@ -230,12 +244,14 @@ export default function Index() {
           >
           >
             深度思考(R1)
             深度思考(R1)
           </View>
           </View>
-          {agent && <InputBar
-            aiModel={deepThink}
-            agent={agent}
-            histories={histories}
-            setShowWelcome={setShowWelcome}
-          ></InputBar>}
+          {agent && (
+            <InputBar
+              aiModel={deepThink}
+              agent={agent}
+              histories={histories}
+              setShowWelcome={setShowWelcome}
+            ></InputBar>
+          )}
         </View>
         </View>
       </View>
       </View>
     </PageCustom>
     </PageCustom>

+ 99 - 0
src/pages/knowledge-item/components/ShareToEntPopup/index.tsx

@@ -0,0 +1,99 @@
+/**
+ * 知识库
+ */
+
+import { Text, View, Image, ScrollView } from "@tarojs/components";
+
+
+import WemetaSwitch from "@/components/wemeta-switch";
+
+import Popup from "@/components/popup/popup";
+import { useEffect, useState } from "react";
+import Taro, { useRouter, useDidShow } from "@tarojs/taro";
+import {
+  shareToEnt,
+} from "@/service/knowledge";
+import { useUserStore } from "@/store/userStore";
+import { TEntItem } from "@/types/user";
+import { isSuccess } from "@/utils";
+
+
+interface IProps {
+  knowledgeId: string|number
+  showPopup: boolean
+  setShowPopup: (show: boolean)=> void,
+}
+
+export default function Index({knowledgeId, showPopup, setShowPopup }:IProps) {
+
+  const {entList, fetchMyEntList} = useUserStore()
+  const [shareEntList, setShareEntList] = useState(entList ?? []);
+  
+  
+  const handleSwitchChange = async (ent: TEntItem, checked: boolean)=> {
+    if(!knowledgeId){
+      return false;
+    }
+    const response = await shareToEnt({
+      knowledgeIds: [knowledgeId],
+      toEntId: ent.entId,
+    })
+    if(isSuccess(response.status)){
+      Taro.showToast({title: checked ? '分享成功' : '取消分享成功'})
+      setShareEntList((prev) => {
+        if(checked){
+          return [...prev, ent]
+        }
+        return  prev.filter( item => item.entId !== ent.entId)
+      })
+    }
+  }
+
+  useDidShow(() => {
+    fetchMyEntList()
+  });
+
+  const renderContent = ()=> {
+    if(!entList.length){
+      return <View className="rounded-8 bg-gray-3 py-20 text-center">
+        <View className="leading-24 text-gray-45 font-medium text-14 mb-4">
+          暂未加入任何企业
+        </View>
+        
+        <View
+          className="text-primary"
+          onClick={() => {
+            Taro.navigateTo({
+              url: "/pages/contact-us/index",
+            });
+          }}
+        >
+          联系我们
+        </View>
+      </View>
+    }
+
+    return <View className="flex flex-col gap-12 pb-24" style={{maxHeight: '60vh', overflow: 'auto'}}>
+      {entList.map(ent=> {
+        return <View className="flex items-center rounded-8 bg-gray-3 px-16 py-24">
+            <View className="flex-1 text-black font-medium text-14 leading-22">{ent.entName}</View>
+            <WemetaSwitch
+              checked={!!shareEntList.find((item)=> item.entId === ent.entId)}
+              onChange={(checked) => handleSwitchChange(ent, checked)}
+            ></WemetaSwitch>
+        </View>
+      })}
+    </View>
+
+  }
+  
+
+  return (
+    <Popup setShow={setShowPopup} show={showPopup} title="共享至">
+      <View className="text-gray-45 leading-20 mb-16 text-12">开启后,该组织下的所有成员都可引用,可随时取消共享。</View>
+      
+      {renderContent()}
+      
+    </Popup>
+  );
+}

+ 12 - 38
src/pages/knowledge-item/index.tsx

@@ -2,7 +2,7 @@
  * 知识库
  * 知识库
  */
  */
 
 
-import { Text, View, Image, ScrollView } from "@tarojs/components";
+import { Text, View, Image } from "@tarojs/components";
 
 
 import PageCustom from "@/components/page-custom/index";
 import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
@@ -12,6 +12,8 @@ import IconEye from "@/components/icon/IconEye";
 import IconA from "@/components/icon/IconA";
 import IconA from "@/components/icon/IconA";
 import IconQ from "@/components/icon/IconQ";
 import IconQ from "@/components/icon/IconQ";
 import WemetaSwitch from "@/components/wemeta-switch";
 import WemetaSwitch from "@/components/wemeta-switch";
+import KnowledgeIcon from "@/components/KnowledgeIcon";
+import ShareToEntPopup from "./components/ShareToEntPopup";
 import { useEffect, useState } from "react";
 import { useEffect, useState } from "react";
 import CardEditable from "@/components/card/card-editable/index";
 import CardEditable from "@/components/card/card-editable/index";
 import Taro, { useRouter, useDidShow } from "@tarojs/taro";
 import Taro, { useRouter, useDidShow } from "@tarojs/taro";
@@ -21,7 +23,6 @@ import {
   deleteKnowledgeQa,
   deleteKnowledgeQa,
   updateExactAnswer,
   updateExactAnswer,
   deleteKnowledge,
   deleteKnowledge,
-  shareToEnt,
 } from "@/service/knowledge";
 } from "@/service/knowledge";
 import { TKnowledgeDetail,TQAListItem } from "@/types/knowledge";
 import { TKnowledgeDetail,TQAListItem } from "@/types/knowledge";
 import { isSuccess } from "@/utils";
 import { isSuccess } from "@/utils";
@@ -36,7 +37,7 @@ export default function Index() {
 
 
   const isEnt = (entId !== undefined)
   const isEnt = (entId !== undefined)
   const { showModal } = useModalStore();
   const { showModal } = useModalStore();
-
+  const [showPopup, setShowPopup] = useState(false);
   
   
 
 
   const handleEdit = (qaId: number | string) => {
   const handleEdit = (qaId: number | string) => {
@@ -44,16 +45,11 @@ export default function Index() {
       url: `/pages/knowledge-item-editor/index?knowledgeId=${knowledgeId}&qaId=${qaId}&knowledgeTitle=${detail?.title}`,
       url: `/pages/knowledge-item-editor/index?knowledgeId=${knowledgeId}&qaId=${qaId}&knowledgeTitle=${detail?.title}`,
     });
     });
   };
   };
-
-  const shareKnowledgeToEnt = async (entId: string|number) => {
-    await shareToEnt({
-      knowledgeIds: [knowledgeId],
-      toEntId: entId,
-    })
-  }
+  
   const handleShare = async () => {
   const handleShare = async () => {
-    
+    setShowPopup(true)
   };
   };
+  
   // 删除问答项
   // 删除问答项
   const handleDeleteItem = async (qaId: number | string) => {
   const handleDeleteItem = async (qaId: number | string) => {
     if (!detail) {
     if (!detail) {
@@ -109,8 +105,6 @@ export default function Index() {
     });
     });
   };
   };
 
 
-
-
   useDidShow(() => {
   useDidShow(() => {
     knowledgeId && getDetail(parseInt(knowledgeId));
     knowledgeId && getDetail(parseInt(knowledgeId));
   });
   });
@@ -135,17 +129,7 @@ export default function Index() {
           <View className="mb-16">
           <View className="mb-16">
             <FigureListItem
             <FigureListItem
               figure={() => {
               figure={() => {
-                return (
-                  <>
-                    {detail?.icon && (
-                      <Image
-                        src={detail?.icon}
-                        mode="widthFix"
-                        style={{ width: "36px", height: "36px" }}
-                      ></Image>
-                    )}
-                  </>
-                );
+                return <KnowledgeIcon data={detail}/>
               }}
               }}
               rightRenderer={() => (
               rightRenderer={() => (
                 !isEnt ? <View>
                 !isEnt ? <View>
@@ -243,20 +227,6 @@ export default function Index() {
               );
               );
             })}
             })}
           </View>
           </View>
-          {/* <View className="flex flex-col gap-16 px-16">
-            <CardEditable buttons={[<View>删除</View>, <View onClick={handleEdit}>编辑</View>]}>
-              <View className="flex items-start mb-8 gap-8">
-                <View className="flex-center h-28"><IconQ/></View>
-                <View className="flex-1 font-medium text-14 leading-28">你们医院可以做哪些近视手术?</View>
-              </View>
-
-              <View className="flex items-start gap-8">
-                <View className="flex-center  h-28"><IconA/></View>
-                <View className="flex-1 text-12 leading-20 text-gray-45">我们医院目前开展的近视手术包括:全飞秒SMILE、半飞秒LASIK、ICL人工晶体植入术等。医生会根据您的角膜厚度、度数、眼部条件推荐最适合您的手术方式。</View>
-              </View>
-
-            </CardEditable>
-          </View> */}
         </View>
         </View>
         {!isEnt && <BottomBar>
         {!isEnt && <BottomBar>
           <View
           <View
@@ -269,6 +239,10 @@ export default function Index() {
             共享到企业知识
             共享到企业知识
           </View>
           </View>
         </BottomBar>}
         </BottomBar>}
+        
+
+        {(knowledgeId!== undefined) && <ShareToEntPopup knowledgeId={knowledgeId} setShowPopup={setShowPopup} showPopup={showPopup}/>}
+        
       </View>
       </View>
     </PageCustom>
     </PageCustom>
   );
   );

+ 4 - 4
src/pages/knowledge/components/view-style/ViewStyleChat.tsx

@@ -37,9 +37,9 @@ const ViewStyleChat = () => {
     })
     })
   }
   }
 
 
-  useEffect(() => {
-    loadMore()
-  }, []);
+  useDidShow(()=> {
+    loadMore(true)
+  })
 
 
   return (
   return (
     <ScrollView
     <ScrollView
@@ -72,7 +72,7 @@ const ViewStyleChat = () => {
                   name: whoami?.nickName ?? ''
                   name: whoami?.nickName ?? ''
                 }}>
                 }}>
                   <View className="flex items-center gap-12">
                   <View className="flex items-center gap-12">
-                    <View className="w-36 h-36 overflow-hidden"><Image src={item.icon} mode="widthFix" style={{width: '36px', height: '36px'}}></Image></View>
+                    <View className="w-36 h-36 overflow-hidden"><KnowledgeIcon data={item} /></View>
                     <View className="flex flex-col flex-1 gap-2">
                     <View className="flex flex-col flex-1 gap-2">
                       <View className="text-14 leading-22">{item.title}</View>
                       <View className="text-14 leading-22">{item.title}</View>
                       <View className="text-12 leading-20 text-gray-45">
                       <View className="text-12 leading-20 text-gray-45">

+ 4 - 0
src/pages/knowledge/components/view-style/ViewStyleList.tsx

@@ -26,6 +26,10 @@ const Index = ({types}: IProps) => {
     loadMoreList()
     loadMoreList()
   }
   }
 
 
+  useDidShow(()=> {
+    loadMoreList(true)
+  })
+
   useEffect(()=> {
   useEffect(()=> {
     if(types){
     if(types){
       setListTypes(types)
       setListTypes(types)

+ 3 - 1
src/pages/knowledge/components/view-style/ViewStyleListEnt.tsx

@@ -21,7 +21,9 @@ const Index = ({entId}:Iprops) => {
     console.log('toUpper')
     console.log('toUpper')
     loadMoreList()
     loadMoreList()
   }
   }
-
+  useDidShow(()=> {
+    loadMoreList(true)
+  })
   useEffect(()=> {
   useEffect(()=> {
     initLoadList()
     initLoadList()
   }, [])
   }, [])

+ 11 - 6
src/pages/login/index.tsx

@@ -3,7 +3,7 @@ import { View,Text, Image, Checkbox, Button } from "@tarojs/components";
 import PageCustom from "@/components/page-custom/index";
 import PageCustom from "@/components/page-custom/index";
 import LogoImage from '@/images/logo.png'
 import LogoImage from '@/images/logo.png'
 import { useLogin } from '@/xiaolanbenlib/hooks/data/useAuth'
 import { useLogin } from '@/xiaolanbenlib/hooks/data/useAuth'
-
+import WemetaRadio from "@/components/wemeta-radio";
 
 
 import { useState } from "react";
 import { useState } from "react";
 
 
@@ -24,6 +24,11 @@ export default function Index() {
 
 
 
 
   const [showPopup, setShowPopup] = useState(true);
   const [showPopup, setShowPopup] = useState(true);
+  const [checked, setChecked] = useState(false);
+
+  const handleChecked = () => {
+    setChecked(prev => !prev)
+  }
 
 
   const renderLogo = ()=> {
   const renderLogo = ()=> {
     return <View><Image className="w-68 h-24" src={LogoImage}></Image></View>
     return <View><Image className="w-68 h-24" src={LogoImage}></Image></View>
@@ -35,11 +40,11 @@ export default function Index() {
       <NavBarNormal leftColumn={renderLogo}></NavBarNormal>
       <NavBarNormal leftColumn={renderLogo}></NavBarNormal>
       
       
         
         
-        <Popup setShow={setShowPopup} show={showPopup}>
+        <Popup setShow={setShowPopup} show={showPopup} showCloseButton={false}>
           <View className="text-24 font-medium leading-32 text-black mb-16">欢迎来到小蓝本</View>
           <View className="text-24 font-medium leading-32 text-black mb-16">欢迎来到小蓝本</View>
           <View className="text-gray-45 text-14 leading-22 mb-70">登录后享受更好的服务体验</View>
           <View className="text-gray-45 text-14 leading-22 mb-70">登录后享受更好的服务体验</View>
-          {/* <View className="button-rounded-big mb-16">微信登录</View> */}
           <Button
           <Button
+            disabled={!checked}
             className="button-rounded-big mb-16"
             className="button-rounded-big mb-16"
             style={{backgroundColor: '#317CFA', fontSize: '14px'}}
             style={{backgroundColor: '#317CFA', fontSize: '14px'}}
             type='primary'
             type='primary'
@@ -52,9 +57,9 @@ export default function Index() {
           >
           >
             手机号快捷登录
             手机号快捷登录
           </Button>
           </Button>
-          <View className="text-12 mb-86 text-center">
-            <Checkbox className="custom-checkbox" value='选中' checked color="#317CFA">选中</Checkbox>
-            同意<Text className="primary-color">《用户隐私条款》</Text><Text className="primary-color">《用户服务须知》</Text>
+          <View className="flex items-center justify-center text-12 mb-86 text-center">
+            <View className="flex-center text-gray-45 gap-8" onClick={handleChecked}><WemetaRadio checkbox checked={checked}></WemetaRadio>同意</View>
+            <Text className="primary-color">《用户隐私条款》</Text><Text className="primary-color">《用户服务须知》</Text>
           </View>
           </View>
         </Popup>
         </Popup>
     </PageCustom>
     </PageCustom>

+ 3 - 23
src/pages/voice/components/MyVoiceList/components/popup-recorder/index.module.less

@@ -63,29 +63,9 @@
 }
 }
 .actionButtonActived{
 .actionButtonActived{
   .actionButton();
   .actionButton();
-  background: var(--color-primary);
+  background: url(https://cdn.wehome.cn/cmn/gif/115/META-H8UKYHWU-E9EPKMQUBSVOJ4T4NHO63-Y5XUW92M-CI.gif) center center no-repeat;
+  background-size: 124px 27px;
+  background-color: #000;
   box-shadow: none;
   box-shadow: none;
 }
 }
 
 
-.speechButton{
-  display: flex;
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  width: 100%;
-  height: 100%;
-  justify-content: center;
-  align-items: center;
-  background-color: var(--color-bg-primary);
-  border-radius: 50px;
-  overflow: hidden;
-}
-.speechButtonActive{
-  .speechButton();
-  background-color: #000;
-}
-.speech{
-  width: 124px;
-  height: 27px;
-}

+ 3 - 16
src/pages/voice/components/MyVoiceList/components/popup-recorder/index.tsx

@@ -179,20 +179,7 @@ export default ({
     setRecording(false);
     setRecording(false);
   };
   };
 
 
-  // todo: 只能改样式,不能改 dom 否则某些手机 onTouchEnd 可能不触发
-  const renderButton = (recording: boolean) => {
-    if (recording) {
-      return (
-        <View className={popupStyle.speechButtonActive} onTouchEnd={onTouchEnd}>
-          <Image
-            src="https://cdn.wehome.cn/cmn/gif/115/META-H8UKYHWU-E9EPKMQUBSVOJ4T4NHO63-Y5XUW92M-CI.gif"
-            className={popupStyle.speech}
-          ></Image>
-        </View>
-      );
-    }
-    return <View>按住录制</View>;
-  };
+  
   useEffect(() => {
   useEffect(() => {
     if (!show) {
     if (!show) {
       return recorderManager.stop();
       return recorderManager.stop();
@@ -220,12 +207,12 @@ export default ({
             松手发送,上移取消
             松手发送,上移取消
           </View>
           </View>
           <View
           <View
-            className={popupStyle.actionButton}
+            className={recording ? popupStyle.actionButtonActived : popupStyle.actionButton}
             onLongPress={onLongPress}
             onLongPress={onLongPress}
             onTouchEnd={onTouchEnd}
             onTouchEnd={onTouchEnd}
             onTouchMove={onTouchMove}
             onTouchMove={onTouchMove}
           >
           >
-            {renderButton(recording)}
+            <View className={`${recording ? 'hidden':''}`}>按住录制</View>
           </View>
           </View>
         </View>
         </View>
       </View>
       </View>

+ 9 - 8
src/service/bot.ts

@@ -32,10 +32,11 @@ export const appendMessages = (data: TAppendMessages) => {
 
 
 // 消息差评或取消差评
 // 消息差评或取消差评
 type TDislikeMessage = {
 type TDislikeMessage = {
-  "agentId": string,
-  "dislikeReason": string,
-  "isDislike": boolean,
-  "msgUk": string
+  agentId: string,
+  dislikeReason: string,
+  isDislike: boolean,
+  msgUk: string
+  loginId: string
 }
 }
 export const dislikeMessage = (data: TDislikeMessage) => {
 export const dislikeMessage = (data: TDislikeMessage) => {
   return request.put(`${bluebookAiAgent}api/v1/chat/messages/dislike`, data)
   return request.put(`${bluebookAiAgent}api/v1/chat/messages/dislike`, data)
@@ -43,10 +44,10 @@ export const dislikeMessage = (data: TDislikeMessage) => {
 
 
 // 消息点赞或取消点赞
 // 消息点赞或取消点赞
 type TLikeMessage = {
 type TLikeMessage = {
-  "agentId": string,
-  "dislikeReason": string,
-  "isDislike": boolean,
-  "msgUk": string
+  agentId: string,
+  isLike: boolean,
+  msgUk: string
+  loginId: string
 }
 }
 export const likeMessage = (data: TLikeMessage) => {
 export const likeMessage = (data: TLikeMessage) => {
   return request.put(`${bluebookAiAgent}api/v1/chat/messages/like`, data)
   return request.put(`${bluebookAiAgent}api/v1/chat/messages/like`, data)

+ 1 - 1
src/service/knowledge.ts

@@ -63,7 +63,7 @@ export const getKnowledgeList = ({startId, pageSize = 1, types = []}: {
 // 共享我的知识库至企业
 // 共享我的知识库至企业
 export const shareToEnt = (data: 
 export const shareToEnt = (data: 
   {
   {
-    "knowledgeIds": number|string[],
+    "knowledgeIds": (number|string)[],
     "toEntId": string|number
     "toEntId": string|number
   }
   }
 ) => {
 ) => {

+ 8 - 4
src/store/textChat.ts

@@ -41,6 +41,7 @@ export interface TextChat {
   list: (TMessage | TRobotMessage)[];
   list: (TMessage | TRobotMessage)[];
   sessionId: string|null
   sessionId: string|null
   // 显示聊天历史
   // 显示聊天历史
+  genSessionId: () => void // 进入聊天界面后,本次的 sessionId
   setScrollTop: () => void
   setScrollTop: () => void
   // 将机器人气泡框推入聊天框
   // 将机器人气泡框推入聊天框
   pushRobotMessage: (message: TRobotMessageWithOptionalId) => string;
   pushRobotMessage: (message: TRobotMessageWithOptionalId) => string;
@@ -68,6 +69,12 @@ export const useTextChat = create<TextChat>((set, get) => ({
   scrollTop: 9999,
   scrollTop: 9999,
   list: [],
   list: [],
   sessionId: null,
   sessionId: null,
+  genSessionId: ()=> {
+    const sessionId = generateUUID();
+    set({
+      sessionId
+    })
+  },
   destroy: () => {
   destroy: () => {
     set({
     set({
       list: [],
       list: [],
@@ -103,12 +110,9 @@ export const useTextChat = create<TextChat>((set, get) => ({
   },
   },
   pushMessage: (content: string) => {
   pushMessage: (content: string) => {
     const msgUk = generateUk();
     const msgUk = generateUk();
-    const sessionId = generateUUID();
     const newMessage:TMessage ={ msgUk, content: content, role: EChatRole.User, saveStatus: 0 }
     const newMessage:TMessage ={ msgUk, content: content, role: EChatRole.User, saveStatus: 0 }
-    
     set((state) => {
     set((state) => {
       return {
       return {
-        sessionId,
         list: [...state.list,  newMessage],
         list: [...state.list,  newMessage],
         scrollTop: state.scrollTop + 1,
         scrollTop: state.scrollTop + 1,
       };
       };
@@ -121,7 +125,7 @@ export const useTextChat = create<TextChat>((set, get) => ({
       });
       });
     }, 100)
     }, 100)
     
     
-    return {msgUk, sessionId}
+    return {msgUk, sessionId: get().sessionId}
   },
   },
   updateMessage: (content, msgUk) => {
   updateMessage: (content, msgUk) => {
     set((state) => {
     set((state) => {

+ 1 - 1
src/store/voiceStore.ts

@@ -70,7 +70,7 @@ export const useVoiceStore = create<StorageStoreState>((set, get) => ({
     // 更新状态
     // 更新状态
     set({
     set({
       voices: response.data.data,
       voices: response.data.data,
-      myVoices: response.data.data.filter(item => !item.isSystem),
+      myVoices: response.data.data.filter(item => !item.isSystem).reverse(),
       pagination: {
       pagination: {
         ...requestParams,
         ...requestParams,
         totalCount: response.data.totalCount,
         totalCount: response.data.totalCount,

+ 12 - 5
src/utils/avatar.ts

@@ -4,8 +4,8 @@ import { EUploadFileScene } from "@/consts/enum";
 
 
 
 
 const MAX_IMAGE_SIZE = 10;
 const MAX_IMAGE_SIZE = 10;
-// 上传新形象,成功后跳转至 ai 生成页
-export const uploadAndGenNewAvatar = () => {
+
+export const getNewAvatarPic = (cb: (result: string)=> void)=> {
   Taro.chooseMedia({
   Taro.chooseMedia({
     count: 1,
     count: 1,
     mediaType: ["image"],
     mediaType: ["image"],
@@ -30,12 +30,19 @@ export const uploadAndGenNewAvatar = () => {
           const response = await uploadImage(path, EUploadFileScene.AVATAR);
           const response = await uploadImage(path, EUploadFileScene.AVATAR);
           Taro.hideLoading();
           Taro.hideLoading();
           if (response?.publicUrl) {
           if (response?.publicUrl) {
-            Taro.navigateTo({
-              url: `/pages/agent-gen/index?avatarUrl=${response?.publicUrl}`,
-            });
+            cb(response?.publicUrl)
           }
           }
         },
         },
       });
       });
     },
     },
   });
   });
+}
+
+// 上传新形象,成功后跳转至 ai 生成页
+export const uploadAndNavToGenNewAvatar = () => {
+  getNewAvatarPic((picUrl)=> {
+    Taro.navigateTo({
+      url: `/pages/agent-gen/index?avatarUrl=${picUrl}`,
+    });
+  })
 };
 };