DeviceInfoServiceImpl.java 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  1. package com.xy.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.collection.ListUtil;
  5. import cn.hutool.core.date.DatePattern;
  6. import cn.hutool.core.date.DateUtil;
  7. import cn.hutool.core.text.StrBuilder;
  8. import cn.hutool.core.util.BooleanUtil;
  9. import cn.hutool.core.util.NumberUtil;
  10. import cn.hutool.core.util.StrUtil;
  11. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  12. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  13. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  14. import com.baomidou.mybatisplus.core.metadata.IPage;
  15. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  16. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  17. import com.xy.collections.list.JArrayList;
  18. import com.xy.collections.list.JList;
  19. import com.xy.config.DeviceThreadPoolConfig;
  20. import com.xy.consts.DictConsts;
  21. import com.xy.dto.*;
  22. import com.xy.entity.*;
  23. import com.xy.enums.FileExportType;
  24. import com.xy.error.CommRuntimeException;
  25. import com.xy.mapper.DeviceInfoMapper;
  26. import com.xy.mapper.entity.DeviceInfoQueryPage;
  27. import com.xy.util.ExcelUtils;
  28. import com.xy.util.FileUtils;
  29. import com.xy.utils.*;
  30. import com.xy.utils.enums.DeviceActiveStateEnum;
  31. import com.xy.utils.enums.DeviceNetSateType;
  32. import com.xy.utils.enums.DictEnum;
  33. import com.xy.utils.enums.DictSonEnum;
  34. import io.swagger.annotations.Api;
  35. import io.swagger.annotations.ApiOperation;
  36. import jodd.introspector.MapperFunction;
  37. import lombok.RequiredArgsConstructor;
  38. import org.springframework.stereotype.Service;
  39. import org.springframework.transaction.annotation.Transactional;
  40. import org.springframework.validation.annotation.Validated;
  41. import org.springframework.web.bind.annotation.PostMapping;
  42. import org.springframework.web.bind.annotation.RequestBody;
  43. import javax.servlet.http.HttpServletResponse;
  44. import javax.validation.Valid;
  45. import java.io.IOException;
  46. import java.math.BigDecimal;
  47. import java.time.LocalDateTime;
  48. import java.util.*;
  49. import java.util.stream.Collectors;
  50. import static com.xy.utils.PlusBeans.*;
  51. /**
  52. * <p>
  53. * 设备-信息 服务实现类
  54. * </p>
  55. *
  56. * @author lijin
  57. * @since 2022-12-23
  58. */
  59. @Service
  60. @RequiredArgsConstructor
  61. @Api(tags = "设备-信息")
  62. public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceInfo> implements DeviceInfoService {
  63. private final DeviceSysinfoServiceImpl deviceSysinfoService;
  64. private final DeviceStatusServiceImpl deviceStatusService;
  65. private final DeviceRegisterServiceImpl deviceRegisterService;
  66. private final DeviceErrorsRecordServiceImpl deviceErrorsRecordService;
  67. private final DeviceDataServiceImpl deviceDataService;
  68. private final DeviceTempRecordsServiceImpl deviceTempRecordsService;
  69. private final DeviceNetRecordServiceImpl deviceNetRecordService;
  70. private final GoodsDeviceService goodsDeviceService;
  71. private final FileExportService fileExportService;
  72. private final RedisService<String> redisService;
  73. private final String keyPrefix = "device:history:";
  74. private final FileUtils fileUtils;
  75. @Override
  76. @ApiOperation("对象查询")
  77. public R<DeviceInfoDto.Vo> obj(DeviceInfoDto.Obj obj) {
  78. //设备信息
  79. LambdaQueryWrapper<DeviceInfo> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(obj, DeviceInfo.class).build();
  80. List<DeviceInfo> list = list(lambdaQueryWrapper);
  81. if (!Emptys.check(list)) {
  82. return R.ok();
  83. }
  84. DeviceInfoDto.Vo deviceInfo = copy(DeviceInfoDto.Vo.class, list.get(0));
  85. int num = 0;
  86. if (obj.getIsSysinfo()) {
  87. num++;
  88. }
  89. if (obj.getIsStatus()) {
  90. num++;
  91. }
  92. if (obj.getIsRegister()) {
  93. num++;
  94. }
  95. if (num > 0) {
  96. ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, num);
  97. if (obj.getIsSysinfo()) {
  98. execute.execute(() -> {
  99. //系统信息
  100. DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfoService.get(new DeviceSysinfoDto.Vo().setDeviceId(deviceInfo.getDeviceId())).getData();
  101. deviceInfo.setDeviceSysinfo(deviceSysinfo);
  102. });
  103. }
  104. if (obj.getIsStatus()) {
  105. execute.execute(() -> {
  106. //状态信息
  107. DeviceStatusDto.Vo deviceStatus = deviceStatusService.obj(new DeviceStatusDto.Vo().setDeviceId(deviceInfo.getDeviceId())).getData();
  108. deviceInfo.setDeviceStatus(deviceStatus);
  109. });
  110. }
  111. if (obj.getIsRegister()) {
  112. execute.execute(() -> {
  113. //注册信息
  114. DeviceRegisterDto.Vo deviceRegister = deviceRegisterService.obj(new DeviceRegisterDto.Vo().setDeviceId(deviceInfo.getDeviceId())).getData();
  115. deviceInfo.setDeviceRegister(deviceRegister);
  116. });
  117. }
  118. execute.end();
  119. }
  120. return R.ok(deviceInfo);
  121. }
  122. @ApiOperation("反显设备名称")
  123. @Override
  124. public R<Map<Long, String>> getDeviceNameList(DeviceInfoDto.DeviceIdDto dto) {
  125. LambdaQueryWrapper<DeviceInfo> lqw = new LambdaQueryWrapper<DeviceInfo>()
  126. .in(DeviceInfo::getDeviceId, dto.getDeviceId())
  127. .select(DeviceInfo::getDeviceId, DeviceInfo::getDeviceName);
  128. List<DeviceInfo> deviceInfoList = list(lqw);
  129. return R.ok(deviceInfoList.stream().collect(Collectors.toMap(DeviceInfo::getDeviceId, i -> Optional.ofNullable(i.getDeviceName()).orElse(""))));
  130. }
  131. @Override
  132. public R<DeviceSysinfoDto.Vo> getDeviceSysinfo(DeviceSysinfoDto.DeviceSysInfo dto) {
  133. String dtoDeviceSN = dto.getDeviceSN();
  134. DeviceSysinfo one = deviceSysinfoService.getOne(Wrappers.<DeviceSysinfo>lambdaQuery().eq(DeviceSysinfo::getDeviceSn, dtoDeviceSN));
  135. return R.ok(BeanUtil.copyProperties(one, DeviceSysinfoDto.Vo.class));
  136. }
  137. @Override
  138. @ApiOperation("设备访问历史添加")
  139. public R history(DeviceInfoDto.Obj obj) {
  140. //获取字典
  141. SysDictRedis sysDictRedis = SysDictUtils.get(DictEnum.DATA_CLEAR_SIZE.getKey(), "device_history_twig");
  142. Integer value = Integer.valueOf(sysDictRedis.getValue());
  143. //获取redis
  144. String key = keyPrefix + AuthorizeUtils.getLoginId(Long.class);
  145. List<String> list = redisService.getList(key);
  146. list.add(0, String.valueOf(obj.getDeviceId()));
  147. //去重
  148. List<String> redisList = new ArrayList<>();
  149. JList<String> comparing = new JArrayList<>(list).comparing();
  150. if (comparing.size() > value) {
  151. for (int i = 0; i < value; i++) {
  152. redisList.add(comparing.get(i));
  153. }
  154. } else {
  155. redisList = comparing;
  156. }
  157. redisService.removeList(key);
  158. redisService.setList(key, redisList);
  159. return R.ok();
  160. }
  161. @Override
  162. @ApiOperation("开门检测")
  163. public R<DeviceInfoDto.Vo> checkOpenDoor(DeviceInfoDto.Obj obj) {
  164. DeviceInfoDto.Vo deviceInfo = obj(new DeviceInfoDto.Obj()
  165. .setDeviceId(obj.getDeviceId())
  166. .setIsStatus(true)
  167. ).getData();
  168. if (deviceInfo == null) {
  169. return R.fail("设备不存在");
  170. }
  171. DeviceStatusDto.Vo deviceStatus = deviceInfo.getDeviceStatus();
  172. check(deviceInfo.getFreezeStatus(), 2, "设备已冻结");
  173. SysDictRedis sysDictRedis = SysDictUtils.get(DictEnum.DEVICE_FAULT_LEVEL_PAY_THRESHOLD.getKey(), DictSonEnum.DEVICE_FAULT_LEVEL_PAY_THRESHOLD_NOT_PAY.getKey());
  174. if (deviceInfo.getFaultLevel() >= Integer.valueOf(sysDictRedis.getValue())) {
  175. return R.fail("设备故障");
  176. }
  177. check(deviceStatus.getNetState(), 2, "设备已离线");
  178. check(obj.getDoor() != null && obj.getDoor() == 1 ? deviceStatus.getDoorStateR() : deviceStatus.getDoorStateL(), 1, "设备正在使用中,请稍后");
  179. check(obj.getDoor() != null && obj.getDoor() == 1 ? deviceStatus.getLockStateR() : deviceStatus.getLockStateL(), 2, "设备已锁机");
  180. return R.ok(deviceInfo);
  181. }
  182. @PostMapping("historyList")
  183. @ApiOperation("设备访问历史查询")
  184. public R<List<DeviceInfoDto.Vo>> historyList() {
  185. //获取redis
  186. String key = keyPrefix + AuthorizeUtils.getLoginId(Long.class);
  187. List<String> deviceIds = redisService.getList(key);
  188. if (!Emptys.check(deviceIds)) {
  189. return R.ok();
  190. }
  191. //查询数据库
  192. List<DeviceInfo> list = list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceIds));
  193. return R.ok(copy(DeviceInfoDto.Vo.class, list));
  194. }
  195. @ApiOperation("修改")
  196. @PostMapping("update")
  197. public R update(@RequestBody @Validated DeviceInfoDto.Update update) {
  198. DeviceInfo deviceInfo = copy(DeviceInfo.class, update);
  199. updateById(deviceInfo);
  200. return R.ok();
  201. }
  202. @ApiOperation("批量修改")
  203. @PostMapping("updateBatch")
  204. public R updateBatch(@RequestBody List<DeviceInfoDto.Update> updates) {
  205. List<DeviceInfo> deviceInfos = new ArrayList<>(updates.size());
  206. updates.forEach(update -> deviceInfos.add(copy(DeviceInfo.class, update)));
  207. updateBatchById(deviceInfos);
  208. return R.ok();
  209. }
  210. @Override
  211. @ApiOperation("更新商户线路")
  212. public R updateLine(@RequestBody @Validated DeviceInfoDto.UpdateLine updateLine) {
  213. LambdaUpdateWrapper<DeviceInfo> luw = new LambdaUpdateWrapper<DeviceInfo>().eq(DeviceInfo::getMercId, updateLine.getMercId());
  214. //绑定线路,更换线路
  215. if (DeviceInfoDto.UPDATE.equals(updateLine.getType())) {
  216. DeviceInfo deviceInfo = new DeviceInfo();
  217. deviceInfo.setPlaceLineId(updateLine.getPlaceLineId());
  218. luw.in(DeviceInfo::getDeviceId, updateLine.getDeviceIds());
  219. baseMapper.update(deviceInfo, luw);
  220. }
  221. //删除线路
  222. if (DeviceInfoDto.DEL.equals(updateLine.getType())) {
  223. luw.eq(DeviceInfo::getPlaceLineId, updateLine.getWherePlaceLineId());
  224. luw.set(DeviceInfo::getPlaceLineId, null);
  225. baseMapper.update(null, luw);
  226. }
  227. //解绑线路 设置线路ID为null
  228. if (DeviceInfoDto.CLEAR.equals(updateLine.getType())) {
  229. luw.in(DeviceInfo::getDeviceId, updateLine.getDeviceIds());
  230. luw.set(DeviceInfo::getPlaceLineId, null);
  231. baseMapper.update(null, luw);
  232. }
  233. return R.ok();
  234. }
  235. @Override
  236. @ApiOperation("更新商户点位")
  237. public R updatePlace(@RequestBody @Validated DeviceInfoDto.UpdatePlace updatePlace) {
  238. LambdaUpdateWrapper<DeviceInfo> luw = new LambdaUpdateWrapper<DeviceInfo>().eq(DeviceInfo::getMercId, updatePlace.getMercId());
  239. //绑定点位,更换点位
  240. if (DeviceInfoDto.UPDATE.equals(updatePlace.getType())) {
  241. DeviceInfo deviceInfo = new DeviceInfo();
  242. deviceInfo.setPlaceId(updatePlace.getPlaceId());
  243. luw.in(DeviceInfo::getDeviceId, updatePlace.getDeviceIds());
  244. baseMapper.update(deviceInfo, luw);
  245. }
  246. //删除点位
  247. if (DeviceInfoDto.DEL.equals(updatePlace.getType())) {
  248. luw.eq(DeviceInfo::getPlaceId, updatePlace.getWherePlaceId());
  249. luw.set(DeviceInfo::getPlaceId, null);
  250. baseMapper.update(null, luw);
  251. }
  252. //解绑点位 设置点位ID为null
  253. if (DeviceInfoDto.CLEAR.equals(updatePlace.getType())) {
  254. luw.in(DeviceInfo::getDeviceId, updatePlace.getDeviceIds());
  255. luw.set(DeviceInfo::getPlaceId, null);
  256. baseMapper.update(null, luw);
  257. }
  258. return R.ok();
  259. }
  260. @PostMapping("page")
  261. @ApiOperation("分页查询")
  262. public R<PageBean<DeviceInfoDto.Vo2>> page(@RequestBody DeviceInfoDto.Page page) {
  263. return R.ok(queryPage(page));
  264. }
  265. @ApiOperation("导出设备列表")
  266. @PostMapping("exportDevices")
  267. public void exportDevices(HttpServletResponse response, @RequestBody @Valid DeviceInfoDto.Page page) throws IOException {
  268. PageBean<DeviceInfoDto.Vo2> pageBean = queryPage(page);
  269. List<DeviceInfoDto.Vo2> records = pageBean.getRecords();
  270. List<DeviceInfoDto.DeviceExcelVO> deviceExcelVOS = BeanUtil.copyToList(records, DeviceInfoDto.DeviceExcelVO.class);
  271. // 输出
  272. ExcelUtils.write(response, "设备列表.xls", "设备列表", DeviceInfoDto.DeviceExcelVO.class, deviceExcelVOS);
  273. }
  274. @ApiOperation("导出设备(异步)")
  275. @PostMapping("exportDevices/async")
  276. public void exportDevicesAsync(@RequestBody @Validated DeviceInfoDto.Page page) {
  277. PageBean<DeviceInfoDto.Vo2> pageBean = queryPage(page);
  278. List<DeviceInfoDto.Vo2> records = pageBean.getRecords();
  279. List<DeviceInfoDto.DeviceExcelVO> deviceExcelVOS = BeanUtil.copyToList(records, DeviceInfoDto.DeviceExcelVO.class);
  280. //异步导出参数封装
  281. ExcelDTO<DeviceInfoDto.DeviceExcelVO> excelDTO = new ExcelDTO<>();
  282. excelDTO.setData(deviceExcelVOS);
  283. excelDTO.setHead(DeviceInfoDto.DeviceExcelVO.class);
  284. excelDTO.setSheetName(FileExportType.DEVICE_INFO.getDescription());
  285. excelDTO.setFileExportType(FileExportType.DEVICE_INFO);
  286. //执行导出
  287. fileExportService.exportExcelAsync(excelDTO);
  288. }
  289. @PostMapping("nearbyPage")
  290. @ApiOperation("附近设备分页查询")
  291. public R<PageBean<DeviceInfoDto.Vo2>> nearbyPage(@RequestBody DeviceInfoDto.Page page) {
  292. if (!Emptys.check(page.getLon()) || !Emptys.check(page.getLat())) {
  293. throw new CommRuntimeException("经纬度不能为空");
  294. }
  295. return R.ok(queryPage(page));
  296. }
  297. @ApiOperation(value = "商户设备授权", hidden = true)
  298. @Override
  299. @Transactional(rollbackFor = Exception.class)
  300. public R<Boolean> mercDeviceAuth(DeviceInfoDto.MercDeviceAuthDto auth) {
  301. Long mercId = auth.getMercId();
  302. String mercCode = auth.getMercCode();
  303. Long algorithmId = auth.getAlgorithmId();
  304. String mercName = auth.getMercName();
  305. //商户最终设备列表
  306. List<Long> deviceIds = auth.getDeviceIds();
  307. List<DeviceInfo> devices = getDevicesByMercId(mercId);
  308. //取消商户设备授权
  309. if (CollUtil.isEmpty(deviceIds)) {
  310. if (CollUtil.isEmpty(devices)) {
  311. return R.ok(Boolean.TRUE);
  312. }
  313. }
  314. //更新商户设备授权
  315. List<DeviceInfo> deviceInfos = this.listByIds(deviceIds);
  316. for (DeviceInfo deviceInfo : deviceInfos) {
  317. int refMercId = deviceInfo.getMercId().intValue();
  318. // 只有解绑后,才能给顶级商户授权
  319. if (refMercId != -1 && refMercId != mercId.intValue()) {
  320. StrBuilder sb = StrBuilder.create();
  321. String errMsg = sb.append("设备[")
  322. .append(deviceInfo.getDeviceId())
  323. .append("]")
  324. .append("已被商户[")
  325. .append(deviceInfo.getMercName())
  326. .append("]绑定,请先进行解绑!")
  327. .toString();
  328. //已关联别商户
  329. return R.fail(errMsg, Boolean.FALSE);
  330. }
  331. //绑定关系
  332. deviceInfo.setMercId(mercId).setMercCode(mercCode).setAlgorithmId(algorithmId).setMercName(mercName);
  333. }
  334. saveOrUpdateBatch(deviceInfos);
  335. // //原来存在的设备关系,不在最终设备列表中的移除
  336. // if (CollUtil.isNotEmpty(devices)) {
  337. // List<Long> oldIds = new ArrayList<>();
  338. // List<Long> removeIds = new ArrayList<>();
  339. // devices.forEach(device -> oldIds.add(device.getDeviceId()));
  340. // oldIds.forEach(deviceId -> {
  341. // //不在最终设备列表中的待移除
  342. // if (!deviceIds.contains(deviceId)) {
  343. // removeIds.add(deviceId);
  344. // }
  345. // });
  346. // if (CollUtil.isNotEmpty(removeIds)) {
  347. // List<DeviceInfo> removeList = this.listByIds(removeIds);
  348. // removeMerRefDevices(removeList, parentId);
  349. // }
  350. // }
  351. return R.ok(Boolean.TRUE);
  352. }
  353. /**
  354. * 解绑机器 回收
  355. *
  356. * @param dto
  357. * @return
  358. */
  359. @Override
  360. public R<Boolean> unBindMercDevice(DeviceInfoDto.MercDeviceUnBindDto dto) {
  361. List<DeviceInfo> deviceInfos = this.listByIds(dto.getDeviceIds());
  362. return R.ok(removeMerRefDevicesToTopMerc(deviceInfos));
  363. }
  364. /**
  365. * 回收机器
  366. *
  367. * @param deviceInfos
  368. * @return
  369. */
  370. private Boolean removeMerRefDevicesToTopMerc(List<DeviceInfo> deviceInfos) {
  371. if (CollUtil.isNotEmpty(deviceInfos)) {
  372. deviceInfos.forEach(deviceInfo -> {
  373. //回收
  374. deviceInfo.setMercId(-1L);
  375. deviceInfo.setMercDeviceCode(StrUtil.EMPTY);
  376. deviceInfo.setMercName(StrUtil.EMPTY);
  377. deviceInfo.setMercCode(StrUtil.EMPTY);
  378. });
  379. //批量更新
  380. return updateBatchById(deviceInfos);
  381. }
  382. return Boolean.FALSE;
  383. }
  384. /**
  385. * 批量移除商户设备绑定关系
  386. *
  387. * @param deviceInfos
  388. * @return
  389. */
  390. private Boolean removeMerRefDevices(List<DeviceInfo> deviceInfos, Long parentId) {
  391. if (CollUtil.isNotEmpty(deviceInfos) && parentId != null) {
  392. deviceInfos.forEach(deviceInfo -> {
  393. //非顶级兴元商户,解绑后,机器归父商户
  394. if (parentId != 1) {
  395. deviceInfo.setMercId(parentId);
  396. }
  397. //一级商户,解绑后,直接释放
  398. if (parentId == 0) {
  399. //兴元等级 0 释放关系
  400. deviceInfo.setMercId(-1L);
  401. }
  402. deviceInfo.setMercName(StrUtil.EMPTY);
  403. deviceInfo.setMercCode(StrUtil.EMPTY);
  404. });
  405. //批量更新
  406. return updateBatchById(deviceInfos);
  407. }
  408. return Boolean.FALSE;
  409. }
  410. @ApiOperation("集合查询")
  411. @Override
  412. public R<List<DeviceInfoDto.Vo>> list(DeviceInfoDto.ListDto dto) {
  413. List<DeviceInfo> list = list(new LambdaQueryWrapper<DeviceInfo>().in(CollUtil.isNotEmpty(dto.getDeviceIds()), DeviceInfo::getDeviceId, dto.getDeviceIds()));
  414. return R.ok(copy(DeviceInfoDto.Vo.class, list));
  415. }
  416. @Override
  417. @ApiOperation("通用集合查询")
  418. public R<List<DeviceInfoDto.Vo>> listCommon(DeviceInfoDto.ListCommon dto) {
  419. String deviceSearch = dto.getDeviceSearch();
  420. DeviceInfoDto.Vo vo = dto.getVo();
  421. QueryWrapper<DeviceInfo> queryWrapper = new MybatisPlusQuery().eqWrapper(vo == null ? new DeviceInfoDto.Vo() : vo, DeviceInfo.class).buildQW();
  422. List<Long> placeLineIds = dto.getPlaceLineIds();
  423. List<Long> deviceIds = dto.getDeviceIds();
  424. List<String> columnList = dto.getColumnList();
  425. if (CollUtil.isNotEmpty(placeLineIds)) {
  426. queryWrapper.in(LambdaUtils.getUnderlineCaseName(DeviceInfo::getPlaceLineId), placeLineIds);
  427. }
  428. if (StrUtil.isNotEmpty(deviceSearch)) {
  429. queryWrapper.and(wrapper -> wrapper.likeRight(LambdaUtils.getUnderlineCaseName(DeviceInfo::getDeviceName), deviceSearch).or()
  430. .eq(LambdaUtils.getUnderlineCaseName(DeviceInfo::getMercDeviceCode), deviceSearch));
  431. }
  432. if (CollUtil.isNotEmpty(columnList)) {
  433. queryWrapper.select(columnList.stream().toArray(String[]::new));
  434. }
  435. if (CollUtil.isNotEmpty(deviceIds)) {
  436. queryWrapper.in(LambdaUtils.getUnderlineCaseName(DeviceInfo::getDeviceId), deviceIds);
  437. }
  438. return R.ok(copy(DeviceInfoDto.Vo.class, list(queryWrapper)));
  439. }
  440. @Override
  441. @ApiOperation("商户设备算法列表")
  442. public R<List<Long>> mercAlgorithmIdList(DeviceInfoDto.MercAlgorithmIdListDto dto) {
  443. String algorithmIdStr = LambdaUtils.getProperty(DeviceInfo::getAlgorithmId);
  444. String mercStr = StringTools.humpToLine(LambdaUtils.getProperty(DeviceInfo::getMercId));
  445. QueryWrapper<DeviceInfo> lqw = new QueryWrapper<DeviceInfo>()
  446. .isNotNull(StringTools.humpToLine(algorithmIdStr))
  447. .eq(mercStr, dto.getMercId())
  448. .select(String.format("DISTINCT (%s) as %s", StringTools.humpToLine(algorithmIdStr), algorithmIdStr));
  449. List<Long> list = listObjs(lqw, (MapperFunction<Object, Long>) o -> (Long) o);
  450. return R.ok(list);
  451. }
  452. @Override
  453. @ApiOperation("小程序-商户设备首页统计")
  454. public R<DeviceInfoDto.MercHomeStatisticalVO> mercHomeStatistical(DeviceInfoDto.MercHomeQueryDTO dto) {
  455. Long mercId = dto.getMercId();
  456. List<Long> myDeviceIds = dto.getMyDeviceIds();
  457. //初始化数据
  458. DeviceInfoDto.MercHomeStatisticalVO mercHomeStatisticalVO = new DeviceInfoDto.MercHomeStatisticalVO()
  459. .setClosedNum(0).setOfflineNum(0)
  460. .setOnlineNum(0).setOperatingNum(0).setNeedToFillNum(0);
  461. if (CollUtil.isEmpty(myDeviceIds)) {
  462. return R.ok(mercHomeStatisticalVO);
  463. }
  464. List<DeviceInfo> mercDevices = listByIds(myDeviceIds);
  465. if (CollUtil.isEmpty(mercDevices)) {
  466. return R.ok(mercHomeStatisticalVO);
  467. }
  468. //在线、离线
  469. List<DeviceStatus> deviceStatuses = deviceStatusService.listByIds(myDeviceIds);
  470. //分组统计
  471. Map<Integer, Long> countNetstateMap = deviceStatuses.stream().collect(Collectors
  472. .groupingBy(DeviceStatus::getNetState, Collectors.counting()));
  473. Integer onlineDictValue = SysDictUtils.getValue(DictEnum.DEVICE_ONLINE_STATUS.getKey(), DictSonEnum.DEVICE_ONLINE_STATUS_CONNECTED.getKey(), Integer.class);
  474. Integer offlineDictValue = SysDictUtils.getValue(DictEnum.DEVICE_ONLINE_STATUS.getKey(), DictSonEnum.DEVICE_ONLINE_STATUS_DISCONNECT.getKey(), Integer.class);
  475. int onlineNum = countNetstateMap.get(onlineDictValue) == null ? 0 : countNetstateMap.get(onlineDictValue).intValue();
  476. int offlineNum = countNetstateMap.get(offlineDictValue) == null ? 0 : countNetstateMap.get(offlineDictValue).intValue();
  477. mercHomeStatisticalVO.setOnlineNum(onlineNum);
  478. mercHomeStatisticalVO.setOfflineNum(offlineNum);
  479. //运营、停业
  480. Map<Integer, Long> countBusyStateMap = mercDevices.stream().collect(Collectors
  481. .groupingBy(DeviceInfo::getBusyState, Collectors.counting()));
  482. Integer busyState1 = SysDictUtils.getValue(DictEnum.DEVICE_BUSY_STATUS.getKey(), DictSonEnum.DEVICE_BUSY_STATUS1.getKey(), Integer.class);
  483. Integer busyState2 = SysDictUtils.getValue(DictEnum.DEVICE_BUSY_STATUS.getKey(), DictSonEnum.DEVICE_BUSY_STATUS2.getKey(), Integer.class);
  484. int operatingNum = countBusyStateMap.get(busyState1) == null ? 0 : countBusyStateMap.get(busyState1).intValue();
  485. int closedNum = countBusyStateMap.get(busyState2) == null ? 0 : countBusyStateMap.get(busyState2).intValue();
  486. mercHomeStatisticalVO.setOperatingNum(operatingNum);
  487. mercHomeStatisticalVO.setClosedNum(closedNum);
  488. //待补货
  489. //TODO: 此逻辑需要确认
  490. return R.ok(mercHomeStatisticalVO);
  491. }
  492. @Override
  493. @ApiOperation("小程序-商户设备首页列表")
  494. public R<List<DeviceInfoDto.MercHomeListVO>> mercHomeList(DeviceInfoDto.MercHomeQueryDTO dto) {
  495. Long mercId = dto.getMercId();
  496. String deviceName = dto.getDeviceName();
  497. Long deviceId = dto.getDeviceId();
  498. List<DeviceInfoDto.MercHomeCountVO> list = this.baseMapper.merHomeCountList(dto);
  499. if (CollUtil.isEmpty(list)) {
  500. return R.ok(Collections.emptyList());
  501. }
  502. List<DeviceInfoDto.MercHomeListVO> dataList = new ArrayList<>(list.size());
  503. LambdaQueryWrapper<DeviceInfo> lqw = new LambdaQueryWrapper<>();
  504. lqw.eq(DeviceInfo::getActiveState, DeviceActiveStateEnum.TRUE.getCode());
  505. lqw.eq(mercId != null, DeviceInfo::getMercId, mercId);
  506. lqw.eq(deviceId != null, DeviceInfo::getDeviceId, deviceId);
  507. lqw.like(StrUtil.isNotEmpty(deviceName), DeviceInfo::getDeviceName, deviceName);
  508. List<DeviceInfo> deviceInfoList = this.list(lqw);
  509. //未分配线路的设置默认值
  510. deviceInfoList.stream().filter(s -> s.getPlaceLineId() == null).forEach(s -> s.setPlaceLineId(-1L));
  511. //根据线路id分组
  512. Map<Long, List<DeviceInfo>> deviceMap = deviceInfoList.stream().collect(Collectors.groupingBy(DeviceInfo::getPlaceLineId));
  513. for (DeviceInfoDto.MercHomeCountVO v : list) {
  514. DeviceInfoDto.MercHomeListVO vo = new DeviceInfoDto.MercHomeListVO();
  515. Long placeLineId = v.getPlaceLineId();
  516. vo.setDeviceNum(v.getDeviceNum());
  517. vo.setPlaceLineId(v.getPlaceLineId());
  518. //线路下的设备列表
  519. List<DeviceInfoDto.MercHomeDeviceVo> deviceInfos = BeanUtil.copyToList(deviceMap.get(placeLineId), DeviceInfoDto.MercHomeDeviceVo.class);
  520. if (CollUtil.isEmpty(deviceInfos)) {
  521. continue;
  522. }
  523. //设备销售统计
  524. String todayDate = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN);
  525. List<Long> deviceIds = deviceInfos.stream().map(DeviceInfoDto.MercHomeDeviceVo::getDeviceId).collect(Collectors.toList());
  526. //统计条件:当天
  527. DeviceDataDto.ListDTO deviceDataListDTO = new DeviceDataDto.ListDTO()
  528. .setDeviceIds(deviceIds).setType(DictSonEnum.DEVICE_DATA_TYPE_DAY.getKey()).setDateValue(Integer.valueOf(todayDate)).setMercId(mercId);
  529. List<DeviceDataDto.Vo> deviceDataList = deviceDataService.list(deviceDataListDTO);
  530. Map<Long, DeviceDataDto.Vo> dataMap = new HashMap<>();
  531. if (CollUtil.isNotEmpty(deviceDataList)) {
  532. dataMap = deviceDataList.stream().collect(Collectors.toMap(DeviceDataDto.Vo::getDeviceId, d -> d));
  533. }
  534. //设备状态查询
  535. List<DeviceStatusDto.Vo> deviceStatusList = deviceStatusService.list(new DeviceStatusDto.SelectList().setDeviceIds(deviceIds)).getData();
  536. Map<Long, DeviceStatusDto.Vo> datdeviceStatusMap = new HashMap<>();
  537. if (CollUtil.isNotEmpty(deviceStatusList)) {
  538. datdeviceStatusMap = deviceStatusList.stream().collect(Collectors.toMap(DeviceStatusDto.Vo::getDeviceId, d -> d));
  539. }
  540. for (DeviceInfoDto.MercHomeDeviceVo device : deviceInfos) {
  541. Long dId = device.getDeviceId();
  542. //设备类型 反显
  543. SysDictRedis dictDeviceType = SysDictUtils.get(DictConsts.DEVICE_TYPE, String.valueOf(device.getDeviceType()));
  544. device.setDeviceTypeName(dictDeviceType.getMsg());
  545. //运营状态 反显
  546. SysDictRedis dictBusyState = SysDictUtils.get(DictConsts.DEVICE_BUSY_STATUS, String.valueOf(device.getBusyState()));
  547. device.setBusyStateName(dictBusyState.getMsg());
  548. DeviceDataDto.Vo deviceData = dataMap.get(dId);
  549. //今日销售、库存情况 反显
  550. device.setDayOrderNum(deviceData != null ? deviceData.getSalesCount() : 0);
  551. device.setDaySalesPrice(deviceData != null ? deviceData.getSalesMoney() : 0);
  552. DeviceStatusDto.Vo deviceStatus = datdeviceStatusMap.get(device.getDeviceId());
  553. Integer stock = Emptys.check(deviceStatus.getStock()) ? deviceStatus.getStock() : 0;
  554. device.setOnSaleNum(stock);
  555. Integer afterFillStock = Emptys.check(deviceStatus.getAfterFillStock()) ? deviceStatus.getAfterFillStock() : 0;
  556. device.setFillNum(afterFillStock);
  557. //联网状态
  558. Integer netState = deviceStatus == null ? DeviceNetSateType.DISCONNECT.getCode() : deviceStatus.getNetState();
  559. device.setNetState(netState);
  560. if (netState == null) {
  561. device.setNetStateName(StrUtil.EMPTY);
  562. } else {
  563. device.setNetStateName(DeviceNetSateType.getEnumByCode(deviceStatus.getNetState()).getDescription());
  564. }
  565. }
  566. //在线排序
  567. if (CollUtil.isNotEmpty(deviceInfos)) {
  568. deviceInfos = ListUtil.sortByProperty(deviceInfos, LambdaUtils.getProperty(DeviceInfoDto.MercHomeDeviceVo::getNetState));
  569. }
  570. vo.setDeviceInfos(deviceInfos);
  571. dataList.add(vo);
  572. }
  573. return R.ok(dataList);
  574. }
  575. /**
  576. * 获取商户设备列表
  577. *
  578. * @param mercId
  579. * @return
  580. */
  581. private List<DeviceInfo> getDevicesByMercId(Long mercId) {
  582. return list(Wrappers.<DeviceInfo>lambdaQuery().eq(DeviceInfo::getMercId, mercId).eq(DeviceInfo::getActiveState, DeviceActiveStateEnum.TRUE.getCode()));
  583. }
  584. /**
  585. * 小程序商户设备搜索
  586. *
  587. * @param page
  588. * @return
  589. */
  590. @Override
  591. public R<PageBean<DeviceInfoDto.MerHomeSearchVO>> mercDeviceSearchPage(@RequestBody DeviceInfoDto.Page page) {
  592. PageBean<DeviceInfoDto.MerHomeSearchVO> pageData = new PageBean<>();
  593. //小程序独有查询字段 缺货状态:stockStatus ,是否查故障设备:fault
  594. Boolean fault = page.getFault();
  595. Long mercId = page.getMercId();
  596. List<Long> myDeviceIds = page.getDeviceIdList();
  597. if (CollUtil.isEmpty(myDeviceIds)) {
  598. //无设备
  599. return R.ok(pageData);
  600. }
  601. if (BooleanUtil.isTrue(fault)) {
  602. //查询故障设备
  603. List<DeviceErrorsRecord> deviceErrorsRecords = deviceErrorsRecordService.list(Wrappers.<DeviceErrorsRecord>lambdaQuery()
  604. .eq(mercId != null, DeviceErrorsRecord::getMercId, page.getMercId())
  605. .in(DeviceErrorsRecord::getDeviceId, myDeviceIds));
  606. List<Long> deviceIdList = deviceErrorsRecords.stream().map(DeviceErrorsRecord::getDeviceId).collect(Collectors.toList());
  607. if (CollUtil.isEmpty(deviceIdList)) {
  608. return R.ok(new PageBean<>());
  609. }
  610. page.setDeviceIdList(deviceIdList);
  611. } else {
  612. page.setDeviceIdList(myDeviceIds);
  613. }
  614. PageBean<DeviceInfoDto.Vo2> pageBean = queryPage(page);
  615. List<DeviceInfoDto.Vo2> records = pageBean.getRecords();
  616. if (CollUtil.isEmpty(records)) {
  617. return R.ok(pageData);
  618. }
  619. List<DeviceInfoDto.MerHomeSearchVO> merHomeSearchRecords = new ArrayList<>();
  620. List<Long> deviceIds = records.stream().map(DeviceInfoDto.Vo2::getDeviceId).collect(Collectors.toList());
  621. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_DAY.getKey(), String.class);
  622. String todayDate = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN);
  623. //查询当天
  624. DeviceDataDto.ListDTO dto = new DeviceDataDto.ListDTO()
  625. .setDeviceIds(deviceIds).setType(type).setDateValue(Integer.valueOf(todayDate)).setMercId(mercId);
  626. BeanUtil.copyProperties(pageBean, pageData);
  627. List<DeviceDataDto.Vo> deviceDataList = deviceDataService.list(dto);
  628. if (CollUtil.isNotEmpty(deviceDataList)) {
  629. //统计数据反显
  630. Map<Long, DeviceDataDto.Vo> dataMap = deviceDataList.stream().collect(Collectors.toMap(DeviceDataDto.Vo::getDeviceId, d -> d));
  631. records.forEach(v -> {
  632. DeviceInfoDto.MerHomeSearchVO merHomeSearchVO = new DeviceInfoDto.MerHomeSearchVO();
  633. Long deviceId = v.getDeviceId();
  634. DeviceDataDto.Vo vo = dataMap.get(deviceId);
  635. //今日订单数
  636. v.setDayOrderNum(vo != null ? vo.getSalesCount() : 0);
  637. v.setDaySalesPrice(vo != null ? vo.getSalesMoney() : 0);
  638. DeviceSysinfoDto.Vo deviceSysinfo = v.getDeviceSysinfo();
  639. DeviceStatusDto.Vo deviceStatus = v.getDeviceStatus();
  640. BeanUtil.copyProperties(vo, merHomeSearchVO);
  641. merHomeSearchVO.setAppUpmVersion(deviceSysinfo.getAppUpmVersion());
  642. merHomeSearchVO.setTempValue(deviceStatus.getTempValue());
  643. merHomeSearchVO.setNetDbm(deviceStatus.getNetDbm());
  644. merHomeSearchRecords.add(merHomeSearchVO);
  645. });
  646. pageData.setRecords(merHomeSearchRecords);
  647. }
  648. return R.ok(pageData);
  649. }
  650. /**
  651. * 小程序商户设备详情-数据统计
  652. *
  653. * @param dto
  654. * @return
  655. */
  656. @Override
  657. public R<DeviceInfoDto.DeviceDataCountVO> dataCount(@RequestBody DeviceInfoDto.DeviceDataCountDTO dto) {
  658. // 统计类型(1=经营数据,2=经营图表,3=温度图表,4=信号图表,5=商品管理)
  659. Integer type = dto.getType();
  660. switch (type) {
  661. case 1:
  662. //经营数据
  663. return R.ok(dataCount1(dto));
  664. case 2:
  665. //经营图表
  666. return R.ok(dataCount2(dto));
  667. case 3:
  668. //温度图表
  669. return R.ok(dataCount3(dto));
  670. case 4:
  671. //信号图表
  672. return R.ok(dataCount4(dto));
  673. case 5:
  674. //商品管理
  675. return R.ok(dataCount5(dto));
  676. default:
  677. break;
  678. }
  679. return R.ok();
  680. }
  681. /**
  682. * 经营数据
  683. *
  684. * @param dto
  685. * @return
  686. */
  687. private DeviceInfoDto.DeviceDataCountVO dataCount1(DeviceInfoDto.DeviceDataCountDTO dto) {
  688. Long deviceId = dto.getDeviceId();
  689. Long mercId = dto.getMercId();
  690. DeviceInfoDto.DeviceDataCountVO vo = new DeviceInfoDto.DeviceDataCountVO();
  691. //当天
  692. DeviceDataDto.Vo dayData = deviceDataService.getByDay(deviceId, mercId, DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN));
  693. //当月
  694. DeviceDataDto.Vo monthData = deviceDataService.getByMonth(deviceId, mercId, DateUtil.format(new Date(), DatePattern.SIMPLE_MONTH_PATTERN));
  695. vo.setDayBusinessData(copy(DeviceInfoDto.BusinessData.class, dayData));
  696. vo.setMonthBusinessData(copy(DeviceInfoDto.BusinessData.class, monthData));
  697. return vo;
  698. }
  699. /**
  700. * 经营图表
  701. *
  702. * @param dto
  703. * @return
  704. */
  705. private DeviceInfoDto.DeviceDataCountVO dataCount2(DeviceInfoDto.DeviceDataCountDTO dto) {
  706. Long deviceId = dto.getDeviceId();
  707. //近一个月 (销售额,订单数,退款金额,退款数)
  708. DeviceInfoDto.DeviceDataCountVO vo = new DeviceInfoDto.DeviceDataCountVO();
  709. DeviceInfoDto.BusinessChart businessChart = new DeviceInfoDto.BusinessChart();
  710. List<String> categories = DataTime.dayListByLastDay(30);
  711. List<Integer> dateList = new ArrayList<>(30);
  712. businessChart.setCategories(categories);
  713. categories.forEach(d -> {
  714. dateList.add(Integer.valueOf(d.replaceAll(StrUtil.DASHED, StrUtil.EMPTY)));
  715. });
  716. Integer startDay = dateList.get(0);
  717. Integer endDay = dateList.get(categories.size() - 1);
  718. List<DeviceDataDto.Vo> listByDay = deviceDataService.getListByDay(deviceId, startDay, endDay);
  719. if (CollUtil.isEmpty(listByDay)) {
  720. return vo;
  721. }
  722. //每天的数据
  723. Map<Integer, DeviceDataDto.Vo> dataDayMap = listByDay.stream().collect(Collectors.toMap(DeviceDataDto.Vo::getDateValue, i -> i));
  724. List<DeviceInfoDto.MyChartSeries3> series = new ArrayList<>();
  725. String[] names = {"销售额", "订单数", "退款金额", "退款数"};
  726. for (int i = 0; i < names.length; i++) {
  727. DeviceInfoDto.MyChartSeries3 myChartSeries = new DeviceInfoDto.MyChartSeries3();
  728. //某个类型每天的数据
  729. List<String> data = new ArrayList<>();
  730. if (i == 0) {
  731. //销售额
  732. dateList.forEach(d -> {
  733. //每日数据填充
  734. DeviceDataDto.Vo deviceData = dataDayMap.get(d);
  735. if (deviceData == null) {
  736. data.add(String.valueOf(BigDecimal.ZERO));
  737. } else {
  738. Integer salesMoney = deviceData.getSalesMoney() == null ? 0 : deviceData.getSalesMoney();
  739. BigDecimal day = BigDecimal.valueOf(salesMoney).divide(BigDecimal.valueOf(100));
  740. data.add(String.valueOf(day));
  741. }
  742. });
  743. } else if (i == 1) {
  744. //订单数
  745. dateList.forEach(d -> {
  746. //每日数据填充
  747. DeviceDataDto.Vo deviceData = dataDayMap.get(d);
  748. String value = "0";
  749. if (deviceData == null) {
  750. data.add(value);
  751. } else {
  752. data.add(deviceData == null ? value : String.valueOf(deviceData.getSalesCount()));
  753. }
  754. });
  755. } else if (i == 2) {
  756. //退款金额
  757. dateList.forEach(d -> {
  758. //每日数据填充
  759. DeviceDataDto.Vo deviceData = dataDayMap.get(d);
  760. if (deviceData == null) {
  761. data.add(String.valueOf(BigDecimal.ZERO));
  762. } else {
  763. Integer refundMoney = deviceData.getRefundMoney() == null ? 0 : deviceData.getRefundMoney();
  764. BigDecimal day = BigDecimal.valueOf(refundMoney).divide(BigDecimal.valueOf(100));
  765. data.add(String.valueOf(day));
  766. }
  767. });
  768. } else if (i == 3) {
  769. //退款数
  770. dateList.forEach(d -> {
  771. //每日数据填充
  772. DeviceDataDto.Vo deviceData = dataDayMap.get(d);
  773. if (deviceData == null) {
  774. data.add("0");
  775. } else {
  776. data.add(deviceData == null ? "0" : String.valueOf(deviceData.getRefundCount()));
  777. }
  778. });
  779. }
  780. myChartSeries.setName(names[i]);
  781. myChartSeries.setData(data);
  782. series.add(myChartSeries);
  783. }
  784. businessChart.setSeries(series);
  785. vo.setBusinessChart(businessChart);
  786. return vo;
  787. }
  788. /**
  789. * 温度图表
  790. *
  791. * @param dto
  792. * @return
  793. */
  794. private DeviceInfoDto.DeviceDataCountVO dataCount3(DeviceInfoDto.DeviceDataCountDTO dto) {
  795. DeviceInfoDto.DeviceDataCountVO vo = new DeviceInfoDto.DeviceDataCountVO();
  796. Long deviceId = dto.getDeviceId();
  797. String choosDate = dto.getChoosDate();
  798. if (StrUtil.isEmpty(choosDate)) {
  799. choosDate = DateUtil.formatDate(new Date());
  800. }
  801. String startTime = choosDate + " 00:00:00";
  802. String endTime = choosDate + " 23:59:59";
  803. //查询选定日期的温度数据
  804. List<DeviceTempRecords> deviceTempRecords = deviceTempRecordsService.list(Wrappers.<DeviceTempRecords>lambdaQuery()
  805. .eq(DeviceTempRecords::getDeviceId, deviceId).between(DeviceTempRecords::getCreateTime, startTime, endTime)
  806. .orderBy(true, true, DeviceTempRecords::getCreateTime));
  807. if (CollUtil.isEmpty(deviceTempRecords)) {
  808. return vo;
  809. }
  810. DeviceInfoDto.TemperatureChart temperatureChart = new DeviceInfoDto.TemperatureChart();
  811. List<String> categories = new ArrayList<>();
  812. String name = "温度";
  813. List<DeviceInfoDto.MyChartSeries2> series = new ArrayList<>();
  814. List<BigDecimal> data = new ArrayList<>();
  815. deviceTempRecords.forEach(d -> {
  816. String tempValue = d.getTempValue();
  817. LocalDateTime createTime = d.getCreateTime();
  818. String time = DateUtil.format(createTime, "HH:mm:ss");
  819. categories.add(time);
  820. data.add(NumberUtil.toBigDecimal(tempValue));
  821. });
  822. DeviceInfoDto.MyChartSeries2 myChartSeries = new DeviceInfoDto.MyChartSeries2();
  823. myChartSeries.setName(name);
  824. myChartSeries.setData(data);
  825. series.add(myChartSeries);
  826. temperatureChart.setSeries(series);
  827. temperatureChart.setCategories(categories);
  828. vo.setTemperatureChart(temperatureChart);
  829. return vo;
  830. }
  831. /**
  832. * 信号图表
  833. *
  834. * @param dto
  835. * @return
  836. */
  837. private DeviceInfoDto.DeviceDataCountVO dataCount4(DeviceInfoDto.DeviceDataCountDTO dto) {
  838. DeviceInfoDto.DeviceDataCountVO vo = new DeviceInfoDto.DeviceDataCountVO();
  839. Long deviceId = dto.getDeviceId();
  840. String choosDate = dto.getChoosDate();
  841. if (StrUtil.isEmpty(choosDate)) {
  842. choosDate = DateUtil.formatDate(new Date());
  843. }
  844. String startTime = choosDate + " 00:00:00";
  845. String endTime = choosDate + " 23:59:59";
  846. //查询选定日期的温度数据
  847. List<DeviceNetRecord> deviceNetRecords = deviceNetRecordService.list(Wrappers.<DeviceNetRecord>lambdaQuery()
  848. .eq(DeviceNetRecord::getDeviceId, deviceId).between(DeviceNetRecord::getCreateTime, startTime, endTime)
  849. .orderBy(true, true, DeviceNetRecord::getCreateTime));
  850. if (CollUtil.isEmpty(deviceNetRecords)) {
  851. return vo;
  852. }
  853. DeviceInfoDto.SignalChart signalChart = new DeviceInfoDto.SignalChart();
  854. List<String> categories = new ArrayList<>();
  855. String name = "信号";
  856. List<DeviceInfoDto.MyChartSeries> series = new ArrayList<>();
  857. List<Integer> data = new ArrayList<>();
  858. deviceNetRecords.forEach(d -> {
  859. Integer value = d.getSimDbm();
  860. LocalDateTime createTime = d.getCreateTime();
  861. String time = DateUtil.format(createTime, "HH:mm:ss");
  862. categories.add(time);
  863. data.add(value);
  864. });
  865. DeviceInfoDto.MyChartSeries myChartSeries = new DeviceInfoDto.MyChartSeries();
  866. myChartSeries.setName(name);
  867. myChartSeries.setData(data);
  868. series.add(myChartSeries);
  869. signalChart.setSeries(series);
  870. signalChart.setCategories(categories);
  871. vo.setSignalChart(signalChart);
  872. return vo;
  873. }
  874. /**
  875. * 商品管理
  876. *
  877. * @param dto
  878. * @return
  879. */
  880. private DeviceInfoDto.DeviceDataCountVO dataCount5(DeviceInfoDto.DeviceDataCountDTO dto) {
  881. Long deviceId = dto.getDeviceId();
  882. DeviceInfoDto.DeviceDataCountVO vo = new DeviceInfoDto.DeviceDataCountVO();
  883. DeviceStatus deviceStatus = deviceStatusService.getById(dto.getDeviceId());
  884. DeviceInfoDto.GoodsData goodsData = copy(DeviceInfoDto.GoodsData.class, deviceStatus);
  885. //在售商品种类
  886. //根据设备ID查商品id
  887. GoodsDeviceDto.SelectList selectList = new GoodsDeviceDto.SelectList();
  888. selectList.setDeviceIds(CollUtil.newArrayList(deviceId));
  889. R<List<GoodsDeviceDto.Vo>> r = R.feignCheck(goodsDeviceService.list(selectList));
  890. List<GoodsDeviceDto.Vo> goodsDeviceList = r.getData();
  891. goodsData.setCategoryNum(CollUtil.isNotEmpty(goodsDeviceList) ? goodsDeviceList.size() : 0);
  892. vo.setGoodsData(goodsData);
  893. return vo;
  894. }
  895. public PageBean<DeviceInfoDto.Vo2> queryPage(DeviceInfoDto.Page page) {
  896. IPage<DeviceInfoQueryPage> iPage = baseMapper.queryPage(toIPage(page.getPage()), page);
  897. return toPageBean(DeviceInfoDto.Vo2.class, iPage);
  898. }
  899. private <T> void check(T value, T value2, String msg) {
  900. if (value.toString().equals(value2.toString())) {
  901. throw new CommRuntimeException(msg);
  902. }
  903. }
  904. }