Browse Source

增加API查询接口,中文乱码处理

will.chen 7 years ago
parent
commit
012863cccd

+ 2 - 2
pom.xml

@@ -41,10 +41,10 @@
 			<artifactId>spring-boot-starter-jdbc</artifactId>
 		</dependency>
 
-		<dependency>
+		<!-- <dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-devtools</artifactId>
-		</dependency>
+		</dependency> -->
 
 		<dependency>  
             <groupId>org.springframework.boot</groupId>  

+ 12 - 0
src/main/java/com/uas/eis/controller/HelloWorldController.java

@@ -1,5 +1,6 @@
 package com.uas.eis.controller;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,6 +24,17 @@ public class HelloWorldController {
 	public Map<String, Object> getUser(String username){
 		return userService.getUser(username);
 	}
+
+	@RequestMapping(value="/getUsers")
+	public String getUsers(){
+		return userService.getUsers();
+	}
+	
+	@RequestMapping("/api/query")
+	public Object query(String code, String param){
+		Map<String, Object> map = new HashMap<String, Object>();
+		return userService.query(code, param);
+	}
 	
 	/**
 	 * 首次登陆请求token

+ 36 - 0
src/main/java/com/uas/eis/core/WebAppConfig.java

@@ -1,10 +1,20 @@
 package com.uas.eis.core;
 
+import java.nio.charset.Charset;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.uas.eis.core.support.DataSourceInterceptor;
 import com.uas.eis.core.support.InterceptorConfig;
 
@@ -22,4 +32,30 @@ public class WebAppConfig extends WebMvcConfigurationSupport{
 		registry.addInterceptor(new DataSourceInterceptor()).addPathPatterns("/*/**");
 	}
 	
+	@Bean
+    public HttpMessageConverter<String> responseBodyConverter() {
+        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
+        return converter;
+    }
+
+	@Bean
+	public MappingJackson2HttpMessageConverter MappingJacksonHttpMessageConverter(){
+		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+		converter.setObjectMapper(objectMapper);
+		return converter;
+	}
+	
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        super.configureMessageConverters(converters);
+        converters.add(responseBodyConverter());
+        converters.add(MappingJacksonHttpMessageConverter());
+    }
+
+    @Override
+    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
+        configurer.favorPathExtension(false);
+    }
 }

+ 3 - 0
src/main/java/com/uas/eis/core/support/InterceptorConfig.java

@@ -10,6 +10,7 @@ import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.uas.eis.service.UserService;
+import com.uas.eis.dao.BaseDao;
 import com.uas.eis.utils.BaseUtil;
 
 import io.jsonwebtoken.Claims;
@@ -19,6 +20,8 @@ public class InterceptorConfig implements HandlerInterceptor{
 	@Autowired
 	private UserService userService;
 	
+	private BaseDao baseDao;
+	
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 		//token认证
 		String token = request.getParameter("token");

+ 48 - 0
src/main/java/com/uas/eis/entity/QueryArgs.java

@@ -0,0 +1,48 @@
+package com.uas.eis.entity;
+
+public class QueryArgs {
+
+	private Integer qa_id;
+	private String qa_qccode;
+	private String qa_param;
+	private String qa_paramtype;
+	private String qa_relation;
+	private Integer qa_detno;
+	public Integer getQa_id() {
+		return qa_id;
+	}
+	public void setQa_id(Integer qa_id) {
+		this.qa_id = qa_id;
+	}
+	public String getQa_qccode() {
+		return qa_qccode;
+	}
+	public void setQa_qccode(String qa_qccode) {
+		this.qa_qccode = qa_qccode;
+	}
+	public String getQa_param() {
+		return qa_param;
+	}
+	public void setQa_param(String qa_param) {
+		this.qa_param = qa_param;
+	}
+	public String getQa_paramtype() {
+		return qa_paramtype;
+	}
+	public void setQa_paramtype(String qa_paramtype) {
+		this.qa_paramtype = qa_paramtype;
+	}
+	public String getQa_relation() {
+		return qa_relation;
+	}
+	public void setQa_relation(String qa_relation) {
+		this.qa_relation = qa_relation;
+	}
+	public Integer getQa_detno() {
+		return qa_detno;
+	}
+	public void setQa_detno(Integer qa_detno) {
+		this.qa_detno = qa_detno;
+	}
+	
+}

+ 95 - 0
src/main/java/com/uas/eis/entity/QueryConfig.java

@@ -0,0 +1,95 @@
+package com.uas.eis.entity;
+
+/**
+ * 标准查询配置
+ * @author chenw
+ *
+ */
+public class QueryConfig {
+
+	private Integer qc_id;
+	private String qc_code;
+	private String qc_table;
+	private String qc_condition;
+	private String qc_mapkey;
+	private String qc_beforesql;
+	private String qc_return;
+	private Integer qc_detno;
+	private String qc_orderby;
+	private Integer qc_isArray;
+	private String qc_relationCode;
+	private String qc_mainVar;
+	public String getQc_mainVar() {
+		return qc_mainVar;
+	}
+	public void setQc_mainVar(String qc_mainVar) {
+		this.qc_mainVar = qc_mainVar;
+	}
+	public String getQc_relationCode() {
+		return qc_relationCode;
+	}
+	public void setQc_relationCode(String qc_relationCode) {
+		this.qc_relationCode = qc_relationCode;
+	}
+	public Integer getQc_id() {
+		return qc_id;
+	}
+	public void setQc_id(Integer qc_id) {
+		this.qc_id = qc_id;
+	}
+	public String getQc_code() {
+		return qc_code;
+	}
+	public void setQc_code(String qc_code) {
+		this.qc_code = qc_code;
+	}
+	public String getQc_table() {
+		return qc_table;
+	}
+	public void setQc_table(String qc_table) {
+		this.qc_table = qc_table;
+	}
+	public String getQc_condition() {
+		return qc_condition;
+	}
+	public void setQc_condition(String qc_condition) {
+		this.qc_condition = qc_condition;
+	}
+	public String getQc_mapkey() {
+		return qc_mapkey;
+	}
+	public void setQc_mapkey(String qc_mapkey) {
+		this.qc_mapkey = qc_mapkey;
+	}
+	public String getQc_return() {
+		return qc_return;
+	}
+	public void setQc_return(String qc_return) {
+		this.qc_return = qc_return;
+	}
+	public Integer getQc_detno() {
+		return qc_detno;
+	}
+	public void setQc_detno(Integer qc_detno) {
+		this.qc_detno = qc_detno;
+	}
+	public String getQc_orderby() {
+		return qc_orderby;
+	}
+	public void setQc_orderby(String qc_orderby) {
+		this.qc_orderby = qc_orderby;
+	}
+	public String getQc_beforesql() {
+		return qc_beforesql;
+	}
+	public void setQc_beforesql(String qc_beforesql) {
+		this.qc_beforesql = qc_beforesql;
+	}
+	public Integer getQc_isArray() {
+		return qc_isArray;
+	}
+	public void setQc_isArray(Integer qc_isArray) {
+		this.qc_isArray = qc_isArray;
+	}
+	
+}

+ 34 - 0
src/main/java/com/uas/eis/entity/QueryConfigDetail.java

@@ -0,0 +1,34 @@
+package com.uas.eis.entity;
+
+public class QueryConfigDetail {
+
+	private Integer qcd_id;
+	private Integer qcd_qcid;
+	private String qcd_field;
+	private String qcd_mappingkey;
+	public Integer getQcd_id() {
+		return qcd_id;
+	}
+	public void setQcd_id(Integer qcd_id) {
+		this.qcd_id = qcd_id;
+	}
+	public Integer getQcd_qcid() {
+		return qcd_qcid;
+	}
+	public void setQcd_qcid(Integer qcd_qcid) {
+		this.qcd_qcid = qcd_qcid;
+	}
+	public String getQcd_field() {
+		return qcd_field;
+	}
+	public void setQcd_field(String qcd_field) {
+		this.qcd_field = qcd_field;
+	}
+	public String getQcd_mappingkey() {
+		return qcd_mappingkey;
+	}
+	public void setQcd_mappingkey(String qcd_mappingkey) {
+		this.qcd_mappingkey = qcd_mappingkey;
+	}
+	
+}

+ 19 - 0
src/main/java/com/uas/eis/exception/ExceptionHandlerAdvice.java

@@ -5,11 +5,15 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.log4j.Logger;
 import org.springframework.http.HttpStatus;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 
+import com.uas.eis.utils.StringUtil;
+
+
 @ControllerAdvice
 public class ExceptionHandlerAdvice {
 
@@ -32,5 +36,20 @@ public class ExceptionHandlerAdvice {
 		return map;
 	}
 	
+	/**
+	 * 处理通过BaseUtil.showError抛出的异常
+	 * 
+	 * @param ex
+	 * @return
+	 */
+	@ExceptionHandler(SystemException.class)
+	@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
+	@ResponseBody
+	public ModelMap handleSystemError(SystemException ex, HttpServletRequest request) {
+		ModelMap map = new ModelMap();
+		map.put("exceptionInfo", ex.getMessage());
+		return map;
+	}
+
 	
 }

+ 4 - 0
src/main/java/com/uas/eis/service/UserService.java

@@ -11,5 +11,9 @@ public interface UserService {
 	public abstract boolean checkUser(String username, String password);
 	
 	public abstract boolean checkAction(String username, String action);
+	
+	public String getUsers();
+	
+	public Object query(String code, String param);
 
 }

+ 169 - 0
src/main/java/com/uas/eis/serviceImpl/UserServiceImpl.java

@@ -1,15 +1,27 @@
 package com.uas.eis.serviceImpl;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
+import com.alibaba.fastjson.JSON;
 import com.uas.eis.core.support.TokenHandler;
 import com.uas.eis.dao.BaseDao;
+import com.uas.eis.entity.QueryArgs;
+import com.uas.eis.entity.QueryConfig;
+import com.uas.eis.entity.QueryConfigDetail;
 import com.uas.eis.service.UserService;
+import com.uas.eis.utils.BaseUtil;
 
 import net.sf.json.JSONObject;
 
@@ -61,5 +73,162 @@ public class UserServiceImpl implements UserService {
 		}
 		return flag;
 	}
+	public String getUsers(){
+		String sql = "SELECT EM_NAME,EM_CODE,TO_CHAR(EM_INDATE,'yyyy-MM-dd hh24:mm:ss') EM_INDATE FROM EMPLOYEE WHERE EM_CODE = 'U0818'";
+		Map<String, Object> map = baseDao.getJdbcTemplate().queryForMap(sql);
+		List<Map<String,Object>> list = baseDao.queryForList("SELECT * FROM UPLOADDOCDETAIL WHERE UDD_UDID=284");
+		System.out.println(list);
+		return BaseUtil.parseDataToJson(map,list);
+	}
+	
+	/**
+	 * 标准查询API
+	 * @param code		查询方案Code
+	 * @param param		参数
+	 * @return
+	 */
+	public Object query(String code, String param){
+		Map<String, Object> resultmap = new HashMap<String, Object>();
+		List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
+		com.alibaba.fastjson.JSONObject json = JSON.parseObject(param);
+		//查询参数配置表
+		String getInOutParamsSql = "select * from queryArgs where qa_qccode = ?";
+		List<QueryArgs> inOutParamList = baseDao.query(getInOutParamsSql,  QueryArgs.class, code);
+		Map<String, String> argsMap = new HashMap<String, String>();	//存参数名对应的参数值
+		Map<String, String> argsTypeMap = new HashMap<String, String>();		//存参数名对应的参数类型
+		for(QueryArgs args : inOutParamList){
+			argsMap.put(args.getQa_param(),json.getString(args.getQa_param()));
+			argsTypeMap.put(args.getQa_param(), args.getQa_paramtype());
+		}
+		//校验查询方案传入的参数是否正确
+		checkParam(code, param);
+		//code对应的查询方案
+		String getQueryConfigsql = "select * from queryconfig where qc_code=? order by qc_detno"; 
+		List<QueryConfig> queryConfigList = baseDao.query(getQueryConfigsql, QueryConfig.class, code);
+		if(queryConfigList != null){
+			List<String> valueList = new ArrayList<String>();
+			Object mainField = baseDao.getFieldDataByCondition("queryArgs", "qa_param", "qa_qccode='"+code+"' and qa_ismainfield=1");
+			if(mainField != null && "array".equals(argsTypeMap.get(mainField))){
+				String argValue = argsMap.get(mainField);
+				String[] valueArray = argValue.replace("[", "").replace("]", "").replaceAll("\"", "").split(",");
+				valueList = new ArrayList<String>(Arrays.asList(valueArray));
+			}else{
+				valueList.add(argsMap.get(mainField));
+			}
+			for(int i = 0; i < valueList.size(); i++){
+				Map<String, Object> map = new HashMap<String, Object>();
+				for(QueryConfig queryConfig : queryConfigList){
+					//查询方案明细表,得到要查询的字段
+					String getQueryFieldssql = "select * from queryConfigDetail where qcd_qcid = ?";
+					List<QueryConfigDetail> queryFieldsList = baseDao.query(getQueryFieldssql, QueryConfigDetail.class, queryConfig.getQc_id());
+					StringBuilder sb = new StringBuilder();
+					sb.append("select ");
+					for(QueryConfigDetail field : queryFieldsList){
+						sb.append(field.getQcd_field() + " \"" + field.getQcd_mappingkey() + "\",");
+					}
+					sb.deleteCharAt(sb.length()-1);			//去掉最后一个 ,
+					sb.append(" from " + queryConfig.getQc_table());
+					//拼接condition
+					String condition = queryConfig.getQc_condition();
+					Pattern pattern = Pattern.compile("@[\\w]+");		//通过正则替换@变量
+					Matcher m = pattern.matcher(condition);
+					List<String> matchList = new ArrayList<String>();
+					while(m.find()){
+						matchList.add(m.group());
+					}
+					for(String match : matchList){
+						/*if("array".equals(argsTypeMap.get(match.replace("@", "")))){
+							String value = argsMap.get(match.replace("@", ""));
+							value = value.replaceAll("\"", "'");
+							condition = condition.replaceAll(match, value);
+						}else{
+							condition = condition.replaceAll(match, "'"+argsMap.get(match.replace("@", ""))+"'");
+						}*/
+						if(match.equals("@"+mainField)){
+							condition = condition.replaceAll(match, "'"+valueList.get(i)+"'");
+						}else{
+							condition = condition.replaceAll(match, "'"+argsMap.get(match.replace("@", ""))+"'");
+						}
+					}
+					sb.append(" " + condition);		//append where条件
+					//append order by语句
+					if(!StringUtils.isEmpty(queryConfig.getQc_orderby())){
+						sb.append(" " + queryConfig.getQc_orderby());
+					}
+					if(queryFieldsList != null && queryFieldsList.size()>0){
+						if(queryConfig.getQc_isArray() != null && queryConfig.getQc_isArray() == 0){
+							map.put(queryConfig.getQc_mapkey(), baseDao.getJdbcTemplate().queryForMap(sb.toString()));
+						}else{
+							map.put(queryConfig.getQc_mapkey(), baseDao.queryForList(sb.toString()));
+						}
+					}
+					
+					//获取额外返回值
+					if(!StringUtils.isEmpty(queryConfig.getQc_return())){
+						String getReturnSql = "select " + queryConfig.getQc_return() + " from " + queryConfig.getQc_table() + " " + condition;
+						Map<String, Object> returnMap = baseDao.getJdbcTemplate().queryForMap(getReturnSql);
+						List<Object> list = baseDao.getFieldDatasByCondition("queryArgs", "qa_param", "qa_qccode='"+queryConfig.getQc_code()+"' and qa_relation="+queryConfig.getQc_id()+" order by qa_detno");
+						Iterator<Object> it = returnMap.values().iterator();
+						int j = 0;
+						while(it.hasNext()){
+							String value = String.valueOf(it.next());
+							argsMap.put(String.valueOf(list.get(j)), value);
+							j++;
+						}
+					}
+					//记录日志
+					System.out.println("记录日志");
+				}
+				if(valueList.size() > 1){
+					System.out.println(map);
+					resultList.add(map);
+				}else{
+					resultmap.putAll(map);
+				}
+			}
+			if(valueList.size() > 1)
+				return resultList;
+			else
+				return resultmap;
+		}else{
+			return resultmap;
+		}
+		
+	}
+	
+	/**
+	 * 传入参数的合法性校验
+	 * @param code
+	 * @param param
+	 */
+	private void checkParam(String code, String param){
+		com.alibaba.fastjson.JSONObject json = JSON.parseObject(param);
+		if(StringUtils.isEmpty(code)){
+			BaseUtil.showError("查询方案编号不能为空");
+		}
+		if(json == null){
+			BaseUtil.showError("传入的参数个数不正确");
+		}
+		String getInParamsSql = "select * from queryArgs where qa_qccode = ? and qa_relation is null";
+		List<QueryArgs> inParamList = baseDao.query(getInParamsSql,  QueryArgs.class, code);
+		if(inParamList.size() != json.size()){
+			BaseUtil.showError("传入的参数个数不正确");
+		}else{
+			 for(QueryArgs queryArgs : inParamList){
+				 if(json.getString(queryArgs.getQa_param()) == null){
+					 BaseUtil.showError("传入的参数名不正确");
+				 }else{
+					 if("array".equals(queryArgs.getQa_paramtype())){
+						 String stringArray = json.getString(queryArgs.getQa_param());
+						 if(!(stringArray.contains("[") && stringArray.contains("]"))){
+							 BaseUtil.showError("传入的参数:"+queryArgs.getQa_param()+"格式不正确");
+						 }
+					 }
+				 }
+			 }
+		}
+	}
+	
+	
 	
 }

+ 1 - 1
src/main/java/com/uas/eis/utils/BaseUtil.java

@@ -129,7 +129,7 @@ public class BaseUtil {
 		return map;
 	}
 	
-	public static String parsetListToJson(Map<String, Object> formMap,List<Map<String, Object>> gridList){
+	public static String parseDataToJson(Map<String, Object> formMap,List<Map<String, Object>> gridList){
 		JSONObject json = new JSONObject();
 		json.put("form", JSON.toJSON(formMap));
 		json.put("grid", JSONArray.fromObject(gridList));

+ 10 - 10
src/main/resources/application.yml

@@ -5,13 +5,13 @@ spring:
         username: UAS_DEV
         password: select!#%*(
         url: jdbc:oracle:thin:@192.168.253.6:1521:orcl
-        # 初始化大小,最小,最大
-        initialSize: 5
-        minIdle: 3
-        maxActive: 20
-        # 配置获取连接等待超时的时间
-        maxWait: 60000
-        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-        timeBetweenEvictionRunsMillis: 60000
-        # 配置一个连接在池中最小生存的时间,单位是毫秒
-        minEvictableIdleTimeMillis: 30000
+    http:
+        encoding:
+            force: true
+            charset: UTF-8
+            enabled: true
+    message:
+        encoding: UTF-8
+server:
+    tomcat:
+        uri_encoding: UTF-8