fbc9774e197e30fda15be4cbf65e36155b58a17b
活动策划大纲当时必然失败,界面只显示「生成失败,请稍后重试」。
两条根因(单变量对照实测确证):
1. Dify 开始节点 event_funding 是 number,而实体与两端前端都是字符串,
小程序问答助手页默认值还是中文「待定」→ must be a valid number,0.2s 即 failed。
2. event_member / tel_people 是上游必填变量,实体里根本没有字段,从不发送
→ event_member is required in input form。
实施中发现的关键事实,推翻了 issue 初稿的一条建议:
「is required in input form」检查的是键是否存在,不是值是否非空 ——
缺 event_member 键 / null → failed: is required in input form
"event_member": "" → succeeded(4752 条 message)
"event_funding": "" → succeeded(7268 条 message)
"event_funding": "待定" → failed: must be a valid number
所以「干脆不发该字段」行不通(不发 = 报 required),正确做法是键始终下发、
值空串兜底。
改动:
- ActivityOutlineInputs 补 eventMember / peopleManage / telPeople 三字段
(snake + 驼峰别名);eventFunding 保持 String 承载用户原文。
- buildActivityOutlineInputs:6 个上游必填变量无条件占位(空值走空白转空串,
不能给 null —— null 会被上游当缺失);event_type / event_location /
people_manage / event_meme 实测非必填,保持「为空不发」。
- 新增 normalizeEventFunding:抽出首个金额并归一化为 BigDecimal。
两个必须先处理的坑,否则静默发出错误金额(比留空更糟):
· 日期:'2026年4月办活动,预算5000元' 的 2026 会被当金额 → 先剔除日期
· 单位前空格:'预算 1 万元' 只认紧邻的「万」会抽成 1 元 → \s* 容忍
另支持 万/亿/千/百 倍率与 '3万5千' 连续降序单位相加;抽不出即降级空串。
- 前置校验抽成 validateActivityOutline,只校验主题/受众/时间三项。
刻意不校验另外三个上游必填项 —— 上游必填不等于用户必填,加校验会把两端
默认入参挡在门外(改前端默认值为空串后,旧校验会直接返回
'event_funding不能为空',比原缺陷更糟)。
- buildLoadingText 加 120 字上限:agent_thought 的思维链实测可达数 KB,
整段塞进 loading 气泡等于把思维链推给端上。
- 去掉 isDisplayableText 之后的恒假条件(空串已被排除),并注释说明
reply.indexOf("") 恒为 0 会误判已存在,故两道判断都不能少。
配套前端:
- uniapp 问答助手页资金默认值 '待定' → ''(未提及 != 待定)
- admin 入参类型补注释与 3 个可选键
测试:新增 AiActivityOutlineContractTest 23/23,含「凡校验放行的入参必带上游
全部必填键」的不变量用例;AiManuscriptUuidLeakTest 增至 21 条,补 loading
长度上限与真实 message_end 形状。全量 202 跑 0 失败
(2 个 ServerContainer not available 为预存问题)。
验收:probe/outline-e2e.py 走真实后端,用两端前端默认入参与 issue 原文要求的
'待定' 一档,复刻 apiRequest 回落 + formatOutlineResult + parseAssistantContent
判定,29/29 PASS。
Description
No description provided
Languages
Java
99.5%
Shell
0.5%