用户扣减余额功能、分时段电量订单优化,超出押金直接关闭

This commit is contained in:
磷叶 2025-02-26 16:49:41 +08:00
parent c868fec07d
commit 9ef5a10782
9 changed files with 123 additions and 11 deletions
smart-switch-ruoyi
smart-switch-common/src/main/java/com/ruoyi/common/utils
smart-switch-framework/src/main/java/com/ruoyi/framework/web/service
smart-switch-service/src/main/java/com/ruoyi
dashboard/index/domain/dto
ss
task/billEleRecord
smart-switch-web/src/main/java/com/ruoyi/web/controller/ss

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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("开始时间")

View File

@ -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;

View File

@ -386,4 +386,9 @@ public interface TransactionBillService {
*/
List<LocalDateTimeIntegerVO> selectDailyCount(TransactionBillQuery query);
/**
* 计算分时段计量金额
*/
BigDecimal calcTimingCountAmount(Long billId);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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());
}
}
}
}

View File

@ -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));
}
}
}