DeviceChargingServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. package com.xy.service;
  2. import cn.hutool.json.JSONUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  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.*;
  10. import com.xy.dto.DeviceAlgorithmChargingDto;
  11. import com.xy.dto.DeviceChargingDto;
  12. import com.xy.dto.DeviceInfoDto;
  13. import com.xy.entity.*;
  14. import com.xy.error.CommRuntimeException;
  15. import com.xy.mapper.DeviceChargingMapper;
  16. import com.xy.utils.*;
  17. import io.swagger.annotations.Api;
  18. import io.swagger.annotations.ApiOperation;
  19. import lombok.AllArgsConstructor;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.context.annotation.Lazy;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.validation.annotation.Validated;
  24. import org.springframework.web.bind.annotation.PostMapping;
  25. import org.springframework.web.bind.annotation.RequestBody;
  26. import java.math.BigDecimal;
  27. import java.time.LocalDateTime;
  28. import java.util.ArrayList;
  29. import java.util.List;
  30. import java.util.Map;
  31. import static com.xy.utils.PlusBeans.toIPage;
  32. import static com.xy.utils.PlusBeans.toPageBean;
  33. /**
  34. * <p>
  35. * 设备计费表 服务实现类
  36. * </p>
  37. *
  38. * @author lijin
  39. * @since 2023-04-14
  40. */
  41. @Slf4j
  42. @Service
  43. @Api(tags = "设备计费表")
  44. @AllArgsConstructor(onConstructor_ = @Lazy)
  45. public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper, DeviceCharging> implements DeviceChargingService {
  46. private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
  47. private DeviceInfoServiceImpl deviceInfoService;
  48. private DeviceTypeAlgorithmBeforConfigServiceImpl deviceTypeAlgorithmBeforConfigService;
  49. @PostMapping("init")
  50. @ApiOperation("初始化")
  51. public R init() {
  52. LocalDateTime localDateTime = LocalDateTime.now();
  53. List<DeviceInfo> list = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().eq(DeviceInfo::getActiveState, 1));
  54. List<DeviceCharging> deviceChargings = new ArrayList<>(list.size());
  55. for (DeviceInfo deviceInfo : list) {
  56. DeviceCharging deviceCharging = new DeviceCharging()
  57. .setDeviceId(deviceInfo.getDeviceId())
  58. .setTimeout(localDateTime)
  59. .setCreateTime(localDateTime);
  60. deviceChargings.add(deviceCharging);
  61. }
  62. saveBatch(deviceChargings);
  63. return R.ok();
  64. }
  65. @PostMapping("payCheck")
  66. @ApiOperation("购买反显")
  67. public R<DeviceChargingDto.PayCheckVo> payCheck(@RequestBody @Validated DeviceChargingDto.PayCheck payCheck) {
  68. DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(payCheck.getDeviceId()).setIsStatus(true)).getData();
  69. if (deviceInfo == null) {
  70. return R.fail("设备不存在");
  71. }
  72. //封装设备信息
  73. DeviceChargingDto.PayCheckVo payCheckVo = new DeviceChargingDto.PayCheckVo();
  74. String deviceTypeName = SysDictUtils.get(EnumDeviceType.Code.CODE.getCode(), String.valueOf(deviceInfo.getDeviceType())).getMsg();
  75. Integer standard = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), String.valueOf(deviceInfo.getDeviceType()), Integer.class);
  76. DeviceChargingDto.PayCheckVo.DeviceInfo deviceInfoObj = Beans.copy(Beans.copy(DeviceChargingDto.PayCheckVo.DeviceInfo.class, deviceInfo), deviceInfo.getDeviceStatus())
  77. .setDeviceTypeName(deviceTypeName)
  78. .setStandard(BigDecimal.valueOf(standard).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/年")
  79. .setMoney(standard);
  80. //封装算法购买信息
  81. DeviceTypeAlgorithmBeforConfig deviceTypeAlgorithmBeforConfig = deviceTypeAlgorithmBeforConfigService.getOne(new LambdaQueryWrapper<DeviceTypeAlgorithmBeforConfig>()
  82. .eq(DeviceTypeAlgorithmBeforConfig::getDeviceType, deviceInfo.getDeviceType())
  83. .eq(DeviceTypeAlgorithmBeforConfig::getMercId, deviceInfo.getMercId())
  84. .eq(DeviceTypeAlgorithmBeforConfig::getAlgorithmId, deviceInfo.getAlgorithmId())
  85. );
  86. SysDictRedis moonAlgorithmTypes = SysDictUtils.get(EnumAlgorithmTypes.Code.CODE.getCode(), String.valueOf(deviceInfo.getAlgorithmId()));
  87. String algorithmPayConfig = SysDictUtils.getValue(EnumAlgorithmPayConfig.Code.CODE.getCode(), String.valueOf(deviceInfo.getAlgorithmId()), String.class);
  88. DeviceAlgorithmChargingDto.AlgorithmMoonConfig algorithmMoonConfig = JSONUtil.parseObj(algorithmPayConfig).toBean(DeviceAlgorithmChargingDto.AlgorithmMoonConfig.class);
  89. DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Inf inf = algorithmMoonConfig.getInf();
  90. DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging infDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
  91. .setDeviceTypeName(deviceTypeName)
  92. .setAlgorithmId(deviceInfo.getAlgorithmId())
  93. .setAlgorithmName(moonAlgorithmTypes.getMsg())
  94. .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/每笔(" + inf.getSize() + "笔)")
  95. .setMoney(deviceTypeAlgorithmBeforConfig == null ? inf.getMoney() : deviceTypeAlgorithmBeforConfig.getMoney());
  96. //封装算法包月信息
  97. DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Moon moon = algorithmMoonConfig.getMoon();
  98. DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging moonDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
  99. .setDeviceTypeName(deviceTypeName)
  100. .setAlgorithmId(deviceInfo.getAlgorithmId())
  101. .setAlgorithmName(moonAlgorithmTypes.getMsg())
  102. .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/包月(" + moon.getSize() + "笔)")
  103. .setMoney(moon.getMoney());
  104. payCheckVo.setDeviceInfo(deviceInfoObj).setInfDeviceAlgorithmCharging(infDeviceAlgorithmCharging).setMoonDeviceAlgorithmCharging(moonDeviceAlgorithmCharging);
  105. return R.ok(payCheckVo);
  106. }
  107. @PostMapping("check")
  108. @ApiOperation("检查")
  109. public R check(@RequestBody @Validated DeviceChargingDto.Check check) {
  110. LocalDateTime now = LocalDateTime.now();
  111. DeviceCharging deviceCharging = getById(check.getDeviceId());
  112. if (deviceCharging == null) {
  113. save(new DeviceCharging()
  114. .setDeviceId(check.getDeviceId())
  115. .setTimeout(now)
  116. .setCreateTime(now)
  117. );
  118. throw new CommRuntimeException(R.Enum.CHARGING.getCode(), R.Enum.CHARGING.getMsg());
  119. }
  120. int contrast = DataTime.stringContrast(DataTime.toString(deviceCharging.getTimeout()), DataTime.toString(now));
  121. if (deviceCharging.getChargingX() == 0 && contrast <= 0) {
  122. throw new CommRuntimeException(R.Enum.CHARGING.getCode(), R.Enum.CHARGING.getMsg());
  123. }
  124. return R.ok();
  125. }
  126. @PostMapping("page")
  127. @ApiOperation("分页查询")
  128. public R<PageBean<DeviceChargingDto.PageVo>> page(@RequestBody DeviceChargingDto.Page page) {
  129. Integer value = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_200.getCode(), Integer.class);
  130. String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
  131. page.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
  132. IPage<DeviceChargingDto.PageVo> iPage = baseMapper.page(toIPage(page.getPage()), page);
  133. List<DeviceChargingDto.PageVo> records = iPage.getRecords();
  134. if (Emptys.check(records)) {
  135. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode());
  136. for (DeviceChargingDto.PageVo record : records) {
  137. //封装过期状态说明
  138. String timeoutStatus;
  139. DeviceChargingDto.Vo deviceCharging = record.getDeviceCharging();
  140. LocalDateTime timeout = deviceCharging.getTimeout();
  141. long s = DataTime.diff(page.getThisTime(), timeout, "s");
  142. if (s <= 0) {
  143. timeoutStatus = "欠费(" + (~(s / 86400 - 1)) + "天)";
  144. } else {
  145. timeoutStatus = s <= value * 86400 ? "即将到期(" + s / 86400 + "天)" : "正常(" + s / 86400 + "天)";
  146. }
  147. record.getDeviceCharging().setTimeoutStatus(timeoutStatus);
  148. //封装计费标准金额
  149. DeviceInfoDto.Vo deviceInfo = record.getDeviceInfo();
  150. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(deviceInfo.getDeviceType().toString());
  151. if (sysDictRedis != null) {
  152. record.setChargingMoney(Integer.valueOf(sysDictRedis.getValue()));
  153. }
  154. }
  155. }
  156. return R.ok(toPageBean(iPage));
  157. }
  158. @Override
  159. @ApiOperation("购买")
  160. public R pay(DeviceChargingDto.Pay pay) {
  161. JList<DeviceChargingDto.Pay.DeviceCharging> deviceChargings = new JArrayList<>(pay.getDeviceChargings());
  162. Integer payType = pay.getPayType();
  163. LocalDateTime now = LocalDateTime.now();
  164. JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>();
  165. deviceChargings.forEach(deviceCharging -> {
  166. DeviceChargingHistory deviceChargingHistory = new DeviceChargingHistory()
  167. .createId()
  168. .setOrderId(pay.getOrderId())
  169. .setDeviceId(deviceCharging.getDeviceId())
  170. .setChargingSize(deviceCharging.getNum())
  171. .setChargingMoney(deviceCharging.getChargingMoney())
  172. .setChargingType(payType)
  173. .setStandard(deviceCharging.getStandard())
  174. .setCreateTime(now)
  175. .setUpdateTime(now);
  176. deviceChargingHistories.add(deviceChargingHistory);
  177. });
  178. if (!Emptys.check(deviceChargingHistories)) {
  179. return R.fail();
  180. }
  181. //添加设备计费历史表
  182. deviceChargingHistoryService.saveBatch(deviceChargingHistories);
  183. return R.ok();
  184. }
  185. @Override
  186. @ApiOperation("购买回调")
  187. public R payNotice(DeviceChargingDto.PayNotice payNotice) {
  188. //查询设备计费历史表
  189. List<DeviceChargingHistory> list = deviceChargingHistoryService.list(new LambdaQueryWrapper<DeviceChargingHistory>().eq(DeviceChargingHistory::getOrderId, payNotice.getOrderId()));
  190. if (!Emptys.check(list)) {
  191. return R.ok();
  192. }
  193. LocalDateTime now = LocalDateTime.now();
  194. JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>(list);
  195. //查询设备信息
  196. List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
  197. JMap<Long, DeviceInfo> deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
  198. //查询设备计费表
  199. List<DeviceCharging> deviceChargings = list(new LambdaQueryWrapper<DeviceCharging>().in(DeviceCharging::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
  200. JMap<Long, DeviceCharging> deviceChargingsJMaps = new JArrayList<>(deviceChargings).toMap(DeviceCharging::getDeviceId).cover();
  201. //获取已支付字典
  202. Integer status = SysDictUtils.getValue(EnumDeviceChargingHistoryStatus.Code.CODE.getCode(), EnumDeviceChargingHistoryStatus.N_2.getCode(), Integer.class);
  203. JList<DeviceCharging> updateDeviceCharging = new JArrayList<>();
  204. JList<DeviceInfoDto.Update> updateDeviceInfos = new JArrayList<>();
  205. JList<DeviceChargingHistory> updateDeviceChargingHistory = new JArrayList<>();
  206. for (DeviceChargingHistory deviceChargingHistory : deviceChargingHistories) {
  207. DeviceCharging deviceCharging = deviceChargingsJMaps.get(deviceChargingHistory.getDeviceId())
  208. .setLastChargingPayType(deviceChargingHistory.getChargingType())
  209. .setLastChargingMoney(deviceChargingHistory.getChargingMoney())
  210. .setLastChargingTime(now);
  211. Integer chargingSize = deviceChargingHistory.getChargingSize();
  212. boolean fal = false;
  213. //设备计费历史完成
  214. deviceChargingHistory.setStatus(status);
  215. if (deviceChargingHistory.getChargingType() == 100) {
  216. //赠送天数
  217. deviceCharging.setChargingX(deviceCharging.getChargingX() + chargingSize);
  218. fal = true;
  219. } else {
  220. String timeout = DataTime.getStringAround(chargingSize, 0, 0, 0, 0, 0, DataTime.toString(deviceCharging.getTimeout()));
  221. deviceCharging.setChargingSumMoney(deviceCharging.getChargingSumMoney() + deviceChargingHistory.getChargingMoney())
  222. .setTimeout(DataTime.toLocal(timeout));
  223. //过期时间大于当前时间
  224. if (DataTime.stringContrast(timeout, DataTime.toString(now)) > 0) {
  225. fal = true;
  226. }
  227. }
  228. if (fal) {
  229. //设备重新计费
  230. deviceCharging.setIsJob(true);
  231. //解冻设备
  232. DeviceInfoDto.Update updateDeviceInfo = new DeviceInfoDto.Update()
  233. .setDeviceId(deviceChargingHistory.getDeviceId());
  234. updateDeviceInfo.setFreezeStatus(1);
  235. updateDeviceInfo.setBusyState(1);
  236. //激活设备
  237. if (deviceChargingHistory.getChargingType() != 100) {
  238. DeviceInfo deviceInfo = deviceInfoJMap.get(deviceChargingHistory.getDeviceId());
  239. if (deviceInfo.getActiveState() == 2) {
  240. updateDeviceInfo.setActiveState(1);
  241. }
  242. if (!Emptys.check(deviceInfo.getActiveTime())) {
  243. updateDeviceInfo.setActiveTime(now);
  244. }
  245. }
  246. updateDeviceInfos.add(updateDeviceInfo);
  247. }
  248. updateDeviceCharging.add(deviceCharging);
  249. updateDeviceChargingHistory.add(deviceChargingHistory);
  250. }
  251. int size = 50;
  252. //修改设备计费记录
  253. if (Emptys.check(updateDeviceCharging)) {
  254. JList<JList<DeviceCharging>> partition = updateDeviceCharging.partition(size);
  255. partition.forEach(data -> updateBatchById(data));
  256. }
  257. //修改设备计费历史记录
  258. if (Emptys.check(updateDeviceChargingHistory)) {
  259. JList<JList<DeviceChargingHistory>> partition = updateDeviceChargingHistory.partition(size);
  260. partition.forEach(data -> deviceChargingHistoryService.updateBatchById(data));
  261. }
  262. //修改设备
  263. if (Emptys.check(updateDeviceInfos)) {
  264. JList<JList<DeviceInfoDto.Update>> partition = updateDeviceInfos.partition(size);
  265. partition.forEach(data -> deviceInfoService.updateBatch(data));
  266. }
  267. return R.ok();
  268. }
  269. }