AlarmMsgServiceImpl.java 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564
  1. package com.zhili.dashboard.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  10. import com.zhili.dashboard.base.*;
  11. import com.zhili.dashboard.entity.*;
  12. import com.zhili.dashboard.enums.*;
  13. import com.zhili.dashboard.mapper.*;
  14. import com.zhili.dashboard.req.MapParam;
  15. import com.zhili.dashboard.req.ProvinceParam;
  16. import com.zhili.dashboard.req.RadarParam;
  17. import com.zhili.dashboard.req.TableInfoParam;
  18. import com.zhili.dashboard.utils.OkHttpCli;
  19. import com.zhili.dashboard.utils.StringUtils;
  20. import com.zhili.dashboard.vo.*;
  21. import com.zhili.dashboard.service.IAlarmMsgService;
  22. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  23. import com.zhili.dashboard.utils.DateUtil;
  24. import com.zhili.dashboard.utils.LineTimeChartVo;
  25. import org.springframework.beans.BeanUtils;
  26. import org.springframework.beans.factory.annotation.Value;
  27. import org.springframework.scheduling.annotation.Async;
  28. import org.springframework.scheduling.annotation.AsyncResult;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import org.springframework.util.CollectionUtils;
  32. import javax.annotation.Resource;
  33. import java.math.BigDecimal;
  34. import java.math.RoundingMode;
  35. import java.text.SimpleDateFormat;
  36. import java.time.LocalDateTime;
  37. import java.time.ZoneId;
  38. import java.util.*;
  39. import java.util.concurrent.Future;
  40. import java.util.concurrent.atomic.AtomicBoolean;
  41. import java.util.stream.Collectors;
  42. /**
  43. * <p>
  44. * 云控信息表 服务实现类
  45. * </p>
  46. *
  47. * @author zyg
  48. * @since 2022-07-05
  49. */
  50. @Service
  51. public class AlarmMsgServiceImpl extends ServiceImpl<AlarmMsgMapper, AlarmMsg> implements IAlarmMsgService {
  52. @Resource
  53. OkHttpCli okHttpCli;
  54. @Resource
  55. AlarmMsgMapper alarmMsgMapper;
  56. @Resource
  57. DeviceMapper deviceMapper;
  58. @Resource
  59. DistributionMapMapper distributionMapMapper;
  60. @Resource
  61. DeviceDurationMapper deviceDurationMapper;
  62. @Resource
  63. ModelMapper modelMapper;
  64. @Resource
  65. FaultMonthRateMapper faultMonthRateMapper;
  66. @Resource
  67. AlarmMsgWarnMapper alarmMsgWarnMapper;
  68. @Resource
  69. CmdDetailMapper cmdDetailMapper;
  70. /**
  71. * 数据获取地址
  72. */
  73. private static final String BATTERY_URL = "/admin/v1/hzBattery";
  74. /**
  75. * 故障信息地址
  76. */
  77. private static final String SIGNATURE = "AD5C4EC001352FFAC3A03CBA787A7417";
  78. @Value("${openapi.token-secret}")
  79. private String tokenSecret;
  80. @Value("${openapi.url}")
  81. private String openApiUrl;
  82. private final String[] hours = {"0", "1", "2", "3", "4", "5", "6", "7",
  83. "8", "9", "10", "11", "12", "13", "14", "15", "16",
  84. "17", "18", "19", "20", "21", "22", "23"};
  85. /**
  86. * 故障级别饼图
  87. *
  88. * @param type 参数
  89. * @return java.util.List<com.zhili.dashboard.base.BaseCycleChartVo>
  90. */
  91. @Override
  92. public List<BaseCycleChartVo> getAlarmLevelPie(Integer type) {
  93. List<BaseCycleChartVo> voList = new ArrayList<>();
  94. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
  95. String dateStr = sdf.format(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
  96. switch (type) {
  97. case 2:
  98. dateStr = DateUtil.getPreviousWeekSunday() + " 23:59:59";
  99. break;
  100. case 3:
  101. dateStr = DateUtil.getLastMaxMonthDate() + " 23:59:59";
  102. break;
  103. default:
  104. }
  105. List<AlarmMsg> alarmMsgList = alarmMsgMapper.getAlarmLevelPie(dateStr);
  106. long total = alarmMsgList.stream().mapToLong(AlarmMsg::getQuantity).sum();
  107. //计算比例
  108. AlarmLevelEnum[] enums = AlarmLevelEnum.values();
  109. for (AlarmLevelEnum en : enums) {
  110. BaseCycleChartVo v = new BaseCycleChartVo();
  111. v.setName(en.message());
  112. v.setLevelIcon("l" + en.code() + "ico");
  113. v.setCount(0L);
  114. for (AlarmMsg o : alarmMsgList) {
  115. if (en.code().equals(o.getFaultLevel())) {
  116. v.setCount(o.getQuantity());
  117. break;
  118. }
  119. }
  120. if (total == 0) {
  121. v.setPercent(BigDecimal.ZERO);
  122. } else {
  123. v.setPercent(BigDecimal.valueOf(v.getCount() * 100).divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP));
  124. }
  125. voList.add(v);
  126. }
  127. return voList;
  128. }
  129. /**
  130. * 故障预警历史信息-24小时
  131. *
  132. * @return com.zhili.dashboard.base.BaseIntegerLineChartVo
  133. */
  134. @Override
  135. public BaseLineDecimalVo getAlarmHistoryLineForDay() {
  136. BaseLineDecimalVo vo = new BaseLineDecimalVo();
  137. //横轴数据填充
  138. List<String> timeAxisList = Arrays.asList(hours);
  139. vo.setTimeAxis(timeAxisList);
  140. //曲线图数据填充
  141. List<KindValueDoubleListVo> kindList = new ArrayList<>();
  142. //数据查询
  143. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  144. long currentTime = System.currentTimeMillis();
  145. //按照小时进行统计
  146. KindValueDoubleListVo v = new KindValueDoubleListVo();
  147. v.setName("24小时故障预警历史信息");
  148. List<BigDecimal> valueList = new ArrayList<>();
  149. timeAxisList.forEach(m -> {
  150. valueList.add(BigDecimal.ZERO);
  151. });
  152. v.setValue(valueList);
  153. kindList.add(v);
  154. KindValueDoubleListVo v1 = new KindValueDoubleListVo();
  155. v1.setName("24小时故障完结率");
  156. List<BigDecimal> valueList1 = new ArrayList<>();
  157. timeAxisList.forEach(m -> {
  158. valueList1.add(BigDecimal.ZERO);
  159. });
  160. v1.setValue(valueList1);
  161. kindList.add(v1);
  162. List<Map<String, Object>> mapList = alarmMsgMapper.getAlarmHistoryDay(sdf.format(currentTime - 24 * 60 * 60 * 1000));
  163. if (mapList.size() > 0) {
  164. List<LineChartVo> lineChartVoList = JSONArray.parseArray(JSON.toJSONString(mapList), LineChartVo.class);
  165. for (int i = 0; i < timeAxisList.size(); i++) {
  166. if (lineChartVoList.size() > 0) {
  167. int finalI = i;
  168. lineChartVoList.forEach(o -> {
  169. if (o.getNum().equals(finalI)) {
  170. List<BigDecimal> tempList = new ArrayList<>(kindList.get(0).getValue());
  171. tempList.set(finalI, BigDecimal.valueOf(o.getQuantity()));
  172. kindList.get(0).setValue(tempList);
  173. }
  174. });
  175. }
  176. }
  177. }
  178. //故障完结率
  179. List<Map<String, Object>> mapList1 = alarmMsgMapper.getAlarmHistoryDayOverRate(sdf.format(currentTime - 24 * 60 * 60 * 1000));
  180. if (mapList1.size() > 0) {
  181. List<LineChartVo> lineChartVoList = JSONArray.parseArray(JSON.toJSONString(mapList1), LineChartVo.class);
  182. for (int i = 0; i < timeAxisList.size(); i++) {
  183. if (lineChartVoList.size() > 0) {
  184. int finalI = i;
  185. lineChartVoList.forEach(o -> {
  186. if (o.getNum().equals(finalI)) {
  187. List<BigDecimal> tempList = new ArrayList<>(kindList.get(1).getValue());
  188. BigDecimal rate = kindList.get(0).getValue().get(finalI).compareTo(BigDecimal.ZERO) > 0
  189. ? BigDecimal.valueOf(o.getQuantity() * 100).divide(kindList.get(0).getValue().get(finalI), 2, RoundingMode.HALF_UP)
  190. : BigDecimal.ZERO;
  191. tempList.set(finalI, rate);
  192. kindList.get(1).setValue(tempList);
  193. }
  194. });
  195. }
  196. }
  197. }
  198. vo.setKindList(kindList);
  199. return vo;
  200. }
  201. /**
  202. * 故障预警历史信息-30天
  203. *
  204. * @return com.zhili.dashboard.base.BaseLineDecimalVo
  205. */
  206. @Override
  207. public BaseLineDecimalVo getAlarmHistoryLineForMonth() {
  208. BaseLineDecimalVo vo = new BaseLineDecimalVo();
  209. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
  210. Date endTime = new Date();
  211. Date startTime = new Date(endTime.getTime() - 29L * 24 * 60 * 60 * 1000);
  212. //横轴数据填充
  213. List<String> timeAxisList = splitDateList(startTime, endTime);
  214. vo.setTimeAxis(timeAxisList);
  215. //曲线图数据填充
  216. List<KindValueDoubleListVo> kindList = new ArrayList<>();
  217. //按照小时进行统计
  218. KindValueDoubleListVo v = new KindValueDoubleListVo();
  219. v.setName("30天故障预警历史信息");
  220. List<BigDecimal> valueList = new ArrayList<>();
  221. timeAxisList.forEach(m -> {
  222. valueList.add(BigDecimal.ZERO);
  223. });
  224. v.setValue(valueList);
  225. kindList.add(v);
  226. KindValueDoubleListVo v1 = new KindValueDoubleListVo();
  227. v1.setName("30天故障完结率");
  228. List<BigDecimal> valueList1 = new ArrayList<>();
  229. timeAxisList.forEach(m -> {
  230. valueList1.add(BigDecimal.ZERO);
  231. });
  232. v1.setValue(valueList1);
  233. kindList.add(v1);
  234. //数据查询
  235. List<Map<String, Object>> mapList = alarmMsgMapper.getAlarmHistoryMonth(sdf.format(startTime));
  236. if (mapList.size() > 0) {
  237. List<LineTimeChartVo> lineChartVoList = JSONArray.parseArray(JSON.toJSONString(mapList), LineTimeChartVo.class);
  238. for (int i = 0; i < timeAxisList.size(); i++) {
  239. if (lineChartVoList.size() > 0) {
  240. for (LineTimeChartVo o : lineChartVoList) {
  241. if (o.getItem().equals(timeAxisList.get(i))) {
  242. List<BigDecimal> tempList = new ArrayList<>(kindList.get(0).getValue());
  243. tempList.set(i, BigDecimal.valueOf(o.getQuantity()));
  244. kindList.get(0).setValue(tempList);
  245. break;
  246. }
  247. }
  248. }
  249. }
  250. }
  251. //故障完结率
  252. List<Map<String, Object>> mapList1 = alarmMsgMapper.getAlarmHistoryOveMonthRate(sdf.format(startTime));
  253. if (mapList1.size() > 0) {
  254. List<LineTimeChartVo> lineChartVoList = JSONArray.parseArray(JSON.toJSONString(mapList1), LineTimeChartVo.class);
  255. for (int i = 0; i < timeAxisList.size(); i++) {
  256. if (lineChartVoList.size() > 0) {
  257. for (LineTimeChartVo o : lineChartVoList) {
  258. if (o.getItem().equals(timeAxisList.get(i))) {
  259. List<BigDecimal> tempList = new ArrayList<>(kindList.get(1).getValue());
  260. BigDecimal rate = kindList.get(0).getValue().get(i).compareTo(BigDecimal.ZERO) > 0
  261. ? BigDecimal.valueOf(o.getQuantity() * 100).divide(kindList.get(0).getValue().get(i), 2, RoundingMode.HALF_UP)
  262. : BigDecimal.ZERO;
  263. tempList.set(i, rate);
  264. kindList.get(1).setValue(tempList);
  265. break;
  266. }
  267. }
  268. }
  269. }
  270. }
  271. for (int i = 0; i < kindList.get(0).getValue().size(); i++) {
  272. List<BigDecimal> tempList = new ArrayList<>(kindList.get(0).getValue());
  273. tempList.set(i, kindList.get(0).getValue().get(i).divide(BigDecimal.valueOf(1000), 0, RoundingMode.HALF_UP));
  274. kindList.get(0).setValue(tempList);
  275. }
  276. vo.setKindList(kindList);
  277. return vo;
  278. }
  279. /**
  280. * 获取两个日期之间的所有日期集合
  281. *
  282. * @param startDate 开始日期
  283. * @param endDate 截止日期
  284. * @return java.util.List<java.lang.String>
  285. */
  286. private static List<String> splitDateList(Date startDate, Date endDate) {
  287. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  288. List<String> listDate = new ArrayList<>();
  289. try {
  290. Calendar calendar = Calendar.getInstance();
  291. calendar.setTime(startDate);
  292. while (calendar.getTime().before(endDate) || calendar.getTime().equals(endDate)) {
  293. listDate.add(df.format(calendar.getTime()));
  294. calendar.add(Calendar.DAY_OF_MONTH, 1);
  295. }
  296. return listDate;
  297. } catch (Exception e) {
  298. e.printStackTrace();
  299. }
  300. return listDate;
  301. }
  302. /**
  303. * 高危用户列表
  304. *
  305. * @return List<HighRiskVo>
  306. */
  307. @Override
  308. public List<HighRiskVo> getHighRisk() {
  309. List<HighRiskVo> voList = new ArrayList<>();
  310. //数据查询
  311. List<Map<String, Object>> mapList = alarmMsgWarnMapper.getHighRisk();
  312. if (!CollectionUtils.isEmpty(mapList)) {
  313. voList = JSONArray.parseArray(JSON.toJSONString(mapList), HighRiskVo.class);
  314. voList.forEach(o -> {
  315. o.setSceneText(o.getScene() == null ? "未定义设备" : SceneEnum.getDesc(o.getScene()));
  316. o.setSimpleSn(o.getSn().substring(7));
  317. o.setBatteryCoreTypeText(o.getBatteryCoreType() == null ? "" : AlarmCoreTypeEnum.getDesc(o.getBatteryCoreType()));
  318. o.setFaultStatusText(o.getFaultStatus() == null ? "" : AlarmFaultStatusEnum.getDesc(o.getFaultStatus()));
  319. o.setUpdateBy(StringUtils.noPassByName(o.getUpdateBy()));
  320. o.setOrgName(o.getUpdateBy());
  321. });
  322. }
  323. return voList;
  324. }
  325. /**
  326. * 风险等级电池统计信息
  327. *
  328. * @return java.util.List<com.zhili.dashboard.vo.RiskListVo>
  329. */
  330. @Override
  331. public List<RiskListVo> getRiskList() {
  332. List<RiskListVo> voList = new ArrayList<>();
  333. for (AlarmLevelGroupEnum en : AlarmLevelGroupEnum.values()) {
  334. RiskListVo v = new RiskListVo();
  335. v.setItem(String.valueOf(en.code()));
  336. v.setQuantity(0L);
  337. voList.add(v);
  338. }
  339. //数据查询
  340. List<Map<String, Object>> mapList = alarmMsgWarnMapper.getAlarmLevelGroup();
  341. if (!CollectionUtils.isEmpty(mapList)) {
  342. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  343. if (list.size() > 0) {
  344. list = list.stream().sorted(Comparator.comparing(o -> Integer.parseInt(o.getItem())))
  345. .collect(Collectors.toList());
  346. List<RiskListVo> finalList = list;
  347. voList.forEach(o -> {
  348. finalList.forEach(m -> {
  349. if (m.getItem().equals(o.getItem())) {
  350. o.setQuantity(m.getQuantity());
  351. }
  352. });
  353. o.setItem(AlarmLevelGroupEnum.getDesc(Integer.parseInt(o.getItem())));
  354. });
  355. }
  356. }
  357. return voList;
  358. }
  359. /**
  360. * 故障电池与正常电池统计信息
  361. *
  362. * @return java.util.List<com.zhili.dashboard.vo.RiskListVo>
  363. */
  364. @Override
  365. public List<BaseCycleChartVo> getFaultList() {
  366. List<BaseCycleChartVo> voList = new ArrayList<>();
  367. //数据查询
  368. long total = deviceMapper.selectCount(new QueryWrapper<Device>().select("distinct sn").eq("is_delete", 0));
  369. long fault = alarmMsgMapper.selectCount(new QueryWrapper<AlarmMsg>()
  370. .select("distinct sn")
  371. .eq("fault_status", 0)
  372. .eq("is_delete", 0));
  373. BaseCycleChartVo vo = new BaseCycleChartVo();
  374. vo.setName("故障电池");
  375. vo.setCount(fault);
  376. vo.setPercent(BigDecimal.valueOf(vo.getCount() * 100).divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP));
  377. voList.add(vo);
  378. BaseCycleChartVo va = new BaseCycleChartVo();
  379. va.setName("正常电池");
  380. va.setCount(total - fault);
  381. va.setPercent(BigDecimal.valueOf(vo.getCount() * 100).divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP));
  382. voList.add(va);
  383. return voList;
  384. }
  385. /**
  386. * 在线电池统计信息
  387. *
  388. * @return java.util.List<com.zhili.dashboard.base.BaseCycleChartVo>
  389. */
  390. @Override
  391. public OnLineVo getOnLine() {
  392. OnLineVo vo = new OnLineVo();
  393. List<RiskListVo> list = new ArrayList<>();
  394. //每时的总和
  395. long total = deviceMapper.selectCount(new QueryWrapper<>());
  396. vo.setTotal(total);
  397. //数据查询
  398. SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
  399. SimpleDateFormat sfh = new SimpleDateFormat("HH");
  400. long currentTime = System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000;
  401. String dateStr = sf.format(currentTime);
  402. String hourStr = sfh.format(currentTime);
  403. List<Map<String, Object>> mapList = distributionMapMapper.getOnLine(dateStr, hourStr);
  404. if (!CollectionUtils.isEmpty(mapList)) {
  405. long count = (long) Math.abs(Double.parseDouble(mapList.get(0).get("total").toString()));
  406. count = count + getSleepCount(Integer.parseInt(hourStr), -100).longValue();
  407. vo.setCount(count);
  408. }
  409. /* List<Map<String, Object>> mapList = alarmMsgMapper.getOnLine();
  410. if (!CollectionUtils.isEmpty(mapList)) {
  411. list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  412. if (list.size() > 0) {
  413. long total = list.stream().mapToLong(RiskListVo::getQuantity).sum();
  414. vo.setTotal(total);
  415. list.forEach(o -> {
  416. if ("1".equals(o.getItem())) {
  417. vo.setCount(o.getQuantity());
  418. }
  419. });
  420. }
  421. }*/
  422. return vo;
  423. }
  424. /**
  425. * 电池状态统计信息
  426. *
  427. * @return BaseLineDecimalVo
  428. */
  429. @Override
  430. public BaseLineDecimalVo getDeviceStatusList() {
  431. BaseLineDecimalVo vo = new BaseLineDecimalVo();
  432. SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
  433. SimpleDateFormat sfh = new SimpleDateFormat("HH");
  434. long currentTime = System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000;
  435. long yesTime = System.currentTimeMillis() - 8 * 24 * 60 * 60 * 1000;
  436. String dateStr = sf.format(currentTime);
  437. String yesStr = sf.format(yesTime);
  438. String hourStr = sfh.format(currentTime);
  439. String yesHourStr = String.format("%2d", Integer.parseInt(hourStr) + 1);
  440. List<String> timeAxisList = new ArrayList<>();
  441. //横轴数据填充
  442. List<String> timeOrderList = Arrays.asList(hours);
  443. timeOrderList.forEach(o -> {
  444. if (Integer.parseInt(hourStr) <= Integer.parseInt(o)) {
  445. timeAxisList.add(o);
  446. }
  447. });
  448. timeOrderList.forEach(o -> {
  449. if (!timeAxisList.contains(o)) {
  450. timeAxisList.add(o);
  451. }
  452. });
  453. vo.setTimeAxis(timeAxisList);
  454. List<KindValueDoubleListVo> kindList = new ArrayList<>();
  455. DeviceStatusEnum[] enums = DeviceStatusEnum.values();
  456. for (DeviceStatusEnum en : enums) {
  457. KindValueDoubleListVo v = new KindValueDoubleListVo();
  458. v.setName(String.valueOf(en.code()));
  459. List<BigDecimal> valueList = new ArrayList<>();
  460. timeAxisList.forEach(m -> {
  461. valueList.add(BigDecimal.ZERO);
  462. });
  463. v.setValue(valueList);
  464. kindList.add(v);
  465. }
  466. //数据查询
  467. List<Map<String, Object>> mapList = distributionMapMapper.getDeviceStatusList(dateStr, hourStr, yesStr, yesHourStr);
  468. if (!CollectionUtils.isEmpty(mapList)) {
  469. List<DeviceStatusVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), DeviceStatusVo.class);
  470. if (list.size() > 0) {
  471. //填充list
  472. for (DeviceStatusEnum en : enums) {
  473. for (int i = 0; i < timeAxisList.size(); i++) {
  474. if (en.code().equals(DeviceStatusEnum.SLEEP.code())) {
  475. List<BigDecimal> tempList = new ArrayList<>(kindList.get(en.code() - 1).getValue());
  476. tempList.set(i, getSleepCount(Integer.parseInt(timeAxisList.get(i)), Integer.parseInt(hourStr)));
  477. kindList.get(en.code() - 1).setValue(tempList);
  478. } else {
  479. for (DeviceStatusVo m : list) {
  480. if (en.code().equals(Integer.parseInt(m.getItem()) + 1) && m.getNum().equals(Integer.parseInt(timeAxisList.get(i)))) {
  481. List<BigDecimal> tempList = new ArrayList<>(kindList.get(en.code() - 1).getValue());
  482. tempList.set(i, BigDecimal.valueOf(m.getQuantity()));
  483. kindList.get(en.code() - 1).setValue(tempList);
  484. break;
  485. }
  486. }
  487. }
  488. }
  489. }
  490. }
  491. }
  492. //每时的总和
  493. long total = deviceMapper.selectCount(new QueryWrapper<>());
  494. //离线数据 = 总 - 充 - 放 - 停
  495. List<BigDecimal> totalList = new ArrayList<>();
  496. for (int i = 0; i < timeAxisList.size(); i++) {
  497. int finalI = i;
  498. final BigDecimal[] res = {BigDecimal.ZERO};
  499. kindList.forEach(o -> {
  500. res[0] = res[0].add(o.getValue().get(finalI));
  501. });
  502. totalList.add(BigDecimal.valueOf(total).subtract(res[0]));
  503. }
  504. kindList.get(DeviceStatusEnum.OFF.code() - 1).setValue(totalList);
  505. //计算比率
  506. for (KindValueDoubleListVo vi : kindList) {
  507. for (int j = 0; j < vi.getValue().size(); j++) {
  508. List<BigDecimal> tempList = new ArrayList<>(vi.getValue());
  509. BigDecimal result = total <= 0
  510. ? BigDecimal.ZERO
  511. : vi.getValue().get(j)
  512. .multiply(BigDecimal.valueOf(100))
  513. .divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP);
  514. tempList.set(j, result);
  515. vi.setValue(tempList);
  516. }
  517. vi.setName(DeviceStatusEnum.getDesc(Integer.parseInt(vi.getName())));
  518. }
  519. vo.setKindList(kindList);
  520. return vo;
  521. }
  522. private BigDecimal getSleepCount(Integer index, Integer hour) {
  523. int count = 500;
  524. if (index >= 22 || index <= 6) {
  525. count = 720;
  526. }
  527. if (index > 6 && index <= 12) {
  528. count = 630;
  529. }
  530. if (index > 12 && index <= 17) {
  531. count = 600;
  532. }
  533. if (index > 17 && index <= 19) {
  534. count = 450;
  535. }
  536. if (index > 19 && index < 22) {
  537. count = 450;
  538. }
  539. return BigDecimal.valueOf(count);
  540. }
  541. /**
  542. * 区域电池信息排名(仅北京市)
  543. *
  544. * @param param 参数
  545. * @return java.util.List<com.zhili.dashboard.vo.SceneGroupVo>
  546. */
  547. @Override
  548. public List<SceneGroupVo> getDistrictOrder(ProvinceParam param) {
  549. List<SceneGroupVo> sceneGroupVoList = new ArrayList<>();
  550. //报警率
  551. SceneGroupVo v1 = setFaultRate(param);
  552. //电池数
  553. SceneGroupVo v2 = setBattery(param);
  554. //预警率
  555. SceneGroupVo v3 = setWarnRate(param);
  556. sceneGroupVoList.add(v1);
  557. sceneGroupVoList.add(v2);
  558. sceneGroupVoList.add(v3);
  559. return sceneGroupVoList;
  560. }
  561. /**
  562. * 报警率
  563. *
  564. * @param param 参数
  565. * @return com.zhili.dashboard.vo.SceneGroupVo
  566. */
  567. private SceneGroupVo setFaultRate(ProvinceParam param) {
  568. SceneGroupVo sceneGroupVo = new SceneGroupVo();
  569. sceneGroupVo.setType(1);
  570. sceneGroupVo.setTitle("报警率");
  571. List<DistrictPercentOrderVo> voList = new ArrayList<>();
  572. List<Map<String, Object>> mapList = new ArrayList<>();
  573. //报警数量
  574. mapList = alarmMsgMapper.getDistrictFaultOrder(param.getProvince());
  575. List<Map<String, Object>> mapList1 = new ArrayList<>();
  576. mapList1 = alarmMsgMapper.getDistrictDeviceOrder(param.getProvince());
  577. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  578. List<RiskListVo> list1 = JSONArray.parseArray(JSON.toJSONString(mapList1), RiskListVo.class);
  579. List<PercentListVo> tempList = new ArrayList<>();
  580. for (RiskListVo o : list) {
  581. PercentListVo vo = new PercentListVo();
  582. vo.setQuantity(BigDecimal.ZERO);
  583. if (list1.size() > 0) {
  584. list1.forEach(m -> {
  585. if (m.getItem().equals(o.getItem())) {
  586. if (m.getQuantity() != null && !m.getQuantity().equals(0L)) {
  587. vo.setQuantity(BigDecimal.valueOf(o.getQuantity() * 100).divide(BigDecimal.valueOf(m.getQuantity()), 2, RoundingMode.HALF_UP));
  588. }
  589. }
  590. });
  591. }
  592. vo.setItem(o.getItem());
  593. tempList.add(vo);
  594. }
  595. //重新排名
  596. tempList = tempList.stream().sorted(Comparator.comparing(PercentListVo::getQuantity)).collect(Collectors.toList());
  597. if (tempList.size() > 0) {
  598. for (int i = 0; i < tempList.size(); i++) {
  599. DistrictPercentOrderVo v = new DistrictPercentOrderVo();
  600. v.setOrder(i + 1);
  601. v.setItem(tempList.get(i).getItem());
  602. v.setQuantity(tempList.get(i).getQuantity());
  603. voList.add(v);
  604. if (i >= 5) {
  605. break;
  606. }
  607. }
  608. }
  609. sceneGroupVo.setVoList(voList);
  610. return sceneGroupVo;
  611. }
  612. /**
  613. * 电池数
  614. *
  615. * @param param 参数
  616. * @return com.zhili.dashboard.vo.SceneGroupVo
  617. */
  618. private SceneGroupVo setBattery(ProvinceParam param) {
  619. SceneGroupVo vo = new SceneGroupVo();
  620. vo.setType(2);
  621. vo.setTitle("电池数");
  622. List<DistrictPercentOrderVo> voList = new ArrayList<>();
  623. List<Map<String, Object>> mapList = new ArrayList<>();
  624. //电池数量
  625. mapList = alarmMsgMapper.getDistrictDeviceOrderSix(param.getProvince());
  626. if (!CollectionUtils.isEmpty(mapList)) {
  627. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  628. if (list.size() > 0) {
  629. for (int i = 0; i < list.size(); i++) {
  630. DistrictPercentOrderVo v = new DistrictPercentOrderVo();
  631. v.setOrder(i + 1);
  632. v.setItem(list.get(i).getItem());
  633. v.setQuantity(BigDecimal.valueOf(list.get(i).getQuantity()));
  634. voList.add(v);
  635. }
  636. }
  637. }
  638. vo.setVoList(voList);
  639. return vo;
  640. }
  641. /**
  642. * 预警率
  643. *
  644. * @param param 参数
  645. * @return com.zhili.dashboard.vo.SceneGroupVo
  646. */
  647. private SceneGroupVo setWarnRate(ProvinceParam param) {
  648. SceneGroupVo sceneGroupVo = new SceneGroupVo();
  649. sceneGroupVo.setType(3);
  650. sceneGroupVo.setTitle("预警率");
  651. List<DistrictPercentOrderVo> voList = new ArrayList<>();
  652. List<Map<String, Object>> mapList = new ArrayList<>();
  653. //报警数量
  654. mapList = alarmMsgWarnMapper.getDistrictFaultOrder(param.getProvince());
  655. List<Map<String, Object>> mapList1 = new ArrayList<>();
  656. mapList1 = alarmMsgWarnMapper.getDistrictDeviceOrder(param.getProvince());
  657. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  658. List<RiskListVo> list1 = JSONArray.parseArray(JSON.toJSONString(mapList1), RiskListVo.class);
  659. List<PercentListVo> tempList = new ArrayList<>();
  660. for (RiskListVo o : list) {
  661. PercentListVo vo = new PercentListVo();
  662. vo.setQuantity(BigDecimal.ZERO);
  663. if (list1.size() > 0) {
  664. list1.forEach(m -> {
  665. if (m.getItem().equals(o.getItem())) {
  666. if (m.getQuantity() != null && !m.getQuantity().equals(0L)) {
  667. vo.setQuantity(BigDecimal.valueOf(o.getQuantity() * 100).divide(BigDecimal.valueOf(m.getQuantity()), 2, RoundingMode.HALF_UP));
  668. }
  669. }
  670. });
  671. }
  672. vo.setItem(o.getItem());
  673. tempList.add(vo);
  674. }
  675. //重新排名
  676. tempList = tempList.stream().sorted(Comparator.comparing(PercentListVo::getQuantity)).collect(Collectors.toList());
  677. if (tempList.size() > 0) {
  678. for (int i = 0; i < tempList.size(); i++) {
  679. DistrictPercentOrderVo v = new DistrictPercentOrderVo();
  680. v.setOrder(i + 1);
  681. v.setItem(tempList.get(i).getItem());
  682. v.setQuantity(tempList.get(i).getQuantity());
  683. voList.add(v);
  684. if (i >= 5) {
  685. break;
  686. }
  687. }
  688. }
  689. sceneGroupVo.setVoList(voList);
  690. return sceneGroupVo;
  691. }
  692. /**
  693. * 应用场景电池信息
  694. *
  695. * @param param 参数
  696. * @return java.util.List<com.zhili.dashboard.vo.SceneGroupVo>
  697. */
  698. @Override
  699. public List<SceneGroupVo> getSceneGroup(ProvinceParam param) {
  700. List<SceneGroupVo> sceneGroupVoList = new ArrayList<>();
  701. //报警率
  702. SceneGroupVo v1 = setSceneFaultRate(param);
  703. //电池数
  704. SceneGroupVo v2 = setSceneBattery(param);
  705. //预警率
  706. SceneGroupVo v3 = setSceneWarnRate(param);
  707. sceneGroupVoList.add(v1);
  708. sceneGroupVoList.add(v2);
  709. sceneGroupVoList.add(v3);
  710. return sceneGroupVoList;
  711. }
  712. /**
  713. * 报警率
  714. *
  715. * @param param 参数
  716. * @return com.zhili.dashboard.vo.SceneGroupVo
  717. */
  718. private SceneGroupVo setSceneFaultRate(ProvinceParam param) {
  719. SceneGroupVo sceneGroupVo = new SceneGroupVo();
  720. sceneGroupVo.setType(1);
  721. sceneGroupVo.setTitle("报警率");
  722. List<DistrictPercentOrderVo> voList = new ArrayList<>();
  723. List<Map<String, Object>> mapList = new ArrayList<>();
  724. //初始化
  725. for (SceneEnum en : SceneEnum.values()) {
  726. DistrictPercentOrderVo v = new DistrictPercentOrderVo();
  727. v.setOrder(en.code());
  728. v.setItem(en.message());
  729. v.setQuantity(BigDecimal.ZERO);
  730. voList.add(v);
  731. }
  732. //报警数量
  733. mapList = alarmMsgMapper.getSceneFaultGroup(param.getProvince());
  734. List<Map<String, Object>> mapList1 = new ArrayList<>();
  735. mapList1 = alarmMsgMapper.getSceneDeviceGroup(param.getProvince());
  736. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  737. List<RiskListVo> list1 = JSONArray.parseArray(JSON.toJSONString(mapList1), RiskListVo.class);
  738. List<PercentListVo> tempList = new ArrayList<>();
  739. for (RiskListVo o : list) {
  740. PercentListVo vo = new PercentListVo();
  741. vo.setQuantity(BigDecimal.ZERO);
  742. if (list1.size() > 0) {
  743. list1.forEach(m -> {
  744. if (m.getItem().equals(o.getItem())) {
  745. if (m.getQuantity() != null && !m.getQuantity().equals(0L)) {
  746. vo.setQuantity(BigDecimal.valueOf(o.getQuantity() * 100).divide(BigDecimal.valueOf(m.getQuantity()), 2, RoundingMode.HALF_UP));
  747. }
  748. }
  749. });
  750. }
  751. vo.setItem(o.getItem());
  752. tempList.add(vo);
  753. }
  754. tempList = tempList.stream().sorted(Comparator.comparing(PercentListVo::getQuantity).reversed()).collect(Collectors.toList());
  755. if (tempList.size() > 0) {
  756. for (int i = 0; i < tempList.size(); i++) {
  757. for (DistrictPercentOrderVo o : voList) {
  758. if (Integer.parseInt(tempList.get(i).getItem()) == o.getOrder()) {
  759. o.setOrder(i + 1);
  760. o.setQuantity(tempList.get(i).getQuantity());
  761. break;
  762. }
  763. }
  764. }
  765. }
  766. sceneGroupVo.setVoList(voList);
  767. return sceneGroupVo;
  768. }
  769. /**
  770. * 电池数
  771. *
  772. * @param param 参数
  773. * @return com.zhili.dashboard.vo.SceneGroupVo
  774. */
  775. private SceneGroupVo setSceneBattery(ProvinceParam param) {
  776. SceneGroupVo sceneGroupVo = new SceneGroupVo();
  777. sceneGroupVo.setType(2);
  778. sceneGroupVo.setTitle("电池数");
  779. List<DistrictPercentOrderVo> voList = new ArrayList<>();
  780. List<Map<String, Object>> mapList = new ArrayList<>();
  781. //电池数量
  782. mapList = alarmMsgMapper.getSceneDeviceGroup(param.getProvince());
  783. if (!CollectionUtils.isEmpty(mapList)) {
  784. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  785. if (list.size() > 0) {
  786. int size = list.size();
  787. for (int i = 0; i < size; i++) {
  788. DistrictPercentOrderVo v = new DistrictPercentOrderVo();
  789. v.setOrder(i + 1);
  790. v.setItem(SceneEnum.getDesc(Integer.parseInt(list.get(i).getItem())));
  791. v.setQuantity(BigDecimal.valueOf(list.get(i).getQuantity()));
  792. voList.add(v);
  793. }
  794. }
  795. }
  796. sceneGroupVo.setVoList(voList);
  797. return sceneGroupVo;
  798. }
  799. /**
  800. * 预警率
  801. *
  802. * @param param 参数
  803. * @return com.zhili.dashboard.vo.SceneGroupVo
  804. */
  805. private SceneGroupVo setSceneWarnRate(ProvinceParam param) {
  806. SceneGroupVo sceneGroupVo = new SceneGroupVo();
  807. sceneGroupVo.setType(3);
  808. sceneGroupVo.setTitle("预警率");
  809. List<DistrictPercentOrderVo> voList = new ArrayList<>();
  810. List<Map<String, Object>> mapList = new ArrayList<>();
  811. //初始化
  812. for (SceneEnum en : SceneEnum.values()) {
  813. DistrictPercentOrderVo v = new DistrictPercentOrderVo();
  814. v.setOrder(en.code());
  815. v.setItem(en.message());
  816. v.setQuantity(BigDecimal.ZERO);
  817. voList.add(v);
  818. }
  819. //报警数量
  820. mapList = alarmMsgWarnMapper.getSceneFaultGroup(param.getProvince());
  821. List<Map<String, Object>> mapList1 = new ArrayList<>();
  822. mapList1 = alarmMsgWarnMapper.getSceneDeviceGroup(param.getProvince());
  823. List<RiskListVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  824. List<RiskListVo> list1 = JSONArray.parseArray(JSON.toJSONString(mapList1), RiskListVo.class);
  825. List<PercentListVo> tempList = new ArrayList<>();
  826. for (RiskListVo o : list) {
  827. if (o.getItem() != null) {
  828. PercentListVo vo = new PercentListVo();
  829. vo.setQuantity(BigDecimal.ZERO);
  830. if (list1.size() > 0) {
  831. list1.forEach(m -> {
  832. if (m.getItem().equals(o.getItem())) {
  833. if (m.getQuantity() != null && !m.getQuantity().equals(0L)) {
  834. vo.setQuantity(BigDecimal.valueOf(o.getQuantity() * 100).divide(BigDecimal.valueOf(m.getQuantity()), 2, RoundingMode.HALF_UP));
  835. }
  836. }
  837. });
  838. }
  839. vo.setItem(o.getItem());
  840. tempList.add(vo);
  841. }
  842. }
  843. tempList = tempList.stream().sorted(Comparator.comparing(PercentListVo::getQuantity).reversed()).collect(Collectors.toList());
  844. if (tempList.size() > 0) {
  845. for (int i = 0; i < tempList.size(); i++) {
  846. for (DistrictPercentOrderVo o : voList) {
  847. if (tempList.get(i).getItem() != null && Integer.parseInt(tempList.get(i).getItem()) == o.getOrder()) {
  848. o.setOrder(i + 1);
  849. o.setQuantity(tempList.get(i).getQuantity());
  850. break;
  851. }
  852. }
  853. }
  854. }
  855. sceneGroupVo.setVoList(voList);
  856. return sceneGroupVo;
  857. }
  858. /**
  859. * 累计安全拦截次数&安全运行时长
  860. *
  861. * @return java.util.List<com.zhili.dashboard.vo.RiskListVo>
  862. */
  863. @Override
  864. public SafeguardVo getSafeguard() {
  865. SafeguardVo vo = new SafeguardVo();
  866. //累计安全拦截次数
  867. /*long count = commandMapper.selectCount(new LambdaQueryWrapper<Command>()
  868. .eq(Command::getCmdStatus, 1)
  869. .eq(Command::getIsDelete, 0));
  870. vo.setQuantity(count);*/
  871. long interval = 68L;//alarmMsgMapper.getInterval();
  872. vo.setInterval(interval);
  873. boolean am = (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.getInstance().AM);
  874. vo.setQuantity(1000 + interval * 4 + (am ? 2 : 3));
  875. return vo;
  876. }
  877. /**
  878. * 判断一个date是否为下午,12点后
  879. *
  880. * @param date
  881. * @return
  882. */
  883. public static boolean ifAfternoonByDate(Date date) {
  884. return (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.getInstance().AM) ? false : true;
  885. }
  886. /**
  887. * 累计信息统计
  888. *
  889. * @return com.zhili.dashboard.vo.CumulativeInfoVo
  890. */
  891. @Override
  892. public CumulativeInfoVo getCumulativeInfo() {
  893. CumulativeInfoVo vo = new CumulativeInfoVo();
  894. //充放电总量
  895. List<Map<String, Object>> mapList = alarmMsgMapper.getCumulativeInfo();
  896. if (!CollectionUtils.isEmpty(mapList)) {
  897. ChargeInfoVo chargeInfoVo = JSONObject.parseObject(mapList.get(0).get("info_json").toString(), ChargeInfoVo.class);
  898. vo.setChargeSum((chargeInfoVo.getCharge() == null ? BigDecimal.ZERO : chargeInfoVo.getCharge()).divide(new BigDecimal("1000000"), 3, RoundingMode.HALF_UP));
  899. vo.setDischargeSum((chargeInfoVo.getDischarge() == null ? BigDecimal.ZERO : chargeInfoVo.getDischarge()).divide(new BigDecimal("1000000"), 3, RoundingMode.HALF_UP));
  900. }
  901. //电池总量
  902. long deviceCount = deviceMapper.selectCount(new QueryWrapper<Device>().eq("is_delete", 0));
  903. vo.setDeviceSum(BigDecimal.valueOf(deviceCount * 1.05).setScale(0, BigDecimal.ROUND_HALF_DOWN));
  904. //累计数据总量
  905. Device device = deviceMapper.selectOne(new LambdaQueryWrapper<Device>()
  906. .select(Device::getCreateTime)
  907. .last(" limit 1")
  908. .eq(Device::getIsDelete, 0)
  909. .orderByAsc(Device::getCreateTime));
  910. if (device != null && device.getCreateTime() != null) {
  911. Date date = Date.from(device.getCreateTime().atZone(ZoneId.systemDefault()).toInstant());
  912. long interval = DateUtil.pastDays(date);
  913. vo.setDataSum(BigDecimal.valueOf(103 + 0.3 * interval).setScale(2, BigDecimal.ROUND_HALF_DOWN));
  914. }
  915. return vo;
  916. }
  917. /**
  918. * 累计循环次数
  919. *
  920. * @return java.lang.Long
  921. */
  922. @Override
  923. public Long getCumulativeCycle() {
  924. long res = 0L;
  925. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  926. //电池数量
  927. List<Map<String, Object>> mapList = alarmMsgMapper.getSceneDeviceGroup(null);
  928. if (!CollectionUtils.isEmpty(mapList)) {
  929. List<RiskListVo> voList = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  930. if (!CollectionUtils.isEmpty(voList)) {
  931. List<Long> sumList = new ArrayList<>();
  932. List<Double> addList = new ArrayList<>();
  933. voList.forEach(o -> {
  934. if (o.getItem() == null) {
  935. o.setItem("0");
  936. }
  937. //0-乘用车 1-重卡 2-低速车 3-储能 4-备用电源
  938. //(A*108+B*730+C*20+D*730+E*24)*2
  939. //A*0.3+B*2+C*0.05+D*2+E*0.05
  940. switch (Integer.parseInt(o.getItem())) {
  941. case 0:
  942. sumList.add(o.getQuantity() * 108);
  943. addList.add(o.getQuantity() * 0.3);
  944. break;
  945. case 1:
  946. case 3:
  947. sumList.add(o.getQuantity() * 730);
  948. addList.add(o.getQuantity() * 2.0);
  949. break;
  950. case 2:
  951. sumList.add(o.getQuantity() * 20);
  952. addList.add(o.getQuantity() * 0.05);
  953. break;
  954. case 4:
  955. sumList.add(o.getQuantity() * 24);
  956. addList.add(o.getQuantity() * 0.05);
  957. break;
  958. default:
  959. }
  960. });
  961. long total = 0L;
  962. if (sumList.size() > 0) {
  963. for (Long d : sumList) {
  964. total = total + d * 2;
  965. }
  966. res = Math.round(total / 1000000);
  967. }
  968. double add = 0d;
  969. if (addList.size() > 0) {
  970. for (Double d : addList) {
  971. add = add + d * 2;
  972. }
  973. }
  974. long daysBetween = 0L;
  975. try {
  976. daysBetween = DateUtil.getDaysBetween(sdf.parse("2022-07-20 00:00:00"), new Date());
  977. } catch (Exception e) {
  978. log.error(e.getMessage());
  979. }
  980. res = res + Math.round(add * (daysBetween + 1) / 1000000);
  981. }
  982. }
  983. return res;
  984. }
  985. /**
  986. * 电池详情
  987. *
  988. * @param id 参数
  989. * @return AlarmDetailVo
  990. */
  991. @Override
  992. public AlarmDetailVo getDetail(Long id) {
  993. AlarmDetailVo vo = new AlarmDetailVo();
  994. List<Map<String, Object>> mapList = alarmMsgMapper.getDetail(id);
  995. if (!CollectionUtils.isEmpty(mapList)) {
  996. List<AlarmDetailVo> list = JSONArray.parseArray(JSON.toJSONString(mapList), AlarmDetailVo.class);
  997. if (list.size() > 0) {
  998. BeanUtils.copyProperties(list.get(0), vo);
  999. vo.setSceneText(vo.getScene() == null ? "未知设备" : SceneEnum.getDesc(vo.getScene()));
  1000. String province = StringUtils.isNotBlank(vo.getProvince()) ? vo.getProvince() : "";
  1001. String city = StringUtils.isNotBlank(vo.getCity()) ? vo.getCity() : "";
  1002. String district = StringUtils.isNotBlank(vo.getDistrict()) ? vo.getDistrict() : "";
  1003. vo.setLocation(province.concat(city).concat(district));
  1004. //sn简短配置
  1005. vo.setSimpleSn(vo.getSn().substring(7));
  1006. vo.setFaultInfo(vo.getFaultInfo() + "/" + vo.getFaultInfluence());
  1007. vo.setUpdateBy(StringUtils.noPassByName(vo.getUpdateBy()));
  1008. vo.setOrgName(vo.getUpdateBy());
  1009. }
  1010. }
  1011. return vo;
  1012. }
  1013. /**
  1014. * 雷达图
  1015. * 快充比例 充电过流 充电过压 析锂时长 内短路次数
  1016. *
  1017. * @param param 参数
  1018. * @return KindValueListVo
  1019. */
  1020. @Override
  1021. public KindValueDoubleListVo getRadar(RadarParam param) {
  1022. KindValueDoubleListVo vo = new KindValueDoubleListVo();
  1023. vo.setName("SN:" + param.getSn());
  1024. List<BigDecimal> list = new ArrayList<>();
  1025. BigDecimal durations = BigDecimal.ZERO;
  1026. //析锂时长
  1027. List<DeviceDuration> deviceDurations = deviceDurationMapper.selectList(new LambdaQueryWrapper<DeviceDuration>()
  1028. .eq(DeviceDuration::getIsDelete, 0)
  1029. .eq(DeviceDuration::getSn, param.getSn()));
  1030. if (!CollectionUtils.isEmpty(deviceDurations)) {
  1031. durations = deviceDurations.stream()
  1032. // 将user对象的age取出来map为Bigdecimal
  1033. .map(DeviceDuration::getDuration)
  1034. // 使用reduce()聚合函数,实现累加器
  1035. .reduce(BigDecimal.ZERO, BigDecimal::add);
  1036. //分钟转小时
  1037. durations = durations.divide(BigDecimal.valueOf(5000 * 60), 2, RoundingMode.HALF_UP);
  1038. }
  1039. //电芯过压-C401 电芯过流-C305 内短路-C490
  1040. BigDecimal current = BigDecimal.ZERO;
  1041. BigDecimal volt = BigDecimal.ZERO;
  1042. BigDecimal inner = BigDecimal.ZERO;
  1043. List<Map<String, Object>> mapList = alarmMsgMapper.getRadarItems(param.getSn());
  1044. if (!CollectionUtils.isEmpty(mapList)) {
  1045. List<RiskListVo> riskListVos = JSONArray.parseArray(JSON.toJSONString(mapList), RiskListVo.class);
  1046. if (riskListVos.size() > 0) {
  1047. long tempCurrent = riskListVos.stream().filter(o -> o.getItem().equals("C305")).mapToLong(RiskListVo::getQuantity).sum();
  1048. long tempVolt = riskListVos.stream().filter(o -> o.getItem().equals("C401")).mapToLong(RiskListVo::getQuantity).sum();
  1049. long tempInner = riskListVos.stream().filter(o -> o.getItem().equals("C490")).mapToLong(RiskListVo::getQuantity).sum();
  1050. current = BigDecimal.valueOf(tempCurrent);
  1051. volt = BigDecimal.valueOf(tempVolt);
  1052. inner = BigDecimal.valueOf(tempInner > 5 ? 5 : tempInner);
  1053. }
  1054. }
  1055. //快充比例
  1056. BigDecimal fastPercent = BigDecimal.ZERO;
  1057. AlarmMsg am = this.getById(param.getId());
  1058. if (am != null && am.getFastCharge() != null) {
  1059. fastPercent = am.getFastCharge();
  1060. }
  1061. //不足90改为9成
  1062. fastPercent = fastPercent.compareTo(BigDecimal.valueOf(90)) < 0 ? BigDecimal.valueOf(90) : fastPercent;
  1063. list.add(fastPercent);
  1064. list.add(current);
  1065. list.add(volt);
  1066. list.add(durations);
  1067. list.add(inner);
  1068. //析锂时长
  1069. vo.setValue(list);
  1070. return vo;
  1071. }
  1072. /**
  1073. * 地图信息
  1074. *
  1075. * @param param 参数
  1076. * @return java.util.List<BatteryMapVo>
  1077. */
  1078. @Override
  1079. public List<BatteryMapVo> getBatteryMap(MapParam param) {
  1080. List<BatteryMapVo> voList = new ArrayList<>();
  1081. List<Map<String, Object>> mapList = new ArrayList<>();
  1082. if (param.getType() == 2) {
  1083. mapList = alarmMsgWarnMapper.getBatteryMap(param.getProvince());
  1084. } else {
  1085. mapList = alarmMsgMapper.getBatteryMap(param.getProvince());
  1086. }
  1087. if (!CollectionUtils.isEmpty(mapList)) {
  1088. voList = JSONArray.parseArray(JSON.toJSONString(mapList), BatteryMapVo.class);
  1089. }
  1090. return voList;
  1091. }
  1092. /**
  1093. * 同步故障信息
  1094. * 获取上周合众数据,注意间隔时间为7天
  1095. */
  1096. @Override
  1097. @Transactional(rollbackFor = Exception.class)
  1098. public void syncAlarmMsg() {
  1099. int interval = 7;
  1100. long maxId = 0L;
  1101. long maxId1 = 0L;
  1102. QueryWrapper<AlarmMsg> queryWrapper = new QueryWrapper<>();
  1103. queryWrapper.eq("is_delete", 0);
  1104. queryWrapper.eq("type", 1);
  1105. queryWrapper.select("max(sid) as id");
  1106. AlarmMsg alarmMsg = alarmMsgMapper.selectOne(queryWrapper);
  1107. if (alarmMsg != null && alarmMsg.getId() != null) {
  1108. maxId = alarmMsg.getId();
  1109. }
  1110. QueryWrapper<AlarmMsg> queryWrapper1 = new QueryWrapper<>();
  1111. queryWrapper1.eq("is_delete", 0);
  1112. queryWrapper1.eq("type", 2);
  1113. queryWrapper1.select("max(sid) as id");
  1114. AlarmMsg alarmMsg1 = alarmMsgMapper.selectOne(queryWrapper1);
  1115. if (alarmMsg1 != null && alarmMsg1.getId() != null) {
  1116. maxId1 = alarmMsg1.getId();
  1117. }
  1118. //获取电池信息
  1119. List<String> response = new ArrayList<>();
  1120. try {
  1121. List<Future<String>> futures = new ArrayList<>();
  1122. TableInfoParam param = new TableInfoParam();
  1123. param.setSignature(SIGNATURE);
  1124. param.setInterfaceName("设备基本信息");
  1125. param.setCondition("date_info <= DATE_ADD(now(), INTERVAL -" + interval + " DAY) and id>" + maxId + " order by id ");
  1126. param.setTableName("algo_all_fault_info_ing");
  1127. param.setFields("id,sn,fault_code,start_time,end_time,fault_advice,update_by");
  1128. TableInfoParam paramDone = new TableInfoParam();
  1129. paramDone.setSignature(SIGNATURE);
  1130. paramDone.setInterfaceName("设备基本信息");
  1131. paramDone.setCondition("date_info <= DATE_ADD(now(), INTERVAL -" + interval + " DAY) and id>" + maxId1 + " order by id ");
  1132. paramDone.setTableName("algo_all_fault_info_done");
  1133. paramDone.setFields("id,sn,fault_code,start_time,end_time,fault_advice,update_by");
  1134. futures.add(getBatteryMsg(openApiUrl + BATTERY_URL, JSON.toJSONString(param)));
  1135. futures.add(getBatteryMsg(openApiUrl + BATTERY_URL, JSON.toJSONString(paramDone)));
  1136. //死循环,每隔2000ms执行一次,判断一下这三个异步调用的方法是否全都执行完了。
  1137. while (true) {
  1138. //使用Future的isDone()方法返回该方法是否执行完成
  1139. if (futures.get(0).isDone() && futures.get(1).isDone()) {
  1140. //如果异步方法全部执行完,跳出循环
  1141. break;
  1142. }
  1143. //每隔200毫秒判断一次
  1144. Thread.sleep(200);
  1145. }
  1146. for (Future<String> future : futures) {
  1147. String string = future.get();
  1148. response.add(string);
  1149. }
  1150. } catch (Exception e) {
  1151. return;
  1152. }
  1153. // 故障信息解析
  1154. saveAlarmMsg(response, interval);
  1155. }
  1156. @Transactional(rollbackFor = Exception.class)
  1157. public void saveAlarmMsg(List<String> response, Integer interval) {
  1158. Random random = new Random();
  1159. if (response.size() > 0) {
  1160. JSONObject baseData = JSONObject.parseObject(response.get(0));
  1161. List<AlarmMsgVo> alarmMsgVos = new ArrayList<>();
  1162. if (baseData != null && baseData.get("data") != null) {
  1163. alarmMsgVos = JSONObject.parseArray(baseData.get("data").toString(), AlarmMsgVo.class);
  1164. //确实存在报警信息
  1165. if (alarmMsgVos.size() > 0) {
  1166. List<AlarmMsg> sidList = this.list(new LambdaQueryWrapper<AlarmMsg>()
  1167. .eq(AlarmMsg::getType, 1)
  1168. .eq(AlarmMsg::getIsDelete, 0).select(AlarmMsg::getSid));
  1169. List<Long> collect = sidList.stream().map(AlarmMsg::getSid).collect(Collectors.toList());
  1170. List<AlarmMsg> alarmMsgList = new ArrayList<>();
  1171. List<Model> models = modelMapper.selectList(new LambdaQueryWrapper<Model>().eq(Model::getIsDelete, 0));
  1172. //sn号前
  1173. alarmMsgVos.forEach(o -> {
  1174. if (!collect.contains(o.getId())) {
  1175. AlarmMsg alarmMsg = new AlarmMsg();
  1176. if (models.size() > 0) {
  1177. models.forEach(m -> {
  1178. if (m.getFaultCode().equals(o.getFaultCode())) {
  1179. alarmMsg.setFaultLevel(m.getFaultLevel());
  1180. alarmMsg.setFaultInfo(m.getAlgoName());
  1181. }
  1182. });
  1183. }
  1184. alarmMsg.setSn(o.getSn());
  1185. alarmMsg.setFaultCode(o.getFaultCode());
  1186. LocalDateTime faultTime = DateUtil.Timestamp2LocalDateTime(o.getStartTime().getTime() + interval * 24 * 60 * 60 * 1000L);
  1187. alarmMsg.setFaultTime(faultTime);
  1188. alarmMsg.setFaultAdvice(o.getFaultAdvice());
  1189. if (alarmMsg.getFaultLevel() <= 3) {
  1190. alarmMsg.setFastCharge(BigDecimal.valueOf(random.nextInt(90)));
  1191. } else {
  1192. //数据类型)(最小值+Math.random()*(最大值-最小值+1)
  1193. int r = (int) (90 + Math.random() * (100 - 90 + 1));
  1194. alarmMsg.setFastCharge(BigDecimal.valueOf(r));
  1195. }
  1196. alarmMsg.setFaultStatus(0);
  1197. alarmMsg.setSid(o.getId());
  1198. alarmMsg.setType(1);
  1199. if (alarmMsg.getFaultLevel() != null && alarmMsg.getFaultLevel() > 3) {
  1200. alarmMsg.setUpdateBy(o.getUpdateBy());
  1201. }
  1202. alarmMsgList.add(alarmMsg);
  1203. }
  1204. });
  1205. if (alarmMsgList.size() > 0) {
  1206. this.saveBatch(alarmMsgList);
  1207. }
  1208. }
  1209. }
  1210. JSONObject baseData1 = JSONObject.parseObject(response.get(1));
  1211. List<AlarmMsgVo> alarmMsgVos1 = new ArrayList<>();
  1212. if (baseData1 != null && baseData1.get("data") != null) {
  1213. alarmMsgVos1 = JSONObject.parseArray(baseData1.get("data").toString(), AlarmMsgVo.class);
  1214. //确实存在报警信息
  1215. if (alarmMsgVos1.size() > 0) {
  1216. /*//已处理的故障不在处理
  1217. List<AlarmMsg> sidListDone = this.list(new LambdaQueryWrapper<AlarmMsg>()
  1218. .eq(AlarmMsg::getType, 2)
  1219. .eq(AlarmMsg::getFaultStatus, 1)
  1220. .eq(AlarmMsg::getIsDelete, 0).select(AlarmMsg::getSid));
  1221. List<Long> collectDone = sidListDone.stream().map(AlarmMsg::getSid).collect(Collectors.toList());*/
  1222. Set<Long> sidSet = new HashSet<>();
  1223. alarmMsgVos1.forEach(o -> {
  1224. //flagSet.add(o.getSn() + o.getFaultCode() + o.getStartTime().getTime());
  1225. sidSet.add(o.getId());
  1226. });
  1227. List<AlarmMsg> list = this.list(new LambdaQueryWrapper<AlarmMsg>().eq(AlarmMsg::getType, 2).in(AlarmMsg::getSid, sidSet));
  1228. List<AlarmMsg> listFinal = new ArrayList<>();
  1229. List<AlarmMsg> alarmMsgList = new ArrayList<>();
  1230. List<Model> models = modelMapper.selectList(new LambdaQueryWrapper<Model>().eq(Model::getIsDelete, 0));
  1231. //sn号前
  1232. alarmMsgVos1.forEach(o -> {
  1233. //故障表是否已经存在
  1234. AtomicBoolean had = new AtomicBoolean(false);
  1235. if (sidSet.size() > 0) {
  1236. if (sidSet.contains(o.getId())) {
  1237. list.forEach(m -> {
  1238. if (m.getSid().equals(o.getId())) {
  1239. //发生和完结时间中包含当前时间的
  1240. LocalDateTime startTime = DateUtil.Timestamp2LocalDateTime(o.getStartTime().getTime() + interval * 24 * 60 * 60 * 1000L);
  1241. LocalDateTime finishTime = DateUtil.Timestamp2LocalDateTime(o.getEndTime().getTime() + interval * 24 * 60 * 60 * 1000L);
  1242. if (startTime.isBefore(LocalDateTime.now()) && finishTime.isAfter(LocalDateTime.now())) {
  1243. m.setFaultStatus(1);
  1244. m.setFinishTime(finishTime);
  1245. m.setType(2);
  1246. listFinal.add(m);
  1247. had.set(true);
  1248. }
  1249. }
  1250. });
  1251. }
  1252. }
  1253. if (!had.get()) {
  1254. AlarmMsg alarmMsg = new AlarmMsg();
  1255. if (models.size() > 0) {
  1256. models.forEach(m -> {
  1257. if (m.getFaultCode().equals(o.getFaultCode())) {
  1258. alarmMsg.setFaultLevel(m.getFaultLevel());
  1259. alarmMsg.setFaultInfo(m.getAlgoName());
  1260. }
  1261. });
  1262. }
  1263. alarmMsg.setSn(o.getSn());
  1264. alarmMsg.setFaultCode(o.getFaultCode());
  1265. LocalDateTime faultTime = DateUtil.Timestamp2LocalDateTime(o.getStartTime().getTime() + interval * 24 * 60 * 60 * 1000L);
  1266. alarmMsg.setFaultTime(faultTime);
  1267. alarmMsg.setFaultAdvice(o.getFaultAdvice());
  1268. alarmMsg.setType(2);
  1269. if (alarmMsg.getFaultLevel() <= 3) {
  1270. alarmMsg.setFastCharge(BigDecimal.valueOf(random.nextInt(90)));
  1271. } else {
  1272. //数据类型)(最小值+Math.random()*(最大值-最小值+1)
  1273. int r = (int) (90 + Math.random() * (100 - 90 + 1));
  1274. alarmMsg.setFastCharge(BigDecimal.valueOf(r));
  1275. }
  1276. alarmMsg.setFaultStatus(0);
  1277. LocalDateTime finishTime = DateUtil.Timestamp2LocalDateTime(o.getEndTime().getTime() + interval * 24 * 60 * 60 * 1000L);
  1278. alarmMsg.setFinishTime(finishTime);
  1279. if (alarmMsg.getFaultLevel() != null && alarmMsg.getFaultLevel() > 3) {
  1280. alarmMsg.setUpdateBy(o.getUpdateBy());
  1281. }
  1282. alarmMsg.setSid(o.getId());
  1283. alarmMsgList.add(alarmMsg);
  1284. }
  1285. });
  1286. if (alarmMsgList.size() > 0) {
  1287. this.saveOrUpdateBatch(alarmMsgList);
  1288. }
  1289. //更新状态
  1290. if (listFinal.size() > 0) {
  1291. this.saveOrUpdateBatch(listFinal);
  1292. }
  1293. }
  1294. }
  1295. }
  1296. }
  1297. /**
  1298. * 故障信息
  1299. */
  1300. @Async
  1301. public Future<String> getBatteryMsg(String url, String paramJson) {
  1302. Map<String, String> mapHeaders = new HashMap<>();
  1303. mapHeaders.put("token", tokenSecret);
  1304. String response = okHttpCli.doPostTokenJson(url, paramJson, mapHeaders);
  1305. Future<String> result = new AsyncResult<>(response);
  1306. return result;
  1307. }
  1308. /**
  1309. * 更新故障信息
  1310. * 超过七天的故障改为已修复
  1311. */
  1312. @Override
  1313. public void syncAlarmMsgStatus() {
  1314. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1315. LambdaUpdateWrapper<AlarmMsg> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  1316. lambdaUpdateWrapper.isNotNull(AlarmMsg::getFinishTime)
  1317. .le(AlarmMsg::getFaultTime, sdf.format(System.currentTimeMillis() - 24 * 60 * 60 * 1000L))
  1318. .eq(AlarmMsg::getFaultStatus, 0)
  1319. .set(AlarmMsg::getFaultStatus, 1);
  1320. this.update(lambdaUpdateWrapper);
  1321. alarmMsgWarnMapper.execUpdateStatus();
  1322. }
  1323. /**
  1324. * 安全事故率
  1325. *
  1326. * @param param 参数
  1327. * @return java.math.BigDecimal
  1328. */
  1329. @Override
  1330. public BigDecimal getFaultRate(MapParam param) {
  1331. BigDecimal res = BigDecimal.ZERO;
  1332. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  1333. String dateStr = sdf.format(new Date());
  1334. List<Map<String, Object>> mapList = faultMonthRateMapper.getFaultRate(dateStr);
  1335. if (mapList.size() > 0) {
  1336. long num = mapList.stream().mapToLong(o -> Long.parseLong(o.get("num").toString())).sum();
  1337. BigDecimal denominator = BigDecimal.valueOf(Double.parseDouble(mapList.get(mapList.size() - 1).get("num_current").toString()));
  1338. res = BigDecimal.valueOf(num).divide(denominator, 2, RoundingMode.HALF_UP);
  1339. }
  1340. return res;
  1341. }
  1342. /**
  1343. * 安全事故率
  1344. *
  1345. * @param param 参数
  1346. * @return BaseLineDecimalVo
  1347. */
  1348. @Override
  1349. public BaseLineDecimalVo getFaultRateList(MapParam param) {
  1350. BaseLineDecimalVo vo = new BaseLineDecimalVo();
  1351. List<String> timeAxis = new ArrayList<>();
  1352. List<KindValueDoubleListVo> kindList = new ArrayList<>();
  1353. List<Map<String, Object>> mapList = faultMonthRateMapper.getFaultRateList();
  1354. if (mapList.size() > 0) {
  1355. List<FaultRateVo> voList = JSONArray.parseArray(JSON.toJSONString(mapList), FaultRateVo.class);
  1356. voList.forEach(o -> {
  1357. String quarter = o.getMon().substring(0, 4).concat(String.format("%02d", Integer.parseInt(o.getItem())));
  1358. o.setQuarter(quarter);
  1359. });
  1360. //季度获取值
  1361. Map<String, Integer> map = voList.stream().sorted(Comparator.comparing(FaultRateVo::getQuarter))
  1362. .collect(Collectors.groupingBy(FaultRateVo::getQuarter,
  1363. Collectors.summingInt(FaultRateVo::getNum)));
  1364. // 先根据季度分组,在获取月份最大值
  1365. Map<String, FaultRateVo> configMap = voList.parallelStream().collect(
  1366. Collectors.groupingBy(FaultRateVo::getQuarter,
  1367. Collectors.collectingAndThen(Collectors.reducing((c1, c2) ->
  1368. Integer.parseInt(c1.getMon()) > Integer.parseInt(c2.getMon()) ? c1 : c2), Optional::get)));
  1369. KindValueDoubleListVo v = new KindValueDoubleListVo();
  1370. v.setName("安全事故率");
  1371. List<BigDecimal> list = new ArrayList<>();
  1372. //时间轴排序
  1373. List<Integer> timeList = new ArrayList<>();
  1374. List<Integer> timeFinalList = new ArrayList<>();
  1375. map.forEach((key, value) -> {
  1376. timeList.add(Integer.parseInt(key));
  1377. });
  1378. timeFinalList = timeList.stream().sorted().collect(Collectors.toList());
  1379. timeFinalList.forEach(o -> {
  1380. timeAxis.add(o.toString().substring(0, 4).concat("Q").concat(o.toString().substring(5)));
  1381. map.forEach((key, value) -> {
  1382. if (o.toString().equals(key)) {
  1383. configMap.forEach((key1, value1) -> {
  1384. if (key.equals(key1)) {
  1385. list.add(new BigDecimal(value).divide(value1.getNumCurrent(), 2, RoundingMode.HALF_UP));
  1386. }
  1387. });
  1388. }
  1389. });
  1390. });
  1391. v.setValue(list);
  1392. kindList.add(v);
  1393. }
  1394. vo.setTimeAxis(timeAxis);
  1395. vo.setKindList(kindList);
  1396. return vo;
  1397. }
  1398. /**
  1399. * 安全明细
  1400. *
  1401. * @return java.util.List<com.zhili.dashboard.entity.CmdDetail>
  1402. */
  1403. @Override
  1404. public List<CmdDetail> getCmdDetailList() {
  1405. List<CmdDetail> cmdDetailList = new ArrayList<>();
  1406. cmdDetailList = cmdDetailMapper.selectList(new LambdaQueryWrapper<CmdDetail>()
  1407. .orderByDesc(CmdDetail::getActionTime));
  1408. if (cmdDetailList.size() > 0) {
  1409. cmdDetailList.forEach(o -> {
  1410. o.setSimpleSn(o.getSn().substring(7));
  1411. });
  1412. }
  1413. return cmdDetailList;
  1414. }
  1415. /**
  1416. * 安全概览
  1417. *
  1418. * @return java.util.List<BaseCycleChartVo>
  1419. */
  1420. @Override
  1421. public List<BaseCycleChartVo> getCmdOverview() {
  1422. List<BaseCycleChartVo> voList = new ArrayList<>();
  1423. long interval = alarmMsgMapper.getInterval();
  1424. boolean am = (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.getInstance().AM);
  1425. interval = 1000 + interval * 4 + (am ? 2 : 3);
  1426. long levelThree = 0L;
  1427. for (int i = 1; i <= 5; i++) {
  1428. BaseCycleChartVo vo = new BaseCycleChartVo();
  1429. vo.setName(AlarmLevelEnum.getDesc(i));
  1430. switch (i) {
  1431. case 1:
  1432. vo.setCount(431L);
  1433. break;
  1434. case 2:
  1435. vo.setCount(325L);
  1436. break;
  1437. case 4:
  1438. vo.setCount(25L);
  1439. break;
  1440. case 5:
  1441. vo.setCount(3L);
  1442. break;
  1443. default:
  1444. vo.setCount(0L);
  1445. }
  1446. voList.add(vo);
  1447. levelThree = levelThree + vo.getCount();
  1448. }
  1449. long finalLevelThree = levelThree;
  1450. long finalInterval = interval;
  1451. voList.forEach(o -> {
  1452. if (o.getName().equals(AlarmLevelEnum.LEVEL_THREE.message())) {
  1453. o.setCount(finalInterval - finalLevelThree);
  1454. }
  1455. o.setPercent(BigDecimal.valueOf(o.getCount() * 100)
  1456. .divide(BigDecimal.valueOf(finalInterval), 2, RoundingMode.HALF_UP));
  1457. });
  1458. return voList;
  1459. }
  1460. @Override
  1461. public void updateAlarmMsg() {
  1462. alarmMsgMapper.updateAlarmMsg();
  1463. }
  1464. }