DeviceInfoServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package com.xy.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.xy.collections.list.JArrayList;
  8. import com.xy.collections.list.JList;
  9. import com.xy.config.DeviceThreadPoolConfig;
  10. import com.xy.dto.DeviceInfoDto;
  11. import com.xy.dto.DeviceRegisterDto;
  12. import com.xy.dto.DeviceStatusDto;
  13. import com.xy.dto.DeviceSysinfoDto;
  14. import com.xy.entity.DeviceInfo;
  15. import com.xy.entity.SysDictRedis;
  16. import com.xy.error.CommRuntimeException;
  17. import com.xy.mapper.DeviceInfoMapper;
  18. import com.xy.mapper.entity.DeviceInfoQueryPage;
  19. import com.xy.utils.*;
  20. import com.xy.utils.enums.DictEnum;
  21. import com.xy.utils.enums.DictSonEnum;
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiOperation;
  24. import lombok.RequiredArgsConstructor;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import org.springframework.validation.annotation.Validated;
  28. import org.springframework.web.bind.annotation.PostMapping;
  29. import org.springframework.web.bind.annotation.RequestBody;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import static com.xy.utils.PlusBeans.*;
  33. /**
  34. * <p>
  35. * 设备-信息 服务实现类
  36. * </p>
  37. *
  38. * @author lijin
  39. * @since 2022-12-23
  40. */
  41. @Service
  42. @RequiredArgsConstructor
  43. @Api(tags = "设备-信息")
  44. public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceInfo> implements DeviceInfoService {
  45. private final DeviceSysinfoServiceImpl deviceSysinfoService;
  46. private final DeviceStatusServiceImpl deviceStatusService;
  47. private final DeviceRegisterServiceImpl deviceRegisterService;
  48. private final RedisService<String> redisService;
  49. private final String keyPrefix = "device:history:";
  50. @Override
  51. @ApiOperation("对象查询")
  52. public R<DeviceInfoDto.Vo> obj(DeviceInfoDto.Obj obj) {
  53. //设备信息
  54. LambdaQueryWrapper<DeviceInfo> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(obj, DeviceInfo.class).build();
  55. List<DeviceInfo> list = list(lambdaQueryWrapper);
  56. if (!Emptys.check(list)) {
  57. return R.ok();
  58. }
  59. DeviceInfoDto.Vo deviceInfo = copy(DeviceInfoDto.Vo.class, list.get(0));
  60. ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, 3)
  61. .execute(() -> {
  62. //系统信息
  63. DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfoService.get(new DeviceSysinfoDto.Vo().setDeviceId(deviceInfo.getDeviceId())).getData();
  64. deviceInfo.setDeviceSysinfo(deviceSysinfo);
  65. })
  66. .execute(() -> {
  67. //状态信息
  68. DeviceStatusDto.Vo deviceStatus = deviceStatusService.obj(new DeviceStatusDto.Vo().setDeviceId(deviceInfo.getDeviceId())).getData();
  69. deviceInfo.setDeviceStatus(deviceStatus);
  70. })
  71. .execute(() -> {
  72. //注册信息
  73. DeviceRegisterDto.Vo deviceRegister = deviceRegisterService.obj(new DeviceRegisterDto.Vo().setDeviceId(deviceInfo.getDeviceId())).getData();
  74. deviceInfo.setDeviceRegister(deviceRegister);
  75. })
  76. .end();
  77. return R.ok(deviceInfo);
  78. }
  79. @Override
  80. @ApiOperation("设备访问历史添加")
  81. public R history(DeviceInfoDto.Obj obj) {
  82. //获取字典
  83. SysDictRedis sysDictRedis = SysDictUtils.get(DictEnum.DATA_CLEAR_SIZE.getKey(), "device_history_twig");
  84. Integer value = Integer.valueOf(sysDictRedis.getValue());
  85. //获取redis
  86. String key = keyPrefix + AuthorizeUtils.getLoginId(Long.class);
  87. List<String> list = redisService.getList(key);
  88. list.add(0, String.valueOf(obj.getDeviceId()));
  89. //去重
  90. List<String> redisList = new ArrayList<>();
  91. JList<String> comparing = new JArrayList<>(list).comparing();
  92. if (comparing.size() > value) {
  93. for (int i = 0; i < value; i++) {
  94. redisList.add(comparing.get(i));
  95. }
  96. } else {
  97. redisList = comparing;
  98. }
  99. redisService.removeList(key);
  100. redisService.setList(key, redisList);
  101. return R.ok();
  102. }
  103. @Override
  104. @ApiOperation("开门检测")
  105. public R checkOpenDoor(DeviceInfoDto.Obj obj) {
  106. DeviceInfoDto.Vo deviceInfo = obj(new DeviceInfoDto.Obj().setDeviceId(obj.getDeviceId())).getData();
  107. if (deviceInfo == null) {
  108. return R.fail("设备不存在");
  109. }
  110. DeviceStatusDto.Vo deviceStatus = deviceInfo.getDeviceStatus();
  111. check(deviceInfo.getFreezeStatus(), 2, "设备已冻结");
  112. SysDictRedis sysDictRedis = SysDictUtils.get(DictEnum.DEVICE_FAULT_LEVEL_PAY_THRESHOLD.getKey(), DictSonEnum.DEVICE_FAULT_LEVEL_PAY_THRESHOLD_NOT_PAY.getKey());
  113. if (deviceInfo.getFaultLevel() >= Integer.valueOf(sysDictRedis.getValue())) {
  114. return R.fail("设备故障");
  115. }
  116. check(deviceStatus.getNetState(), 2, "设备已离线");
  117. check(obj.getIsTwoDoor() != null && obj.getIsTwoDoor() ? deviceStatus.getDeviceStateR() : deviceStatus.getDeviceStateL(), 2, "设备已锁机");
  118. check(obj.getIsTwoDoor() != null && obj.getIsTwoDoor() ? deviceStatus.getLockStateR() : deviceStatus.getLockStateL(), 2, "设备正在使用中,请稍后");
  119. return R.ok();
  120. }
  121. @PostMapping("historyList")
  122. @ApiOperation("设备访问历史查询")
  123. public R<List<DeviceInfoDto.Vo>> historyList() {
  124. //获取redis
  125. String key = keyPrefix + AuthorizeUtils.getLoginId(Long.class);
  126. List<String> deviceIds = redisService.getList(key);
  127. if (!Emptys.check(deviceIds)) {
  128. return R.ok();
  129. }
  130. //查询数据库
  131. List<DeviceInfo> list = list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceIds));
  132. return R.ok(copy(DeviceInfoDto.Vo.class, list));
  133. }
  134. @ApiOperation("修改")
  135. @PostMapping("update")
  136. public R update(@RequestBody @Validated DeviceInfoDto.Update update) {
  137. DeviceInfo deviceInfo = copy(DeviceInfo.class, update);
  138. updateById(deviceInfo);
  139. return R.ok();
  140. }
  141. @PostMapping("page")
  142. @ApiOperation("分页查询")
  143. public R<PageBean<DeviceInfoDto.Vo2>> page(@RequestBody DeviceInfoDto.Page page) {
  144. //数据鉴权
  145. boolean authByData = AuthorizeUtils.authByData(AuthorizeUtils.getSysId(), AuthorizeUtils.getUri());
  146. if (!authByData) {
  147. //todo 授权处理
  148. boolean deviceAuth = true;
  149. if (deviceAuth) {
  150. page.setMerc(String.valueOf(AuthorizeUtils.getLoginId(Long.class)));
  151. }
  152. }
  153. return queryPage(page);
  154. }
  155. @PostMapping("nearbyPage")
  156. @ApiOperation("附近设备分页查询")
  157. public R<PageBean<DeviceInfoDto.Vo2>> nearbyPage(@RequestBody DeviceInfoDto.Page page) {
  158. if (!Emptys.check(page.getLon()) || !Emptys.check(page.getLat())) {
  159. throw new CommRuntimeException("经纬度不能为空");
  160. }
  161. return queryPage(page);
  162. }
  163. @ApiOperation("商户设备授权")
  164. @Override
  165. @Transactional(rollbackFor = Exception.class)
  166. public R<Boolean> mercDeviceAuth(DeviceInfoDto.MercDeviceAuthDto auth) {
  167. Long mercId = auth.getMercId();
  168. String mercCode = auth.getMercCode();
  169. //商户最终设备列表
  170. List<Long> deviceIds = auth.getDeviceIds();
  171. List<DeviceInfo> devices = getDevicesByMercId(mercId);
  172. //取消商户设备授权
  173. if (CollUtil.isEmpty(deviceIds)) {
  174. if (CollUtil.isEmpty(devices)) {
  175. return R.ok(Boolean.TRUE);
  176. }
  177. return R.ok(removeMerRefDevices(devices));
  178. }
  179. //更新商户设备授权
  180. List<DeviceInfo> deviceInfos = this.listByIds(deviceIds);
  181. deviceInfos.forEach(deviceInfo -> {
  182. //绑定关系
  183. deviceInfo.setMercId(mercId).setMercCode(mercCode);
  184. });
  185. updateBatchById(deviceInfos);
  186. //原来存在的设备关系,不在最终设备列表中的移除
  187. if (CollUtil.isNotEmpty(devices)) {
  188. List<Long> oldIds = new ArrayList<>();
  189. List<Long> removeIds = new ArrayList<>();
  190. devices.forEach(device -> oldIds.add(device.getDeviceId()));
  191. oldIds.forEach(deviceId -> {
  192. //不在最终设备列表中的待移除
  193. if (!deviceIds.contains(deviceId)) {
  194. removeIds.add(deviceId);
  195. }
  196. });
  197. if (CollUtil.isNotEmpty(removeIds)) {
  198. List<DeviceInfo> removeList = this.listByIds(removeIds);
  199. removeMerRefDevices(removeList);
  200. }
  201. }
  202. return R.ok(Boolean.TRUE);
  203. }
  204. /**
  205. * 批量移除商户设备绑定关系
  206. *
  207. * @param deviceInfos
  208. * @return
  209. */
  210. private Boolean removeMerRefDevices(List<DeviceInfo> deviceInfos) {
  211. deviceInfos.forEach(deviceInfo -> {
  212. //-1 释放关系
  213. deviceInfo.setMercId(-1L);
  214. });
  215. //批量更新
  216. updateBatchById(deviceInfos);
  217. return updateBatchById(deviceInfos);
  218. }
  219. @ApiOperation("集合查询")
  220. @Override
  221. public R<List<DeviceInfoDto.Vo>> list(DeviceInfoDto.ListDto dto) {
  222. List<DeviceInfo> list = list(new LambdaQueryWrapper<DeviceInfo>().in(CollUtil.isNotEmpty(dto.getDeviceIds()), DeviceInfo::getDeviceId, dto.getDeviceIds()));
  223. return R.ok(copy(DeviceInfoDto.Vo.class, list));
  224. }
  225. /**
  226. * 获取商户设备列表
  227. *
  228. * @param mercId
  229. * @return
  230. */
  231. private List<DeviceInfo> getDevicesByMercId(Long mercId) {
  232. return list(Wrappers.<DeviceInfo>lambdaQuery().eq(DeviceInfo::getMercId, mercId));
  233. }
  234. private R<PageBean<DeviceInfoDto.Vo2>> queryPage(DeviceInfoDto.Page page) {
  235. IPage<DeviceInfoQueryPage> iPage = baseMapper.queryPage(toIPage(page.getPage()), page);
  236. return R.ok(toPageBean(DeviceInfoDto.Vo2.class, iPage));
  237. }
  238. private <T> void check(T value, T value2, String msg) {
  239. if (value.toString().equals(value2.toString())) {
  240. throw new CommRuntimeException(msg);
  241. }
  242. }
  243. }