DeviceChargingServiceImpl.java 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package com.xy.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.xy.collections.list.JArrayList;
  6. import com.xy.collections.list.JList;
  7. import com.xy.collections.map.JMap;
  8. import com.xy.device.EnumDeviceCharging;
  9. import com.xy.device.EnumDeviceChargingHistoryStatus;
  10. import com.xy.dto.DeviceChargingDto;
  11. import com.xy.dto.DeviceInfoDto;
  12. import com.xy.entity.DeviceCharging;
  13. import com.xy.entity.DeviceChargingHistory;
  14. import com.xy.entity.SysDictRedis;
  15. import com.xy.error.CommRuntimeException;
  16. import com.xy.mapper.DeviceChargingMapper;
  17. import com.xy.utils.*;
  18. import io.swagger.annotations.Api;
  19. import io.swagger.annotations.ApiOperation;
  20. import lombok.AllArgsConstructor;
  21. import lombok.SneakyThrows;
  22. import org.springframework.context.annotation.Lazy;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.validation.annotation.Validated;
  25. import org.springframework.web.bind.annotation.PostMapping;
  26. import org.springframework.web.bind.annotation.RequestBody;
  27. import java.time.LocalDateTime;
  28. import java.util.List;
  29. import java.util.Map;
  30. import static com.xy.utils.PlusBeans.toIPage;
  31. import static com.xy.utils.PlusBeans.toPageBean;
  32. /**
  33. * <p>
  34. * 设备计费表 服务实现类
  35. * </p>
  36. *
  37. * @author lijin
  38. * @since 2023-04-14
  39. */
  40. @Service
  41. @Api(tags = "设备计费表")
  42. @AllArgsConstructor(onConstructor_ = @Lazy)
  43. public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper, DeviceCharging> implements DeviceChargingService {
  44. private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
  45. private DeviceInfoServiceImpl deviceInfoService;
  46. private DeviceChargingServiceImpl deviceChargingService;
  47. @PostMapping("check")
  48. @ApiOperation("检查")
  49. public R check(@RequestBody @Validated DeviceChargingDto.Check check) {
  50. LocalDateTime now = LocalDateTime.now();
  51. DeviceCharging deviceCharging = getById(check.getDeviceId());
  52. if (deviceCharging == null) {
  53. deviceChargingService.save(new DeviceCharging()
  54. .setDeviceId(check.getDeviceId())
  55. .setTimeout(now)
  56. .setCreateTime(now)
  57. );
  58. throw new CommRuntimeException("设备欠费,请充值");
  59. }
  60. int contrast = DataTime.stringContrast(DataTime.toString(deviceCharging.getTimeout()), DataTime.toString(now));
  61. if (deviceCharging.getChargingX() == 0 && contrast <= 0) {
  62. throw new CommRuntimeException("设备欠费,请充值");
  63. }
  64. return R.ok();
  65. }
  66. @PostMapping("page")
  67. @ApiOperation("分页查询")
  68. public R<PageBean<DeviceChargingDto.PageVo>> page(@RequestBody DeviceChargingDto.Page page) {
  69. Integer value = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_200.getCode(), Integer.class);
  70. String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
  71. page.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
  72. IPage<DeviceChargingDto.PageVo> iPage = baseMapper.page(toIPage(page.getPage()), page);
  73. List<DeviceChargingDto.PageVo> records = iPage.getRecords();
  74. if (Emptys.check(records)) {
  75. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode());
  76. for (DeviceChargingDto.PageVo record : records) {
  77. //封装过期状态说明
  78. String timeoutStatus;
  79. DeviceChargingDto.Vo deviceCharging = record.getDeviceCharging();
  80. LocalDateTime timeout = deviceCharging.getTimeout();
  81. long s = DataTime.diff(page.getThisTime(), timeout, "s");
  82. if (s <= 0) {
  83. timeoutStatus = "欠费(" + (~(s / 86400 - 1)) + "天)";
  84. } else {
  85. timeoutStatus = s <= value * 86400 ? "即将到期(" + s / 86400 + "天)" : "正常(" + s / 86400 + "天)";
  86. }
  87. record.getDeviceCharging().setTimeoutStatus(timeoutStatus);
  88. //封装计费标准金额
  89. DeviceInfoDto.Vo deviceInfo = record.getDeviceInfo();
  90. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(deviceInfo.getDeviceType().toString());
  91. if (sysDictRedis != null) {
  92. record.setChargingMoney(Integer.valueOf(sysDictRedis.getValue()));
  93. }
  94. }
  95. }
  96. return R.ok(toPageBean(iPage));
  97. }
  98. @Override
  99. @ApiOperation("购买")
  100. public R pay(DeviceChargingDto.Pay pay) {
  101. JList<DeviceChargingDto.Pay.DeviceCharging> deviceChargings = new JArrayList<>(pay.getDeviceChargings());
  102. Integer payType = pay.getPayType();
  103. LocalDateTime now = LocalDateTime.now();
  104. JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>();
  105. deviceChargings.forEach(deviceCharging -> {
  106. DeviceChargingHistory deviceChargingHistory = new DeviceChargingHistory()
  107. .createId()
  108. .setOrderId(pay.getOrderId())
  109. .setDeviceId(deviceCharging.getDeviceId())
  110. .setChargingSize(deviceCharging.getNum())
  111. .setChargingMoney(deviceCharging.getChargingMoney())
  112. .setChargingType(payType)
  113. .setStandard(deviceCharging.getStandard())
  114. .setCreateTime(now)
  115. .setUpdateTime(now);
  116. deviceChargingHistories.add(deviceChargingHistory);
  117. });
  118. if (!Emptys.check(deviceChargingHistories)) {
  119. return R.fail();
  120. }
  121. //添加设备计费历史表
  122. deviceChargingHistoryService.saveBatch(deviceChargingHistories);
  123. return R.ok();
  124. }
  125. @Override
  126. @ApiOperation("购买回调")
  127. public R payNotice(DeviceChargingDto.PayNotice payNotice) {
  128. //查询设备计费历史表
  129. List<DeviceChargingHistory> list = deviceChargingHistoryService.list(new LambdaQueryWrapper<DeviceChargingHistory>().eq(DeviceChargingHistory::getOrderId, payNotice.getOrderId()));
  130. if (!Emptys.check(list)) {
  131. return R.ok();
  132. }
  133. JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>(list);
  134. LocalDateTime now = LocalDateTime.now();
  135. //查询设备计费表
  136. List<DeviceCharging> deviceChargings = list(new LambdaQueryWrapper<DeviceCharging>().in(DeviceCharging::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
  137. JMap<Long, DeviceCharging> deviceChargingsJMaps = new JArrayList<>(deviceChargings).toMap(DeviceCharging::getDeviceId).cover();
  138. //获取已支付字典
  139. Integer status = SysDictUtils.getValue(EnumDeviceChargingHistoryStatus.Code.CODE.getCode(), EnumDeviceChargingHistoryStatus.N_2.getCode(), Integer.class);
  140. JList<DeviceCharging> updateDeviceCharging = new JArrayList<>();
  141. JList<DeviceInfoDto.Update> updateDeviceInfos = new JArrayList<>();
  142. JList<DeviceChargingHistory> updateDeviceChargingHistory = new JArrayList<>();
  143. for (DeviceChargingHistory deviceChargingHistory : deviceChargingHistories) {
  144. DeviceCharging deviceCharging = deviceChargingsJMaps.get(deviceChargingHistory.getDeviceId());
  145. Integer chargingSize = deviceChargingHistory.getChargingSize();
  146. boolean fal = false;
  147. //设备计费历史完成
  148. deviceChargingHistory.setStatus(status);
  149. if (deviceChargingHistory.getChargingType() == 100) {
  150. //赠送天数
  151. deviceCharging.setChargingX(deviceCharging.getChargingX() + chargingSize);
  152. fal = true;
  153. } else {
  154. String timeout = DataTime.getStringAround(chargingSize, 0, 0, 0, 0, 0, DataTime.toString(deviceCharging.getTimeout()));
  155. deviceCharging.setChargingSumMoney(deviceCharging.getChargingSumMoney() + deviceChargingHistory.getChargingMoney())
  156. .setTimeout(DataTime.toLocal(timeout));
  157. //过期时间大于当前时间
  158. if (DataTime.stringContrast(timeout, DataTime.toString(now)) > 0) {
  159. fal = true;
  160. }
  161. }
  162. if (fal) {
  163. //设备重新计费
  164. deviceCharging.setIsJob(true);
  165. //解冻设备
  166. DeviceInfoDto.Update deviceInfo = new DeviceInfoDto.Update()
  167. .setDeviceId(deviceChargingHistory.getDeviceId());
  168. deviceInfo.setFreezeStatus(1);
  169. deviceInfo.setBusyState(1);
  170. updateDeviceInfos.add(deviceInfo);
  171. }
  172. updateDeviceCharging.add(deviceCharging);
  173. updateDeviceChargingHistory.add(deviceChargingHistory);
  174. }
  175. int size = 50;
  176. //修改设备计费记录
  177. if (Emptys.check(updateDeviceCharging)) {
  178. JList<JList<DeviceCharging>> partition = updateDeviceCharging.partition(size);
  179. partition.forEach(data -> updateBatchById(data));
  180. }
  181. //修改设备计费历史记录
  182. if (Emptys.check(updateDeviceChargingHistory)) {
  183. JList<JList<DeviceChargingHistory>> partition = updateDeviceChargingHistory.partition(size);
  184. partition.forEach(data -> deviceChargingHistoryService.updateBatchById(data));
  185. }
  186. //修改设备
  187. if (Emptys.check(updateDeviceInfos)) {
  188. JList<JList<DeviceInfoDto.Update>> partition = updateDeviceInfos.partition(size);
  189. partition.forEach(data -> deviceInfoService.updateBatch(data));
  190. }
  191. return R.ok();
  192. }
  193. }