TianJinMeterReadingServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package com.huaxu.zoniot.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.huaxu.zoniot.common.Constants;
  4. import com.huaxu.zoniot.common.ErrorConstants;
  5. import com.huaxu.zoniot.common.ResultStatus;
  6. import com.huaxu.zoniot.common.ServiceException;
  7. import com.huaxu.zoniot.dao.CustomerMapper;
  8. import com.huaxu.zoniot.dao.WaterMeterMapper;
  9. import com.huaxu.zoniot.dto.RegistIMEIRequest;
  10. import com.huaxu.zoniot.dto.RespData;
  11. import com.huaxu.zoniot.dto.RtnData;
  12. import com.huaxu.zoniot.entity.*;
  13. import com.huaxu.zoniot.repository.MeterReadRecordRepository;
  14. import com.huaxu.zoniot.service.BuildingService;
  15. import com.huaxu.zoniot.service.CommunityService;
  16. import com.huaxu.zoniot.service.TianJinMeterReadingService;
  17. import com.huaxu.zoniot.service.WaterMeterService;
  18. import io.swagger.annotations.Api;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.data.mongodb.core.MongoTemplate;
  24. import org.springframework.data.mongodb.core.query.Criteria;
  25. import org.springframework.data.mongodb.core.query.Query;
  26. import org.springframework.stereotype.Service;
  27. import java.util.*;
  28. /**
  29. * <p></p>
  30. *
  31. * @Author wilian.peng
  32. * @Date 2021/1/8 14:42
  33. * @Version 1.0
  34. */
  35. @Slf4j
  36. @Service
  37. public class TianJinMeterReadingServiceImpl implements TianJinMeterReadingService {
  38. @Autowired
  39. WaterMeterMapper waterMeterMapper ;
  40. @Autowired
  41. CustomerMapper customerMapper ;
  42. @Value("${province.code}")
  43. Integer provinceCode ;
  44. @Value("${city.code}")
  45. Integer cityCode ;
  46. @Value("${region.code}")
  47. Integer regionCode ;
  48. @Value("${customer.code}")
  49. Integer customerCode ;
  50. @Value("${device.type.code}")
  51. Integer deviceTypeCode ;
  52. @Autowired
  53. MeterReadRecordRepository meterReadRecordRepository ;
  54. @Autowired
  55. CommunityService communityService ;
  56. @Autowired
  57. BuildingService buildingService ;
  58. @Autowired
  59. WaterMeterService waterMeterService ;
  60. @Autowired
  61. MongoTemplate mongoTemplate ;
  62. @Override
  63. public RespData registImei(RegistIMEIRequest request) {
  64. RespData respData = new RespData() ;
  65. try {
  66. // 1,保存小区信息
  67. String smallZone = request.getSmallZone();
  68. Community community = saveCommunity(smallZone);
  69. // 2,保存建筑信息
  70. Building building = saveBuilding(smallZone, community);
  71. // 3,保存设备
  72. WaterMeter waterMeter = new WaterMeter();
  73. waterMeter.setBuildingId(building.getId());
  74. waterMeter.setDeviceNo(request.getImei());
  75. waterMeter.setMeterNo(request.getRegistNo());
  76. waterMeter.setMeterFileNo(request.getCustomerNo());
  77. waterMeter.setLocation(request.getLocation());
  78. waterMeter.setDeviceTypeId(deviceTypeCode);
  79. waterMeter.setSiteId(community.getSiteId());
  80. waterMeter.setCustomerId(community.getCustomerId());
  81. waterMeter.setProvince(community.getProvince());
  82. waterMeter.setCity(community.getCity());
  83. waterMeter.setRegion(community.getRegion());
  84. waterMeter.setCommunity(community.getId());
  85. waterMeter.setCreateBy("system");
  86. saveWaterMeter(waterMeter) ;
  87. respData.setRtnId(RespData.SUCCESS);
  88. respData.setMsg(ErrorConstants.SUCCESS_REGIST);
  89. }catch (Exception e){
  90. e.printStackTrace();
  91. log.error("设备注册失败",e);
  92. respData.setRtnId(RespData.FAIL);
  93. if(e instanceof ServiceException){
  94. respData.setMsg(e.getMessage());
  95. }
  96. else{
  97. respData.setMsg(ResultStatus.SERVICE_ERROR.getMessage());
  98. }
  99. }
  100. return respData;
  101. }
  102. protected Community saveCommunity(String smallZone){
  103. Community param = new Community();
  104. param.setName(smallZone);
  105. param.setSiteId(1);
  106. param.setCustomerId(customerCode);
  107. param.setProvince(provinceCode);
  108. param.setCity(cityCode);
  109. param.setRegion(regionCode);
  110. return communityService.saveCommunity(param);
  111. }
  112. protected Building saveBuilding(String smallZone,Community community){
  113. Building param = new Building() ;
  114. param.setName(smallZone);
  115. param.setCommunity(community.getId());
  116. param.setProvince(community.getProvince());
  117. param.setCity(community.getCity());
  118. param.setRegion(community.getRegion());
  119. param.setSiteId(community.getSiteId());
  120. return buildingService.saveBuilding(param);
  121. }
  122. protected WaterMeter saveWaterMeter(WaterMeter waterMeter){
  123. return waterMeterService.saveWaterWaterMeter(waterMeter) ;
  124. }
  125. @Override
  126. public RespData queryReadRecordData(String[] imeiArray,Integer readDay){
  127. if(readDay == null){
  128. // 默认查询今天的
  129. readDay = Integer.parseInt(DateUtil.format(DateUtil.date(),
  130. Constants.DEFAULT_METER_READ_DATE_FORMAT));
  131. }
  132. RespData respData = new RespData();
  133. List<String> deviceNoList = Arrays.asList(imeiArray);
  134. List<Integer> customerIds = findCustomerIdsWithChildren(customerCode);
  135. List<WaterMeter> waterMeterList = waterMeterService.findWaterMeterListWithChildrenCustomer(deviceNoList,
  136. customerCode);
  137. Criteria criteria = Criteria.where("readDate").is(readDay)
  138. .and("status").is(1)
  139. .and("readStatus").is("2")
  140. .and("deviceNo").in(deviceNoList);
  141. Query query = new Query();
  142. query.addCriteria(criteria);
  143. List<MeterReadRecord> meterReadRecords = mongoTemplate.find(query, MeterReadRecord.class);
  144. List<RtnData> rtnDataList = new ArrayList<>();
  145. Map<String, WaterMeter> waterMeterMap = transformWaterMeterList(waterMeterList);
  146. Map<String, MeterReadRecord> meterReadRecordMap = transformMeterReadRecordList(meterReadRecords);
  147. for(String imei : imeiArray){
  148. RtnData rtnData = new RtnData();
  149. rtnData.setECUID(imei);
  150. // 获取水表信息
  151. WaterMeter waterMeter = waterMeterMap.get(imei);
  152. if(waterMeter != null){
  153. MeterReadRecord meterReadRecord = meterReadRecordMap.get(imei);
  154. rtnData.setECURegDate(DateUtil.format(waterMeter.getDateCreate(), "yyyy-MM-dd HH:mm:ss"));
  155. if(meterReadRecord != null){
  156. buildRtnData(meterReadRecord,rtnData);
  157. }
  158. else {
  159. rtnData.setECUState(RtnData.STATE_NO_DATA);
  160. rtnData.setMessage(ErrorConstants.NO_DATA_ERROR);
  161. }
  162. }
  163. else{
  164. rtnData.setECUState(RtnData.STATE_NO_DEVICE);
  165. rtnData.setMessage(ErrorConstants.NO_DEVICE_ERROR);
  166. }
  167. rtnDataList.add(rtnData);
  168. }
  169. respData.setRtnId(RespData.SUCCESS);
  170. respData.setRtnData(rtnDataList);
  171. return respData;
  172. }
  173. protected void buildRtnData(MeterReadRecord meterReadRecord,RtnData rtnData){
  174. // 获取如下信息:基站ID-->cellID,电池电量,信号强度-->CSQ,阀门状态,水表状态,水表状态信息
  175. Map<String, String> lastSendData = meterReadRecord.getLastSendData();
  176. String valveState = lastSendData.get("valveState");
  177. rtnData.setValve(valveState);
  178. String batteryQuantity = lastSendData.get("batteryQuantity");
  179. rtnData.setBatteryVotage(batteryQuantity);
  180. String cellId = lastSendData.get("cellId");
  181. rtnData.setBaseStationID(cellId);
  182. String rspr = lastSendData.get("RSPR");
  183. rtnData.setSignalIntensity(rspr);
  184. List<String> stateList = processWaterMeterState(lastSendData);
  185. String state = stateList.get(0);
  186. rtnData.setECUState(state);
  187. if(!RtnData.STATE_NORMAL.equals(state)){
  188. String warnMessage = stateList.get(1);
  189. rtnData.setMessage(warnMessage);
  190. }
  191. // 获取抄表时间,格式:yyyy-MM-dd
  192. Date readTime = meterReadRecord.getReadTime();
  193. rtnData.setRXDDate(DateUtil.format(readTime, "yyyy-MM-dd HH:mm:ss"));
  194. // 表盘读数,原数据
  195. rtnData.setRXDReading(meterReadRecord.getReadData());
  196. // 抄表止度,向下取整
  197. rtnData.setReading(String.valueOf(
  198. ((Double)Math.floor(
  199. Double.parseDouble(meterReadRecord.getReadData()))).intValue()));
  200. rtnData.setMessage("正常");
  201. }
  202. /**
  203. * 返回数据格式第一位为是否告警,0:正常,1:有告警
  204. * 第二位告警信息,多个告警信息拼接一起
  205. * @param data
  206. * @return
  207. */
  208. protected List<String> processWaterMeterState(Map<String, String> data){
  209. List<String> result = new ArrayList<>();
  210. // 以下报警信息均,0:正常,1:报警
  211. String meterState = "0";
  212. StringBuffer waringMessage = new StringBuffer();
  213. // 低电告警
  214. String lowVoltageWarning = data.get("lowVoltageWarning");
  215. if(RtnData.ALARM_STATE_ERROR.equals(lowVoltageWarning)){
  216. waringMessage.append("低电告警,");
  217. meterState = "1";
  218. }
  219. // 磁干扰告警
  220. String magneticInterWarning = data.get("magneticInterWarning");
  221. if(RtnData.ALARM_STATE_ERROR.equals(magneticInterWarning)){
  222. waringMessage.append("磁干扰告警,");
  223. meterState = "1";
  224. }
  225. // 电子模块分离告警
  226. String eleModuleWarning = data.get("eleModuleWarning");
  227. if(RtnData.ALARM_STATE_ERROR.equals(eleModuleWarning)){
  228. waringMessage.append("电子模块分离告警,");
  229. meterState = "1";
  230. }
  231. // 过流告警
  232. String overCurrentWarning = data.get("overCurrentWarning");
  233. if(RtnData.ALARM_STATE_ERROR.equals(overCurrentWarning)){
  234. waringMessage.append("过流告警,");
  235. meterState = "1";
  236. }
  237. // 反流告警
  238. String refluxWarningQuantity = data.get("refluxWarningQuantity");
  239. if(RtnData.ALARM_STATE_ERROR.equals(refluxWarningQuantity)){
  240. waringMessage.append("反流告警,");
  241. meterState = "1";
  242. }
  243. // 阀门异常告警
  244. String valveWaring = data.get("valveWaring");
  245. if(RtnData.ALARM_STATE_ERROR.equals(valveWaring)){
  246. waringMessage.append("阀门异常告警,");
  247. meterState = "1";
  248. }
  249. result.add(meterState);
  250. String waringString = waringMessage.toString();
  251. if(StringUtils.isNotBlank(waringString)){
  252. result.add(waringString.substring(0,waringString.length()-1));
  253. }
  254. return result ;
  255. }
  256. protected Map<String, WaterMeter> transformWaterMeterList(List<WaterMeter> waterMeterList){
  257. Map<String , WaterMeter> waterMeterMap = new HashMap<>(waterMeterList.size());
  258. for(WaterMeter waterMeter : waterMeterList ){
  259. waterMeterMap.put(waterMeter.getDeviceNo(), waterMeter);
  260. }
  261. return waterMeterMap ;
  262. }
  263. protected Map<String, MeterReadRecord> transformMeterReadRecordList(List<MeterReadRecord> meterReadRecordList){
  264. Map<String , MeterReadRecord> meterReadRecordMap = new HashMap<>(meterReadRecordList.size());
  265. for(MeterReadRecord meterReadRecord : meterReadRecordList){
  266. meterReadRecordMap.put(meterReadRecord.getDeviceNo(),meterReadRecord);
  267. }
  268. return meterReadRecordMap;
  269. }
  270. @Override
  271. public RespData queryImei(String imei) {
  272. RespData respData = new RespData();
  273. List<Integer> customerIds = findCustomerIdsWithChildren(customerCode);
  274. WaterMeter waterMeter = waterMeterMapper.findWaterMeterByDeviceNoAndCustomerList(imei,customerIds);
  275. if(waterMeter == null){
  276. // 设备未注册
  277. respData.setRtnId(RespData.SUCCESS);
  278. respData.setMsg(RespData.UN_REGIST);
  279. }
  280. else{
  281. respData.setRtnId(RespData.FAIL);
  282. respData.setMsg(RespData.REGISTED);
  283. }
  284. return respData;
  285. }
  286. /**
  287. * 查询公司及其分公司的ID
  288. * @param customerCode
  289. * @return
  290. */
  291. protected List<Integer> findCustomerIdsWithChildren(Integer customerCode){
  292. List<Integer> customerIds = new ArrayList<>();
  293. customerIds.add(customerCode);
  294. List<Customer> customers = customerMapper.selectByParentId(customerCode);
  295. customers.forEach(customer -> {
  296. customerIds.add(customer.getId());
  297. });
  298. return customerIds ;
  299. }
  300. }