DeviceChargingJob.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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.list.JList;
  8. import com.xy.collections.map.JMap;
  9. import com.xy.device.EnumDeviceCharging;
  10. import com.xy.dto.DeviceInfoDto;
  11. import com.xy.dto.MercAccountDto;
  12. import com.xy.entity.DeviceCharging;
  13. import com.xy.entity.DeviceChargingHistory;
  14. import com.xy.entity.DeviceInfo;
  15. import com.xy.entity.SysDictRedis;
  16. import com.xy.mapper.DeviceChargingMapper;
  17. import com.xy.service.DeviceChargingHistoryServiceImpl;
  18. import com.xy.service.DeviceChargingServiceImpl;
  19. import com.xy.service.DeviceInfoServiceImpl;
  20. import com.xy.service.MercAccountService;
  21. import com.xy.utils.*;
  22. import lombok.AllArgsConstructor;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.springframework.stereotype.Component;
  25. import java.time.LocalDateTime;
  26. import java.util.ArrayList;
  27. import java.util.List;
  28. import java.util.Map;
  29. /**
  30. * 设备计费job
  31. */
  32. @Slf4j
  33. @Component
  34. @AllArgsConstructor
  35. public class DeviceChargingJob {
  36. private DeviceChargingServiceImpl deviceChargingService;
  37. private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
  38. private DeviceInfoServiceImpl deviceInfoService;
  39. private MercAccountService mercAccountService;
  40. private DeviceChargingMapper deviceChargingMapper;
  41. /**
  42. * 扣除设备服务费试用天数
  43. *
  44. * @return
  45. */
  46. @XxlJob("deviceChargingX")
  47. public ReturnT<String> deviceChargingX() {
  48. deviceChargingMapper.updateChargingX();
  49. log.info("设备试用时间扣除完成~");
  50. return ReturnT.SUCCESS;
  51. }
  52. /**
  53. * 设备计费
  54. *
  55. * @return
  56. */
  57. @XxlJob("deviceCharging")
  58. public ReturnT<String> deviceCharging() {
  59. deviceCharging(1, 20, null);
  60. log.info("设备计费完成~");
  61. return ReturnT.SUCCESS;
  62. }
  63. /**
  64. * 递归执行
  65. *
  66. * @param current
  67. * @param size
  68. * @param deviceIds
  69. */
  70. public void deviceCharging(int current, int size, List<Long> deviceIds) {
  71. log.info("设备计费开始第{}页", current);
  72. List<DeviceCharging> updateDeviceChargings = new ArrayList<>();
  73. List<DeviceChargingHistory> deviceChargingHistories = new ArrayList<>();
  74. List<DeviceInfoDto.Update> updateDeviceInfos = new ArrayList<>();
  75. LocalDateTime now = LocalDateTime.now();
  76. //查询已过期计费记录
  77. PageBean<DeviceCharging> pageBean = new PageBean().setCurrent(current).setSize(size);
  78. IPage<DeviceCharging> iPage = deviceChargingService.page(PlusBeans.toIPage(pageBean), new LambdaQueryWrapper<DeviceCharging>()
  79. .le(DeviceCharging::getTimeout, now)
  80. .in(Emptys.check(deviceIds), DeviceCharging::getDeviceId, deviceIds)
  81. );
  82. List<DeviceCharging> records = iPage.getRecords();
  83. if (!Emptys.check(records)) {
  84. return;
  85. }
  86. //查询设备信息
  87. JList<DeviceCharging> deviceChargings = new JArrayList<>(records);
  88. JMap<Long, DeviceCharging> deviceChargingsJMaps = deviceChargings.toMap(DeviceCharging::getDeviceId).cover();
  89. List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
  90. .in(DeviceInfo::getDeviceId, deviceChargings.getProperty(DeviceCharging::getDeviceId))
  91. );
  92. JMap<Long, DeviceInfo> deviceInfosJMaps = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
  93. //字典
  94. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode());
  95. SysDictRedis sysDictRedisY = stringSysDictRedisMap.get(EnumDeviceCharging.N_Y.getCode());
  96. Integer y = Integer.valueOf(sysDictRedisY.getValue());
  97. //开始计费
  98. deviceChargingsJMaps.forEach((deviceId, deviceCharging) -> {
  99. //发起扣款
  100. DeviceInfo deviceInfo = deviceInfosJMaps.get(deviceId);
  101. if (deviceInfo.getMercId() == -1) {
  102. return;
  103. }
  104. SysDictRedis sysDictRedisBalance = stringSysDictRedisMap.get(String.valueOf(deviceInfo.getDeviceType()));
  105. Integer balance = Integer.valueOf(sysDictRedisBalance.getValue());
  106. R r = mercAccountService.updateBalance(new MercAccountDto.UpdateBalance()
  107. .setMercId(deviceInfo.getMercId())
  108. .setBalance(balance)
  109. .setResean("设备管理费")
  110. );
  111. //扣款成功
  112. if (r.getCode() == R.Enum.SUCCESS.getCode()) {
  113. LocalDateTime newTimeOut = DataTime.toLocal(DataTime.getStringAround(1, 0, 0, 0, 0, 0, DataTime.toString(deviceCharging.getTimeout())));
  114. deviceCharging.setChargingSumMoney(deviceCharging.getChargingSumMoney() + balance)
  115. .setTimeout(newTimeOut);
  116. DeviceChargingHistory deviceChargingHistory = new DeviceChargingHistory()
  117. .createId()
  118. .setDeviceId(deviceId)
  119. .setChargingMoney(balance)
  120. .setChargingType(Integer.valueOf(stringSysDictRedisMap.get(EnumDeviceCharging.N_100.getCode()).getValue()))
  121. .setChargingDateTime(newTimeOut)
  122. .setCreateTime(now);
  123. deviceChargingHistories.add(deviceChargingHistory);
  124. }
  125. //扣款失败
  126. if (r.getCode() == R.Enum.FAIL.getCode()) {
  127. //当前时间 - 过期时间 > y && 试用期 <= 0 则冻结设备
  128. long day = DataTime.diff(now, deviceCharging.getTimeout(), "d");
  129. if (day > y && deviceCharging.getChargingX() <= 0) {
  130. DeviceInfoDto.Update update = new DeviceInfoDto.Update()
  131. .setDeviceId(deviceId);
  132. update.setFreezeStatus(2);
  133. updateDeviceInfos.add(update);
  134. }
  135. }
  136. updateDeviceChargings.add(deviceCharging);
  137. });
  138. //修改设备计费记录
  139. if (Emptys.check(updateDeviceChargings)) {
  140. deviceChargingService.updateBatchById(updateDeviceChargings);
  141. }
  142. //添加设备计费记录历史
  143. if (Emptys.check(deviceChargingHistories)) {
  144. deviceChargingHistoryService.saveBatch(deviceChargingHistories);
  145. }
  146. //冻结设备
  147. if (Emptys.check(updateDeviceInfos)) {
  148. deviceInfoService.updateBatch(updateDeviceInfos);
  149. }
  150. //判断是否继续下一页
  151. if (iPage.getPages() <= current) {
  152. return;
  153. } else {
  154. deviceCharging(current + 1, size, deviceIds);
  155. }
  156. }
  157. }