lml
|
b76b44db91
|
feat(generator): 表单/报表元数据租户隔离与增量更新
- OnlFormHead/OnlCgreportHead 实体补充 app_code 映射,对应库中
tenant_id/app_code 列与 idx_tenant_app 索引
- page 按 TokenData.currentTenantId() 过滤:A 端 = 当前租户,
B 端 tenant_id IS NULL;app_code 有值才参与过滤
- getById/listByHeadId/tableInfo/editAll/removeAllById 等 byId 入口校验归属,
不匹配抛 DataNotFoundException → 404
- 表单 editAll 按库中记录归属分流:A 端走 upsertChildData,
只更新/新增本次提交的行,管理端下发但本次未提交的字段保持原样;
B 端与 EAS 同步(tenant_id 为空或 isync=true)保持全量覆盖语义
- 新增 mergeChildIds:子表 id 只接受本表单已有行,其余按新增处理,
避免复用他行主键
- 报表 editAll 改为增量 upsert:items/params 为 null 视为未提交、
保持原配置;B 端删除未提交行,A 端只 upsert;跨报表 item id 置空后按新增处理
- 新增 getOwnedHead 统一报表归属校验;getRpColumns 按租户定位 code
|
1 day ago |
lml
|
6907bf5056
|
feat(core): 新增租户上下文与 404 异常,缓存键增加租户维度
- TokenData 新增 currentTenantId()/currentAppCode():A 端取登录租户,
B 端及无请求上下文(MQ、定时任务)返回 null
- 新增 DataNotFoundException,MyExceptionHandler 统一映射为 HTTP 404 +
DATA_NOT_EXIST,避免用 403 暴露资源是否存在
- CacheKey 的 FORM_HEAD_TABLE / FORM_HEAD_BY_TABLE_ID /
FORM_HEAD_TABLE_NAME / FORM_CHILD_FIELD / FORM_ONETOMANY_TABLE /
FORM_FIELD_BY_HEAD_Id 增加租户段(A 端 tenantId,B 端 base),
避免管理端复制来的相同 id 在租户之间互相覆盖缓存
|
1 day ago |
chenchuchuan
|
8bf1d4638c
|
feat(tenant): 实现租户自定义字段tenant_前缀隔离机制
- 新增 TenantFieldUtil 工具类,定义 tenant_ 前缀命名约定
- 管理端新增/编辑字段时校验禁止占用 tenant_ 前缀
- 租户端新增字段自动追加 tenant_ 前缀并同步改写 widgetJson 列名
- 拆分 OnlineFormTenantSyncService 为 syncFormUpdate 和 syncFormMetadata
- SysTenantRoleServiceImpl 移除内联同步逻辑,委托统一服务调用
- 新增 SyncLog 模型、Mapper 及 SyncLogService 记录同步操作日志
- 升级 common-online 至 1.0.7、common-generator 至 1.0.6
|
1 day ago |
chenchuchuan
|
3902dc8d53
|
chore(deps): 统一子模块依赖版本并移除根pom属性变量
- 移除根 pom.xml 中 common-core.version 属性定义
- 将根 pom 中版本变量引用替换为硬编码版本号
- 各子模块 pom 中为 common-core 依赖显式声明版本 1.0.1
- 各子模块 pom 中为 common-orm 依赖显式声明版本 1.0.4
- common-botp 版本从 1.0.0 升级至 1.0.1
- common-generator 版本从 1.0.5 升级至 1.0.6
- common-online 版本从 1.0.6 升级至 1.0.7
|
2 days ago |
chenchuchuan
|
937bdddea6
|
fix(tenant): 修复租户同步中tenantId类型错误及健壮性问题
- 将OnlCgreportHead和OnlFormHead的tenantId字段类型从String改为Long
- 修正同步处理中错误使用transId作为tenantId的问题,改为从消息体正确获取
- 新增parseRelativeFormCodes方法安全解析widgetJson,避免非法JSON抛异常
- 对in查询的空集合做防护,避免MyBatis-Plus传入空列表导致SQL异常
- 消息体中显式传递tenantId字段确保同步端可正确识别租户
- 角色查询中过滤null的roleId并使用LinkedHashSet去重
- 组织未配置角色时新增fallback机制回退到用户自身角色
- 表单元数据同步查询条件增加tenantId过滤确保租户隔离
|
2 days ago |
lml
|
a1c7bc8dc8
|
fix(botp): 打通「转换 → 手动保存 → 反写」链路并修复反写失效
- 移除转换时的反写触发:删除 ConvertOrchestrator#triggerSaveWriteBack 及其
WriteBackOrchestrator 依赖。转换只负责「源单 → 目标单」的数据复制,原实现在 autoSave
落库后补触发反写,等于把刚复制过去的值按规则再写回来,累加类公式让源单数量指数增长
(1→2→4→8→24),覆盖类公式把源单字段改成复制值。反写改由目标单被真正操作时触发,
入口已存在:SaveOperationServicePlugIn(保存)、AuditOperationServicePlugIn(审核),
时机由 reverse_writing_rules.trigger_timing 决定('1' 保存 / '2' 审核)
- 转换关系改用落库后的真实主键:BotpService#addNew 落库前收集分录「预发主键 → 对象实例」,
落库后读真实主键建立映射,saveRelation 用它覆盖 targe_entry_id。根因是
initDestBillData 建骨架时预发主键,而 ormGenDataSourceUtil.addNew 插入分录时会重新发号,
关系表存的是库里不存在的 id,反写按 targe_entry_id 查目标分录必然为空而静默跳过。
新增 BtpTransformResult#entryIdMap 承载映射,校正时打 INFO 记录「计划id / 实际id」
- 批量保存回写真实主键:新增 syncSavedIds,exePlugin 落库后把 ORM 回写的真实主键同步回
入参 JSON(表头直接覆盖,分录按 key 顺序 + 行下标对齐,与 getObjectValue 的入栈顺序一致)。
不回写的话 executeBatchSaveInTransaction 补写 convert_relation 时用预发 id,
关系指向不存在的记录,用户改单保存触发反写就会「找不到关联关系」。
实测:payload 里 header id=...101824 / entry id=...101825,
库里实际 ...04651520 / ...34011648
- 新增转换关系补写门面:BotpConvertRelationFacade(common-core 接口)+
ConvertRelationFacade(common-botp 实现),按 BillRelation JSON 补写
convert_relation / convert_relation_entry,target_id 以落库后真实主键覆盖,按主键幂等。
为什么需要:convert_relation 只在 BotpService#transform 的 autoSave 分支写入,
formStatus=2(未落库、前端手动保存)时转换阶段不写关系,保存后反写找不到来源单。
ConvertedBill 新增 billRelation,buildBatchSavePayload 内嵌到 masterData[i].billRelation,
父子关系由结构而非下标保证;executeBatchSave 摘出该键(不能当表头字段交给 ORM)。
executeBatchSaveInTransaction 增加 relationList 参数,落库后调 saveRelationQuietly 补写,
与保存在同一事务内。BotpReverseWriteSupport 泛化 getFacadeQuietly 支持按类型取门面,
未挂载 botp 的应用静默跳过
- 修正反写公式读写方向:formula(formulaEnglish) 指回写位置(源单),
sourceSingleField 指取值位置(目标单),原实现写反了,表现为「反写执行了但源单没变」。
变量统一改为 read(目标单,取值)/ write(源单,回写),避免后续再被读反
- 新增 isHeadTable:公式引用表头字段时用单据 id 查,引用分录字段时用分录行 id 查。
原先一律用分录 id,配成 请购单.请购单.供应商 这类表头字段时永远查不到行
- 新增 syncNonNumericValue:供应商、名称等文本字段无法做 BigDecimal 运算
(toBigDecimal 返回 null,nullToZero 后变成 0),改为正向直接把目标单值写到源单,
回滚按 before_value 恢复;目标单字段为空时跳过并告警,不把源单写空
- recordBeforeValue 改用 LambdaUpdateWrapper 显式 set:beforeValue 为 null 时
MyBatis-Plus 会跳过 null 字段,生成 UPDATE ... WHERE id=? 这种无 SET 的非法 SQL
- 新增 resolveEntryTableQuietly(key 兼容 tableId 与表名,解析不到返回 null 不抛)
与 toJsonRowList(分录值兼容数组与单行对象),用于主键回写
- 反写跳过日志补上表名与行 id,原先只打 id,无法判断查的是表头还是分录
- 新增 zz-resource/db-scripts/2026-10-27-convert-relation-entry-writeback-script.sql:
补 convert_relation_entry 的 before_value(decimal(24,8))与 writeback_rule_version(int)。
实体早已声明这两个字段(注释也写明「需要新增列」)但 DDL 未跟上,MyBatis-Plus 按实体
拼 SELECT,任何查询该表的 SQL 都会报 Unknown column 'before_value' in 'field list',
反写与转换落库都会直接失败。脚本用 information_schema 判断列是否存在,可重复执行
|
2 days ago |
lml
|
cb9ec85716
|
fix(botp): 未落库转换结果直接产出批量保存报文,并在批量保存中保留预生成主键
- ConvertResult 新增 batchSavePayload:formStatus=2 时后端组装好 executePluginBatch
的完整入参,前端透传即可;组装不出时返回 null 由前端按 entryTables 降级
- ConvertOrchestrator 新增 buildBatchSavePayload / buildSlaveData / resolveSaveButtonName:
每张单据表头内嵌自身分录(masterData[i].slaveData),父子关系由结构保证;
分录按 tableId 汇总、多关系合并而非覆盖;保存按钮按 SaveOperationServicePlugIn 类名精确匹配
- executeBatchSave 支持内嵌分录(摘出后从表头移除,内嵌优先,回退平行数组保持兼容)
- 主键改为有值就保留、缺失才发号:BOTP 预发主键已被 convert_relation.targetId 引用,
原先无条件覆盖会导致转换关系对不上;并新增表头/分录同批查重
- slaveData 的 key 兼容 tableId 与表名,修复传表名时 Long.valueOf 抛异常
- 新增分录表归属校验,查不到表或非本表单分录表时明确报错,避免分录被静默丢弃
|
3 days ago |
chenchuchuan
|
70860e7f08
|
feat(tenant): 将在线表单合并同步初版移植到 dev-lml
cherry-pick 6023f11(dev-wj):新增表单元数据/查询数据源/表单 JSON 三个同步消费者、
FormWidgetMergeUtils 三方合并、TenantConstant 同步命令、@TenantOnlFormHeadSuffix 切面,
并为 OnlFormHead/OnlCgreportHead 增加 tenantId。
冲突处理:
- OnlineFormServiceImpl:保留 dev-lml 的 commons-lang3 导入,追加 cacheLastUpdateOnlineForm
- SysUserController:取 dev-lml 版本(净变更仅为删除已不存在的 javafx 导入)
- 排除 zzlogs 日志文件
Co-Authored-By: Claude <noreply@anthropic.com>
|
3 days ago |
lml
|
86d231908b
|
feat(online): 新增批量新增接口,一次提交多张新单据
- 新增 /executePluginBatch:masterData 为数组,每个元素一张单据;
slaveData 可整批共享一个对象,也可传与表头等长的数组(下标对应)
- OnlineOperationService 新增 executePluginBatch / executeBatchSaveInTransaction
- executeBatchSaveInTransaction 单独暴露并经 Spring 代理调用,
保证 @Transactional 真正生效:逐条保存,任一条失败整批回滚
- 补齐主键:表头与分录主键统一由 IdGeneratorWrapper 发号,
分录 parent_id 挂到对应表头主键上,避免多单之间串行;
发号结果进入 newIdSet 防御重复主键
- 批量前期校验:按钮必须绑定保存插件、slaveData 格式与条数需与表头一致
- SaveOperationServicePlugIn 支持多单保存:优先取插件参数集合、为空退回 model,
去重后逐条保存并各自触发反写;仅一条时保持原有行为
- DeleteOperationServicePlugIn 修复 EAS 分支批量删除只删第一条:
改为汇总集合内全部主键后下发
|
4 days ago |
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 |
chenchuchuan
|
7dbf47524e
|
feat(openapi): 补充密钥列表展示绑定的应用编码
- 在 SysUserSecret 模型中新增 appCode 非数据库字段用于列表展示
- 新增 fillAppCode 方法,通过 OpenApiAppService 批量查询应用编码
- 将 fillAccountInfo 重构为 fillDisplayInfo,统一补全账号和应用展示信息
- 密钥列表和详情接口均调用 fillDisplayInfo 补全展示字段
|
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、建两张快照表,可重复执行
|
1 week ago |
chenchuchuan
|
080f3ce61b
|
refactor(common): 移除common-botp模块引用
- 从common/pom.xml中删除了common-botp模块的声明
- 该模块已从项目结构中移除
|
1 week ago |
chenchuchuan
|
dffc4f8f39
|
feat(mcp-auth): 添加 MCP 端点鉴权拦截器与人员密钥管理
- 新增 McpAuthInterceptor,支持 Bearer JWT 与人员密钥两种鉴权方式
- 定义 McpAuthService、McpAccountProvider 等 SPI 契约,由应用侧实现
- 新增 McpWebMvcConfig 自动注册拦截器,未实现 SPI 时 fail-closed 返回 401
- 新增 SysUserSecret 实体及完整 CRUD,支持密钥签发、轮换、启停
- 实现凭证校验逻辑:keyId 定位、状态与有效期检查、SHA-256 摘要比对、手机号绑定校验
- 为 McpStreamableController 和 McpToolConfig 添加 apelet.mcp.enabled 开关控制
- 非管理员只能查看和操作自己的密钥,响应中不返回 secretHash 并脱敏手机号
|
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
|
f901de1209
|
refactor(flow): 简化 resolveTitleCached 方法签名
- 移除 workOrder 和 taskKey 冗余参数,方法仅接收 taskInstanceExt
- 简化空判断逻辑,直接从 taskInstanceExt 读取落库 title
- 控制器中移除不再需要的 FlowWorkOrder 查询调用
- 更新所有调用点适配新的方法签名
|
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 |
chenchuchuan
|
73efdd4df7
|
refactor(flow): 简化标题解析逻辑并增加未解析标记
- 移除标题解析中对 FlowTaskExt、FlowEntry、FlowEntryPublish 的前置条件判断,标题只认 zz_flow_task_instance_ext 落库值
- 删除 FlowApiServiceImpl 和 FlowOperationController 中冗余的批量预加载逻辑,减少不必要的数据库查询
- 新增 title_incomplete 字段,当标题中残留未解析的 ${...} 占位符时自动标记
- FlowTaskInstanceExtMapper.xml 的 upsert 语句增加 title_incomplete 字段的插入与更新
- FlowTaskTitleBackfillServiceImpl 回填时统计 incomplete 条数,FlowTaskTitleBackfillVo 新增 incompleteCount 字段
- FlowConstant 中新增 TITLE_PLACEHOLDER_PREFIX 常量用于占位符检测
|
2 weeks ago |
chenchuchuan
|
9d968d549f
|
feat(flow): 新增任务标题关键字过滤并重构标题存储至节点扩展表
- 将标题存储从 zz_flow_work_order_ext.title_json 迁移至独立表 zz_flow_task_instance_ext
- getTaskListByUserName 新增 title 参数,待办列表支持按标题模糊过滤(Java 侧过滤)
- getHistoricProcessInstanceList 新增 title 参数,走 Flowable 原生 join 查询实现首节点标题过滤
- getHistoricTaskInstanceFinishedList 新增 title 参数,走原生 join 查询实现已办任务标题过滤
- resolveTitleCached 简化签名,仅读取落库值,移除按模板实时解析的兜底逻辑
- buildAndSaveTaskTitle 首节点补写改为取定义的起始节点而非当前活动任务,修复 autoskip 场景
- 删除流程实例时级联清理 zz_flow_task_instance_ext 中的标题行
- 新增 escapeLikeKeyword 转义 LIKE 通配符,防止用户输入注入
- 新增 TitleFilterContext 内部类封装标题过滤的懒加载与缓存逻辑
|
2 weeks ago |
chenchuchuan
|
4a682c6963
|
feat(openapi): 配置 OpenAPI 路由鉴权拦截器体系
- 在 InterceptorConfig 中注册 OpenApiAuthInterceptor 处理 OpenAPI 路由鉴权
- 将 OpenAPI 路径从 AuthenticationInterceptor 中排除,避免误拦截
- 通过 ObjectProvider 条件注册拦截器,支持 operationEnabled 开关
- 为 pageFormTree、files、download 接口添加 @NoAuthInterface 注解
|
2 weeks ago |
lml
|
192817f8e8
|
feat:添加选择全部功能
|
2 weeks ago |
chenchuchuan
|
59a736303b
|
feat(openapi): 为知识库开放接口添加免认证访问支持
- 在 OpenApiKbController 类上添加 @NoAuthInterface 注解以跳过鉴权
- 将 Spring Web 注解的多个单独 import 合并为通配符导入
|
3 weeks ago |
chenchuchuan
|
a65cd3b070
|
feat(openapi): 添加导入导出功能的免认证配置与CORS头暴露
- 为 OpenAPI 认证接口和路由执行接口添加 @NoAuthInterface 免认证注解
- CORS 配置新增 Content-Disposition 暴露头以支持文件下载
- 新增导入导出相关接口路径至在线操作白名单
- 完善导入导出配置项:最大行数、文件大小、批次大小、异步阈值
- 新增异步任务线程池配置:池大小与队列容量
- 规范开发环境配置文件注释与格式
|
3 weeks ago |
chenchuchuan
|
2108134d09
|
chore(deps): 统一父POM管理内部模块依赖版本
- 在根 pom.xml 的 properties 中声明 common-core 和 common-orm 版本
- 在根 pom.xml 的 dependencyManagement 中统一仲裁 common-core 与 common-orm 版本
- 移除各子模块中 common-core 和 common-orm 依赖的硬编码 version 标签
- 将 common-online 版本从 1.0.5 升级至 1.0.6 并同步更新引用方
- 将 common-generator 版本从 1.0.4 升级至 1.0.5
- tenant-admin 新增 common-core 依赖并将 common-demo 替换为 common-openapi
|
3 weeks ago |
chenchuchuan
|
a9993ffac9
|
chore(modules): 添加 common-openapi 和 common-core 模块
- 在父 pom 的 modules 中新增 common-openapi 模块
- 在父 pom 的 modules 中新增 common-core 模块
|
3 weeks ago |
chenchuchuan
|
b650a365ba
|
perf(flow): 引入任务标题快照缓存优化查询性能
- 在工单扩展表新增 titleJson 字段,按节点存储已解析的标题快照
- 任务创建时由 FlowUserTaskListener 自动生成标题并落库
- 新增 resolveTitleCached 方法,优先读取快照,取不到回退实时解析
- 列表查询批量预载工单扩展对象,消除逐行查询导致的 N+1 问题
- 优化 resolveTitle 内部业务数据加载,避免占位符循环中重复查询
- 首节点标题在工单创建后补写,解决 create 事件先于建单的时序问题
- 对存量无快照数据自动走回退分支,无需刷数据
|
3 weeks ago |
chenchuchuan
|
c3f0277445
|
feat(common-openapi): 添加在线表单操作按钮类型枚举及编码转换功能
- 新增 OnlineFormOperationEnum 枚举类,定义在线表单操作按钮类型映射关系
- 修改 OpenApiConfigServiceImpl 实现类,使用 type 字段派生操作编码替代 code 字段
- 更新 OpenApiExecServiceImpl 实现类,通过操作编码匹配启用状态验证逻辑
- 实现按钮类型到操作编码的稳定转换,解决前端表单设计器按钮改名导致匹配失效问题
- 添加未知类型回退机制,避免设计器新增按钮类型后配置流程阻塞
- 优化参数模式推导逻辑,按操作编码判断保存类操作而非按钮中文名
|
3 weeks ago |
chenchuchuan
|
6ae854791c
|
feat(common): 添加知识库开放接口文件清单分页对象
- 创建 OpenApiKbFilePageDto 类作为 /v1/kb/files 响应的 data
|
3 weeks ago |
chenchuchuan
|
fec35cd7d5
|
feat(openapi): 按表单分页查询文件清单接口改造
- 将文件清单查询接口改为分页模式,支持pageNo和pageSize参数
- 返回数据结构从列表改为分页对象,包含list/pageNo/pageSize/total/hasMore字段
- 添加分页查询逻辑,每次只返回一页数据,通过hasMore判断是否继续翻页
- 移除原来的全量查询和扫描限制机制,改为标准分页实现
- 保留所有主表记录,无附件记录的files字段为空数组而非被丢弃
- 添加页码和页面大小参数验证,默认值为1和500,上限1000
|
3 weeks ago |
chenchuchuan
|
fb35f2b406
|
refactor(flow): 重构流程候选用户名解析逻辑
- 提取候选用户名解析为独立方法 getCandidateUsernamesByExecution
- 添加对 EL 表达式的完整支持,包括 ${projectBean.getCommonReportManager(execution)} 形式
- 简化 AutoSkipTaskListener 中的用户名获取逻辑
- 统一多实例分配监听器中的候选用户处理方式
- 移除重复的字符串分割和变量获取代码
- 增强表达式求值的安全性,添加执行上下文验证
|
1 month ago |
chenchuchuan
|
b679ad5c47
|
feat(common-openapi): 新增知识库开放接口并优化token验证
- 新增OpenApiKbController提供知识库开放接口,包括页面表单树查询、文件清单获取和附件下载功能
- 新增多个DTO类用于知识库接口的数据传输,包括OpenApiKbFileNodeDto、OpenApiKbPageNodeDto等
- 实现OpenApiKbService接口及OpenApiKbServiceImpl服务类,提供完整的业务逻辑
- 优化OpenApiAuthInterceptor支持多种token请求头格式,优先取token后兼容accessToken
- 更新OpenApiAuthServiceImpl的token验证逻辑,支持Bearer前缀的兼容处理
- 引入StrUtil工具类进行字符串非空验证,增强代码健壮性
- 添加详细的接口文档说明,包括调用流程和参数说明
|
1 month ago |
chenchuchuan
|
b8e9998ec8
|
feat(online): 新增导入导出功能相关枚举和工具类
- 添加ImportAttrEnum、ImportExportEnabledStatus、ImportWriteModeEnum枚举类
- 实现ImportExportExcelUtil工具类,支持导入模板生成和文件下载
- 添加ImportExportFileCleanTimer定时清理任务
- 在OnlineConstant中增加导入导出模板缓存key相关方法
- 扩展OnlineDataSourceUtil提供IN条件查询功能
- 定义OnlineExportDataService接口及其实现类OnlineExportDataServiceImpl
- 修复ObjectValue类中类型转换可能引发的ClassCastException问题
|
1 month ago |
chenchuchuan
|
ad69472aab
|
feat(role-form-button): 更新在线表单按钮权限管理接口
- 修改 listAllFormButtons 方法支持按页面名称模糊查询
- 调整分页逻辑为按页面维度分页,每页包含页面下全部表单
- 更新方法签名添加 pageName 参数并调整参数顺序
- 实现页面到表单的两层嵌套数据结构返回
- 重构 OnlinePageService 查询方法支持页面名称模糊筛选
- 完善租户和应用代码的隔离条件处理
|
1 month ago |
chenchuchuan
|
93c691eade
|
feat(generator): 新增多选关联字段支持及流程任务分配优化
- 添加多选关联中间表类型定义(MetaType_Relation)及相应字段属性refMultiTableId
- 实现多选关联中间表的创建、同步和结构校验功能
- 重构表单字段服务以支持多选关联字段的双向关联查询
- 优化AutoSkipTaskListener中的任务分配人获取逻辑,支持表达式求值
- 增加流程任务监听器中表达式管理器的集成实现
- 完善ORM数据源工具中的关联表元数据递归解析防环机制
- 更新在线表单控制器以支持多选关联控件的中间表同步处理
|
1 month ago |
chenchuchuan
|
4aa8edb542
|
feat(mcp): 完善MCP工具参数解析支持嵌套对象数组
- 实现List<E>中E为带@McpToolParam对象时按对象展开items功能
- 添加hasMcpToolParamFields方法判断类型是否需要递归展开
- 优化toObject方法支持Map类型直接返回原参逻辑
- 扩展OnlineQuickFormField模型添加McpToolParam注解映射
- 增强OpenApiApp和OpenApiConfig模型的参数描述细节
- 重构OpenApiAppController集成McpToolClass工具类标注
- 添加LayoutType排版类型常量字典及校验方法
- 更新OnlineFormDto中表单类型和排版类型的详细描述
- 优化OpenApiAuthService中的应用凭证校验逻辑
- 新增removeAppWithRelationCheck服务方法检查关联关系后删除
- 调整OpenApiConfigController返回OpenApiConfigVo视图对象
- 修复MyBatis查询中LIKE语句安全拼接问题
|
2 months ago |
chenchuchuan
|
a0eb74ecd8
|
feat(common-openapi): 添加OpenAPI第三方应用管理和认证功能
- 新增OpenApiApp实体类及对应的数据库映射
- 实现OpenApiAppService服务接口及具体业务逻辑
- 添加OpenApiAppController控制器提供应用CRUD操作
- 实现OpenApiAuthService服务进行token签发与验证
- 添加OpenApiAuthController提供对外认证接口
- 创建OpenApiAuthInterceptor拦截器进行token校验
- 升级common-core版本至1.0.1并更新依赖引用
- 将exeListPlugin方法从Controller移至OnlineOperationService
- 移除OnlineOperationController中的废弃导入和私有方法
- 新增OpenApiConfig模型类用于存储接口配置信息
|
2 months ago |
chenchuchuan
|
3e25f370b8
|
feat(mcp): 添加MCP工具框架支持包括流式HTTP传输和注解扫描功能
- 新增 McpStreamableController 提供流式HTTP单端点支持 /tenantadmin/mcp
- 实现 StreamableHttpServerTransportProvider 支持MCP协议的流式HTTP传输
- 添加 @McpToolClass 和 @McpToolParam 注解用于标记MCP工具方法和参数
- 开发 McpToolScanner 扫描器自动注册带有注解的工具方法
- 集成 mcp-java8-sdk 依赖支持MCP协议服务器功能
- 新增 McpToolArgInfo 和 McpToolParamType 模型类处理工具参数元信息
- 配置 McpToolConfig 自动装配SSE和流式HTTP两种传输方式
- 为 MyPageParam 添加 MCP 参数注解支持分页参数映射
|
2 months ago |