status: applied created: 2026-06-28 原则:No Spec No Code;首期不重写低代码运行底层;不新增独立审批引擎;业务应用绑定流程时应用配置只维护流程关联、业务表单资产目录和变量映射,节点业务表单和字段权限在流程设计器节点配置中维护,运行时优先读取 BPMN 节点配置,
nodeForms仅作兼容兜底;标准 BPMN 与钉钉样式设计器都必须兼容。
spec.md 的架构边界和任务拆分。code-copilot/memory/pitfalls.md、code-copilot/memory/decisions.md、code-copilot/memory/preferences.md。code-copilot/rules/automated-testing-standard.md 并追加 execution-log.md。code-copilot/changes/unified-business-flow-app-config/spec.md — 新增,记录需求规格。code-copilot/changes/unified-business-flow-app-config/tasks.md — 新增,记录任务拆分。code-copilot/changes/unified-business-flow-app-config/test-spec.md — 新增,记录测试策略。code-copilot/changes/unified-business-flow-app-config/execution-log.md — 新增,记录执行日志。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessFlowAppConfigDTO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessFlowAppConfigVO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowAppConfigService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessFlowAppConfigController.javajava
public BusinessFlowAppConfigVO getConfig(String objectCode)
public BusinessFlowAppConfigVO saveConfig(String objectCode, BusinessFlowAppConfigDTO dto)
getConfig 根据 objectCode 解析 AiBusinessObject,返回 objectId/suiteCode/objectCode/objectName。BusinessDocumentConfigService#getConfig(objectId) 和 BusinessFlowService#getFlowBinding(objectCode)。BusinessFlowService#getFormAssets(objectCode)。saveConfig 使用 @Transactional,先保存单据配置,再保存流程绑定。ai:businessFlow:config,接口加 @ApiDecrypt、@ApiEncrypt。GET /ai/business/flow-app/config/{objectCode} 能返回统一结构。PUT /ai/business/flow-app/config/{objectCode} 保存后再次查询一致。/ai/business/document/config/{objectId} 和 /ai/business/flow/binding/{objectCode} 保持兼容。forge-admin-ui/src/api/business-app.js — 新增统一配置 API。forge-admin-ui/src/views/app-center/components/designer/BusinessFlowAppConfigPanel.vueforge-admin-ui/src/views/app-center/components/designer/BusinessDocumentPanel.vue — 支持被统一面板作为分区复用或抽取纯配置块。forge-admin-ui/src/views/app-center/components/designer/BusinessFlowBindingPanel.vue — 支持被统一面板作为分区复用或抽取纯配置块。js
export function businessFlowAppConfig(objectCode) {
return request.get(/ai/business/flow-app/config/${objectCode}`)
}export function saveBusinessFlowAppConfig(objectCode, data) {
return request.put(`/ai/business/flow-app/config/${objectCode}`, data)
}
- **工作内容**:
- 面板分区顺序:`基础单据`、`主流程`、`变量映射`、`流程设计器入口`、`触发与发布`。
- 单据分区展示状态字段、编号规则、状态映射。
- 流程分区展示流程模型、发起方式、标题模板、业务记录绑定。
- 节点配置分区不编辑 `nodeForms`,只提供打开流程设计器的入口和当前流程节点摘要。
- 右侧摘要显示状态字段、主流程、节点表单数量、触发器缺口。
- **验收标准**:
- 普通用户可以在一个页面完成“状态字段 -> 主流程 -> 变量映射 -> 打开流程设计器”的连续配置。
- 保存按钮一次保存统一配置。
- 不出现普通用户需要输入 Vue 路径的主入口。
- **本轮补充结果**:
- 统一配置页已按列表设计器风格重构为工作台布局:顶部标题工具栏、配置链路切换条、单一工作区。
- 配置链路从左侧滚动锚点改为真实步骤切换,点击“单据规则 / 流程配置”立即切换当前工作区。
- 统一页嵌入旧单据/流程配置块时隐藏重复标题和右侧摘要,避免卡片堆叠和视觉错位。
- 代码应用模式只展示业务接入状态和流程绑定,不展示低代码单据规则。
- 2026-06-29 继续收敛顶部区域:移除内层对象标题、重复刷新/保存按钮和旧摘要块,父级进入业务流程配置时不再展示侧栏“单据闭环配置”,避免状态信息堆成一行。
- 2026-06-29 进一步移除“自动化触发器 / 发布检查”顶部页签,避免触发器点击跳出当前页面;单据规则和流程配置统一内容宽度、卡片样式、两列布局和响应式规则。
- 2026-06-29 按用户参考图重构为“业务配置中心”样式:面包屑标题、下划线页签、四步横向卡片、浅灰工作区和白色内容卡片。
- 2026-06-29 修正四步卡片和下方内容的真实联动:所有步骤补齐 active 态,点击“编号生成 / 状态字典 / 业务记录绑定 / 变量映射 / 节点表单”会同步切换选中样式和对应内容卡片;下方工作区新增当前配置项标题,明确展示当前页签、步骤标题和说明。
- 2026-06-29 用户复盘后修正产品方向:应用配置页不承载独立节点工作台,只提供打开流程设计器入口;用户在流程画布中选中节点后,在节点配置抽屉的“表单权限”页签配置表单资产和字段权限。
## Task 3:业务对象设计器入口整合与路由兼容
- **目标**:把原“单据设置”和“流程与自动化”收口为统一入口,旧路由继续可用。
- **状态**:completed
- **涉及文件**:
- 修改 `forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue`
- 修改 `forge-admin-ui/src/views/app-center/components/BusinessUnitCard.vue`
- 修改 `forge-admin-ui/src/views/app-center/components/ObjectCard.vue`
- 修改 `forge-admin-ui/src/views/app-center/components/designer/BusinessActionDesigner.vue`
- 修改 `forge-admin-ui/src/views/app-center/components/designer/BusinessPublishChecklist.vue`
- **关键函数**:
```js
function normalizePanel(panel) { }
function handleFlowAppSaved(config = {}) { }
flow-app,展示 BusinessFlowAppConfigPanel。panel=document 和 panel=automation 自动映射到 flow-app,并传入锚点 document 或 flow。?panel=flow-app§ion=document|flow|nodeForms|trigger。options/designerOptions.codeApp=true。flow-app 面板。forge-admin-ui/src/views/app-center/components/designer/BusinessFlowFormAssetSelect.vueforge-admin-ui/src/views/app-center/components/designer/BusinessFlowBindingPanel.vueforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessCodeFormProviderRegistry.javaforge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/provider/SamplePurchaseOrderCodeFormProvider.javajava
public Map<String, Object> getFormAssets(String objectCode)
public List<Map<String, Object>> listAssets(String objectCode)
formMode/formKey/formName/providerKey/providerName/formUrl/fields/supportsSave/description。buildFields() 输出到 fields,用于前端字段权限选择。formKey/formName,保存流程后进入 BPMN 节点配置。arrivalListFileIds 只在部门负责人节点可写。/business/purchase-order-test。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessTaskFormSaveDTO.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessTaskFormContextVO.javaforge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/provider/SamplePurchaseOrderCodeFormProvider.javajava
private BusinessTaskFormSaveDTO filterSaveDataByPermissions(BusinessTaskFormSaveDTO dto,
List<Map<String, Object>> permissions)
private Map<String, Object> filterVisibleRecordData(Map<String, Object> recordData,
List<Map<String, Object>> fields)
BUSINESS_OBJECT_FORM 保持现有可写字段过滤。BUSINESS_CODE_FORM 调用 Provider 前先按 fieldPermissions.writable 过滤 dto.data。task-form-context/readonly 对低代码和代码表单都强制 writable=false/readonly=true/disabled=true。forge-admin-ui/src/components/bpmn/NodePropertiesPanel.vueforge-admin-ui/src/components/flow-designer/DingFlowDesigner.vueforge-admin-ui/src/components/flow-designer/panel/NodeConfigDrawer.vueforge-admin-ui/src/components/flow-designer/panel/ApproverConfig.vueforge-admin-ui/src/components/flow-designer/panel/FormPermissionConfig.vueforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectReadinessService.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.javaforge-admin-ui/src/views/app-center/components/designer/BusinessPublishChecklist.vueforge-admin-ui/src/views/app-center/object-designer.[objectCode].vuejava
private BusinessReadinessItemVO checkDocumentClosureStatus(AiBusinessObject object, Long tenantId)
private List<String> validateNodeFormAssets(JSONObject bindingConfig, String objectCode)
DOCUMENT_CLOSURE_STATUS 增加节点表单缺口校验。BUSINESS_CODE_FORM 校验 Provider 是否注册、资产是否存在。flow-app 对应分区。forge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/support/SamplePurchaseOrderFlowBpmn.javaforge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/service/SamplePurchaseOrderService.javaforge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/service/impl/SamplePurchaseOrderServiceImpl.javaforge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/provider/SamplePurchaseOrderCodeFormProvider.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.javaforge-admin-ui/src/views/flow/todo.vueforge-admin-ui/src/views/flow/done.vueforge-admin-ui/src/views/business/purchase-order-test.vueforge-server/db/migration/V1.0.82__seed_sample_purchase_order_flow_binding.sqlforge-server/db/migration/V1.0.83__seed_sample_purchase_order_app_center_entry.sqlforge-server/db/migration/V1.0.84__extend_sample_purchase_order_form_asset_fields.sqlnodeForms 仅作历史兼容兜底。formUrl,每个人工节点写入 flowable:formKey=sample_purchase_order_approval_form 和节点 formFieldPermissions。arrivalListFileIds/deptLeaderRemark 等字段。task-form-context / readonly 的统一业务表单上下文渲染代码业务表单,完整业务页只作为跳转入口。supportsSave 和代码优先上下文兼容,纯代码业务没有低代码 configKey 时也能进入 Provider 表单上下文。V1.0.82__seed_sample_purchase_order_flow_binding.sql,把采购单默认节点表单和字段权限写入 ai_business_binding.binding_config.nodeForms,且带 NOT EXISTS 防重复保护。V1.0.83__seed_sample_purchase_order_app_center_entry.sql,把采购单审批测试放到应用中心“采购”业务域下,并创建 采购申请 业务对象和 采购单审批测试 应用入口。V1.0.84__extend_sample_purchase_order_form_asset_fields.sql,补充申请人修改节点的 needDate 字段权限,避免已执行旧 seed 的环境缺少该字段。flowable:formUrl,改为在人工节点写入 flowable:formKey 和 flowable:formFieldPermissions,确保运行时读取流程节点配置。sample_purchase_order 没有低代码业务对象时,仍可通过代码表单资产进入 GET/PUT /ai/business/flow-app/config/{objectCode}。/app-center/object-designer/sample_purchase_order?panel=flow-app&codeApp=1。nodeForms 只保留兼容旧数据兜底。code-copilot/changes/unified-business-flow-app-config/test-spec.mdcode-copilot/changes/unified-business-flow-app-config/execution-log.mdcode-copilot/memory/pitfalls.md 或 code-copilot/memory/decisions.mdbash
cd forge-server
JAVA_HOME=$(/usr/libexec/java_home -v 17) PATH="$JAVA_HOME/bin:$PATH" mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am -DskipTests compile
bash
cd forge-server
JAVA_HOME=$(/usr/libexec/java_home -v 17) PATH="$JAVA_HOME/bin:$PATH" mvn -pl forge-business/forge-business-core -am -DskipTests compile
bash
cd forge-admin-ui
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm exec eslint src/api/business-app.js src/views/app-center/components/designer/BusinessFlowAppConfigPanel.vue src/views/app-center/components/designer/BusinessFlowFormAssetSelect.vue src/components/bpmn/NodePropertiesPanel.vue src/components/flow-designer/DingFlowDesigner.vue
bash
cd forge-admin-ui
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm build
bash
git diff --check
forge-admin-ui/src/views/app-center/components/designer/BusinessFlowBindingPanel.vueforge-admin-ui/src/views/flow/design.vueforge-admin-ui/src/components/flow-designer/DingFlowDesigner.vueforge-admin-ui/src/components/flow-designer/panel/NodeConfigDrawer.vueforge-admin-ui/src/components/flow-designer/panel/ApproverConfig.vueforge-admin-ui/src/components/flow-designer/panel/FormPermissionConfig.vueforge-admin-ui/src/components/bpmn/NodePropertiesPanel.vueforge-server/forge-flow/forge-flow-client/src/main/java/com/mdframe/forge/flow/client/FlowClient.javaforge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.javaforge-server/forge-business/forge-business-core/src/main/java/com/mdframe/forge/business/core/purchase/support/SamplePurchaseOrderFlowBpmn.javaBusinessFlowBindingPanel.vue 移除应用配置内的独立节点配置工作台,改为展示“流程节点配置”入口卡片。/flow/design,携带 id/businessObjectCode/codeApp/source=appCenter。flow/design.vue 在携带业务对象上下文时读取业务表单资产,构造流程设计器节点表单资产选项和字段目录。DingFlowDesigner -> NodeConfigDrawer -> ApproverConfig 透传节点可选表单资产。config.formKey/formName/formType,保存流程时由现有 BPMN writer 写入 flowable:formKey。config.formFieldPermissions,保存流程时写入 flowable:formFieldPermissions。FlowClient#getTaskFormInfo(taskId) 优先读取流程节点 formKey/formUrl/formFieldPermissions,找不到时才回退历史 BusinessFlowBinding.nodeForms。flowable:formKey 和节点字段权限,seed 中 nodeForms 标注为兼容兜底。sample_purchase_order 业务字段目录。formKey/formFieldPermissions 生效。execution-log.md 记录命令、结果、跳过项和未联调原因。businessFlowFormAssets(objectCode),节点抽屉可选择业务表单资产并使用对应字段目录。审批办理 / 表单权限 / 审批权限 / 扩展配置,其中“表单权限”包含表单资产选择和字段权限矩阵。nodeForms 只作兜底。formKey/formFieldPermissions,与运行时读取路径一致。sample_purchase_order 缺少低代码 configKey 时,后端改从 BusinessCodeFormProviderRegistry 读取代码表单 Provider 暴露的 fields/fieldCatalog,前端变量映射左侧单据字段同时合并接口返回的 fieldCandidates。