QueryServiceImpl.java 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package com.uas.eis.serviceImpl;
  2. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.cache.annotation.Cacheable;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.util.StringUtils;
  15. import com.alibaba.fastjson.JSON;
  16. import com.uas.eis.core.support.ActionProperties;
  17. import com.uas.eis.core.support.TokenHandler;
  18. import com.uas.eis.dao.BaseDao;
  19. import com.uas.eis.entity.QueryArgs;
  20. import com.uas.eis.entity.QueryConfig;
  21. import com.uas.eis.entity.QueryConfigDetail;
  22. import com.uas.eis.service.QueryService;
  23. import com.uas.eis.utils.BaseUtil;
  24. import net.sf.json.JSONObject;
  25. @Service
  26. public class QueryServiceImpl implements QueryService {
  27. @Autowired
  28. private BaseDao baseDao;
  29. @Override
  30. public String login(String username, String password) {
  31. if(checkUser(username, password)) {
  32. return TokenHandler.createToken(username, password);
  33. }else {
  34. return null;
  35. }
  36. }
  37. @Override
  38. @Cacheable(value="userEnableCache")
  39. public boolean checkUser(String username, String password) {
  40. return baseDao.checkIf("EIS_USER", "eu_enable=-1 and " + "eu_name='" + username + "' and eu_password='" + password + "'");
  41. }
  42. @Override
  43. @Cacheable(value="userActionEnableCache")
  44. public boolean checkAction(String username, String action) {
  45. boolean flag = false;
  46. String roles = baseDao.queryForObject("select eu_role from eis_user where eu_name='" + username + "'", String.class);
  47. if(roles == null) {
  48. return false;
  49. }
  50. // 开放公共API的权限
  51. String apiAction = ActionProperties.getProperty("api_action");
  52. if(action.startsWith(apiAction)) {
  53. return true;
  54. }
  55. // 判断是否在不需要权限控制的请求配置中
  56. String[] publicActions = ActionProperties.getProperty("public_action").split(";");
  57. for(String publicAction : publicActions) {
  58. if(publicAction.equals(action)) {
  59. return true;
  60. }
  61. }
  62. String[] fields = {"er_reg","er_action"};
  63. List<JSONObject> res = baseDao.getFieldsJSONDatasByCondition("EIS_ROLE", fields, "er_id in (" + roles + ")");
  64. for(int o = 0; o< res.size(); o++) {
  65. JSONObject data = res.get(o);
  66. String reg = data.containsKey("er_reg") ? data.getString("er_reg") : "(\\S)*";
  67. String act = data.containsKey("er_action") ? data.getString("er_action") : "";
  68. // 通过正则和预设接口校验请求权限
  69. if(action.matches(reg) || act.indexOf(action) != -1) {
  70. flag = true;
  71. break;
  72. }
  73. }
  74. return flag;
  75. }
  76. public String getUsers(){
  77. 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'";
  78. Map<String, Object> map = baseDao.getJdbcTemplate().queryForMap(sql);
  79. List<Map<String,Object>> list = baseDao.queryForList("SELECT * FROM UPLOADDOCDETAIL WHERE UDD_UDID=284");
  80. return BaseUtil.parseDataToJson(map,list);
  81. }
  82. /**
  83. * 标准查询API
  84. * @param code 查询方案Code
  85. * @param param 参数
  86. * @return
  87. */
  88. public Object query(String code, String param){
  89. Map<String, Object> resultmap = new HashMap<String, Object>();
  90. List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
  91. com.alibaba.fastjson.JSONObject json = JSON.parseObject(param);
  92. //查询参数配置表
  93. String getInOutParamsSql = "select * from queryArgs where qa_qccode = ?";
  94. List<QueryArgs> inOutParamList = baseDao.query(getInOutParamsSql, QueryArgs.class, code);
  95. Map<String, String> argsMap = new HashMap<String, String>(); //存参数名对应的参数值
  96. Map<String, String> argsTypeMap = new HashMap<String, String>(); //存参数名对应的参数类型
  97. for(QueryArgs args : inOutParamList){
  98. argsMap.put(args.getQa_param(),json.getString(args.getQa_param()));
  99. argsTypeMap.put(args.getQa_param(), args.getQa_paramtype());
  100. }
  101. //校验查询方案传入的参数是否正确
  102. checkParam(code, param);
  103. //code对应的查询方案
  104. String getQueryConfigsql = "select * from queryconfig where qc_code=? order by qc_detno";
  105. List<QueryConfig> queryConfigList = baseDao.query(getQueryConfigsql, QueryConfig.class, code);
  106. if(queryConfigList != null){
  107. List<String> valueList = new ArrayList<String>();
  108. Object mainField = baseDao.getFieldDataByCondition("queryArgs", "qa_param", "qa_qccode='"+code+"' and qa_ismainfield=1");
  109. if(mainField != null && "array".equals(argsTypeMap.get(mainField))){
  110. String argValue = argsMap.get(mainField);
  111. String[] valueArray = argValue.replace("[", "").replace("]", "").replaceAll("\"", "").split(",");
  112. valueList = new ArrayList<String>(Arrays.asList(valueArray));
  113. }else{
  114. valueList.add(argsMap.get(mainField));
  115. }
  116. for(int i = 0; i < valueList.size(); i++){
  117. Map<String, Object> map = new HashMap<String, Object>();
  118. for(QueryConfig queryConfig : queryConfigList){
  119. StringBuilder inParam = new StringBuilder();
  120. StringBuilder outParam = new StringBuilder();
  121. //查询方案明细表,得到要查询的字段
  122. String getQueryFieldssql = "select * from queryConfigDetail where qcd_qcid = ?";
  123. List<QueryConfigDetail> queryFieldsList = baseDao.query(getQueryFieldssql, QueryConfigDetail.class, queryConfig.getQc_id());
  124. StringBuilder sb = new StringBuilder();
  125. sb.append("select ");
  126. for(QueryConfigDetail field : queryFieldsList){
  127. sb.append(field.getQcd_field() + " \"" + field.getQcd_mappingkey() + "\",");
  128. }
  129. sb.deleteCharAt(sb.length()-1); //去掉最后一个 ,
  130. sb.append(" from " + queryConfig.getQc_table());
  131. //拼接condition
  132. String condition = queryConfig.getQc_condition();
  133. Pattern pattern = Pattern.compile("@[\\w]+"); //通过正则替换@变量
  134. Matcher m = pattern.matcher(condition);
  135. List<String> matchList = new ArrayList<String>();
  136. while(m.find()){
  137. matchList.add(m.group());
  138. }
  139. for(String match : matchList){
  140. /*if("array".equals(argsTypeMap.get(match.replace("@", "")))){
  141. String value = argsMap.get(match.replace("@", ""));
  142. value = value.replaceAll("\"", "'");
  143. condition = condition.replaceAll(match, value);
  144. }else{
  145. condition = condition.replaceAll(match, "'"+argsMap.get(match.replace("@", ""))+"'");
  146. }*/
  147. if(match.equals("@"+mainField)){
  148. condition = condition.replaceAll(match, "'"+valueList.get(i)+"'");
  149. inParam.append(mainField+"="+valueList.get(i)+";");
  150. }else{
  151. condition = condition.replaceAll(match, "'"+argsMap.get(match.replace("@", ""))+"'");
  152. inParam.append(match.replace("@","")+"="+argsMap.get(match.replace("@", ""))+";");
  153. }
  154. }
  155. sb.append(" " + condition); //append where条件
  156. //append order by语句
  157. if(!StringUtils.isEmpty(queryConfig.getQc_orderby())){
  158. sb.append(" " + queryConfig.getQc_orderby());
  159. }
  160. if(queryFieldsList != null && queryFieldsList.size()>0){
  161. if(queryConfig.getQc_isArray() != null && queryConfig.getQc_isArray() == 0){
  162. map.put(queryConfig.getQc_mapkey(), baseDao.getJdbcTemplate().queryForMap(sb.toString()));
  163. }else{
  164. map.put(queryConfig.getQc_mapkey(), baseDao.queryForList(sb.toString()));
  165. }
  166. }
  167. //获取额外返回值
  168. if(!StringUtils.isEmpty(queryConfig.getQc_return())){
  169. String getReturnSql = "select " + queryConfig.getQc_return() + " from " + queryConfig.getQc_table() + " " + condition;
  170. Map<String, Object> returnMap = baseDao.getJdbcTemplate().queryForMap(getReturnSql);
  171. List<Object> list = baseDao.getFieldDatasByCondition("queryArgs", "qa_param", "qa_qccode='"+queryConfig.getQc_code()+"' and qa_relation="+queryConfig.getQc_id()+" order by qa_detno");
  172. Iterator<Object> it = returnMap.values().iterator();
  173. int j = 0;
  174. while(it.hasNext()){
  175. String value = String.valueOf(it.next());
  176. argsMap.put(String.valueOf(list.get(j)), value);
  177. outParam.append(String.valueOf(list.get(j))+"="+value+";");
  178. j++;
  179. }
  180. }
  181. //记录日志
  182. String insertSql = "INSERT INTO QUERYLOG(QL_ID,QL_QCCODE,QL_PARAM,QL_RETURN,QL_DATE) VALUES(QUERYLOG_SEQ.NEXTVAL,'"+queryConfig.getQc_code()+"','"+inParam.toString()+"','"+outParam.toString()+"',SYSDATE)";
  183. baseDao.execute(insertSql);
  184. }
  185. if(valueList.size() > 1){
  186. resultList.add(map);
  187. }else{
  188. resultmap.putAll(map);
  189. }
  190. }
  191. if(valueList.size() > 1)
  192. return resultList;
  193. else
  194. return resultmap;
  195. }else{
  196. return resultmap;
  197. }
  198. }
  199. public Object doAction() {
  200. return null;
  201. }
  202. /**
  203. * 传入参数的合法性校验
  204. * @param code
  205. * @param param
  206. */
  207. private void checkParam(String code, String param){
  208. com.alibaba.fastjson.JSONObject json = JSON.parseObject(param);
  209. if(StringUtils.isEmpty(code)){
  210. BaseUtil.showError("查询方案编号不能为空", "NULL_QUERY_CODE");
  211. }
  212. if(json == null){
  213. BaseUtil.showError("传入的参数个数不正确", "PARAM_AMOUNT_ERROR");
  214. }
  215. String getInParamsSql = "select * from queryArgs where qa_qccode = ? and qa_relation is null";
  216. List<QueryArgs> inParamList = baseDao.query(getInParamsSql, QueryArgs.class, code);
  217. if(inParamList.size() != json.size()){
  218. BaseUtil.showError("传入的参数个数不正确", "PARAM_AMOUNT_ERROR");
  219. }else{
  220. for(QueryArgs queryArgs : inParamList){
  221. if(json.getString(queryArgs.getQa_param()) == null){
  222. BaseUtil.showError("传入的参数名不正确", "PARAM_NAME_ERROR");
  223. }else{
  224. if("array".equals(queryArgs.getQa_paramtype())){
  225. String stringArray = json.getString(queryArgs.getQa_param());
  226. if(!(stringArray.contains("[") && stringArray.contains("]"))){
  227. BaseUtil.showError("传入的参数:"+queryArgs.getQa_param()+"格式不正确", "PARAM_FORMAT_ERROR");
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234. @Override
  235. public Object doAction(String code, String param) {
  236. return null;
  237. }
  238. }