采购审批这类代码实现的业务表单当前通过 BusinessCodeFormProvider 接入流程。以 SamplePurchaseOrderCodeFormProvider 为例,表单资产、字段目录、字段展示名称和组件类型都写在 Provider 代码里。应用管理里只能看到“业务流程配置”,业务管理员无法调整字段目录、表单资产名称、列表/详情字段展示。
待办审批页已经改为通过代码表单组件渲染,但自定义 Vue 表单只有显式使用 useBusinessTaskFormContext 返回的权限 API 时,字段显示/编辑权限才会生效。列表和详情页目前是业务页面硬编码列与表单项,平台没有统一配置入口控制显示隐藏。
2026-06-30 需求修正:代码应用不能在“业务流程配置”里新增一套“字段与视图”配置面板。应用管理左侧本来已有“表单设计”“列表设计”“详情设置”组件,代码应用必须复用这些组件和既有 formDesignerSchema/viewSchema 协议。
2026-06-30 缺陷修正:采购单示例发起流程时会调用 ensureFlowModel(),旧逻辑只要发现数据库中的 BPMN XML 与 SamplePurchaseOrderFlowBpmn.build() 不一致就更新模型并发布,导致流程设计器节点抽屉里配置的 formFieldPermissions 被示例代码回写覆盖。审批页同时存在只传 taskId 时不加载业务表单上下文、顶部采购单信息只按详情视图不按节点权限过滤的问题。
2026-06-30 兼容修正:代码应用进入表单设计、列表设计时必须先读取当前 Provider/业务表字段作为基准,再叠加用户保存的显示配置。旧实现一旦保存 metadata.fields 后就把它当成唯一来源,业务代码新增字段不会再进入设计器;表单设计删除/隐藏字段也没有反写到运行态可见性,导致代码实现的业务表单仍然全部展示。
2026-06-30 性能与展示修正:待办/已办/我发起列表和详情抽屉中的流程节点名称不能把 dept_leader_approve 这类技术编码展示给业务用户;待办列表业务摘要增强和审批表单上下文加载不能在同一请求内对同一业务对象重复解析 ai_business_document_config。
2026-06-30 审批表单加载性能修正:流程服务返回待办表单信息时,不能把 Flowable 的 UUID 型 processDefinitionId 当成业务流程 model_key 查询 sys_flow_model;业务代码表单 sample_purchase_order_approval_form 也不能被误判为动态表单去查 sys_flow_form。
2026-06-30 运行时校验修正:待办业务表单加载时,前端、流程任务表和 Flowable 运行时可能分别携带业务流程模型 Key、key:version:id 或历史 UUID 型流程定义标识。业务侧不能直接字符串比较这些表示,否则会误报“流程定义与当前任务不匹配”。
2026-06-30 待办详情首屏性能修正:待办审批详情打开时,父级抽屉已经请求了业务表单上下文,但业务代码表单组件仍会重复请求同一上下文、代码应用配置和采购单详情,导致采购审批表单首屏需要 7-8 秒才出现。父级加载结果应作为业务组件首屏数据源复用。
2026-06-30 流程定义校验复发修正:首屏性能优化后,待办抽屉并行请求业务表单上下文时仍可能从待办列表行带入未归一化的 processDefKey。列表行、任务表单信息和 Flowable 运行时的流程定义表示可能不同,业务上下文首个请求应只以 taskId 作为可信任务身份输入,由后端任务详情补齐流程实例、业务 Key、节点和归一化流程定义信息。
2026-06-30 审批详情性能复查:日志显示采购审批详情打开时,前端直接请求 /api/flow/task/form/{taskId},业务表单上下文后台又通过 FlowClient 请求同一接口,导致同一个任务表单信息加载两次。单次 getTaskFormInfo 内部还存在流程模型和 BPMN 节点重复解析,并且业务表单场景无意义查询 sys_flow_form_instance。业务表单详情应以业务上下文为首屏主数据源,动态/外部表单才补查流程表单接口。
2026-06-30 应用中心业务单元维护缺口:低代码应用和代码应用进入应用中心后,业务单元只能新建、设计、启停和删除,缺少编辑基础信息与调整归属业务域的入口。后端虽然有业务对象更新接口,但跨业务域修改只更新对象本身会导致访问入口、设计版本、触发器和单据配置仍停留在旧业务域,形成配置割裂。
2026-06-30 业务单元显示字段配置收敛:创建业务单元时字段尚未设计完成,要求用户手输“显示字段”不符合使用场景。关联关系设计器已经提供“运行态显示字段 / 目标对象回显字段”的下拉配置,业务单元基础信息只保留后续对象设计器中的默认标题字段作为兜底。
2026-06-30 应用配置易误操作修正:业务表单资产配置只能新增不能移除,Provider 默认资产即使用户不想使用也会在刷新后重新出现;采购审批示例直接硬编码流程标题,未消费应用管理中的流程标题模板;业务单元和业务域的停用操作缺少二次确认,编辑抽屉中切换启用状态也可能绕过确认。
2026-06-30 采购审批驳回状态修正:采购审批节点点击驳回后,采购单状态仍停留在 IN_PROCESS。采购单状态机依赖流程 TASK_COMPLETED 回调里的 approvalResult=reject,但流程任务完成监听器在 Flowable 任务完成事件中读取流程变量存在时序风险,导致业务回调没有可靠拿到驳回动作变量。
2026-06-30 采购审批驳回状态二次修正:验证后仍出现采购单状态未从 IN_PROCESS 切到 NEED_MODIFY,但流程已经进入“申请人修改”节点,重新提交又因状态不是待修改被拦截。业务状态不能只依赖上一个审批任务完成事件的变量,还必须以“申请人修改任务创建”作为状态同步事实,并兼容已错过事件的存量待办在保存时自愈。
2026-06-30 采购审批重新提交状态修正:申请人修改后重新提交,流程已经进入下一轮审批节点,但采购单状态仍停留在 NEED_MODIFY。业务状态必须继续以当前实际任务节点兜底同步:进入任一审批节点时状态应为 IN_PROCESS,不能只依赖申请人修改任务完成事件。
2026-06-30 采购审批存量状态对账:已经错过流程事件的存量采购单,不会再次触发 TASK_CREATED。采购单列表/详情加载时也需要按当前活跃待办节点做轻量状态对账,让已进入审批节点但仍显示 NEED_MODIFY 的记录刷新后自动恢复为 IN_PROCESS。
fields/recordData 必须按节点字段权限裁剪,自定义 Vue 表单通过统一上下文 API 生效。ai_business_binding.binding_config.options.codeAppMetadata。codeAppMetadata 存储在流程绑定 options 下:
{
"codeAppMetadata": {
"objectCode": "sample_purchase_order",
"formAssets": [
{
"formKey": "sample_purchase_order_approval_form",
"formName": "采购单审批表单",
"formMode": "BUSINESS_CODE_FORM",
"providerKey": "samplePurchaseOrder",
"formUrl": "/business/purchase-order-test",
"fields": []
}
],
"fields": [
{
"field": "title",
"fieldCode": "title",
"label": "采购主题",
"componentType": "input",
"visible": true,
"readonly": false,
"internal": false,
"systemField": false
}
],
"formDesignerSchema": {
"schemaVersion": "form-first-v2",
"mode": "multi",
"settings": { "formAssets": [] },
"forms": []
},
"viewSchema": {
"schemaVersion": "view-schema-v1",
"search": { "fields": [], "settings": {} },
"list": {
"columns": [
{ "fieldCode": "orderNo", "label": "采购单号", "visible": true, "order": 0 },
{ "fieldCode": "title", "label": "采购主题", "visible": true, "order": 1 }
],
"settings": {}
},
"detail": {
"sections": [
{
"sectionKey": "basic",
"title": "基础信息",
"visible": true,
"order": 0,
"fields": [
{ "fieldCode": "orderNo", "label": "采购单号", "visible": true, "order": 0 },
{ "fieldCode": "title", "label": "采购主题", "visible": true, "order": 1 }
]
}
],
"settings": {}
},
"overrides": {}
}
}
}
fields/modelSchema/formDesignerSchema/viewSchema/pageSchema。BusinessFormDesigner,保存输出 formDesignerSchema 和字段资产。BusinessListDesigner,保存输出 viewSchema.list.columns。BusinessDetailDesigner,保存输出 viewSchema.detail.sections。options.codeAppMetadata,不能丢失已有流程模型、变量映射和业务绑定配置。BusinessFlowService#getFormAssets(objectCode) 返回配置化资产;无配置时返回 Provider 默认资产。providerKey/formUrl/formMode/supportsSave。BusinessFlowAppConfigService 返回 options.codeAppMetadata,保存代码应用配置时把 DTO options 写入流程绑定 options。formDesignerSchema.settings.formAssets 兼容输出,不新增表单设计协议。formFieldPermissions 为边界。readable=false 的字段才隐藏。useBusinessTaskFormContext.canShowField/canEditField/fieldPermission 控制显示、禁用和校验。BusinessFlowService 读取节点权限时优先按 taskId 获取任务表单信息;当只有 processInstanceId/businessKey/processDefKey/taskDefKey 时,必须通过流程表单信息接口兜底读取 BPMN 节点配置。businessKey/recordId/taskDefKey 渲染页面,不能因页面未传业务单 ID 而跳过字段权限加载。viewSchema。viewSchema.list.columns 配置过滤和排序。viewSchema.detail.sections 配置显示/隐藏。codeAppMetadata 的代码应用仍使用现有 Provider 默认字段。SamplePurchaseOrderServiceImpl#ensureFlowModel 只在流程模型不存在时创建默认 BPMN。updateModel 覆盖已有 XML。codeAppMetadata.fields/formAssets 只作为标签、显隐、排序、组件显示属性的覆盖层。visibility.hidden 同步为 fields[].formVisible。fields[].formVisible=false 并裁剪字段,采购审批自定义 Vue 表单也必须通过 useCodeAppMetadata 消费 FORM 显隐配置。appName/objectName/businessName/formKey/formName/formUrl/description/providerKey 等资产信息。formMode=BUSINESS_CODE_FORM、supportsSave、字段目录等运行能力由 Provider 或平台推导;用户不需要手写 JSON。providerKey 应来自已注册 Provider 或当前 Provider 默认值;用户可以确认/选择,但不应靠业务代码里散落 asset.put(...) 作为主配置。fields/fieldCatalog 以当前业务表/Provider 字段目录为基准,应用管理只配置标题、排序、显示隐藏等通用属性。ai_business_binding.binding_config.options.codeAppMetadata.formAssets,不新增数据库表;未保存配置时才使用 Provider 返回的默认资产兜底。codeAppMetadata.formAssets。formType=business 以及 formKey/formName/formMode/providerKey/formUrl/formRef 等引用信息。dynamic/external/none 动态表单设计能力。modelId/modelCode/options 等隐藏配置。suite_code。codeAppMetadata.removedFormAssetKeys。formAssets 时不得再次自动补回;用户通过新增重新添加时应清除对应移除标记。titleTemplate,按业务数据替换 ${field} 和 {field};未配置时继续使用原有采购单号兜底标题。approvalResult/approved。approvalResult=reject 字符串,应同时兼容 approved=false。NEED_MODIFY,申请人修改节点选择终止/驳回时更新为 REJECTED。IN_PROCESS,必须兜底同步为 NEED_MODIFY。IN_PROCESS 的存量待办,保存申请人修改节点字段时必须先自愈为 NEED_MODIFY,避免重新提交被状态机拦截。NEED_MODIFY,必须兜底同步为 IN_PROCESS。NEED_MODIFY 的存量待办,保存审批节点字段时必须先自愈为 IN_PROCESS,避免后续审批保存被状态机拦截。IN_PROCESS/NEED_MODIFY 两类流转中状态做对账,修复已经错过事件的存量记录。options.codeAppMetadata.formDesignerSchema/viewSchema。viewSchema.list.columns 变化,详情弹窗按 viewSchema.detail.sections 变化。SamplePurchaseOrderCodeFormProvider 或示例 BPMN 重置。taskId 或只传 processInstanceId + taskDefKey 时,仍能读取 BPMN formFieldPermissions 并按权限隐藏字段。NEED_MODIFY;申请人修改节点重新提交后回到 IN_PROCESS;申请人选择终止后进入 REJECTED。dept_leader_approve;列表批量处理错误提示、已办和我发起页面也使用相同节点展示规则。ai_business_document_config 解析应在本次列表请求内复用,审批表单上下文加载不应先解析一次业务对象再重复查询运行配置和单据配置。sys_flow_model.model_key 查询参数必须是业务流程模型 Key,不应出现 UUID 型 processDefinitionId;业务代码表单不应触发 sys_flow_form.form_key=sample_purchase_order_approval_form 的动态表单查询。sample_purchase_order、sample_purchase_order:3:xxx 和历史 UUID 型流程定义标识应按兼容规则处理,不应误报“流程定义与当前任务不匹配”。businessFormContext.recordData 应直接传给业务表单组件用于首屏渲染,不应再重复请求 /ai/business/flow/task-form-context、代码应用配置和采购单详情接口。taskId,不能把待办列表行里可能过期或未归一化的 processDefKey 带入任务身份校验。/api/flow/task/form/{taskId},由 /ai/business/flow/task-form-context 后台解析后返回业务表单上下文和审批策略。FlowTaskServiceImpl#getTaskFormInfo 单次调用内不应重复查询 sys_flow_model 或重复解析 BPMN 节点;业务表单不应查询 sys_flow_form_instance 快照。dept_leader_approve、engineering_manager_approve 等技术编码,应展示业务可读节点名称。{orderNo}、${title} 等字段时,发起流程后的标题应按模板生成,而不是固定 采购单审批-采购单号。IN_PROCESS 更新为 NEED_MODIFY,不能继续显示“审批中”。| 任务 | 状态 | 说明 |
|---|---|---|
| Task 1 | completed | SDD 文档与配置协议 |
| Task 2 | completed | 后端元数据保存与合并 |
| Task 3 | completed | 代码应用复用既有表单/列表/详情设计器 |
| Task 4 | completed | 采购审批列表/详情消费视图配置 |
| Task 5 | completed | 验证与执行日志 |
| Task 6 | completed | 修复示例 BPMN 覆盖和待办字段权限运行态 |
| Task 7 | completed | 修复代码应用字段基准合并、默认 schema 补齐和表单显隐运行态 |
| Task 8 | completed | 业务表单资产可视化配置、流程全局表单引用应用表单资产、采购审批样板收敛 |
| Task 9 | completed | 业务表单资产重复名称收敛、Provider 来源提示、左侧设计器空 schema 补齐 |
| Task 10 | completed | Provider Bean 目录下拉、表单 Key 系统引用、代码应用字段目录从 Provider 兜底 |
| Task 11 | completed | 已有业务对象的代码应用强制进入 Provider 字段设计器路径,并修复 metadata 保存 |
| Task 12 | completed | 待办节点展示去除技术编码,列表/审批表单业务上下文解析去重 |
| Task 13 | completed | 审批表单加载修正 processDefinitionId 误当 modelKey、业务代码表单误查动态表单和重复表单信息调用 |
| Task 14 | completed | 修正流程定义多种表示直接字符串比较导致的待办业务表单误拦截 |
| Task 15 | completed | 待办审批详情表单首屏复用父级业务上下文,减少串行和重复请求 |
| Task 16 | completed | 首个业务上下文请求只信任 taskId,流程定义表示差异不再硬失败 |
| Task 17 | completed | 审批详情业务表单去掉重复 task/form 请求,后端单次表单解析去重 |
| Task 18 | completed | 采购审批业务表单内部节点标签不再显示 taskDefKey 技术编码 |
| Task 19 | completed | 应用中心业务单元编辑入口、归属业务域修改和关联配置迁移 |
| Task 20 | completed | 新建/编辑业务单元移除显示字段手填,关联回显收敛到关联关系配置 |
| Task 21 | completed | 业务表单资产移除、采购审批流程标题模板生效、业务域/业务单元停用确认 |
| Task 22 | completed | 采购审批驳回后状态从审批中流转为待修改 |
| Task 23 | completed | 申请人修改任务创建同步待修改状态,并兼容存量待办保存前自愈 |
| Task 24 | completed | 申请人修改后重新提交同步审批中状态,并兼容存量审批待办保存前自愈 |
| Task 25 | completed | 采购单列表/详情按当前活跃待办节点对账修复存量状态 |