IndexController.java 18 KB

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