execution-log.md 23 KB

执行日志 — 采购仓储低代码应用配置落地

status: apply created: 2026-07-03

2026-07-03 SDD 初始化

  • 用户确认开始 lowcode-procurement-warehouse-app 开发。
  • 用户明确要求使用项目渐进式 SDD 开发流程,不使用 superpowers 开发模式。
  • 创建变更目录:code-copilot/changes/lowcode-procurement-warehouse-app/
  • 第一阶段范围收敛为低代码应用骨架:运行表、低代码领域/模型、业务对象、基础运行配置和应用入口。

验证记录

2026-07-03 Phase 1 低代码应用骨架

变更范围

  • 新增 Flyway 迁移 V1.0.90__seed_procurement_warehouse_lowcode_app.sql
  • 创建 10 张采购仓储低代码运行表:物料、供应商、供应商报价、仓库、采购单/明细、出库单/明细、调拨单/明细。
  • Seed 采购仓储低代码领域 PROCUREMENT_WAREHOUSE、业务套件、10 个低代码模型、10 个业务对象。
  • Seed 6 个基础 CRUD 运行配置和应用入口:物料、供应商、仓库、采购、出库、调拨。

执行命令与结果

  • 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
    • 结果:通过,无输出。
    • 备注:选择器上下文表达式在 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=8758left_parens=723right_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-server
    • 结果:通过,BUILD SUCCESS
    • 警告:既有 deprecated/unchecked 编译警告,不阻断。

2026-07-03 Phase 2 主子表与记录选择器

变更范围

  • 新增隐藏运行配置 pw_supplier_material,让 PW_SUPPLIER_MATERIAL 可作为通用记录选择器数据源。
  • 将供应商、采购单、出库单、调拨单运行配置升级为 master-detail-crud
  • page_schema.modelRefs 中声明主模型、明细模型和一对多关系。
  • options.masterDetailConfig.children 中配置明细表、saveMode=mergeChildTableEditor 可消费字段。
  • 配置供应商报价选择物料、采购明细选择供应商报价、出库/调拨明细选择物料的记录选择器。
  • 采购、出库、调拨主表仓库/供应商字段改为记录选择器配置,选择后回填 ID 和名称字段。

执行命令与结果

  • 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-server
    • 结果:通过,BUILD 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
    • 警告:既有 Vite dynamic/static import chunk 提示、CSS // 注释 warning、UserSelectModal 命名冲突提示,不阻断。

跳过项

  • 未实跑 Flyway 入库迁移:本轮没有启动本地 MySQL/Redis/后端服务,先以 SQL 静态检查和构建验证为准。
  • 未做端到端扣库存验收:流程绑定和数量台账动作属于后续 Task 7-8。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。

2026-07-03 物料新增编号为空修复

变更范围

  • 修复低代码运行态新增记录时,字段配置未显式带 generation 或迁移未生效时,materialCode=null 直接进入 INSERT 导致 Column 'material_code' cannot be null 的问题。
  • DynamicCrudService 在显式自动编号配置为空时,增加平台级约定兜底:字段名以 Code / No 结尾、列名以 _code / _no 结尾,或字段标签包含“编号/单号”时,按列名作为编码规则编码调用 CodeRuleService.generate
  • 兜底只在当前字段无值时填充,并把 camel/snake 别名同时加入可写字段,保证最终 materialCodematerial_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
    • 首次结果:失败,原因是新增测试使用 Mockito mock 时,本机 Homebrew JDK 17 无法初始化 Mockito inline ByteBuddy mock maker,自附加 agent 失败;不是业务断言失败。
    • 处理:将新增测试改为内部轻量 fake,不依赖 Mockito。
  • 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-server
    • 结果:通过,BUILD SUCCESS,总耗时 12.886 s
    • 警告:既有 deprecated/unchecked 编译警告,不阻断。

跳过项

  • 未实跑新增物料接口:本轮没有启动 MySQL/Redis/后端服务;已通过服务私有方法单测覆盖插入前自动编号填充路径。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。

2026-07-03 Phase 3 流程绑定与数量动作

变更范围

  • 新增 Flyway 迁移 V1.0.91__seed_procurement_warehouse_flow_actions.sql
  • 三类单据写入 ai_business_document_config,启用单据模式,状态字段为 orderStatus
  • 三类单据写入 ai_business_binding,绑定复用流程 leave_multistartMode=ACTION_ONLY
  • 流程回调动作:
    • 采购 APPROVED -> inbound_purchase_stock
    • 出库 APPROVED -> commit_outbound_stock
    • 出库 REJECTED -> release_outbound_stock
    • 调拨 APPROVED -> transfer_stock
  • 三类单据写入 ai_business_object.designer_options.actions,动作步骤全部使用通用 START_FLOWFOREACHDOMAIN_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=1524left_parens=166right_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-server
    • 结果:通过,BUILD SUCCESS
    • 警告:既有 deprecated/unchecked 编译警告,不阻断。
  • 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
    • 警告:既有 Vite dynamic/static import chunk 提示、CSS // 注释 warning、UserSelectModal 命名冲突提示,不阻断。

跳过项

  • 未实跑 Flowable 流程发起、审批通过、驳回回调:本轮没有启动 MySQL/Redis/后端/Flow 服务。
  • 未做真实库存扣减端到端验收:已完成配置和构建验证,需在本地服务环境或测试环境人工验收。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。

2026-07-03 Phase 4/5 详情区块、演示数据与原型对照

变更范围

  • 新增 Flyway 迁移 V1.0.92__seed_procurement_warehouse_detail_panels_demo_data.sql
  • 给采购、出库、调拨、供应商报价运行配置补隐藏过滤字段,供详情关联面板调用 /ai/crud/{configKey}/page 时使用。
  • 给仓库详情配置库存余额、数量流水、数量锁定、采购记录、出库记录、调入/调出记录面板。
  • 给物料详情配置供应商报价、库存信息、近 3 次数量流水面板。
  • 给采购详情配置供应商信息和附件占位面板,采购明细继续由主子表详情展示。
  • Seed 原型演示数据:3 个物料、2 个供应商、2 个仓库、2 张采购单、2 张出库单、1 张调拨单、数量余额/流水/锁定数据。
  • 新增 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=1350left_parens=261right_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
    • 结果:通过,命中详情区块、数量区块、关联面板、隐藏过滤字段和 demo 数量数据。
  • rg -n "采购管理|仓储管理|供应商管理|物料管理|暂需后续平台 UI 能力" code-copilot/changes/lowcode-procurement-warehouse-app/prototype-acceptance.md
    • 结果:通过,关键对照章节齐全。

跳过项

  • 未实跑 Flyway 入库迁移:本轮没有启动本地 MySQL/Redis/后端服务。
  • 未做浏览器截图验收:本轮新增的是 SQL seed 和 SDD 文档,前端运行时代码未变;已复用 Phase 3 前端构建结果。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。

2026-07-03 ChildTableEditor 记录选择器空值修复

变更范围

  • 修复 ChildTableEditor.vueactiveSelectorChild 初始为 null 时,normalizeRecordSelectorConfig 直接读取 recordSelector 导致页面渲染报错的问题。
  • 记录选择器配置归一化新增 null / 非对象兜底,并兼容 basicProps.recordSelectorprops.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
    • 警告:既有 Vite dynamic/static import chunk 提示、CSS // 注释 warning、UserSelectModal 命名冲突提示,不阻断。

跳过项

  • 未做浏览器端点击回归:本轮先以组件空值路径修复和生产构建验证为准。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。

2026-07-03 用户反馈修复:自动编号、字典、选择器、流程入口和校验配置

变更范围

  • 新增 Flyway 迁移 V1.0.93__fix_procurement_warehouse_lowcode_runtime_config.sql
  • 采购仓储内置字典:pw_common_statuspw_warehouse_typepw_order_status
  • 补齐供应商、仓库、采购、出库、调拨编码规则;物料复用既有 material_code 编码规则。
  • 物料、供应商、仓库、采购、出库、调拨编号字段改为后端自动生成,表单只读。
  • 状态/仓库类型/单据状态改为字典下拉和列表字典标签。
  • 子表隐藏 materialIdwarehouseId 等内部 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=1612left_parens=536right_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-server
    • 结果:通过,BUILD SUCCESS,总耗时 24.179 s
    • 警告:既有 deprecated/unchecked 编译警告,不阻断。
  • 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,不阻断。

跳过项

  • 未实跑 Flyway 入库迁移:本轮没有启动本地 MySQL/Redis/后端服务。
  • 未做浏览器端人工点击验证:本轮已覆盖运行态组件构建和后端编译,端到端流程仍需在服务环境中验收。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。

2026-07-03 二次反馈修复:设计器可见性、子表 ID、流程 key、字典保存

变更范围

  • 常用校验配置选择后同步写入 presetpatternmessage,让用户点击后能直接看到正则和提示文案变化。
  • 最大长度配置从折叠的高级位置前移到字段基础配置/新版画布属性面板的“字段约束”区域,并同步字段资产长度。
  • 表单设计主画布增加“关系与级联”摘要和配置入口,业务对象设计器左侧导航默认展开,避免用户看不到主子表关系配置。
  • 子表编辑器默认隐藏 idxxxIdxxx_id 等内部主键/外键,除非字段显式声明 showInChildEditor=true
  • 新增 Flyway 迁移 V1.0.94__fix_procurement_warehouse_designer_flow_relation_config.sql,将采购、出库、调拨流程绑定和运行配置从旧 leave_multi 修正为 pw_purchase_approvalpw_outbound_approvalpw_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
    • 结果:通过,无输出。
    • 备注:无 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.94__fix_procurement_warehouse_designer_flow_relation_config.sql
    • 结果:通过,single_quotes=994left_parens=478right_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-server
    • 结果:通过,BUILD SUCCESS,总耗时 14.202 s
    • 警告:既有 deprecated/unchecked 编译警告,不阻断。
  • 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,不阻断。

跳过项

  • 未实跑 Flyway 入库迁移:本轮没有启动本地 MySQL/Redis/后端服务。
  • 未做浏览器端人工点击验证:本轮已覆盖前端构建、后端编译和迁移脚本静态检查;表单设计器点击链路仍需在服务环境中验收。
  • 未实跑 Flowable 流程发起:本轮修正低代码绑定的业务流程 key,不负责部署 Flowable BPMN 定义;目标环境仍需确保 pw_purchase_approvalpw_outbound_approvalpw_transfer_approval 已部署。

服务清理

  • 本轮没有启动长期运行的本地服务,无需清理 PID。