DeviceChargingServiceImpl.java 18 KB

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