@@ -70,7 +70,7 @@ private TableInfoDTO(DbTable dbTable) {
7070 }
7171
7272 private static void merge (TableInfoDTO oldData , TableInfoDTO newData ) {
73- if (oldData == null ) {
73+ if (oldData == null || CollectionUtil . isEmpty ( oldData . getFullColumn ()) ) {
7474 return ;
7575 }
7676 if (!StringUtils .isEmpty (oldData .getPreName ())) {
@@ -88,32 +88,66 @@ private static void merge(TableInfoDTO oldData, TableInfoDTO newData) {
8888 if (!StringUtils .isEmpty (oldData .getSaveModelName ())) {
8989 newData .saveModelName = oldData .getSaveModelName ();
9090 }
91- if (CollectionUtil .isEmpty (oldData .getFullColumn ())) {
92- return ;
93- }
94- // 补充自定义列
95- for (ColumnInfoDTO oldColumn : oldData .getFullColumn ()) {
96- if (!oldColumn .getCustom ()) {
97- continue ;
91+ List <String > allNewColumnNames = newData .getFullColumn ().stream ().map (ColumnInfoDTO ::getName ).collect (Collectors .toList ());
92+ // 列出旧的顺序,并删除已经不存在的列,不包括自定义列
93+ List <ColumnInfoDTO > oldSequenceColumn = oldData .getFullColumn ().stream ()
94+ .filter (item -> allNewColumnNames .contains (item .getName ()) || Boolean .TRUE .equals (item .getCustom ()))
95+ .collect (Collectors .toList ());
96+ // 尽可能的保留原始顺序(把自定义列按原始位置插入)
97+ Map <String , String > nameMap = new HashMap <>(oldSequenceColumn .size ());
98+ for (int i = 0 ; i < oldSequenceColumn .size (); i ++) {
99+ ColumnInfoDTO columnInfo = oldSequenceColumn .get (i );
100+ if (columnInfo .getCustom ()) {
101+ // 如果原本是自定义列,现在变成了数据库列,则忽略调原本的自定义列
102+ if (allNewColumnNames .contains (columnInfo .getName ())) {
103+ continue ;
104+ }
105+ // 获取当前自定义列的前一个名称
106+ String beforeName = "" ;
107+ if (i > 0 ) {
108+ beforeName = oldSequenceColumn .get (i - 1 ).getName ();
109+ }
110+ nameMap .put (beforeName , columnInfo .getName ());
98111 }
99- newData .getFullColumn ().add (oldColumn );
100112 }
101- // 保持旧列的顺序
102- Map <String , ColumnInfoDTO > map = newData .getFullColumn ().stream ().collect (Collectors .toMap (ColumnInfoDTO ::getName , val -> val ));
113+ // 将自定义列按顺序插入到新表中
114+ nameMap .forEach ((k , v ) -> {
115+ if (StringUtils .isEmpty (k )) {
116+ allNewColumnNames .add (0 , v );
117+ } else {
118+ for (int i = 0 ; i < allNewColumnNames .size (); i ++) {
119+ if (allNewColumnNames .get (i ).equals (k )) {
120+ allNewColumnNames .add (i + 1 , v );
121+ return ;
122+ }
123+ }
124+ }
125+ });
126+ // 按顺序依次重写数据
127+ Map <String , ColumnInfoDTO > oldColumnMap = oldData .getFullColumn ().stream ().collect (Collectors .toMap (ColumnInfoDTO ::getName , v -> v ));
128+ Map <String , ColumnInfoDTO > newColumnMap = newData .getFullColumn ().stream ().collect (Collectors .toMap (ColumnInfoDTO ::getName , v -> v ));
103129 List <ColumnInfoDTO > tmpList = new ArrayList <>();
104- for (ColumnInfoDTO columnInfo : oldData .getFullColumn ()) {
105- ColumnInfoDTO newColumn = map .get (columnInfo .getName ());
106- if (newColumn != null ) {
107- // ext属性转移
108- newColumn .setExt (columnInfo .getExt ());
109- tmpList .add (newColumn );
130+ for (String name : allNewColumnNames ) {
131+ ColumnInfoDTO newColumnInfo = newColumnMap .get (name );
132+ if (newColumnInfo == null ) {
133+ newColumnInfo = oldColumnMap .get (name );
134+ if (newColumnInfo == null ) {
135+ throw new NullPointerException ("找不到列信息" );
136+ }
137+ tmpList .add (newColumnInfo );
138+ continue ;
110139 }
111- }
112- // 补充剩余列
113- for (ColumnInfoDTO columnInfoDTO : newData .getFullColumn ()) {
114- if (!tmpList .contains (columnInfoDTO )) {
115- tmpList .add (columnInfoDTO );
140+ ColumnInfoDTO oldColumnInfo = oldColumnMap .get (name );
141+ if (oldColumnInfo == null ) {
142+ tmpList .add (newColumnInfo );
143+ continue ;
144+ }
145+ // 需要进行合并操作
146+ newColumnInfo .setExt (oldColumnInfo .getExt ());
147+ if (StringUtils .isEmpty (newColumnInfo .getComment ())) {
148+ newColumnInfo .setComment (oldColumnInfo .getComment ());
116149 }
150+ tmpList .add (newColumnInfo );
117151 }
118152 // list数据替换
119153 newData .getFullColumn ().clear ();
@@ -187,6 +221,7 @@ public TableInfo toTableInfo(PsiClass psiClass) {
187221 return tableInfo ;
188222 }
189223
224+ @ SuppressWarnings ("unchecked" )
190225 public TableInfo toTableInfo (DbTable dbTable ) {
191226 TableInfo tableInfo = new TableInfo ();
192227 tableInfo .setObj (dbTable );
@@ -216,7 +251,7 @@ public TableInfo toTableInfo(DbTable dbTable) {
216251 columnInfo .setShortType (split [split .length - 1 ]);
217252 columnInfo .setComment (dto .getComment ());
218253 columnInfo .setCustom (dto .getCustom ());
219- columnInfo .setExt (dto .getExt ());
254+ columnInfo .setExt (JSON . parse ( dto .getExt (), HashMap . class ));
220255 tableInfo .getFullColumn ().add (columnInfo );
221256 if (columnInfo .getObj () != null && DasUtil .isPrimary (columnInfo .getObj ())) {
222257 tableInfo .getPkColumn ().add (columnInfo );
@@ -242,7 +277,7 @@ public static TableInfoDTO valueOf(TableInfo tableInfo) {
242277 ColumnInfoDTO columnInfoDTO = new ColumnInfoDTO ();
243278 columnInfoDTO .setName (columnInfo .getName ());
244279 columnInfoDTO .setType (columnInfo .getType ());
245- columnInfoDTO .setExt (columnInfo .getExt ());
280+ columnInfoDTO .setExt (JSON . toJson ( columnInfo .getExt () ));
246281 columnInfoDTO .setCustom (columnInfo .getCustom ());
247282 columnInfoDTO .setComment (columnInfo .getComment ());
248283 dto .getFullColumn ().add (columnInfoDTO );
0 commit comments