瀏覽代碼

Parse parameter of SQL type but don't update optionValues when get panel instance

sunyj 8 年之前
父節點
當前提交
ffedb3d4ad

+ 4 - 0
kanban-console/src/main/java/com/uas/kanban/model/PanelInstance.java

@@ -145,6 +145,8 @@ public class PanelInstance extends BaseEntity {
 
     /**
      * 获取参数
+     * 对于 parameters 的操作需注意,因为通过该方法得到的 parameters 与 this.parameters
+     * 实际上是两个独立的对象,所以更改了返回值 parameters 之后,需要重新调用该方法以便应用更改
      */
     public List<Parameter> fromParameters() {
         return ObjectUtils.toList(JSONArray.parseArray(parameters), Parameter.class);
@@ -152,6 +154,8 @@ public class PanelInstance extends BaseEntity {
 
     /**
      * 设置参数
+     * 对于 parameters 的操作需注意,因为该方法的参数 parameters 与 this.parameters
+     * 实际上是两个独立的对象,更改参数 parameters 之后,需要重新调用该方法以便应用更改
      */
     public void toParameters(List<Parameter> parameters) {
         if (!CollectionUtils.isEmpty(parameters)) {

+ 4 - 0
kanban-console/src/main/java/com/uas/kanban/model/Parameter.java

@@ -238,6 +238,10 @@ public class Parameter extends BaseEntity {
         }
         // 通过单选或下拉框方式填写参数时,参数值必须是可选项中的一个值
         if (inputMode == InputMode.DropDownBox && optionalValues != null) {
+            // 参数类型为 SQL 时,值是解析得到的,不进行比较
+            if (type == Type.SQL) {
+                return;
+            }
             for (Object obj : optionalValues) {
                 if (Objects.equals(obj, value)) {
                     return;

+ 69 - 4
kanban-console/src/main/java/com/uas/kanban/service/impl/PanelInstanceServiceImpl.java

@@ -78,7 +78,11 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
                     parameter.mayInitValue();
                 }
             }
-            compare(parameters, generateParameters(panelInstance));
+            List<Parameter> references = generateParameters(panelInstance, false);
+            // 重置 SQL 类型的参数(其值是解析出来的,不进行保存)
+            resetSQLParameter(parameters, references);
+            panelInstance.toParameters(parameters);
+            compare(parameters, references);
         } catch (ClassNotFoundException | IOException | InstantiationException | IllegalAccessException e) {
             throw new IllegalStateException("深克隆对象时失败", e);
         }
@@ -87,21 +91,81 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
     /**
      * 根据关联的面板,为面板实例生成参数
      *
-     * @param panelInstance 面板实例
+     * @param panelInstance     面板实例
+     * @param parseSQLParameter 是否解析 SQL 类型的参数
      * @return 生成的参数
      */
-    private List<Parameter> generateParameters(@NotEmpty("panelInstance") PanelInstance panelInstance) {
+    private List<Parameter> generateParameters(@NotEmpty("panelInstance") PanelInstance panelInstance, boolean parseSQLParameter) {
         String panelCode = userPanelRelationDao.checkExist(panelInstance.getUserPanelRelationCode()).getPanelCode();
+        Panel panel = panelDao.checkExist(panelCode);
+        String dataSourceCode = panel.getDataSourceCode();
         List<Parameter> parameters = parameterService.getByPanelCode(panelCode);
         if (CollectionUtils.isEmpty(parameters)) {
             return null;
         }
         for (Parameter parameter : parameters) {
             parameter.mayInitValue();
+            // 如果是 SQL 类型,需要解析参数
+            if (parameter.getType() == Type.SQL && parseSQLParameter) {
+                try {
+                    NewbieJdbcSupport jdbc = dataSourceManager.getJdbc(dataSourceCode);
+                    parameter.setValue(getValue(jdbc, String.valueOf(parameter.getValue())));
+                    // 并且需要解析 optionalValues 里可选择的值
+                    List<Object> optionalValues = parameter.getOptionalValues();
+                    if (!CollectionUtils.isEmpty(optionalValues)) {
+                        for (int i = 0; i < optionalValues.size(); i++) {
+                            Object optionValue = optionalValues.get(i);
+                            optionalValues.set(i, getValue(jdbc, String.valueOf(optionValue)));
+                        }
+                        parameter.setOptionalValues(optionalValues);
+                    }
+                } catch (SQLException e) {
+                    throw new IllegalStateException("参数解析错误", e);
+                }
+            }
         }
         return parameters;
     }
 
+    /**
+     * 获取 sql 执行结果
+     *
+     * @param jdbc jdbc
+     * @param sql  sql 查询语句
+     * @return json 格式的结果
+     */
+    private String getValue(@NotEmpty("jdbc") NewbieJdbcSupport jdbc, @NotEmpty("sql") String sql) {
+        List<Map<String, Object>> listMap = jdbc.listMap(sql);
+        if (listMap == null) {
+            listMap = new ArrayList<>();
+        }
+        return JSONObject.toJSONString(listMap);
+    }
+
+    /**
+     * 重置 SQL 类型的参数
+     *
+     * @param parameters 需要重置的对象
+     * @param references 参照对象
+     */
+    private void resetSQLParameter(List<Parameter> parameters, List<Parameter> references) {
+        int parametersSize = parameters == null ? 0 : parameters.size() - 1;
+        for (int i = parametersSize; i >= 0; i--) {
+            Parameter parameter = parameters.get(i);
+            // 只重置 SQL 类型
+            if (parameter.getType() != Type.SQL) {
+                continue;
+            }
+            // 获取 code 相同的参数,用于重置
+            for (int j = references == null ? 0 : references.size() - 1; j >= 0; j--) {
+                Parameter reference = references.get(j);
+                if (Objects.equals(parameter.getCode(), reference.getCode())) {
+                    parameter.setOptionalValues(reference.getOptionalValues());
+                }
+            }
+        }
+    }
+
     /**
      * 比较参数数量、名称等是否一致
      *
@@ -228,6 +292,7 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
             }
             panelInstance = generateInstance(userPanelRelation);
         }
+        panelInstance.toParameters(generateParameters(panelInstance, true));
         return panelInstance;
     }
 
@@ -244,7 +309,7 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
         panelInstance.setUserPanelRelationCode(userPanelRelation.getCode());
         panelInstance.setPanelVersion(panel.getVersion());
         initSwitchFrequence(panelInstance);
-        panelInstance.toParameters(generateParameters(panelInstance));
+        panelInstance.toParameters(generateParameters(panelInstance, false));
         List<Kanban> kanbans = kanbanDao.findByPanelCode(panelCode);
         if (CollectionUtils.isEmpty(kanbans)) {
             throw new IllegalStateException("面板 '" + panel.getName() + "' 未关联看板,请联系管理员");

+ 13 - 14
kanban-console/src/main/java/com/uas/kanban/support/KanbanParser.java

@@ -2,7 +2,6 @@ package com.uas.kanban.support;
 
 import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.model.Parameter;
-import com.uas.kanban.model.Type;
 import com.uas.kanban.util.ArrayUtils;
 import com.uas.kanban.util.CollectionUtils;
 import com.uas.kanban.util.StringUtils;
@@ -81,19 +80,19 @@ public class KanbanParser {
             }
 
             // 如果参数值为 {@link Type#SQL} ,需要取得查询结果
-            if (parameter.getType() == Type.SQL) {
-                String stringValue = (String) value;
-                // 不递归替换参数
-                // stringValue=replaceParameters(stringValue,parameters,true,jdbc);
-                checkCount(jdbc.getDataSource().getConnection(), stringValue);
-                Map<String, Object> data = jdbc.findMap(stringValue);
-                if (CollectionUtils.isEmpty(data)) {
-                    throw new IllegalStateException("参数通过 SQL 取得结果为空:" + parameterName);
-                } else if (data.size() > 1) {
-                    throw new IllegalStateException("参数通过 SQL 取得结果不止一列:" + parameterName);
-                }
-                value = data.values().iterator().next();
-            }
+//            if (parameter.getType() == Type.SQL) {
+//                String stringValue = (String) value;
+//                // 不递归替换参数
+//                // stringValue=replaceParameters(stringValue,parameters,true,jdbc);
+//                checkCount(jdbc.getDataSource().getConnection(), stringValue);
+//                Map<String, Object> data = jdbc.findMap(stringValue);
+//                if (CollectionUtils.isEmpty(data)) {
+//                    throw new IllegalStateException("参数通过 SQL 取得结果为空:" + parameterName);
+//                } else if (data.size() > 1) {
+//                    throw new IllegalStateException("参数通过 SQL 取得结果不止一列:" + parameterName);
+//                }
+//                value = data.values().iterator().next();
+//            }
             // TODO value 为时间
             if (needSingleQuote != null && needSingleQuote) {
                 content = content.substring(0, start) + "'" + value + "'" + content.substring(end);