AppDataService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. @Autowired
  37. private DeviceAttributeService deviceAttributeService;
  38. /**
  39. * 查询场景信息
  40. *
  41. * @param typeName 类型名称(水源、水厂、泵站、售水)
  42. * @return
  43. */
  44. public AppSmsDataDto getProductionDataForSameMonth(String typeName) {
  45. //3用水量or供水量or制水量 4 取水量or进水量 5耗电量 6耗药量
  46. AppSmsDataDto appSmsDataDto = new AppSmsDataDto();
  47. switch (typeName) {
  48. case "水源":
  49. appSmsDataDto.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, null, typeName, 4, 2).divide(BigDecimal.valueOf(10000)).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  50. appSmsDataDto.setPowerUsage(monitorDataReportService.getAmountCount(null, null, typeName, 5, 2).divide(BigDecimal.valueOf(10000)).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  51. break;
  52. case "水厂":
  53. appSmsDataDto.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, null, typeName, 3, 2).divide(BigDecimal.valueOf(10000)).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  54. appSmsDataDto.setPowerUsage(monitorDataReportService.getAmountCount(null, null, typeName, 5, 2).divide(BigDecimal.valueOf(10000)).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  55. appSmsDataDto.setDrugUsage(monitorDataReportService.getAmountCount(null, null, typeName, 6, 2).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  56. break;
  57. case "泵站":
  58. appSmsDataDto.setYieldWaterUsage(monitorDataReportService.getAmountCount(null, null, typeName, 3, 2).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  59. appSmsDataDto.setPowerUsage(monitorDataReportService.getAmountCount(null, null, typeName, 5, 2).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  60. break;
  61. case "售水":
  62. appSmsDataDto.setYieldWaterUsage(monitorDataReportService.getAmountCount(null, null, "水厂", 3, 2).divide(BigDecimal.valueOf(10000)).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
  63. appSmsDataDto.setWaterUsage(monitorDataReportService.getUseAmount(null, 1).setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue());
  64. double amount = appSmsDataDto.getYieldWaterUsage() - appSmsDataDto.getWaterUsage();
  65. if (appSmsDataDto.getYieldWaterUsage() != null && appSmsDataDto.getYieldWaterUsage() != 0d) {
  66. appSmsDataDto.setWaterFeeRecoveryRate(BigDecimal.valueOf(amount).divide(BigDecimal.valueOf(appSmsDataDto.getYieldWaterUsage()),5,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
  67. }
  68. break;
  69. }
  70. return appSmsDataDto;
  71. }
  72. /**
  73. * 获取总量信息
  74. * @param typeName
  75. * @param id
  76. * @return
  77. */
  78. public void getTotalAmount(SceneDataForAppDto returnInfo,String typeName,Long id) {
  79. switch (typeName) {
  80. case "水源":
  81. returnInfo.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 4, 1).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue() + "万m³");
  82. returnInfo.setPowerUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 5, 1).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue() + "万kw");
  83. break;
  84. case "水厂":
  85. returnInfo.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 4, 1).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue() + "万m³");
  86. returnInfo.setYieldWaterUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 3, 1).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue() + "万m³");
  87. returnInfo.setPowerUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 5, 1).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue() + "万kw");
  88. returnInfo.setDrugUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 6, 1).doubleValue() + "kg");
  89. break;
  90. case "泵站":
  91. returnInfo.setIntakeWaterUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 4, 1).setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue() + "m³");
  92. returnInfo.setYieldWaterUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 3, 1).setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue() + "m³");
  93. returnInfo.setPowerUsage(monitorDataReportService.getAmountCount(null, id.intValue(), typeName, 5, 1).setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue() + "kw");
  94. break;
  95. }
  96. }
  97. /**
  98. * 工艺场景(详情)
  99. * @param typeName 类型名称(水源、水厂、泵站、售水)
  100. * @param id 场景ID
  101. * @return
  102. */
  103. public SceneDataForAppDto getSceneDataForApp(String typeName,Long id) {
  104. SceneDataForAppDto returnInfo = new SceneDataForAppDto();
  105. SceneEntity sceneEntity = sceneService.findSceneByIdForApp(id);
  106. if (sceneEntity != null) {
  107. returnInfo.setAddress(sceneEntity.getAddress());
  108. returnInfo.setSceneName(sceneEntity.getSceneName());
  109. returnInfo.setImagePath(sceneEntity.getSceneImages().size() > 0 ? sceneEntity.getSceneImages().get(0).getImagePath() : null);
  110. getTotalAmount(returnInfo,typeName,id);
  111. } else {
  112. return null;
  113. }
  114. List<SceneDataDto> sceneDataDtos = new ArrayList<>();
  115. List<String> deviceCodes = new ArrayList<>();
  116. //查询到所有的测点信息
  117. List<DeviceParmEntity> deviceParmEntities = deviceParmService.selectByScendId(id.intValue());
  118. Map<String, List<AlarmDetailsDto>> alarms = new HashMap<>();
  119. Map<String, List<DeviceParmEntity>> parmMap = new HashMap<>();
  120. for (DeviceParmEntity deviceParmEntity : deviceParmEntities) {
  121. if (!deviceCodes.contains(deviceParmEntity.getDeviceCode())) {
  122. deviceCodes.add(deviceParmEntity.getDeviceCode());
  123. //查询报警信息
  124. List<AlarmDetailsDto> alarmDetailsDtos = alarmDetailsService.selectByDeviceId(id,deviceParmEntity.getDeviceId());
  125. alarms.put(deviceParmEntity.getDeviceCode(), alarmDetailsDtos);
  126. List<DeviceParmEntity> deviceParms = new ArrayList<>();
  127. deviceParms.add(deviceParmEntity);
  128. parmMap.put(deviceParmEntity.getDeviceCode(), deviceParms);
  129. } else {
  130. parmMap.get(deviceParmEntity.getDeviceCode()).add(deviceParmEntity);
  131. }
  132. }
  133. for (String deveiceCode : deviceCodes) {
  134. byte[] bytes = redisUtil.get(("sms_water_" + deveiceCode).getBytes());
  135. //将报警信息放置map中
  136. Map<Integer, AlarmDetailsDto> mapAlarm = new HashMap<>();
  137. List<AlarmDetailsDto> alarmDetailsDtos = alarms.get(deveiceCode);
  138. mapAlarm = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAttributeId, a -> a, (k1, k2) -> k1));
  139. //将缓存中的实时数据放到map中方便进行遍历
  140. if (bytes != null && bytes.length > 0) {
  141. MonitorDataEntity monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
  142. Map<Long, MonitorDataValueEntity> map = new HashMap<>();
  143. returnInfo.setCollectDate(monitorDataEntity.getCollectDate());
  144. //将缓存中的实时数据放到map中方便进行遍历
  145. map = monitorDataEntity.getDataValues().stream().collect(Collectors.toMap(MonitorDataValueEntity::getAttributeId, a -> a, (k1, k2) -> k1));
  146. for (DeviceParmEntity item : parmMap.get(deveiceCode)) {
  147. SceneDataDto sceneDataDto = new SceneDataDto();
  148. sceneDataDto.setMonitorName(item.getAttributeName());
  149. //按属性ID查询标签值
  150. DeviceAttributeSpecsEntity deviceAttributeSpecsEntity = new DeviceAttributeSpecsEntity();
  151. deviceAttributeSpecsEntity.setAttributeId(Long.valueOf(item.getAttributeId()));
  152. List<DeviceAttributeSpecsEntity> deviceAttributeSpecsEntities = deviceAttributeSpecsService.findList(deviceAttributeSpecsEntity);
  153. if (map.containsKey(item.getAttributeId().longValue())) {
  154. Double value = map.get(item.getAttributeId().longValue()).getDataValue();
  155. if (value != null) {
  156. if (deviceAttributeSpecsEntities.size() > 0) {
  157. for (DeviceAttributeSpecsEntity specsEntity : deviceAttributeSpecsEntities)
  158. if (Integer.valueOf(specsEntity.getSpecsValue()) == value.intValue()) {
  159. sceneDataDto.setMonitorValue(specsEntity.getSpecsName());
  160. }
  161. } else {
  162. DeviceAttributeEntity deviceAttributeEntity = deviceAttributeService.getById(item.getAttributeId());
  163. String unit = "";
  164. if (deviceAttributeEntity != null && deviceAttributeEntity.getUnit() != null)
  165. unit = deviceAttributeEntity.getUnit();
  166. sceneDataDto.setMonitorValue(String.format("%.3f", map.get(item.getAttributeId().longValue()).getDataValue()) + unit);
  167. }
  168. }
  169. }
  170. //判断是否报警
  171. if (mapAlarm.containsKey(item.getAttributeId().intValue()))
  172. sceneDataDto.setIsAlarm(1);
  173. else
  174. sceneDataDto.setIsAlarm(0);
  175. sceneDataDtos.add(sceneDataDto);
  176. }
  177. }else
  178. {
  179. for (DeviceParmEntity item : parmMap.get(deveiceCode)) {
  180. SceneDataDto sceneDataDto = new SceneDataDto();
  181. sceneDataDto.setMonitorName(item.getAttributeName());
  182. sceneDataDtos.add(sceneDataDto);
  183. }
  184. }
  185. }
  186. returnInfo.setInfos(sceneDataDtos);
  187. return returnInfo;
  188. }
  189. }