王晓东 1 місяць тому
батько
коміт
65b5e7bce4

+ 1 - 0
src/app.less

@@ -160,6 +160,7 @@
 .social-media-icon{
   width: 24px;
   height: 24px;
+  flex-shrink: 0;
   background-size: 100%;
 }
 .social-media-link{

+ 5 - 0
src/components/AgentPage/index.tsx

@@ -7,6 +7,7 @@ import { useAgentStore } from "@/store/agentStore";
 import { useEffect, useState } from "react";
 import { useComponentStore } from "@/store/componentStore";
 import ComponentList from "@/components/component-list";
+import { useUserStore } from "@/store/userStore";
 
 
 interface IProps {
@@ -14,6 +15,7 @@ interface IProps {
 }
 export default function Index({ agentId }: IProps) {
   const { fetchAgent } = useAgentStore();
+  const { fetchMyEntList } = useUserStore();
   
   const { setComponentList } = useComponentStore()
   const components = useComponentStore((state) => state.components);
@@ -34,6 +36,9 @@ export default function Index({ agentId }: IProps) {
     }
   }, [agentId]);
 
+  useEffect(()=> {
+    fetchMyEntList()
+  }, [])
   
 
   return (

+ 111 - 0
src/components/KnowledgeList/index.tsx

@@ -0,0 +1,111 @@
+import { ScrollView, View, Image } from "@tarojs/components";
+
+import FigureList from "@/components/list/figure-list";
+import FigureListItem from "@/components/list/figure-list-item";
+import { useEffect } from "react";
+import WemetaRadio from "@/components/wemeta-radio/index";
+
+import IconFIleLink from "@/components/icon/IconFIleLink"
+
+import { useKnowledge } from "./knowledge";
+import type { TKnowledgeItem } from "@/types/knowledge";
+import { EKnowlegeTypes } from "@/consts/enum";
+export interface IProps {
+  multi?: boolean; // 是否多选
+  types?: EKnowlegeTypes[]; // 列表类型
+  entId?: string|number;// 企业id
+  onChange: (value: TKnowledgeItem[]) => void 
+}
+const Index = ({ types, multi,  entId, onChange }: IProps) => {
+  const {
+    list,
+    scrollTop,
+    checkedValue,
+    loadMore,
+    initLoad,
+    setCheckedValue,
+  } = useKnowledge({ types: types, entId });
+
+  const onScrollToLower = async () => {
+    loadMore();
+  };
+
+  useEffect(() => {
+    initLoad();
+  }, [])
+
+  const handleClick = (item: TKnowledgeItem) => {
+    let results:TKnowledgeItem[] = [];
+    // 单选
+    if(!multi){
+      const found = checkedValue.find( _item => _item.knowledgeId === item.knowledgeId)
+      if(found){
+        setCheckedValue(results)
+        onChange(results)
+        return;
+      }  
+      results = [item]
+      setCheckedValue(results)
+      onChange(results)
+      return;
+    }
+
+    // 多选
+    const found = checkedValue.find( _item => _item.knowledgeId === item.knowledgeId)
+    if(found){
+      results = checkedValue.filter(_item => _item.knowledgeId != item.knowledgeId)
+      setCheckedValue(results)
+      onChange(results)
+      return;
+    }
+    results = [...checkedValue, item]
+    setCheckedValue(results)
+    onChange(results)
+  };
+  const rightRenderer = (item: TKnowledgeItem) => {
+    
+    return (
+      <View className="flex items-center">
+        <WemetaRadio
+          checkbox
+          checked={!!checkedValue.find(_item =>  _item.knowledgeId === item.knowledgeId)}
+        ></WemetaRadio>
+      </View>
+    );
+  };
+
+  return (
+    <ScrollView
+      scrollY
+      onScrollToLower={onScrollToLower}
+      scrollTop={scrollTop}
+      style={{
+        flex: 1,
+        height: "100%", // 高度自适应
+      }}
+    >
+      <FigureList>
+        {list.map((item) => {
+          return (
+            <FigureListItem
+              figure={()=> <IconFIleLink />}
+              underline
+              onClick={() => handleClick(item)}
+              rightRenderer={() => rightRenderer(item)}
+            >
+              <View className="flex flex-col flex-1 gap-2 w-full overflow-hidden">
+                <View className="text-14 leading-22 truncate">{item.title}</View>
+                <View className="text-12 leading-20 text-gray-45">
+                
+                  {item.createTime} | {item.fileSizeStr}
+                </View>
+              </View>
+            </FigureListItem>
+          );
+        })}
+      </FigureList>
+    </ScrollView>
+  );
+};
+
+export default Index;

+ 92 - 0
src/components/KnowledgeList/knowledge.ts

@@ -0,0 +1,92 @@
+import { useState, useCallback } from "react";
+import { isSuccess } from "@/utils";
+import type { TKnowledgeItem } from "@/types/knowledge";
+import {
+  getEntKnowledgeList,
+  getKnowledgeList,
+} from "@/service/knowledge";
+import { EKnowlegeTypes } from "@/consts/enum";
+
+export interface UseKnowledgeHook {
+  scrollTop: number;
+  totalCount: number;
+  list: TKnowledgeItem[];
+  isLoading: boolean;
+  startId?: string;
+  checkedValue: TKnowledgeItem[],
+  listTypes?: EKnowlegeTypes[];
+  loadMore: (force?: boolean) => Promise<void>;
+  initLoad: () => Promise<void>;
+  setListTypes: (types: EKnowlegeTypes[]) => void;
+  setCheckedValue: React.Dispatch<React.SetStateAction<TKnowledgeItem[]>>;
+}
+
+export function useKnowledge({entId, types = []}: {entId?: string|number, types?: EKnowlegeTypes[]}): UseKnowledgeHook {
+  const req = entId ? getEntKnowledgeList : getKnowledgeList
+  const [scrollTop, setScrollTop] = useState(9999);
+  const [totalCount, setTotalCount] = useState(10000);
+  const [list, setList] = useState<TKnowledgeItem[]>([]);
+  const [isLoading, setIsLoading] = useState(false);
+  const [startId, setStartId] = useState<string | undefined>(undefined);
+  const [listTypes, setListTypesState] = useState<EKnowlegeTypes[]>(types);
+  const [checkedValue, setCheckedValue] = useState<TKnowledgeItem[]>([]);
+
+  const loadMore = useCallback(async (force?: boolean) => {
+    if (!force && (list.length >= totalCount || isLoading)) {
+      return;
+    }
+    setIsLoading(true);
+    try {
+      const params = entId ? ({
+        startId,
+        pageSize: 10,
+        types: listTypes,
+        entId: entId,
+      }) : ({
+        startId,
+        pageSize: 10,
+        types: listTypes,
+      })
+      const response = await req(params);
+      const result = isSuccess(response.status);
+      if (result) {
+        // 提取所有 TKnowledgeItem
+        const newData = [...list, ...response.data.data ?? []];
+        setList(newData);
+        setStartId(response.data.nextId);
+        setTotalCount(response.data.totalCount ?? 0);
+      }
+    } finally {
+      setIsLoading(false);
+      setScrollTop((prev) => prev + 1);
+    }
+  }, [list, totalCount, isLoading, startId]);
+
+  const initLoad = useCallback(async () => {
+    setList([]);
+    setStartId(undefined);
+    setTotalCount(9999);
+    setIsLoading(false);
+    // eslint-disable-next-line no-console
+    console.log("initLoad");
+    await loadMore();
+  }, [loadMore]);
+
+  const setListTypes = useCallback((types: EKnowlegeTypes[]) => {
+    setListTypesState(types);
+  }, []);
+
+  return {
+    scrollTop,
+    totalCount,
+    list,
+    isLoading,
+    startId,
+    listTypes,
+    checkedValue,
+    loadMore,
+    initLoad,
+    setListTypes,
+    setCheckedValue,
+  };
+}

+ 1 - 1
src/components/icon/IconFIleLink/index.tsx

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

+ 3 - 0
src/pages/agent/index.tsx

@@ -9,12 +9,14 @@ import { useAgentStore } from "@/store/agentStore";
 import { useEffect, useState } from "react";
 import { useRouter } from "@tarojs/taro";
 import { useComponentStore } from "@/store/componentStore";
+import { useUserStore } from "@/store/userStore";
 
 export default function Index() {
   const [tabIndex, setTabIndex] = useState("2");
   const router = useRouter();
   const agentId = router.params.agentId;
   const { fetchAgent } = useAgentStore();
+  const { fetchMyEntList } = useUserStore();
   const { setComponentList } = useComponentStore();
   const handleTabIndexChange = (index: string) => {
     setTabIndex(index);
@@ -27,6 +29,7 @@ export default function Index() {
       // 过滤掉没有 id 的组件防止有错误数据
       setComponentList(components.filter(c => !!c.data?.id), agentId);
     }
+    fetchMyEntList()
   };
 
   const tabList = [

+ 35 - 41
src/pages/contact-us/index.tsx

@@ -6,12 +6,15 @@ import NavBarNormal from "@/components/nav-bar-normal/index";
 import WemetaInput from "@/components/wemeta-input/index";
 import WemetaTextarea from "@/components/wemeta-textarea";
 import FormItem from '@/components/form/FormItem'
-import Taro, { useUnload } from "@tarojs/taro";
-import { useCharacterStore } from "@/store/characterStore";
-import { useComponentStore } from "@/store/componentStore";
+
 import  PickerSingleColumn from "@/components/Picker/PickerSingleColumn";
 import IconArrowDownRounded from '@/components/icon/IconArrowDownRounded';
 
+import { saveMyContact } from '@/service/user'
+import BottomBar from "@/components/BottomBar";
+import { isSuccess } from "@/utils";
+import Taro from "@tarojs/taro";
+
 export default function Index() {
 
   
@@ -28,9 +31,11 @@ export default function Index() {
   }
 
   const [value, setValue] = useState({
-    job: "",
-    department: "",
-    company: "",
+    entName: "",
+    mobileOrWechat: "",
+    name: "",
+    position: selected,
+    reqDetail: ""
   });
 
   const onChange = (key: string, v: string) => {
@@ -40,30 +45,16 @@ export default function Index() {
     });
   };
 
-  const handleSave = async () => {
-    if (
-      !value.job?.length &&
-      !value.department?.length &&
-      !value.company?.length
-    ) {
-      return;
+  const handleSubmit = async () => {
+    const result = await saveMyContact(value);
+    if(isSuccess(result.status)){
+      Taro.showToast({
+        title: '提交成功'
+      })
+      setTimeout(()=> {
+        Taro.navigateBack()
+      }, 2000)
     }
-    
-    // const c = {
-    //   data: {
-    //     job: value.job,
-    //     department: value.department,
-    //     company: value.company,
-    //   },
-    //   enabled: currentComponent?.enabled ?? true,
-    //   id: currentComponent?.id,
-    //   name: currentComponent?.name ?? "商务名片",
-    //   characterProfileId:
-    //     currentComponent?.characterProfileId ?? character?.profileId,
-    //   type: "businessCard",
-    // };
-
-    // await saveComponent(c);
   };
 
   
@@ -76,22 +67,22 @@ export default function Index() {
       <View className="flex flex-col items-center w-full gap-16 p-16 pb-140">
         <FormItem labelText="您的姓名" required>
           <WemetaInput
-              value={value.job}
-              onInput={(value: string) => onChange("job", value)}
+              value={value.name}
+              onInput={(value: string) => onChange("name", value)}
               placeholder="请输入"
             />
         </FormItem>
         <FormItem labelText="联系方式" required>
           <WemetaInput
-              value={value.job}
-              onInput={(value: string) => onChange("job", value)}
+              value={value.mobileOrWechat}
+              onInput={(value: string) => onChange("mobileOrWechat", value)}
               placeholder="请输入您的手机号/微信号"
             />
         </FormItem>
         <FormItem labelText="公司信息" required>
           <WemetaInput
-              value={value.job}
-              onInput={(value: string) => onChange("job", value)}
+              value={value.entName}
+              onInput={(value: string) => onChange("entName", value)}
               placeholder="请输入公司名称"
             />
         </FormItem>
@@ -107,18 +98,21 @@ export default function Index() {
         </FormItem>
         <FormItem labelText="需求详情">
           <WemetaTextarea
-            value={value.job}
-            onInput={(value: string) => onChange("job", value)}
+            value={value.reqDetail}
+            onInput={(value: string) => onChange("reqDetail", value)}
             placeholder="请输入"
           />
         </FormItem>
 
       </View>
-      <View className="bottom-bar">
-        <View className="pt-12 px-20">
-          <View className={`button-rounded button-primary`}>保存</View>
+      <BottomBar>
+        <View
+          className="button-rounded button-primary w-full"
+          onClick={handleSubmit}
+        >
+          提 交
         </View>
-      </View>
+      </BottomBar>
     </PageCustom>
   );
 }

+ 0 - 54
src/pages/editor-pages/editor-link/components/LinkPicker/LinkPicker.tsx

@@ -1,54 +0,0 @@
-import { useEffect, useState } from "react";
-import { View, Text, Image } from "@tarojs/components";
-import style from './index.module.less'
-import Popup from "@/components/popup/popup";
-import WemetaTabs from "@/components/wemeta-tabs/index";
-import ViewStyleList from '@/pages/knowledge/components/view-style/ViewStyleList'
-import { EKnowlegeTypes } from "@/consts/enum";
-
-export interface IProps {
-  show: boolean
-  setShow: (show: boolean) => void
-}
-export default function Index({show, setShow}: IProps) {
-
-  
-  
-  useEffect(()=> {
-
-  }, [])
-
-
-  const tabList = [
-    {
-      key: "1",
-      label: "个人",
-      children: (
-        <>
-          <View className={style.tabContainer}>
-            <ViewStyleList types={[EKnowlegeTypes.web]}></ViewStyleList>
-          </View>
-        </>
-      ),
-    },
-    {
-      key: "2",
-      label: "企业",
-      children: (
-        <>
-          <View className="pt-12">
-            <View className={style.tabContainer}>
-              ent
-            </View>
-          </View>
-        </>
-      ),
-    },
-  ];
-
-  return (
-    <Popup setShow={setShow} show={show} title="知识库-链接">
-      <WemetaTabs current="1" list={tabList}></WemetaTabs>
-    </Popup>
-  );
-}

+ 13 - 1
src/pages/editor-pages/editor-link/components/LinkPicker/index.module.less

@@ -1,3 +1,15 @@
 .tabContainer{
-  height: 200px;
+  padding-top: 16px;
+  height: 60vh;
+  margin-bottom: 100px;
+}
+.dataEmpty{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  border-radius: 12px;
+  height: 480px;
+  background-color: rgba(#000, 0.03);
 }

+ 173 - 0
src/pages/editor-pages/editor-link/components/LinkPicker/index.tsx

@@ -0,0 +1,173 @@
+import { useEffect, useState } from "react";
+import { View, Text, Image } from "@tarojs/components";
+import style from "./index.module.less";
+import Popup from "@/components/popup/popup";
+import WemetaTabs from "@/components/wemeta-tabs/index";
+import KnowledgeList from "@/components/KnowledgeList";
+import { EKnowlegeTypes } from "@/consts/enum";
+import BottomBar from "@/components/BottomBar";
+import PickerSingleColumn from "@/components/Picker/PickerSingleColumn";
+
+import IconArrowDownRounded from "@/components/icon/IconArrowDownRounded";
+import Taro from "@tarojs/taro";
+import { useUserStore } from "@/store/userStore";
+import { TKnowledgeItem } from "@/types/knowledge";
+export interface IProps {
+  show: boolean;
+  multi?: boolean; // 是否多选
+  types?: EKnowlegeTypes[]; // 列表类型
+  setShow: (show: boolean) => void;
+  onPicked: (picked?: TKnowledgeItem[]) => void
+}
+type TEnt = { entId: string | number; entName: string };
+export default function Index({ show, setShow, multi, types, onPicked }: IProps) {
+  const entList = useUserStore((state) => state.entList);
+  const [ent, setEnt] = useState<TEnt>();
+  const [picked, setPicked] = useState<TKnowledgeItem[]>();
+
+  
+
+  // 如果没有当前企业,则默认第一个
+  if (!ent) {
+    setEnt(entList[0]);
+  }
+
+  // 当前选中的值
+  const options = entList.map((item) => item.entName);
+  // 是否显示选择器
+  const [showPicker, setShowPicker] = useState(false);
+
+  // 当前选中的值
+  const [selected, setSelected] = useState(options[0]);
+
+  const handleChange = (value: string) => {
+    setSelected(value);
+    const ent = entList.find((item) => item.entName === value);
+    if (ent) {
+      setEnt(ent);
+    }
+  };
+
+  const handleOnChange = (picked: TKnowledgeItem[]) => {
+    setPicked(picked)
+  };
+
+  const handleSubmit = () => {
+    console.log(picked)
+    // onPicked(picked)
+    // setShow(false)
+  };
+
+  const renderEntContent = () => {
+    if (!entList.length) {
+      return (
+        <View className={style.dataEmpty}>
+          {/* <Image
+                showMenuByLongpress
+                src="https://nexthuman.cn/api-web/img/wechat.9d5eaf4d.jpg"
+                style={{ width: "160px", height: "160px" }}
+              /> */}
+          <View className="pt-20 text-center">
+            <View className="leading-24 text-black font-medium text-16 mb-4">
+              你还没有加入任何企业
+            </View>
+            <View className="leading-20 text-gray-45 mb-12">
+              访问公司统一知识内容,提升回复效率与专业度
+            </View>
+            <View
+              className="text-primary"
+              onClick={() => {
+                Taro.navigateTo({
+                  url: "/pages/contact-us/index",
+                });
+              }}
+            >
+              联系我们
+            </View>
+          </View>
+        </View>
+      );
+    }
+
+    return (
+      <View>
+        <PickerSingleColumn
+          options={options}
+          selected={selected}
+          onChange={handleChange}
+          showPicker={showPicker}
+          setShowPicker={setShowPicker}
+        >
+          <View
+            className="flex items-center gap-2 bg-gray-3 rounded-12 p-12 mb-16"
+            onClick={() => setShowPicker(true)}
+          >
+            <View className="flex-1 text-14 leading-22 text-gray-45">
+              {selected}
+            </View>
+            <View className="flex-center">
+              <IconArrowDownRounded />
+            </View>
+          </View>
+        </PickerSingleColumn>
+        <KnowledgeList
+          multi={multi}
+          entId={ent?.entId}
+          types={types}
+          onChange={handleOnChange}
+        ></KnowledgeList>
+      </View>
+    );
+  };
+
+  const tabList = [
+    {
+      key: "1",
+      label: "个人",
+      children: (
+        <View className={style.tabContainer}>
+          {/* <View className={style.dataEmpty}>
+            <Image
+              showMenuByLongpress
+              src="https://nexthuman.cn/api-web/img/wechat.9d5eaf4d.jpg"
+              style={{ width: "160px", height: "160px" }}
+            />
+            <View className="pt-10 text-center">
+              <View>添加小蓝本文档助手的企业微信</View>
+              <View>随时随地上传文档</View>
+            </View>
+          </View> */}
+
+          <KnowledgeList
+            multi={multi}
+            types={types}
+            onChange={handleOnChange}
+          ></KnowledgeList>
+        </View>
+      ),
+    },
+    {
+      key: "2",
+      label: "企业",
+      children: (
+        <>
+          <View className={style.tabContainer}>{renderEntContent()}</View>
+        </>
+      ),
+    },
+  ];
+
+  return (
+    <Popup setShow={setShow} show={show} title="知识库-链接">
+      <WemetaTabs current="1" list={tabList}></WemetaTabs>
+      <BottomBar>
+        <View
+          className="button-rounded button-primary flex-1"
+          onClick={handleSubmit}
+        >
+          引用
+        </View>
+      </BottomBar>
+    </Popup>
+  );
+}

+ 18 - 5
src/pages/editor-pages/editor-link/index.tsx

@@ -5,16 +5,16 @@ import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 import WemetaTextarea from "@/components/wemeta-textarea/index";
 import WemetaInput from "@/components/wemeta-input/index";
-import Popup from "@/components/popup/popup";
-import WemetaTabs from "@/components/wemeta-tabs/index";
+
 import editorStyle from "../editor.module.less";
 import style from "./index.module.less";
 
 import BottomBar from "@/components/BottomBar";
-import LinkPick from './components/LinkPicker/LinkPicker'
+import LinkPick from './components/LinkPicker'
 import { useComponentStore } from "@/store/componentStore";
 import { uploadImage } from "@/utils/http";
-import { EComponentType } from "@/consts/enum";
+import { EComponentType, EKnowlegeTypes } from "@/consts/enum";
+import { TKnowledgeItem } from "@/types/knowledge";
 export default function Index() {
 
   let currentComponent = useComponentStore((state) => state.currentComponent);
@@ -74,10 +74,22 @@ export default function Index() {
     });
   };
 
+  const onPicked = (pickedArr?: TKnowledgeItem[]) => {
+    const picked = pickedArr?.[0]
+    if(picked){
+      setLinkValue(picked.linkUrl)
+      setLinkText(picked.title)
+      if(picked.picUrl){
+        setLinkPoster(picked.picUrl)
+      }
+    }
+  }
+
   const showKnowlegePopup = ()=> {
     setShowPopup(true)
   }
 
+
   const renderPoster = (src?: string) => {
     if (src) {
       return (
@@ -155,7 +167,8 @@ export default function Index() {
           <View className="button-rounded button-primary flex-1" onClick={handleSubmit}>保存</View>
         </BottomBar>
       </View>
-      <LinkPick setShow={setShowPopup} show={showPopup}></LinkPick>
+      
+      <LinkPick types={[EKnowlegeTypes.web]} onPicked={onPicked} setShow={setShowPopup} show={showPopup}></LinkPick>
       
     </PageCustom>
   );

+ 29 - 40
src/pages/editor-pages/editor-media/index.tsx

@@ -4,18 +4,18 @@ import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 import EmptyData from "@/components/empty-data/index";
 
-import editorStyle from "../editor.module.less";
-import style from "./index.module.less";
-
-import ButtonCardAdd from "@/components/button-card-add/index";
-import MediaItem from "@/components/media-item/index";
+import LinkPick from '../editor-link/components/LinkPicker'
 import Taro, { useUnload } from "@tarojs/taro";
 import { uploadImage } from "@/utils/http";
 import { useComponentStore } from "@/store/componentStore";
 
 import type { TMediaType } from "@/types/index";
-import { EComponentType } from "@/consts/enum";
+import { EComponentType, EKnowlegeTypes } from "@/consts/enum";
+
+import UploaderGrid from '@/components/UploaderGrid'
 import BottomBar from "@/components/BottomBar";
+import { TKnowledgeItem } from "@/types/knowledge";
+
 
 interface Props {
   editMode?: boolean;
@@ -57,7 +57,7 @@ export default function Index({ editMode }: Props) {
   };
 
   let isUploading = false;
-  const handleClick = () => {
+  const handleChooseMedia = () => {
     Taro.chooseMedia({
       count: 9,
       mediaType: ["image", "video"],
@@ -99,39 +99,30 @@ export default function Index({ editMode }: Props) {
     });
   };
 
-  const handleDelete = (current: TMediaType) => {
+  const handleDeleteMedia = (index: number, current: TMediaType) => {
     const results = mediaValue.filter((item) => item.url !== current.url);
     setMediaValue([...results]);
   };
+  const [showPopup, setShowPopup] = useState(false);
 
+  const showKnowlegePopup = ()=> {
+    setShowPopup(true)
+  }
   
-
-  
-
-  const renderList = () => {
-    if (mediaValue.length) {
-      return (
-        <View className="grid grid-cols-3 gap-x-8 gap-y-12 justify-center">
-          {mediaValue.map((item) => {
-            return (
-              <View className="flex">
-                <View className={style.imageItem}>
-                  <MediaItem media={item}></MediaItem>
-                  <View
-                    className="iconfont icon-icon_20_delet icon-24 absolute right-8 top-10 text-white"
-                    onClick={() => handleDelete(item)}
-                  ></View>
-                </View>
-              </View>
-            );
-          })}
-        </View>
-      );
+  const onPicked = (picked?: TKnowledgeItem[]) => {
+    if(picked){
+      const r = picked.map( item => {
+        return {
+          size: item.fileSize,
+          url: item.picUrl,
+          fileType: item.type,
+        }
+      })
+      if(r.length){
+        setMediaValue([...mediaValue, ...r])
+      }
     }
-    return <EmptyData></EmptyData>;
-  };
-
-  
+  }
 
   return (
     <PageCustom isflex={false} bgColor="global-light-green-bg">
@@ -139,14 +130,12 @@ export default function Index({ editMode }: Props) {
       >
         图片/视频
       </NavBarNormal>
-
+    
       <View className="flex flex-col w-full px-16 pt-12 gap-12">
-        <ButtonCardAdd
-          text="导入图片/视频"
-          onClick={handleClick}
-        ></ButtonCardAdd>
-        {renderList()}
+        <View className="text-primary" onClick={showKnowlegePopup}>知识库导入</View>
+        <UploaderGrid onNewUpload={handleChooseMedia}  list = {mediaValue} onChange={()=> {}} onDelete={handleDeleteMedia} />
       </View>
+      <LinkPick types={[EKnowlegeTypes.image]} multi onPicked={onPicked} setShow={setShowPopup} show={showPopup}></LinkPick>
       <BottomBar>
           <View className="button-rounded button-primary flex-1" onClick={handleSubmit}>保存</View>
         </BottomBar>

+ 2 - 3
src/pages/knowledge/components/CompanyTab/index.tsx

@@ -15,14 +15,13 @@ import ViewStyleListEnt from '../view-style/ViewStyleListEnt'
 
 import  PickerSingleColumn from "@/components/Picker/PickerSingleColumn";
 import IconArrowDownRounded from '@/components/icon/IconArrowDownRounded';
-import { useAgentStore } from "@/store/agentStore";
 import { useKnowledgeEntStore } from "@/store/knowledgeEnt";
+import { useUserStore } from "@/store/userStore";
 
 type TListStyle = "chat" | "list";
 
 const Index = () => {
-  const agents = useAgentStore(state => state.agents)
-  const ents = useAgentStore(state => state.ents)
+  const ents = useUserStore(state => state.entList)
   const [checked, setChecked] = useState(false);
   const [showPopup, setShowPopup] = useState(false);
   const [listStyle, setListStyle] = useState<TListStyle>("chat");

+ 5 - 4
src/service/knowledge.ts

@@ -56,14 +56,14 @@ export const getKnowledgeList = ({startId, pageSize = 1, types = []}: {
 }) => {
   return request.get<TKnowledgeListResponse>(
     `${bluebookAiAgent}api/v1/my/knowledge/list`,
-    { params: {startId, pageSize, types} }
+    { params: {startId, pageSize, types: types.join(',')} }
   );
 };
 
 // 共享我的知识库至企业
 export const shareToEnt = (data: 
   {
-    "knowledgeIds": numbe|string[],
+    "knowledgeIds": number|string[],
     "toEntId": string|number
   }
 ) => {
@@ -120,14 +120,15 @@ export const updateKnowledgeQa = (knowledgeId: number|string, qaId: number|strin
 
 
 // 企业知识库--列表
-export const getEntKnowledgeList = (data: {
+export const getEntKnowledgeList = ({startId, entId, pageSize, types = []}: {
   entId: string|number;
   startId?: string;
+  types?: EKnowlegeTypes[]
   pageSize: number;
 }) => {
   return request.get<TKnowledgeListResponse>(
     `${bluebookAiAgent}api/v1/ent/knowledge/list`,
-    { params: data }
+    { params: {startId, entId, pageSize, types: types.join(',')}}
   );
 };
 // 获取指定知识库项的详情信息

+ 15 - 4
src/store/userStore.ts

@@ -1,17 +1,28 @@
 import { create } from 'zustand'
-import { getMyInfo as _getMyInfo } from '@/service/user'
-import { TUserInfo } from '@/types/user'
+import { getMyInfo as _getMyInfo, getMyEntList as _getMyEntList } from '@/service/user'
+import { TEntItem, TUserInfo } from '@/types/user'
 import { isSuccess } from '@/utils'
 export interface UserState {
   whoami: TUserInfo | null
+  entList: TEntItem[]
   getMyInfo: ()=> Promise<void>
+  fetchMyEntList: ()=> Promise<void>
 }
 
 export const useUserStore = create<UserState>((set) => ({
   whoami: null,
+  entList: [],
   getMyInfo: async () => {
     const res = await _getMyInfo()
-    isSuccess(res.status)
-    set({ whoami: res.data})
+    if(isSuccess(res.status)){
+      set({ whoami: res.data})
+    }
+  },
+  fetchMyEntList: async () => {
+    const res = await _getMyEntList()
+    if(isSuccess(res.status)){
+      set({ entList: res.data})
+    }
+    
   },
 }))

+ 1 - 0
src/types/knowledge.ts

@@ -18,6 +18,7 @@ export type TKnowledgeItem = {
   icon: string;
   isParsing: boolean;
   knowledgeId: number;
+  linkUrl?: string;
   parseMsg: string;
   parseStatus: string;
   parseStatusDesc: string;