diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/MathUtils.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/MathUtils.java index 73d69d16..7f19cbce 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/MathUtils.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/MathUtils.java @@ -46,4 +46,15 @@ public class MathUtils { public static Long IntegerToLong(Integer num) { return num == null ? null : Long.valueOf(num); } + + // 判断a是否大于b + public static boolean biggerThan(BigDecimal a, BigDecimal b) { + if (a == null) { + a = BigDecimal.ZERO; + } + if (b == null) { + b = BigDecimal.ZERO; + } + return a.compareTo(b) > 0; + } } diff --git a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 2c275054..ab26acdc 100644 --- a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -7,6 +7,7 @@ import com.ruoyi.common.config.WxConfig; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SmUser; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.AliLoginBody; import com.ruoyi.common.core.domain.model.LoginUser; @@ -222,6 +223,18 @@ public class SysLoginService userService.updateUserProfile(sysUser); } + /** + * 记录APP用户登录信息 + * @param userId + */ + public void recordLoginInfoApp(Long userId) { + SmUser data = new SmUser(); + data.setUserId(userId); + data.setLoginIp(IpUtils.getIpAddr()); + data.setLoginDate(DateUtils.getNowDate()); + smUserService.updateSmUser(data); + } + /** * 前台账号密码登录 * @param username @@ -255,6 +268,7 @@ public class SysLoginService AuthenticationContextHolder.clearContext(); } LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfoApp(loginUser.getUserId()); // 生成token return tokenService.createToken(loginUser); } @@ -310,6 +324,7 @@ public class SysLoginService AuthenticationContextHolder.clearContext(); } LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfoApp(loginUser.getUserId()); return tokenService.createToken(loginUser); } @@ -369,6 +384,7 @@ public class SysLoginService AuthenticationContextHolder.clearContext(); } LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfoApp(loginUser.getUserId()); return tokenService.createToken(loginUser); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/dashboard/index/domain/dto/StoreDailyIncomeQuery.java b/smart-switch-service/src/main/java/com/ruoyi/dashboard/index/domain/dto/StoreDailyIncomeQuery.java index 6415baa5..db329a55 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/dashboard/index/domain/dto/StoreDailyIncomeQuery.java +++ b/smart-switch-service/src/main/java/com/ruoyi/dashboard/index/domain/dto/StoreDailyIncomeQuery.java @@ -3,7 +3,6 @@ package com.ruoyi.dashboard.index.domain.dto; import java.time.LocalDate; import java.util.Arrays; -import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import org.springframework.format.annotation.DateTimeFormat; @@ -23,7 +22,7 @@ import lombok.Data; public class StoreDailyIncomeQuery { @ApiModelProperty("店铺ID") - @NotBlank(message = "店铺ID不能为空") + @NotNull(message = "店铺ID不能为空") private Long storeId; @ApiModelProperty("开始时间") diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/recordBalance/domain/enums/RecordBalanceBstType.java b/smart-switch-service/src/main/java/com/ruoyi/ss/recordBalance/domain/enums/RecordBalanceBstType.java index f7cb40ac..0f80ada9 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/recordBalance/domain/enums/RecordBalanceBstType.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/recordBalance/domain/enums/RecordBalanceBstType.java @@ -15,7 +15,8 @@ public enum RecordBalanceBstType { REFUND("2", "退款订单"), WITHDRAW("3", "提现申请"), RECEIVABLE("4", "应收账"), - VIP("5", "会员订单"); + VIP("5", "会员订单"), + ADMIN("6", "管理员操作"); private final String type; private final String msg; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java index b025fd55..6d7b16bc 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java @@ -386,4 +386,9 @@ public interface TransactionBillService { */ List selectDailyCount(TransactionBillQuery query); + /** + * 计算分时段计量金额 + */ + BigDecimal calcTimingCountAmount(Long billId); + } 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 b03fb2c5..8c8de2ba 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 @@ -1233,8 +1233,16 @@ public class TransactionBillServiceImpl implements TransactionBillService, After // 计算分时段计量金额 private BigDecimal calcTimingCountAmount(TransactionBillVO order) { + return calcTimingCountAmount(order.getBillId()); + } + + @Override + public BigDecimal calcTimingCountAmount(Long billId) { + if (billId == null) { + return null; + } BillEleRecordQuery query = new BillEleRecordQuery(); - query.setBillId(order.getBillId()); + query.setBillId(billId); BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query); if (amount == null) { return BigDecimal.ZERO; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserChangeBalanceDTO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserChangeBalanceDTO.java new file mode 100644 index 00000000..ff10ba23 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/dto/UserChangeBalanceDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.ss.user.domain.dto; + +import java.math.BigDecimal; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class UserChangeBalanceDTO { + + @ApiModelProperty("用户ID") + @NotNull(message = "用户ID不能为空") + private Long userId; + + @ApiModelProperty("增加或减少的金额") + @NotNull(message = "金额不能为空") + private BigDecimal amount; + + @ApiModelProperty("原因") + @NotNull(message = "原因不能为空") + @Size(max = 200, message = "原因不能超过200个字符") + private String reason; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java b/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java index 1529ab22..96da15ee 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java +++ b/smart-switch-service/src/main/java/com/ruoyi/task/billEleRecord/BillEleRecordTask.java @@ -1,5 +1,16 @@ package com.ruoyi.task.billEleRecord; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.support.TransactionTemplate; + +import com.ruoyi.common.utils.MathUtils; import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.ss.billEleRecord.domain.BillEleRecord; import com.ruoyi.ss.billEleRecord.service.BillEleRecordConverter; @@ -12,14 +23,8 @@ import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery; import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType; import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; import com.ruoyi.ss.transactionBill.service.TransactionBillService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import lombok.extern.slf4j.Slf4j; /** * @author wjh @@ -41,6 +46,9 @@ public class BillEleRecordTask { @Autowired private DeviceService deviceService; + @Autowired + private TransactionTemplate transactionTemplate; + // 记录分时段订单电量 public void record() { @@ -84,7 +92,25 @@ public class BillEleRecordTask { } } + // 记录电量 int insert = billEleRecordService.batchInsert(recordList); log.info("记录分时段订单电量:共{}条记录", insert); + + // 查询所有超出订单押金的分时段电量订单,直接关闭 + for (TransactionBillVO bill : billList) { + try { + DeviceVO device = deviceList.stream().filter(item -> Objects.equals(bill.getDeviceId(), item.getDeviceId())).findFirst().orElse(null); + if (device == null) { + continue; + } + BigDecimal amount = transactionBillService.calcTimingCountAmount(bill.getBillId()); + if (amount != null && bill.getSuitDeposit() != null && amount.compareTo(bill.getSuitDeposit()) >= 0) { + deviceService.resetWithBill(bill.getDeviceId(), false, device.getTotalElectriQuantity(), "分时段电量订单超出押金,直接关闭", false, true); + } + } catch (Exception e) { + log.error("查询所有超出订单押金的分时段电量订单,直接关闭失败,billNo:{}, {}", bill.getBillNo(), e.getMessage()); + } + + } } } diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmUserController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmUserController.java index 7c973be6..cf9fe117 100644 --- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmUserController.java +++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmUserController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.ss; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -26,8 +27,10 @@ import com.ruoyi.common.core.domain.entity.SmUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.ss.recordBalance.domain.enums.RecordBalanceBstType; import com.ruoyi.ss.user.domain.SmUserQuery; import com.ruoyi.ss.user.domain.SmUserVO; +import com.ruoyi.ss.user.domain.dto.UserChangeBalanceDTO; import com.ruoyi.ss.user.service.UserAssembler; import com.ruoyi.ss.user.service.UserConverter; import com.ruoyi.ss.user.service.UserService; @@ -174,4 +177,20 @@ public class SmUserController extends BaseController return success(userService.selectStatistics(userId)); } + // 增加、减少余额 + @PutMapping("/balance") + public AjaxResult changeBalance(@RequestBody @Validated UserChangeBalanceDTO dto) { + if (dto.getAmount().compareTo(BigDecimal.ZERO) == 0) { + return error("金额不能为0"); + } + String reason = "管理员" + getUsername() + "操作:" + dto.getReason(); + if (dto.getAmount().compareTo(BigDecimal.ZERO) < 0) { + // 减少余额 + return toAjax(userService.subtractBalance(dto.getUserId(), dto.getAmount().negate(), false, reason, RecordBalanceBstType.ADMIN, null)); + } else { + // 增加余额 + return toAjax(userService.addBalance(dto.getUserId(), dto.getAmount(), reason, RecordBalanceBstType.ADMIN, null)); + } + } + }