AppDataService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package com.huaxu.service;
  2. import com.huaxu.common.StringUtils;
  3. import com.huaxu.dto.AlarmDetailsDto;
  4. import com.huaxu.dto.AppSmsDataDto;
  5. import com.huaxu.dto.SceneDataDto;
  6. import com.huaxu.dto.SceneDataForAppDto;
  7. import com.huaxu.entity.*;
  8. import com.huaxu.util.ByteArrayUtils;
  9. import com.huaxu.util.RedisUtil;
  10. import io.swagger.annotations.ApiParam;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.web.bind.annotation.RequestParam;
  14. import java.math.BigDecimal;
  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.stream.Collectors;
  20. @Service
  21. public class AppDataService {
  22. @Autowired
  23. private MonitorDataReportService monitorDataReportService;
  24. @Autowired
  25. private MonitorInfoService monitorInfoService;
  26. @Autowired
  27. private RedisUtil redisUtil;
  28. @Autowired
  29. private AlarmDetailsService alarmDetailsService;
  30. @Autowired
  31. private DeviceAttributeSpecsService deviceAttributeSpecsService;
  32. @Autowired
  33. private DeviceParmService deviceParmService;
  34. @Autowired
  35. private SceneService sceneService;
  36. /**
  37. * 查询场景信息
  38. *
  39. * @param typeName 类型名称(水源、水厂、泵站、售水)
  40. * @return
  41. */
  42. public AppSmsDataDto getProductionDataForSameMonth(String typeName) {
  43. //3用水量or供水量or制水量 4 取水量or进水量 5耗电量 6耗药量
  44. AppSmsDataDto appSmsDataDto = new AppSmsDataDto();
  45. switch (typeName) {
  46. case "水源":
  47. appSmsDataDto.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, null, typeName, 4, 2).doubleValue());
  48. appSmsDataDto.setPowerUsage(monitorDataReportService.getAmountCount(null, null, typeName, 5, 2).doubleValue());
  49. break;
  50. case "水厂":
  51. appSmsDataDto.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, null, typeName, 3, 2).doubleValue());
  52. appSmsDataDto.setPowerUsage(monitorDataReportService.getAmountCount(null, null, typeName, 5, 2).doubleValue());
  53. appSmsDataDto.setDrugUsage(monitorDataReportService.getAmountCount(null, null, typeName, 6, 2).doubleValue());
  54. break;
  55. case "泵站":
  56. appSmsDataDto.setYieldWaterUsage(monitorDataReportService.getAmountCount(null, null, typeName, 3, 2).doubleValue());
  57. appSmsDataDto.setPowerUsage(monitorDataReportService.getAmountCount(null, null, typeName, 5, 2).doubleValue());
  58. break;
  59. case "售水":
  60. appSmsDataDto.setYieldWaterUsage(monitorDataReportService.getAmountCount(null, null, "水厂", 3, 2).doubleValue());
  61. appSmsDataDto.setWaterUsage(monitorDataReportService.getUseAmount(null, 1).doubleValue());
  62. double amount = appSmsDataDto.getYieldWaterUsage() - appSmsDataDto.getWaterUsage();
  63. if (appSmsDataDto.getYieldWaterUsage() != null && appSmsDataDto.getYieldWaterUsage() != 0d) {
  64. appSmsDataDto.setWaterFeeRecoveryRate(BigDecimal.valueOf(amount).divide(BigDecimal.valueOf(appSmsDataDto.getYieldWaterUsage()), 3, BigDecimal.ROUND_HALF_UP).doubleValue() * 100);
  65. }
  66. break;
  67. }
  68. return appSmsDataDto;
  69. }
  70. /**
  71. * 今日统计量
  72. * @param typeName 类型名称(水源、水厂、泵站、售水)
  73. * @param id 场景ID
  74. * @return
  75. */
  76. private List<SceneDataDto> getTotalAmount(String typeName,Long id) {
  77. List<SceneDataDto> sceneDataDtos = new ArrayList<>();
  78. switch (typeName) {
  79. case "水源":
  80. SceneDataDto item1 = new SceneDataDto();
  81. item1.setMonitorName("今日取水量");
  82. item1.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 4, 1).doubleValue() + "m³");
  83. sceneDataDtos.add(item1);
  84. SceneDataDto item2 = new SceneDataDto();
  85. item2.setMonitorName("今日耗电量");
  86. item2.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 5, 1).doubleValue() + "kw");
  87. sceneDataDtos.add(item2);
  88. break;
  89. case "水厂":
  90. SceneDataDto item5 = new SceneDataDto();
  91. item5.setMonitorName("今日进水量");
  92. item5.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 4, 1).doubleValue() + "m³");
  93. sceneDataDtos.add(item5);
  94. SceneDataDto item3 = new SceneDataDto();
  95. item3.setMonitorName("今日制水量");
  96. item3.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 3, 1).doubleValue() + "m³");
  97. sceneDataDtos.add(item3);
  98. SceneDataDto item4 = new SceneDataDto();
  99. item4.setMonitorName("今日耗电量");
  100. item4.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 5, 1).doubleValue() + "kw");
  101. sceneDataDtos.add(item4);
  102. SceneDataDto item6 = new SceneDataDto();
  103. item6.setMonitorName("今日耗药量");
  104. item6.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 6, 1).doubleValue() + "kg");
  105. sceneDataDtos.add(item6);
  106. break;
  107. case "泵站":
  108. SceneDataDto item7 = new SceneDataDto();
  109. item7.setMonitorName("今日进水量");
  110. item7.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 4, 1).doubleValue() + "m³");
  111. sceneDataDtos.add(item7);
  112. SceneDataDto item8 = new SceneDataDto();
  113. item8.setMonitorName("今日供水量");
  114. item8.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 3, 1).doubleValue() + "m³");
  115. sceneDataDtos.add(item8);
  116. SceneDataDto item9 = new SceneDataDto();
  117. item9.setMonitorName("今日耗电量");
  118. item9.setMonitorValue(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 5, 1).doubleValue() + "kw");
  119. sceneDataDtos.add(item9);
  120. break;
  121. }
  122. return sceneDataDtos;
  123. }
  124. /**
  125. * 工艺场景(详情)
  126. * @param typeName 类型名称(水源、水厂、泵站、售水)
  127. * @param id 场景ID
  128. * @return
  129. */
  130. public SceneDataForAppDto getSceneDataForApp(String typeName,Long id) {
  131. SceneDataForAppDto returnInfo = new SceneDataForAppDto();
  132. SceneEntity sceneEntity = sceneService.findSceneByIdForApp(id);
  133. if (sceneEntity != null) {
  134. returnInfo.setAddress(sceneEntity.getAddress());
  135. returnInfo.setSceneName(sceneEntity.getSceneName());
  136. returnInfo.setImagePath(sceneEntity.getSceneImages().size() > 0 ? sceneEntity.getSceneImages().get(0).getImagePath() : null);
  137. if (sceneEntity.getParentSceneId().equals("0")) {
  138. List<SceneDataDto> sceneDataDtos = getTotalAmount(typeName, id);
  139. returnInfo.getInfos().addAll(sceneDataDtos);
  140. }
  141. } else {
  142. return null;
  143. }
  144. List<SceneDataDto> sceneDataDtos = new ArrayList<>();
  145. List<String> deviceCodes = new ArrayList<>();
  146. //查询到所有的测点信息
  147. List<DeviceParmEntity> deviceParmEntities = deviceParmService.selectByScendId(id.intValue());
  148. Map<String, List<AlarmDetailsDto>> alarms = new HashMap<>();
  149. Map<String, List<DeviceParmEntity>> parmMap = new HashMap<>();
  150. for (DeviceParmEntity deviceParmEntity : deviceParmEntities) {
  151. if (!deviceCodes.contains(deviceParmEntity.getDeviceCode())) {
  152. deviceCodes.add(deviceParmEntity.getDeviceCode());
  153. //查询报警信息
  154. List<AlarmDetailsDto> alarmDetailsDtos = alarmDetailsService.selectByDeviceId(deviceParmEntity.getDeviceId());
  155. alarms.put(deviceParmEntity.getDeviceCode(), alarmDetailsDtos);
  156. List<DeviceParmEntity> deviceParms = new ArrayList<>();
  157. deviceParms.add(deviceParmEntity);
  158. parmMap.put(deviceParmEntity.getDeviceCode(), deviceParms);
  159. } else {
  160. parmMap.get(deviceParmEntity.getDeviceId()).add(deviceParmEntity);
  161. }
  162. }
  163. for (String deveiceCode : deviceCodes) {
  164. byte[] bytes = redisUtil.get(("sms_water_" + deveiceCode).getBytes());
  165. //将报警信息放置map中
  166. Map<Integer, AlarmDetailsDto> mapAlarm = new HashMap<>();
  167. List<AlarmDetailsDto> alarmDetailsDtos = alarms.get(deveiceCode);
  168. mapAlarm = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAttributeId, a -> a, (k1, k2) -> k1));
  169. //将缓存中的实时数据放到map中方便进行遍历
  170. if (bytes != null && bytes.length > 0) {
  171. MonitorDataEntity monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
  172. Map<Long, MonitorDataValueEntity> map = new HashMap<>();
  173. returnInfo.setCollectDate(monitorDataEntity.getCollectDate());
  174. //将缓存中的实时数据放到map中方便进行遍历
  175. map = monitorDataEntity.getDataValues().stream().collect(Collectors.toMap(MonitorDataValueEntity::getAttributeId, a -> a, (k1, k2) -> k1));
  176. for (DeviceParmEntity item : parmMap.get(deveiceCode)) {
  177. SceneDataDto sceneDataDto = new SceneDataDto();
  178. sceneDataDto.setMonitorName(item.getAttributeName());
  179. //按属性ID查询标签值
  180. DeviceAttributeSpecsEntity deviceAttributeSpecsEntity = new DeviceAttributeSpecsEntity();
  181. deviceAttributeSpecsEntity.setAttributeId(Long.valueOf(item.getAttributeId()));
  182. List<DeviceAttributeSpecsEntity> deviceAttributeSpecsEntities = deviceAttributeSpecsService.findList(deviceAttributeSpecsEntity);
  183. if (map.containsKey(item.getAttributeId())) {
  184. Double value = map.get(item.getAttributeId()).getDataValue();
  185. if (deviceAttributeSpecsEntities.size() > 0) {
  186. if (value != null) {
  187. for (DeviceAttributeSpecsEntity specsEntity : deviceAttributeSpecsEntities)
  188. if (Integer.valueOf(specsEntity.getSpecsValue()) == value.intValue()) {
  189. sceneDataDto.setMonitorValue(specsEntity.getSpecsName());
  190. }
  191. }
  192. } else {
  193. if (value != null) {
  194. sceneDataDto.setMonitorValue(String.format("%.3f", map.get(item.getAttributeId()).getDataValue()) + (StringUtils.isNotEmpty(map.get(item.getAttributeId()).getUnit()) ? map.get(item.getAttributeId()).getUnit() : ""));
  195. }
  196. }
  197. }
  198. //判断是否报警
  199. if (mapAlarm.containsKey(item.getAttributeId().intValue()))
  200. sceneDataDto.setIsAlarm(1);
  201. else
  202. sceneDataDto.setIsAlarm(0);
  203. sceneDataDtos.add(sceneDataDto);
  204. }
  205. }
  206. }
  207. returnInfo.setInfos(sceneDataDtos);
  208. return returnInfo;
  209. }
  210. }