IndexController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package com.jjt.biz.controller;
  2. import com.jjt.biz.domain.*;
  3. import com.jjt.biz.service.*;
  4. import com.jjt.biz.util.DataUtil;
  5. import com.jjt.biz.vo.BizTypeVO;
  6. import com.jjt.biz.vo.HlScoreVO;
  7. import com.jjt.check.domain.CheckRecord;
  8. import com.jjt.check.service.ICheckRecordService;
  9. import com.jjt.common.core.controller.BaseController;
  10. import com.jjt.common.core.domain.AjaxResult;
  11. import com.jjt.common.core.page.TableDataInfo;
  12. import com.jjt.common.utils.DateUtils;
  13. import com.jjt.hl.domain.HlScore;
  14. import com.jjt.hl.service.IHlScoreService;
  15. import io.swagger.annotations.Api;
  16. import io.swagger.annotations.ApiOperation;
  17. import io.swagger.annotations.ApiParam;
  18. import org.springframework.jdbc.core.JdbcTemplate;
  19. import org.springframework.web.bind.annotation.GetMapping;
  20. import org.springframework.web.bind.annotation.PathVariable;
  21. import org.springframework.web.bind.annotation.RequestMapping;
  22. import org.springframework.web.bind.annotation.RestController;
  23. import javax.annotation.Resource;
  24. import java.math.BigDecimal;
  25. import java.math.RoundingMode;
  26. import java.text.DecimalFormat;
  27. import java.time.LocalDate;
  28. import java.time.LocalDateTime;
  29. import java.time.LocalTime;
  30. import java.time.ZoneId;
  31. import java.time.format.DateTimeFormatter;
  32. import java.time.temporal.TemporalAdjusters;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. /**
  36. * 业务对象Controller
  37. *
  38. * @author jjt
  39. * @date 2024-08-09
  40. */
  41. @Api(tags = "首页")
  42. @RestController
  43. @RequestMapping("/index")
  44. public class IndexController extends BaseController {
  45. @Resource
  46. private IIndexMetricsService imService;
  47. @Resource
  48. private IBizObjMetricsService omService;
  49. @Resource
  50. private IHlScoreService scoreService;
  51. @Resource
  52. private IBizModelService bizModelService;
  53. @Resource
  54. private IBizObjMetricsDataService dataService;
  55. @Resource
  56. private IAlarmRecordService alarmRecordService;
  57. @Resource
  58. private JdbcTemplate jdbcTemplate;
  59. @Resource
  60. private ICheckRecordService crService;
  61. String[] MODEL_NAMES = {"市场服务", "市场出清", "信息发布", "市场合规", "市场结算"};
  62. @ApiOperation("巡检提示")
  63. @GetMapping("/hl/check")
  64. public AjaxResult hlCheck() {
  65. CheckRecord cr = crService.selectCheckRecordByCrId(0L);
  66. Map<String, Object> result = new HashMap<>(16);
  67. result.put("time", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,cr.getCheckTime()));
  68. result.put("result", cr.getCheckResult());
  69. // result.put("model", 5);
  70. // result.put("metrics", new Random().nextInt(200));
  71. // result.put("problem", new Random().nextInt(80));
  72. return AjaxResult.success(result);
  73. }
  74. @ApiOperation("当前健康度")
  75. @GetMapping("/hl/curr")
  76. public AjaxResult hlCurr() {
  77. List<HlScoreVO> list = scoreService.selectHlScoreListLast();
  78. list = list.stream().collect(Collectors.toList());
  79. // List<Map<String, Object>> result = new ArrayList<>();
  80. // for (int i = 0; i < MODEL_NAMES.length; i++) {
  81. // Map<String, Object> map = new HashMap<>(16);
  82. // map.put("name", MODEL_NAMES[i]);
  83. // Float score = Float.valueOf(new Random().nextInt(50) + 50);
  84. // map.put("score", score);
  85. // result.add(map);
  86. // }
  87. return AjaxResult.success(list);
  88. }
  89. @ApiOperation("应用健康趋势-按月")
  90. @GetMapping("/hl/month/{date}")
  91. public AjaxResult hlMonth(@ApiParam(value = "时间 yyyy-mm", required = true) @PathVariable("date") Date date) {
  92. List<Map<String, Object>> result = new ArrayList<>();
  93. HlScore search = new HlScore();
  94. search.setHlType("2");
  95. LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
  96. Map<String, Object> params = new HashMap<>(16);
  97. params.put("beginTime", localDate.with(TemporalAdjusters.firstDayOfMonth()) + " 00:00:00");
  98. params.put("endTime", localDate.with(TemporalAdjusters.lastDayOfMonth()) + " 23:59:59");
  99. search.setParams(params);
  100. List<HlScore> list = scoreService.selectHlScoreList(search);
  101. Map<Long, List<HlScore>> resultMap = list.stream().collect(Collectors.groupingBy(HlScore::getModelId));
  102. int len = 0;
  103. List<String> standTime = new ArrayList<>();
  104. for (Long modelId : resultMap.keySet()) {
  105. Map<String, Object> map = new HashMap<>(16);
  106. BizModel model = bizModelService.selectBizModelByModelId(modelId);
  107. map.put("name", model.getModelName());
  108. List<String> times = new ArrayList<>();
  109. List<Float> scores = new ArrayList<>();
  110. List<HlScore> scoreList = resultMap.get(modelId);
  111. scoreList = scoreList.stream().sorted(Comparator.comparing(HlScore::getHlDate)).collect(Collectors.toList());
  112. scoreList.forEach(hs -> {
  113. times.add(DateUtils.parseDateToStr("dd", hs.getHlDate()));
  114. if (hs.getHlScore() != null) {
  115. scores.add(hs.getHlScore().floatValue());
  116. } else {
  117. scores.add(100f);
  118. }
  119. });
  120. if (scoreList.size() > len) {
  121. len = scoreList.size();
  122. standTime = times;
  123. }
  124. map.put("time", times);
  125. map.put("score", scores);
  126. result.add(map);
  127. }
  128. DataUtil.standTimeMap(standTime, result);
  129. return success(result);
  130. }
  131. @ApiOperation("应用健康趋势-按年")
  132. @GetMapping("/hl/year/{date}")
  133. public AjaxResult hlYear(@ApiParam(value = "时间 yyyy", required = true) @PathVariable("date") String date) {
  134. List<Map<String, Object>> result = new ArrayList<>();
  135. String sql = "SELECT a.model_name,b.hy,b.hm,b.score from biz_model a,(SELECT model_id,year(hl_date) hy,month(hl_date) hm,AVG(ifnull(hl_score,100)) score" +
  136. " FROM hl_score t WHERE hl_type=2 AND year(hl_date)=? GROUP BY model_id,hy,hm) b WHERE a.model_id=b.model_id order by hm";
  137. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, date);
  138. Map<String, List<Map<String, Object>>> resultMap = list.stream().collect(Collectors.groupingBy(map -> (String) map.get("model_name")));
  139. int len = 0;
  140. List<String> standTime = new ArrayList<>();
  141. for (String name : resultMap.keySet()) {
  142. Map<String, Object> map = new HashMap<>(16);
  143. map.put("name", name);
  144. List<String> times = new ArrayList<>();
  145. List<Float> scores = new ArrayList<>();
  146. List<Map<String, Object>> detailList = resultMap.get(name);
  147. detailList.forEach(m -> {
  148. Integer hm = (Integer) m.get("hm");
  149. BigDecimal score = (BigDecimal) m.get("score");
  150. score = score.setScale(2, RoundingMode.HALF_UP);
  151. times.add(hm + "");
  152. scores.add(score.floatValue());
  153. });
  154. if (detailList.size() > len) {
  155. len = detailList.size();
  156. standTime = times;
  157. }
  158. map.put("time", times);
  159. map.put("score", scores);
  160. result.add(map);
  161. }
  162. DataUtil.standTimeMap(standTime, result);
  163. return success(result);
  164. }
  165. @ApiOperation("应用健康趋势-按天")
  166. @GetMapping("/hl/day/{date}")
  167. public AjaxResult hlDay(@ApiParam(value = "时间(yyyy-mm-dd", required = true) @PathVariable("date") Date date) {
  168. List<Map<String, Object>> result = new ArrayList<>();
  169. HlScore search = new HlScore();
  170. search.setHlType("1");
  171. Map<String, Object> params = new HashMap<>(16);
  172. params.put("beginTime", DateUtils.parseDateToStr("yyyy-MM-dd", date) + " 00:00:00");
  173. params.put("endTime", DateUtils.parseDateToStr("yyyy-MM-dd", date) + " 23:59:59");
  174. search.setParams(params);
  175. int len = 0;
  176. List<String> standTime = new ArrayList<>();
  177. List<HlScore> list = scoreService.selectHlScoreList(search);
  178. Map<Long, List<HlScore>> resultMap = list.stream().collect(Collectors.groupingBy(HlScore::getModelId));
  179. for (Long modelId : resultMap.keySet()) {
  180. Map<String, Object> map = new HashMap<>(16);
  181. BizModel model = bizModelService.selectBizModelByModelId(modelId);
  182. map.put("name", model.getModelName());
  183. List<String> times = new ArrayList<>();
  184. List<Float> scores = new ArrayList<>();
  185. List<HlScore> scoreList = resultMap.get(modelId);
  186. scoreList = scoreList.stream().sorted(Comparator.comparing(HlScore::getHlDate)).collect(Collectors.toList());
  187. scoreList.forEach(hs -> {
  188. times.add(DateUtils.parseDateToStr("HH:mm", hs.getHlDate()));
  189. if (hs.getHlScore() != null) {
  190. scores.add(hs.getHlScore().floatValue());
  191. } else {
  192. scores.add(100f);
  193. }
  194. });
  195. if (scoreList.size() > len) {
  196. len = scoreList.size();
  197. standTime = times;
  198. }
  199. map.put("time", times);
  200. map.put("score", scores);
  201. result.add(map);
  202. }
  203. DataUtil.standTimeMap(standTime, result);
  204. return success(result);
  205. }
  206. @ApiOperation("运行风险预测结果")
  207. @GetMapping("/risk")
  208. public AjaxResult risk() {
  209. String sql = "SELECT b.metrics_name metricsName,c.obj_name objName,'2' status" +
  210. " FROM (SELECT a.obj_id FROM risk_analysis a,risk_model b WHERE a.ANALYSE_TIME = (SELECT MAX(ANALYSE_TIME) FROM risk_analysis) AND a.risk_id=b.risk_id AND b.risk_type!='3' AND result LIKE '%恶化%') a," +
  211. "biz_obj_metrics b,biz_obj c" +
  212. " where a.obj_id = b.obj_metrics_id AND b.obj_id=c.obj_id";
  213. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  214. Map<String, Object> result = new HashMap<>();
  215. result.put("num", list.size());
  216. result.put("data", list);
  217. // List<Map<String, Object>> resul = new ArrayList<>();
  218. // String[] objs = {"出清node1", "出清ecs", "业务应用3", "业务应用4", "业务应用5", "业务应用6", "业务应用7"};
  219. // String[] ms = {"cpu使用率", "慢访问次数", "GC次数", "空间交换", "打开文件数", "交换分区访问"};
  220. // Random random = new Random();
  221. // int x = objs.length * ms.length;
  222. // int xx = x / 2;
  223. // int max = random.nextInt(xx) + 12;
  224. // int num = 0;
  225. // for (int i = 0; i < max; i++) {
  226. // boolean flag = random.nextInt(888) % 2 == 0;
  227. // int mi = random.nextInt(ms.length - 1);
  228. // Map<String, Object> map = new HashMap<>(16);
  229. // String objName = objs[i % 6];
  230. // String metricsName = ms[mi];
  231. // map.put("objName", objName);
  232. // map.put("metricsName", metricsName);
  233. // String status = "1";
  234. //// if (flag) {
  235. // //风险
  236. // num++;
  237. // status = "2";
  238. //// }
  239. // map.put("status", status);
  240. // resul.add(map);
  241. // }
  242. //
  243. // result.put("num", num);
  244. // result.put("data", resul);
  245. return success(result);
  246. }
  247. @ApiOperation("业务访问报错排名")
  248. @GetMapping("/biz/access")
  249. public AjaxResult access() {
  250. List<Map<String, Object>> result = new ArrayList<>();
  251. LocalDateTime endTime = LocalDateTime.now();
  252. LocalDateTime beginTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
  253. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  254. String start = df.format(LocalDateTime.of(beginTime.toLocalDate(), LocalTime.MIN));
  255. String end = df.format(LocalDateTime.of(endTime.toLocalDate(), LocalTime.MAX));
  256. String sql = "SELECT bmdetail.model_id,subq.metrics_code,IFNULL(SUM(bmd.D_VALUE), 0) AS total_value " +
  257. "FROM biz_obj_metrics_data bmd " +
  258. "JOIN (" +
  259. " SELECT bom.obj_metrics_id, bom.obj_id,md.metrics_code" +
  260. " FROM biz_obj_metrics bom" +
  261. " JOIN metrics_def md ON bom.metrics_id = md.metrics_id" +
  262. " WHERE bom.metrics_name LIKE 'SPRING_BOOT/%' AND (md.metrics_code = 'pp.error' OR md.metrics_code='pp.tot')" +
  263. ") subq ON bmd.obj_metrics_id = subq.obj_metrics_id" +
  264. " JOIN biz_model_detail bmdetail ON subq.obj_id = bmdetail.obj_id" +
  265. " WHERE bmd.CREATE_TIME BETWEEN ? AND ?" +
  266. " GROUP BY bmdetail.model_id,subq.metrics_code";
  267. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, start, end);
  268. Map<Integer, List<Map<String, Object>>> resultMap = list.stream().collect(Collectors.groupingBy(mp -> (Integer) mp.get("model_id")));
  269. List<BizModel> modelList = bizModelService.selectBizModelList(new BizModel());
  270. for (BizModel model : modelList) {
  271. Map<String, Object> map = new HashMap<>(16);
  272. map.put("name", model.getModelName());
  273. List<Map<String, Object>> vList = resultMap.get(model.getModelId().intValue());
  274. if (vList != null) {
  275. for (Map<String, Object> objectMap : vList) {
  276. String code = (String) objectMap.get("metrics_code");
  277. BigDecimal value = (BigDecimal) objectMap.get("total_value");
  278. if ("pp.error".equals(code)) {
  279. map.put("error", value);
  280. }
  281. if ("pp.tot".equals(code)) {
  282. map.put("total", value);
  283. }
  284. }
  285. } else {
  286. map.put("error", 0);
  287. map.put("total", 0);
  288. }
  289. result.add(map);
  290. }
  291. return success(result);
  292. }
  293. @ApiOperation("组件告警数排名")
  294. @GetMapping("/obj/alarm")
  295. public AjaxResult alarm() {
  296. Map<String, Object> result = new HashMap<>();
  297. LocalDateTime endTime = LocalDateTime.now();
  298. LocalDateTime beginTime = endTime.minusDays(7);
  299. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  300. String start = df.format(LocalDateTime.of(beginTime.toLocalDate(), LocalTime.MIN));
  301. String end = df.format(LocalDateTime.of(endTime.toLocalDate(), LocalTime.MAX));
  302. List<BizTypeVO> list = alarmRecordService.listBizObj(null, start, end);
  303. list = list.stream().sorted(Comparator.comparing(BizTypeVO::getNum).reversed()).collect(Collectors.toList());
  304. AlarmRecord q = new AlarmRecord();
  305. q.setAlarmType("1");
  306. List<AlarmRecord> al = alarmRecordService.selectAlarmRecordList(q);
  307. result.put("curr", al.size());
  308. result.put("data", list);
  309. return success(result);
  310. }
  311. @ApiOperation("指标配置列表")
  312. @GetMapping("/ms/config/list")
  313. public AjaxResult configList() {
  314. List<IndexMetrics> list = imService.selectIndexMetricsList(new IndexMetrics());
  315. return AjaxResult.success(list);
  316. }
  317. @ApiOperation("重点指标运行趋势列表")
  318. @GetMapping("/ms/trend")
  319. public AjaxResult msList() {
  320. List<IndexMetrics> list = imService.selectIndexMetricsList(new IndexMetrics());
  321. list.forEach(im -> {
  322. Random r = new Random();
  323. DecimalFormat df = new DecimalFormat("#0.00");
  324. im.setValue(Float.parseFloat(df.format(r.nextFloat() * 100)));
  325. });
  326. return AjaxResult.success(list);
  327. }
  328. @ApiOperation("重点指标运行趋势图")
  329. @GetMapping("/ms/trend/{objMetricsId}")
  330. public AjaxResult msChat(@PathVariable("objMetricsId") Long objMetricsId) {
  331. List<Map<String, Object>> trendList = new ArrayList<>();
  332. LocalDateTime endTime = LocalDateTime.now();
  333. LocalDateTime beginTime = endTime.minusDays(7);
  334. Map<String, Object> params = new HashMap<>(16);
  335. params.put("beginTime", beginTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  336. params.put("endTime", endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  337. BizObjMetricsData q = new BizObjMetricsData();
  338. q.setObjMetricsId(objMetricsId);
  339. q.setParams(params);
  340. List<BizObjMetricsData> list = dataService.selectBizObjMetricsDataList(q);
  341. list.forEach(data -> {
  342. Map<String, Object> map = new HashMap<>(16);
  343. map.put("time", data.getCreateTime());
  344. map.put("value", data.getdValue().floatValue());
  345. trendList.add(map);
  346. });
  347. // LocalDateTime ed = LocalDateTime.now();
  348. // LocalDateTime st = ed.minusDays(8);
  349. // Random r = new Random();
  350. // DecimalFormat df = new DecimalFormat("#0.00");
  351. // do {
  352. // Map<String, Object> map = new HashMap<>(16);
  353. // long time = st.toEpochSecond(ZoneOffset.ofHours(8)) * 1000;
  354. // map.put("time", time);
  355. // float f = r.nextFloat() * 100;
  356. // map.put("value", Float.parseFloat(df.format(f)));
  357. // st = st.plusDays(1);
  358. // trendList.add(map);
  359. // } while (!st.isAfter(ed));
  360. return AjaxResult.success(trendList);
  361. }
  362. @ApiOperation("指标配置--选择指标列表")
  363. @GetMapping("/ms/config/select")
  364. public TableDataInfo list(BizObjMetrics bizObjMetrics) {
  365. startPage();
  366. List<BizObjMetrics> list = omService.selectBizObjMetricsList(bizObjMetrics);
  367. return getDataTable(list);
  368. }
  369. @ApiOperation("指标配置--添加指标")
  370. @GetMapping("/ms/config/add")
  371. public AjaxResult selectAdd(@ApiParam(value = "指标ID数组", required = true) Long[] ids) {
  372. for (int i = 0; i < ids.length; i++) {
  373. Long id = ids[i];
  374. IndexMetrics im = new IndexMetrics();
  375. im.setObjMetricsId(id);
  376. List list = imService.selectIndexMetricsList(im);
  377. if (list.size() == 0) {
  378. BizObjMetrics bom = omService.selectBizObjMetricsByObjMetricsId(id);
  379. im.setObjId(bom.getObjId());
  380. im.setObjName(bom.getObjName());
  381. im.setMetricsId(bom.getMetricsId());
  382. im.setMetricsName(bom.getMetricsName());
  383. imService.insertIndexMetrics(im);
  384. }
  385. }
  386. return AjaxResult.success();
  387. }
  388. @ApiOperation("指标配置--删除指标")
  389. @GetMapping("/ms/config/del/{imIds}")
  390. public AjaxResult configDel(@ApiParam(value = "指标imId", required = true) @PathVariable Long[] imIds) {
  391. return AjaxResult.success(imService.deleteIndexMetricsByImIds(imIds));
  392. }
  393. }