fix(pc): 找回被 #feedback 吞掉的表单校验错误 + 收集任务文案精简

naive 的 NFormItem 一旦用了 #feedback 插槽,renderExplains 就永不渲染
(children || feedback ? feedback : …),校验错误被完全遮住 —— 用户看到的是
"红框 + 一句无关的正常提示",现象上等价于"点了保存没反应"。RoleFormModal 里
早就记录过这个机制,但只在自己那个文件绕开了,没固化成约定,于是扩散到 7 处。

- 7 处 validate() 的 catch 改成 message.error(firstError(errors) ?? 兜底)
  (login / org / role / user / task 建改任务 / 材料规则 / 表单设计)
- ⚠️ firstError 必须摊平后再取:naive reject 出来的是嵌套数组,
  errors[0].message 恒为 undefined,兜底文案会把每条错误都吞成"请检查表单填写"
- 批次号在"修改"时置灰(task_code = 批次号 + 4 位序号,且同时是文件目录名,
  而服务端 update 无条件写 batch_no、没有"编码已生成"的保护)
- 删掉「本期范围」区块(收集模式 / 认定类型恒定,请求体里仍写死 1)
- 清掉教材式描述:extras_json / extra_ 前缀 / 幂等 / 接收能力 / 识别结果只用于提示
- 规则沉淀进 frontend-pc/AGENTS.md 第 10 条与交接摘要 §一·四十
This commit is contained in:
2026-10-13 15:06:34 +08:00
parent 31e7483464
commit e94e76ba0f
10 changed files with 457 additions and 73 deletions
+26 -1
View File
@@ -131,10 +131,35 @@ function edit(row: RoleVO): void {
visible.value = true
}
/**
* ⚠️ 本仓的 `NFormItem` 一旦用了 `#feedback` 插槽,**校验错误会被完全遮住**
* (naive 的渲染是 `children || feedback ? feedback : renderExplains`,
* 插槽存在时 `renderExplains` 永不渲染)。本表单有 3 个字段带 `#feedback`,
* 所以校验失败必须自己把第一条错误弹出来 —— 否则界面上只剩一个红框,
* 用户看到的是"点了确定没反应"。
*/
function firstError(errors: unknown): string | null {
if (!Array.isArray(errors)) {
return null
}
// ⚠️ naive 的 `Form.validate()` reject 出来的是**嵌套数组**(`[[{message}]…]`),
// 见 node_modules/naive-ui/es/form/src/Form.mjs:96-107 —— 每一层的 `result.errors` 被整个 push 进去。
// 所以不能直接读 `errors[0].message`,必须摊平后再找第一条。
for (const entry of errors.flat(2)) {
const message = (entry as { message?: unknown } | null)?.message
if (typeof message === 'string' && message) {
return message
}
}
return null
}
async function confirm(): Promise<void> {
try {
await formRef.value?.validate()
} catch {
} catch (errors) {
// Naive 的 `validate()` 在不过时是 reject(不是返回 false)
message.error(firstError(errors) ?? '请检查表单填写')
return
}