DeviceChargingServiceImpl.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. package com.xy.service;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.xy.collections.list.JArrayList;
  9. import com.xy.collections.list.JList;
  10. import com.xy.collections.map.JHashMap;
  11. import com.xy.collections.map.JMap;
  12. import com.xy.config.DeviceThreadPoolConfig;
  13. import com.xy.device.*;
  14. import com.xy.dto.*;
  15. import com.xy.dto.be.MercDto;
  16. import com.xy.entity.*;
  17. import com.xy.mapper.DeviceChargingMapper;
  18. import com.xy.service.be.MercService;
  19. import com.xy.utils.*;
  20. import io.swagger.annotations.Api;
  21. import io.swagger.annotations.ApiOperation;
  22. import lombok.AllArgsConstructor;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.springframework.context.annotation.Lazy;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.validation.annotation.Validated;
  27. import org.springframework.web.bind.annotation.PostMapping;
  28. import org.springframework.web.bind.annotation.RequestBody;
  29. import java.math.BigDecimal;
  30. import java.time.LocalDateTime;
  31. import java.util.ArrayList;
  32. import java.util.HashMap;
  33. import java.util.List;
  34. import java.util.Map;
  35. import static com.xy.utils.Beans.copy;
  36. import static com.xy.utils.PlusBeans.toIPage;
  37. import static com.xy.utils.PlusBeans.toPageBean;
  38. /**
  39. * <p>
  40. * 设备计费表 服务实现类
  41. * </p>
  42. *
  43. * @author lijin
  44. * @since 2023-04-14
  45. */
  46. @Slf4j
  47. @Service
  48. @Api(tags = "设备计费表")
  49. @AllArgsConstructor(onConstructor_ = @Lazy)
  50. public class DeviceChargingServiceImpl extends ServiceImpl<DeviceChargingMapper, DeviceCharging> implements DeviceChargingService {
  51. private DeviceChargingHistoryServiceImpl deviceChargingHistoryService;
  52. private DeviceInfoServiceImpl deviceInfoService;
  53. private DeviceTypeAlgorithmBeforConfigServiceImpl deviceTypeAlgorithmBeforConfigService;
  54. private DeviceChargingConfigServiceImpl deviceChargingConfigService;
  55. private DeviceAlgorithmChargingServiceImpl deviceAlgorithmChargingService;
  56. private DeviceStatusServiceImpl deviceStatusService;
  57. private DeviceSysinfoServiceImpl deviceSysinfoService;
  58. private AlipayDeviceService alipayDeviceService;
  59. private MercFeeConfigService mercFeeConfigService;
  60. private MercService mercService;
  61. @PostMapping("updateTimeout")
  62. @ApiOperation("修改过期时间")
  63. public R updateTimeout(@RequestBody @Validated DeviceChargingDto.UpdateTimeout updateTimeout) {
  64. update(new LambdaUpdateWrapper<DeviceCharging>()
  65. .set(DeviceCharging::getTimeout, updateTimeout.getTimeout())
  66. .in(DeviceCharging::getDeviceId, updateTimeout.getDeviceIds())
  67. );
  68. return R.ok();
  69. }
  70. @PostMapping("del")
  71. @ApiOperation("删除")
  72. public R del(@RequestBody @Validated DeviceChargingDto.Del del) {
  73. removeBatchByIds(del.getDeviceId());
  74. return R.ok();
  75. }
  76. @PostMapping("payCheck")
  77. @ApiOperation("购买反显")
  78. public R<Map<Long, DeviceChargingDto.PayCheckVo>> payCheck(@RequestBody @Validated DeviceChargingDto.PayCheck payCheck) {
  79. Map<Long, DeviceChargingDto.PayCheckVo> result = new HashMap<>();
  80. List<Long> deviceIds = payCheck.getDeviceId();
  81. List<DeviceInfo> list = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>()
  82. .in(DeviceInfo::getDeviceId, deviceIds)
  83. );
  84. if (!Emptys.check(list)) {
  85. return R.fail("设备不存在");
  86. }
  87. JList<DeviceInfo> deviceInfos = new JArrayList<>(list);
  88. JMap<Integer, DeviceInfo> cover = deviceInfos.toMap(DeviceInfo::getDeviceType).cover();
  89. if (cover.size() > 1) {
  90. return R.fail("设备类型必须一致");
  91. }
  92. // 佣金配置查询
  93. MercFeeConfigDto.FeeConfigByMercVO mercFeeConfig = R.feignCheckData(mercFeeConfigService.getFeeConfigByMerc(new MercFeeConfigDto.FeeConfigByMerc().setMercCode(list.get(0).getMercCode())));
  94. // 查询设备状态信息
  95. List<DeviceStatus> deviceStatuses = deviceStatusService.list(new LambdaQueryWrapper<DeviceStatus>().in(DeviceStatus::getDeviceId, deviceIds));
  96. JMap<Long, DeviceStatus> deviceStatusesJMaps = new JArrayList<>(deviceStatuses).toMap(DeviceStatus::getDeviceId).cover();
  97. List<String> mercCodes = new ArrayList<>();
  98. deviceAlgorithmChargingService.getMercCodes(list.get(0).getMercCode(), mercCodes);
  99. // 查询设备计费配置表 设备管理费
  100. List<DeviceChargingConfig> deviceChargingConfigs = deviceChargingConfigService.list(new LambdaQueryWrapper<DeviceChargingConfig>()
  101. .in(DeviceChargingConfig::getMercCode, mercCodes)
  102. .eq(DeviceChargingConfig::getType, SysDictUtils.getValue(EnumDeviceChargingConfigType.Code.CODE.getCode(), EnumDeviceChargingConfigType.N_2.getCode(), Integer.class))
  103. .eq(DeviceChargingConfig::getDeviceType, list.get(0).getDeviceType())
  104. .orderByDesc(DeviceChargingConfig::getMercCode)
  105. );
  106. // 设备管理费
  107. int standard = Emptys.check(deviceChargingConfigs) ? (deviceChargingConfigs.get(0).getConfigValue())
  108. : SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), String.valueOf(list.get(0).getDeviceType()), Integer.class);
  109. standard = mercFeeConfig.getFeeDevice() + standard;
  110. String deviceTypeName = SysDictUtils.get(EnumDeviceType.Code.CODE.getCode(), String.valueOf(list.get(0).getDeviceType())).getMsg();
  111. // 查询算法预充配置 设备激活
  112. JList<DeviceInfo> values = cover.getValues();
  113. List<DeviceTypeAlgorithmBeforConfig> deviceTypeAlgorithmBeforConfigs = deviceTypeAlgorithmBeforConfigService.list(new LambdaQueryWrapper<DeviceTypeAlgorithmBeforConfig>()
  114. .eq(DeviceTypeAlgorithmBeforConfig::getDeviceType, list.get(0).getDeviceType())
  115. .in(DeviceTypeAlgorithmBeforConfig::getMercCode, mercCodes)
  116. .in(DeviceTypeAlgorithmBeforConfig::getAlgorithmId, values.getProperty(DeviceInfo::getAlgorithmId))
  117. );
  118. JMap<Long, DeviceTypeAlgorithmBeforConfig> deviceTypeAlgorithmBeforConfigsJMaps = Emptys.check(deviceTypeAlgorithmBeforConfigs) ? new JArrayList<>(deviceTypeAlgorithmBeforConfigs).toMap(DeviceTypeAlgorithmBeforConfig::getAlgorithmId).cover()
  119. : new JHashMap<>();
  120. // 查询默认算法信息
  121. JList<Long> algorithmIds = deviceInfos.getProperty(DeviceInfo::getAlgorithmId);
  122. Map<Long, String> moonAlgorithmTypesMap = new HashMap<>();
  123. Map<Long, String> algorithmPayConfigMap = new HashMap<>();
  124. for (Long algorithmId : algorithmIds) {
  125. SysDictRedis moonAlgorithmTypes = SysDictUtils.get(EnumAlgorithmTypes.Code.CODE.getCode(), String.valueOf(algorithmId));
  126. SysDictRedis algorithmPayConfig = SysDictUtils.get(EnumAlgorithmPayConfig.Code.CODE.getCode(), String.valueOf(algorithmId));
  127. if (Emptys.check(moonAlgorithmTypes)) {
  128. moonAlgorithmTypesMap.put(algorithmId, moonAlgorithmTypes.getMsg());
  129. }
  130. if (Emptys.check(algorithmPayConfig)) {
  131. algorithmPayConfigMap.put(algorithmId, algorithmPayConfig.getValue());
  132. }
  133. }
  134. for (DeviceInfo deviceInfo : list) {
  135. // 封装设备信息
  136. DeviceChargingDto.PayCheckVo payCheckVo = new DeviceChargingDto.PayCheckVo();
  137. DeviceStatus deviceStatus = deviceStatusesJMaps.get(deviceInfo.getDeviceId());
  138. DeviceChargingDto.PayCheckVo.DeviceInfo deviceInfoObj = Beans.copy(Beans.copy(DeviceChargingDto.PayCheckVo.DeviceInfo.class, deviceInfo), deviceStatus)
  139. .setDeviceTypeName(deviceTypeName)
  140. .setStandard(BigDecimal.valueOf(standard).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/年")
  141. .setMoney(standard);
  142. // 封装算法购买信息
  143. DeviceTypeAlgorithmBeforConfig deviceTypeAlgorithmBeforConfig = deviceTypeAlgorithmBeforConfigsJMaps.get(deviceInfo.getAlgorithmId());
  144. String algorithmName = moonAlgorithmTypesMap.get(deviceInfo.getAlgorithmId());
  145. String algorithmPayConfig = algorithmPayConfigMap.get(deviceInfo.getAlgorithmId());
  146. DeviceAlgorithmChargingDto.AlgorithmMoonConfig algorithmMoonConfig = JSONUtil.parseObj(algorithmPayConfig).toBean(DeviceAlgorithmChargingDto.AlgorithmMoonConfig.class);
  147. DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Inf inf = algorithmMoonConfig.getInf();
  148. // 单笔算法费用 代理商额外收取
  149. int extraSingleMoney = mercFeeConfig.getFeeAlgorithm();
  150. DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging infDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
  151. .setDeviceTypeName(deviceTypeName)
  152. .setAlgorithmId(deviceInfo.getAlgorithmId())
  153. .setAlgorithmName(algorithmName)
  154. // 算法计费标准
  155. .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice() + extraSingleMoney).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/每笔(" + inf.getSize() + "笔)")
  156. // 设备激活 代理商费用 deviceTypeAlgorithmBeforConfig.getExtraMoney()
  157. .setMoney(deviceTypeAlgorithmBeforConfig == null ? inf.getMoney() + mercFeeConfig.getFeeActive() : deviceTypeAlgorithmBeforConfig.getMoney() + mercFeeConfig.getFeeActive());
  158. // 封装算法包月信息
  159. DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Moon moon = algorithmMoonConfig.getMoon();
  160. DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging moonDeviceAlgorithmCharging = Beans.copy(DeviceChargingDto.PayCheckVo.DeviceAlgorithmCharging.class, deviceInfo)
  161. .setDeviceTypeName(deviceTypeName)
  162. .setAlgorithmId(deviceInfo.getAlgorithmId())
  163. .setAlgorithmName(algorithmName)
  164. .setStandard(BigDecimal.valueOf(algorithmMoonConfig.getPrice()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN).doubleValue() + "元/包月(" + moon.getSize() + "笔)")
  165. .setMoney(moon.getMoney());
  166. payCheckVo.setDeviceInfo(deviceInfoObj)
  167. .setInfDeviceAlgorithmCharging(infDeviceAlgorithmCharging)
  168. .setMoonDeviceAlgorithmCharging(moonDeviceAlgorithmCharging);
  169. result.put(deviceInfo.getDeviceId(), payCheckVo);
  170. }
  171. return R.ok(result);
  172. }
  173. @PostMapping("check")
  174. @ApiOperation("检查")
  175. public R check(@RequestBody @Validated DeviceChargingDto.Check check) {
  176. LocalDateTime now = LocalDateTime.now();
  177. DeviceCharging deviceCharging = getById(check.getDeviceId());
  178. // 不存在则新增
  179. if (deviceCharging == null) {
  180. // 查询设备计费配置表
  181. DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(check.getDeviceId())).getData();
  182. List<String> mercCodes = new ArrayList<>();
  183. deviceAlgorithmChargingService.getMercCodes(deviceInfo.getMercCode(), mercCodes);
  184. List<DeviceChargingConfig> deviceChargingConfigs = deviceChargingConfigService.list(new LambdaQueryWrapper<DeviceChargingConfig>()
  185. .in(DeviceChargingConfig::getMercCode, mercCodes)
  186. .eq(DeviceChargingConfig::getType, SysDictUtils.getValue(EnumDeviceChargingConfigType.Code.CODE.getCode(), EnumDeviceChargingConfigType.N_1.getCode(), Integer.class))
  187. .eq(DeviceChargingConfig::getDeviceType, deviceInfo.getDeviceType())
  188. .orderByDesc(DeviceChargingConfig::getMercCode)
  189. );
  190. // 有则使用,无则使用默认字典
  191. int chargingX = Emptys.check(deviceChargingConfigs) ? deviceChargingConfigs.get(0).getConfigValue()
  192. : SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_X.getCode(), Integer.class);
  193. // 新增
  194. String timeout = DataTime.getStringAround(0, 0, chargingX, 0, 0, 0);
  195. deviceCharging = new DeviceCharging()
  196. .setDeviceId(check.getDeviceId())
  197. .setTimeout(DataTime.toLocal(timeout))
  198. .setCreateTime(now);
  199. save(deviceCharging);
  200. }
  201. // 验证过期时间
  202. int contrast = DataTime.stringContrast(DataTime.toString(deviceCharging.getTimeout()), DataTime.toString(now));
  203. if (contrast <= 0) {
  204. return R.fail(R.Enum.CHARGING.getCode(), R.Enum.CHARGING.getMsg());
  205. }
  206. return R.ok();
  207. }
  208. @PostMapping("page")
  209. @ApiOperation("分页查询")
  210. public R<PageBean<DeviceChargingDto.PageVo>> page(@RequestBody DeviceChargingDto.Page page) {
  211. Integer value = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_200.getCode(), Integer.class);
  212. Integer prep = SysDictUtils.getValue(EnumDeviceChargingConfigType.Code.CODE.getCode(), EnumDeviceChargingConfigType.N_2.getCode(), Integer.class);
  213. String theTime = DataTime.getStringAround(0, 0, value, 0, 0, 0);
  214. page.setThisTime(LocalDateTime.now()).setTheTime(DataTime.toLocal(theTime));
  215. IPage<DeviceChargingDto.PageVo> iPage = baseMapper.page(toIPage(page.getPage()), page);
  216. List<DeviceChargingDto.PageVo> records = iPage.getRecords();
  217. if (Emptys.check(records)) {
  218. Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get(EnumDeviceCharging.Code.CODE.getCode());
  219. Long mercId = page.getMercId();
  220. MercDto.Vo merc = mercService.obj(new MercDto.Vo().setId(mercId)).getData();
  221. // 佣金配置查询
  222. MercFeeConfigDto.FeeConfigByMercVO mercFeeConfig = R.feignCheckData(mercFeeConfigService.getFeeConfigByMerc(new MercFeeConfigDto.FeeConfigByMerc().setMercCode(merc.getMercCode())));
  223. // 设备管理费佣金
  224. Integer feeDevice = mercFeeConfig.getFeeDevice();
  225. for (DeviceChargingDto.PageVo record : records) {
  226. // 封装过期状态说明
  227. String timeoutStatus;
  228. DeviceChargingDto.Vo deviceCharging = record.getDeviceCharging();
  229. LocalDateTime timeout = deviceCharging.getTimeout();
  230. long s = DataTime.diff(page.getThisTime(), timeout, "s");
  231. if (s <= 0) {
  232. timeoutStatus = "欠费(" + (~(s / 86400 - 1)) + "天)";
  233. } else {
  234. timeoutStatus = s <= value * 86400 ? "即将到期(" + s / 86400 + "天)" : "正常(" + s / 86400 + "天)";
  235. }
  236. record.getDeviceCharging().setTimeoutStatus(timeoutStatus);
  237. DeviceInfoDto.Vo deviceInfo = record.getDeviceInfo();
  238. // 查询设备计费配置
  239. DeviceChargingConfigDto.SelectList selectList = new DeviceChargingConfigDto.SelectList()
  240. .setDeviceType(deviceInfo.getDeviceType())
  241. .setMercId(deviceInfo.getMercId());
  242. selectList.setType(prep);
  243. List<DeviceChargingConfigDto.Vo> deviceChargingConfigs = deviceChargingConfigService.list2(selectList).getData();
  244. if (Emptys.check(deviceChargingConfigs)) {
  245. // 获取自定义配置计费标准
  246. DeviceChargingConfigDto.Vo deviceChargingConfig = deviceChargingConfigs.get(0);
  247. record.setChargingMoney(deviceChargingConfig.getConfigValue() + feeDevice);
  248. } else {
  249. // 获取默认计费标准
  250. SysDictRedis sysDictRedis = stringSysDictRedisMap.get(deviceInfo.getDeviceType().toString());
  251. if (sysDictRedis != null) {
  252. record.setChargingMoney(Integer.valueOf(sysDictRedis.getValue()) + feeDevice);
  253. }
  254. }
  255. }
  256. }
  257. return R.ok(toPageBean(iPage));
  258. }
  259. @Override
  260. @ApiOperation("购买")
  261. public R pay(DeviceChargingDto.Pay pay) {
  262. JList<DeviceChargingDto.Pay.DeviceCharging> deviceChargings = new JArrayList<>(pay.getDeviceChargings());
  263. Integer payType = pay.getPayType();
  264. LocalDateTime now = LocalDateTime.now();
  265. JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>();
  266. deviceChargings.forEach(deviceCharging -> {
  267. DeviceChargingHistory deviceChargingHistory = new DeviceChargingHistory()
  268. .createId()
  269. .setMercId(pay.getMercId())
  270. .setOrderId(pay.getOrderId())
  271. .setDeviceId(deviceCharging.getDeviceId())
  272. .setChargingSize(deviceCharging.getNum())
  273. .setChargingMoney(deviceCharging.getChargingMoney())
  274. .setChargingType(payType)
  275. .setCreateTime(now)
  276. .setUpdateTime(now)
  277. .setNote(pay.getNote());
  278. deviceChargingHistories.add(deviceChargingHistory);
  279. });
  280. if (!Emptys.check(deviceChargingHistories)) {
  281. return R.fail();
  282. }
  283. // 添加设备计费历史表
  284. deviceChargingHistoryService.saveBatch(deviceChargingHistories);
  285. return R.ok();
  286. }
  287. @Override
  288. @ApiOperation("购买回调")
  289. public R payNotice(DeviceChargingDto.PayNotice payNotice) {
  290. // 查询设备计费历史表
  291. List<DeviceChargingHistory> list = deviceChargingHistoryService.list(new LambdaQueryWrapper<DeviceChargingHistory>().eq(DeviceChargingHistory::getOrderId, payNotice.getOrderId()));
  292. if (!Emptys.check(list)) {
  293. return R.ok();
  294. }
  295. LocalDateTime now = LocalDateTime.now();
  296. JList<DeviceChargingHistory> deviceChargingHistories = new JArrayList<>(list);
  297. int aliDeviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
  298. // 查询设备信息
  299. List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
  300. JMap<Long, DeviceInfo> deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
  301. // 查询设备系统信息
  302. List<DeviceSysinfoDto.Vo> deviceSysinfos = deviceSysinfoService.list(new DeviceSysinfoDto.SelectList().setDeviceIds(deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId))).getData();
  303. JMap<Long, DeviceSysinfoDto.Vo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfoDto.Vo::getDeviceId).cover();
  304. // 查询设备计费表
  305. List<DeviceCharging> deviceChargings = list(new LambdaQueryWrapper<DeviceCharging>().in(DeviceCharging::getDeviceId, deviceChargingHistories.getProperty(DeviceChargingHistory::getDeviceId)));
  306. JMap<Long, DeviceCharging> deviceChargingsJMaps = new JArrayList<>(deviceChargings).toMap(DeviceCharging::getDeviceId).cover();
  307. // 获取已支付字典
  308. Integer status = SysDictUtils.getValue(EnumDeviceChargingHistoryStatus.Code.CODE.getCode(), EnumDeviceChargingHistoryStatus.N_2.getCode(), Integer.class);
  309. JList<DeviceCharging> updateDeviceCharging = new JArrayList<>();
  310. JList<DeviceInfoDto.Update> updateDeviceInfos = new JArrayList<>();
  311. JList<DeviceChargingHistory> updateDeviceChargingHistory = new JArrayList<>();
  312. JList<Tuple.Tuple2<BindDeviceDTO, BindActiveDTO>> ailiActive = new JArrayList<>();
  313. for (DeviceChargingHistory deviceChargingHistory : deviceChargingHistories) {
  314. DeviceInfo deviceInfo = deviceInfoJMap.get(deviceChargingHistory.getDeviceId());
  315. DeviceCharging deviceCharging = deviceChargingsJMaps.get(deviceChargingHistory.getDeviceId())
  316. .setLastChargingPayType(deviceChargingHistory.getChargingType())
  317. .setLastChargingMoney(deviceChargingHistory.getChargingMoney())
  318. .setLastChargingTime(now);
  319. Integer chargingSize = deviceChargingHistory.getChargingSize();
  320. boolean fal = false;
  321. // 设备计费历史完成
  322. deviceChargingHistory.setStatus(status);
  323. String timeout = DataTime.getStringAround(chargingSize, 0, 0, 0, 0, 0, DataTime.toString(deviceCharging.getTimeout()));
  324. deviceCharging.setChargingSumMoney(deviceCharging.getChargingSumMoney() + deviceChargingHistory.getChargingMoney())
  325. .setTimeout(DataTime.toLocal(timeout));
  326. // 过期时间大于当前时间
  327. if (DataTime.stringContrast(timeout, DataTime.toString(now)) > 0) {
  328. fal = true;
  329. }
  330. if (fal) {
  331. // 解冻设备
  332. DeviceInfoDto.Update updateDeviceInfo = new DeviceInfoDto.Update()
  333. .setDeviceId(deviceChargingHistory.getDeviceId());
  334. updateDeviceInfo.setFreezeStatus(1);
  335. // 激活设备
  336. if (deviceChargingHistory.getChargingType() != 100) {
  337. if (deviceInfo.getActiveState() == 2) {
  338. updateDeviceInfo.setActiveState(1);
  339. }
  340. if (!Emptys.check(deviceInfo.getActiveTime())) {
  341. updateDeviceInfo.setActiveTime(now);
  342. }
  343. }
  344. updateDeviceInfos.add(updateDeviceInfo);
  345. }
  346. // 支付宝设备
  347. if (deviceInfo.getDeviceType() == aliDeviceType) {
  348. if (deviceChargingHistory.getChargingType() != 100 && deviceInfo.getActiveState() == 2) {
  349. // 支付宝绑定
  350. DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfosJMaps.get(deviceChargingHistory.getDeviceId());
  351. BindDeviceDTO bindDeviceDTO = new BindDeviceDTO().setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
  352. .setBoardSn(deviceSysinfo.getDeviceSn());
  353. // 支付宝激活
  354. BindActiveDTO bindActiveDTO = new BindActiveDTO()
  355. .setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
  356. .setBoardSn(deviceSysinfo.getDeviceSn())
  357. .setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceInfo.getDeviceId()));
  358. ailiActive.add(new Tuple.Tuple2<>(bindDeviceDTO, bindActiveDTO));
  359. //运营状态运营
  360. alipayDeviceService.changeStatus(new DeviceChangeStatusDTO()
  361. .setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
  362. .setOperatorId("1")
  363. .setStatus(1)
  364. );
  365. }
  366. }
  367. updateDeviceCharging.add(deviceCharging);
  368. updateDeviceChargingHistory.add(deviceChargingHistory);
  369. }
  370. int size = 50;
  371. // 修改设备计费记录
  372. if (Emptys.check(updateDeviceCharging)) {
  373. JList<JList<DeviceCharging>> partition = updateDeviceCharging.partition(size);
  374. partition.forEach(data -> updateBatchById(data));
  375. }
  376. // 修改设备计费历史记录
  377. if (Emptys.check(updateDeviceChargingHistory)) {
  378. JList<JList<DeviceChargingHistory>> partition = updateDeviceChargingHistory.partition(size);
  379. partition.forEach(data -> deviceChargingHistoryService.updateBatchById(data));
  380. }
  381. // 修改设备
  382. if (Emptys.check(updateDeviceInfos)) {
  383. JList<JList<DeviceInfoDto.Update>> partition = updateDeviceInfos.partition(size);
  384. partition.forEach(data -> deviceInfoService.updateBatch(data));
  385. }
  386. // 支付宝刷脸柜激活请求
  387. log.info("支付宝刷脸柜激活请求参数:{}", ailiActive.toString());
  388. if (Emptys.check(ailiActive)) {
  389. ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALI_DEVICE_ACTIVE, ailiActive.size());
  390. ailiActive.forEach(bindDeviceDTOBindActiveDTOTuple2 -> execute.execute(() -> {
  391. // 调用支付宝绑定
  392. R.feignCheckData(alipayDeviceService.deviceBind(bindDeviceDTOBindActiveDTOTuple2.getV1()));
  393. // 调用支付宝激活
  394. R.feignCheckData(alipayDeviceService.deviceActive(bindDeviceDTOBindActiveDTOTuple2.getV2()));
  395. }));
  396. }
  397. return R.ok();
  398. }
  399. @Override
  400. @ApiOperation("集合查询")
  401. public R<List<DeviceChargingDto.Vo>> list(DeviceChargingDto.SelectList selectList) {
  402. LambdaQueryWrapper<DeviceCharging> lambdaQueryWrapper = new LambdaQueryWrapper<DeviceCharging>()
  403. .in(DeviceCharging::getDeviceId, selectList.getDeviceIds());
  404. List<DeviceCharging> list = list(lambdaQueryWrapper);
  405. List<DeviceChargingDto.Vo> copy = copy(DeviceChargingDto.Vo.class, list);
  406. return R.ok(copy);
  407. }
  408. @Override
  409. @ApiOperation("查询过期条数")
  410. public R<DeviceChargingDto.DeviceChargingTimeoutCountVo> deviceChargingTimeoutCount(DeviceChargingDto.DeviceChargingTimeoutCount deviceChargingTimeoutCount) {
  411. String now = DataTime.getSring();
  412. int day = SysDictUtils.getValue(EnumDeviceCharging.Code.CODE.getCode(), EnumDeviceCharging.N_200.getCode(), Integer.class);
  413. String end1 = DataTime.getStringAround(0, 0, day, 0, 0, 0, now);
  414. deviceChargingTimeoutCount.setBegin1(now)
  415. .setEnd1(end1)
  416. .setEnd2(now);
  417. DeviceChargingDto.DeviceChargingTimeoutCountVo deviceChargingTimeoutCountVo = baseMapper.deviceChargingTimeoutCount(deviceChargingTimeoutCount);
  418. return R.ok(deviceChargingTimeoutCountVo);
  419. }
  420. }