DeviceStatusServiceImpl.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.xy.service;
  2. import cn.hutool.json.JSONUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.xy.config.DeviceThreadPoolConfig;
  6. import com.xy.dbmapper.SyncUpdate;
  7. import com.xy.device.EnumDevcieDoorStatus;
  8. import com.xy.device.EnumDeviceTempConfig;
  9. import com.xy.dto.ActivityInfoDto;
  10. import com.xy.dto.DeviceEventMsgDto;
  11. import com.xy.dto.DeviceStatusDto;
  12. import com.xy.dto.DeviceTempRecordsDto;
  13. import com.xy.entity.DeviceConfig;
  14. import com.xy.entity.DeviceStatus;
  15. import com.xy.entity.DeviceSysinfo;
  16. import com.xy.mapper.DeviceStatusMapper;
  17. import com.xy.mapper.entity.DeviceStatusCount;
  18. import com.xy.utils.*;
  19. import com.xy.utils.enums.DeviceErrorRecordTypesEnum;
  20. import io.swagger.annotations.Api;
  21. import io.swagger.annotations.ApiOperation;
  22. import lombok.AllArgsConstructor;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.web.bind.annotation.PostMapping;
  26. import org.springframework.web.bind.annotation.RequestBody;
  27. import java.math.BigDecimal;
  28. import java.time.LocalDateTime;
  29. import java.util.List;
  30. import static com.xy.utils.Beans.copy;
  31. /**
  32. * <p>
  33. * 设备-状态 服务实现类
  34. * </p>
  35. *
  36. * @author lijin
  37. * @since 2022-12-23
  38. */
  39. @Service
  40. @AllArgsConstructor
  41. @Slf4j
  42. @Api(tags = "设备-状态")
  43. public class DeviceStatusServiceImpl extends ServiceImpl<DeviceStatusMapper, DeviceStatus> implements DeviceStatusService {
  44. private DeviceTempRecordsServiceImpl deviceTempRecordsService;
  45. private ActivityInfoService activityInfoService;
  46. private DeviceConfigServiceImpl deviceConfigService;
  47. private DeviceEventMsgService deviceEventMsgService;
  48. private RedisService<Integer> redisService;
  49. private DeviceSysinfoServiceImpl deviceSysinfoService;
  50. @Override
  51. @ApiOperation("上报信息")
  52. public R up(DeviceStatusDto.Up up) {
  53. log.info("设备信息上报:{}", JSONUtil.toJsonStr(up));
  54. DeviceStatus deviceStatusInfo = getById(up.getDeviceId());
  55. if (deviceStatusInfo == null) {
  56. return R.ok();
  57. }
  58. DeviceStatus deviceStatus = copy(DeviceStatus.class, up).setUpdateTime(LocalDateTime.now());
  59. updateById(deviceStatus);
  60. //温度上报
  61. if (Emptys.check(deviceStatus.getTempValue())) {
  62. DeviceSysinfo deviceSysinfo = deviceSysinfoService.getById(up.getDeviceId());
  63. //添加设备温度日志
  64. if (deviceSysinfo.getIsHaveTemp()) {
  65. DeviceTempRecordsDto.Save save = new DeviceTempRecordsDto.Save()
  66. .setDeviceId(up.getDeviceId());
  67. save.setTempValue(deviceStatus.getTempValue());
  68. deviceTempRecordsService.save(save);
  69. //查询设备配置
  70. DeviceConfig deviceConfig = deviceConfigService.getById(deviceStatus.getDeviceId());
  71. Integer tempMax = deviceConfig.getTempMax();
  72. Integer tempMin = deviceConfig.getTempMin();
  73. //温度有异常
  74. String key = String.format("device_temp_error:%s:%s", deviceStatus.getDeviceId(), deviceStatus.getTempValue() >= tempMax ? "max" : "min");
  75. if (deviceStatus.getTempValue() > tempMax || deviceStatus.getTempValue() < tempMin) {
  76. //校验异常次数
  77. Integer errorSize = SysDictUtils.getValue(EnumDeviceTempConfig.Code.CODE.getCode(), EnumDeviceTempConfig.ERROR_SIZE.getCode(), Integer.class);
  78. boolean fal = false;
  79. Integer maxSize = redisService.get(key);
  80. if (maxSize == null) {
  81. redisService.set(key, 1, 60 * 60);
  82. } else {
  83. if (maxSize >= errorSize) {
  84. fal = true;
  85. redisService.remove(key);
  86. } else {
  87. redisService.set(key, maxSize + 1, 60 * 60);
  88. }
  89. }
  90. //添加事件
  91. if (fal) {
  92. DeviceEventMsgDto.Save deviceEventMsg = new DeviceEventMsgDto.Save()
  93. .setDeviceId(deviceStatus.getDeviceId());
  94. deviceEventMsg.setCode(DeviceErrorRecordTypesEnum.T.getCode());
  95. String msg = "温度异常-温度阈值%d,当前温度%d";
  96. if (deviceStatus.getTempValue() >= tempMax) {
  97. deviceEventMsg.setMsg(String.format(msg, tempMax, deviceStatus.getTempValue()));
  98. }
  99. if (deviceStatus.getTempValue() <= tempMin) {
  100. deviceEventMsg.setMsg(String.format(msg, tempMin, deviceStatus.getTempValue()));
  101. }
  102. deviceEventMsgService.save(deviceEventMsg);
  103. }
  104. } else {
  105. redisService.remove(key);
  106. }
  107. }
  108. }
  109. //上报关门
  110. if (Emptys.check(deviceStatus.getDoorStateL())) {
  111. Integer value = SysDictUtils.getValue(EnumDevcieDoorStatus.Code.CODE.getCode(), EnumDevcieDoorStatus.LOCKED.getCode(), Integer.class);
  112. if (deviceStatus.getDoorStateL().equals(value)) {
  113. ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, 1)
  114. .execute(() -> activityInfoService.abort(new ActivityInfoDto.Abort()
  115. .setDeviceId(up.getDeviceId())
  116. .setWorkType(2)
  117. .setTimeout(60 * 1)
  118. ));
  119. }
  120. }
  121. return R.ok();
  122. }
  123. @Override
  124. @ApiOperation("开关门")
  125. public R door(DeviceStatusDto.Door door) {
  126. DeviceStatus deviceStatus = copy(DeviceStatus.class, door).setUpdateTime(LocalDateTime.now());
  127. updateById(deviceStatus);
  128. return R.ok();
  129. }
  130. /**
  131. * 修改库存
  132. *
  133. * @return
  134. */
  135. public R upStock(long deviceId, int stock) {
  136. DeviceStatus deviceStatusInfo = getById(deviceId);
  137. if (deviceStatusInfo == null) {
  138. return R.ok();
  139. }
  140. new SyncUpdate().update(DeviceStatus.class)
  141. .set(DeviceStatus::getStock, new BigDecimal(stock))
  142. .udateDateTime(DeviceStatus::getUpdateTime)
  143. .eq(DeviceStatus::getDeviceId, deviceId)
  144. .exec();
  145. return R.ok();
  146. }
  147. @Override
  148. @ApiOperation("更新联网状态")
  149. public R updateNetState(DeviceStatusDto.UpdateNetState dto) {
  150. updateById(new DeviceStatus().setDeviceId(dto.getDeviceId()).setNetState(dto.getNetState()));
  151. return R.ok();
  152. }
  153. @PostMapping("obj")
  154. @ApiOperation("对象查询")
  155. public R<DeviceStatusDto.Vo> obj(@RequestBody DeviceStatusDto.Vo vo) {
  156. LambdaQueryWrapper<DeviceStatus> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(vo, DeviceStatus.class).build();
  157. List<DeviceStatus> list = list(lambdaQueryWrapper);
  158. if (!Emptys.check(list)) {
  159. return R.ok();
  160. }
  161. return R.ok(copy(DeviceStatusDto.Vo.class, list.get(0)));
  162. }
  163. @PostMapping("list")
  164. @ApiOperation("集合查询")
  165. public R<List<DeviceStatusDto.Vo>> list(@RequestBody DeviceStatusDto.SelectList selectList) {
  166. LambdaQueryWrapper<DeviceStatus> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceStatus.class)
  167. .in(DeviceStatus::getDeviceId, selectList.getDeviceIds())
  168. .build();
  169. List<DeviceStatus> list = list(lambdaQueryWrapper);
  170. return R.ok(copy(DeviceStatusDto.Vo.class, list));
  171. }
  172. @PostMapping("statusCount")
  173. @ApiOperation("统计状态数量")
  174. public R<DeviceStatusCount> statusCount() {
  175. DeviceStatusCount deviceStatusCount = baseMapper.statusCount();
  176. return R.ok(deviceStatusCount);
  177. }
  178. }