Browse Source

公共参数支持 SQL 取数据

sunyj 8 years ago
parent
commit
60beab023c

+ 6 - 6
kanban-console/src/main/java/com/uas/kanban/model/GlobalParameter.java

@@ -14,7 +14,7 @@ import com.uas.kanban.util.ObjectUtils;
 
 /**
  * 公共参数
- * 
+ *
  * @author sunyj
  * @since 2017年9月7日 下午4:04:04
  */
@@ -59,7 +59,7 @@ public class GlobalParameter extends BaseEntity {
 	private List<Value> optionalValues;
 
 	/**
-	 * 输入方式为 {@link InputMode.Radio} 或 {@link InputMode#DropDownBox} 时,默认值的序号
+	 * 输入方式为 {@link InputMode#Radio} 或 {@link InputMode#DropDownBox} 时,默认值的序号
 	 */
 	private Integer defaultOptionalValueIndex;
 
@@ -122,7 +122,7 @@ public class GlobalParameter extends BaseEntity {
 	/**
 	 * 对于 optionalValues 的操作需注意,因为通过该方法得到的 optionalValues 与 this.optionalValues
 	 * 实际上是两个独立的对象,所以更改了返回值 optionalValues 之后,需要重新调用该方法以便应用更改
-	 * 
+	 *
 	 * @return
 	 */
 	public List<Object> getOptionalValues() {
@@ -140,7 +140,7 @@ public class GlobalParameter extends BaseEntity {
 	/**
 	 * 对于 optionalValues 的操作需注意,因为该方法的参数 optionalValues 与 this.optionalValues
 	 * 实际上是两个独立的对象,更改参数 optionalValues 之后,需要重新调用该方法以便应用更改
-	 * 
+	 *
 	 * @param optionalValues
 	 */
 	public void setOptionalValues(List<Object> optionalValues) {
@@ -186,7 +186,7 @@ public class GlobalParameter extends BaseEntity {
 
 	/**
 	 * 检查参数
-	 * 
+	 *
 	 * @throws IllegalArgumentException
 	 *             必填参数没有填写时,报错
 	 */
@@ -224,7 +224,7 @@ public class GlobalParameter extends BaseEntity {
 
 	/**
 	 * 输入方式
-	 * 
+	 *
 	 * @author sunyj
 	 * @since 2017年9月1日 下午8:01:53
 	 */

+ 6 - 1
kanban-console/src/main/java/com/uas/kanban/model/Type.java

@@ -21,6 +21,11 @@ public enum Type {
 	/**
 	 * 日期,以时间戳的形式传入
 	 */
-	Date;
+	Date,
+
+	/**
+	 * SQL 取数据
+	 */
+	SQL;
 
 }

+ 5 - 3
kanban-console/src/main/java/com/uas/kanban/model/Value.java

@@ -17,17 +17,17 @@ public class Value implements Serializable {
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * 应用模版时,参数的值(字符串型,根据 {@link type} 决定取哪个值)
+	 * 应用模版时,参数的值(字符串型,根据 {@link Type} 决定取哪个值)
 	 */
 	private String stringValue;
 
 	/**
-	 * 应用模版时,参数的值(数值型,根据 {@link type} 决定取哪个值)
+	 * 应用模版时,参数的值(数值型,根据 {@link Type} 决定取哪个值)
 	 */
 	private Double numberValue;
 
 	/**
-	 * 应用模版时,参数的值(日期型,根据 {@link type} 决定取哪个值)
+	 * 应用模版时,参数的值(日期型,根据 {@link Type} 决定取哪个值)
 	 */
 	private Date dateValue;
 
@@ -63,6 +63,7 @@ public class Value implements Serializable {
 		Class<?> clazz = value.getClass();
 		switch (type) {
 		case String:
+		case SQL:
 			stringValue = value.toString();
 			break;
 		case Number:
@@ -95,6 +96,7 @@ public class Value implements Serializable {
 	public Object getValue(@NotEmpty("type") Type type) {
 		switch (type) {
 		case String:
+		case SQL:
 			return stringValue;
 		case Number:
 			return numberValue;

+ 9 - 10
kanban-console/src/main/java/com/uas/kanban/service/impl/KanbanInstanceServiceImpl.java

@@ -241,7 +241,6 @@ public class KanbanInstanceServiceImpl extends BaseService<KanbanInstance> imple
 	 * 
 	 * @param kanbanInstance
 	 *            看板实例
-	 * @return 看板实例参数
 	 */
 	private void generateParameters(@NotEmpty("kanbanInstance") KanbanInstance kanbanInstance) {
 		Kanban kanban = checkKanban(kanbanInstance.getKanbanCode());
@@ -279,7 +278,7 @@ public class KanbanInstanceServiceImpl extends BaseService<KanbanInstance> imple
 	/**
 	 * 检查看板是否存在
 	 * 
-	 * @param templateCodes
+	 * @param kanbanCode
 	 *            看板的 code
 	 * @return 看板
 	 * @throws IllegalArgumentException
@@ -299,10 +298,10 @@ public class KanbanInstanceServiceImpl extends BaseService<KanbanInstance> imple
 	/**
 	 * 初始化切换频率
 	 * 
-	 * @param KanbanInstance
+	 * @param kanbanInstance
 	 *            看板实例
 	 */
-	private void initSwitchFrequence(@NotEmpty("KanbanInstance") KanbanInstance kanbanInstance)
+	private void initSwitchFrequence(@NotEmpty("kanbanInstance") KanbanInstance kanbanInstance)
 			throws IllegalArgumentException {
 		Kanban kanban = checkKanban(kanbanInstance.getKanbanCode());
 		switch (kanban.getDisplay()) {
@@ -369,16 +368,16 @@ public class KanbanInstanceServiceImpl extends BaseService<KanbanInstance> imple
 		if (StringUtils.isEmpty(content)) {
 			throw new IllegalStateException("模版内容为空:" + templateCode);
 		}
-		// 替换参数
 		List<GlobalParameter> globalParameters = kanbanInstance.getGlobalParameters();
-		content = templateParser.replaceParameters(content, globalParameters, true);
-		if (!StringUtils.isEmpty(title)) {
-			title = templateParser.replaceParameters(title, globalParameters, false);
-		}
 		// 解析模版
-		String templateContent = null;
+		String templateContent;
 		try {
 			NewbieJdbcSupport jdbc = dataSourceManager.getJdbc(template.getDataSourceCode());
+			// 替换参数
+			content = templateParser.replaceParameters(content, globalParameters, true,jdbc);
+			if (!StringUtils.isEmpty(title)) {
+				title = templateParser.replaceParameters(title, globalParameters, false,jdbc);
+			}
 			templateContent = templateParser.parseXml(content, title, jdbc);
 		} catch (DocumentException e) {
 			throw new IllegalStateException("xml 解析出错", e);

+ 33 - 15
kanban-console/src/main/java/com/uas/kanban/support/TemplateParser.java

@@ -19,6 +19,7 @@ import java.util.regex.Pattern;
 
 import javax.xml.transform.TransformerException;
 
+import com.uas.kanban.model.Type;
 import org.dom4j.Attribute;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
@@ -53,17 +54,20 @@ public class TemplateParser {
 
 	/**
 	 * 替换模版中的参数为实际值
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param globalParameters
 	 *            公共参数
 	 * @param needSingleQuote
 	 *            参数值是否以单引号括起来(用于 sql)
+	 * @param jdbc
+	 *            NewbieJdbcSupport 对象
 	 * @return 替换后的模版内容
+     * @throws SQLException
 	 */
 	public String replaceParameters(@NotEmpty("content") String content, List<GlobalParameter> globalParameters,
-			@NotEmpty("needSingleQuote") Boolean needSingleQuote) {
+			@NotEmpty("needSingleQuote") Boolean needSingleQuote, @NotEmpty("jdbc") NewbieJdbcSupport jdbc) throws SQLException {
 		if (CollectionUtils.isEmpty(globalParameters)) {
 			return content;
 		}
@@ -86,6 +90,20 @@ public class TemplateParser {
 			if (value == null) {
 				throw new IllegalStateException("公共参数值为null:" + globalParameterName);
 			}
+
+			// 如果公共参数值为 {@link Type#SQL} ,需要取得查询结果
+			if(globalParameter.getType()== Type.SQL){
+				String stringValue=(String)value;
+				stringValue=replaceParameters(stringValue,globalParameters,true,jdbc);
+				checkCount(jdbc.getDataSource().getConnection(), stringValue);
+				Map<String, Object> data = jdbc.findMap(stringValue);
+				if (CollectionUtils.isEmpty(data)) {
+					throw new IllegalStateException("公共参数通过 SQL 取得结果为空:"+globalParameterName);
+				}else if(data.size()>1){
+					throw new IllegalStateException("公共参数通过 SQL 取得结果不止一列:"+globalParameterName);
+				}
+				value=data.values().iterator().next();
+			}
 			// TODO value 为时间
 			if (needSingleQuote != null && needSingleQuote.booleanValue()) {
 				content = content.substring(0, start) + "'" + value + "'" + content.substring(end);
@@ -99,7 +117,7 @@ public class TemplateParser {
 
 	/**
 	 * 解析单个 xml 模版,转为 json 格式的数据
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param title
@@ -126,7 +144,7 @@ public class TemplateParser {
 
 	/**
 	 * 处理 sql ,包括替换特殊字符等
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @return 处理后的模版内容
@@ -148,7 +166,7 @@ public class TemplateParser {
 
 	/**
 	 * 处理模版中的 form 组件
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param jdbc
@@ -189,7 +207,7 @@ public class TemplateParser {
 
 	/**
 	 * 处理模版中的 grid 组件
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param jdbc
@@ -244,7 +262,7 @@ public class TemplateParser {
 
 	/**
 	 * 处理模版中的 bar 和 line 组件
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param jdbc
@@ -305,7 +323,7 @@ public class TemplateParser {
 
 	/**
 	 * 处理模版中的pie组件
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param jdbc
@@ -345,7 +363,7 @@ public class TemplateParser {
 
 	/**
 	 * 读取 xml 为 Document 对象
-	 * 
+	 *
 	 * @param xml
 	 *            xml 字符串
 	 * @return Document 对象
@@ -357,7 +375,7 @@ public class TemplateParser {
 
 	/**
 	 * 检查当前条件下的结果数目是否超出限制
-	 * 
+	 *
 	 * @param connection
 	 * @param sql
 	 * @throws SQLException
@@ -374,7 +392,7 @@ public class TemplateParser {
 
 	/**
 	 * 获取当前查询语句的结果数目
-	 * 
+	 *
 	 * @param connection
 	 * @param sql
 	 * @return
@@ -434,7 +452,7 @@ public class TemplateParser {
 
 	/**
 	 * 将 List<Map<String, Object>> 转为 Map<String, List<Object>>
-	 * 
+	 *
 	 * @param listMap
 	 *            将转换的对象,每个 Map 的键都相同,否则会得到非预期的结果<br/>
 	 *            如下所示:
@@ -482,7 +500,7 @@ public class TemplateParser {
 
 	/**
 	 * 将对象转为字符串
-	 * 
+	 *
 	 * @param object
 	 *            对象
 	 * @return 转换的字符串
@@ -499,7 +517,7 @@ public class TemplateParser {
 
 	/**
 	 * 对模版内容的最终处理,包括映射、添加title等
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param title
@@ -521,7 +539,7 @@ public class TemplateParser {
 
 	/**
 	 * 为模版添加 title
-	 * 
+	 *
 	 * @param content
 	 *            模版内容
 	 * @param title