|
@@ -8,10 +8,9 @@ class ChatUI {
|
|
|
this.promptPanel = document.getElementById("prompt-panel");
|
|
|
this.uploadButton = document.getElementById("upload-button");
|
|
|
this.fileInput = document.getElementById("file-input");
|
|
|
- this.inputs = document.querySelectorAll('input')
|
|
|
this.ContentInputs = []
|
|
|
- console.log(this.inputs);
|
|
|
-
|
|
|
+ this.iframeInfo = null
|
|
|
+
|
|
|
this.excelData = [];
|
|
|
// 确保AI服务已经初始化
|
|
|
if (!window.aiService) {
|
|
@@ -179,12 +178,31 @@ class ChatUI {
|
|
|
});
|
|
|
|
|
|
// 上传按钮点击事件
|
|
|
- this.uploadButton.addEventListener("click", () => {
|
|
|
+ this.uploadButton.addEventListener("click", async () => {
|
|
|
+ this.iframeInfo = await new Promise((resolve) => {
|
|
|
+ // 创建一次性消息监听器
|
|
|
+ const messageHandler = (event) => {
|
|
|
+ if (event.data.type === "PAGE_ANALYSIS_RESULT") {
|
|
|
+ window.removeEventListener("message", messageHandler);
|
|
|
+ resolve(event.data.pageInfo);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ console.log(this.iframeInfo);
|
|
|
+
|
|
|
+ // 添加消息监听
|
|
|
+ window.addEventListener("message", messageHandler);
|
|
|
+
|
|
|
+ // 发送分析请求到父页面
|
|
|
+ window.parent.postMessage({ type: "ANALYZE_PAGE" }, "*");
|
|
|
+ });
|
|
|
+ console.log(this.iframeInfo);
|
|
|
this.fileInput.click();
|
|
|
});
|
|
|
|
|
|
// 文件选择事件
|
|
|
this.fileInput.addEventListener("change", (event) => {
|
|
|
+ console.log(event);
|
|
|
+
|
|
|
const files = event.target.files;
|
|
|
if (files.length > 0) {
|
|
|
this.handleFileUpload(files);
|
|
@@ -228,19 +246,22 @@ class ChatUI {
|
|
|
this.stopButton.classList.add("show");
|
|
|
this.setInputState(true); // 禁用输入框
|
|
|
this.loadingDiv = this.createLoadingMessage();
|
|
|
+ console.log(this.aiService.currentExcelData);
|
|
|
|
|
|
// 如果存在Excel数据,添加上下文提示
|
|
|
let prompt = message;
|
|
|
if (this.aiService.currentExcelData) {
|
|
|
- const { fileName, headers, totalRows } =
|
|
|
+ const { fileName, headers, totalRows, rows } =
|
|
|
this.aiService.currentExcelData;
|
|
|
prompt = `请记住之前我们正在讨论的Excel文件:
|
|
|
- 文件名:${fileName}
|
|
|
- 列标题:${headers.join(", ")}
|
|
|
+- 列内容:${rows.join(", ")}
|
|
|
+
|
|
|
- 总行数:${totalRows}
|
|
|
|
|
|
基于这个Excel文件的内容,请回答以下问题:
|
|
|
-${message}`;
|
|
|
+${this.iframeInfo}`;
|
|
|
}
|
|
|
|
|
|
const response = await this.aiService.sendMessage(prompt);
|
|
@@ -349,6 +370,7 @@ ${message}`;
|
|
|
* @param {string} text 要显示的文字
|
|
|
*/
|
|
|
async typeMessage(element, text) {
|
|
|
+ return element.innerHTML = text;
|
|
|
let index = 0;
|
|
|
const rawText = text;
|
|
|
const tempDiv = document.createElement("div");
|
|
@@ -655,6 +677,7 @@ ${message}`;
|
|
|
window.addEventListener("message", (event) => {
|
|
|
if (event.data.type === "PAGE_INFO") {
|
|
|
const pageInfo = event.data.pageInfo;
|
|
|
+ this.iframeInfo = event.data.pageInfo.iframe
|
|
|
this.ContentInputs = pageInfo.inputs
|
|
|
|
|
|
// 更新卡片内容
|
|
@@ -698,7 +721,7 @@ ${message}`;
|
|
|
this.loadingDiv = this.createLoadingMessage();
|
|
|
|
|
|
// 通过postMessage请求页面分析结果
|
|
|
- const pageInfo = await new Promise((resolve) => {
|
|
|
+ this.iframeInfo = await new Promise((resolve) => {
|
|
|
// 创建一次性消息监听器
|
|
|
const messageHandler = (event) => {
|
|
|
if (event.data.type === "PAGE_ANALYSIS_RESULT") {
|
|
@@ -713,7 +736,7 @@ ${message}`;
|
|
|
// 发送分析请求到父页面
|
|
|
window.parent.postMessage({ type: "ANALYZE_PAGE" }, "*");
|
|
|
});
|
|
|
-
|
|
|
+ return
|
|
|
// 构建提示词
|
|
|
const prompt = this.aiService.getSummaryPrompt(pageInfo);
|
|
|
|
|
@@ -752,7 +775,10 @@ ${message}`;
|
|
|
* @param {FileList} files 上传的文件列表
|
|
|
*/
|
|
|
async handleFileUpload(files) {
|
|
|
+ console.log(files);
|
|
|
+
|
|
|
try {
|
|
|
+
|
|
|
for (const file of files) {
|
|
|
const extension = file.name.split(".").pop().toLowerCase();
|
|
|
|
|
@@ -785,7 +811,12 @@ ${message}`;
|
|
|
this.loadingDiv.remove();
|
|
|
this.loadingDiv = null;
|
|
|
}
|
|
|
-
|
|
|
+ window.parent.postMessage({
|
|
|
+ type: "HANDLE_FILL_INPUT", data: {
|
|
|
+ excelData: this.excelData,
|
|
|
+ formData: JSON.parse(response)
|
|
|
+ }
|
|
|
+ }, "*");
|
|
|
// 显示AI的理解结果
|
|
|
this.addMessage(response, "assistant", true);
|
|
|
} catch (error) {
|
|
@@ -814,12 +845,16 @@ ${message}`;
|
|
|
return "这是一个空的Excel文件,请检查文件内容。";
|
|
|
}
|
|
|
|
|
|
+
|
|
|
const headers = data[0];
|
|
|
const rows = data.slice(1);
|
|
|
const sampleRows = rows.slice(0, 2);
|
|
|
console.log(data);
|
|
|
- this.excelData = data
|
|
|
- return `我将向你展示一个通过SheetJS库读取的Excel文件内容。请帮我理解这些数据:
|
|
|
+ data[0].forEach((header, i) => {
|
|
|
+ if (!this.excelData[header]) this.excelData[header] = []
|
|
|
+ this.excelData[header].push(data[1][i])
|
|
|
+ })
|
|
|
+ return `我将向你展示一个通过SheetJS库读取的Excel文件内容和一个form表单。请帮我理解这些数据:
|
|
|
|
|
|
文件名:${fileName}
|
|
|
列标题:${headers.join(", ")}
|
|
@@ -827,20 +862,22 @@ ${message}`;
|
|
|
|
|
|
示例数据(前2行):
|
|
|
${sampleRows
|
|
|
- .map((row, index) => {
|
|
|
- return `第${index + 1}行: ${row
|
|
|
- .map((cell, i) => `${headers[i]}=${cell}`)
|
|
|
- .join(", ")}`;
|
|
|
- })
|
|
|
- .join("\n")}
|
|
|
-
|
|
|
-请简要说明:
|
|
|
-1. 这个表格的主要用途
|
|
|
-2. 数据之间的关系
|
|
|
-3. 可能的使用场景
|
|
|
-
|
|
|
-请记住这些数据内容,因为后续我可能会询问更多相关问题。
|
|
|
-请用简洁的语言回复,避免过多修饰词。`;
|
|
|
+ .map((row, index) => {
|
|
|
+ return `第${index + 1}行: ${row
|
|
|
+ .map((cell, i) => `${headers[i]}=${cell}`)
|
|
|
+ .join(", ")}`;
|
|
|
+ })
|
|
|
+ .join("\n")}
|
|
|
+
|
|
|
+表单内容:
|
|
|
+${this.iframeInfo}
|
|
|
+
|
|
|
+要求:
|
|
|
+1. 请分析表单中实际可操作的表单项,
|
|
|
+2. 并根据实际可操作的表单项的所有信息与上传excel文件中的列标题进行匹配,生成表单项与excel文件中列标题的数组,并使用findBy字段告诉我通过什么信息匹配到的,使用findByValue字段告诉我匹配到的值,使用excelColumn字段告诉我excel文件中列标题的值。在一个字段内返回
|
|
|
+3. 并去除没有匹配到的表单项和excel文件中没有匹配到的列
|
|
|
+4. 如果表单项的输入项有id元素,同时返回id,通过type字段告诉我输入项的类型
|
|
|
+5. 仅返回数组类型的数组,不要带换行符,不要返回任何其他内容。`
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -888,9 +925,10 @@ ${sampleRows
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
|
try {
|
|
|
const chatUI = new ChatUI();
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
} catch (error) {
|
|
|
console.error("Failed to initialize ChatUI:", error);
|
|
|
}
|
|
|
});
|
|
|
+
|