lml
|
b278f5d100
|
fix(botp): 转换结果补编辑界面参数并修复分录行被覆盖丢失
- ConvertResult 新增 formVal / editFormId / entryTables:formStatus=2(未落库)时
前端据此打开目标编辑页并触发保存,并把 BillData 里的分录组装成
executePluginBatch 的 slaveData(key 为 tableId)
- ConvertOrchestrator 新增 resolveEditFormId:优先取规则下行编辑界面,
缺失时按目标表反查 form_type=5 编辑表单兜底,多命中取第一个并告警
- ConvertOrchestrator 新增 resolveEntryTables:从目标表 ORM 元数据取
relationType=1 的链接列,dataKey 取 relationName 与 BillData 口径一致
- 新增 ConvertEntryTable
- 修复 BillDataConverter.convertEntries:entryMap 提到循环内,
原先所有分录行共用一个 Map 实例,后行覆盖前行,前端永远只看到一条明细
- ConvertRuleServiceImpl 兼容入口透传 formVal
修复的分组/合并场景下"主表正确、子表只剩一条"问题即由后者引起
|
4 days ago |
lml
|
846569f7f2
|
fix(botp): 修复分组合并时源单查询报错与子表明细丢失
- ConvertOrchestrator#loadGroupKeys:orm 的 FilterItem.in 不支持集合,
传 List<Long> 会生成 id in ('[1,2,3]') 的非法 SQL。改用 id = ? OR id = ?
组合,仍是单次查询;异常消息补上底层原因。
- BotpService#groupSourceRows:分录归并误用表头级 group_by_field 作行键,
分录表无该列导致全部源行塌进同一组、目标单只剩一条明细。改为每条源
分录行对应一条目标分录行,分单字段仅用于决定生成几张目标单。
|
1 week ago |
chenchuchuan
|
833f8cb63e
|
feat(botp): 新增拉式选单功能及反写规则版本回滚支持
- 新增 IPullService 接口及 PullController,按目标单据反查可用转换规则
- 新增 PullRuleDto 承载选单对话框所需源单列表表单、数据源等参数
- 新增 PullServiceImpl 实现多路径匹配(路由menuId/路由路径/在线表单id/表名)
- 新增 ResolvedWriteBackRule 实体封装解析后的规则、公式、业务分录及版本号
- ConvertRelationEntry 新增 writebackRuleVersion 字段,正向执行时记录所用版本
- 反写回滚时按关联关系记录的版本从快照表加载规则,确保用旧公式退旧数据
- 修复超额检查条件对目标单求值导致源单字段取不到的问题
- 修复业务规则回写表头时误用分录行 id 导致更新不到目标行的问题
- 新增单表单据无分录时的「单据↔单据」配对退化逻辑
- 优化插件加载,避免每条公式重复查询数据库
|
1 week ago |
chenchuchuan
|
975a710a46
|
refactor(botp): 将源单关闭标记从行级改为整单级别
- 将 closed_flag 字段定义从分录表移至主表,语义改为整单关闭
- 反写执行时将 entries 按源单分组,对每张源单主表分别求值关闭条件
- 新增 resolveTableName 方法,按单元数据 id 解析源单表名
- 简化插件排序逻辑,移除自定义 parseOrder 方法改用自然排序加 nullsLast
- 更新 BotpRuleConstant 注释,明确主表字段定位与整单关闭语义
|
1 week ago |
lml
|
5d9780a615
|
fix(botp): serialNumber字段类型修改避免排序错误
|
1 week ago |
lml
|
fcc47e46f6
|
fix(botp): ConvertRule 补分单字段名称并实现 Serializable
- 分单策略的配套字段只有 groupByField,缺少用于展示的 groupByFieldName,
前端选中分组字段后无法回显名称,补上该字段(仅展示用途,不参与分单计算,
执行侧仍按 field id 取分组依据)
- 实体实现 Serializable,与 ReverseWritingRules 等规则实体保持一致
|
1 week ago |
lml
|
dd02faa3b9
|
feat(botp): 反写规则支持插件分录的保存、回显与删除
- ReverseWritingRulesDto 新增 convertPluginEntryList,让反写规则能携带插件分录。
此前反写规则只有反写公式、业务规则两张子表,规则上声明的反写插件无处存放,
本次复用已有的 convert_plugin_entry 表(parent_id 指向反写规则 id)
- ReverseWritingRulesServiceImpl.saveAll 在更新分支按规则 id 清空插件分录后重新写入,
与公式、业务规则子表保持同样的全量覆盖语义;parentId 由服务端统一赋值,
不依赖前端传参
- 反写 Service 读写插件分录改用 ConvertPluginEntryMapper 而非
IConvertPluginEntryService:后者继承 BaseService(泛型参数为接口
BaseDaoMapper),ServiceImpl 体系的 saveBatch/list/remove 会去查
BaseDaoMapper 的语句映射并抛 "Mapped Statements collection does not contain
value for ...BaseDaoMapper.insert"。Mapper 单条 insert 是转换规则侧
ConvertRuleServiceImpl.addChild 已在用的路径
- ReverseWritingRulesController 新增 /getConvertPluginEntry 回显插件分录;
删除规则时同步清理其插件分录,避免 parent_id 指向已删除的规则
- 顺带收敛 import:Controller 把 generator 包的 * 通配改为显式导入,
ServiceImpl 的 model 与 java.util 合并为通配导入
|
1 week ago |
chenchuchuan
|
da2be26f9c
|
refactor(botp): 重构字段映射策略体系与插件兼容机制
- 将映射策略接口改为按单行目标+源行组求值,解耦编排层与策略层
- BotpMappingContext 由 if/else 工厂改为 EnumMap 策略工厂,修复未知取值方式抛 NPE 的问题
- 各策略实现改为 Spring bean,依赖通过 @Resource 注入替代手工 getBean
- 新增按条件取值策略(BotpMappingStrategyCondition),复用在线规则引擎求值
- AbstractTransformPlugIn 改为实现 ConvertPlugIn 接口的兼容桥,存量插件无需改代码
- 回写插件分录表名从映射计划动态获取,修复 Long 对象引用比较的 bug
- 新增 BotpMappingException 替代 NPE,提供含配置原值的可读报错
- 抽取 BillDataConverter 工具类,编排器与兼容入口共用单据数据转换逻辑
|
1 week ago |
lml
|
5d6fca24d6
|
fix(botp): 修复版本对比把「改源字段」误判成一增一删
- 字段映射的业务主键含源字段(oldfieldNumber),用户改源字段会让精确配对失败,
同一行被拆成「删除 1 条 + 新增 1 条」,实际应识别为「修改 1 条」
- 版本对比改为两轮配对:第一轮按完整业务主键精确配对;第二轮对剩余行按兜底字段再配一次
(字段映射用目标字段、反写公式用反写字段;插件与业务规则主键本身唯一,不做兜底)
- 兜底配对加两道约束防止误合并:同一兜底 key 下旧行数须等于新行数、且兜底字段两行都非空且相等
真新增 + 真删除不会被硬凑成一条修改
- 修正 FALLBACK_FIELD_MAPPING 取值:不用 entryTarget(常为空,等于放宽成同组随便配),
改用 newfieldNumber
|
1 week ago |
lml
|
5698a8b72f
|
feat(botp): 转换/反写规则版本号递增与全量快照,新增版本历史与对比接口
- 保存即版本 +1 并落全量快照:新增 convert_rule_ver / reverse_writing_rules_ver,
快照以 JSON 内联存储规则主表 + 全部子表分录(字段映射、插件分录 / 反写公式分录、业务规则分录)
- 版本号唯一且单调:两张快照表建唯一索引 (rule_id, rule_version);实体 ruleVersion 加
@Version 并注册 OptimisticLockerInnerInterceptor,用「页面打开时的版本号」做 CAS,
影响行数为 0 即提示「已被他人修改,请刷新后重试」,避免并发保存互相覆盖或写坏版本号
- 新增版本历史接口:getVersionList(版本号/创建时间/创建人,不返回 JSON 正文)、
getVersionSnapshot(只读查看指定版本全量快照)、compareVersion(与当前版本或指定版本对比)
- 版本对比只产出新增/删除/修改三类结论,不做逐字 diff;规则主表按字段比对并忽略审计字段,
子表分录按业务主键配对(分录为「先删后插」,主键每版都变,按主键配会把所有行显示成删改)
- 快照 JSON 分区名对齐任务分派文档附录 A.2:fieldMappings / pluginEntries / formulas / businesses
- 反写规则保存逻辑从 ReverseWritingRulesController 下沉到 Service.saveAll,
使版本号递增与快照写入同主表、子表处于同一事务
- 新增幂等 DDL 脚本 botp-rule-version-script.sql:缺列时补 rule_version(information_schema 守卫)、
历史空版本号兜底为 1、建两张快照表,可重复执行
|
2 weeks ago |
lml
|
c4c5d2658c
|
fix(botp): 修复反写规则保存接口的校验返回、子表空指针与审计字段丢失
- addAll/removeAllById 的参数校验分支补上 return,避免校验失败后继续执行并抛空指针
- 公式分录、业务规则分录改为 ObjectUtil.isNotEmpty 判空,前端不传子表时不再 NPE
- 更新分支由 removeById + save 改为 getById + updateById 就地更新,保留原
create_user_id/create_time,仅刷新 update_time,避免审计字段丢失
- 新增分支内单独设置 create_time,避免更新时覆盖创建时间
- addAll/removeAllById 增加 @Transactional(rollbackFor = Exception.class)
|
2 weeks ago |
lml
|
038b52c64d
|
feat(botp): 保存转换规则时校验取值方式与分单策略
新增 ValueMethodEnum 与 SplitMergeStrategyEnum 承载字段可选值,消除魔法值,
并为二者补充 parse/validOptions 方法供保存校验使用。
保存入口(addAll/editAll)统一增加 validateBeforeSave 前置校验,
校验不通过抛 MyRuntimeException 阻止保存,且早于任何写库操作,避免脏数据。
- 取值方式:为空或未知时阻止保存,错误信息定位到分录行号、源字段、
目标字段、非法值、合法选项及分录id
- 分单策略:未配置按默认「一对一」放行;非法值阻止保存;选择「按规则分组合并」
但未配置分单字段时阻止保存
- 事务:addAll/editAll 涉及主表与分录的多次独立写库(editAll 为先删后插),
此前无事务边界,中途失败会造成主表已改、分录残缺或产生无分录的空规则。
现补充 @Transactional(rollbackFor = Exception.class),removeChild 一并补充
files:
common/common-botp/src/main/java/apelet/common/botp/model/constant/ValueMethodEnum.java
common/common-botp/src/main/java/apelet/common/botp/model/constant/SplitMergeStrategyEnum.java
common/common-botp/src/main/java/apelet/common/botp/service/impl/ConvertRuleServiceImpl.java
|
2 weeks ago |
chenchuchuan
|
e031e4dd51
|
chore(build): 更新构建配置并修复流程服务空指针问题
- 将 Nexus 仓库地址从公网 IP 更新为内网地址 192.168.100.25
- 在 common 模块中新增 common-botp 子模块
- common-botp 依赖版本更新,common-core 改为变量引用方式
- FlowEntryServiceImpl 增加 tokenData 为空时的空指针防护逻辑
- FlowTaskTitleBackfillServiceImpl 移除 GlobalThreadLocal 调用,简化数据过滤逻辑
- FlowTaskTitleBackfillServiceImpl 重构 processDefinitionKey 判空逻辑为提前返回
|
2 weeks ago |
lml
|
6829815b51
|
feat:反写规则代码迁移以及实体类字段新增
|
2 weeks ago |
lml
|
845af296ec
|
feat:反写规则代码迁移以及实体类字段新增
|
2 weeks ago |
chenchuchuan
|
c10afd0cbe
|
feat(mcp): 添加MCP工具管理员权限控制与端点鉴权
- 在 McpToolScanner 中增加管理类工具前缀配置,命中前缀的工具仅允许管理员调用
- 调用时优先复用请求上下文中的 TokenData,避免覆盖真实身份导致匿名执行
- 新增 buildDefaultTokenData 方法作为无请求上下文时的兜底
- 实现 isToolAllowed 与 isAdminOnlyTool 方法进行工具级授权判断
- 在 InterceptorConfig 中注册 McpAuthInterceptor,独立处理 MCP 端点鉴权
- 将 MCP 端点路径从主登录态拦截器中排除,避免密钥调用被 401 拦截
- common-botp 模块依赖版本更新,common-core 版本改为引用变量
- 在 common 父模块中注册 common-botp 子模块
|
2 weeks ago |
chenchuchuan
|
23209830b5
|
feat(botp): 新增单据转换平台核心模块
- 新增单据转换插件抽象基类 AbstractTransformPlugIn
- 实现字段映射策略模式(映射、常量、计算公式)
- 新增单据基础服务 BillBaseService,支持保存、提交、详情、删除
- 新增单据基础控制器 BillBaseController 及通用 CRUD 接口
- 新增单据转换核心引擎 BotpService 及转换关系数据模型
- 新增采购申请下推回写已订货数量插件 BackPurReqTransformPlugIn
- 新增单据转换关系及分录实体 BillRelation、BillRelationEntry
|
2 weeks ago |