ade89f4373e5e6cec2e8d32ce560e26af46078e0.svn-base 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. package org.jeecg.modules.online.cgreport.service.impl;
  2. import cn.hutool.core.util.ReUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.jeecg.common.api.vo.Result;
  10. import org.jeecg.common.exception.JeecgBootException;
  11. import org.jeecg.common.system.query.QueryGenerator;
  12. import org.jeecg.common.system.vo.DynamicDataSourceModel;
  13. import org.jeecg.common.util.dynamic.db.DataSourceCachePool;
  14. import org.jeecg.common.util.dynamic.db.DynamicDBUtil;
  15. import org.jeecg.common.util.dynamic.db.SqlUtils;
  16. import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem;
  17. import org.jeecg.modules.online.cgreport.model.OnlCgreportModel;
  18. import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService;
  19. import org.jeecg.modules.online.cgreport.service.IOnlCgreportParamService;
  20. import org.jeecg.modules.online.cgreport.util.SqlUtil;
  21. import org.jeecg.common.util.CommonUtils;
  22. import org.jeecg.common.util.oConvertUtils;
  23. //import org.jeecg.modules.online.cgform.util.SqlSymbolUtil;
  24. import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead;
  25. import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam;
  26. import org.jeecg.modules.online.cgreport.mapper.OnlCgreportHeadMapper;
  27. import org.jeecg.modules.online.cgreport.service.IOnlCgreportHeadService;
  28. import org.jeecg.modules.online.config.util.TableUtil;
  29. import org.slf4j.Logger;
  30. import org.slf4j.LoggerFactory;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import java.sql.SQLException;
  35. import java.util.*;
  36. import java.util.regex.Matcher;
  37. import java.util.regex.Pattern;
  38. /**
  39. * TODO
  40. *
  41. * @author dousw
  42. * @version 1.0
  43. * @date 2020/11/11 14:44
  44. */
  45. @Service
  46. public class OnlCgreportHeadService extends ServiceImpl<OnlCgreportHeadMapper, OnlCgreportHead> implements IOnlCgreportHeadService {
  47. private static final Logger a = LoggerFactory.getLogger(OnlCgreportHeadService.class);
  48. @Autowired
  49. private IOnlCgreportParamService onlCgreportParamService;
  50. @Autowired
  51. private IOnlCgreportItemService onlCgreportItemService;
  52. @Autowired
  53. private OnlCgreportHeadMapper mapper;
  54. public Map<String, Object> executeSelectSql(String sql, String onlCgreportHeadId, Map<String, Object> params) throws SQLException {
  55. String databaseType = CommonUtils.getDatabaseType();
  56. LambdaQueryWrapper<OnlCgreportParam> qw = new LambdaQueryWrapper<>();
  57. qw.eq(OnlCgreportParam::getCgrheadId, onlCgreportHeadId);
  58. List<OnlCgreportParam> reportParams = this.onlCgreportParamService.list(qw);
  59. OnlCgreportParam onlCgreportParam;
  60. String paramValue;
  61. if (reportParams != null && reportParams.size() > 0) {
  62. for(Iterator<OnlCgreportParam> iterator = reportParams.iterator(); iterator.hasNext(); sql = sql.replace("${" + onlCgreportParam.getParamName() + "}", paramValue)) {
  63. onlCgreportParam = iterator.next();
  64. Object selfParamValue = params.get("self_" + onlCgreportParam.getParamName());
  65. paramValue = "";
  66. if (selfParamValue != null) {
  67. paramValue = selfParamValue.toString();
  68. } else if (selfParamValue == null && oConvertUtils.isNotEmpty(onlCgreportParam.getParamValue())) {
  69. paramValue = onlCgreportParam.getParamValue();
  70. }
  71. }
  72. }
  73. HashMap<String, Object> result = new HashMap<>();
  74. Integer pageSize = oConvertUtils.getInt(params.get("pageSize"), 10);
  75. Integer pageNo = oConvertUtils.getInt(params.get("pageNo"), 1);
  76. Page<Map<String, Object>> page = new Page<>(pageNo, pageSize);
  77. LambdaQueryWrapper<OnlCgreportItem> var11 = new LambdaQueryWrapper<>();
  78. var11.eq(OnlCgreportItem::getCgrheadId, onlCgreportHeadId);
  79. var11.eq(OnlCgreportItem::getIsSearch, 1);
  80. List<OnlCgreportItem> items = this.onlCgreportItemService.list(var11);
  81. String tempTableName = "jeecg_rp_temp";
  82. String wherecase = org.jeecg.modules.online.cgreport.util.CgReportQueryParamUtil.a(items, params, tempTableName+".");
  83. if (ReUtil.contains(" order\\s+by ", sql.toLowerCase()) && "SQLSERVER".equalsIgnoreCase(databaseType)) {
  84. throw new JeecgBootException("SqlServer不支持SQL内排序!");
  85. } else {
  86. String cgSql = "select * from (" + sql + ") "+ tempTableName +" where 1=1 " + wherecase;
  87. cgSql = SqlUtil.transSql(cgSql);
  88. Object column = params.get("column");
  89. if (column != null) {
  90. cgSql = cgSql + " order by " + tempTableName + "." + column.toString() + " " + params.get("order").toString();
  91. }
  92. a.info("报表查询sql=>\r\n" + cgSql);
  93. IPage<Map<String, Object>> iPage;
  94. if (Boolean.valueOf(String.valueOf(params.get("getAll")))) {
  95. List<Map<String, Object>> records = this.mapper.executeSelect(cgSql);
  96. iPage = new Page<Map<String, Object>>();
  97. iPage.setRecords(records);
  98. iPage.setTotal(records.size());
  99. } else {
  100. iPage = this.mapper.selectPageBySql(page, cgSql);
  101. }
  102. result.put("total", iPage.getTotal());
  103. result.put("records",iPage.getRecords());
  104. return result;
  105. }
  106. }
  107. public Map<String, Object> executeSelectSqlDynamic(String dbKey, String sql, Map<String, Object> params, String onlCgreportHeadId) {
  108. DynamicDataSourceModel dynamicDataSourceModel = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey);
  109. int pageNo = oConvertUtils.getInt(params.get("pageNo"), 1);
  110. int pageSize = oConvertUtils.getInt(params.get("pageSize"), 10);
  111. a.info("【Online多数据源逻辑】报表查询参数params: " + JSON.toJSONString(params));
  112. LambdaQueryWrapper<OnlCgreportParam> qw = new LambdaQueryWrapper<>();
  113. qw.eq(OnlCgreportParam::getCgrheadId, onlCgreportHeadId);
  114. List<OnlCgreportParam> reportParams = this.onlCgreportParamService.list(qw);
  115. OnlCgreportParam reportParam;
  116. String var15;
  117. if (reportParams != null && reportParams.size() > 0) {
  118. for(Iterator<OnlCgreportParam> iterator = reportParams.iterator(); iterator.hasNext(); sql = sql.replace("${" + reportParam.getParamName() + "}", var15)) {
  119. reportParam = iterator.next();
  120. Object var14 = params.get("self_" + reportParam.getParamName());
  121. var15 = "";
  122. if (var14 != null) {
  123. var15 = var14.toString();
  124. } else if (var14 == null && oConvertUtils.isNotEmpty(reportParam.getParamValue())) {
  125. var15 = reportParam.getParamValue();
  126. }
  127. }
  128. }
  129. LambdaQueryWrapper<OnlCgreportItem> var23 = new LambdaQueryWrapper<>();
  130. var23.eq(OnlCgreportItem::getCgrheadId, onlCgreportHeadId);
  131. var23.eq(OnlCgreportItem::getIsSearch, 1);
  132. List<OnlCgreportItem> items = this.onlCgreportItemService.list(var23);
  133. if (ReUtil.contains(" order\\s+by ", sql.toLowerCase()) && "3".equalsIgnoreCase(dynamicDataSourceModel.getDbType())) {
  134. throw new JeecgBootException("SqlServer不支持SQL内排序!");
  135. } else {
  136. String tempTableName = "jeecg_rp_temp";
  137. var15 = org.jeecg.modules.online.cgreport.util.CgReportQueryParamUtil.a(items, params, tempTableName + ".");
  138. String querySql = "select * from (" + sql + ") " + tempTableName + " where 1=1 " + var15;
  139. querySql = SqlUtil.transSql(querySql);
  140. String countSql = SqlUtils.getCountSql(querySql);
  141. Object column = params.get("column");
  142. if (column != null) {
  143. querySql = querySql + " order by " + tempTableName + "." + column.toString() + " " + params.get("order").toString();
  144. }
  145. String pageSQL = querySql;
  146. if (!Boolean.valueOf(String.valueOf(params.get("getAll")))) {
  147. pageSQL = SqlUtils.createPageSqlByDBType(dynamicDataSourceModel.getDbType(), querySql, pageNo, pageSize);
  148. }
  149. a.info("多数据源 报表查询sql=>querySql: " + querySql);
  150. a.info("多数据源 报表查询sql=>pageSQL: " + pageSQL);
  151. a.info("多数据源 报表查询sql=>countSql: " + countSql);
  152. HashMap<String, Object> result = new HashMap<>();
  153. Map<String, Object> var21 = (Map<String, Object>) DynamicDBUtil.findOne(dbKey, countSql, new Object[0]);
  154. result.put("total", var21.get("total"));
  155. List<Map<String, Object>> var22 = DynamicDBUtil.findList(dbKey, pageSQL, new Object[0]);
  156. result.put("records", var22);
  157. return result;
  158. }
  159. }
  160. @Transactional(
  161. rollbackFor = {Exception.class}
  162. )
  163. public Result<?> editAll(OnlCgreportModel values) {
  164. OnlCgreportHead var2 = values.getHead();
  165. OnlCgreportHead var3 = (OnlCgreportHead)super.getById(var2.getId());
  166. if (var3 == null) {
  167. return Result.error("未找到对应实体");
  168. } else {
  169. super.updateById(var2);
  170. LambdaQueryWrapper<OnlCgreportItem> var4 = new LambdaQueryWrapper();
  171. var4.eq(OnlCgreportItem::getCgrheadId, var2.getId());
  172. this.onlCgreportItemService.remove(var4);
  173. LambdaQueryWrapper<OnlCgreportParam> var5 = new LambdaQueryWrapper();
  174. var5.eq(OnlCgreportParam::getCgrheadId, var2.getId());
  175. this.onlCgreportParamService.remove(var5);
  176. Iterator var6 = values.getParams().iterator();
  177. while(var6.hasNext()) {
  178. OnlCgreportParam var7 = (OnlCgreportParam)var6.next();
  179. var7.setCgrheadId(var2.getId());
  180. }
  181. var6 = values.getItems().iterator();
  182. while(var6.hasNext()) {
  183. OnlCgreportItem var8 = (OnlCgreportItem)var6.next();
  184. var8.setFieldName(var8.getFieldName().trim().toLowerCase());
  185. var8.setCgrheadId(var2.getId());
  186. }
  187. this.onlCgreportItemService.saveBatch(values.getItems());
  188. this.onlCgreportParamService.saveBatch(values.getParams());
  189. return Result.ok("全部修改成功");
  190. }
  191. }
  192. @Transactional(
  193. rollbackFor = {Exception.class}
  194. )
  195. public Result<?> delete(String id) {
  196. boolean var2 = super.removeById(id);
  197. if (var2) {
  198. LambdaQueryWrapper<OnlCgreportItem> var3 = new LambdaQueryWrapper();
  199. var3.eq(OnlCgreportItem::getCgrheadId, id);
  200. this.onlCgreportItemService.remove(var3);
  201. LambdaQueryWrapper<OnlCgreportParam> var4 = new LambdaQueryWrapper();
  202. var4.eq(OnlCgreportParam::getCgrheadId, id);
  203. this.onlCgreportParamService.remove(var4);
  204. }
  205. return Result.ok("删除成功");
  206. }
  207. @Transactional(
  208. rollbackFor = {Exception.class}
  209. )
  210. public Result<?> bathDelete(String[] ids) {
  211. String[] var2 = ids;
  212. int var3 = ids.length;
  213. for(int var4 = 0; var4 < var3; ++var4) {
  214. String var5 = var2[var4];
  215. boolean var6 = super.removeById(var5);
  216. if (var6) {
  217. LambdaQueryWrapper<OnlCgreportItem> var7 = new LambdaQueryWrapper();
  218. var7.eq(OnlCgreportItem::getCgrheadId, var5);
  219. this.onlCgreportItemService.remove(var7);
  220. LambdaQueryWrapper<OnlCgreportParam> var8 = new LambdaQueryWrapper();
  221. var8.eq(OnlCgreportParam::getCgrheadId, var5);
  222. this.onlCgreportParamService.remove(var8);
  223. }
  224. }
  225. return Result.ok("删除成功");
  226. }
  227. public List<String> getSqlFields(String sql, String dbKey) throws SQLException {
  228. List var3 = null;
  229. if (StringUtils.isNotBlank(dbKey)) {
  230. var3 = this.a(sql, dbKey);
  231. } else {
  232. var3 = this.a(sql, (String)null);
  233. }
  234. return var3;
  235. }
  236. public List<String> getSqlParams(String sql) {
  237. if (oConvertUtils.isEmpty(sql)) {
  238. return null;
  239. } else {
  240. ArrayList var2 = new ArrayList();
  241. String var3 = "\\$\\{\\w+\\}";
  242. Pattern var4 = Pattern.compile(var3);
  243. Matcher var5 = var4.matcher(sql);
  244. while(var5.find()) {
  245. String var6 = var5.group();
  246. var2.add(var6.substring(var6.indexOf("{") + 1, var6.indexOf("}")));
  247. }
  248. return var2;
  249. }
  250. }
  251. private List<String> a(String var1, String var2) throws SQLException {
  252. if (oConvertUtils.isEmpty(var1)) {
  253. return null;
  254. } else {
  255. var1 = var1.trim();
  256. if (var1.endsWith(";")) {
  257. var1 = var1.substring(0, var1.length() - 1);
  258. }
  259. var1 = QueryGenerator.convertSystemVariables(var1);
  260. var1 = SqlUtil.a(var1);
  261. Set var3;
  262. if (StringUtils.isNotBlank(var2)) {
  263. a.info("parse sql : " + var1);
  264. DynamicDataSourceModel var4 = DataSourceCachePool.getCacheDynamicDataSourceModel(var2);
  265. if (ReUtil.contains(" order\\s+by ", var1.toLowerCase()) && "3".equalsIgnoreCase(var4.getDbType())) {
  266. throw new JeecgBootException("SqlServer不支持SQL内排序!");
  267. }
  268. if ("1".equals(var4.getDbType())) {
  269. var1 = "SELECT * FROM (" + var1 + ") temp LIMIT 1";
  270. } else if ("2".equals(var4.getDbType())) {
  271. var1 = "SELECT * FROM (" + var1 + ") temp WHERE ROWNUM <= 1";
  272. } else if ("3".equals(var4.getDbType())) {
  273. var1 = "SELECT TOP 1 * FROM (" + var1 + ") temp";
  274. }
  275. a.info("parse sql with page : " + var1);
  276. Map var5 = (Map)DynamicDBUtil.findOne(var2, var1, new Object[0]);
  277. if (var5 == null) {
  278. throw new JeecgBootException("该报表sql没有数据");
  279. }
  280. var3 = var5.keySet();
  281. } else {
  282. a.info("parse sql: " + var1);
  283. if (ReUtil.contains(" order\\s+by ", var1.toLowerCase()) && "SQLSERVER".equalsIgnoreCase(CommonUtils.getDatabaseType())) {
  284. throw new JeecgBootException("SqlServer不支持SQL内排序!");
  285. }
  286. IPage var6 = this.mapper.selectPageBySql(new Page(1L, 1L), var1);
  287. List var7 = var6.getRecords();
  288. if (var7.size() < 1) {
  289. throw new JeecgBootException("该报表sql没有数据");
  290. }
  291. var3 = ((Map)var7.get(0)).keySet();
  292. }
  293. if (var3 != null) {
  294. var3.remove("ROW_ID");
  295. }
  296. return new ArrayList(var3);
  297. }
  298. }
  299. public Map<String, Object> queryCgReportConfig(String reportId) {
  300. HashMap var2 = new HashMap(0);
  301. Map var3 = this.mapper.queryCgReportMainConfig(reportId);
  302. List var4 = this.mapper.queryCgReportItems(reportId);
  303. List var5 = this.mapper.queryCgReportParams(reportId);
  304. /* if (TableUtil.isOracle()) {
  305. var2.put("main", SqlSymbolUtil.getValueType(var3));
  306. var2.put("items", SqlSymbolUtil.transforRecords(var4));
  307. } else {*/
  308. var2.put("main", var3);
  309. var2.put("items", var4);
  310. // }
  311. var2.put("params", var5);
  312. return var2;
  313. }
  314. public List<Map<?, ?>> queryByCgReportSql(String sql, Map params, Map paramData, int pageNo, int pageSize) {
  315. String var6 = SqlUtil.a(sql, params);
  316. List var7 = null;
  317. if (paramData != null && paramData.size() == 0) {
  318. paramData = null;
  319. }
  320. if (pageNo == -1 && pageSize == -1) {
  321. var7 = this.mapper.executeSelete(var6);
  322. } else {
  323. Page var8 = new Page((long)pageNo, (long)pageSize);
  324. IPage var9 = this.mapper.selectPageBySql(var8, var6);
  325. if (var9.getRecords() != null && var9.getRecords().size() > 0) {
  326. var7.addAll(var9.getRecords());
  327. }
  328. }
  329. return var7;
  330. }
  331. }