content: package com.xiliu.generator.utils;
  
  import com.xiliu.generator.config.GenConfig;
  import com.xiliu.generator.constant.GenConstants;
  import com.xiliu.generator.entity.GenTable;
  import com.xiliu.generator.entity.GenTableColumn;
  import org.apache.commons.lang3.StringUtils;
  
  import java.util.Arrays;
  
  /**
   * @author xiliu
   * @description 代码生成器 工具类
   * @date 2022/7/15
   */
  public class GenUtils {
  
      /**
       * 初始化表信息
       */
      public static void initTable(GenTable genTable) {
          genTable.setClassName(convertClassName(genTable.getTableName()));
          genTable.setPackageName(GenConfig.getPackageName());
          genTable.setModuleName(getModuleName(GenConfig.getPackageName()));
          genTable.setBusinessName(getBusinessName(genTable.getTableName()));
          genTable.setFunctionName(genTable.getTableComment());
          genTable.setFunctionAuthor(GenConfig.getAuthor());
      }
  
      /**
       * 表名转换成Java类名
       * @param tableName 表名称
       * @return 类名
       */
      public static String convertClassName(String tableName) {
          // 获取是否自动去除表前缀
          boolean autoRemovePre = GenConfig.getAutoRemovePre();
          // 获取表前缀
          String tablePrefix = GenConfig.getTablePrefix();
          if (autoRemovePre && StringUtils.isNotBlank(tablePrefix)) {
              String[] searchList = StringUtils.split(tablePrefix, ",");
              tableName = replaceFirst(tableName, searchList);
          }
          return convertToCamelCase(tableName);
      }
  
      /**
       * 批量替换前缀
       * @param replacementm 替换值
       * @param searchList 替换列表
       * @return
       */
      public static String replaceFirst(String replacementm, String[] searchList){
          String text = replacementm;
          for (String searchString : searchList) {
              if (replacementm.startsWith(searchString)) {
                  text = replacementm.replaceFirst(searchString, "");
                  break;
              }
          }
          return text;
      }
  
      /**
       * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。
       * 例如：HELLO_WORLD -> HelloWorld
       * @param name 转换前的下划线大写方式命名的字符串
       * @return 转换后的驼峰式命名的字符串
       */
      public static String convertToCamelCase(String name) {
          StringBuilder result = new StringBuilder();
          if (StringUtils.isBlank(name)) {
              return "";
          } else if (!name.contains("_")) {
              // 不含下划线，仅将首字母大写
              return name.substring(0, 1).toUpperCase() + name.substring(1);
          }
          String[] camels = name.split("_");
          for (String camel : camels) {
              // 跳过原始字符串中开头、结尾的下换线或双重下划线
              if (camel.isEmpty()) {
                  continue;
              }
              // 首字母大写
              result.append(camel.substring(0, 1).toUpperCase());
              result.append(camel.substring(1).toLowerCase());
          }
          return result.toString();
      }
  
      /**
       * 获取模块名
       * @param packageName 包名
       * @return 模块名
       */
      public static String getModuleName(String packageName) {
          int lastIndex = packageName.lastIndexOf(".");
          int nameLength = packageName.length();
          return StringUtils.substring(packageName, lastIndex + 1, nameLength);
      }
  
      /**
       * 获取业务名
       * @param tableName 表名
       * @return 业务名
       */
      public static String getBusinessName(String tableName) {
          int lastIndex = tableName.lastIndexOf("_");
          int nameLength = tableName.length();
          return StringUtils.substring(tableName, lastIndex + 1, nameLength);
      }
  
      /**
       * 初始化列属性字段
       */
      public static void initColumnField(GenTableColumn column, GenTable table) {
          String dataType = getDbType(column.getColumnType());
          String columnName = column.getColumnName();
          column.setTableId(table.getTableId());
          // 设置java字段名
          column.setJavaField(toCamelCase(columnName));
          // 设置默认类型
          column.setJavaType(GenConstants.TYPE_STRING);
          column.setQueryType(GenConstants.QUERY_EQ);
  
          if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)){
              // 字符串长度超过500设置为文本域
              Integer columnLength = getColumnLength(column.getColumnType());
              String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
              column.setHtmlType(htmlType);
          } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) {
              // 时间类型
              column.setJavaType(GenConstants.TYPE_DATE);
              column.setHtmlType(GenConstants.HTML_DATETIME);
          } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)){
              // 数字类型
              column.setHtmlType(GenConstants.HTML_INPUT);
              // 如果是浮点型 统一用BigDecimal
              String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ",");
              if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0){
                  column.setJavaType(GenConstants.TYPE_BIGDECIMAL);
              } else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) {
                  // 如果是整形
                  column.setJavaType(GenConstants.TYPE_INTEGER);
              } else {
                  // 长整形
                  column.setJavaType(GenConstants.TYPE_LONG);
              }
          }
  
          // 插入字段（默认所有字段都需要插入）
          column.setIsInsert(GenConstants.REQUIRE);
  
          // 编辑字段
          if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !"1".equals(column.getIsPk())) {
              column.setIsEdit(GenConstants.REQUIRE);
          }
          // 列表字段
          if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !"1".equals(column.getIsPk())){
              column.setIsList(GenConstants.REQUIRE);
          }
          // 查询字段
          if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !"1".equals(column.getIsPk())) {
              column.setIsQuery(GenConstants.REQUIRE);
          }
  
          // 查询字段类型
          if (StringUtils.endsWithIgnoreCase(columnName, "name")){
              column.setQueryType(GenConstants.QUERY_LIKE);
          }
          // 状态字段设置单选框
          if (StringUtils.endsWithIgnoreCase(columnName, "status")) {
              column.setHtmlType(GenConstants.HTML_RADIO);
          }
          // 类型&性别字段设置下拉框
          else if (StringUtils.endsWithIgnoreCase(columnName, "type")
                  || StringUtils.endsWithIgnoreCase(columnName, "sex")){
              column.setHtmlType(GenConstants.HTML_SELECT);
          }
          // 图片字段设置图片上传控件
          else if (StringUtils.endsWithIgnoreCase(columnName, "image")){
              column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
          }
          // 文件字段设置文件上传控件
          else if (StringUtils.endsWithIgnoreCase(columnName, "file")) {
              column.setHtmlType(GenConstants.HTML_FILE_UPLOAD);
          }
          // 内容字段设置富文本控件
          else if (StringUtils.endsWithIgnoreCase(columnName, "content")) {
              column.setHtmlType(GenConstants.HTML_EDITOR);
          }
      }
  
      /**
       * 获取数据库类型字段
       * 例如： bigint 、varchar(64)
       * @param columnType 列类型
       * @return 截取后的列类型
       */
      public static String getDbType(String columnType) {
          if (StringUtils.indexOf(columnType, "(") > 0) {
              return StringUtils.substringBefore(columnType, "(");
          } else {
              return columnType;
          }
      }
  
      /**
       * 获取字段长度
       * @param columnType 列类型
       * @return 截取后的列类型
       */
      public static Integer getColumnLength(String columnType) {
          if (StringUtils.indexOf(columnType, "(") > 0) {
              String length = StringUtils.substringBetween(columnType, "(", ")");
              return Integer.valueOf(length);
          } else {
              return 0;
          }
      }
  
      /**
       * 驼峰式命名法 例如：user_name->userName
       */
      public static String toCamelCase(String s) {
          if (StringUtils.isNotBlank(s)) {
              // 小写
              s = s.toLowerCase();
              StringBuilder sb = new StringBuilder(s.length());
              // 大写
              boolean upperCase = false;
              for (int i = 0; i < s.length(); i++) {
                  char c = s.charAt(i);
                  if (c == '_') {
                      upperCase = true;
                  } else if (upperCase) {
                      sb.append(Character.toUpperCase(c));
                      upperCase = false;
                  } else {
                      sb.append(c);
                  }
              }
              return sb.toString();
          }
          return s;
      }
  
      /**
       * 校验数组是否包含指定值
       * @param arr 数组
       * @param targetValue 值
       * @return 是否包含
       */
      public static boolean arraysContains(String[] arr, String targetValue){
          return Arrays.asList(arr).contains(targetValue);
      }
  }
  