一周开发复盘(技术版):审批待办链路重构与稳定性治理h1
时间:2026-03-16 ~ 2026-03-20
关键词:flowable、待办分流、审批详情、时间线组件、WebStorm MCP、OpenSeadragon
1. 问题背景h2
本周核心不是”修一个页面”,而是把审批相关能力从点状修补改成链路治理:
- 待办接口新增审批类型,现有渲染逻辑无法稳定识别。
- 审批列表、详情页、进度组件的字段契约不统一。
- Tab 切换和跳转链路在多入口下容易出现状态错乱或重复打开。
- 图像组件(OpenSeadragon)在首屏渲染存在延迟显示问题。
- 协作过程中文件引用和跨文件定位成本较高。
2. 架构目标h2
这周改造围绕三个目标推进:
- 数据契约统一:接口返回先归一化,再驱动 UI。
- 页面链路统一:待办 → 审批表 → 详情 → 进度,保持单向可追踪。
- 工具链统一:查文件、查引用优先走 WebStorm MCP,减少漏改风险。
3. 待办数据模型归一化h2
待办接口里审批类型典型特征:
bizCode = DB-ZX-FLOWABLE-0001backlogUrl指向approval/flowable/detail?processInstanceId=...backlogContent为 JSON 字符串(需容错解析)
3.1 归一化策略h3
type TodoType = 'WORK_ORDER' | 'APPROVAL' | 'UNKNOWN'
function safeParseContent(content?: string) { if (!content) return [] try { return JSON.parse(content) } catch { return [] }}
function detectTodoType(item: any): TodoType { if (item?.bizCode === 'DB-ZX-FLOWABLE-0001') return 'APPROVAL' if (String(item?.backlogUrl || '').includes('approval/flowable/detail')) return 'APPROVAL' return 'WORK_ORDER'}
function normalizeTodoItem(item: any) { const type = detectTodoType(item) return { id: item.pkId || item.idBill, type, title: item.backlogTitle || '', actionText: item.backlogButton || '去处理', detailUrl: item.backlogUrl || '', detailPairs: safeParseContent(item.backlogContent), carNo: item.carNo || '', customerName: item.customerName || '', createTime: item.createTime || '' }}3.2 为什么先归一化h3
- 降低模板中
if/else复杂度。 - 页面不会直接依赖后端字段细节。
- 新审批类型扩展时仅需改一处映射。
4. 审批列表与 businessStatus 传参h2
审批列表支持基于业务状态筛选。关键点不是”加参数”,而是保证默认态和切换态一致:
- 初始加载必须带默认
businessStatus(避免首屏与筛选后结果不一致)。 - Tab/筛选切换后,重置页码并重新请求。
- 保持参数来源单一,避免 URL、store、本地状态多头维护。
const statusMap = { all: '', pending: 'approvalStart', running: 'approvalRunning', passed: 'approvalPass', rejected: 'approvalReject'}
function buildHistoryQuery(form: any, tabKey: keyof typeof statusMap) { return { processDefinitionKey: 'refundApprovalJiangSupecProcess', currentPage: form.pageNum || 1, pageSize: form.pageSize || 10, businessKey: form.businessKey || '', businessStatus: statusMap[tabKey] ?? '', startTimeStart: form.startTimeStart || '', startTimeEnd: form.startTimeEnd || '', endTimeStart: form.endTimeStart || '', endTimeEnd: form.endTimeEnd || '' }}5. 审批详情与时间线组件重构h2
这周把时间线组件输入收敛为三段式:
triggerTask:发起节点(发起人、发起时间、发起原因)currentTasks:当前执行节点historicTasks:已执行节点
5.1 统一时间线节点模型h3
type TimelineStatus = 'completed' | 'active' | 'pending'
function toTimelineNodes(triggerTask: any, currentTasks: any[], historicTasks: any[]) { const startNode = { nodeId: 'trigger', name: triggerTask?.initiatorName || '发起人', status: 'completed' as TimelineStatus, time: triggerTask?.startTime || null, desc: triggerTask?.reason ? `发起申请(原因:${triggerTask.reason})` : '发起申请' }
const history = (historicTasks || []).map((x) => ({ nodeId: x.taskId || x.taskDefinitionKey, name: x.taskName || '审批节点', status: 'completed' as TimelineStatus, time: x.endTime || x.startTime || null, desc: x.comment || '' }))
const current = (currentTasks || []).map((x) => ({ nodeId: x.id || x.taskDefinitionKey, name: x.name || '审批节点', status: 'active' as TimelineStatus, time: null, desc: '' }))
return [startNode, ...history, ...current]}5.2 收益h3
- 组件只关心展示,不关心接口差异。
- 当前/历史状态颜色与文案可以纯函数化配置。
- 后续新增三级审批、驳回重提时可直接扩展节点映射。
6. TabbedFrame 与跳转策略h2
针对”审批/工单”分流,核心策略是避免重复 Tab 与状态串扰:
- Tab key 使用
route + stableQuery生成。 - 切换到审批 Tab 时,统一跳转审批列表入口。
- 保留已打开页签的上下文,不在切换时销毁无关页签状态。
function makeTabKey(path: string, query: Record<string, any>) { const q = new URLSearchParams(Object.entries(query).sort()).toString() return `${path}?${q}`}7. OpenSeadragon 首屏不显示问题处理思路h2
问题表现:普通图片加载后首次不显示,缩放后出现。
这类问题通常来自”容器布局完成时机”和”viewer 首帧重绘”不一致。
处理思路:
- 在
open事件后触发一次强制重绘/约束刷新。 - 保证容器可见且尺寸稳定后再初始化 viewer。
- 异步布局场景下在
nextTick/requestAnimationFrame后执行一次goHome或applyConstraints。
8. 研发方法:WebStorm MCP 驱动排查h2
本周把”查文件/查引用”流程固化成 MCP 优先,带来两个直接收益:
- 巨模块改造时,引用链更完整,不容易漏点。
- 方案评估速度更快,先确认影响面再改代码,返工更少。
9. 本周交付与下周计划h2
本周交付h3
- 审批待办逻辑增强提交:
da07e8e - 审批链路关键页面完成数据契约梳理
- MCP 协作流落地并纳入日常开发约束
下周计划h3
- 完成”待办 → 审批表 → 详情 → 进度”全链路联调
- 补齐回归测试清单:
businessStatus、Tab 切换、审批类型渲染、图像首屏 - 输出字段映射文档(接口字段 → 领域模型 → 组件 props)
10. 复盘结论h2
这周最大的变化不是”多修了几个 bug”,而是把审批业务从”页面逻辑”提升到”领域模型 + 链路治理”。
一旦模型稳定,UI 只是渲染层,后续新增审批类型和流程节点的成本会明显下降。
技术栈:React、TypeScript、Flowable、WebStorm MCP
相关组件:审批列表、审批详情、时间线组件、TabbedFrame、OpenSeadragon
讨论
评论