DeviceChargingJob.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.xy.job;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.xxl.job.core.biz.model.ReturnT;
  5. import com.xxl.job.core.handler.annotation.XxlJob;
  6. import com.xy.collections.list.JArrayList;
  7. import com.xy.collections.map.JMap;
  8. import com.xy.device.EnumDeviceCharging;
  9. import com.xy.dto.DeviceInfoDto;
  10. import com.xy.entity.DeviceCharging;
  11. import com.xy.entity.SysDictRedis;
  12. import com.xy.mapper.DeviceChargingMapper;
  13. import com.xy.service.DeviceChargingServiceImpl;
  14. import com.xy.service.DeviceInfoServiceImpl;
  15. import com.xy.utils.*;
  16. import lombok.AllArgsConstructor;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.stereotype.Component;
  19. import java.time.LocalDateTime;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import java.util.Map;
  23. /**
  24. * 设备计费job
  25. */
  26. @Slf4j
  27. @Component
  28. @AllArgsConstructor
  29. public class DeviceChargingJob {
  30. private DeviceChargingServiceImpl deviceChargingService;
  31. private DeviceInfoServiceImpl deviceInfoService;
  32. private DeviceChargingMapper deviceChargingMapper;
  33. /**
  34. * 扣除设备服务费试用天数
  35. *
  36. * @return
  37. */
  38. @XxlJob("deviceChargingX")
  39. public ReturnT<String> deviceChargingX() {
  40. deviceChargingMapper.updateChargingX();
  41. log.info("设备试用时间扣除完成~");
  42. return ReturnT.SUCCESS;
  43. }
  44. /**
  45. * 设备计费
  46. *
  47. * @return
  48. */
  49. @XxlJob("deviceCharging")
  50. public ReturnT<String> deviceCharging() {
  51. deviceCharging(1, 50, LocalDateTime.now());
  52. log.info("设备计费完成~");
  53. return ReturnT.SUCCESS;
  54. }
  55. /**
  56. * 递归执行
  57. *
  58. * @param current
  59. * @param size
  60. * @param thisDateTime
  61. */
  62. public void deviceCharging(int current, int size, LocalDateTime thisDateTime) {
  63. log.info("设备计费开始第{}页", current);
  64. List<DeviceCharging> updateDeviceChargings = new ArrayList<>();
  65. List<DeviceInfoDto.Update> updateDeviceInfos = new ArrayList<>();
  66. //查询已过期计费记录
  67. IPage<DeviceCharging> iPage = deviceChargingService.page(PlusBeans.toIPage(new PageBean().setCurrent(current).setSize(size)), new LambdaQueryWrapper<DeviceCharging>()
  68. .le(DeviceCharging::getTimeout, thisDateTime)
  69. .eq(DeviceCharging::getIsJob, true)
  70. .le(DeviceCharging::getChargingX, 0)
  71. );
  72. List<DeviceCharging> records = iPage.getRecords();
  73. if (!Emptys.check(records)) {
  74. return;
  75. }
  76. JMap<Long, DeviceCharging> deviceChargingsJMaps = new JArrayList<>(records).toMap(DeviceCharging::getDeviceId).cover();
  77. //字典
  78. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode());
  79. SysDictRedis sysDictRedisY = stringSysDictRedisMap.get(EnumDeviceCharging.N_Y.getCode());
  80. Integer y = Integer.valueOf(sysDictRedisY.getValue());
  81. //开始计费
  82. deviceChargingsJMaps.forEach((deviceId, deviceCharging) -> {
  83. //当前时间 - 过期时间 > y
  84. long day = DataTime.diff(thisDateTime, deviceCharging.getTimeout(), "d");
  85. if (day > y) {
  86. DeviceInfoDto.Update update = new DeviceInfoDto.Update()
  87. .setDeviceId(deviceId);
  88. update.setFreezeStatus(2);
  89. update.setBusyState(2);
  90. deviceCharging.setIsJob(false);
  91. updateDeviceChargings.add(deviceCharging);
  92. updateDeviceInfos.add(update);
  93. }
  94. });
  95. //修改设备计费记录
  96. if (Emptys.check(updateDeviceChargings)) {
  97. deviceChargingService.updateBatchById(updateDeviceChargings);
  98. }
  99. //冻结设备
  100. if (Emptys.check(updateDeviceInfos)) {
  101. deviceInfoService.updateBatch(updateDeviceInfos);
  102. }
  103. //判断是否继续下一页
  104. if (iPage.getPages() <= current) {
  105. return;
  106. } else {
  107. deviceCharging(current + 1, size, thisDateTime);
  108. }
  109. }
  110. }