ソースを参照

处理日期、外键、字典值

shiqian 4 年 前
コミット
ca08e3f9ff

+ 1 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteFileService.java

@@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 import com.boman.common.core.constant.ServiceNameConstants;
 import com.boman.common.core.constant.ServiceNameConstants;
 import com.boman.common.core.domain.R;
 import com.boman.common.core.domain.R;
-import com.boman.system.api.domain.SysFile;
+import com.boman.domain.SysFile;
 import com.boman.system.api.factory.RemoteFileFallbackFactory;
 import com.boman.system.api.factory.RemoteFileFallbackFactory;
 
 
 /**
 /**

+ 1 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/factory/RemoteFileFallbackFactory.java

@@ -6,7 +6,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 import com.boman.common.core.domain.R;
 import com.boman.common.core.domain.R;
 import com.boman.system.api.RemoteFileService;
 import com.boman.system.api.RemoteFileService;
-import com.boman.system.api.domain.SysFile;
+import com.boman.domain.SysFile;
 import feign.hystrix.FallbackFactory;
 import feign.hystrix.FallbackFactory;
 
 
 /**
 /**

+ 11 - 1
boman-api/boman-domain/src/main/java/com.boman.domain/GenTableColumn.java

@@ -151,7 +151,7 @@ public class GenTableColumn extends BaseEntity
     private String regular;
     private String regular;
 
 
     /**
     /**
-     * readonly
+     * readonly, 前端回显的时候,判断是否可编辑
      */
      */
     private boolean readonly;
     private boolean readonly;
 
 
@@ -161,6 +161,16 @@ public class GenTableColumn extends BaseEntity
      */
      */
     private Map<String, Object> fkInfo;
     private Map<String, Object> fkInfo;
 
 
+    private List<SysFile> annex;
+
+    public List<SysFile> getAnnex() {
+        return annex;
+    }
+
+    public void setAnnex(List<SysFile> annex) {
+        this.annex = annex;
+    }
+
     public Map<String, Object> getFkInfo() {
     public Map<String, Object> getFkInfo() {
         return fkInfo;
         return fkInfo;
     }
     }

+ 1 - 13
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysFile.java → boman-api/boman-domain/src/main/java/com.boman.domain/SysFile.java

@@ -1,7 +1,4 @@
-package com.boman.system.api.domain;
-
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+package com.boman.domain;
 
 
 /**
 /**
  * 文件信息
  * 文件信息
@@ -66,13 +63,4 @@ public class SysFile
         this.uid = uid;
         this.uid = uid;
     }
     }
 
 
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("name", getName())
-            .append("url", getUrl())
-            .append("uid", getUid())
-            .append("status", getStatus())
-            .toString();
-    }
 }
 }

+ 10 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/array/ArrayUtils.java

@@ -18,4 +18,14 @@ public class ArrayUtils extends org.apache.commons.lang3.ArrayUtils {
     public static boolean arraysContains(String[] arr, String targetValue) {
     public static boolean arraysContains(String[] arr, String targetValue) {
         return Arrays.asList(arr).contains(targetValue);
         return Arrays.asList(arr).contains(targetValue);
     }
     }
+
+    /**
+     * 数组是否为空
+     *
+     * @param value 数组
+     * @return 是否包含
+     */
+    public static boolean equalsEmptyArray(String value) {
+        return "[]".equals(value);
+    }
 }
 }

+ 5 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/collection/CollectionUtils.java

@@ -2,6 +2,7 @@ package com.boman.common.core.utils.collection;
 
 
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.utils.obj.ObjectUtils;
 
 
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -14,4 +15,8 @@ public class CollectionUtils {
         ObjectUtils.requireNonNull(longList);
         ObjectUtils.requireNonNull(longList);
         return longList.toArray(new Long[0]);
         return longList.toArray(new Long[0]);
     }
     }
+
+    public static boolean containsIgnoreCase(Collection<String> list, String key) {
+        return list.contains(key.toLowerCase()) || list.contains(key.toUpperCase());
+    }
 }
 }

+ 1 - 1
boman-modules/boman-file/src/main/java/com/boman/file/controller/SysFileController.java

@@ -9,7 +9,7 @@ import org.springframework.web.multipart.MultipartFile;
 import com.boman.common.core.domain.R;
 import com.boman.common.core.domain.R;
 import com.boman.common.core.utils.file.FileUtils;
 import com.boman.common.core.utils.file.FileUtils;
 import com.boman.file.service.ISysFileService;
 import com.boman.file.service.ISysFileService;
-import com.boman.system.api.domain.SysFile;
+import com.boman.domain.SysFile;
 
 
 /**
 /**
  * 文件请求处理
  * 文件请求处理

+ 1 - 1
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysProfileController.java

@@ -20,7 +20,7 @@ import com.boman.common.log.annotation.Log;
 import com.boman.common.log.enums.BusinessType;
 import com.boman.common.log.enums.BusinessType;
 import com.boman.common.security.service.TokenService;
 import com.boman.common.security.service.TokenService;
 import com.boman.system.api.RemoteFileService;
 import com.boman.system.api.RemoteFileService;
-import com.boman.system.api.domain.SysFile;
+import com.boman.domain.SysFile;
 import com.boman.system.api.domain.SysUser;
 import com.boman.system.api.domain.SysUser;
 import com.boman.system.api.model.LoginUser;
 import com.boman.system.api.model.LoginUser;
 import com.boman.system.service.ISysUserService;
 import com.boman.system.service.ISysUserService;

+ 31 - 25
boman-web-core/src/main/java/com/boman/web/core/mapper/StandardlyMapper.java

@@ -164,12 +164,17 @@ public interface StandardlyMapper {
     /**
     /**
      * 功能描述: 根据tableName和map(属性名和属性值)进行查查
      * 功能描述: 根据tableName和map(属性名和属性值)进行查查
      * {@link SqlProvider#getByMap(java.util.Map)}
      * {@link SqlProvider#getByMap(java.util.Map)}
-     * @param tableName tableName
-     * @param param     属性名和属性值
+     *
+     * @param tableName     tableName
+     * @param condition     属性名和属性值
+     * @param packCondition 属性名和属性值 条件
      * @return java.util.List<com.alibaba.fastjson.JSONObject>
      * @return java.util.List<com.alibaba.fastjson.JSONObject>
      */
      */
     @SelectProvider(type = SqlProvider.class, method = "getByMap")
     @SelectProvider(type = SqlProvider.class, method = "getByMap")
-    List<JSONObject> getByMap(@Param("tableName") String tableName, @Param("param") JSONObject param, @Param("limitOne") boolean limitOne);
+    List<JSONObject> getByMap(@Param("tableName") String tableName
+            , @Param("condition") JSONObject condition
+            , @Param("packCondition") JSONObject packCondition
+            , @Param("limitOne") boolean limitOne);
 
 
     public static class SqlProvider {
     public static class SqlProvider {
         static final String[] READONLY_COLUMNS = new String[]{"OWNERID", "OWNERNAME", "OWNERENAME", "CREATIONDATE", "ID"};
         static final String[] READONLY_COLUMNS = new String[]{"OWNERID", "OWNERNAME", "OWNERENAME", "CREATIONDATE", "ID"};
@@ -536,22 +541,20 @@ public interface StandardlyMapper {
         }
         }
 
 
         public String getByMap(Map<String, Object> para) {
         public String getByMap(Map<String, Object> para) {
-            JSONObject param = (JSONObject) para.get("param");
+            JSONObject condition = (JSONObject) para.get("condition");
+            JSONObject packCondition = (JSONObject) para.get("packCondition");
             String tableName = (String) para.get("tableName");
             String tableName = (String) para.get("tableName");
             boolean limitOne = (boolean) para.get("limitOne");
             boolean limitOne = (boolean) para.get("limitOne");
 
 
             String result;
             String result;
             StringBuilder wholeSql = new StringBuilder();
             StringBuilder wholeSql = new StringBuilder();
             wholeSql.append("select * from ").append(tableName);
             wholeSql.append("select * from ").append(tableName);
-            if (isEmpty(param)) {
+            if (isEmpty(condition)) {
                 result = wholeSql.toString();
                 result = wholeSql.toString();
             } else {
             } else {
-                wholeSql.append(" where ");
-                for (Map.Entry<String, Object> entry : param.entrySet()) {
-                    wholeSql.append(entry.getKey()).append(" = ").append(entry.getValue()).append(" and ");
-                }
-
-                result = StringUtils.substringBeforeLast(wholeSql.toString(), "and");
+                // 条件
+                packCondition(packCondition, wholeSql);
+                result = wholeSql.toString();
             }
             }
 
 
             result = limitOne ? result + " limit 1" : result;
             result = limitOne ? result + " limit 1" : result;
@@ -615,21 +618,24 @@ public interface StandardlyMapper {
          * @param wholeSql      sql
          * @param wholeSql      sql
          */
          */
         private void packCondition(JSONObject packCondition, StringBuilder wholeSql) {
         private void packCondition(JSONObject packCondition, StringBuilder wholeSql) {
-            if (isNotEmpty(packCondition)) {
-                wholeSql.append(" where ");
-                StringBuilder conditionSql = new StringBuilder();
-                for (Map.Entry<String, Object> entry : packCondition.entrySet()) {
-                    String key = entry.getKey();
-                    Object valueObj = entry.getValue();
-                    List<String> types = ((List<String>) valueObj);
-                    // {@link com.boman.system.common.TableServiceCmdService.packColCondition} 这里是拼参数的地方
-                    String value = types.get(0);
-                    String queryType = types.get(1);
-                    String columnType = types.get(2);
-                    conditionSql.append(key).append(covert(queryType, columnType, key, value)).append(" and ");
-                }
-                wholeSql.append(StringUtils.substringBeforeLast(conditionSql.toString(), " and"));
+            if (isEmpty(packCondition)) {
+                return;
             }
             }
+
+            wholeSql.append(" where ");
+            StringBuilder conditionSql = new StringBuilder();
+            for (Map.Entry<String, Object> entry : packCondition.entrySet()) {
+                String key = entry.getKey();
+                Object valueObj = entry.getValue();
+                List<String> types = ((List<String>) valueObj);
+                /** {@link com.boman.web.core.utils.ColumnUtils.packColCondition} 这里是拼参数的地方 **/
+                String value = types.get(0);
+                String queryType = types.get(1);
+                String columnType = types.get(2);
+                conditionSql.append(key).append(covert(queryType, columnType, key, value)).append(" and ");
+            }
+
+            wholeSql.append(StringUtils.substringBeforeLast(conditionSql.toString(), " and"));
         }
         }
 
 
         /**
         /**

+ 35 - 180
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -3,9 +3,7 @@ package com.boman.web.core.service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
 import com.boman.common.core.constant.GenConstants;
 import com.boman.common.core.constant.GenConstants;
-import com.boman.common.core.utils.DateUtils;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.array.ArrayUtils;
 import com.boman.common.core.utils.array.ArrayUtils;
 import com.boman.common.core.utils.collection.CollectionUtils;
 import com.boman.common.core.utils.collection.CollectionUtils;
@@ -13,14 +11,13 @@ import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.web.domain.AjaxResult;
 import com.boman.common.core.web.domain.AjaxResult;
 import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.service.RedisService;
 import com.boman.common.redis.service.RedisService;
-import com.boman.domain.SysDictData;
 import com.boman.domain.constant.*;
 import com.boman.domain.constant.*;
 import com.boman.gen.api.RemoteGenTableColumnService;
 import com.boman.gen.api.RemoteGenTableColumnService;
 import com.boman.gen.api.RemoteGenTableService;
 import com.boman.gen.api.RemoteGenTableService;
 import com.boman.domain.GenTable;
 import com.boman.domain.GenTable;
 import com.boman.domain.GenTableColumn;
 import com.boman.domain.GenTableColumn;
 import com.boman.system.api.RemoteDictDataService;
 import com.boman.system.api.RemoteDictDataService;
-import com.boman.system.api.domain.SysFile;
+import com.boman.domain.SysFile;
 import com.boman.web.core.domain.*;
 import com.boman.web.core.domain.*;
 import com.boman.web.core.service.delete.IBaseDeleteService;
 import com.boman.web.core.service.delete.IBaseDeleteService;
 import com.boman.web.core.service.save.IBaseSaveService;
 import com.boman.web.core.service.save.IBaseSaveService;
@@ -43,9 +40,13 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 import java.util.function.Predicate;
 
 
+import static com.boman.common.core.constant.GenConstants.HTML_FILE_UPLOAD;
+import static com.boman.common.core.constant.GenConstants.HTML_IMAGE_UPLOAD;
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.domain.constant.FormDataConstant.*;
 import static com.boman.domain.constant.FormDataConstant.*;
 import static com.boman.web.core.utils.ColumnUtils.*;
 import static com.boman.web.core.utils.ColumnUtils.*;
+import static com.boman.web.core.utils.HandlerFormDataUtils.*;
+import static com.boman.web.core.utils.JSONObjectUtils.containsKeyIgnoreCase;
 
 
 /**
 /**
  * @author shiqian
  * @author shiqian
@@ -209,6 +210,7 @@ public class TableServiceCmdService {
     public AjaxResult queryList(FormDataDto dto) {
     public AjaxResult queryList(FormDataDto dto) {
         requireNonNull(dto.getTable(), "tableName = [" + dto.getTable() + "] 此表不存在");
         requireNonNull(dto.getTable(), "tableName = [" + dto.getTable() + "] 此表不存在");
         GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, dto.getTable());
         GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, dto.getTable());
+        String tableName = genTable.getTableName();
         JSONObject fixedData = ifNullSetEmpty(dto.getFixedData());
         JSONObject fixedData = ifNullSetEmpty(dto.getFixedData());
         List<GenTableColumn> columns = genTable.getColumns();
         List<GenTableColumn> columns = genTable.getColumns();
 
 
@@ -235,12 +237,14 @@ public class TableServiceCmdService {
             return AjaxResult.success(rows);
             return AjaxResult.success(rows);
         }
         }
 
 
-        List<JSONObject> result = selectService.selectByCondition(genTable.getTableName(), condition, packCondition
-                , showData, dto.getOrderBy(), dto.getLimit(), dto.getOffset());
+        List<JSONObject> result = selectService.selectByCondition(tableName, condition, packCondition, showData, dto);
+        result = filter(result, ObjectUtils::isNotEmpty);
         // 处理blob
         // 处理blob
-        handlerBlobWithJSONObject(genTable.getIsContainsBlob(), result);
+        handleBlob(result, genTable.getIsContainsBlob());
         // 处理日期、外键、字典值
         // 处理日期、外键、字典值
-        handler(result = filter(result, ObjectUtils::isNotEmpty), columns);
+        handleDictForQueryList(result, columns);
+        handleDateTimeForQueryList(result, columns);
+        handleFkForQueryList(result, columns);
         // 定制接口
         // 定制接口
         result = isCustomized(dto.getTable(), result, "trigger_retrieve");
         result = isCustomized(dto.getTable(), result, "trigger_retrieve");
 
 
@@ -248,129 +252,6 @@ public class TableServiceCmdService {
         return AjaxResult.success(rows);
         return AjaxResult.success(rows);
     }
     }
 
 
-    private void handler(List<JSONObject> result, List<GenTableColumn> columns) {
-        // 处理时间
-        handlerDate(result, columns);
-        // 处理字典值
-        handlerSysDictData(result, columns);
-        // 处理外键
-        handlerForeignKey(result, columns);
-    }
-
-    /**
-     * 功能描述: 处理外键 todo 待优化
-     *
-     * @param result  result
-     * @param columns 该表对应的所有的列
-     */
-    private void handlerForeignKey(List<JSONObject> result, List<GenTableColumn> columns) {
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(result)) {
-            return;
-        }
-        // 拿到所有有fk的列
-        List<GenTableColumn> fkColumns = filter(columns, col -> ObjectUtils.isNotEmpty(col.getForeignKey()));
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(fkColumns)) {
-            return;
-        }
-
-        for (GenTableColumn column : fkColumns) {
-            JSONObject jsonObject = new JSONObject();
-            String selfColumnName = column.getColumnName();
-            for (JSONObject json : result) {
-                if (json.containsKey(selfColumnName.toUpperCase()) || json.containsKey(selfColumnName.toLowerCase())) {
-                    Map<String, Object> fkInfoMap = column.getFkInfo();
-                    Object fkTableName = fkInfoMap.get(FK_TABLE_NAME);
-                    Object fkColumnName = fkInfoMap.get(FK_COLUMN_NAME);
-                    Object dkColumnName = fkInfoMap.get(DK_COLUMN_NAME);
-                    Object primaryTableFkValue = json.get(selfColumnName);
-
-                    JSONObject param = new JSONObject();
-                    param.put(fkColumnName.toString(), primaryTableFkValue);
-                    JSONObject fkInfo = selectService.getOneByMap(fkTableName.toString(), param);
-
-                    Object value = fkInfo.get(dkColumnName);
-                    jsonObject.put(SINGLE_OBJ_NAME, primaryTableFkValue);
-                    jsonObject.put(SINGLE_OBJ_VALUE, value);
-                    json.put(selfColumnName.toLowerCase(), jsonObject);
-                }
-            }
-        }
-    }
-
-    /**
-     * 功能描述: 把timeStamp转为string, 默认类型为:YYYY_MM_DD
-     *
-     * @param result 被转的数据
-     */
-    private void handlerDate(List<JSONObject> result, List<GenTableColumn> columns) {
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(result)) {
-            return;
-        }
-
-        for (JSONObject jsonObject : result) {
-            for (GenTableColumn column : columns) {
-                if (jsonObject.containsKey(column.getColumnName()) && NEED_CONVERT_DATE_LIST.contains(column.getColumnType())) {
-                    Date date = jsonObject.getTimestamp(column.getColumnName());
-                    if (null != date) {
-                        jsonObject.put(column.getColumnName(), DateUtils.dateTime(date));
-                    }
-                }
-            }
-        }
-    }
-
-
-    /**
-     * 功能描述: 处理附件,把数据拿出来转换成name、url形式
-     *
-     * @param result 被转的数据
-     */
-    private void handlerAnnex(List<JSONObject> result, List<GenTableColumn> columns) {
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(result)) {
-            return;
-        }
-
-        for (JSONObject jsonObject : result) {
-            for (GenTableColumn column : columns) {
-                if (jsonObject.containsKey(column.getColumnName())) {
-                    String value = jsonObject.getString(column.getColumnName());
-                    List<SysFile> fileList = JSON.parseObject(value, new TypeReference<List<SysFile>>() {
-                    }.getType());
-                    jsonObject.put(column.getColumnName(), fileList);
-                }
-            }
-        }
-    }
-
-    /**
-     * 功能描述: 把返回值中含有字典值的转为可视化的心事
-     *
-     * @param result 被转的数据
-     */
-    private void handlerSysDictData(List<JSONObject> result, List<GenTableColumn> columns) {
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(result)) {
-            return;
-        }
-
-        for (JSONObject jsonObject : result) {
-            for (GenTableColumn column : columns) {
-                String dictType = column.getDictType();
-                if (isNotEmpty(dictType) && jsonObject.containsKey(column.getColumnName())) {
-                    String dictLabel = null;
-                    try {
-                        List<SysDictData> sysDictData = listSysDictDataByType(dictType);
-                        jsonObject.put("sysDictData", sysDictData);
-//                        dictLabel = remoteDictDataService.selectDictLabel(dictType, jsonObject.getString(column.getColumnName()));
-//                        jsonObject.put(column.getColumnName(), dictLabel);
-//                        column.setColumnValue(jsonObject.get(column.getColumnName()));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-            }
-        }
-    }
-
     /**
     /**
      * 功能描述: 获取单表单数据
      * 功能描述: 获取单表单数据
      *
      *
@@ -395,28 +276,39 @@ public class TableServiceCmdService {
         JSONObject json = selectService.selectById(tableName, pkName, id);
         JSONObject json = selectService.selectById(tableName, pkName, id);
         requireNonNull(json, "id 为[" + id + "]的数据不存在, 表名为[" + tableName + "]");
         requireNonNull(json, "id 为[" + id + "]的数据不存在, 表名为[" + tableName + "]");
         // 处理blob
         // 处理blob
-        handlerBlobWithJSONObject(genTable.getIsContainsBlob(), Collections.singletonList(json));
-        List<GenTableColumn> parentColumns = filterHrAndSort(columns);
+        handleBlob(Collections.singletonList(json), genTable.getIsContainsBlob());
 
 
+        List<GenTableColumn> parentColumns = filterHrAndSort(columns);
         // 处理成hr的形式
         // 处理成hr的形式
         for (GenTableColumn hrColumn : parentColumns) {
         for (GenTableColumn hrColumn : parentColumns) {
             List<GenTableColumn> children = Lists.newArrayListWithCapacity(16);
             List<GenTableColumn> children = Lists.newArrayListWithCapacity(16);
             for (GenTableColumn column : columns) {
             for (GenTableColumn column : columns) {
                 if (hrColumn.getId().equals(column.getHrParentId())) {
                 if (hrColumn.getId().equals(column.getHrParentId())) {
                     String columnName = column.getColumnName();
                     String columnName = column.getColumnName();
-                    // handler column
-                    if (json.containsKey(columnName)) {
-                        handlerSysDictData(Collections.singletonList(json), Collections.singletonList(column));
-                        handlerDate(Collections.singletonList(json), Collections.singletonList(column));
-                        handlerForeignKey(Collections.singletonList(json), Collections.singletonList(column));
-                        if (GenConstants.HTML_IMAGE_UPLOAD.equalsIgnoreCase(column.getHtmlType())
-                                || GenConstants.HTML_FILE_UPLOAD.equalsIgnoreCase(column.getHtmlType())) {
-                            handlerAnnex(Collections.singletonList(json), Collections.singletonList(column));
+                    String columnType = column.getColumnType();
+                    String htmlType = column.getHtmlType();
+                    String dictType = column.getDictType();
+                    if (containsKeyIgnoreCase(json, columnName)) {
+                        // sysDict
+                        if (isNotEmpty(dictType)) {
+                            // 既要sysDictData还得要columnValue
+                            column.setSysDictData(listSysDictDataByType(dictType));
+                            column.setColumnValue(json.get(columnName));
+                        }
+                        // dateTime
+                        if (NEED_CONVERT_DATE_LIST.contains(columnType)) {
+                            column.setColumnValue(getStrDate(json.getTimestamp(columnName)));
+                        }
+                        // fk
+                        if (isNotEmpty(column.getForeignKey())) {
+                            column.setFkInfo(getFkMap(column.getFkInfo(), json.get(columnName)));
+                        }
+                        // annex
+                        if (HTML_IMAGE_UPLOAD.equalsIgnoreCase(htmlType) || HTML_FILE_UPLOAD.equalsIgnoreCase(htmlType)) {
+                            column.setAnnex(getAnnex(json.getString(columnName)));
                         }
                         }
 
 
                         column.setReadonly(SubmitConstant.STATUS.equals(columnName));
                         column.setReadonly(SubmitConstant.STATUS.equals(columnName));
-                        column.setColumnValue(json.get(columnName));
-                        column.setSysDictData((List<SysDictData>)json.get("sysDictData"));
                     }
                     }
 
 
                     children.add(column);
                     children.add(column);
@@ -431,33 +323,6 @@ public class TableServiceCmdService {
         return AjaxResult.success(result);
         return AjaxResult.success(result);
     }
     }
 
 
-    /**
-     * 功能描述: 封装成查询条件 key: 列名,  value:查询条件_查询类别
-     * eg: [{"config_name": ["系统配置", "EQ", "varchar(100)"]}]
-     *
-     * @param columns columns
-     * @return com.alibaba.fastjson.JSONObject
-     */
-    private JSONObject packColCondition(List<GenTableColumn> columns, JSONObject condition) {
-        requireNonNull(columns);
-
-        JSONObject result = new JSONObject(columns.size());
-        for (Map.Entry<String, Object> entry : condition.entrySet()) {
-            String key = entry.getKey();
-            Object value = entry.getValue();
-            for (GenTableColumn column : columns) {
-                // long string collection 暂时只作此三种类型判断
-                if (column.getColumnName().equalsIgnoreCase(key) && ObjectUtils.isNotEmpty(value)) {
-                    // columnType 作为判断需不需要转义的一个标准,防止索引失效
-                    result.put(key, Lists.newArrayList(String.valueOf(value), column.getQueryType(), column.getColumnType()));
-                    break;
-                }
-            }
-        }
-
-        return result;
-    }
-
     /**
     /**
      * 功能描述: 获取表单查询字段、按钮、表头
      * 功能描述: 获取表单查询字段、按钮、表头
      * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
      * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
@@ -803,15 +668,5 @@ public class TableServiceCmdService {
         AjaxResult ajaxResult = remoteGenTableColumnService.listColumnsByTableId(table.getId());
         AjaxResult ajaxResult = remoteGenTableColumnService.listColumnsByTableId(table.getId());
         return ajaxResult;
         return ajaxResult;
     }
     }
-
-    public List<SysDictData> listSysDictDataByType(String dictType) {
-        List<SysDictData> sysDictData = null;
-        try {
-            sysDictData = remoteDictDataService.listByType(dictType);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return sysDictData;
-    }
 }
 }
 
 

+ 8 - 6
boman-web-core/src/main/java/com/boman/web/core/service/select/BaseSelectServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.RedisKey;
 import com.boman.domain.GenTable;
 import com.boman.domain.GenTable;
+import com.boman.web.core.domain.FormDataDto;
 import com.boman.web.core.mapper.StandardlyMapper;
 import com.boman.web.core.mapper.StandardlyMapper;
 import com.boman.web.core.service.TableServiceCmdService;
 import com.boman.web.core.service.TableServiceCmdService;
 import com.boman.web.core.utils.ColumnUtils;
 import com.boman.web.core.utils.ColumnUtils;
@@ -45,12 +46,11 @@ public class BaseSelectServiceImpl implements IBaseSelectService {
      * @return java.util.List<com.alibaba.fastjson.JSONObject>
      * @return java.util.List<com.alibaba.fastjson.JSONObject>
      */
      */
     @Override
     @Override
-    public List<JSONObject> selectByCondition(String tableName, JSONObject condition
-            , JSONObject packCondition, JSONArray showData, String orderBy, Integer limit, Integer offset) {
+    public List<JSONObject> selectByCondition(String tableName, JSONObject condition, JSONObject packCondition, JSONArray showData, FormDataDto dto) {
         requireNonNull(tableName, "表名为空");
         requireNonNull(tableName, "表名为空");
         requireNonNull(showData, "表: [" + tableName + "] , 过滤了可展示字段,一个展示字段都没有,还查个鬼啊");
         requireNonNull(showData, "表: [" + tableName + "] , 过滤了可展示字段,一个展示字段都没有,还查个鬼啊");
-        requireNonNull(orderBy);
-        return mapper.selectByCondition(tableName, condition, packCondition, showData, orderBy, limit, offset);
+        String orderBy = requireNonNull(dto.getOrderBy());
+        return mapper.selectByCondition(tableName, condition, packCondition, showData, orderBy, dto.getLimit(), dto.getOffset());
     }
     }
 
 
     /**
     /**
@@ -67,7 +67,8 @@ public class BaseSelectServiceImpl implements IBaseSelectService {
         // 判断condition中列是否都在此table中
         // 判断condition中列是否都在此table中
         GenTable gent = cmdService.getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName);
         GenTable gent = cmdService.getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName);
         ColumnUtils.checkColumn(param, gent.getColumns());
         ColumnUtils.checkColumn(param, gent.getColumns());
-        return mapper.getByMap(tableName, param, false);
+        JSONObject packColCondition = ColumnUtils.packColCondition(gent.getColumns(), param);
+        return mapper.getByMap(tableName, param, packColCondition, false);
     }
     }
 
 
 
 
@@ -85,7 +86,8 @@ public class BaseSelectServiceImpl implements IBaseSelectService {
         // 判断condition中列是否都在此table中
         // 判断condition中列是否都在此table中
         GenTable gent = cmdService.getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName);
         GenTable gent = cmdService.getTableFromRedisByTableName(RedisKey.TABLE_INFO, tableName);
         ColumnUtils.checkColumn(param, gent.getColumns());
         ColumnUtils.checkColumn(param, gent.getColumns());
-        List<JSONObject> result = mapper.getByMap(tableName, param, true);
+        JSONObject packColCondition = ColumnUtils.packColCondition(gent.getColumns(), param);
+        List<JSONObject> result = mapper.getByMap(tableName, param, packColCondition, true);
         return isEmpty(result) ? null : result.get(0);
         return isEmpty(result) ? null : result.get(0);
     }
     }
 
 

+ 3 - 5
boman-web-core/src/main/java/com/boman/web/core/service/select/IBaseSelectService.java

@@ -2,6 +2,7 @@ package com.boman.web.core.service.select;
 
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.boman.web.core.domain.FormDataDto;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -36,13 +37,10 @@ public interface IBaseSelectService {
      * @param condition     原始查询条件
      * @param condition     原始查询条件
      * @param packCondition 封装的查询条件
      * @param packCondition 封装的查询条件
      * @param showData      前台需要查询的列
      * @param showData      前台需要查询的列
-     * @param orderBy       orderBy
-     * @param limit         分页
-     * @param offset        分页
+     * @param dto       dto.orderBy dto.limit dto.offset
      * @return java.util.List<com.alibaba.fastjson.JSONObject>
      * @return java.util.List<com.alibaba.fastjson.JSONObject>
      */
      */
-    List<JSONObject> selectByCondition(String tableName, JSONObject condition, JSONObject packCondition
-            , JSONArray showData, String orderBy, Integer limit, Integer offset);
+    List<JSONObject> selectByCondition(String tableName, JSONObject condition, JSONObject packCondition, JSONArray showData, FormDataDto dto);
 
 
     /**
     /**
      * 功能描述: 根据条件查询
      * 功能描述: 根据条件查询

+ 20 - 52
boman-web-core/src/main/java/com/boman/web/core/utils/ColumnUtils.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.core.utils.StringUtils;
+import com.boman.common.core.utils.collection.CollectionUtils;
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.domain.GenTableColumn;
 import com.boman.domain.GenTableColumn;
 import com.boman.domain.exception.UnknownColumnException;
 import com.boman.domain.exception.UnknownColumnException;
@@ -201,64 +202,41 @@ public class ColumnUtils {
         List<String> all = map(origin, GenTableColumn::getColumnName);
         List<String> all = map(origin, GenTableColumn::getColumnName);
         for (Object obj : target) {
         for (Object obj : target) {
             String columnName = (String) obj;
             String columnName = (String) obj;
-            if (!all.contains(columnName.toLowerCase()) || !all.contains(columnName.toUpperCase())) {
+            if (!CollectionUtils.containsIgnoreCase(all, columnName)) {
                 throw new UnknownColumnException("此表 [" + tableName + "]中没有 [" + columnName + "] 字段");
                 throw new UnknownColumnException("此表 [" + tableName + "]中没有 [" + columnName + "] 字段");
             }
             }
         }
         }
     }
     }
 
 
     /**
     /**
-     * 功能描述: 根据从数据库查出来的返回值来确实是否是blob, 转为字符串! 转为字符串! 转为字符串!
+     * 功能描述: 封装成查询条件 key: 列名,  value:查询条件_查询类别
+     * eg: [{"config_name": ["系统配置", "EQ", "varchar(100)"]}]
      *
      *
-     * @param isContainsBlob 此表中的字段是否含有blob的列, true含
-     * @param result         result
+     * @param columns columns
+     * @return com.alibaba.fastjson.JSONObject
      */
      */
-    public static void handlerBlobWithJSONObject(Boolean isContainsBlob, List<JSONObject> result) {
-        // 不包含
-        if (BooleanUtils.isFalse(isContainsBlob)) {
-            return;
+    public static JSONObject packColCondition(List<GenTableColumn> columns, JSONObject condition) {
+        if (isEmpty(condition)) {
+            return condition;
         }
         }
 
 
-        for (JSONObject jsonObject : result) {
-            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
-                Object value = entry.getValue();
-                if (isNotEmpty(value) && BYTE_ARRAY.equals(value.getClass().getSimpleName())) {
-                    entry.setValue(byteToString(((byte[]) value)));
+        JSONObject packColCondition = new JSONObject(columns.size());
+        for (Map.Entry<String, Object> entry : condition.entrySet()) {
+            String key = entry.getKey();
+            Object value = entry.getValue();
+            for (GenTableColumn column : columns) {
+                // long string collection 暂时只作此三种类型判断
+                if (column.getColumnName().equalsIgnoreCase(key) && ObjectUtils.isNotEmpty(value)) {
+                    // columnType 作为判断需不需要转义的一个标准,防止索引失效
+                    packColCondition.put(key, Lists.newArrayList(String.valueOf(value), column.getQueryType(), column.getColumnType()));
+                    break;
                 }
                 }
             }
             }
         }
         }
-    }
-
-    /**
-     * 功能描述: 根据从数据库查出来的返回值来确实是否是blob, 转为字符串! 转为字符串! 转为字符串!
-     *
-     * @param result result
-     */
-    public static void handlerBlobWithTableColumn(Boolean isContainsBlob, List<GenTableColumn> result) {
-        // 不包含
-        if (BooleanUtils.isFalse(isContainsBlob)) {
-            return;
-        }
-
-        for (GenTableColumn column : result) {
-            Object value = column.getColumnValue();
-            if (isNotEmpty(value) && BYTE_ARRAY.equals(value.getClass().getSimpleName())) {
-                column.setColumnValue(byteToString(((byte[]) value)));
-            }
-        }
-    }
 
 
-    public static String byteToString(byte[] bytes) {
-        String result = "";
-        if (ArrayUtils.isNotEmpty(bytes)) {
-            result = new String(bytes, StandardCharsets.UTF_8);
-        }
-
-        return result;
+        return packColCondition;
     }
     }
 
 
-
-
     /**
     /**
      * 功能描述: 数字小的在前面,数字大的在后面
      * 功能描述: 数字小的在前面,数字大的在后面
      *
      *
@@ -297,14 +275,4 @@ public class ColumnUtils {
         }
         }
     }
     }
 
 
-    /**
-     * 连接字符串数组集合
-     *
-     * @param iterable 集合
-     * @return 连接结果
-     */
-    public static String joinList(Iterable iterable) {
-        Joiner joiner = Joiner.on(", ").skipNulls();
-        return joiner.join(iterable);
-    }
 }
 }

+ 193 - 0
boman-web-core/src/main/java/com/boman/web/core/utils/HandlerFormDataUtils.java

@@ -0,0 +1,193 @@
+package com.boman.web.core.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.boman.common.core.utils.DateUtils;
+import com.boman.common.core.utils.SpringUtils;
+import com.boman.common.core.utils.array.ArrayUtils;
+import com.boman.common.core.utils.obj.ObjectUtils;
+import com.boman.domain.GenTableColumn;
+import com.boman.domain.SysDictData;
+import com.boman.domain.SysFile;
+import com.boman.system.api.RemoteDictDataService;
+import com.boman.web.core.service.select.IBaseSelectService;
+import org.apache.commons.lang3.BooleanUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+import static com.boman.domain.constant.FormDataConstant.*;
+import static com.boman.web.core.utils.JSONObjectUtils.containsKeyIgnoreCase;
+
+/**
+ * @author shiqian
+ * @date 2021年04月29日 14:32
+ **/
+public class HandlerFormDataUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(HandlerFormDataUtils.class);
+
+    /**
+     * 功能描述: 处理字典值,不查询所有的字典值, 不放入sysDictData,只根据dictValue查询dictLabel
+     *
+     * @param result     db中查出的结果
+     * @param allColumns 所有的列
+     */
+    public static void handleDictForQueryList(List<JSONObject> result, List<GenTableColumn> allColumns) {
+        if (isEmpty(result)) {
+            return;
+        }
+
+        RemoteDictDataService remoteDictDataService = SpringUtils.getBean(RemoteDictDataService.class);
+        for (JSONObject jsonObject : result) {
+            for (GenTableColumn column : allColumns) {
+                String dictType = column.getDictType();
+                String columnName = column.getColumnName();
+                if (containsKeyIgnoreCase(jsonObject, columnName) && isNotEmpty(dictType)) {
+                    // 列表需要字典值的dictLabel, 不放入sysDictData
+                    String dictLabel = remoteDictDataService.selectDictLabel(dictType, jsonObject.getString(columnName));
+                    jsonObject.put(columnName, dictLabel);
+                }
+            }
+        }
+    }
+
+    /**
+     * 功能描述: 把timeStamp转为string, 默认类型为:YYYY_MM_DD
+     *
+     * @param result 被转的数据
+     */
+    public static void handleDateTimeForQueryList(List<JSONObject> result, List<GenTableColumn> allColumns) {
+        if (isEmpty(result)) {
+            return;
+        }
+
+        for (JSONObject jsonObject : result) {
+            for (GenTableColumn column : allColumns) {
+                String columnName = column.getColumnName();
+                String columnType = column.getColumnType();
+                if (containsKeyIgnoreCase(jsonObject, columnName) && NEED_CONVERT_DATE_LIST.contains(columnType)) {
+                    jsonObject.put(columnName, getStrDate(jsonObject.getTimestamp(columnName)));
+                }
+            }
+        }
+    }
+
+    /**
+     * 功能描述: 处理外键
+     *
+     * @param result     result
+     * @param allColumns 该表对应的所有的列
+     */
+    public static void handleFkForQueryList(List<JSONObject> result, List<GenTableColumn> allColumns) {
+        if (isEmpty(result)) {
+            return;
+        }
+        // 拿到所有有fk的列
+        List<GenTableColumn> fkColumns = filter(allColumns, col -> ObjectUtils.isNotEmpty(col.getForeignKey()));
+        if (isEmpty(fkColumns)) {
+            return;
+        }
+
+        for (JSONObject jsonObject : result) {
+            for (GenTableColumn column : fkColumns) {
+                String selfColumnName = column.getColumnName();
+                if (containsKeyIgnoreCase(jsonObject, selfColumnName)) {
+                    JSONObject fkMap = getFkMap(column.getFkInfo(), jsonObject.get(selfColumnName));
+                    jsonObject.put(selfColumnName.toLowerCase(), fkMap);
+                }
+            }
+        }
+    }
+
+    /**
+     * 功能描述: 根据从数据库查出来的返回值来确实是否是blob, 转为字符串! 转为字符串! 转为字符串!
+     *
+     * @param isContainsBlob 此表中的字段是否含有blob的列, true含
+     * @param result         result
+     */
+    public static void handleBlob(List<JSONObject> result, Boolean isContainsBlob) {
+        // 不包含
+        if (BooleanUtils.isFalse(isContainsBlob)) {
+            return;
+        }
+
+        for (JSONObject jsonObject : result) {
+            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                Object value = entry.getValue();
+                if (isNotEmpty(value) && BYTE_ARRAY.equals(value.getClass().getSimpleName())) {
+                    entry.setValue(byteToString(((byte[]) value)));
+                }
+            }
+        }
+    }
+
+    public static List<SysDictData> listSysDictDataByType(String dictType) {
+        RemoteDictDataService remoteDictDataService = SpringUtils.getBean(RemoteDictDataService.class);
+        List<SysDictData> list = null;
+        try {
+            list = remoteDictDataService.listByType(dictType);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return list;
+    }
+
+    /**
+     * 功能描述: yyyy-MM-dd
+     *
+     * @param date date
+     * @return java.lang.String
+     */
+    public static String getStrDate(Date date) {
+        if (null == date) {
+            return null;
+        }
+
+        return DateUtils.dateTime(date);
+    }
+
+    public static JSONObject getFkMap(Map<String, Object> fkInfoMap, Object value) {
+        Object fkTableName = fkInfoMap.get(FK_TABLE_NAME);
+        Object fkColumnName = fkInfoMap.get(FK_COLUMN_NAME);
+        Object dkColumnName = fkInfoMap.get(DK_COLUMN_NAME);
+
+        // 到子表中查
+        JSONObject param = new JSONObject();
+        param.put(fkColumnName.toString(), value);
+        IBaseSelectService selectService = SpringUtils.getBean(IBaseSelectService.class);
+        JSONObject fkInfo = selectService.getOneByMap(fkTableName.toString(), param);
+
+        JSONObject result = new JSONObject();
+        Object fkValue = fkInfo.get(dkColumnName);
+        result.put(SINGLE_OBJ_NAME, value);
+        result.put(SINGLE_OBJ_VALUE, fkValue);
+        return result;
+    }
+
+    public static List<SysFile> getAnnex(String value) {
+        if (ArrayUtils.equalsEmptyArray(value)) {
+            return null;
+        } else {
+            return JSON.parseObject(value, new TypeReference<List<SysFile>>() {
+            }.getType());
+        }
+    }
+
+    public static String byteToString(byte[] bytes) {
+        String result = "";
+        if (ArrayUtils.isNotEmpty(bytes)) {
+            result = new String(bytes, StandardCharsets.UTF_8);
+        }
+
+        return result;
+    }
+
+}

+ 20 - 0
boman-web-core/src/main/java/com/boman/web/core/utils/JSONObjectUtils.java

@@ -0,0 +1,20 @@
+package com.boman.web.core.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author shiqian
+ * @date 2021年04月29日 15:21
+ **/
+public class JSONObjectUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(JSONObjectUtils.class);
+
+    public static boolean containsKeyIgnoreCase(JSONObject json, String key) {
+        return json.containsKey(key.toLowerCase()) || json.containsKey(key.toUpperCase());
+    }
+
+
+}