待验收。实现提交 81c1a7ead226f1c814a7cffdcf29b5770aa21996 已于 2026-09-02 在线执行追加迁移并发布为 20260902-81c1a7e-r1;GoAuto/Nginx 已重启且自动核验通过,所有发布前关闭的定时任务保持关闭,等待登录 Admin 完成人工点击验收。
81c1a7ead226f1c814a7cffdcf29b5770aa21996
20260902-81c1a7e-r1
基线:线上提交 aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc,核验时间 2026-09-02。
aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc
web/src/views/schedule/index.vue
handleLog()
job_log
sys_menu.menu_name
JobLog
ids
web/src/views/schedule/log.vue
ws://127.0.0.1:8000
status=1
jobId
sys_job_execution_log
running
succeeded
failed
interrupted
追加迁移建议:1788357000000_sys_job_execution_log.go。
1788357000000_sys_job_execution_log.go
sys_job_execution_log:
id
execution_id
job_id
job_name_snapshot
invoke_target_snapshot
trigger_type
scheduled
status
running | succeeded | failed | interrupted
started_at
finished_at
duration_ms
error_code
error_message
(job_id, started_at)
(status, started_at)
迁移只建表、索引及必要只读 API/权限事实,不回填旧日志,不启用任何任务。迁移和权限写入需用户再次明确授权后才能执行。
GET /api/v1/sysjob/:id/execution-logs
pageIndex
pageSize
startedFrom
startedTo
job:sysJob:log
[新增] [修改(单选)] [删除(有选择)] [日志(单选)] ☑ 5 SYB 异常规格 AI 解析 0 5 * * * * 关闭
定时任务 / 执行日志 ← 返回任务列表 SYB 异常规格 AI 解析(#5) [状态:全部 v] [开始时间:____ 至 ____] [查询] [重置] 执行标识 | 开始时间 | 结束时间 | 状态 | 耗时 | 触发方式 | 错误摘要 ---------|----------|----------|------|------|----------|--------- … | … | … | 成功 | 2.3s | 定时调度 | — < 1 / 3 >
状态覆盖:
该任务尚无执行记录
server/app/jobs/
server/cmd/migrate/migration/version-local/
scripts/verify.ps1 -Component server
python dev_scripts/harness.py check --strict
当前会话未提供可用的 Gitea MCP 工具,按仓库规则回退 Gitea API 完成工单创建。已附 v1 低保真设计,生产代码、追加迁移和权限写入均停在设计确认及高风险授权门禁前。
用户已于 2026-09-02 确认 #199 v1 低保真,并明确授权按工单方案实施追加迁移 1788357000000_sys_job_execution_log.go 及权限写入。实施只创建迁移代码并验证,不执行本机或线上迁移;已从线上 #198 基线 aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc 建立 feat/199-job-execution-logs。
feat/199-job-execution-logs
实现分支:feat/199-job-execution-logs 提交:81c1a7ead226f1c814a7cffdcf29b5770aa21996
running / succeeded / failed / interrupted
go test -race ./app/jobs/...
go vet ./app/jobs/... ./cmd/migrate/migration/version-local
JobLog?jobId=5
pnpm run build:prod
pnpm lint
web/src/views/goauto/purchase-tasks/index.vue
python dev_scripts/harness.py sync
sync --check
check --strict
Architecture-and-Code-Map
a8ea0f6ae4c4a05b10ba047516fda23cfb188d13
Deployment-and-Operations
16d97e7596dc287786f702c71e25172b75cc4d56
用户在重启服务后选择“SYB 每小时自动同步”并点击“日志”,仍无反应。只读核验确认这不是单条任务数据问题,而是 #199 尚未发布:
js/schedule.CMMyRkqi.js
js/log.BvRPbAYI.js
/execution-logs
GET http://185.216.248.75:9527/api/v1/sysjob/1/execution-logs
origin/main
37dea33
结论:本次仅重启了既有旧发布目录,重启不能替代构建/迁移/发布。工单继续保持待验收;未执行数据库迁移、权限写入、发布或任务启用。下一步须另获线上高风险授权后,按“备份数据库 → 执行 1788357000000_sys_job_execution_log.go → 发布含 81c1a7e 的 Server/Web → 重启 → 登录账号单选验证”的顺序处理,#198 仍保持关闭。
81c1a7e
已按用户明确授权在线执行 #199 追加数据库迁移、发布 Server/Web 并重启;所有发布前关闭的定时任务保持关闭。
1788357000000
menu_id=471
/home/goauto/backups/pre-199-20260902-81c1a7e.sql
a6718c8eef4e8a4f66af63a1514961ac83cdcb35babe409121198b9487b1ef71
id=10280
JobLog(471)
rolekey=admin
/home/goauto/releases/20260902-aa2ecc6-r1
/home/goauto/releases/20260902-81c1a7e-r1
2b0ea778efcddb64ff8f05fa6c22ecbb38179401c89d5de8af8fdc9ce3161125
16772ec2cd3c41f2661fcea35167303190e6df82feaab2de91cdab64ce5c7f94
goauto.service
systemctl show --value
/
index.BLjEc8GV.js
execution-log.CX0bHb19.js
127.0.0.1:8000
GET /api/v1/sysjob/3/execution-logs
发布前后逐条一致:
http://localhost:8000
ExamplesOne
GoAutoSYBHourlySync
GoAutoShopeeSpecAutoMatch
GoAutoSYBSpecAIParse
未手工触发任何定时任务,未调用 AI,未创建采集/采购任务或订单,未执行 Android 动作和付款。发布方式没有改变长期运维事实,因此不重复更新 Wiki。
当前没有可用的已登录浏览器控制会话,未读取 Cookie/localStorage、未伪造管理员 Token。请在现有 Admin 页面强制刷新或重新登录,单选“SYB 每小时自动同步”后点击“日志”:应进入 JobLog?jobId=3,当前显示“该任务尚无执行记录”;下一次正常调度后应出现一条执行历史。
JobLog?jobId=3
复测补充(2026-09-03 08:49 CST):用户反馈在定时任务页勾选“蝦皮规格自动匹配”后点击日志仍无界面反应。
只读核验与受控重启结果:
sys_job
/schedule/log
this.$router.push({name:'JobLog', query:{jobId}})
当前判断:问题位于浏览器端交互/已加载 SPA 状态,而不是服务未重启或后端日志表缺失。需在浏览器强制刷新(Ctrl+F5)或退出后重新登录,再明确执行“勾选行复选框 → 点击工具栏【日志】”;直接点击任务名称/任务行按现有 v1 设计不会跳转。如强刷后按上述路径仍无反应,需要采集该浏览器控制台/当前路由证据,再决定是否在 #199 内追加路径导航兜底与可见错误提示。
Gitea MCP 当前会话不可用,本评论按仓库规则回退 Gitea API 写入;未记录任何凭据。
本地复现根因补充(2026-09-03):
8010
9527
D:\OPC\goauto-worktrees\issue-195
f27ec1630788ac9a6a8287caf65e486ba3e3abce
GET http://127.0.0.1:8010/info
GET /api/v1/sysjob/4/execution-logs
/src/views/schedule/index.vue
this.$router.push({ name: 'job_log' })
schedule-execution-log.spec.js
{name:'JobLog', query:{jobId:'5'}}
结论:本次本地问题是启动目录/版本错误,不是“蝦皮规格自动匹配”任务数据或 #199 新接口本身异常。后续应先正常停止当前 #195 的 Server/Web,再从 #199 工作树启动两端并做浏览器验收。
Gitea MCP 当前会话不可用,本评论按仓库规则回退 Gitea API写入;未记录任何凭据。
本地 main/Supervisor 收口完成(2026-09-03 09:05 CST),等待人工验收:
D:\OPC\goauto
D:\OPC\goauto-worktrees\main-runtime
main
D:\OPC\goauto-backups\pre-main-199-20260903-090212.sql
A696972FD23E1E9D3B0EE7749199AD4BA329944279EFCECD3CA89A43C0B89592
issue-195
main-runtime
GET /info
1788354164329
jobLogRoute(this.ids)
yovision-sense
请在 http://127.0.0.1:9527 强制刷新或重新登录后,勾选“蝦皮规格自动匹配”并点击工具栏“日志”完成真实页面验收。
http://127.0.0.1:9527
No dependencies set.
The note is not visible to the blocked user.
阶段
待验收。实现提交
81c1a7ead226f1c814a7cffdcf29b5770aa21996已于 2026-09-02 在线执行追加迁移并发布为20260902-81c1a7e-r1;GoAuto/Nginx 已重启且自动核验通过,所有发布前关闭的定时任务保持关闭,等待登录 Admin 完成人工点击验收。原始需求摘要
已确认代码与线上事实
基线:线上提交
aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc,核验时间 2026-09-02。web/src/views/schedule/index.vue的handleLog()跳转路由名job_log;线上sys_menu.menu_name与动态路由名实际为JobLog,Vue Router 无法匹配,因此点击无界面反馈。handleLog()未读取ids,勾选任务与日志入口没有关联。web/src/views/schedule/log.vue将 WebSocket 固定为ws://127.0.0.1:8000,线上会错误连接采购员电脑本机;服务端定时任务日志广播代码也已注释。status=1,保持关闭;本单不得顺带启用或运行它。目标范围
JobLog路由并携带jobId。sys_job_execution_log持久化表;Cron 执行开始写入running,结束收敛为succeeded或failed。running记录安全收敛为interrupted,避免永久显示执行中。jobId、状态和时间范围查询;服务端校验任务存在和访问权限。非目标与安全边界
数据与状态设计
追加迁移建议:
1788357000000_sys_job_execution_log.go。sys_job_execution_log:id:主键;execution_id:唯一、不可猜测执行标识。job_id、job_name_snapshot、invoke_target_snapshot。trigger_type:本期固定scheduled,为后续显式人工执行预留但本单不实现。status:running | succeeded | failed | interrupted。started_at、finished_at、duration_ms。error_code、error_message:稳定错误码和限长脱敏摘要,成功时为空。(job_id, started_at)、(status, started_at);不设级联外键,以保留已删除任务的历史。迁移只建表、索引及必要只读 API/权限事实,不回填旧日志,不启用任何任务。迁移和权限写入需用户再次明确授权后才能执行。
API 与权限
GET /api/v1/sysjob/:id/execution-logspageIndex、pageSize(上限 100)、可选status、startedFrom、startedTo。job:sysJob:log;新 API 只授予已有该能力的角色。无权限时按钮隐藏且接口返回 403;任务不存在返回 404。v1 低保真设计证据(已确认)
定时任务列表
执行日志页
状态覆盖:
该任务尚无执行记录;关闭任务属于正常空状态。running:结束时间/耗时显示“执行中”。interrupted:显示“服务重启前未完成”。验收标准
jobId的日志页,不再出现无响应。jobId加载;缺失/非法 ID 有明确提示并可返回列表。running最终显示为interrupted,不长期卡住。预计影响
server/app/jobs/:执行记录模型、统一记录封装、分页服务/API、启动恢复。server/cmd/migrate/migration/version-local/:追加迁移和必要 API/权限事实。web/src/views/schedule/index.vue、web/src/views/schedule/log.vue、相关 API:单选跳转和历史列表。验证计划
scripts/verify.ps1 -Component server。python dev_scripts/harness.py check --strict。风险与回退
job:sysJob:log权限。文档影响
依赖与并行
aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc。当前会话未提供可用的 Gitea MCP 工具,按仓库规则回退 Gitea API 完成工单创建。已附 v1 低保真设计,生产代码、追加迁移和权限写入均停在设计确认及高风险授权门禁前。
用户已于 2026-09-02 确认 #199 v1 低保真,并明确授权按工单方案实施追加迁移
1788357000000_sys_job_execution_log.go及权限写入。实施只创建迁移代码并验证,不执行本机或线上迁移;已从线上 #198 基线aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc建立feat/199-job-execution-logs。实施完成,待验收
实现分支:
feat/199-job-execution-logs提交:
81c1a7ead226f1c814a7cffdcf29b5770aa21996已实现
sys_job_execution_log模型和追加迁移1788357000000_sys_job_execution_log.go;迁移幂等登记只读 API,并只给原本绑定隐藏菜单JobLog的角色补精确 GET 权限,菜单缺失时 fail-closed。running / succeeded / failed / interrupted,未知调用目标和 panic 均安全收敛。进程启动按当前单调度器拓扑回收遗留running。GET /api/v1/sysjob/:id/execution-logs,支持分页、状态与 RFC3339 开始时间范围过滤;删除任务后历史仍可查看。JobLog并携带jobId;旧本机 WebSocket 页替换为持久化历史页,覆盖加载、空、失败重试、运行中轮询、已删除提示与返回列表。验证证据
scripts/verify.ps1 -Component server:通过(全量 Go 测试及构建)。go test -race ./app/jobs/...:通过。go vet ./app/jobs/... ./cmd/migrate/migration/version-local:通过。JobLog?jobId=5→ 展示脱敏执行历史,1 个场景通过。pnpm run build:prod:通过;仅保留仓库既有 CSS 伪类及大 chunk 警告。pnpm lint仍被本工单外web/src/views/goauto/purchase-tasks/index.vue的 24 个既有 mixed-tabs 错误阻断;#199 变更文件定向 lint 全部通过,未顺带修改该文件。python dev_scripts/harness.py sync、sync --check、check --strict:通过。Wiki 与安全边界
Architecture-and-Code-Maprevision:a8ea0f6ae4c4a05b10ba047516fda23cfb188d13。Deployment-and-Operationsrevision:16d97e7596dc287786f702c71e25172b75cc4d56。尚未执行/需验收
2026-09-02 线上点击无响应复核
用户在重启服务后选择“SYB 每小时自动同步”并点击“日志”,仍无反应。只读核验确认这不是单条任务数据问题,而是 #199 尚未发布:
js/schedule.CMMyRkqi.js与js/log.BvRPbAYI.js;前者仍包含旧路由名job_log,后者仍包含ws://127.0.0.1:8000,且两者均没有/execution-logs新接口调用。GET http://185.216.248.75:9527/api/v1/sysjob/1/execution-logs返回 HTTP 404,证明线上 API 二进制也不包含 #199 路由。81c1a7ead226f1c814a7cffdcf29b5770aa21996只存在于远端分支feat/199-job-execution-logs,不在origin/main;当前origin/main为37dea33。结论:本次仅重启了既有旧发布目录,重启不能替代构建/迁移/发布。工单继续保持待验收;未执行数据库迁移、权限写入、发布或任务启用。下一步须另获线上高风险授权后,按“备份数据库 → 执行
1788357000000_sys_job_execution_log.go→ 发布含81c1a7e的 Server/Web → 重启 → 登录账号单选验证”的顺序处理,#198 仍保持关闭。线上迁移与发布完成(待人工验收)
已按用户明确授权在线执行 #199 追加数据库迁移、发布 Server/Web 并重启;所有发布前关闭的定时任务保持关闭。
数据库备份与迁移
1788357000000版本记录 0、sys_job_execution_log表 0;JobLog菜单为menu_id=471。/home/goauto/backups/pre-199-20260902-81c1a7e.sql,22,224,274 bytes,SHA-256a6718c8eef4e8a4f66af63a1514961ac83cdcb35babe409121198b9487b1ef71,已确认 dump 完成标记,权限 600。1788357000000_sys_job_execution_log.go,结果“新执行 1 个,跳过已应用 36 个”。id=10280唯一,并已关联JobLog(471)。JobLog菜单,因此按 fail-closed 方案未扩大 Casbin 角色授权(精确策略 0 条);系统管理员由既有rolekey=admin中间件规则直接授权。采购员没有该菜单,未新增权限。发布与重启
81c1a7ead226f1c814a7cffdcf29b5770aa21996。/home/goauto/releases/20260902-aa2ecc6-r1(保留用于代码回滚)。/home/goauto/releases/20260902-81c1a7e-r1;当前 symlink 已原子切换到该目录。2b0ea778efcddb64ff8f05fa6c22ecbb38179401c89d5de8af8fdc9ce3161125。16772ec2cd3c41f2661fcea35167303190e6df82feaab2de91cdab64ce5c7f94。goauto.service:active,进程实际指向新 release,2026-09-02 23:37:39 CST 启动,本机健康检查 HTTP 200。systemctl show --value,所以脚本退出码为 1;此前切换、两项重启与健康检查均已成功,随后独立复核全部通过,未发生回滚。外网与功能证据
/返回新版主包index.BLjEc8GV.js,动态资源包含execution-log.CX0bHb19.js。JobLog与/execution-logs,不含旧job_log;旧本机 WebSocket127.0.0.1:8000已不存在。GET /api/v1/sysjob/3/execution-logs返回 HTTP 200 + 业务码 401,而非发布前 HTTP 404,证明新 API 路由及认证边界生效。定时任务状态保护
发布前后逐条一致:
http://localhost:8000:status=1(关闭)。ExamplesOne:status=1(关闭)。GoAutoSYBHourlySync:status=2(原本开启,保持开启),entry_id=1。GoAutoShopeeSpecAutoMatch:status=1(关闭)。GoAutoSYBSpecAIParse:status=1(关闭)。未手工触发任何定时任务,未调用 AI,未创建采集/采购任务或订单,未执行 Android 动作和付款。发布方式没有改变长期运维事实,因此不重复更新 Wiki。
待人工验收
当前没有可用的已登录浏览器控制会话,未读取 Cookie/localStorage、未伪造管理员 Token。请在现有 Admin 页面强制刷新或重新登录,单选“SYB 每小时自动同步”后点击“日志”:应进入
JobLog?jobId=3,当前显示“该任务尚无执行记录”;下一次正常调度后应出现一条执行历史。复测补充(2026-09-03 08:49 CST):用户反馈在定时任务页勾选“蝦皮规格自动匹配”后点击日志仍无界面反应。
只读核验与受控重启结果:
/home/goauto/releases/20260902-81c1a7e-r1,GoAuto/Nginx 已于 08:49:39 CST 重启并均为 active。sys_job状态一致:仅“SYB 每小时自动同步”为启用(status=2, entry_id=1);“蝦皮规格自动匹配”等其余任务均保持关闭(status=1, entry_id=0),本次未触发任务。sys_job_execution_log已有 9 条持久化记录,均为 SYB 定时执行;后端记录链路有效。JobLog菜单名、/schedule/log路径与前端this.$router.push({name:'JobLog', query:{jobId}})一致,未发现路由/权限或部署版本错配。index.BLjEc8GV.js。当前判断:问题位于浏览器端交互/已加载 SPA 状态,而不是服务未重启或后端日志表缺失。需在浏览器强制刷新(Ctrl+F5)或退出后重新登录,再明确执行“勾选行复选框 → 点击工具栏【日志】”;直接点击任务名称/任务行按现有 v1 设计不会跳转。如强刷后按上述路径仍无反应,需要采集该浏览器控制台/当前路由证据,再决定是否在 #199 内追加路径导航兜底与可见错误提示。
Gitea MCP 当前会话不可用,本评论按仓库规则回退 Gitea API 写入;未记录任何凭据。
本地复现根因补充(2026-09-03):
8010API(PID 35088)及9527Vite Web(PID 59496)实际均从D:\OPC\goauto-worktrees\issue-195启动,基线为f27ec1630788ac9a6a8287caf65e486ba3e3abce,不是 #199 的81c1a7e。GET http://127.0.0.1:8010/info返回 200;GET /api/v1/sysjob/4/execution-logs返回 HTTP 404,证明本地 API 未包含 #199。/src/views/schedule/index.vue,handleLog()仍为this.$router.push({ name: 'job_log' })。数据库迁移后的目标路由名为JobLog,旧页面无法解析命名路由,且旧实现无失败提示,因此表现为点击无反应。schedule-execution-log.spec.js定向测试通过(3/3),有效单选生成{name:'JobLog', query:{jobId:'5'}}。结论:本次本地问题是启动目录/版本错误,不是“蝦皮规格自动匹配”任务数据或 #199 新接口本身异常。后续应先正常停止当前 #195 的 Server/Web,再从 #199 工作树启动两端并做浏览器验收。
Gitea MCP 当前会话不可用,本评论按仓库规则回退 Gitea API写入;未记录任何凭据。
本地 main/Supervisor 收口完成(2026-09-03 09:05 CST),等待人工验收:
D:\OPC\goauto中 #190 分支及未提交文件,新建干净运行工作树D:\OPC\goauto-worktrees\main-runtime。main从37dea33以 fast-forward 合并 #190/#194/#195/#197/#198/#199 的完整依赖链 11 个提交至81c1a7e,并已推送origin/main;本地 main 与远端一致。D:\OPC\goauto-backups\pre-main-199-20260903-090212.sql,22,313,117 bytes,SHA-256A696972FD23E1E9D3B0EE7749199AD4BA329944279EFCECD3CA89A43C0B89592。issue-195改为main-runtime,GoAuto API/UI 已定向重启;当前均为 Running,启动脚本来源为 main-runtime,GET /info返回 200。1788354164329、1788357000000已执行;三项链路迁移均各有记录,sys_job_execution_log表存在,JobLog菜单为/schedule/log。jobLogRoute(this.ids)。yovision-sense;已立即执行 stop,当前 PID=0、无进程(Supervisor 状态仍显示其既有 Backoff 失败标记),未修改该实例配置。其他既有服务 PID 未变化。请在
http://127.0.0.1:9527强制刷新或重新登录后,勾选“蝦皮规格自动匹配”并点击工具栏“日志”完成真实页面验收。Gitea MCP 当前会话不可用,本评论按仓库规则回退 Gitea API 写入;未记录任何凭据。