feat: 重构营销模块积分日志页面

- 优化搜索区域:支持用户昵称、用户ID、时间范围筛选
- 新增表格字段:ID、用户ID、昵称、来源/用途、积分变化、变化后积分、关联类型、状态、备注、日期
- 积分变化带颜色标识:增加(绿色+)、扣减(红色-)
- 状态标签彩色区分:订单创建/冻结期/完成/失效
- 关联类型中文映射:订单/签到/系统
- 使用已有的 integralListApi 接口
- 参考用户详情页积分明细样式
This commit is contained in:
scott
2026-03-20 15:53:48 +08:00
parent 09946536aa
commit fe9e1916fa
3 changed files with 230 additions and 147 deletions

View File

@@ -14,42 +14,42 @@ package com.zbkj.common.constants;
*/
public class IntegralRecordConstants {
/** 佣金记录类型—增加 */
/** 积分记录类型—增加 */
public static final Integer INTEGRAL_RECORD_TYPE_ADD = 1;
/** 佣金记录类型—扣减 */
/** 积分记录类型—扣减 */
public static final Integer INTEGRAL_RECORD_TYPE_SUB = 2;
/** 佣金记录状态—创建 */
/** 积分记录状态—创建 */
public static final Integer INTEGRAL_RECORD_STATUS_CREATE = 1;
/** 佣金记录状态—冻结期 */
/** 积分记录状态—冻结期 */
public static final Integer INTEGRAL_RECORD_STATUS_FROZEN = 2;
/** 佣金记录状态—完成 */
/** 积分记录状态—完成 */
public static final Integer INTEGRAL_RECORD_STATUS_COMPLETE = 3;
/** 佣金记录状态—失效(订单退款) */
/** 积分记录状态—失效(订单退款) */
public static final Integer INTEGRAL_RECORD_STATUS_INVALIDATION = 4;
/** 佣金记录关联类型—订单 */
/** 积分记录关联类型—订单 */
public static final String INTEGRAL_RECORD_LINK_TYPE_ORDER = "order";
/** 佣金记录关联类型—签到 */
/** 积分记录关联类型—签到 */
public static final String INTEGRAL_RECORD_LINK_TYPE_SIGN = "sign";
/** 佣金记录关联类型—系统后台 */
/** 积分记录关联类型—系统后台 */
public static final String INTEGRAL_RECORD_LINK_TYPE_SYSTEM = "system";
/** 佣金记录标题—用户订单付款成功 */
/** 积分记录标题—用户订单付款成功 */
public static final String BROKERAGE_RECORD_TITLE_ORDER = "用户订单付款成功";
/** 佣金记录标题—签到经验奖励 */
/** 积分记录标题—签到积分奖励 */
public static final String BROKERAGE_RECORD_TITLE_SIGN = "签到积分奖励";
/** 佣金记录标题—后台积分操作 */
/** 积分记录标题—后台积分操作 */
public static final String BROKERAGE_RECORD_TITLE_SYSTEM = "后台积分操作";
/** 佣金记录标题—订单退款 */
/** 积分记录标题—订单退款 */
public static final String BROKERAGE_RECORD_TITLE_REFUND = "订单退款";
}

View File

@@ -73,22 +73,18 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
LambdaQueryWrapper<UserIntegralRecord> lqw = Wrappers.lambdaQuery();
lqw.eq(UserIntegralRecord::getUid, uid);
lqw.eq(UserIntegralRecord::getLinkId, orderNo);
lqw.in(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_FROZEN, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
lqw.in(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE,
IntegralRecordConstants.INTEGRAL_RECORD_STATUS_FROZEN,
IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
List<UserIntegralRecord> recordList = dao.selectList(lqw);
if (CollUtil.isEmpty(recordList)) {
return recordList;
}
for (int i = 0; i < recordList.size();) {
UserIntegralRecord record = recordList.get(i);
if (record.getType().equals(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD)) {
if (record.getStatus().equals(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE)) {
recordList.remove(i);
continue;
}
}
i++;
}
return recordList;
// 过滤掉已完成的增加类型记录
return recordList.stream()
.filter(record -> !(record.getType().equals(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD)
&& record.getStatus().equals(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE)))
.collect(Collectors.toList());
}
/**
@@ -101,26 +97,45 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
if (CollUtil.isEmpty(thawList)) {
return;
}
for (UserIntegralRecord record : thawList) {
// 查询对应的用户
User user = userService.getById(record.getUid());
// 按用户分组,批量处理
Map<Integer, List<UserIntegralRecord>> userRecordMap = thawList.stream()
.collect(Collectors.groupingBy(UserIntegralRecord::getUid));
for (Map.Entry<Integer, List<UserIntegralRecord>> entry : userRecordMap.entrySet()) {
Integer uid = entry.getKey();
List<UserIntegralRecord> userRecords = entry.getValue();
User user = userService.getById(uid);
if (ObjectUtil.isNull(user)) {
continue ;
logger.warn("积分解冻—用户不存在uid = {}", uid);
continue;
}
record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
// 计算积分余额
Integer balance = (user.getIntegral() != null ? user.getIntegral() : BigDecimal.ZERO).add(record.getIntegral()).intValue();
record.setBalance(balance);
record.setUpdateTime(cn.hutool.core.date.DateUtil.date());
// 解冻
// 批量事务处理同一用户的积分解冻
Boolean execute = transactionTemplate.execute(e -> {
updateById(record);
userService.operationIntegral(record.getUid(), record.getIntegral(), user.getIntegral(), "add");
Integer currentIntegral = user.getIntegral();
for (UserIntegralRecord record : userRecords) {
record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
// 计算积分余额
Integer balance = (currentIntegral != null ? currentIntegral : BigDecimal.ZERO)
.add(record.getIntegral()).intValue();
record.setBalance(balance);
record.setUpdateTime(cn.hutool.core.date.DateUtil.date());
updateById(record);
// 更新用户积分
userService.operationIntegral(uid, record.getIntegral(), currentIntegral, "add");
currentIntegral = balance; // 更新当前积分供下一条记录计算
}
return Boolean.TRUE;
});
if (!execute) {
logger.error(StrUtil.format("积分解冻处理—解冻出错,记录id = {}", record.getId()));
logger.error(StrUtil.format("积分解冻处理—批量解冻出错,用户uid = {}记录 = {}",
uid, userRecords.size()));
} else {
logger.info("积分解冻成功—用户uid = {},解冻记录数 = {}", uid, userRecords.size());
}
}
}