chd 5 月之前
父节点
当前提交
6902e28cfc

+ 36 - 70
src/entrypoints/sidepanel/Chat.vue

@@ -87,14 +87,14 @@ import {ref, onMounted, nextTick, inject, useTemplateRef} from 'vue'
 import {ElScrollbar, ElAvatar, ElInput, ElButton} from 'element-plus'
 import moment from "moment";
 import { buildExcelUnderstandingPrompt ,getFileSummaryPrompt,getSummaryPrompt,getFileContent,buildObjPrompt } from '@/utils/ai-service.js'
-import * as XLSX from "xlsx";
+
 import {ElMessage} from 'element-plus';
 import {useMsg} from '@/entrypoints/sidepanel/hook/useMsg.ts';
 import Tools from "@/entrypoints/sidepanel/component/tools.vue";
 import historyComponent from '@/entrypoints/sidepanel/component/historyComponent.vue';
 import {mockData, startMsg, mockData2} from "@/entrypoints/sidepanel/mock"
 import { useAutoResizeTextarea } from '@/entrypoints/sidepanel/hook/useAutoResizeTextarea.ts';
-import {getPageInfo} from './utils/index.js'
+import {getPageInfo,getXlsxValue,handleInput} from './utils/index.js'
 
 // 滚动条引用
 const scrollbar = ref(null);
@@ -109,9 +109,10 @@ const {
   messages,
   taklToHtml,
   sendLoading,
+  type,
   streamRes,
-  handleInput,
-  getFormKeyAndValue
+  getFormKeyAndValue,
+  handleSend
 } = useMsg(scrollbar, xlsxData);
 const inputMessage = ref('')
 const pageInfo = ref('')
@@ -129,24 +130,20 @@ const addMessage = (msg, raw) => {
         })
         messages.value.push(newMessage)
         useStore(msgUuid.value).add(newMessage)
-        // 滚动到底部
         nextTick(() => {
             scrollbar.value?.setScrollTop(99999);
         })
         return newMessage
-
     }
 const handleSummary = async () => {
   const res = await getPageInfo()
   addMessage('总结页面',getSummaryPrompt(res.content))
-  streamRes()
+  handleSend()
 }
-const type = ref('')
 function handelIntelligentFillingClick() {
   inputMessage.value = '/智能填表 '
   type.value = '2'
 }
-
 function handleCurrentData(e) {
   drawerRef.value.drawer = false;
   if (!e) {
@@ -162,11 +159,10 @@ function handleCurrentData(e) {
     })
   })
 }
-
 async function readClick() {
   isShowPage.value = true;
   taklToHtml.value = true;
-  await getPageInfo()
+  pageInfo.value =  await getPageInfo()
 }
 
 function addNewDialogue() {
@@ -179,14 +175,13 @@ function addNewDialogue() {
   messages.value.push(startMsg);
   useStore(msgUuid.value).add(startMsg);
 }
-
 async function handleAsk() {
   if (sendLoading.value) return;
   addMessage(inputMessage.value.trim());
+  handleSend(inputMessage.value.trim())
   inputMessage.value = '';
-  streamRes(taklToHtml)
+  // streamRes(taklToHtml)
 }
-
 function handleCapture() {
   ElMessage({
     message: '开发中...',
@@ -194,17 +189,13 @@ function handleCapture() {
     showClose: true
   });
 }
-
 function hisRecords() {
   drawerRef.value.drawer = true;
 }
-
 // 计算标题是否需要滚动
 const titleScroll = computed(() => {
   return pageInfo.value?.title?.length > 20 // 当标题超过20个字符时触发滚动
 })
-
-
 const handleUpload =async (file) => {
   if (type.value === '2') {
       chrome.runtime.sendMessage({
@@ -215,74 +206,52 @@ const handleUpload =async (file) => {
     } else {
       const fileExtension = file.name.split('.').pop().toLowerCase();
       if (response.status === 'error') return ElMessage({message:response.message,type: 'error', duration: 4 * 1000, grouping: true})
-      formInfo = response.data
       if (fileExtension === 'xlsx') {
-        const reader = new FileReader();
-        reader.readAsArrayBuffer(file)  
-        reader.onload = async (e) => {
-          const data = new Uint8Array(e.target.result);
-          const workbook = XLSX.read(data, {
-            type: "array",
-            cellDates: false,
-            cellNF: true,
-            cellText: true,
-            dateNF: 'yyyy-mm-dd'
-          });
-
-          // 修复日期处理
-          const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
-
-          // 转换为JSON数据
-          const readData = XLSX.utils.sheet_to_json(firstSheet, {
-            header: 1,
-            raw: false,
-            defval: "",
-            dateNF: 'yyyy-mm-dd'
-          });
-          console.log(readData, 58);
-
-          readData[0].forEach((header, i) => {
+        const readData = await getXlsxValue(file)
+         readData[0].forEach((header, i) => {
             // if (!xlsxData.value[header]) xlsxData.value[header] = []
             xlsxData.value[header] = readData[1][i]
           })
-          addMessage(`已上传文件:${file.name}`,buildExcelUnderstandingPrompt(readData, file?.name, response.data))
-          await streamRes()
-        };
+          addMessage(`已上传文件:${file.name}`,buildExcelUnderstandingPrompt(readData[0], file?.name, response.data))
+          const a = await streamRes()
+         handleInput(xlsxData.value,JSON.parse(a.split('json')[1].split('```')[0]))
       } else {
-          const msg = addMessage(`文件上传中`,)
-          sendLoading.value = true
-           let formData = new FormData();
-          formData.append("file", file);
-          const res = await getFileContent(formData)
-          sendLoading.value = false
-          msg.content = `已上传文件:${file.name}`
-          msg.rawContent = getFileSummaryPrompt(res.data, file.name)
-          const res2 = await getFormKeyAndValue(res.data,response.data)
-             xlsxData.value = res2.data
-                console.log(xlsxData.value);
-                console.log(type.value);
+          const {data,msg} = await getFileValue(file)
+          const res2 = await getFormKeyAndValue(data,response.data)
+        xlsxData.value = res2.data
+        msg.rawContent = buildObjPrompt(res2.data, response.data)
+          console.log();
+          
+          const a = await streamRes()
+          handleInput(xlsxData.value,JSON.parse(a.split('json')[1].split('```')[0]))
+          console.log(xlsxData.value);
+          console.log(type.value);
          }
        }
     return true
   });
   }
   if (type.value === '') {
+    const fileVaue = await getFileValue(file)
+    // streamRes()
+  }
+}
+let str = ''
+async function getFileValue(file) {
     const msg = addMessage(`文件上传中`,)
     sendLoading.value = true
-     let formData = new FormData();
+    let formData = new FormData();
     formData.append("file", file);
     const res = await getFileContent(formData)
     sendLoading.value = false
     msg.content = `已上传文件:${file.name}`
-    msg.rawContent = getFileSummaryPrompt(res.data, file.name)
-    streamRes()
-  }
+    msg.rawContent = res.data
+  return {
+    data: res.data,
+    msg
+    }
 }
-let str = ''
-
-
 const isHoveringTitle = ref(false)
-
 // 组件挂载时滚动到底部
 onMounted(() => {
   useAutoResizeTextarea(tareRef, inputMessage);
@@ -299,11 +268,9 @@ onMounted(() => {
       pageInfo.value = message.data
     }
   });
-
   nextTick(() => {
     scrollbar.value?.setScrollTop(99999)
   })
-
   // 添加标题悬停事件监听
   nextTick(() => {
     const titleWrapper = document.querySelector('.title-wrapper')
@@ -317,7 +284,6 @@ onMounted(() => {
     }
     scrollbar.value?.setScrollTop(99999)
   })
-
   // 添加indexDB Store配置
   msgUuid.value = 'D' + Date.now().toString();
   registerStore({

+ 8 - 19
src/entrypoints/sidepanel/hook/useMsg.ts

@@ -4,7 +4,8 @@ import avator from '@/public/icon/32.png';
 import moment from 'moment'
 import {  getFormKey, buildObjPrompt ,getFileSummaryPrompt} from '@/utils/ai-service'
 import { ElMessage } from 'element-plus';
-import { getPageInfo } from '../utils/index'
+import { getPageInfo } from '../utils/index.js'
+import { mockData, mockData2 } from '../mock';
 // import { sendMessage } from '@/utils/ai-service';
 export function useMsg(scrollbar?: any) {
     const msgUuid = ref<string>();
@@ -73,12 +74,7 @@ export function useMsg(scrollbar?: any) {
         }
     }
     // 发送消息
-   
-
- 
-
-    const sendRequese = async (msg: any, addHtml = false) => {
-        const res: any = await getPageInfo()
+    const handleSend = async (msg: any, addHtml = false) => {
         if ((type.value === '2' && msg.startsWith('/')) || msg.startsWith('请')) {
             if (!taklToHtml.value) return messages.value.push({
                 id:messages.value.length + 1,
@@ -94,11 +90,9 @@ export function useMsg(scrollbar?: any) {
             fetchRes(msg)
         }
         else {
-            if (!addHtml) msg = getSummaryPrompt(res.content)
-            streamRes(msg)
+            streamRes(addHtml)
         }
     }
-
     const fetchRes = async (msg: any) => {
         sendLoading.value = true
         const obj: any = reactive({
@@ -143,8 +137,6 @@ export function useMsg(scrollbar?: any) {
         }
         await handleClick(res.data, obj);
     }
-
-
     async function handleClick(res:any, msgObj:any) {
         await new Promise(resolve => setTimeout(resolve, 2000))
         msgObj.content = `点击${res.tag}元素`
@@ -187,7 +179,8 @@ export function useMsg(scrollbar?: any) {
      * 
      * @param addHtml 是否添加页面信息
      */
-    const streamRes = async (addHtml:any = false) => {
+    const streamRes = async (addHtml: any = false) => {
+        pageInfo.value = await getPageInfo()
         sendLoading.value = true;
         const obj = reactive<any>({
             id:messages.value.length + 1,
@@ -238,19 +231,15 @@ export function useMsg(scrollbar?: any) {
             }
             scrollbar.value?.setScrollTop(99999)
         }
-        scrollbar.value?.setScrollTop(99999)
         //添加到存储历史
         useStore(msgUuid.value).add({...obj})
-
         // 处理最终内容
         sendLoading.value = false
         nextTick(() => {
             scrollbar.value?.setScrollTop(99999)
         })
+        return obj.rawContent
     }
-
-   
-
     return {
         msgUuid,
         messages,
@@ -259,7 +248,7 @@ export function useMsg(scrollbar?: any) {
         sendLoading,
         formMap,
         type,
-        sendRequese,
+        handleSend,
         streamRes,
         getFormKeyAndValue,
         getFileSummary

+ 31 - 0
src/entrypoints/sidepanel/utils/index.js

@@ -1,3 +1,4 @@
+import * as XLSX from "xlsx";
 export const getPageInfo = () => {
     return new Promise((res, rej) => {
         chrome.runtime.sendMessage({
@@ -21,3 +22,33 @@ export const handleInput = (xlsxData, formMap) => {
         }
     })
 }
+export const getXlsxValue = (file) => {
+    return new Promise((res, rej) => {
+      try {
+          const reader = new FileReader();
+          reader.readAsArrayBuffer(file)
+          reader.onload =  (e) => {
+              const data = new Uint8Array(e.target.result);
+              const workbook = XLSX.read(data, {
+                  type: "array",
+                  cellDates: false,
+                  cellNF: true,
+                  cellText: true,
+                  dateNF: 'yyyy-mm-dd'
+              });
+              // 修复日期处理
+              const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
+              // 转换为JSON数据
+              const readData = XLSX.utils.sheet_to_json(firstSheet, {
+                  header: 1,
+                  raw: false,
+                  defval: "",
+                  dateNF: 'yyyy-mm-dd'
+              });
+              res(readData)
+          }
+      } catch (error) {
+        rej()
+      }
+   })
+}

+ 3 - 4
src/utils/ai-service.js

@@ -212,13 +212,12 @@ export function buildExcelUnderstandingPrompt(data, fileName, pageInfo) {
 ${pageInfo}
              
 要求:
-1. 请根据表单中的表单项和列标题进行匹配,一定以表单为准!
+1. 请根据表单中的表单项和列标题进行匹配,一定以表单为准,列标题只能匹配一次,没有和列标题匹配到的表单项不返回
 2. 生成表单项与列标题对应的数组,并使用findBy告诉我通过表单项的什么字段信息匹配到的,使用findByValue告诉我匹配到的表单项字段值,使用excelColumn字段告诉我excel文件中列标题的值。
-3. 根据label匹配,findBy是label,并通过findByValue给我label元素的值,根据id匹配,findBy是id,并通过findByValue给是id的值,
+3. 表单项有id根据id匹配,findBy是id,并通过findByValue告诉我id的值,没有id根据label匹配,findBy是label,并通过findByValue给我label元素的值,没有label根据placeholder匹配,findBy是placeholder,并通过findByValue告诉我placeholder的值,没有placeholder,再根据其他内容匹配
 3. 并去除没有匹配到的表单项和excel文件中没有匹配到的列,
 4. 通过type字段告诉我输入项的类型
-5. 表单项有label,根据label匹配,没有label根据placeholder匹配,没有placeholder,根据id匹配,再根据其他内容匹配
-6. 仅返回数组,不要返回任何其他内容。`
+5. 仅返回数组,不要返回任何其他内容。`
 }
 // 5. 如果表单项有label标签,同时返回label, 通过label字段告诉我label元素的文本
 export function buildObjPrompt(obj,  pageInfo) {