fix(automation): 保存配置时存错作业 —— 5 张卡共用一个 form 实例

## 现象(用户报的)

点「账号资料定时补全」的保存,提示却是**「积分到期补记 配置已保存」**。

## 根因:不是提示文案错,是**真的存错了作业**

`jobs.map()` 里**每张卡各包一个 `<Form form={forms}>`,但它们共用同一个
`Form.useForm()` 实例**。React 里多个 `<Form>` 绑同一实例时,
**`onFinish` 会被最后挂载的那个覆盖** —— 于是:

    点第 1 张卡的「保存」→ 触发的是**最后一张卡**(积分到期补记)的 onFinish
                        → saveJob(积分到期补记)

## 实际影响(不涉及数据损坏)

- `saveJob(job)` 读的是**那个 job 自己的**字段值 → 所以「积分到期补记」
  只是被用它自己的值**重存了一遍**(无副作用)
- 而用户真正想保存的「账号资料定时补全」**根本没被保存** —— 静默失败

## 修法

把 Form **提到外面只包一层**(`Form.Item` 靠 `[job.key, 字段]` 天然区分各自的值),
保存按钮从 `htmlType="submit"` 改成显式的 `onClick={() => saveJob(job)}` ——
不再依赖"哪个 Form 的 onFinish 生效"这种隐含约定。

并在原处留了注释说明为什么**不能**各自包 Form(否则下一个人很可能又这么写)。

## 说明

前端这类"共用实例"的错误没有自动化测试兜住(仓库没有组件测试),
所以这次是靠用户点出来的。已在代码注释里写清原因,降低复发概率。

## 验证

前端 build 通过、lint 0 errors。
This commit is contained in:
yml2213
2026-10-04 21:40:46 +08:00
parent 9ac98dad89
commit bb767bb84a
+8 -3
View File
@@ -273,6 +273,7 @@ export default function AutomationPage() {
description="两个作业是联动的上下游:巡检把失效账号标记为 invalid,「CK 自动重登」的候选条件正是这个标记,所以巡检一发现失效,重登作业在下一个周期就会把它救回来(需打开重登开关)。刻意分成两个作业是为了止损粒度 —— 巡检只读、零风险;重登会真实登录(消耗邮箱验证码、可能遇到极验),出问题可单独关掉重登而不影响检测。巡检本身不会替换任何 Cookie、也不会改账号状态。"
/>
<Form form={forms} layout="inline">
{jobs.map((job) => (
<Card
key={job.key}
@@ -313,7 +314,11 @@ export default function AutomationPage() {
</Descriptions.Item>
</Descriptions>
<Form form={forms} layout="inline" onFinish={() => saveJob(job)}>
{/* ⚠️ 这里**不能**各自包一个 <Form form={forms}>:
多个 <Form> 绑同一个 form 实例时,`onFinish` 会被最后挂载的那个覆盖 ——
点第一张卡的保存,跑的其实是**最后一张卡**的保存(真踩过:
存「账号资料定时补全」提示的是「积分到期补记」,即存错了作业)。
Form 统一提到这一层外面,各卡只用 Form.Item 的 [job.key, 字段] 区分。 */}
<Form.Item
name={[job.key, "enabled"]}
label="启用"
@@ -345,9 +350,9 @@ export default function AutomationPage() {
<Space>
<Button
type="primary"
htmlType="submit"
disabled={!canManage}
loading={savingKey === job.key}
onClick={() => void saveJob(job)}
>
保存
</Button>
@@ -367,7 +372,6 @@ export default function AutomationPage() {
</Popconfirm>
</Space>
</Form.Item>
</Form>
{!canManage && (
<Typography.Text type="secondary">
当前账号只能查看,修改配置需要 automation:manage 权限。
@@ -375,6 +379,7 @@ export default function AutomationPage() {
)}
</Card>
))}
</Form>
</Card>
<Card