From 0b6c478b4f5aa7fdf473551cf42a35aa569b4e9d Mon Sep 17 00:00:00 2001 From: kuaifan Date: Sat, 8 Nov 2025 21:53:02 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=8A=A5=E5=91=8AAI?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E7=BC=96=E8=BE=91=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/js/components/AIAssistant.vue | 75 ++++++++-- .../js/pages/manage/components/ReportEdit.vue | 129 ++++++++++-------- resources/assets/js/utils/ai.js | 15 ++ 3 files changed, 155 insertions(+), 64 deletions(-) diff --git a/resources/assets/js/components/AIAssistant.vue b/resources/assets/js/components/AIAssistant.vue index 6afe8e466..03686e88f 100644 --- a/resources/assets/js/components/AIAssistant.vue +++ b/resources/assets/js/components/AIAssistant.vue @@ -125,6 +125,8 @@ export default { showModal: false, closing: false, loadIng: 0, + pendingAutoSubmit: false, + autoSubmitTimer: null, // 输入配置 inputValue: '', @@ -160,6 +162,7 @@ export default { beforeDestroy() { emitter.off('openAIAssistant', this.onOpenAIAssistant); this.clearActiveSSEClients(); + this.clearAutoSubmitTimer(); }, computed: { selectedModelOption({modelMap, inputModel}) { @@ -179,19 +182,26 @@ export default { * 打开助手弹窗并应用参数 */ onOpenAIAssistant(params) { - if ($A.isJson(params)) { - this.inputValue = params.value || ''; - this.inputPlaceholder = params.placeholder || this.defaultPlaceholder || this.$L('请输入你的问题...'); - this.inputRows = params.rows || this.defaultInputRows; - this.inputAutosize = params.autosize || this.defaultInputAutosize; - this.inputMaxlength = params.maxlength || this.defaultInputMaxlength; - this.applyHook = params.onApply || null; - this.beforeSendHook = params.onBeforeSend || null; - this.renderHook = params.onRender || null; + if (!$A.isJson(params)) { + params = {}; } + this.inputValue = params.value || ''; + this.inputPlaceholder = params.placeholder || this.defaultPlaceholder || this.$L('请输入你的问题...'); + this.inputRows = params.rows || this.defaultInputRows; + this.inputAutosize = params.autosize || this.defaultInputAutosize; + this.inputMaxlength = params.maxlength || this.defaultInputMaxlength; + this.applyHook = params.onApply || null; + this.beforeSendHook = params.onBeforeSend || null; + this.renderHook = params.onRender || null; + this.pendingAutoSubmit = !!params.autoSubmit; + // this.responses = []; this.showModal = true; this.clearActiveSSEClients(); + this.clearAutoSubmitTimer(); + this.$nextTick(() => { + this.scheduleAutoSubmit(); + }); }, /** @@ -596,6 +606,49 @@ export default { this.activeSSEClients = []; }, + /** + * 清除自动提交定时器 + */ + clearAutoSubmitTimer() { + if (this.autoSubmitTimer) { + clearTimeout(this.autoSubmitTimer); + this.autoSubmitTimer = null; + } + }, + + /** + * 调度自动提交 + */ + scheduleAutoSubmit() { + if (!this.pendingAutoSubmit) { + return; + } + const attemptSubmit = () => { + if (!this.pendingAutoSubmit) { + return; + } + if (this.canAutoSubmit()) { + this.pendingAutoSubmit = false; + this.clearAutoSubmitTimer(); + this.onSubmit(); + return; + } + this.autoSubmitTimer = setTimeout(attemptSubmit, 200); + }; + this.clearAutoSubmitTimer(); + this.autoSubmitTimer = setTimeout(attemptSubmit, 0); + }, + + /** + * 检查是否可以自动提交 + */ + canAutoSubmit() { + return !this.modelsLoading + && !!this.selectedModelOption + && this.responses.length === 0 + && this.loadIng === 0; + }, + /** * 新建响应卡片 */ @@ -719,9 +772,11 @@ export default { return; } this.closing = true; + this.pendingAutoSubmit = false; + this.clearAutoSubmitTimer(); + this.clearActiveSSEClients(); this.showModal = false; this.responses = []; - this.clearActiveSSEClients(); setTimeout(() => { this.closing = false; }, 300); diff --git a/resources/assets/js/pages/manage/components/ReportEdit.vue b/resources/assets/js/pages/manage/components/ReportEdit.vue index aa181e21a..a8c097110 100644 --- a/resources/assets/js/pages/manage/components/ReportEdit.vue +++ b/resources/assets/js/pages/manage/components/ReportEdit.vue @@ -40,7 +40,7 @@ - +
@@ -48,7 +48,6 @@
- -
-
- - -
-
\ No newline at end of file + diff --git a/resources/assets/js/utils/ai.js b/resources/assets/js/utils/ai.js index f48337a38..51a01819f 100644 --- a/resources/assets/js/utils/ai.js +++ b/resources/assets/js/utils/ai.js @@ -322,6 +322,20 @@ const PROJECT_AI_SYSTEM_PROMPT = `你是一名资深的项目规划顾问,帮 - 列表名称应当互不重复且语义明确 - 若上下文包含已有名称或列表,请在此基础上迭代优化`; +const REPORT_AI_SYSTEM_PROMPT = `你是一名资深团队管理教练,需要根据提供的周报/日报草稿进行整理。 + +工作目标: +1. 提取并归纳已完成事项的成果、影响和量化数据 +2. 梳理下周期/次日的计划,确保每条计划都是可执行动作 +3. 暴露存在的风险、阻塞以及需要管理者协助的事项 +4. 若上下文提到关注重点或特殊受众,需在描述中明确回应 + +输出要求: +- 使用 Markdown 编写,至少包含以下一级标题:## 本周期完成、## 下周期计划、## 风险与支持 +- 每个章节使用有序或无序列表,保持语句简洁、可度量 +- 若原文包含数据或里程碑,保留并突出这些数字 +- 若某一章节没有信息,请输出“暂无”而非留空`; + export { AIModelNames, AINormalizeJsonContent, @@ -330,4 +344,5 @@ export { MESSAGE_AI_SYSTEM_PROMPT, TASK_AI_SYSTEM_PROMPT, PROJECT_AI_SYSTEM_PROMPT, + REPORT_AI_SYSTEM_PROMPT, }