ReportServiceImpl.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. package com.kcim.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ReUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
  6. import com.kcim.common.constants.Constant;
  7. import com.kcim.common.constants.NumberConstant;
  8. import com.kcim.common.constants.SQLParameter;
  9. import com.kcim.common.exception.CostException;
  10. import com.kcim.common.util.PageUtils;
  11. import com.kcim.common.util.UserContext;
  12. import com.kcim.dao.model.*;
  13. import com.kcim.dao.repository.*;
  14. import com.kcim.service.CenterService;
  15. import com.kcim.service.ReportService;
  16. import com.kcim.vo.*;
  17. import com.kcim.web.reponse.ReportResponse;
  18. import lombok.AllArgsConstructor;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.util.CollectionUtils;
  22. import org.springframework.util.StringUtils;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.util.*;
  26. import java.util.concurrent.ConcurrentHashMap;
  27. import java.util.concurrent.atomic.AtomicReference;
  28. import java.util.stream.Collectors;
  29. /**
  30. * @program: CostAccount
  31. * @description: 报表查询接口实现类
  32. * @author: Wang.YS
  33. * @create: 2023-11-01 20:41
  34. **/
  35. @Service("ReportService")
  36. @AllArgsConstructor
  37. @Slf4j
  38. public class ReportServiceImpl implements ReportService {
  39. CostReportRepository repository;
  40. CostReportColumnRepository costReportColumnRepository;
  41. CostColumnRepository costColumnRepository;
  42. CostReportRedirectRepository costReportRedirectRepository;
  43. CenterService centerService;
  44. CostReportIndexRepository costReportIndexRepository;
  45. @Override
  46. public Object getReportData(Integer current, Integer pageSize, String reportCode, Map<String, String> parameter) {
  47. CostReport report = repository.getReportByReportCode(Long.valueOf(reportCode));
  48. if(Objects.isNull(report)){
  49. log.error("未找到当前报表代码【"+reportCode+"】报表,请确认当前报表是否存在");
  50. throw new CostException("未找到当前报表代码报表,请确认当前报表是否存在");
  51. }
  52. //查询报表 获取主键列
  53. List<CostReportColumn> reportColumns = costReportColumnRepository.getReportColumnByReportCode(Long.valueOf(reportCode));
  54. if(CollectionUtils.isEmpty(reportColumns)){
  55. log.error("报表"+report.getName()+"未配置任何显示列,请先添加报表列再查询!");
  56. throw new CostException("报表"+report.getName()+"未配置任何显示列,请先添加报表列再查询!");
  57. }
  58. //获取主键列
  59. List<CostReportColumn> collect = reportColumns.stream().filter(f -> f.getPrimaryKey().equals(NumberConstant.ONE)).collect(Collectors.toList());
  60. //主键列校验
  61. if(CollectionUtils.isEmpty(collect)){
  62. log.error("报表【"+report.getName()+"】未添加主键列,请重新维护!");
  63. throw new CostException("报表【"+report.getName()+"】未添加主键列,请重新维护!");
  64. }
  65. List<Long> columnCodes = reportColumns.stream().map(CostReportColumn::getColumnCode).collect(Collectors.toList());
  66. //获取列代码
  67. List<CostColumn> costColumns = costColumnRepository.getColumnByColumnCode(columnCodes);
  68. if(CollectionUtils.isEmpty(costColumns)){
  69. throw new CostException("报表"+report.getName()+"无符合条件报表列数据");
  70. }
  71. Map<Long,CostColumn> costColumnMap = costColumns.stream().collect(Collectors.toMap(CostColumn::getCode, column -> column, (a, b) -> b));
  72. Map<Integer, List<CostColumn>> dataSourceGroup = costColumns.stream().collect(Collectors.groupingBy(CostColumn::getDataSource));
  73. //获取报表是否可以跳转数据及跳转列 及跳转报表code
  74. List<CostReportRedirect> redirectByReportCode = costReportRedirectRepository.getRedirectByReportCode(Long.valueOf(reportCode));
  75. // Map<Long,ReportRedirect> reportRedirectMap = redirectByReportCode.stream().collect(Collectors.toMap(ReportRedirect::getReportColumnCode, redirect -> redirect, (a, b) -> b));
  76. //此需求不一定符合实际情况 强制要求改动 单报表同一字段 实际运用过程过只会下钻 子类数据一张报表 不会存在多张 备注记录一下
  77. Map<Long, List<CostReportRedirect>> reportRedirectMap = redirectByReportCode.stream().collect(Collectors.groupingBy(CostReportRedirect::getReportColumnCode));
  78. //创建报表列标题 从字典中获取看是否存在已维护的标题 2023/7/12
  79. // Map<String, String> columnNameMap = sysDictDetailService.getDictionaryCodeNameMap(DirectoryConstant.REPORT_COLUMN_TEXT_MAP);
  80. DictDataVo dict = centerService.getDict(Constant.REPORT_COLUMN_TEXT_MAP);
  81. List<DictDataVo> dataVoList = dict.getDataVoList();
  82. Map<String, String> columnNameMap = new HashMap<>();
  83. Map<String, Integer> columnSortMap = new HashMap<>();
  84. if(!CollectionUtils.isEmpty(dataVoList)){
  85. columnNameMap = dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getName, (a, b) -> b));
  86. columnSortMap = dataVoList.stream().collect(Collectors.toMap(DictDataVo::getCode, DictDataVo::getSort, (a, b) -> b));
  87. }
  88. //获取主键列代码
  89. Long columnCode = collect.get(0).getColumnCode();
  90. //获取主键数据
  91. CostColumn costColumn = costColumnMap.get(columnCode);
  92. String keySql = costColumn.getSql();
  93. if(!CollectionUtils.isEmpty(parameter)){
  94. keySql = MatchParameter(keySql, parameter);
  95. }else {
  96. keySql = MatchParameter(keySql, new HashMap<>());
  97. }
  98. log.info("主键sql"+keySql);
  99. List<Map<String, Object>> keyList = sqlRunnerList(keySql);
  100. if(CollectionUtils.isEmpty(keyList)){
  101. log.error("报表"+report.getName()+"无符合条件主键数据"+keySql);
  102. throw new CostException("报表"+report.getName()+"无符合条件主键数据");
  103. }
  104. Integer totalCount = keyList.size();
  105. if (current ==null){
  106. current = 1;
  107. }
  108. if(pageSize ==null){
  109. pageSize = 100;
  110. }
  111. List<Map<String, Object>> maps = PageUtils.startPage(keyList, current, pageSize);
  112. List<CostColumn> calcFormulaList = dataSourceGroup.get(NumberConstant.ONE);
  113. List<Long> calcCode = new ArrayList<>();
  114. if(!CollectionUtils.isEmpty(calcFormulaList)){
  115. calcCode = calcFormulaList.stream().map(CostColumn::getCode).collect(Collectors.toList());
  116. }
  117. List<CostColumn> sqlList = dataSourceGroup.get(NumberConstant.TWO);
  118. List<Long> sqlCode = sqlList.stream().map(CostColumn::getCode).collect(Collectors.toList());
  119. List<CostReportColumn> calcReportColumn = new ArrayList<>();
  120. List<CostReportColumn> sqlReportColumn = new ArrayList<>();
  121. for (CostReportColumn reportColumn : reportColumns) {
  122. if(!CollectionUtils.isEmpty(calcCode)){
  123. if(calcCode.contains(reportColumn.getColumnCode())){
  124. calcReportColumn.add(reportColumn);
  125. }
  126. }
  127. if(sqlCode.contains(reportColumn.getColumnCode())){
  128. sqlReportColumn.add(reportColumn);
  129. }
  130. }
  131. calcReportColumn.sort(Comparator.comparing(CostReportColumn::getSort));
  132. List<List<ReportVo>> vos = new ArrayList<>();
  133. ReportCodeModifyVo reportCodeModifyVo = new ReportCodeModifyVo();
  134. for(Map<String, Object> result:maps){
  135. if(CollectionUtils.isEmpty(result)){
  136. continue;
  137. }
  138. Map<String, Object> keyParameter = result.keySet().stream().collect(Collectors.toMap(s -> s, result::get, (a, b) -> b));
  139. List<ReportVo> dataVo = new ArrayList<>();
  140. //sql报表列
  141. if(!CollectionUtils.isEmpty(sqlReportColumn)){
  142. for(CostReportColumn column:sqlReportColumn){
  143. Integer primaryKey = column.getPrimaryKey();
  144. if(primaryKey.equals(NumberConstant.ONE)){
  145. if(result.size()>1){
  146. Map<String,String> modify = new HashMap<>();
  147. for(String s:result.keySet()){
  148. ReportVo vo = new ReportVo();
  149. vo.setCode(column.getReportCode()+s);
  150. vo.setValue(result.get(s));
  151. dataVo.add(vo);
  152. modify.put(column.getReportCode()+s,s);
  153. }
  154. reportCodeModifyVo.setReportCode(column.getColumnCode());
  155. reportCodeModifyVo.setModifyReportCode(modify);
  156. }else {
  157. ReportVo vo = new ReportVo();
  158. vo.setCode(column.getColumnCode().toString());
  159. vo.setValue(result.values().stream().findFirst().get());
  160. // modify.put(vo.getCode(),result.keySet().stream().findFirst().get());
  161. dataVo.add(vo);
  162. }
  163. // reportCodeModifyVo.setReportCode(column.getColumnCode());
  164. // reportCodeModifyVo.setModifyReportCode(modify);
  165. }else {
  166. ReportVo vo = new ReportVo();
  167. vo.setCode(column.getColumnCode().toString());
  168. CostColumn col = costColumnMap.get(column.getColumnCode());
  169. String sql = col.getSql();
  170. String handleSql ;
  171. if(!CollectionUtils.isEmpty(parameter)){
  172. handleSql = MatchParameter(sql, keyParameter, parameter);
  173. }else {
  174. handleSql = MatchParameter(sql, keyParameter,new HashMap<>());
  175. }
  176. Object o = sqlRunner(handleSql);
  177. // Integer dataType = col.getDataType();
  178. //
  179. // if(dataType != null&&dataType.equals(NumberConstant.THREE)){
  180. // Integer decimalPlace = col.getDecimalPlace();
  181. // if(o.equals("")){
  182. // vo.setValue(BigDecimal.ZERO.setScale(decimalPlace,RoundingMode.HALF_UP));
  183. // }else {
  184. // BigDecimal value = new BigDecimal(o.toString());
  185. // vo.setValue(value.setScale(decimalPlace,RoundingMode.HALF_UP));
  186. // }
  187. // }else {
  188. vo.setValue(o);
  189. // }
  190. dataVo.add(vo);
  191. }
  192. }
  193. }
  194. //添加计算公式算法
  195. if(!CollectionUtils.isEmpty(calcReportColumn)){
  196. for(CostReportColumn column:calcReportColumn){
  197. Integer primaryKey = column.getPrimaryKey();
  198. if(primaryKey.equals(NumberConstant.ONE)){
  199. if(result.size()>1){
  200. Map<String,String> modify = new HashMap<>();
  201. for(String s:result.keySet()){
  202. ReportVo vo = new ReportVo();
  203. vo.setCode(column.getReportCode()+s);
  204. vo.setValue(result.get(s));
  205. dataVo.add(vo);
  206. modify.put(column.getReportCode()+s,s);
  207. }
  208. reportCodeModifyVo.setReportCode(column.getColumnCode());
  209. reportCodeModifyVo.setModifyReportCode(modify);
  210. }else {
  211. ReportVo vo = new ReportVo();
  212. vo.setCode(column.getColumnCode().toString());
  213. vo.setValue(result.values().stream().findFirst().get());
  214. dataVo.add(vo);
  215. }
  216. }else {
  217. ReportVo vo = new ReportVo();
  218. vo.setCode(column.getColumnCode().toString());
  219. CostColumn col = costColumnMap.get(column.getColumnCode());
  220. String formula = col.getFormula();
  221. BigDecimal formulaData = getFormulaData(formula, dataVo,column);
  222. // Integer dataType = col.getDataType();
  223. // if(dataType != null&&dataType.equals(NumberConstant.THREE)){
  224. // Integer decimalPlace = col.getDecimalPlace();
  225. // vo.setValue(formulaData.setScale(decimalPlace, RoundingMode.HALF_UP));
  226. // }else {
  227. vo.setValue(formulaData);
  228. // }
  229. dataVo.add(vo);
  230. }
  231. }
  232. }
  233. vos.add(dataVo);
  234. }
  235. List<ReportTitleVo> titleVos = new ArrayList<>();
  236. for(CostReportColumn column:reportColumns){
  237. Integer primaryKey = column.getPrimaryKey();
  238. if(primaryKey.equals(NumberConstant.ONE)){
  239. if(reportCodeModifyVo.getReportCode() != null){
  240. if(reportCodeModifyVo.getReportCode().equals(column.getColumnCode())){
  241. Map<String, String> modifyReportCode = reportCodeModifyVo.getModifyReportCode();
  242. List<String> primary = modifyReportCode.keySet().stream().map(modifyReportCode::get).collect(Collectors.toList());
  243. for(String key:modifyReportCode.keySet()){
  244. ReportTitleVo vo = new ReportTitleVo();
  245. vo.setCode(key);
  246. String columnName = modifyReportCode.get(key);
  247. String name;
  248. if(!CollectionUtils.isEmpty(columnNameMap)){
  249. name = columnNameMap.get(columnName);
  250. if(StringUtils.isEmpty(name)){
  251. name = columnName;
  252. }
  253. }else {
  254. name = columnName;
  255. }
  256. vo.setName(name);
  257. if(!CollectionUtils.isEmpty(columnSortMap)){
  258. Integer sort = columnSortMap.get(columnName);
  259. vo.setSort(sort != null ? sort : column.getSort());
  260. }else {
  261. vo.setSort(column.getSort());
  262. }
  263. vo.setHide(column.getHide());
  264. vo.setFreeze(column.getFreeze());
  265. vo.setSortStatus(column.getSortStatus());
  266. // 2023/7/13 主键列为多个时候 需要用sql查出的列表作为 columnName 要求改造
  267. vo.setColumnName(columnName);
  268. vo.setSearch(column.getSearch());
  269. List<CostReportRedirect> reportRedirects = reportRedirectMap.get(column.getColumnCode());
  270. if(!CollectionUtils.isEmpty(reportRedirects)){
  271. List<RedirectData> redirectDataList = new ArrayList<>();
  272. for(CostReportRedirect redirect:reportRedirects){
  273. RedirectData redirectData = new RedirectData();
  274. redirectData.setRedirectReportCode(redirect.getRedirectReportCode());
  275. // 2023/7/13 主键列为多个时候 有跳转报表 把每个主键列都放进去 要求改造
  276. StringBuilder redirectParameter = setRedirectParameter(primary, redirect);
  277. redirectData.setRedirectParameter(redirectParameter.toString());
  278. redirectData.setRedirectReportName(redirect.getRedirectReportName());
  279. redirectDataList.add(redirectData);
  280. }
  281. vo.setRedirect(true);
  282. vo.setRedirectData(redirectDataList);
  283. }
  284. titleVos.add(vo);
  285. }
  286. } else {
  287. titleVos.add(getReportTitleVo(column.getColumnCode().toString(), column.getColumnHeaderText(), column, reportRedirectMap,reportCodeModifyVo,costColumnMap));
  288. }
  289. }else {
  290. titleVos.add(getReportTitleVo(column.getColumnCode().toString(), column.getColumnHeaderText(), column, reportRedirectMap, reportCodeModifyVo, costColumnMap));
  291. }
  292. }else {
  293. titleVos.add(getReportTitleVo(column.getColumnCode().toString(), column.getColumnHeaderText(), column, reportRedirectMap, reportCodeModifyVo, costColumnMap));
  294. }
  295. }
  296. ReportResponse response = new ReportResponse();
  297. titleVos.sort(Comparator.comparing(ReportTitleVo::getSort));
  298. response.setReportName(report.getName());
  299. response.setTitle(titleVos);
  300. response.setData(vos);
  301. response.setCurrent(current);
  302. response.setPageSize(pageSize);
  303. response.setTotalCount(totalCount);
  304. response.setTotalPage((int)Math.ceil((double)totalCount/pageSize));
  305. return response;
  306. }
  307. @Override
  308. public Object getReportIndex(Long reportCode) {
  309. CostReport report = repository.getReportByReportCode(reportCode);
  310. List<CostReportIndex> byReportCode = costReportIndexRepository.getByReportCode(Collections.singletonList(reportCode));
  311. if(!CollectionUtils.isEmpty(byReportCode)){
  312. report.setReportIndex(byReportCode);
  313. }
  314. return report;
  315. }
  316. private BigDecimal getFormulaData(String formula, List<ReportVo> dataVo, CostReportColumn column) {
  317. //找出公式当中所有代码
  318. String replace = formula.replace("[", "")
  319. .replace("]", "")
  320. .replace("-", ",")
  321. .replace("+", ",")
  322. .replace("*",",")
  323. .replace("/",",");
  324. ArrayList<String> codeList = CollUtil.newArrayList(replace.split(","));
  325. Map<Integer, String> codeMap = new ConcurrentHashMap<>();
  326. for (int j = 0; j < codeList.size(); j++) {
  327. codeMap.put(j, codeList.get(j));
  328. }
  329. List<String> expressions = ReUtil.findAll("[^0-9]", "+" + formula.replace("[", "")
  330. .replace("]", "").trim(), 0)
  331. .stream().filter(StrUtil::isNotBlank).collect(Collectors.toList());
  332. // 得到预算表达式 得到所有表达式的Map + - 相关的
  333. Map<Integer, String> expressionMap = new ConcurrentHashMap<>();
  334. for (int k = 0; k < expressions.size(); k++) {
  335. expressionMap.put(k, expressions.get(k));
  336. }
  337. // 数字的索引和表达式的索引累加计算
  338. Set<Integer> codeSet = codeMap.keySet();
  339. List<Integer> codes = new ArrayList<>(codeSet);
  340. AtomicReference<BigDecimal> totalAmount = new AtomicReference<>();
  341. totalAmount.set(BigDecimal.ZERO);
  342. Map<String,Object> dataMap = dataVo.stream().collect(Collectors.toMap(ReportVo::getCode, ReportVo::getValue, (a, b) -> b));
  343. for (int i = 0; i < codes.size(); i++) {
  344. // 编号
  345. String code = codeMap.get(i);
  346. Object o = dataMap.get(code);
  347. if (Objects.isNull(o)) {
  348. continue;
  349. }
  350. if (StringUtils.isEmpty(o)) {
  351. o=BigDecimal.ZERO;
  352. }
  353. BigDecimal amount = new BigDecimal(o.toString());
  354. String str = expressionMap.get(i);
  355. if (str.equals("+")) {
  356. totalAmount.set(totalAmount.get().add(amount));
  357. } else if(str.contains("-")){
  358. totalAmount.set(totalAmount.get().subtract(amount));
  359. } else if(str.contains("*")){
  360. totalAmount.set(totalAmount.get().multiply(amount));
  361. } else if (str.contains("/")) {
  362. if(amount.compareTo(BigDecimal.ZERO)==0){
  363. log.error("报表列【"+column.getColumnName()+"】公式除数为0,数据为【"+code+"】数据");
  364. totalAmount.set(BigDecimal.ZERO) ;
  365. break;
  366. }else {
  367. totalAmount.set(totalAmount.get().divide(amount,4, RoundingMode.HALF_UP));
  368. }
  369. }
  370. }
  371. return totalAmount.get();
  372. }
  373. private static StringBuilder setRedirectParameter(List<String> primary, CostReportRedirect redirect) {
  374. StringBuilder redirectParameter = new StringBuilder(redirect.getRedirectParameter());
  375. if(!StringUtils.isEmpty(redirectParameter.toString())){
  376. if(redirectParameter.toString().contains("|")){
  377. String[] split = StrUtil.splitToArray(redirectParameter.toString(), "|");
  378. assert split != null;
  379. List<String> strings1 = Arrays.asList(split);
  380. List<String> strings = new ArrayList<>(strings1);
  381. List<String> collect1 = strings.stream().filter(primary::contains).collect(Collectors.toList());
  382. if(!CollectionUtils.isEmpty(collect1)){
  383. primary.removeAll(collect1);
  384. if(!CollectionUtils.isEmpty(primary)){
  385. for(String s: primary){
  386. redirectParameter.append("|").append(s);
  387. }
  388. }
  389. }else {
  390. for(String s: primary){
  391. redirectParameter.append("|").append(s);
  392. }
  393. }
  394. }else {
  395. boolean contains = false;
  396. for(String s: primary){
  397. if (redirectParameter.toString().equals(s)) {
  398. contains = true;
  399. break;
  400. }
  401. }
  402. if(contains){
  403. primary.remove(redirectParameter.toString());
  404. }
  405. if(!CollectionUtils.isEmpty(primary)){
  406. for(String s: primary){
  407. redirectParameter.append("|").append(s);
  408. }
  409. }
  410. }
  411. }else {
  412. for(String s: primary){
  413. redirectParameter = new StringBuilder(s + "|");
  414. }
  415. redirectParameter.deleteCharAt(redirectParameter.length() -1);
  416. }
  417. return redirectParameter;
  418. }
  419. private static ReportTitleVo getReportTitleVo(String column, String columnName, CostReportColumn reportColumn, Map<Long, List<CostReportRedirect>> reportRedirectMap, ReportCodeModifyVo reportCodeModifyVo, Map<Long, CostColumn> map) {
  420. ReportTitleVo vo = new ReportTitleVo();
  421. vo.setCode(column);
  422. vo.setName(columnName);
  423. vo.setSort(reportColumn.getSort()+100);
  424. vo.setHide(reportColumn.getHide());
  425. vo.setFreeze(reportColumn.getFreeze());
  426. vo.setColumnName(reportColumn.getColumnName());
  427. vo.setSortStatus(reportColumn.getSortStatus());
  428. vo.setSearch(reportColumn.getSearch());
  429. CostColumn computeColumn = map.get(Long.valueOf(column));
  430. if(Objects.nonNull(computeColumn)){
  431. vo.setDataType(computeColumn.getDataType());
  432. vo.setDecimalPlace(computeColumn.getDecimalPlace());
  433. String permil = computeColumn.getPermil();
  434. if(StringUtils.isEmpty(permil)){
  435. vo.setPermil(false);
  436. }else {
  437. vo.setPermil(permil.equals(NumberConstant.ONE_S));
  438. }
  439. }
  440. List<String> primary = new ArrayList<>();
  441. if(reportCodeModifyVo.getReportCode() != null){
  442. Map<String, String> modifyReportCode = reportCodeModifyVo.getModifyReportCode();
  443. List<String> collect = new ArrayList<>();
  444. modifyReportCode.forEach((key, v) -> collect.add(v));
  445. primary.addAll(collect);
  446. }
  447. //此需求不一定符合实际情况 强制要求改动 单报表同一字段 实际运用过程过只会下钻 子类数据一张报表 不会存在多张 备注记录一下
  448. // ReportRedirect redirect = reportRedirectMap.get(column.getColumnCode());
  449. // if(Objects.nonNull(redirect)){
  450. // vo.setRedirectReportCode(redirect.getRedirectReportCode());
  451. // vo.setRedirect(true);
  452. // vo.setRedirectParameter(redirect.getRedirectParameter());
  453. // }
  454. if(!CollectionUtils.isEmpty(primary)){
  455. List<CostReportRedirect> reportRedirects = reportRedirectMap.get(reportColumn.getColumnCode());
  456. if(!CollectionUtils.isEmpty(reportRedirects)){
  457. List<RedirectData> redirectDataList = new ArrayList<>();
  458. for(CostReportRedirect redirect:reportRedirects){
  459. RedirectData redirectData = new RedirectData();
  460. redirectData.setRedirectReportCode(redirect.getRedirectReportCode());
  461. StringBuilder redirectParameter = setRedirectParameter(primary, redirect);
  462. redirectData.setRedirectParameter(redirectParameter.toString());
  463. redirectData.setRedirectReportName(redirect.getRedirectReportName());
  464. redirectDataList.add(redirectData);
  465. }
  466. vo.setRedirect(true);
  467. vo.setRedirectData(redirectDataList);
  468. }
  469. }else {
  470. List<CostReportRedirect> reportRedirects = reportRedirectMap.get(reportColumn.getColumnCode());
  471. if(!CollectionUtils.isEmpty(reportRedirects)){
  472. List<RedirectData> redirectDataList = new ArrayList<>();
  473. for(CostReportRedirect redirect:reportRedirects){
  474. RedirectData redirectData = new RedirectData();
  475. redirectData.setRedirectReportCode(redirect.getRedirectReportCode());
  476. redirectData.setRedirectParameter(redirect.getRedirectParameter());
  477. redirectData.setRedirectReportName(redirect.getRedirectReportName());
  478. redirectDataList.add(redirectData);
  479. }
  480. vo.setRedirect(true);
  481. vo.setRedirectData(redirectDataList);
  482. }
  483. }
  484. return vo;
  485. }
  486. private String MatchParameter(String sql, Map<String, Object> keyParameter, Map<String, String> parameter) {
  487. if(StringUtils.isEmpty(sql)){
  488. throw new CostException("无效自定义sql语句");
  489. }
  490. //替换主键
  491. if(!CollectionUtils.isEmpty(keyParameter)){
  492. for (String s : keyParameter.keySet()) {
  493. String key = "#" + s;
  494. if (sql.contains(key)) {
  495. sql = sql.replace(key, keyParameter.get(s).toString());
  496. }
  497. }
  498. }
  499. sql = MatchSystemParameter(sql);
  500. //替换传参
  501. if(!CollectionUtils.isEmpty(parameter)){
  502. for(String s:parameter.keySet()){
  503. //拼接 #
  504. String sqlFilter = "#" + s;
  505. if (sql.contains(sqlFilter)) {
  506. sql = sql.replace(sqlFilter, parameter.get(s));
  507. }
  508. }
  509. }
  510. if(sql.contains("#")){
  511. log.error("sql 所需条件未全部传递,请确认后再进行查询"+sql);
  512. throw new CostException("sql 所需条件未全部传递,请确认后再进行查询");
  513. }
  514. return sql;
  515. }
  516. private String MatchParameter(String sql,String keyCode,String keyValue,Map<String,String> parameter) {
  517. if(StringUtils.isEmpty(sql)){
  518. throw new CostException("无效自定义sql语句");
  519. }
  520. //替换主键
  521. String key = "#" + keyCode;
  522. if (sql.contains(key)) {
  523. sql = sql.replace(key, keyValue);
  524. }
  525. sql = MatchSystemParameter(sql);
  526. //替换传参
  527. if(!CollectionUtils.isEmpty(parameter)){
  528. for(String s:parameter.keySet()){
  529. //拼接 #
  530. String sqlFilter = "#" + s;
  531. if (sql.contains(sqlFilter)) {
  532. sql = sql.replace(sqlFilter, parameter.get(s));
  533. }
  534. }
  535. }
  536. if(sql.contains("#")){
  537. log.error("sql 所需条件未全部传递,请确认后再进行查询");
  538. throw new ClassCastException("sql 所需条件未全部传递,请确认后再进行查询");
  539. }
  540. return sql;
  541. }
  542. private String MatchParameter(String sql,Map<String,String> parameter) {
  543. if(StringUtils.isEmpty(sql)){
  544. throw new CostException("无效自定义sql语句");
  545. }
  546. sql = MatchSystemParameter(sql);
  547. //替换传参
  548. if(!CollectionUtils.isEmpty(parameter)){
  549. for(String s:parameter.keySet()){
  550. //拼接 #
  551. String sqlFilter = "#" + s;
  552. if (sql.contains(sqlFilter)) {
  553. sql = sql.replace(sqlFilter, parameter.get(s));
  554. }
  555. }
  556. }
  557. if(sql.contains("#")){
  558. log.error("sql 所需条件未全部传递,请确认后再进行查询"+sql);
  559. throw new CostException("sql 所需条件未全部传递,请确认后再进行查询");
  560. }
  561. return sql;
  562. }
  563. private Object sqlRunner(String sql) {
  564. // List<Object> objects = SqlUtil.getresult(sql, Object.class);
  565. log.info("sqlRunner执行"+sql);
  566. Object objects = SqlRunner.db().selectObj(sql, Object.class);
  567. if(Objects.nonNull(objects)){
  568. Class<?> aClass = objects.getClass();
  569. if(objects instanceof Integer || objects instanceof Long || objects instanceof Double || objects instanceof Float){
  570. return Double.parseDouble(objects.toString());
  571. } else if (objects instanceof BigDecimal) {
  572. return objects;
  573. }else {
  574. return objects.toString();
  575. }
  576. }else{
  577. return "";
  578. }
  579. }
  580. private List<Map<String, Object>> sqlRunnerList(String sql) {
  581. return SqlRunner.db().selectList(sql, String.class);
  582. }
  583. private static String MatchSystemParameter(String sql) {
  584. if(StringUtils.isEmpty(sql)){
  585. throw new CostException("无效自定义sql语句");
  586. }
  587. if (sql.contains(SQLParameter.HOSP_ID_CODE)) {
  588. sql = sql.replace(SQLParameter.HOSP_ID_CODE, String.valueOf(UserContext.getCurrentLoginHospId()));
  589. }
  590. if (sql.contains(SQLParameter.USER_CODE)) {
  591. sql = sql.replace(SQLParameter.USER_CODE, String.valueOf(UserContext.getCurrentUser().getId()));
  592. }
  593. return sql;
  594. }
  595. }