From de170b865066a133ef162e7c08de7b1937fdb210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Thu, 19 Dec 2024 17:53:23 +0800 Subject: [PATCH] =?UTF-8?q?debug:=20=E5=88=86=E6=97=B6=E6=AE=B5=E7=94=B5?= =?UTF-8?q?=E9=87=8F=E9=87=91=E9=A2=9D=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TransactionBillServiceImpl.java | 60 +++++++++++++------ 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java index 5fabde98..c5c6b870 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java @@ -932,11 +932,15 @@ public class TransactionBillServiceImpl implements TransactionBillService, After DeviceVO device = deviceService.selectById(bill.getDeviceId()); deviceService.pullDeviceInfo(device); - Boolean result = transactionTemplate.execute(status -> { - // 更新订单套餐使用信息 + // 更新订单套餐使用信息 + transactionTemplate.execute(status -> { int updateInfo = this.updateSuitInfoBeforeDevice(bill, device); ServiceUtil.assertion(updateInfo != 1, "更新套餐使用信息失败"); + return true; + }); + // 充值设备 + Boolean iotResult = transactionTemplate.execute(status -> { // 更新订单设备充值状态:成功 int updateRecharge = transactionBillMapper.updateDeviceRechargeStatus( bill.getBillId(), @@ -970,9 +974,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After return true; }); - // 是否成功 - boolean success = result != null && result; + // 是否成功 + boolean success = iotResult != null && iotResult; if (!success) { // 修改设备充值状态为失败 transactionBillMapper.updateDeviceRechargeStatus( @@ -1472,35 +1476,53 @@ public class TransactionBillServiceImpl implements TransactionBillService, After // 计算分时段计量金额 private BigDecimal calcTimingCountAmount(TransactionBillVO order, LocalDateTime endTime, BigDecimal totalEle) { + BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量 + BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); // 本次用电量 + return calcTimingCountAmount(order.getSuitGearAmount(), order.getSuitGearTime(), order.getSuitStartTime(), endTime, usedEle); + } + + // 计算分时段计量金额 + private BigDecimal calcTimingCountAmount(List suitGearAmount, List suitGearTime, LocalDateTime startTime, LocalDateTime endTime, BigDecimal usedEle) { + if (startTime == null) { + startTime = LocalDateTime.now(); + } BigDecimal total = BigDecimal.ZERO; // 计算每小时平均用电量 - LocalDateTime startTime = order.getSuitStartTime() == null ? LocalDateTime.now() : order.getSuitStartTime(); Duration betweenAvg = Duration.between(startTime, endTime); - long hours = betweenAvg.toHours(); - if (hours == 0) { - hours = 1; + long minutes = betweenAvg.toMinutes(); + if (minutes == 0) { + minutes = 1; } - BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); - BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); - BigDecimal avgEle = usedEle.divide(BigDecimal.valueOf(hours), 2, RoundingMode.HALF_UP); // 平均每小时的用电量 + BigDecimal avgEle = usedEle.divide(BigDecimal.valueOf(minutes), 6, RoundingMode.HALF_UP); // 平均每分钟的用电量 4.6 // 初始时间 - List suitGearAmount = order.getSuitGearAmount(); - List suitGearTime = order.getSuitGearTime(); - int hour = startTime.getHour() ; + LocalDateTime time = startTime ; - // 计算每个小时的金额 - for (int i = 0; i < hours; i++) { - BigDecimal hourAmount = suitGearAmount.get(suitGearTime.get(hour)).multiply(avgEle); - total = total.add(hourAmount); + // 计算每分钟的金额 + while(endTime.isAfter(time)) { + int hour = time.getHour(); + BigDecimal minuteAmount = suitGearAmount.get(suitGearTime.get(hour)).multiply(avgEle); + total = total.add(minuteAmount); - hour = (hour + 1) % 24; + time = time.plusMinutes(1); } return total; } + public static void main(String[] args) { + List suitGearAmount = Arrays.asList(new BigDecimal(0.22), new BigDecimal("0.39"), new BigDecimal("0.59"), new BigDecimal("0.89")); + List suitGearTime = Arrays.stream("1,1,1,1,1,1,1,2,2,2,1,0,0,0,1,2,3,3,3,2,2,2,2,1".split(",")).map(Integer::parseInt).collect(Collectors.toList()); + LocalDateTime startTime = DateUtils.toLocalDateTime("2024-12-19 12:45:31"); + LocalDateTime endTime = DateUtils.toLocalDateTime("2024-12-20 14:58:35"); + BigDecimal usedEle = new BigDecimal(13.8); // 总用电量 13.8 + + TransactionBillServiceImpl service = new TransactionBillServiceImpl(); + BigDecimal total = service.calcTimingCountAmount(suitGearAmount, suitGearTime, startTime, endTime, usedEle); + System.out.println(total); + } + // 计算分时段计时金额 private BigDecimal calcTimingTimeAmount(TransactionBillVO order, LocalDateTime endTime) { // 订单不存在 或者 开始时间为空,则表示未开始使用,返回0