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

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

View File

@ -46,4 +46,15 @@ public class MathUtils {
public static Long IntegerToLong(Integer num) { public static Long IntegerToLong(Integer num) {
return num == null ? null : Long.valueOf(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.CacheConstants;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants; 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.entity.SysUser;
import com.ruoyi.common.core.domain.model.AliLoginBody; import com.ruoyi.common.core.domain.model.AliLoginBody;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
@ -222,6 +223,18 @@ public class SysLoginService
userService.updateUserProfile(sysUser); 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 * @param username
@ -255,6 +268,7 @@ public class SysLoginService
AuthenticationContextHolder.clearContext(); AuthenticationContextHolder.clearContext();
} }
LoginUser loginUser = (LoginUser) authentication.getPrincipal(); LoginUser loginUser = (LoginUser) authentication.getPrincipal();
recordLoginInfoApp(loginUser.getUserId());
// 生成token // 生成token
return tokenService.createToken(loginUser); return tokenService.createToken(loginUser);
} }
@ -310,6 +324,7 @@ public class SysLoginService
AuthenticationContextHolder.clearContext(); AuthenticationContextHolder.clearContext();
} }
LoginUser loginUser = (LoginUser) authentication.getPrincipal(); LoginUser loginUser = (LoginUser) authentication.getPrincipal();
recordLoginInfoApp(loginUser.getUserId());
return tokenService.createToken(loginUser); return tokenService.createToken(loginUser);
} }
@ -369,6 +384,7 @@ public class SysLoginService
AuthenticationContextHolder.clearContext(); AuthenticationContextHolder.clearContext();
} }
LoginUser loginUser = (LoginUser) authentication.getPrincipal(); LoginUser loginUser = (LoginUser) authentication.getPrincipal();
recordLoginInfoApp(loginUser.getUserId());
return tokenService.createToken(loginUser); return tokenService.createToken(loginUser);
} }

View File

@ -3,7 +3,6 @@ package com.ruoyi.dashboard.index.domain.dto;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Arrays; import java.util.Arrays;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@ -23,7 +22,7 @@ import lombok.Data;
public class StoreDailyIncomeQuery { public class StoreDailyIncomeQuery {
@ApiModelProperty("店铺ID") @ApiModelProperty("店铺ID")
@NotBlank(message = "店铺ID不能为空") @NotNull(message = "店铺ID不能为空")
private Long storeId; private Long storeId;
@ApiModelProperty("开始时间") @ApiModelProperty("开始时间")

View File

@ -15,7 +15,8 @@ public enum RecordBalanceBstType {
REFUND("2", "退款订单"), REFUND("2", "退款订单"),
WITHDRAW("3", "提现申请"), WITHDRAW("3", "提现申请"),
RECEIVABLE("4", "应收账"), RECEIVABLE("4", "应收账"),
VIP("5", "会员订单"); VIP("5", "会员订单"),
ADMIN("6", "管理员操作");
private final String type; private final String type;
private final String msg; private final String msg;

View File

@ -386,4 +386,9 @@ public interface TransactionBillService {
*/ */
List<LocalDateTimeIntegerVO> selectDailyCount(TransactionBillQuery query); 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) { private BigDecimal calcTimingCountAmount(TransactionBillVO order) {
return calcTimingCountAmount(order.getBillId());
}
@Override
public BigDecimal calcTimingCountAmount(Long billId) {
if (billId == null) {
return null;
}
BillEleRecordQuery query = new BillEleRecordQuery(); BillEleRecordQuery query = new BillEleRecordQuery();
query.setBillId(order.getBillId()); query.setBillId(billId);
BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query); BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query);
if (amount == null) { if (amount == null) {
return BigDecimal.ZERO; 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; 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.common.utils.collection.CollectionUtils;
import com.ruoyi.ss.billEleRecord.domain.BillEleRecord; import com.ruoyi.ss.billEleRecord.domain.BillEleRecord;
import com.ruoyi.ss.billEleRecord.service.BillEleRecordConverter; 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.enums.TransactionBillType;
import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
import com.ruoyi.ss.transactionBill.service.TransactionBillService; 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 lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/** /**
* @author wjh * @author wjh
@ -41,6 +46,9 @@ public class BillEleRecordTask {
@Autowired @Autowired
private DeviceService deviceService; private DeviceService deviceService;
@Autowired
private TransactionTemplate transactionTemplate;
// 记录分时段订单电量 // 记录分时段订单电量
public void record() { public void record() {
@ -84,7 +92,25 @@ public class BillEleRecordTask {
} }
} }
// 记录电量
int insert = billEleRecordService.batchInsert(recordList); int insert = billEleRecordService.batchInsert(recordList);
log.info("记录分时段订单电量:共{}条记录", insert); 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; package com.ruoyi.web.controller.ss;
import java.math.BigDecimal;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; 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.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil; 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.SmUserQuery;
import com.ruoyi.ss.user.domain.SmUserVO; 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.UserAssembler;
import com.ruoyi.ss.user.service.UserConverter; import com.ruoyi.ss.user.service.UserConverter;
import com.ruoyi.ss.user.service.UserService; import com.ruoyi.ss.user.service.UserService;
@ -174,4 +177,20 @@ public class SmUserController extends BaseController
return success(userService.selectStatistics(userId)); 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));
}
}
} }