fix(form): 下拉取不到时不再退化成数字框,并让请假表单与模块页对齐
build / build (push) Successful in 2m58s

用户反馈「班级变成数字框了」的直接原因:选项加载失败(模块会话未建立时
接口回 302)后 widgetOf 把下拉降级成了数字输入框 —— 用户不可能知道
「一年级(2)班」的内部编号是 7,等于把表单搞坏。

- widgetOf 恒返回后端下发的控件形态,取不到选项时保留下拉 + 显示「重新加载」
- 请假表单对齐 HomeLeave 模块页:
  * 请假类型 = 单选按钮组 + 默认选中第一项(radio / autoPickFirst)
  * 请假时间 = 起止 datetime + 快捷时段(全天/上午/下午)+ 连续请假勾选框
    + 连续天数 + 逐天可微调时段(switch / quickPeriods / dailyExpand)
  * 事由 placeholder「请输入请假原因.....」、附件提示「可选,大小不超过 200MB」
  * 单选组 / 勾选框 / 多行文本 / 附件 / 审批流独占整行,避免挤在半列走形
- 会话预热:上限 6s→12s,且失败后总是重试两次(原「到点即弃且不重试」是
  「时不时出不来」的来源之一);callModuleApi 支持 forceWarm 供「重新加载」绕过 60s 限流
- alova 的 timeout 原先被写进 headers(fetch 不认),改为真正的客户端超时
- 处理中的转圈常驻并显示已等待秒数,不再因为气泡已有文案就静默
This commit is contained in:
lijing
2026-10-13 16:15:42 +08:00
parent 97cd25b0e0
commit d1d76c6232
7 changed files with 590 additions and 66 deletions
+31 -8
View File
@@ -8,7 +8,7 @@ import ToolTraceCard from "./ToolTraceCard.vue";
import FormCard from "./FormCard.vue";
import type { ChatItem } from "@/types/agent";
const props = defineProps<{ item: ChatItem; pending?: boolean }>();
const props = defineProps<{ item: ChatItem; pending?: boolean; elapsed?: number }>();
const emit = defineEmits<{
(e: "form-submit", payload: { item: ChatItem; form: { tool: string; args: Record<string, any> } }): void;
@@ -41,17 +41,23 @@ function paragraphs(text: string): string[] {
<span v-if="item.role === 'assistant'" class="msg__name">校园智能助手</span>
<div class="msg__stack">
<!-- 助手等待中:阶段提示 -->
<div v-if="pending" class="msg__stage">
<!-- 正文 -->
<div v-if="item.text" class="msg__bubble">
<p v-for="(p, i) in paragraphs(item.text)" :key="i">{{ p }}</p>
</div>
<!--
处理中:**始终**显示(哪怕气泡里已经有「正在通过你的浏览器执行…」这类文案)。
历史缺陷:原来只在气泡无文案时才显示,于是服务端一下发 notice 文案,
转圈提示就消失了 —— 后续若再等十几秒,界面看着就是「卡死没下文」。
这里补上已等待秒数,让用户确知后台还在跑。
-->
<div v-if="pending" class="msg__stage" :class="{ 'msg__stage--compact': !!item.text }">
<span class="dot" />
<span class="dot" />
<span class="dot" />
<span class="msg__stage-text">{{ item.stage || "思考中…" }}</span>
</div>
<!-- 正文 -->
<div v-if="item.text" class="msg__bubble">
<p v-for="(p, i) in paragraphs(item.text)" :key="i">{{ p }}</p>
<span v-if="elapsed >= 3" class="msg__stage-elapsed">已等待 {{ Math.floor(elapsed) }}s</span>
</div>
<!-- 工具轨迹 -->
@@ -200,6 +206,23 @@ function paragraphs(text: string): string[] {
margin-left: 5px;
}
/* 气泡已有文案时的紧凑版:更淡、更小,一行挂在气泡下方,只做「还在跑」的提示 */
.msg__stage--compact {
margin-top: 8px;
padding: 7px 12px;
font-size: 12.5px;
background: transparent;
border-style: dashed;
}
.msg__stage-elapsed {
margin-left: 6px;
padding-left: 8px;
border-left: 1px solid var(--agent-border-strong);
color: var(--agent-text-mute);
font-variant-numeric: tabular-nums;
}
.dot {
width: 5px;
height: 5px;