@ -16,6 +16,7 @@ import apelet.common.core.util.MyModelUtil;
import apelet.common.core.validator.UpdateGroup ;
import apelet.common.core.validator.UpdateGroup ;
import apelet.common.dbutil.object.SqlTable ;
import apelet.common.dbutil.object.SqlTable ;
import apelet.common.dbutil.object.SqlTableColumn ;
import apelet.common.dbutil.object.SqlTableColumn ;
import apelet.common.generator.dto.OnlFormHeadDto ;
import apelet.common.generator.model.OnlFormField ;
import apelet.common.generator.model.OnlFormField ;
import apelet.common.generator.model.OnlFormHead ;
import apelet.common.generator.model.OnlFormHead ;
import apelet.common.generator.service.IOnlFormFieldService ;
import apelet.common.generator.service.IOnlFormFieldService ;
@ -38,6 +39,7 @@ import apelet.common.online.util.WidgetFieldTypeMapping;
import apelet.common.online.util.WidgetJsonUtil ;
import apelet.common.online.util.WidgetJsonUtil ;
import apelet.common.online.vo.OnlineFormVo ;
import apelet.common.online.vo.OnlineFormVo ;
import apelet.common.sequence.wrapper.IdGeneratorWrapper ;
import apelet.common.sequence.wrapper.IdGeneratorWrapper ;
import cn.hutool.core.bean.BeanUtil ;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.util.BooleanUtil ;
import cn.hutool.core.util.BooleanUtil ;
import cn.hutool.core.util.ObjectUtil ;
import cn.hutool.core.util.ObjectUtil ;
@ -290,6 +292,8 @@ public class OnlineFormController {
onlineFormDto . setWidgetJson ( updatedJson . toJSONString ( ) ) ;
onlineFormDto . setWidgetJson ( updatedJson . toJSONString ( ) ) ;
}
}
}
}
// ★ 多选关联(404):创建/复用中间表并回写绑定字段(前置:锚点字段已由 syncNewFieldsAndSubTables 创建,字段不存在则不处理)
syncMultiRelationTables ( onlineForm , dataSource ) ;
if ( ! onlineFormService . update ( onlineForm , originalOnlineForm , datasourceIdSet ) ) {
if ( ! onlineFormService . update ( onlineForm , originalOnlineForm , datasourceIdSet ) ) {
redissonClient . getBucket ( OnlineRedisKeyUtil . makeOnlineFormKey ( onlineForm . getFormId ( ) ) ) . delete ( ) ;
redissonClient . getBucket ( OnlineRedisKeyUtil . makeOnlineFormKey ( onlineForm . getFormId ( ) ) ) . delete ( ) ;
return ResponseResult . error ( ErrorCodeEnum . DATA_NOT_EXIST ) ;
return ResponseResult . error ( ErrorCodeEnum . DATA_NOT_EXIST ) ;
@ -736,9 +740,8 @@ public class OnlineFormController {
field . setCreateUserId ( tokenData . getUserId ( ) ) ;
field . setCreateUserId ( tokenData . getUserId ( ) ) ;
field . setUpdateTime ( now ) ;
field . setUpdateTime ( now ) ;
field . setUpdateUserId ( tokenData . getUserId ( ) ) ;
field . setUpdateUserId ( tokenData . getUserId ( ) ) ;
onlineQuickFormFieldService . save ( field ) ;
}
}
onlineQuickFormFieldService . saveBatch ( fieldList ) ;
}
}
// 3. 解析数据源与主表
// 3. 解析数据源与主表
OnlineDatasource datasource = onlineDatasourceService . getOnlineDatasourceByMasterTableId ( dto . getMasterTableId ( ) ) ;
OnlineDatasource datasource = onlineDatasourceService . getOnlineDatasourceByMasterTableId ( dto . getMasterTableId ( ) ) ;
@ -849,12 +852,17 @@ public class OnlineFormController {
if ( CollUtil . isEmpty ( fieldList ) | | columnIdMap = = null | | columnIdMap . isEmpty ( ) ) {
if ( CollUtil . isEmpty ( fieldList ) | | columnIdMap = = null | | columnIdMap . isEmpty ( ) ) {
return ;
return ;
}
}
List < OnlineQuickFormField > updateList = new ArrayList < > ( ) ;
for ( OnlineQuickFormField field : fieldList ) {
for ( OnlineQuickFormField field : fieldList ) {
Long columnId = columnIdMap . get ( field . getFieldName ( ) . toLowerCase ( ) ) ;
Long columnId = columnIdMap . get ( field . getFieldName ( ) . toLowerCase ( ) ) ;
if ( columnId ! = null & & ! Objects . equals ( columnId , field . getColumnId ( ) ) ) {
if ( columnId = = null | | Objects . equals ( columnId , field . getColumnId ( ) ) ) {
continue ;
}
field . setColumnId ( columnId ) ;
field . setColumnId ( columnId ) ;
onlineQuickFormFieldService . updateById ( field ) ;
updateList . ad d( field ) ;
}
}
if ( CollUtil . isNotEmpty ( updateList ) ) {
onlineQuickFormFieldService . updateBatchById ( updateList ) ;
}
}
}
}
@ -865,19 +873,48 @@ public class OnlineFormController {
if ( CollUtil . isEmpty ( fieldList ) ) {
if ( CollUtil . isEmpty ( fieldList ) ) {
return ;
return ;
}
}
// 先收集"是过滤条件且有过滤方案"的字段(同名字段后者覆盖,与原逐条更新语义一致),避免逐字段查列
Map < String , Integer > fieldFilterTypeMap = new HashMap < > ( ) ;
for ( OnlineQuickFormField field : fieldList ) {
for ( OnlineQuickFormField field : fieldList ) {
if ( field . getIsFilter ( ) = = null | | field . getIsFilter ( ) ! = 1 | | field . getFilterType ( ) = = null | | field . getFilterType ( ) = = FieldFilterType . NO_FILTER ) {
if ( field . getIsFilter ( ) = = null | | field . getIsFilter ( ) ! = 1 | | field . getFilterType ( ) = = null | | field . getFilterType ( ) = = FieldFilterType . NO_FILTER ) {
continue ;
continue ;
}
}
OnlineColumn column = onlineColumnService . getOnlineColumnByTableIdAndColumnName ( masterTableId , field . getFieldName ( ) ) ;
if ( StringUtils . isBlank ( field . getFieldName ( ) ) ) {
if ( column ! = null & & ! Objects . equals ( column . getFilterType ( ) , field . getFilterType ( ) ) ) {
continue ;
column . setFilterType ( field . getFilterType ( ) ) ;
}
column . setUpdateTime ( new Date ( ) ) ;
fieldFilterTypeMap . put ( field . getFieldName ( ) . toLowerCase ( ) , field . getFilterType ( ) ) ;
}
if ( fieldFilterTypeMap . isEmpty ( ) ) {
return ;
}
// 一次 IN 查询取回该表下目标列;历史脏数据可能同表同名列多条,取第一条(与原单条查询语义一致)
List < OnlineColumn > columnList = onlineColumnService . list ( new LambdaQueryWrapper < OnlineColumn > ( ) . eq ( OnlineColumn : : getTableId , masterTableId ) . in ( OnlineColumn : : getColumnName , fieldFilterTypeMap . keySet ( ) ) ) ;
if ( CollUtil . isEmpty ( columnList ) ) {
return ;
}
Map < String , OnlineColumn > columnMap = new HashMap < > ( ) ;
for ( OnlineColumn column : columnList ) {
if ( column . getColumnName ( ) ! = null ) {
columnMap . putIfAbsent ( column . getColumnName ( ) . toLowerCase ( ) , column ) ;
}
}
Date now = new Date ( ) ;
List < OnlineColumn > updateList = new ArrayList < > ( ) ;
for ( Map . Entry < String , Integer > entry : fieldFilterTypeMap . entrySet ( ) ) {
OnlineColumn column = columnMap . get ( entry . getKey ( ) ) ;
if ( column = = null | | Objects . equals ( column . getFilterType ( ) , entry . getValue ( ) ) ) {
continue ;
}
column . setFilterType ( entry . getValue ( ) ) ;
column . setUpdateTime ( now ) ;
column . setUpdateUserId ( tokenData . getUserId ( ) ) ;
column . setUpdateUserId ( tokenData . getUserId ( ) ) ;
onlineColumnService . updateById ( column ) ;
updateList . add ( column ) ;
redissonClient . getBucket ( OnlineRedisKeyUtil . makeOnlineTableKey ( masterTableId ) ) . delete ( ) ;
}
}
if ( updateList . isEmpty ( ) ) {
return ;
}
}
onlineColumnService . updateBatchById ( updateList ) ;
redissonClient . getBucket ( OnlineRedisKeyUtil . makeOnlineTableKey ( masterTableId ) ) . delete ( ) ;
}
}
// ============ 组件json列id回填 ============
// ============ 组件json列id回填 ============
@ -890,6 +927,9 @@ public class OnlineFormController {
if ( CollUtil . isEmpty ( fieldList ) ) {
if ( CollUtil . isEmpty ( fieldList ) ) {
return ;
return ;
}
}
// ① 收集待解析字段与所需关联表单id,避免逐字段三次查询
Map < OnlineQuickFormField , Long > fieldFormIdMap = new LinkedHashMap < > ( ) ;
Set < Long > relatedFormIdSet = new LinkedHashSet < > ( ) ;
for ( OnlineQuickFormField field : fieldList ) {
for ( OnlineQuickFormField field : fieldList ) {
if ( field . getFieldType ( ) = = null | | field . getFieldType ( ) ! = 402 ) {
if ( field . getFieldType ( ) = = null | | field . getFieldType ( ) ! = 402 ) {
continue ;
continue ;
@ -898,21 +938,43 @@ public class OnlineFormController {
if ( relatedFormId = = null ) {
if ( relatedFormId = = null ) {
continue ;
continue ;
}
}
OnlineForm relatedForm = onlineFormService . getById ( relatedFormId ) ;
fieldFormIdMap . put ( field , relatedFormId ) ;
relatedFormIdSet . add ( relatedFormId ) ;
}
if ( relatedFormIdSet . isEmpty ( ) ) {
return ;
}
// ② 批量取关联在线表单
Map < Long , OnlineForm > formMap = onlineFormService . listByIds ( relatedFormIdSet ) . stream ( ) . collect ( Collectors . toMap ( OnlineForm : : getFormId , Function . identity ( ) , ( a , b ) - > a ) ) ;
Set < Long > relatedTableIdSet = formMap . values ( ) . stream ( ) . map ( OnlineForm : : getMasterTableId ) . filter ( Objects : : nonNull ) . collect ( Collectors . toSet ( ) ) ;
// ③ 批量取关联主表
Map < Long , OnlineTable > tableMap = new HashMap < > ( ) ;
if ( ! relatedTableIdSet . isEmpty ( ) ) {
onlineTableService . listByIds ( relatedTableIdSet ) . forEach ( table - > tableMap . putIfAbsent ( table . getTableId ( ) , table ) ) ;
}
Set < String > relatedTableNameSet = tableMap . values ( ) . stream ( ) . map ( OnlineTable : : getTableName ) . filter ( StringUtils : : isNotBlank ) . collect ( Collectors . toSet ( ) ) ;
// ④ 批量取表头,同表名多条时取第一条
Map < String , OnlFormHead > headMap = new HashMap < > ( ) ;
if ( ! relatedTableNameSet . isEmpty ( ) ) {
onlFormHeadService . list ( new LambdaQueryWrapper < OnlFormHead > ( ) . in ( OnlFormHead : : getTableName , relatedTableNameSet ) ) . forEach ( head - > headMap . putIfAbsent ( head . getTableName ( ) , head ) ) ;
}
// ⑤ 内存回填
for ( Map . Entry < OnlineQuickFormField , Long > entry : fieldFormIdMap . entrySet ( ) ) {
OnlineForm relatedForm = formMap . get ( entry . getValue ( ) ) ;
if ( relatedForm = = null | | relatedForm . getMasterTableId ( ) = = null ) {
if ( relatedForm = = null | | relatedForm . getMasterTableId ( ) = = null ) {
continue ;
continue ;
}
}
OnlineTable relatedTable = onlineTableService . getById ( relatedForm . getMasterTableId ( ) ) ;
OnlineTable relatedTable = tableMap . get ( relatedForm . getMasterTableId ( ) ) ;
if ( relatedTable = = null ) {
if ( relatedTable = = null ) {
continue ;
continue ;
}
}
OnlFormHead relatedHead = onlFormHeadService . getOne ( new LambdaQueryWrapper < OnlFormHead > ( ) . eq ( OnlFormHead : : getTableName , relatedTable . getTableName ( ) ) ) ;
OnlFormHead relatedHead = headMap . get ( relatedTable . getTableName ( ) ) ;
if ( relatedHead = = null ) {
if ( relatedHead = = null ) {
continue ;
continue ;
}
}
field . setRefTableId ( relatedHead . getId ( ) ) ;
entry . getKey ( ) . setRefTableId ( relatedHead . getId ( ) ) ;
field . setRefTableName ( relatedTable . getTableName ( ) ) ;
entry . getKey ( ) . setRefTableName ( relatedTable . getTableName ( ) ) ;
field . setRefFormCode ( relatedForm . getFormCode ( ) ) ;
entry . getKey ( ) . setRefFormCode ( relatedForm . getFormCode ( ) ) ;
}
}
}
}
@ -1060,7 +1122,8 @@ public class OnlineFormController {
// 已有字段:字段控件带 slaveTableId(关联组件)则更新 refPropert;不带(如字典下拉)则清空残留,避免实体表误按关联表强转 Map 报错
// 已有字段:字段控件带 slaveTableId(关联组件)则更新 refPropert;不带(如字典下拉)则清空残留,避免实体表误按关联表强转 Map 报错
boolean isTableColumn = ! widget . containsKey ( "bindData" ) ;
boolean isTableColumn = ! widget . containsKey ( "bindData" ) ;
Integer comType = widget . getInteger ( "comType" ) ;
Integer comType = widget . getInteger ( "comType" ) ;
boolean isAssociation = ! isTableColumn | | ( comType ! = null & & comType = = 402 ) ;
// 404(关联多选)同为关联组件:保留 refPropert = F7 关联表id,中间表信息由 refMultiTableId 承载
boolean isAssociation = ! isTableColumn | | ( comType ! = null & & ( comType = = 402 | | comType = = WidgetFieldTypeMapping . WIDGET_TYPE_MULTI_RELATION ) ) ;
String slaveTableId = extractSlaveTableId ( widget ) ;
String slaveTableId = extractSlaveTableId ( widget ) ;
if ( isAssociation & & StrUtil . isNotEmpty ( slaveTableId ) ) {
if ( isAssociation & & StrUtil . isNotEmpty ( slaveTableId ) ) {
if ( ! Objects . equals ( existingField . getRefPropert ( ) , Long . valueOf ( slaveTableId ) ) ) {
if ( ! Objects . equals ( existingField . getRefPropert ( ) , Long . valueOf ( slaveTableId ) ) ) {
@ -1183,6 +1246,193 @@ public class OnlineFormController {
}
}
// ============ 多选关联(404)中间表同步 ============
/ * *
* 扫描 widgetJson 中的多选关联控件 ( widgetType = 404 ) , 为每个控件创建 / 复用其专用中间表 , 并把中间表 headId 回写绑定字段 。
* < p >
* 前置条件 : 控件绑定的字段必须已存在于 onl_form_field ( 锚点列由 syncNewFieldsAndSubTables 负责创建 ) ;
* 未填关联表名称 、 宿主导表不存在 、 绑定字段不存在时均不处理 。
*
* @param onlineForm 在线表单 , 以其 widgetJson 为准 。
* @param datasource 数据源 。
* @return 是否发生变更 。
* /
private boolean syncMultiRelationTables ( OnlineForm onlineForm , OnlineDatasource datasource ) {
if ( datasource = = null | | StrUtil . isBlank ( onlineForm . getWidgetJson ( ) ) ) {
return false ;
}
List < WidgetJsonUtil . MultiRelationWidget > multiRelationWidgetList = WidgetJsonUtil . collectMultiRelationWidgets ( JSON . parseObject ( onlineForm . getWidgetJson ( ) ) ) ;
if ( CollUtil . isEmpty ( multiRelationWidgetList ) ) {
return false ;
}
boolean changed = false ;
for ( WidgetJsonUtil . MultiRelationWidget widget : multiRelationWidgetList ) {
// 宿主可以是主表,也可以是分录表(404 列落在分录行上),按控件所属表解析
OnlFormHead hostHead = this . resolveHostHead ( widget . getTableKey ( ) ) ;
if ( hostHead = = null ) {
continue ;
}
OnlFormField boundField = onlFormFieldService . getOne ( new LambdaQueryWrapper < OnlFormField > ( ) . eq ( OnlFormField : : getHeadId , hostHead . getId ( ) ) . eq ( OnlFormField : : getFieldName , widget . getColumnName ( ) ) ) ;
if ( boundField = = null ) {
// 绑定字段尚未创建(锚点列未同步),不处理
continue ;
}
Long relationHeadId = this . createRelationTable ( hostHead , boundField , widget . getRelationTableName ( ) , datasource ) ;
if ( relationHeadId = = null ) {
continue ;
}
// 只更新关联 id,避免覆盖该字段行其它字段:
// refMultiTableId = 中间表 headId;refPropert = F7 关联目标表 headId(orm 的 MultiLink 靠它反查目标表,缺了会直接校验失败)
Long targetHeadId = this . resolveTargetHeadId ( widget ) ;
OnlFormField fieldUpdate = new OnlFormField ( ) ;
fieldUpdate . setId ( boundField . getId ( ) ) ;
fieldUpdate . setRefMultiTableId ( relationHeadId ) ;
if ( targetHeadId ! = null ) {
fieldUpdate . setRefPropert ( targetHeadId ) ;
}
boolean refChanged = targetHeadId ! = null & & ! Objects . equals ( boundField . getRefPropert ( ) , targetHeadId ) ;
if ( Objects . equals ( relationHeadId , boundField . getRefMultiTableId ( ) ) & & ! refChanged ) {
continue ;
}
onlFormFieldService . updateById ( fieldUpdate ) ;
// 元数据已变:清宿主表缓存,避免 EntityTable 带旧结构存活到缓存过期
this . evictHostTableCache ( hostHead ) ;
changed = true ;
}
return changed ;
}
/ * *
* 解析 404 控件 F7 目标表的 headId 。
* 优先用 widget 的 slaveTableId 直接查 ( 与 402 一致 ) ; 查不到时用 slaveTableName 兜底按表名查 。
*
* @param widget 404 控件绑定信息 。
* @return 目标表 onl_form_head . id , 均查不到返回 null 。
* /
private Long resolveTargetHeadId ( WidgetJsonUtil . MultiRelationWidget widget ) {
if ( widget . getSlaveTableId ( ) ! = null ) {
OnlFormHead targetHead = onlFormHeadService . getById ( widget . getSlaveTableId ( ) ) ;
if ( targetHead ! = null ) {
return targetHead . getId ( ) ;
}
}
if ( StrUtil . isNotBlank ( widget . getSlaveTableName ( ) ) ) {
OnlFormHead targetHead = onlFormHeadService . getOne ( new LambdaQueryWrapper < OnlFormHead > ( ) . eq ( OnlFormHead : : getTableName , widget . getSlaveTableName ( ) . toLowerCase ( ) ) ) ;
if ( targetHead ! = null ) {
return targetHead . getId ( ) ;
}
}
return null ;
}
/ * *
* 清宿主表的字段列表与实体元数据缓存 ( 中间表 headId 回写后调用 ) 。
* /
private void evictHostTableCache ( OnlFormHead hostHead ) {
redissonClient . getBucket ( CacheKey . makeTableKey ( hostHead . getTableName ( ) ) ) . delete ( ) ;
redissonClient . getBucket ( CacheKey . makeChildFieldListKey ( hostHead . getId ( ) ) ) . delete ( ) ;
metaCacheService . removeData ( hostHead . getTableName ( ) ) ;
}
/ * *
* 解析控件所属表的表头 : 表标识为纯数字时按 zz_online_table . table_id 取 , 否则按表名取 。
* /
private OnlFormHead resolveHostHead ( String tableKey ) {
if ( StrUtil . isBlank ( tableKey ) ) {
return null ;
}
OnlineTable hostTable = tableKey . matches ( "\\d+" ) ? onlineTableService . getById ( Long . valueOf ( tableKey ) ) : onlineTableService . getOne ( new LambdaQueryWrapper < OnlineTable > ( ) . eq ( OnlineTable : : getTableName , tableKey . toLowerCase ( ) ) ) ;
if ( hostTable = = null ) {
return null ;
}
return onlFormHeadService . getOne ( new LambdaQueryWrapper < OnlFormHead > ( ) . eq ( OnlFormHead : : getTableName , hostTable . getTableName ( ) ) ) ;
}
/ * *
* 创建 ( 或复用 ) 多选关联中间表 , 物理表名 = t_relation_ + 逻辑表名 。
* 流程 : 幂等判断 → 建 onl_form_head → 建 onl_form_field → syncDB 建物理表 → 建 zz_online_table 记录 。
*
* @param hostHead 宿主表头 ( 主表或分录表 ) 。
* @param boundField 多选控件绑定的字段 ( 锚点列 ) 。
* @param logicTableName 前端填写的关联表名称 ( 逻辑名 ) 。
* @param datasource 数据源 。
* @return 中间表的 onl_form_head . id , 创建失败返回 null 。
* /
private Long createRelationTable ( OnlFormHead hostHead , OnlFormField boundField , String logicTableName , OnlineDatasource datasource ) {
String relationTableName = "t_relation_" + logicTableName . trim ( ) . toLowerCase ( ) ;
// 幂等:元数据已存在时不再重建(物理表的存在与结构由 syncRelationTable 自行判断)
OnlFormHead existsHead = onlFormHeadService . getOne ( new LambdaQueryWrapper < OnlFormHead > ( ) . eq ( OnlFormHead : : getTableName , relationTableName ) ) ;
if ( existsHead ! = null ) {
this . ensureRelationOnlineTable ( relationTableName , datasource ) ;
return existsHead . getId ( ) ;
}
// ② 表头:table_type=3,且不设置 sort(避免被 getOneToManyOnlFormHeadCache 当作普通子表发现)
OnlFormHead relationHead = new OnlFormHead ( ) ;
relationHead . setId ( idGenerator . nextLongId ( ) ) ;
relationHead . setTableName ( relationTableName ) ;
relationHead . setTableTxt ( hostHead . getTableTxt ( ) + "-" + boundField . getFieldRemark ( ) + "多选关联表" ) ;
relationHead . setTableType ( CustomUtil . MetaType_Relation ) ;
relationHead . setStatus ( "0" ) ;
relationHead . setLine ( 0 ) ;
// ③ 字段行
OnlFormHeadDto relationHeadDto = new OnlFormHeadDto ( ) ;
BeanUtil . copyProperties ( relationHead , relationHeadDto ) ;
relationHeadDto . setOnlFormFieldList ( this . buildRelationTableFields ( ) ) ;
onlFormHeadService . addAll ( relationHeadDto ) ;
// ④ 建物理表(中间表无 id 列、biz_id+obj_id 联合主键,走专用建表并复用同步收尾)
OnlFormHead savedHead = onlFormHeadService . getById ( relationHead . getId ( ) ) ;
if ( savedHead = = null ) {
return null ;
}
onlFormHeadService . syncRelationTable ( savedHead ) ;
// ⑤ 建 zz_online_table 记录(须在物理表建好之后,从库反查表结构)
this . ensureRelationOnlineTable ( relationTableName , datasource ) ;
return savedHead . getId ( ) ;
}
/ * *
* 中间表字段定义 : id ( 主键 ) 、 biz_id ( 宿主行id ) 、 obj_id ( 所选记录主键 ) 。
* /
private List < OnlFormField > buildRelationTableFields ( ) {
List < OnlFormField > relationFieldList = new ArrayList < > ( 3 ) ;
// 中间表无 id 列,biz_id + obj_id 为联合主键(详见 IOnlFormHeadService#syncRelationTable)
relationFieldList . add ( this . buildRelationTableField ( "biz_id" , "主表业务ID" , 1 ) ) ;
relationFieldList . add ( this . buildRelationTableField ( "obj_id" , "关联表ID" , 1 ) ) ;
// orm 的 MultiLinkInsertExecutor 会写入 seq(勾选顺序),缺列会导致中间表插入失败
relationFieldList . add ( this . buildRelationTableField ( "seq" , "排序顺序" , 0 ) ) ;
return relationFieldList ;
}
private OnlFormField buildRelationTableField ( String fieldName , String fieldRemark , int isKey ) {
OnlFormField field = new OnlFormField ( ) ;
field . setFieldName ( fieldName ) ;
field . setFieldRemark ( fieldRemark ) ;
field . setFieldType ( "seq" . equals ( fieldName ) ? CustomUtil . FieldType_int : CustomUtil . FieldType_bigint ) ;
field . setIsKey ( isKey ) ;
field . setIsEmpty ( isKey = = 1 ? 0 : 1 ) ;
field . setIsDefault ( 1 ) ;
field . setRowDisabled ( 1 ) ;
field . setSyncFlag ( 0 ) ;
field . setDeletedFlag ( GlobalDeletedFlag . NORMAL ) ;
return field ;
}
/ * *
* 兜底创建中间表的 zz_online_table 记录 : 物理表已存在时可从库反查表结构 。
* /
private void ensureRelationOnlineTable ( String relationTableName , OnlineDatasource datasource ) {
OnlineTable existsOnlineTable = onlineTableService . getOne ( new LambdaQueryWrapper < OnlineTable > ( ) . eq ( OnlineTable : : getTableName , relationTableName . toLowerCase ( ) ) ) ;
if ( existsOnlineTable ! = null ) {
return ;
}
OnlineDblink dblink = onlineDblinkService . getById ( datasource . getDblinkId ( ) ) ;
SqlTable relationSqlTable = onlineDblinkService . getDblinkTable ( dblink , relationTableName ) ;
if ( relationSqlTable ! = null ) {
onlineTableService . saveNewFromSqlTable ( relationSqlTable ) ;
}
}
/ * *
/ * *
* 提取控件 / 子表列绑定的从表 id ( slaveTableId ) 。
* 提取控件 / 子表列绑定的从表 id ( slaveTableId ) 。
* 字段控件在 bindData 下 ; 子表列对象直接挂在顶层 。
* 字段控件在 bindData 下 ; 子表列对象直接挂在顶层 。