DeviceAlgorithmChargingServiceImpl.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  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.metadata.IPage;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.github.yitter.idgen.YitIdHelper;
  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.EnumAlgorithmPayConfig;
  14. import com.xy.device.EnumDeviceAlgorithmChargingHistoryStatus;
  15. import com.xy.device.EnumDeviceAlgorithmChargingType;
  16. import com.xy.device.EnumDeviceType;
  17. import com.xy.dto.*;
  18. import com.xy.dto.be.MercDto;
  19. import com.xy.entity.DeviceAlgorithmCharging;
  20. import com.xy.entity.DeviceAlgorithmChargingHistory;
  21. import com.xy.entity.DeviceInfo;
  22. import com.xy.entity.SysDictRedis;
  23. import com.xy.mapper.DeviceAlgorithmChargingMapper;
  24. import com.xy.mapper.entity.DeviceAlgorithmChargingChargingQueryParams;
  25. import com.xy.service.be.MercService;
  26. import com.xy.utils.*;
  27. import io.swagger.annotations.Api;
  28. import io.swagger.annotations.ApiOperation;
  29. import lombok.AllArgsConstructor;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.springframework.context.annotation.Lazy;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.PostMapping;
  35. import org.springframework.web.bind.annotation.RequestBody;
  36. import java.time.LocalDateTime;
  37. import java.util.ArrayList;
  38. import java.util.List;
  39. import java.util.Map;
  40. import static com.xy.utils.PlusBeans.toPageBean;
  41. /**
  42. * <p>
  43. * 设备算法计费表 服务实现类
  44. * </p>
  45. *
  46. * @author lijin
  47. * @since 2023-06-29
  48. */
  49. @Slf4j
  50. @Service
  51. @AllArgsConstructor(onConstructor_ = @Lazy)
  52. @Api(tags = "设备算法计费表")
  53. public class DeviceAlgorithmChargingServiceImpl extends ServiceImpl<DeviceAlgorithmChargingMapper, DeviceAlgorithmCharging> implements DeviceAlgorithmChargingService {
  54. private DeviceAlgorithmChargingHistoryServiceImpl deviceAlgorithmChargingHistoryService;
  55. private DeviceInfoServiceImpl deviceInfoService;
  56. private MercService mercService;
  57. private DeviceSysinfoServiceImpl deviceSysinfoService;
  58. private AlipayDeviceService alipayDeviceService;
  59. private MercDeviceAlgorithmChargingService mercDeviceAlgorithmChargingService;
  60. @PostMapping("count")
  61. @ApiOperation("查询条数")
  62. public R<List<DeviceAlgorithmChargingDto.CountVo>> count(@RequestBody @Validated DeviceAlgorithmChargingDto.Count count) {
  63. MercDto.Vo merc = mercService.obj(new MercDto.Vo().setId(count.getMercId())).getData();
  64. //默认值
  65. JList<Long> deviceIds = new JArrayList<>(count.getDeviceIds());
  66. JList<DeviceAlgorithmChargingDto.CountVo> countVos = new JArrayList<>(deviceIds.size());
  67. deviceIds.forEach(deviceId -> {
  68. DeviceAlgorithmChargingDto.CountVo countVo = new DeviceAlgorithmChargingDto.CountVo()
  69. .setDeviceId(deviceId)
  70. .setUnusedCount(0)
  71. .setUnusedSize(0)
  72. .setMakeSize(0)
  73. .setArrearageBalance(0);
  74. countVos.add(countVo);
  75. });
  76. JMap<Long, DeviceAlgorithmChargingDto.CountVo> cover = countVos.toMap(DeviceAlgorithmChargingDto.CountVo::getDeviceId).cover();
  77. //查询全部
  78. JList<JList<Long>> partition = deviceIds.partition(100);
  79. JList<DeviceAlgorithmCharging> deviceAlgorithmChargings = new JArrayList<>();
  80. partition.forEach(longs -> {
  81. List<DeviceAlgorithmCharging> list = list(new LambdaQueryWrapper<DeviceAlgorithmCharging>()
  82. .select(DeviceAlgorithmCharging::getDeviceId, DeviceAlgorithmCharging::getMakeSize, DeviceAlgorithmCharging::getUnusedSize, DeviceAlgorithmCharging::getTimeout, DeviceAlgorithmCharging::getBeginTime)
  83. .in(DeviceAlgorithmCharging::getDeviceId, longs)
  84. .eq(DeviceAlgorithmCharging::getMercCode, merc.getMercCode())
  85. );
  86. deviceAlgorithmChargings.addAll(list);
  87. });
  88. JMap<Long, List<DeviceAlgorithmCharging>> allGroup = deviceAlgorithmChargings.toMap(DeviceAlgorithmCharging::getDeviceId).group();
  89. //查询未使用
  90. String thisTime = DataTime.getSring("yyyyMMdd");
  91. JList<DeviceAlgorithmCharging> unuseds = deviceAlgorithmChargings.filter()
  92. .gt(DeviceAlgorithmCharging::getUnusedSize, 0)
  93. .eq(DeviceAlgorithmCharging::getTimeout, -1)
  94. .le(DeviceAlgorithmCharging::getBeginTime, thisTime)
  95. .list();
  96. JList<DeviceAlgorithmCharging> unuseds2 = deviceAlgorithmChargings.filter()
  97. .gt(DeviceAlgorithmCharging::getUnusedSize, 0)
  98. .ge(DeviceAlgorithmCharging::getTimeout, thisTime)
  99. .le(DeviceAlgorithmCharging::getBeginTime, thisTime)
  100. .list();
  101. if (Emptys.check(unuseds2)) {
  102. unuseds.addAll(unuseds2);
  103. }
  104. JMap<Long, List<DeviceAlgorithmCharging>> unusedGroup = unuseds.toMap(DeviceAlgorithmCharging::getDeviceId).group();
  105. //统计设备欠费金额
  106. List<MercDeviceAlgorithmChargingDto.CountArrearageBalanceVo> countArrearageBalanceVos = mercDeviceAlgorithmChargingService.countArrearageBalance(new MercDeviceAlgorithmChargingDto.CountArrearageBalance()
  107. .setDeviceIds(deviceIds)
  108. .setMercId(merc.getId())
  109. ).getData();
  110. JMap<Long, MercDeviceAlgorithmChargingDto.CountArrearageBalanceVo> countArrearageBalanceVosJMaps = new JArrayList<>(countArrearageBalanceVos).toMap(MercDeviceAlgorithmChargingDto.CountArrearageBalanceVo::getDeviceId).cover();
  111. //封装数据
  112. cover.forEach((deviceId, countVo) -> {
  113. //未使用
  114. List<DeviceAlgorithmCharging> deviceAlgorithmChargings1 = unusedGroup.get(deviceId);
  115. if (Emptys.check(deviceAlgorithmChargings1)) {
  116. countVo.setUnusedCount(deviceAlgorithmChargings1.size());
  117. int unusedSize = 0;
  118. for (DeviceAlgorithmCharging deviceAlgorithmCharging : deviceAlgorithmChargings1) {
  119. unusedSize += deviceAlgorithmCharging.getUnusedSize();
  120. }
  121. countVo.setUnusedSize(unusedSize);
  122. }
  123. //已使用
  124. List<DeviceAlgorithmCharging> deviceAlgorithmChargings2 = allGroup.get(deviceId);
  125. if (Emptys.check(deviceAlgorithmChargings2)) {
  126. int makeSize = 0;
  127. for (DeviceAlgorithmCharging deviceAlgorithmCharging : deviceAlgorithmChargings2) {
  128. makeSize += deviceAlgorithmCharging.getMakeSize();
  129. }
  130. countVo.setMakeSize(makeSize);
  131. }
  132. //欠费金额
  133. MercDeviceAlgorithmChargingDto.CountArrearageBalanceVo countArrearageBalanceVo = countArrearageBalanceVosJMaps.get(deviceId);
  134. if (Emptys.check(countArrearageBalanceVo)) {
  135. countVo.setArrearageBalance(countArrearageBalanceVo.getArrearageBalance());
  136. }
  137. });
  138. return R.ok(countVos);
  139. }
  140. @PostMapping("page")
  141. @ApiOperation("分页查询")
  142. public R<PageBean<DeviceAlgorithmChargingDto.Vo>> page(@RequestBody @Validated DeviceAlgorithmChargingDto.Page page) {
  143. LambdaQueryWrapper<DeviceAlgorithmCharging> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceAlgorithmCharging.class)
  144. .build()
  145. .orderByDesc(DeviceAlgorithmCharging::getTimeout, DeviceAlgorithmCharging::getUnusedSize);
  146. IPage<DeviceAlgorithmCharging> iPage = page(PlusBeans.toIPage(page.getPage()), lambdaQueryWrapper);
  147. return R.ok(toPageBean(DeviceAlgorithmChargingDto.Vo.class, iPage));
  148. }
  149. @PostMapping("check")
  150. @ApiOperation("检查")
  151. public R check(@RequestBody @Validated DeviceAlgorithmChargingDto.Check check) {
  152. int yyyyMMdd = Integer.valueOf(DataTime.getSring("yyyyMMdd"));
  153. DeviceInfoDto.Vo deviceInfo = deviceInfoService.obj(new DeviceInfoDto.Obj().setDeviceId(check.getDeviceId())).getData();
  154. List<DeviceAlgorithmCharging> deviceAlgorithmChargings = list(new LambdaQueryWrapper<DeviceAlgorithmCharging>()
  155. .eq(DeviceAlgorithmCharging::getDeviceId, deviceInfo.getDeviceId())
  156. .eq(DeviceAlgorithmCharging::getAlgorithmId, deviceInfo.getAlgorithmId())
  157. .gt(DeviceAlgorithmCharging::getUnusedSize, 0)
  158. .and(deviceAlgorithmChargingLambdaQueryWrapper -> deviceAlgorithmChargingLambdaQueryWrapper
  159. .ge(DeviceAlgorithmCharging::getTimeout, yyyyMMdd)
  160. .or()
  161. .eq(DeviceAlgorithmCharging::getTimeout, -1)
  162. )
  163. .ge(DeviceAlgorithmCharging::getBeginTime, yyyyMMdd)
  164. );
  165. if (!Emptys.check(deviceAlgorithmChargings)) {
  166. return R.fail(R.Enum.ALGORITHM_CHARGING.getCode(), R.Enum.ALGORITHM_CHARGING.getMsg());
  167. }
  168. return R.ok();
  169. }
  170. @Override
  171. @ApiOperation("购买")
  172. public R pay(DeviceAlgorithmChargingDto.Pay pay) {
  173. JList<DeviceAlgorithmChargingDto.Pay.DeviceAlgorithmCharging> deviceAlgorithmChargings = new JArrayList<>(pay.getDeviceAlgorithmChargings());
  174. LocalDateTime now = LocalDateTime.now();
  175. List<DeviceAlgorithmChargingHistory> deviceAlgorithmChargingHistories = new ArrayList<>(deviceAlgorithmChargings.size());
  176. deviceAlgorithmChargings.forEach(deviceAlgorithmCharging -> {
  177. DeviceAlgorithmChargingHistory deviceAlgorithmChargingHistory = new DeviceAlgorithmChargingHistory()
  178. .setId(YitIdHelper.nextId())
  179. .setMercId(pay.getMercId())
  180. .setOrderId(pay.getOrderId())
  181. .setDeviceId(deviceAlgorithmCharging.getDeviceId())
  182. .setAlgorithmId(deviceAlgorithmCharging.getAlgorithmId())
  183. .setChargingSize(deviceAlgorithmCharging.getChargingSize())
  184. .setChargingMoney(deviceAlgorithmCharging.getMoney())
  185. .setType(deviceAlgorithmCharging.getType())
  186. .setName(deviceAlgorithmCharging.getName())
  187. .setChargingType(pay.getPayType())
  188. .setCreateTime(now)
  189. .setUpdateTime(now)
  190. .setNote(pay.getNote());
  191. deviceAlgorithmChargingHistories.add(deviceAlgorithmChargingHistory);
  192. });
  193. //添加设备算法计费历史表
  194. if (Emptys.check(deviceAlgorithmChargingHistories)) {
  195. deviceAlgorithmChargingHistoryService.saveBatch(deviceAlgorithmChargingHistories);
  196. }
  197. return R.ok();
  198. }
  199. @Override
  200. @ApiOperation("购买回调")
  201. public R payNotice(DeviceAlgorithmChargingDto.PayNotice payNotice) {
  202. List<DeviceAlgorithmChargingHistory> list = deviceAlgorithmChargingHistoryService.list(new LambdaQueryWrapper<DeviceAlgorithmChargingHistory>().eq(DeviceAlgorithmChargingHistory::getOrderId, payNotice.getOrderId()));
  203. if (!Emptys.check(list)) {
  204. return R.ok();
  205. }
  206. JList<DeviceAlgorithmChargingHistory> deviceAlgorithmChargingHistories = new JArrayList<>(list);
  207. JList<DeviceAlgorithmChargingHistory> infs = new JArrayList<>();
  208. JList<DeviceAlgorithmChargingHistory> gives = new JArrayList<>();
  209. LocalDateTime now = LocalDateTime.now();
  210. int yyyyMMdd = Integer.valueOf(DataTime.getSring("yyyyMMdd"));
  211. //查询设备信息
  212. List<DeviceInfo> deviceInfos = deviceInfoService.list(new LambdaQueryWrapper<DeviceInfo>().in(DeviceInfo::getDeviceId, deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getDeviceId)));
  213. JMap<Long, DeviceInfo> deviceInfoJMap = new JArrayList<>(deviceInfos).toMap(DeviceInfo::getDeviceId).cover();
  214. //查询设备系统信息
  215. List<DeviceSysinfoDto.Vo> deviceSysinfos = deviceSysinfoService.list(new DeviceSysinfoDto.SelectList().setDeviceIds(deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getDeviceId))).getData();
  216. JMap<Long, DeviceSysinfoDto.Vo> deviceSysinfosJMaps = new JArrayList<>(deviceSysinfos).toMap(DeviceSysinfoDto.Vo::getDeviceId).cover();
  217. //获取算法包月字典
  218. Map<String, SysDictRedis> algorithmMoonConfigMaps = SysDictUtils.get(EnumAlgorithmPayConfig.Code.CODE.getCode());
  219. //获取类型字典
  220. Map<String, SysDictRedis> deviceAlgorithmChargingTypeMaps = SysDictUtils.get(EnumDeviceAlgorithmChargingType.Code.CODE.getCode());
  221. //查询商户信息
  222. List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(deviceAlgorithmChargingHistories.getProperty(DeviceAlgorithmChargingHistory::getMercId))).getData();
  223. JMap<Long, MercDto.Vo> mercsMaps = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
  224. JList<DeviceInfoDto.Update> updateDeviceInfos = new JArrayList<>();
  225. JList<Tuple.Tuple2<BindDeviceDTO, BindActiveDTO>> ailiActive = new JArrayList<>();
  226. int aliDeviceType = SysDictUtils.getValue(EnumDeviceType.Code.CODE.getCode(), EnumDeviceType.N_5.getCode(), Integer.class);
  227. //处理有效期
  228. deviceAlgorithmChargingHistories.forEach(deviceAlgorithmChargingHistory -> {
  229. //解冻设备 激活设备
  230. if (deviceAlgorithmChargingHistory.getChargingType() != 100) {
  231. DeviceInfoDto.Update updateDeviceInfo = new DeviceInfoDto.Update()
  232. .setDeviceId(deviceAlgorithmChargingHistory.getDeviceId());
  233. updateDeviceInfo.setFreezeStatus(1);
  234. updateDeviceInfo.setBusyState(1);
  235. DeviceInfo deviceInfo = deviceInfoJMap.get(deviceAlgorithmChargingHistory.getDeviceId());
  236. if (deviceInfo.getActiveState() == 2) {
  237. updateDeviceInfo.setActiveState(1);
  238. }
  239. if (!Emptys.check(deviceInfo.getActiveTime())) {
  240. updateDeviceInfo.setActiveTime(now);
  241. }
  242. updateDeviceInfos.add(updateDeviceInfo);
  243. }
  244. //支付宝设备
  245. DeviceInfo deviceInfo = deviceInfoJMap.get(deviceAlgorithmChargingHistory.getDeviceId());
  246. if (deviceInfo.getDeviceType() == aliDeviceType) {
  247. if (deviceAlgorithmChargingHistory.getChargingType() != 100 && deviceInfo.getActiveState() == 2) {
  248. //支付宝绑定
  249. DeviceSysinfoDto.Vo deviceSysinfo = deviceSysinfosJMaps.get(deviceAlgorithmChargingHistory.getDeviceId());
  250. BindDeviceDTO bindDeviceDTO = new BindDeviceDTO().setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
  251. .setBoardSn(deviceSysinfo.getDeviceSn());
  252. //支付宝激活
  253. BindActiveDTO bindActiveDTO = new BindActiveDTO()
  254. .setTerminalId(String.valueOf(deviceInfo.getDeviceId()))
  255. .setBoardSn(deviceSysinfo.getDeviceSn())
  256. .setDeviceName(StrUtil.isNotEmpty(deviceInfo.getDeviceName()) ? deviceInfo.getDeviceName() : String.valueOf(deviceInfo.getDeviceId()));
  257. ailiActive.add(new Tuple.Tuple2<>(bindDeviceDTO, bindActiveDTO));
  258. }
  259. }
  260. Integer type = deviceAlgorithmChargingHistory.getType();
  261. SysDictRedis deviceAlgorithmChargingType2 = deviceAlgorithmChargingTypeMaps.get(EnumDeviceAlgorithmChargingType.N_2.getCode());
  262. if (type.equals(Integer.valueOf(deviceAlgorithmChargingType2.getValue()))) {
  263. infs.add(deviceAlgorithmChargingHistory);
  264. return;
  265. }
  266. SysDictRedis deviceAlgorithmChargingType3 = deviceAlgorithmChargingTypeMaps.get(EnumDeviceAlgorithmChargingType.N_3.getCode());
  267. if (type.equals(Integer.valueOf(deviceAlgorithmChargingType3.getValue()))) {
  268. gives.add(deviceAlgorithmChargingHistory);
  269. return;
  270. }
  271. SysDictRedis algorithmMoonConfigDict = algorithmMoonConfigMaps.get(deviceAlgorithmChargingHistory.getAlgorithmId().toString());
  272. DeviceAlgorithmChargingDto.AlgorithmMoonConfig algorithmMoonConfig = JSONUtil.parseObj(algorithmMoonConfigDict.getValue()).toBean(DeviceAlgorithmChargingDto.AlgorithmMoonConfig.class);
  273. DeviceAlgorithmChargingDto.AlgorithmMoonConfig.Moon moon = algorithmMoonConfig.getMoon();
  274. Integer chargingSize = deviceAlgorithmChargingHistory.getChargingSize();
  275. for (Integer integer = 0; integer < chargingSize; integer++) {
  276. //查询生效时间最大的算法计费
  277. LambdaQueryWrapper<DeviceAlgorithmCharging> lambdaQueryWrapper = new LambdaQueryWrapper<DeviceAlgorithmCharging>()
  278. .eq(DeviceAlgorithmCharging::getDeviceId, deviceAlgorithmChargingHistory.getDeviceId())
  279. .eq(DeviceAlgorithmCharging::getAlgorithmId, deviceAlgorithmChargingHistory.getAlgorithmId())
  280. .eq(DeviceAlgorithmCharging::getType, type)
  281. .orderByDesc(DeviceAlgorithmCharging::getBeginTime)
  282. .last("limit 1");
  283. DeviceAlgorithmCharging deviceAlgorithmCharging = getOne(lambdaQueryWrapper);
  284. int beginTime;
  285. int timeout;
  286. if (deviceAlgorithmCharging == null) {
  287. beginTime = Integer.valueOf(DataTime.toString(deviceAlgorithmChargingHistory.getCreateTime(), "yyyyMMdd"));
  288. String stringAround = DataTime.getStringAround(0, 1, 0, 0, 0, 0, DataTime.toString(deviceAlgorithmChargingHistory.getCreateTime()));
  289. timeout = Integer.valueOf(DataTime.toString(DataTime.toLocal(stringAround), "yyyyMMdd"));
  290. } else {
  291. LocalDateTime localDateTime = DataTime.toLocal(deviceAlgorithmCharging.getBeginTime() + "01000000", "yyyyMMddHHmmss");
  292. String s = DataTime.toString(localDateTime, "yyyy-MM-dd HH:mm:ss");
  293. String stringAround = DataTime.getStringAround(0, 1, 0, 0, 0, 0, s);
  294. beginTime = Integer.valueOf(DataTime.toString(DataTime.toLocal(stringAround), "yyyyMMdd"));
  295. String stringAround1 = DataTime.getStringAround(0, 1, 0, 0, 0, 0, stringAround);
  296. timeout = Integer.valueOf(DataTime.toString(DataTime.toLocal(stringAround1), "yyyyMMdd"));
  297. }
  298. MercDto.Vo merc = mercsMaps.get(deviceAlgorithmChargingHistory.getMercId());
  299. DeviceAlgorithmCharging deviceAlgorithmChargingInfo = new DeviceAlgorithmCharging()
  300. .setMercCode(merc.getMercCode())
  301. .setDeviceId(deviceAlgorithmChargingHistory.getDeviceId())
  302. .setAlgorithmId(deviceAlgorithmChargingHistory.getAlgorithmId())
  303. .setUnusedSize(moon.getSize())
  304. .setType(type)
  305. .setName(deviceAlgorithmChargingHistory.getName())
  306. .setTimeout(timeout)
  307. .setBeginTime(beginTime)
  308. .setCreateTime(now)
  309. .setUpdateTime(now);
  310. save(deviceAlgorithmChargingInfo);
  311. }
  312. });
  313. //处理无期限
  314. infs.forEach(deviceAlgorithmChargingHistory -> {
  315. MercDto.Vo merc = mercsMaps.get(deviceAlgorithmChargingHistory.getMercId());
  316. DeviceAlgorithmCharging deviceAlgorithmChargingInfo = new DeviceAlgorithmCharging()
  317. .setMercCode(merc.getMercCode())
  318. .setDeviceId(deviceAlgorithmChargingHistory.getDeviceId())
  319. .setAlgorithmId(deviceAlgorithmChargingHistory.getAlgorithmId())
  320. .setUnusedSize(deviceAlgorithmChargingHistory.getChargingSize())
  321. .setType(deviceAlgorithmChargingHistory.getType())
  322. .setName(deviceAlgorithmChargingHistory.getName())
  323. .setTimeout(-1)
  324. .setBeginTime(yyyyMMdd)
  325. .setCreateTime(now)
  326. .setUpdateTime(now);
  327. save(deviceAlgorithmChargingInfo);
  328. });
  329. //处理赠送
  330. gives.forEach(deviceAlgorithmChargingHistory -> {
  331. MercDto.Vo merc = mercsMaps.get(deviceAlgorithmChargingHistory.getMercId());
  332. DeviceAlgorithmCharging deviceAlgorithmChargingInfo = new DeviceAlgorithmCharging()
  333. .setMercCode(merc.getMercCode())
  334. .setDeviceId(deviceAlgorithmChargingHistory.getDeviceId())
  335. .setAlgorithmId(deviceAlgorithmChargingHistory.getAlgorithmId())
  336. .setUnusedSize(deviceAlgorithmChargingHistory.getChargingSize())
  337. .setType(deviceAlgorithmChargingHistory.getType())
  338. .setName(deviceAlgorithmChargingHistory.getName())
  339. .setTimeout(payNotice.getTimeout())
  340. .setBeginTime(yyyyMMdd)
  341. .setCreateTime(now)
  342. .setUpdateTime(now);
  343. save(deviceAlgorithmChargingInfo);
  344. });
  345. //修改设备算法计费历史
  346. if (Emptys.check(deviceAlgorithmChargingHistories)) {
  347. Integer status = SysDictUtils.getValue(EnumDeviceAlgorithmChargingHistoryStatus.Code.CODE.getCode(), EnumDeviceAlgorithmChargingHistoryStatus.N_2.getCode(), Integer.class);
  348. deviceAlgorithmChargingHistories.forEach(deviceAlgorithmChargingHistory -> deviceAlgorithmChargingHistory.setStatus(status));
  349. deviceAlgorithmChargingHistoryService.updateBatchById(deviceAlgorithmChargingHistories);
  350. }
  351. //修改设备
  352. if (Emptys.check(updateDeviceInfos)) {
  353. deviceInfoService.updateBatch(updateDeviceInfos);
  354. }
  355. //支付宝刷脸柜激活请求
  356. log.info("支付宝刷脸柜激活请求参数:{}", ailiActive.toString());
  357. if (Emptys.check(ailiActive)) {
  358. ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.ALI_DEVICE_ACTIVE, ailiActive.size());
  359. ailiActive.forEach(bindDeviceDTOBindActiveDTOTuple2 -> execute.execute(() -> {
  360. //调用支付宝绑定
  361. R.feignCheckData(alipayDeviceService.deviceBind(bindDeviceDTOBindActiveDTOTuple2.getV1()));
  362. //调用支付宝激活
  363. R.feignCheckData(alipayDeviceService.deviceActive(bindDeviceDTOBindActiveDTOTuple2.getV2()));
  364. }));
  365. }
  366. return R.ok();
  367. }
  368. @Override
  369. @ApiOperation("扣费")
  370. public R<Map<Long, Integer>> charging(List<DeviceAlgorithmChargingDto.Charging> chargings) {
  371. //查询商户信息
  372. List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(new JArrayList<>(chargings).getProperty(DeviceAlgorithmChargingDto.Charging::getMercId))).getData();
  373. JMap<Long, MercDto.Vo> mercsMaps = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
  374. //封装默认返回值
  375. Map<Long, Integer> map = new JHashMap<>(chargings.size());
  376. chargings.forEach(charging -> map.put(charging.getMercDeviceAlgorithmChargingId(), charging.getSize()));
  377. //查询数据
  378. List<DeviceAlgorithmChargingChargingQueryParams> queryList = new ArrayList<>(chargings.size());
  379. for (DeviceAlgorithmChargingDto.Charging charging : chargings) {
  380. MercDto.Vo merc = mercsMaps.get(charging.getMercId());
  381. String mercCode = merc.getMercCode();
  382. List<String> mercCodes = new ArrayList<>();
  383. getMercCodes(mercCode, mercCodes);
  384. DeviceAlgorithmChargingChargingQueryParams deviceAlgorithmCharging = new DeviceAlgorithmChargingChargingQueryParams()
  385. .setMercCodes(mercCodes);
  386. deviceAlgorithmCharging.setDeviceId(charging.getDeviceId());
  387. deviceAlgorithmCharging.setAlgorithmId(charging.getAlgorithmId());
  388. deviceAlgorithmCharging.setBeginTime(charging.getAlgorithmDate());
  389. queryList.add(deviceAlgorithmCharging);
  390. }
  391. List<DeviceAlgorithmCharging> deviceAlgorithmChargingsList = baseMapper.chargingQuery(queryList);
  392. if (!Emptys.check(deviceAlgorithmChargingsList)) {
  393. return R.ok(map);
  394. }
  395. JList<DeviceAlgorithmCharging> deviceAlgorithmChargings = new JArrayList<>(deviceAlgorithmChargingsList);
  396. //查询计费类型字典
  397. Map<String, SysDictRedis> deviceAlgorithmChargingTypeMap = SysDictUtils.get(EnumDeviceAlgorithmChargingType.Code.CODE.getCode());
  398. SysDictRedis sysDictRedis1 = deviceAlgorithmChargingTypeMap.get(EnumDeviceAlgorithmChargingType.N_1.getCode());
  399. SysDictRedis sysDictRedis2 = deviceAlgorithmChargingTypeMap.get(EnumDeviceAlgorithmChargingType.N_2.getCode());
  400. SysDictRedis sysDictRedis3 = deviceAlgorithmChargingTypeMap.get(EnumDeviceAlgorithmChargingType.N_3.getCode());
  401. //循环扣费
  402. chargings.forEach(charging -> {
  403. //应扣数量
  404. int size = charging.getSize();
  405. //查找对应算法
  406. JList<DeviceAlgorithmCharging> deviceAlgorithmChargingJlist = deviceAlgorithmChargings.filter()
  407. .eq(DeviceAlgorithmCharging::getDeviceId, charging.getDeviceId())
  408. .eq(DeviceAlgorithmCharging::getAlgorithmId, charging.getAlgorithmId())
  409. .list();
  410. if (!Emptys.check(deviceAlgorithmChargingJlist)) {
  411. return;
  412. }
  413. JMap<Integer, List<DeviceAlgorithmCharging>> deviceAlgorithmChargingJMap = deviceAlgorithmChargingJlist.toMap(DeviceAlgorithmCharging::getType).group();
  414. //递归扣费 扣费顺序为:赠送 -> 有期限 -> 无期限
  415. int size2 = charging(size, deviceAlgorithmChargingJMap, new JArrayList<SysDictRedis>().set(sysDictRedis3).set(sysDictRedis1).set(sysDictRedis2));
  416. map.put(charging.getMercDeviceAlgorithmChargingId(), size2);
  417. });
  418. return R.ok(map);
  419. }
  420. /**
  421. * 递归扣费
  422. *
  423. * @return 未扣条数
  424. */
  425. private int charging(int size, JMap<Integer, List<DeviceAlgorithmCharging>> deviceAlgorithmChargingJMap, List<SysDictRedis> sysDictRediss) {
  426. if (size > 0 && Emptys.check(sysDictRediss)) {
  427. SysDictRedis sysDictRedis = sysDictRediss.remove(0);
  428. LocalDateTime now = LocalDateTime.now();
  429. List<DeviceAlgorithmCharging> deviceAlgorithmChargings = deviceAlgorithmChargingJMap.get(Integer.valueOf(sysDictRedis.getValue()));
  430. if (Emptys.check(deviceAlgorithmChargings)) {
  431. for (DeviceAlgorithmCharging deviceAlgorithmCharging : deviceAlgorithmChargings) {
  432. int unusedSize = deviceAlgorithmCharging.getUnusedSize();
  433. if (unusedSize > 0) {
  434. int newUnusedSize = unusedSize - size;
  435. int makeSize;
  436. //扣除后=负数则算法条数不足
  437. if (newUnusedSize < 0) {
  438. size = (~(newUnusedSize - 1));
  439. newUnusedSize = 0;
  440. makeSize = unusedSize;
  441. } else {
  442. makeSize = size;
  443. size = 0;
  444. }
  445. DeviceAlgorithmCharging updateDeviceAlgorithmCharging = new DeviceAlgorithmCharging()
  446. .setId(deviceAlgorithmCharging.getId())
  447. .setUnusedSize(newUnusedSize)
  448. .setMakeSize(deviceAlgorithmCharging.getMakeSize() + makeSize)
  449. .setUpdateTime(now);
  450. updateById(updateDeviceAlgorithmCharging);
  451. deviceAlgorithmCharging.setUnusedSize(updateDeviceAlgorithmCharging.getUnusedSize())
  452. .setMakeSize(updateDeviceAlgorithmCharging.getMakeSize());
  453. }
  454. }
  455. }
  456. if (size > 0 && Emptys.check(sysDictRediss)) {
  457. return charging(size, deviceAlgorithmChargingJMap, sysDictRediss);
  458. }
  459. }
  460. return size;
  461. }
  462. /**
  463. * 解析商户编码,获取上级及自身编码
  464. *
  465. * @return
  466. */
  467. public void getMercCodes(String mercCode, List<String> mercCodes) {
  468. mercCodes.add(mercCode);
  469. int length = mercCode.length();
  470. if (length == 5) {
  471. return;
  472. }
  473. String parentCode = mercCode.substring(0, length - 3);
  474. getMercCodes(parentCode, mercCodes);
  475. }
  476. }