DeviceAlgorithmChargingServiceImpl.java 25 KB

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