feat(scheduler): 财务管道自动注册、水位记录与后台状态页

- 老配置读取时自动补齐六个管道任务,升级后无需手工添加
- 每个管道运行后写水位与 last_success_at,失败写 last_error
- 新增 GET /admin/fulfillment/pipeline/status 与单步重跑
- 后台「履约渠道 → 管道状态」展示启停、水位、最近执行与错误
- 定时任务管理接口不再丢弃管道自己的 config 字段
This commit is contained in:
yml2213
2026-10-31 19:13:38 +08:00
parent 2ba2656d58
commit 808949f3b8
7 changed files with 336 additions and 2 deletions
@@ -17,7 +17,14 @@ import {
upsertChannelRule,
} from '../../services/fulfillment/channel-assign-service.js'
import { listExceptionQueue } from '../../services/cost-center/cost-exception-service.js'
import { runFinancePipelineOnce } from '../../services/scheduler/finance-pipeline-jobs.js'
import {
runFinancePipelineOnce,
runSingleFinancePipeline,
} from '../../services/scheduler/finance-pipeline-jobs.js'
import {
getFinancePipelineStatus,
isFinancePipelineName,
} from '../../services/scheduler/finance-pipeline-status.js'
import { bodyOf } from './request-helpers.js'
import { createJsonHandler, requireAdminPermission, requireAdminRoles } from './session.js'
@@ -185,6 +192,16 @@ router.delete(
}),
)
router.get(
'/fulfillment/pipeline/status',
requireAdminPermission('finance.view'),
createJsonHandler(() => getFinancePipelineStatus(), {
successMessage: 'ok',
errorMessage: '读取管道状态失败',
scope: '[admin/fulfillment/pipeline/status]',
}),
)
router.post(
'/fulfillment/pipeline/run',
requireAdminPermission('finance.config'),
@@ -192,6 +209,15 @@ router.post(
async (req) => {
const body = bodyOf(req)
const days = Number(body.days)
// 指定 pipeline 时只跑单步,便于排障与补跑。
if (body.pipeline) {
if (!isFinancePipelineName(body.pipeline)) {
throw new Error(`未知管道:${String(body.pipeline)}`)
}
return runSingleFinancePipeline(body.pipeline, {
config: Number.isFinite(days) ? { days } : {},
})
}
return runFinancePipelineOnce({ days: Number.isFinite(days) ? days : 3 })
},
{