Эх сурвалжийг харах

fix:(同步失败,不存在改变)代码生成,修改字段注解都不能修改
https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I5WP5M

huyuehua 2 жил өмнө
parent
commit
38161f05ac

+ 18 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java

@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -154,12 +155,27 @@ public class CodegenServiceImpl implements CodegenService {
         // 构建 CodegenColumnDO 数组,只同步新增的字段
         List<CodegenColumnDO> codegenColumns = codegenColumnMapper.selectListByTableId(tableId);
         Set<String> codegenColumnNames = CollectionUtils.convertSet(codegenColumns, CodegenColumnDO::getColumnName);
+
+        //计算需要修改的字段,插入时重新插入,删除时将原来的删除
+        BiPredicate<TableField, CodegenColumnDO> pr =
+                (tableField, codegenColumn) -> tableField.getType().equals(codegenColumn.getDataType())
+                        && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable()
+                        && tableField.isKeyFlag() == codegenColumn.getPrimaryKey()
+                        && tableField.getComment().equals(codegenColumn.getColumnComment());
+        Map<String, CodegenColumnDO> codegenColumnDOMap = CollectionUtils.convertMap(codegenColumns, CodegenColumnDO::getColumnName);
+        //需要修改的字段
+        Set<String> modifyFieldNames = tableFields.stream()
+                .filter(tableField -> codegenColumnDOMap.get(tableField.getColumnName()) != null
+                        && !pr.test(tableField, codegenColumnDOMap.get(tableField.getColumnName())))
+                .map(TableField::getColumnName)
+                .collect(Collectors.toSet());
         // 计算需要删除的字段
         Set<String> tableFieldNames = CollectionUtils.convertSet(tableFields, TableField::getName);
-        Set<Long> deleteColumnIds = codegenColumns.stream().filter(column -> !tableFieldNames.contains(column.getColumnName()))
+        Set<Long> deleteColumnIds = codegenColumns.stream()
+                .filter(column -> (!tableFieldNames.contains(column.getColumnName())) || modifyFieldNames.contains(column.getColumnName()))
                 .map(CodegenColumnDO::getId).collect(Collectors.toSet());
         // 移除已经存在的字段
-        tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()));
+        tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()) && (!modifyFieldNames.contains(column.getColumnName())));
         if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) {
             throw exception(CODEGEN_SYNC_NONE_CHANGE);
         }