status: apply created: 2026-07-03
lowcode-procurement-warehouse-app 开发。code-copilot/changes/lowcode-procurement-warehouse-app/。变更范围
V1.0.90__seed_procurement_warehouse_lowcode_app.sql。PROCUREMENT_WAREHOUSE、业务套件、10 个低代码模型、10 个业务对象。执行命令与结果
git diff --no-index --check /dev/null forge-server/db/migration/V1.0.90__seed_procurement_warehouse_lowcode_app.sql
/dev/null 对比新增文件,退出码 1 表示存在文件差异;无输出表示 --check 未发现空白错误。rg -n '\$\{[^}]+\}' forge-server/db/migration/V1.0.90__seed_procurement_warehouse_lowcode_app.sql
CONCAT('$', '{formData.xxx}'),避免被 Flyway 当作 placeholder。node -e "const fs=require('fs'); const s=fs.readFileSync(process.argv[1],'utf8'); const q=(s.match(/[']/g)||[]).length; const l=(s.match(/\\(/g)||[]).length; const r=(s.match(/\\)/g)||[]).length; console.log('single_quotes='+q); console.log('left_parens='+l); console.log('right_parens='+r); process.exit((q % 2 || l !== r) ? 1 : 0)" forge-server/db/migration/V1.0.90__seed_procurement_warehouse_lowcode_app.sql
single_quotes=8758、left_parens=723、right_parens=723。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
forge-serverBUILD SUCCESS。变更范围
pw_supplier_material,让 PW_SUPPLIER_MATERIAL 可作为通用记录选择器数据源。master-detail-crud。page_schema.modelRefs 中声明主模型、明细模型和一对多关系。options.masterDetailConfig.children 中配置明细表、saveMode=merge 和 ChildTableEditor 可消费字段。执行命令与结果
rg -n "config_key = 'pw_supplier_material'|layoutType', 'master-detail-crud'|objectCode', 'PW_SUPPLIER_MATERIAL'|saveMode', 'merge'|recordSelector|CONCAT\('\$', '\{formData" forge-server/db/migration/V1.0.90__seed_procurement_warehouse_lowcode_app.sql
merge 保存和记录选择器配置。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
forge-serverBUILD SUCCESS。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
built in 1m 39s。// 注释 warning、UserSelectModal 命名冲突提示,不阻断。跳过项
服务清理
变更范围
generation 或迁移未生效时,materialCode=null 直接进入 INSERT 导致 Column 'material_code' cannot be null 的问题。DynamicCrudService 在显式自动编号配置为空时,增加平台级约定兜底:字段名以 Code / No 结尾、列名以 _code / _no 结尾,或字段标签包含“编号/单号”时,按列名作为编码规则编码调用 CodeRuleService.generate。materialCode 和 material_code 都能被写入。BusinessException 后跳过,避免普通业务 code 字段被误伤。generation,包括 enabled=false,则尊重显式配置,不再走约定兜底。DynamicCrudServiceAutoGenerationTest,覆盖空编号生成、已有编号不覆盖、显式关闭 generation 不兜底三个场景。执行命令与结果
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -Penable-tests -pl forge-framework/forge-plugin-parent/forge-plugin-generator -Dtest=DynamicCrudServiceAutoGenerationTest test
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -Penable-tests -pl forge-framework/forge-plugin-parent/forge-plugin-generator -Dtest=DynamicCrudServiceAutoGenerationTest test
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0。git diff --check -- forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/DynamicCrudService.java forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/DynamicCrudServiceAutoGenerationTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
forge-serverBUILD SUCCESS,总耗时 12.886 s。跳过项
服务清理
变更范围
V1.0.91__seed_procurement_warehouse_flow_actions.sql。ai_business_document_config,启用单据模式,状态字段为 orderStatus。ai_business_binding,绑定复用流程 leave_multi,startMode=ACTION_ONLY。APPROVED -> inbound_purchase_stockAPPROVED -> commit_outbound_stockREJECTED -> release_outbound_stockAPPROVED -> transfer_stockai_business_object.designer_options.actions,动作步骤全部使用通用 START_FLOW、FOREACH、DOMAIN_ACTION/QUANTITY。ai_crud_config.options.rowActions,行按钮使用 COMMAND 调用通用业务动作接口。执行命令与结果
git diff --no-index --check /dev/null forge-server/db/migration/V1.0.91__seed_procurement_warehouse_flow_actions.sql
/dev/null 对比新增文件,退出码 1 表示存在文件差异;无输出表示 --check 未发现空白错误。rg -n '\$\{[^}]+\}' forge-server/db/migration/V1.0.91__seed_procurement_warehouse_flow_actions.sql
CONCAT('$', '{...}'),避免 Flyway placeholder。node -e "const fs=require('fs'); const s=fs.readFileSync(process.argv[1],'utf8'); const q=(s.match(/[']/g)||[]).length; const l=(s.match(/\\(/g)||[]).length; const r=(s.match(/\\)/g)||[]).length; console.log('single_quotes='+q); console.log('left_parens='+l); console.log('right_parens='+r); process.exit((q % 2 || l !== r) ? 1 : 0)" forge-server/db/migration/V1.0.91__seed_procurement_warehouse_flow_actions.sql
single_quotes=1524、left_parens=166、right_parens=166。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
forge-serverBUILD SUCCESS。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
built in 2m 20s。// 注释 warning、UserSelectModal 命名冲突提示,不阻断。跳过项
服务清理
变更范围
V1.0.92__seed_procurement_warehouse_detail_panels_demo_data.sql。/ai/crud/{configKey}/page 时使用。prototype-acceptance.md,记录采购、仓储、供应商、物料页面对照结论。执行命令与结果
git diff --no-index --check /dev/null forge-server/db/migration/V1.0.92__seed_procurement_warehouse_detail_panels_demo_data.sql
/dev/null 对比新增文件,退出码 1 表示存在文件差异;无输出表示 --check 未发现空白错误。rg -n '\$\{[^}]+\}' forge-server/db/migration/V1.0.92__seed_procurement_warehouse_detail_panels_demo_data.sql
CONCAT('$', '{row.id}')。node -e "const fs=require('fs'); const s=fs.readFileSync(process.argv[1],'utf8'); const q=(s.match(/[']/g)||[]).length; const l=(s.match(/\\(/g)||[]).length; const r=(s.match(/\\)/g)||[]).length; console.log('single_quotes='+q); console.log('left_parens='+l); console.log('right_parens='+r); process.exit((q % 2 || l !== r) ? 1 : 0)" forge-server/db/migration/V1.0.92__seed_procurement_warehouse_detail_panels_demo_data.sql
single_quotes=1350、left_parens=261、right_parens=261。rg -n "detailPanels|quantity-balance|quantity-ledger|quantity-lock|pw-demo|warehouseId|materialId|JSON_SEARCH|pw_supplier_material/page|pw_purchase_order/page|ai_business_quantity_balance" forge-server/db/migration/V1.0.92__seed_procurement_warehouse_detail_panels_demo_data.sql
rg -n "采购管理|仓储管理|供应商管理|物料管理|暂需后续平台 UI 能力" code-copilot/changes/lowcode-procurement-warehouse-app/prototype-acceptance.md
跳过项
服务清理
变更范围
ChildTableEditor.vue 中 activeSelectorChild 初始为 null 时,normalizeRecordSelectorConfig 直接读取 recordSelector 导致页面渲染报错的问题。null / 非对象兜底,并兼容 basicProps.recordSelector、props.recordSelector 配置来源。执行命令与结果
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
built in 2m 49s。// 注释 warning、UserSelectModal 命名冲突提示,不阻断。跳过项
服务清理
变更范围
V1.0.93__fix_procurement_warehouse_lowcode_runtime_config.sql。pw_common_status、pw_warehouse_type、pw_order_status。material_code 编码规则。materialId、warehouseId 等内部 ID 字段,并补齐记录选择器上下文参数。businessObjectCode / objectCode,并隐藏默认“发起主流程”动作,只保留自定义“提交审批”动作。validation、主子表 recordSelector 和详情数量区块配置透传。执行命令与结果
git diff --check -- forge-admin-ui/src/utils/validation-presets.js forge-admin-ui/src/components/ai-form/AiForm.vue forge-admin-ui/src/components/page-templates/ChildTableEditor.vue forge-admin-ui/src/components/ai-form/AiCrudPage.vue forge-admin-ui/src/views/ai/crud-page.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/forge-form-designer/ForgePropertyPanel.vue forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessDocumentRuntimeService.java
git diff --no-index --check /dev/null forge-server/db/migration/V1.0.93__fix_procurement_warehouse_lowcode_runtime_config.sql
/dev/null 对比新增文件,退出码 1 表示存在文件差异;无输出表示 --check 未发现空白错误。rg -n '\$\{[^}]+\}' forge-server/db/migration/V1.0.93__fix_procurement_warehouse_lowcode_runtime_config.sql
CONCAT('$', '{...}'),避免 Flyway placeholder。node -e "const fs=require('fs'); const s=fs.readFileSync(process.argv[1],'utf8'); const q=(s.match(/[']/g)||[]).length; const l=(s.match(/\\(/g)||[]).length; const r=(s.match(/\\)/g)||[]).length; console.log('single_quotes='+q); console.log('left_parens='+l); console.log('right_parens='+r); process.exit((q % 2 || l !== r) ? 1 : 0)" forge-server/db/migration/V1.0.93__fix_procurement_warehouse_lowcode_runtime_config.sql
single_quotes=1612、left_parens=536、right_parens=536。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
forge-serverBUILD SUCCESS,总耗时 24.179 s。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
built in 2m 16s。UserSelectModal 命名冲突、Vite dynamic/static import chunk 提示、CSS // 注释 warning,不阻断。跳过项
服务清理
变更范围
preset、pattern、message,让用户点击后能直接看到正则和提示文案变化。id、xxxId、xxx_id 等内部主键/外键,除非字段显式声明 showInChildEditor=true。V1.0.94__fix_procurement_warehouse_designer_flow_relation_config.sql,将采购、出库、调拨流程绑定和运行配置从旧 leave_multi 修正为 pw_purchase_approval、pw_outbound_approval、pw_transfer_approval。dictType,采购单 orderStatus 兜底配置 pw_order_status,避免保存时报“字典字段必须配置字典类型”。执行命令与结果
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/forge-form-designer/ForgePropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vue forge-admin-ui/src/views/app-center/components/designer/BusinessObjectDesignerShell.vue forge-admin-ui/src/components/page-templates/ChildTableEditor.vue forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDesignerService.java forge-server/db/migration/V1.0.94__fix_procurement_warehouse_designer_flow_relation_config.sql
rg -n '\$\{[^}]+\}' forge-server/db/migration/V1.0.94__fix_procurement_warehouse_designer_flow_relation_config.sql
node -e "const fs=require('fs'); const s=fs.readFileSync(process.argv[1],'utf8'); const q=(s.match(/[']/g)||[]).length; const l=(s.match(/\\(/g)||[]).length; const r=(s.match(/\\)/g)||[]).length; console.log('single_quotes='+q); console.log('left_parens='+l); console.log('right_parens='+r); process.exit((q % 2 || l !== r) ? 1 : 0)" forge-server/db/migration/V1.0.94__fix_procurement_warehouse_designer_flow_relation_config.sql
single_quotes=994、left_parens=478、right_parens=478。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
forge-serverBUILD SUCCESS,总耗时 14.202 s。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
built in 1m 54s。UserSelectModal 命名冲突、Vite dynamic/static import chunk 提示、CSS // 注释 warning,不阻断。跳过项
pw_purchase_approval、pw_outbound_approval、pw_transfer_approval 已部署。服务清理