status: reviewed_passed created: 2026-07-16 拆分顺序:SDD 基线 → 序列底座 → 数据模型 → 生成引擎 → API → 前端 → 低代码兼容 → 验证
AGENTS.md、项目记忆、编码规范、自动化测试标准和适用 Skill。main 切换到 feature/code-rule-config-optimization-20260716。ai_code_rule 主表和旧 /ai/code-rule 兼容入口。code-copilot/changes/编码规则配置优化/spec.mdcode-copilot/changes/编码规则配置优化/tasks.mdcode-copilot/changes/编码规则配置优化/test-spec.mdcode-copilot/changes/编码规则配置优化/execution-log.mdstartValue 开始。forge-server/forge-framework/forge-starter-parent/forge-starter-id/src/main/java/com/mdframe/forge/starter/id/service/ISequenceService.java — 增加带起始值的默认契约。forge-server/forge-framework/forge-starter-parent/forge-starter-id/src/main/java/com/mdframe/forge/starter/id/service/impl/SequenceServiceImpl.java — 转发起始值。forge-server/forge-framework/forge-starter-parent/forge-starter-id/src/main/java/com/mdframe/forge/starter/id/generator/SegmentSequenceGenerator.java — 使用原子状态切换号段,删除重复 next 覆盖。forge-server/forge-framework/forge-starter-parent/forge-starter-id/src/test/java/com/mdframe/forge/starter/id/generator/SegmentSequenceGeneratorTest.java — 覆盖首次起始值、999/1000/1001 边界和并发唯一性。java
long nextId(String bizKey, long startValue);
public long nextId(String bizKey, long startValue);
startValue..startValue+1199;并发结果无重复。forge-server/db/migration/V1.0.36__add_structured_code_rule_segments.sql — 增加主表字段、子表、字典、菜单/按钮/API 资源及内置规则分段回填。forge-server/.../generator/domain/entity/AiCodeRule.java — 增加 category/version/inCodeList。forge-server/.../generator/domain/entity/AiCodeRuleSegment.java — 新增分段实体和 @TableLogic。forge-server/.../generator/mapper/CodeRuleSegmentMapper.java — 分段查询、批量插入、逻辑删除接口。forge-server/.../generator/resources/mapper/CodeRuleSegmentMapper.xml — 显式 tenant/del_flag 查询和批量写入。java
List<AiCodeRuleSegment> selectByRuleId(Long tenantId, Long ruleId);
int logicalDeleteByRuleId(Long tenantId, Long ruleId, Long updateBy);
int insertBatch(List<AiCodeRuleSegment> segments);
forge-server/.../generator/mapper/CodeRuleMapper.javaforge-server/.../generator/resources/mapper/CodeRuleMapper.xmlforge-server/.../generator/dto/businessapp/CodeRuleSaveDTO.javaforge-server/.../generator/dto/businessapp/CodeRuleSegmentDTO.javaforge-server/.../generator/vo/businessapp/CodeRuleDetailVO.javajava
public class CodeRuleSaveDTO { Long id; Integer version; String ruleCode; List<CodeRuleSegmentDTO> segments; }
public class CodeRuleDetailVO { AiCodeRule rule; List<CodeRuleSegmentDTO> segments; List<String> warnings; }
AiCodeRule;分页返回分类、分段数和兼容状态。forge-server/.../generator/manager/coderule/CodeRuleEngine.java — 校验、预览和真实生成。forge-server/.../generator/manager/coderule/CodeRuleRadixCodec.java — 固定宽度进制转换和容量计算。forge-server/.../generator/manager/coderule/CodeRuleSequenceKeyFactory.java — 周期和分组摘要 key。forge-server/.../generator/manager/coderule/LegacyCodeRuleParser.java — 旧 ${...} 模板转分段。forge-server/.../generator/src/test/java/com/mdframe/forge/plugin/generator/manager/coderule/CodeRuleEngineTest.java — P0 规则测试。java
CodeRulePreviewVO preview(CodeRuleDefinition definition, Map<String, Object> fields, long sampleSequence);
CodeRuleGenerateVO generate(CodeRuleDefinition definition, Map<String, Object> fields);
List<CodeRuleSegmentDTO> parse(String template, String resetPolicy, Integer seqLength);
forge-server/.../generator/service/businessapp/CodeRuleService.java — CRUD、分段物化、预览和生成 Facade。forge-server/.../generator/controller/SystemCodeRuleController.java — /system/code-rule 管理接口。forge-server/.../generator/controller/CodeRuleController.java — 旧接口兼容委托。forge-server/.../generator/dto/businessapp/CodeRuleGenerateDTO.java — 增加 fields 并保留 context alias。forge-server/.../generator/dto/businessapp/CodeRulePreviewDTO.java — 支持未保存 segments。java
public CodeRuleDetailVO detail(Long id);
public Long create(CodeRuleSaveDTO dto);
public void update(CodeRuleSaveDTO dto);
public CodeRuleGenerateVO generate(String ruleCode, Map<String, Object> fields);
forge-admin-ui/src/api/business-app.js — 增加 /system/code-rule API 并保留旧函数。forge-admin-ui/src/views/app-center/code-rule-utils.js — 分段默认值、排序、校验和预览 payload 纯函数。forge-admin-ui/src/views/app-center/__tests__/code-rule-utils.spec.js — 前端规则联动测试。forge-admin-ui/src/views/app-center/components/CodeRuleSegmentEditor.vue — 分段列表、拖拽、行内核心配置和高级配置。forge-admin-ui/src/views/app-center/components/CodeRuleEditorWorkspace.vue — 全屏工作台、基础信息、分段设计和粘性预览。forge-admin-ui/src/views/app-center/code-rules.vue — AiCrudPage 列表、自定义工具栏和操作接入。js
export function createCodeRuleSegment(type, order) {}
export function normalizeCodeRuleSegments(segments) {}
export function validateCodeRuleDraft(draft) {}
forge-server/.../generator/service/DynamicCrudService.java — buildCodeRuleContext 改为可信元数据和业务 fields 分层。forge-admin-ui/src/views/app-center/components/designer/forge-form-designer/ForgePropertyPanel.vue — 展示结构化摘要并按新预览协议传 sample fields。forge-server/.../generator/src/test/java/com/mdframe/forge/plugin/generator/service/DynamicCrudServiceAutoGenerationTest.java — 增加 VARIABLE 分组上下文回归。generation.ruleCode 无需迁移;新增业务记录自动编号、变量分组和旧规则预览保持可用。test-spec.md 的最小验证矩阵并形成可追溯证据。code-copilot/changes/编码规则配置优化/spec.mdcode-copilot/changes/编码规则配置优化/tasks.mdcode-copilot/changes/编码规则配置优化/test-spec.mdcode-copilot/changes/编码规则配置优化/execution-log.mdbash
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-starter-parent/forge-starter-id,forge-framework/forge-plugin-parent/forge-plugin-generator -am test
bash
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm exec vitest run src/views/app-center/__tests__/code-rule-utils.spec.js
NODE_OPTIONS=--max-old-space-size=8192 pnpm build
bash
xmllint --noout <本轮 Mapper XML>
rg -n '\$\{[^}]+\}' forge-server/db/migration
git diff --check
SegmentSequenceGeneratorTest 6/6,Generator 编码规则相关测试 15/15。execution-log.md。ai_code_rule 增加 source_object_id/source_object_code,迁移 sys_code_rule_scene 字典。sourceObjectId 返回业务对象和字段选项。objectCode,列表只返回通用规则或当前对象绑定规则。text
variableSource = CUSTOM | LOWCODE
CUSTOM -> segmentValue=调用方变量名,生成时从 fields 取值
LOWCODE -> segmentValue=低代码字段编码,规则主表保存来源对象
code-rule-utils.spec.js 先覆盖 CUSTOM 无对象合法、LOWCODE 无对象失败、切换来源清理旧值。SystemCodeRuleControllerContractTest 先覆盖只收集 LOWCODE 字段和 CUSTOM 安全变量名。LegacyCodeRuleParserTest 与 CodeRuleMigrationContractTest 先覆盖缺省 CUSTOM、字段迁移及回填。CodeRuleSegmentDTO、AiCodeRuleSegment、CodeRuleSegmentMapper.xml、CodeRuleService,完成 variableSource 持久化、详情回显、等价指纹和 legacy 默认。SystemCodeRuleController,只校验 LOWCODE 字段目录;纯 CUSTOM 规则清空来源对象。V1.0.36__add_structured_code_rule_segments.sql,用 information_schema 防重增加 variable_source,已绑定对象的存量 VARIABLE 回填 LOWCODE。code-rule-utils.js,VARIABLE 默认 CUSTOM,分类校验并在切换来源时清空不兼容值。CodeRuleSegmentEditor.vue,在 VARIABLE 行内选择“自定义变量 / 低代码字段”;只存在 LOWCODE 分段时在分段区展示来源对象。CodeRuleEditorWorkspace.vue,基础信息不再固定展示低代码来源,切换对象只清理 LOWCODE 字段。code-rule:* 计数器,确保升级后的新 key 不从历史已用区间重新取号。max_id 决定返回值。REQUIRES_NEW 事务契约和前端异步过期响应测试。/review 编码规则配置优化;阶段一 PASS,阶段二 PASS_WITH_COMMENTS,P0/P1 为零。forge-admin-ui/src/views/app-center/code-rule-utils.js:提供可测试的映射原子应用函数。forge-admin-ui/src/views/app-center/__tests__/code-rule-utils.spec.js:覆盖同对象保留、切换对象清理和 CUSTOM 不受影响。forge-admin-ui/src/views/app-center/components/CodeRuleSegmentEditor.vue:移除顶部映射区,LOWCODE 行显示摘要/重新映射入口。forge-admin-ui/src/views/app-center/components/CodeRuleEditorWorkspace.vue:管理 Modal 映射草稿、对象字段加载和确认提交。js
applyLowCodeVariableMapping(segments, targetSegmentKey, {
sourceObjectId,
fieldCode,
}, currentSourceObjectId)
// => { segments, sourceObjectId, clearedSegmentKeys, objectChanged }
variableSource/segmentValue/sourceObjectId。git diff --check。CodeRuleEngineTest 增加旧安全起点 1001 + DECIMAL 三位的组合用例;旧实现因缺少只读旧起点契约而测试编译失败。ISequenceService 增加不消耗序列的 resolveLegacyStartValue 默认契约,SequenceServiceImpl 委托号段生成器实现。CodeRuleEngine 只在严格宽度实际溢出时解析旧起点,并按旧起点所需的最小进制位数重试。git diff --check。maximumSize=10000 + expireAfterAccess=60m;淘汰后继续取号为 1001,不重复。REQUIRES_NEW + READ_COMMITTED,测试记录并断言隔离级别。HHmmss 保持旧 NONE/all,旧 all 水位从 1001 续接。segmentKey。done。功能需求文档.md 和 参考UI设计.png 一并归档到 code-copilot/changes/archive/2026-07-17-编码规则配置优化/。SegmentSequenceGeneratorTest 增加“有限容量生成一次 → 缓存淘汰 → 下一次为 2”以及“达到上限不推进数据库水位”用例。ISequenceService、SequenceServiceImpl 和 SegmentSequenceGenerator,新增有限容量取号契约:
java
long nextId(String bizKey, long startValue, String legacyKeyPrefix,
String legacyPeriod, int allocationStep, long maxValue);
allocationStep=clamp(capacity/1000, 1, 1000);分配前按剩余容量裁剪步长,容量耗尽时不再 UPDATE。SegmentHolder 使用 CAS 消费当前段,仅在当前段耗尽时同步加载新段。SequenceControllerContractTest,断言 matchIfMissing=false、写操作使用 POST、四个入口均要求 system:sequence:use。SequenceController,默认不注册 HTTP API;增加专用权限和 bizKey 长度/安全字符校验。biz_key 使用 LEFT(...);新建规则不携带 legacy 前缀。V1.0.37__optimize_code_rule_runtime.sql,为 ai_code_rule 增加 legacy_compat_enabled;升级前既有规则默认兼容,新代码创建规则显式写 0;重建分段活跃查询索引为 (tenant_id, rule_id, del_flag, segment_order, id)。AiCodeRule、Mapper、CodeRuleDefinition 和 CodeRuleService 传递兼容标记;SysIdSequenceMapper.xml 使用 LIKE ... ESCAPE '!' 的参数化可索引前缀范围。tenantId + ruleId + versionNo 连续生成只加载一次分段、版本变化重新加载、缓存返回深拷贝的测试。tenantId/ruleId/versionNo,最大 10000、无访问 30 分钟过期。@OperationLog,避免编辑输入产生高频审计写入;生成接口保留日志。previewSystemCodeRule 接收 Axios config,工作台用 AbortController 取消已过期预览请求,保留 latest-request guard;取消静默,真实错误仍提示。git diff --check。spec.md、tasks.md、test-spec.md、execution-log.md,重新执行两阶段 Review;结论为 PASS_WITH_COMMENTS,当前保持活动目录等待用户决定是否再次归档。