DeviceInfoDataCache.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. /*
  2. * +----------------------------------------------------------------------
  3. * | Copyright (c) 奇特物联 2021-2022 All rights reserved.
  4. * +----------------------------------------------------------------------
  5. * | Licensed 未经许可不能去掉「奇特物联」相关版权
  6. * +----------------------------------------------------------------------
  7. * | Author: xw2sy@163.com
  8. * +----------------------------------------------------------------------
  9. */
  10. package cc.iotkit.data.service;
  11. import cc.iotkit.common.api.PageRequest;
  12. import cc.iotkit.common.api.Paging;
  13. import cc.iotkit.common.constant.Constants;
  14. import cc.iotkit.common.utils.JsonUtils;
  15. import cc.iotkit.data.cache.DeviceInfoCacheEvict;
  16. import cc.iotkit.data.cache.DeviceInfoCachePut;
  17. import cc.iotkit.data.manager.IDeviceInfoData;
  18. import cc.iotkit.model.device.DeviceInfo;
  19. import cc.iotkit.model.device.message.DevicePropertyCache;
  20. import cc.iotkit.model.stats.DataItem;
  21. import com.fasterxml.jackson.core.type.TypeReference;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.springframework.beans.factory.SmartInitializingSingleton;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.beans.factory.annotation.Qualifier;
  26. import org.springframework.cache.annotation.Cacheable;
  27. import org.springframework.data.redis.core.StringRedisTemplate;
  28. import org.springframework.stereotype.Service;
  29. import java.util.*;
  30. @Service
  31. @Qualifier("deviceInfoDataCache")
  32. public class DeviceInfoDataCache implements IDeviceInfoData, SmartInitializingSingleton {
  33. @Autowired
  34. private StringRedisTemplate redisTemplate;
  35. @Autowired
  36. private DeviceInfoCachePut deviceInfoCachePut;
  37. @Autowired
  38. private DeviceInfoCacheEvict deviceInfoCacheEvict;
  39. @Autowired
  40. private IDeviceInfoData deviceInfoData;
  41. @Override
  42. public void afterSingletonsInstantiated() {
  43. if ("true".equals(System.getProperty("disabledEmbeddedRedis"))) {
  44. return;
  45. }
  46. //需要等待缓存初始化
  47. Timer timer = new Timer();
  48. timer.schedule(new TimerTask() {
  49. @Override
  50. public void run() {
  51. //内嵌redis每次启动需要重新装载缓存
  52. int page = 1;
  53. Paging<DeviceInfo> paged;
  54. List<String> parentIds = new ArrayList<>();
  55. PageRequest<DeviceInfo> pageRequest = new PageRequest<>();
  56. pageRequest.setPageSize(1000);
  57. pageRequest.setPageNum(page);
  58. while (!(paged = deviceInfoData.findAll(pageRequest)).getRows().isEmpty()) {
  59. pageRequest.setPageNum(page++);
  60. List<DeviceInfo> devices = paged.getRows();
  61. for (DeviceInfo device : devices) {
  62. //装载设备信息缓存
  63. deviceInfoCachePut.findByDeviceId(device.getDeviceId(), device);
  64. deviceInfoCachePut.findByDeviceName(device.getDeviceName(), device);
  65. String parentId = device.getParentId();
  66. if (StringUtils.isBlank(parentId)) {
  67. parentIds.add(parentId);
  68. }
  69. }
  70. }
  71. //装载子设备id列表缓存
  72. for (String parentId : parentIds) {
  73. putSubDeviceIds(parentId);
  74. }
  75. }
  76. }, 100);
  77. }
  78. private String getPropertyCacheKey(String deviceId) {
  79. return String.format(Constants.PROPERTY_CACHE_KEY, deviceId);
  80. }
  81. @Override
  82. public void saveProperties(String deviceId, Map<String, DevicePropertyCache> properties) {
  83. Map<String, DevicePropertyCache> old = getProperties(deviceId);
  84. old.putAll(properties);
  85. redisTemplate.opsForValue().set(getPropertyCacheKey(deviceId), JsonUtils.toJsonString(old));
  86. }
  87. /**
  88. * 清除设备属性缓存
  89. */
  90. private void clearProperties(String deviceId) {
  91. redisTemplate.delete(getPropertyCacheKey(deviceId));
  92. }
  93. @Override
  94. public Map<String, DevicePropertyCache> getProperties(String deviceId) {
  95. String json = redisTemplate.opsForValue().get(getPropertyCacheKey(deviceId));
  96. if (StringUtils.isBlank(json)) {
  97. return new HashMap<>();
  98. }
  99. return JsonUtils.parseObject(json, new TypeReference<>() {
  100. });
  101. }
  102. @Override
  103. @Cacheable(value = Constants.CACHE_DEVICE_INFO, key = "#root.method.name+#deviceId", unless = "#result == null")
  104. public DeviceInfo findByDeviceId(String deviceId) {
  105. return deviceInfoData.findByDeviceId(deviceId);
  106. }
  107. @Override
  108. @Cacheable(value = Constants.CACHE_DEVICE_INFO, key = "#root.method.name+#deviceName", unless = "#result == null")
  109. public DeviceInfo findByDeviceName(String deviceName) {
  110. return deviceInfoData.findByDeviceName(deviceName);
  111. }
  112. @Override
  113. public List<DeviceInfo> findByParentId(String parentId) {
  114. return deviceInfoData.findByParentId(parentId);
  115. }
  116. @Override
  117. public List<DeviceInfo> findByProductNodeType(String uid) {
  118. return deviceInfoData.findByProductNodeType(uid);
  119. }
  120. @Override
  121. public boolean existByProductKey(String productKey) {
  122. return deviceInfoData.existByProductKey(productKey);
  123. }
  124. @Override
  125. public List<String> findSubDeviceIds(String parentId) {
  126. return deviceInfoData.findSubDeviceIds(parentId);
  127. }
  128. @Override
  129. public Paging<DeviceInfo> findByConditions(String uid, String subUid, String productKey,
  130. String groupId, String state, String keyword, int page, int size) {
  131. return deviceInfoData.findByConditions(uid, subUid, productKey, groupId, state, keyword, page, size);
  132. }
  133. @Override
  134. public void updateTag(String deviceId, DeviceInfo.Tag tag) {
  135. deviceInfoData.updateTag(deviceId, tag);
  136. DeviceInfo data = deviceInfoData.findByDeviceId(deviceId);
  137. putDeviceInfo(data);
  138. }
  139. @Override
  140. @Cacheable(value = Constants.CACHE_DEVICE_STATS, key = "#root.method.name+#uid", unless = "#result == null")
  141. public List<DataItem> getDeviceStatsByCategory(String uid) {
  142. return deviceInfoData.getDeviceStatsByCategory(uid);
  143. }
  144. @Override
  145. public long countByGroupId(String groupId) {
  146. return deviceInfoData.countByGroupId(groupId);
  147. }
  148. @Override
  149. public void addToGroup(String deviceId, DeviceInfo.Group group) {
  150. deviceInfoData.addToGroup(deviceId, group);
  151. DeviceInfo data = deviceInfoData.findByDeviceId(deviceId);
  152. putDeviceInfo(data);
  153. }
  154. @Override
  155. public void updateGroup(String groupId, DeviceInfo.Group group) {
  156. deviceInfoData.updateGroup(groupId, group);
  157. }
  158. @Override
  159. public void removeGroup(String deviceId, String groupId) {
  160. deviceInfoData.removeGroup(deviceId, groupId);
  161. DeviceInfo data = deviceInfoData.findByDeviceId(deviceId);
  162. putDeviceInfo(data);
  163. }
  164. @Override
  165. public void removeGroup(String groupId) {
  166. deviceInfoData.removeGroup(groupId);
  167. }
  168. @Override
  169. public List<DeviceInfo> findByUid(String uid) {
  170. return deviceInfoData.findByUid(uid);
  171. }
  172. @Override
  173. public Paging<DeviceInfo> findByUid(String uid, int page, int size) {
  174. return deviceInfoData.findByUid(uid, page, size);
  175. }
  176. @Override
  177. public long countByUid(String uid) {
  178. return deviceInfoData.countByUid(uid);
  179. }
  180. @Override
  181. public DeviceInfo findById(String s) {
  182. return deviceInfoData.findById(s);
  183. }
  184. @Override
  185. public List<DeviceInfo> findByIds(Collection<String> ids) {
  186. return deviceInfoData.findByIds(ids);
  187. }
  188. @Override
  189. public DeviceInfo save(DeviceInfo data) {
  190. if(StringUtils.isNotEmpty(data.getId())){
  191. DeviceInfo device = deviceInfoData.findById(data.getId());
  192. if(Objects.nonNull(device)){
  193. //清除缓存
  194. deviceInfoCacheEvict.findByDeviceId(device.getDeviceId());
  195. deviceInfoCacheEvict.findByDeviceName(device.getDeviceName());
  196. //清除属性缓存
  197. clearProperties(device.getDeviceId());
  198. if(device.getDeviceName().compareTo(data.getDeviceName())!=0){
  199. data.setState(new DeviceInfo.State(false,System.currentTimeMillis(),System.currentTimeMillis()));
  200. }
  201. }
  202. }
  203. DeviceInfo r = deviceInfoData.save(data);
  204. //更新设备信息缓存
  205. putDeviceInfo(data);
  206. //更新子设备列表缓存
  207. putSubDeviceIds(data.getParentId());
  208. return r;
  209. }
  210. @Override
  211. public void batchSave(List<DeviceInfo> data) {
  212. }
  213. @Override
  214. public void deleteById(String s) {
  215. DeviceInfo device = deviceInfoData.findById(s);
  216. deviceInfoData.deleteById(s);
  217. //清除缓存
  218. deviceInfoCacheEvict.findByDeviceId(device.getDeviceId());
  219. deviceInfoCacheEvict.findByDeviceName(device.getDeviceName());
  220. //清除属性缓存
  221. clearProperties(device.getDeviceId());
  222. //更新子设备列表缓存
  223. putSubDeviceIds(device.getParentId());
  224. }
  225. @Override
  226. public void deleteByIds(Collection<String> ids) {
  227. List<DeviceInfo> deviceInfos = deviceInfoData.findByIds(ids);
  228. deviceInfos.forEach(device -> {
  229. deviceInfoCacheEvict.findByDeviceId(device.getDeviceId());
  230. deviceInfoCacheEvict.findByDeviceName(device.getDeviceName());
  231. //清除属性缓存
  232. clearProperties(device.getDeviceId());
  233. //更新子设备列表缓存
  234. putSubDeviceIds(device.getParentId());
  235. });
  236. deviceInfoData.deleteByIds(ids);
  237. }
  238. @Override
  239. public long count() {
  240. return deviceInfoData.count();
  241. }
  242. @Override
  243. public List<DeviceInfo> findAll() {
  244. return deviceInfoData.findAll();
  245. }
  246. @Override
  247. public Paging<DeviceInfo> findAll(PageRequest<DeviceInfo> pageRequest) {
  248. return deviceInfoData.findAll(pageRequest);
  249. }
  250. @Override
  251. public List<DeviceInfo> findAllByCondition(DeviceInfo data) {
  252. return Collections.emptyList();
  253. }
  254. @Override
  255. public DeviceInfo findOneByCondition(DeviceInfo data) {
  256. return null;
  257. }
  258. /**
  259. * 更新缓存
  260. */
  261. private void putDeviceInfo(DeviceInfo data) {
  262. deviceInfoCachePut.findByDeviceId(data.getDeviceId(), data);
  263. deviceInfoCachePut.findByDeviceName(data.getDeviceName(), data);
  264. }
  265. /**
  266. * 更新子设备id列表
  267. */
  268. private void putSubDeviceIds(String parentId) {
  269. if (StringUtils.isBlank(parentId)) {
  270. return;
  271. }
  272. List<String> subDeviceIds = deviceInfoData.findSubDeviceIds(parentId);
  273. deviceInfoCachePut.findSubDeviceIds(parentId, subDeviceIds);
  274. }
  275. @Override
  276. public Map countCategoryMap(String tenantId) {
  277. return deviceInfoData.countCategoryMap(tenantId);
  278. }
  279. @Override
  280. public Map countStateMap(String tenantId) {
  281. return deviceInfoData.countStateMap(tenantId);
  282. }
  283. @Override
  284. public Long countTodayAdd(String tenantId) {
  285. return deviceInfoData.countTodayAdd(tenantId);
  286. }
  287. @Override
  288. public Paging<DeviceInfo> findByConditionsAndTenantId(String uid, String subUid, String pk, String group,
  289. String state, String keyword, Integer pageNum, Integer pageSize,
  290. String tenantId,Long deptId) {
  291. return deviceInfoData.findByConditionsAndTenantId(uid, subUid, pk, group, state, keyword, pageNum, pageSize, tenantId,deptId);
  292. }
  293. @Override
  294. public Long countByTenantId(String tenantId) {
  295. return deviceInfoData.countByTenantId(tenantId);
  296. }
  297. }