123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- package org.jeecg.modules.online.cgreport.service.impl;
- import cn.hutool.core.util.ReUtil;
- import com.alibaba.fastjson.JSON;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.metadata.IPage;
- import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import org.apache.commons.lang.StringUtils;
- import org.jeecg.common.api.vo.Result;
- import org.jeecg.common.exception.JeecgBootException;
- import org.jeecg.common.system.query.QueryGenerator;
- import org.jeecg.common.system.vo.DynamicDataSourceModel;
- import org.jeecg.common.util.dynamic.db.DataSourceCachePool;
- import org.jeecg.common.util.dynamic.db.DynamicDBUtil;
- import org.jeecg.common.util.dynamic.db.SqlUtils;
- import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem;
- import org.jeecg.modules.online.cgreport.model.OnlCgreportModel;
- import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService;
- import org.jeecg.modules.online.cgreport.service.IOnlCgreportParamService;
- import org.jeecg.modules.online.cgreport.util.SqlUtil;
- import org.jeecg.common.util.CommonUtils;
- import org.jeecg.common.util.oConvertUtils;
- //import org.jeecg.modules.online.cgform.util.SqlSymbolUtil;
- import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead;
- import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam;
- import org.jeecg.modules.online.cgreport.mapper.OnlCgreportHeadMapper;
- import org.jeecg.modules.online.cgreport.service.IOnlCgreportHeadService;
- import org.jeecg.modules.online.config.util.TableUtil;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import java.sql.SQLException;
- import java.util.*;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- * TODO
- *
- * @author dousw
- * @version 1.0
- * @date 2020/11/11 14:44
- */
- @Service
- public class OnlCgreportHeadService extends ServiceImpl<OnlCgreportHeadMapper, OnlCgreportHead> implements IOnlCgreportHeadService {
- private static final Logger a = LoggerFactory.getLogger(OnlCgreportHeadService.class);
- @Autowired
- private IOnlCgreportParamService onlCgreportParamService;
- @Autowired
- private IOnlCgreportItemService onlCgreportItemService;
- @Autowired
- private OnlCgreportHeadMapper mapper;
- public Map<String, Object> executeSelectSql(String sql, String onlCgreportHeadId, Map<String, Object> params) throws SQLException {
- String databaseType = CommonUtils.getDatabaseType();
- LambdaQueryWrapper<OnlCgreportParam> qw = new LambdaQueryWrapper<>();
- qw.eq(OnlCgreportParam::getCgrheadId, onlCgreportHeadId);
- List<OnlCgreportParam> reportParams = this.onlCgreportParamService.list(qw);
- OnlCgreportParam onlCgreportParam;
- String paramValue;
- if (reportParams != null && reportParams.size() > 0) {
- for(Iterator<OnlCgreportParam> iterator = reportParams.iterator(); iterator.hasNext(); sql = sql.replace("${" + onlCgreportParam.getParamName() + "}", paramValue)) {
- onlCgreportParam = iterator.next();
- Object selfParamValue = params.get("self_" + onlCgreportParam.getParamName());
- paramValue = "";
- if (selfParamValue != null) {
- paramValue = selfParamValue.toString();
- } else if (selfParamValue == null && oConvertUtils.isNotEmpty(onlCgreportParam.getParamValue())) {
- paramValue = onlCgreportParam.getParamValue();
- }
- }
- }
- HashMap<String, Object> result = new HashMap<>();
- Integer pageSize = oConvertUtils.getInt(params.get("pageSize"), 10);
- Integer pageNo = oConvertUtils.getInt(params.get("pageNo"), 1);
- Page<Map<String, Object>> page = new Page<>(pageNo, pageSize);
- LambdaQueryWrapper<OnlCgreportItem> var11 = new LambdaQueryWrapper<>();
- var11.eq(OnlCgreportItem::getCgrheadId, onlCgreportHeadId);
- var11.eq(OnlCgreportItem::getIsSearch, 1);
- List<OnlCgreportItem> items = this.onlCgreportItemService.list(var11);
- String tempTableName = "jeecg_rp_temp";
- String wherecase = org.jeecg.modules.online.cgreport.util.CgReportQueryParamUtil.a(items, params, tempTableName+".");
- if (ReUtil.contains(" order\\s+by ", sql.toLowerCase()) && "SQLSERVER".equalsIgnoreCase(databaseType)) {
- throw new JeecgBootException("SqlServer不支持SQL内排序!");
- } else {
- String cgSql = "select * from (" + sql + ") "+ tempTableName +" where 1=1 " + wherecase;
- cgSql = SqlUtil.transSql(cgSql);
- Object column = params.get("column");
- if (column != null) {
- cgSql = cgSql + " order by " + tempTableName + "." + column.toString() + " " + params.get("order").toString();
- }
- a.info("报表查询sql=>\r\n" + cgSql);
- IPage<Map<String, Object>> iPage;
- if (Boolean.valueOf(String.valueOf(params.get("getAll")))) {
- List<Map<String, Object>> records = this.mapper.executeSelect(cgSql);
- iPage = new Page<Map<String, Object>>();
- iPage.setRecords(records);
- iPage.setTotal(records.size());
- } else {
- iPage = this.mapper.selectPageBySql(page, cgSql);
- }
- result.put("total", iPage.getTotal());
- result.put("records",iPage.getRecords());
- return result;
- }
- }
- public Map<String, Object> executeSelectSqlDynamic(String dbKey, String sql, Map<String, Object> params, String onlCgreportHeadId) {
- DynamicDataSourceModel dynamicDataSourceModel = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey);
- int pageNo = oConvertUtils.getInt(params.get("pageNo"), 1);
- int pageSize = oConvertUtils.getInt(params.get("pageSize"), 10);
- a.info("【Online多数据源逻辑】报表查询参数params: " + JSON.toJSONString(params));
- LambdaQueryWrapper<OnlCgreportParam> qw = new LambdaQueryWrapper<>();
- qw.eq(OnlCgreportParam::getCgrheadId, onlCgreportHeadId);
- List<OnlCgreportParam> reportParams = this.onlCgreportParamService.list(qw);
- OnlCgreportParam reportParam;
- String var15;
- if (reportParams != null && reportParams.size() > 0) {
- for(Iterator<OnlCgreportParam> iterator = reportParams.iterator(); iterator.hasNext(); sql = sql.replace("${" + reportParam.getParamName() + "}", var15)) {
- reportParam = iterator.next();
- Object var14 = params.get("self_" + reportParam.getParamName());
- var15 = "";
- if (var14 != null) {
- var15 = var14.toString();
- } else if (var14 == null && oConvertUtils.isNotEmpty(reportParam.getParamValue())) {
- var15 = reportParam.getParamValue();
- }
- }
- }
- LambdaQueryWrapper<OnlCgreportItem> var23 = new LambdaQueryWrapper<>();
- var23.eq(OnlCgreportItem::getCgrheadId, onlCgreportHeadId);
- var23.eq(OnlCgreportItem::getIsSearch, 1);
- List<OnlCgreportItem> items = this.onlCgreportItemService.list(var23);
- if (ReUtil.contains(" order\\s+by ", sql.toLowerCase()) && "3".equalsIgnoreCase(dynamicDataSourceModel.getDbType())) {
- throw new JeecgBootException("SqlServer不支持SQL内排序!");
- } else {
- String tempTableName = "jeecg_rp_temp";
- var15 = org.jeecg.modules.online.cgreport.util.CgReportQueryParamUtil.a(items, params, tempTableName + ".");
- String querySql = "select * from (" + sql + ") " + tempTableName + " where 1=1 " + var15;
- querySql = SqlUtil.transSql(querySql);
- String countSql = SqlUtils.getCountSql(querySql);
- Object column = params.get("column");
- if (column != null) {
- querySql = querySql + " order by " + tempTableName + "." + column.toString() + " " + params.get("order").toString();
- }
- String pageSQL = querySql;
- if (!Boolean.valueOf(String.valueOf(params.get("getAll")))) {
- pageSQL = SqlUtils.createPageSqlByDBType(dynamicDataSourceModel.getDbType(), querySql, pageNo, pageSize);
- }
- a.info("多数据源 报表查询sql=>querySql: " + querySql);
- a.info("多数据源 报表查询sql=>pageSQL: " + pageSQL);
- a.info("多数据源 报表查询sql=>countSql: " + countSql);
- HashMap<String, Object> result = new HashMap<>();
- Map<String, Object> var21 = (Map<String, Object>) DynamicDBUtil.findOne(dbKey, countSql, new Object[0]);
- result.put("total", var21.get("total"));
- List<Map<String, Object>> var22 = DynamicDBUtil.findList(dbKey, pageSQL, new Object[0]);
- result.put("records", var22);
- return result;
- }
- }
- @Transactional(
- rollbackFor = {Exception.class}
- )
- public Result<?> editAll(OnlCgreportModel values) {
- OnlCgreportHead var2 = values.getHead();
- OnlCgreportHead var3 = (OnlCgreportHead)super.getById(var2.getId());
- if (var3 == null) {
- return Result.error("未找到对应实体");
- } else {
- super.updateById(var2);
- LambdaQueryWrapper<OnlCgreportItem> var4 = new LambdaQueryWrapper();
- var4.eq(OnlCgreportItem::getCgrheadId, var2.getId());
- this.onlCgreportItemService.remove(var4);
- LambdaQueryWrapper<OnlCgreportParam> var5 = new LambdaQueryWrapper();
- var5.eq(OnlCgreportParam::getCgrheadId, var2.getId());
- this.onlCgreportParamService.remove(var5);
- Iterator var6 = values.getParams().iterator();
- while(var6.hasNext()) {
- OnlCgreportParam var7 = (OnlCgreportParam)var6.next();
- var7.setCgrheadId(var2.getId());
- }
- var6 = values.getItems().iterator();
- while(var6.hasNext()) {
- OnlCgreportItem var8 = (OnlCgreportItem)var6.next();
- var8.setFieldName(var8.getFieldName().trim().toLowerCase());
- var8.setCgrheadId(var2.getId());
- }
- this.onlCgreportItemService.saveBatch(values.getItems());
- this.onlCgreportParamService.saveBatch(values.getParams());
- return Result.ok("全部修改成功");
- }
- }
- @Transactional(
- rollbackFor = {Exception.class}
- )
- public Result<?> delete(String id) {
- boolean var2 = super.removeById(id);
- if (var2) {
- LambdaQueryWrapper<OnlCgreportItem> var3 = new LambdaQueryWrapper();
- var3.eq(OnlCgreportItem::getCgrheadId, id);
- this.onlCgreportItemService.remove(var3);
- LambdaQueryWrapper<OnlCgreportParam> var4 = new LambdaQueryWrapper();
- var4.eq(OnlCgreportParam::getCgrheadId, id);
- this.onlCgreportParamService.remove(var4);
- }
- return Result.ok("删除成功");
- }
- @Transactional(
- rollbackFor = {Exception.class}
- )
- public Result<?> bathDelete(String[] ids) {
- String[] var2 = ids;
- int var3 = ids.length;
- for(int var4 = 0; var4 < var3; ++var4) {
- String var5 = var2[var4];
- boolean var6 = super.removeById(var5);
- if (var6) {
- LambdaQueryWrapper<OnlCgreportItem> var7 = new LambdaQueryWrapper();
- var7.eq(OnlCgreportItem::getCgrheadId, var5);
- this.onlCgreportItemService.remove(var7);
- LambdaQueryWrapper<OnlCgreportParam> var8 = new LambdaQueryWrapper();
- var8.eq(OnlCgreportParam::getCgrheadId, var5);
- this.onlCgreportParamService.remove(var8);
- }
- }
- return Result.ok("删除成功");
- }
- public List<String> getSqlFields(String sql, String dbKey) throws SQLException {
- List var3 = null;
- if (StringUtils.isNotBlank(dbKey)) {
- var3 = this.a(sql, dbKey);
- } else {
- var3 = this.a(sql, (String)null);
- }
- return var3;
- }
- public List<String> getSqlParams(String sql) {
- if (oConvertUtils.isEmpty(sql)) {
- return null;
- } else {
- ArrayList var2 = new ArrayList();
- String var3 = "\\$\\{\\w+\\}";
- Pattern var4 = Pattern.compile(var3);
- Matcher var5 = var4.matcher(sql);
- while(var5.find()) {
- String var6 = var5.group();
- var2.add(var6.substring(var6.indexOf("{") + 1, var6.indexOf("}")));
- }
- return var2;
- }
- }
- private List<String> a(String var1, String var2) throws SQLException {
- if (oConvertUtils.isEmpty(var1)) {
- return null;
- } else {
- var1 = var1.trim();
- if (var1.endsWith(";")) {
- var1 = var1.substring(0, var1.length() - 1);
- }
- var1 = QueryGenerator.convertSystemVariables(var1);
- var1 = SqlUtil.a(var1);
- Set var3;
- if (StringUtils.isNotBlank(var2)) {
- a.info("parse sql : " + var1);
- DynamicDataSourceModel var4 = DataSourceCachePool.getCacheDynamicDataSourceModel(var2);
- if (ReUtil.contains(" order\\s+by ", var1.toLowerCase()) && "3".equalsIgnoreCase(var4.getDbType())) {
- throw new JeecgBootException("SqlServer不支持SQL内排序!");
- }
- if ("1".equals(var4.getDbType())) {
- var1 = "SELECT * FROM (" + var1 + ") temp LIMIT 1";
- } else if ("2".equals(var4.getDbType())) {
- var1 = "SELECT * FROM (" + var1 + ") temp WHERE ROWNUM <= 1";
- } else if ("3".equals(var4.getDbType())) {
- var1 = "SELECT TOP 1 * FROM (" + var1 + ") temp";
- }
- a.info("parse sql with page : " + var1);
- Map var5 = (Map)DynamicDBUtil.findOne(var2, var1, new Object[0]);
- if (var5 == null) {
- throw new JeecgBootException("该报表sql没有数据");
- }
- var3 = var5.keySet();
- } else {
- a.info("parse sql: " + var1);
- if (ReUtil.contains(" order\\s+by ", var1.toLowerCase()) && "SQLSERVER".equalsIgnoreCase(CommonUtils.getDatabaseType())) {
- throw new JeecgBootException("SqlServer不支持SQL内排序!");
- }
- IPage var6 = this.mapper.selectPageBySql(new Page(1L, 1L), var1);
- List var7 = var6.getRecords();
- if (var7.size() < 1) {
- throw new JeecgBootException("该报表sql没有数据");
- }
- var3 = ((Map)var7.get(0)).keySet();
- }
- if (var3 != null) {
- var3.remove("ROW_ID");
- }
- return new ArrayList(var3);
- }
- }
- public Map<String, Object> queryCgReportConfig(String reportId) {
- HashMap var2 = new HashMap(0);
- Map var3 = this.mapper.queryCgReportMainConfig(reportId);
- List var4 = this.mapper.queryCgReportItems(reportId);
- List var5 = this.mapper.queryCgReportParams(reportId);
- /* if (TableUtil.isOracle()) {
- var2.put("main", SqlSymbolUtil.getValueType(var3));
- var2.put("items", SqlSymbolUtil.transforRecords(var4));
- } else {*/
- var2.put("main", var3);
- var2.put("items", var4);
- // }
- var2.put("params", var5);
- return var2;
- }
- public List<Map<?, ?>> queryByCgReportSql(String sql, Map params, Map paramData, int pageNo, int pageSize) {
- String var6 = SqlUtil.a(sql, params);
- List var7 = null;
- if (paramData != null && paramData.size() == 0) {
- paramData = null;
- }
- if (pageNo == -1 && pageSize == -1) {
- var7 = this.mapper.executeSelete(var6);
- } else {
- Page var8 = new Page((long)pageNo, (long)pageSize);
- IPage var9 = this.mapper.selectPageBySql(var8, var6);
- if (var9.getRecords() != null && var9.getRecords().size() > 0) {
- var7.addAll(var9.getRecords());
- }
- }
- return var7;
- }
- }
|