feat(金币代理): 新增金币代理列表统计接口

This commit is contained in:
tianfeng 2025-09-09 16:16:02 +08:00
parent c5263b0adf
commit 15d93eacec
12 changed files with 312 additions and 1 deletions

View File

@ -42,4 +42,16 @@ public interface UserMonthlyRechargeClientApi {
@GetMapping("/listThisMonth") @GetMapping("/listThisMonth")
ResultResponse<List<UserMonthlyRechargeDTO>> listThisMonth(@RequestParam("userId") Long userId); ResultResponse<List<UserMonthlyRechargeDTO>> listThisMonth(@RequestParam("userId") Long userId);
/**
* 批量获取用户本月充值.
*/
@GetMapping("/listThisMonthByIds")
ResultResponse<List<UserMonthlyRechargeDTO>> listThisMonthByIds(@RequestParam("userIds") List<Long> userIds);
/**
* 批量获取用户本月充值.
*/
@GetMapping("/listLastMonthByIds")
ResultResponse<List<UserMonthlyRechargeDTO>> listLastMonthByIds(@RequestParam("userIds") List<Long> userIds);
} }

View File

@ -58,4 +58,14 @@ public interface UserMonthlyRechargeService extends BaseService<UserMonthlyRecha
*/ */
List<UserMonthlyRecharge> listThisMonth(Long userId); List<UserMonthlyRecharge> listThisMonth(Long userId);
/**
* 批量获取用户本月充值.
*/
List<UserMonthlyRecharge> listThisMonthByIds(List<Long> userIds);
/**
* 批量获取用户上月充值.
*/
List<UserMonthlyRecharge> listLastMonthByIds(List<Long> userIds);
} }

View File

@ -11,6 +11,8 @@ import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.date.LocalDateUtils; import com.red.circle.tool.core.date.LocalDateUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -160,9 +162,30 @@ public class UserMonthlyRechargeServiceImpl extends
.list(); .list();
} }
@Override
public List<UserMonthlyRecharge> listThisMonthByIds(List<Long> userIds) {
return query()
.in(UserMonthlyRecharge::getUserId, userIds)
.eq(UserMonthlyRecharge::getRechargeDate, nowThisMonth())
.orderByAsc(UserMonthlyRecharge::getType)
.list();
}
@Override
public List<UserMonthlyRecharge> listLastMonthByIds(List<Long> userIds) {
return query()
.in(UserMonthlyRecharge::getUserId, userIds)
.eq(UserMonthlyRecharge::getRechargeDate, lastMonth())
.orderByAsc(UserMonthlyRecharge::getType)
.list();
}
private int nowThisMonth() { private int nowThisMonth() {
return LocalDateUtils.nowThisMonthToInteger(); return LocalDateUtils.nowThisMonthToInteger();
} }
private String lastMonth() {
return LocalDate.now().minusMonths(1).format(DateTimeFormatter.ofPattern("yyyy-MM"));
}
} }

View File

@ -52,4 +52,18 @@ public class UserMonthlyRechargeClientEndpoint implements UserMonthlyRechargeCli
); );
} }
@Override
public ResultResponse<List<UserMonthlyRechargeDTO>> listThisMonthByIds(List<Long> userIds) {
return ResultResponse.success(
userMonthlyRechargeClientService.listThisMonthByIds(userIds)
);
}
@Override
public ResultResponse<List<UserMonthlyRechargeDTO>> listLastMonthByIds(List<Long> userIds) {
return ResultResponse.success(
userMonthlyRechargeClientService.listLastMonthByIds(userIds)
);
}
} }

View File

@ -29,4 +29,14 @@ public interface UserMonthlyRechargeClientService {
*/ */
List<UserMonthlyRechargeDTO> listThisMonth(Long userId); List<UserMonthlyRechargeDTO> listThisMonth(Long userId);
/**
* 批量获取用户本月充值.
*/
List<UserMonthlyRechargeDTO> listThisMonthByIds(List<Long> userIds);
/**
* 批量获取用户上月充值.
*/
List<UserMonthlyRechargeDTO> listLastMonthByIds(List<Long> userIds);
} }

View File

@ -46,4 +46,18 @@ public class UserMonthlyRechargeClientServiceImpl implements UserMonthlyRecharge
); );
} }
@Override
public List<UserMonthlyRechargeDTO> listThisMonthByIds(List<Long> userIds) {
return userMonthlyRechargeInnerConvertor.toListUserMonthlyRechargeDTO(
userMonthlyRechargeService.listThisMonthByIds(userIds)
);
}
@Override
public List<UserMonthlyRechargeDTO> listLastMonthByIds(List<Long> userIds) {
return userMonthlyRechargeInnerConvertor.toListUserMonthlyRechargeDTO(
userMonthlyRechargeService.listLastMonthByIds(userIds)
);
}
} }

View File

@ -1,10 +1,17 @@
package com.red.circle.other.adapter.app.h5; package com.red.circle.other.adapter.app.h5;
import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.common.business.dto.cmd.PageUserIdCmd;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.framework.web.controller.BaseController; import com.red.circle.framework.web.controller.BaseController;
import com.red.circle.order.inner.endpoint.UserFreightRechargeRecordClient;
import com.red.circle.order.inner.endpoint.UserMonthlyRechargeClient;
import com.red.circle.order.inner.endpoint.api.UserMonthlyRechargeClientApi;
import com.red.circle.other.app.dto.h5.MemberActiveDTO; import com.red.circle.other.app.dto.h5.MemberActiveDTO;
import com.red.circle.other.app.dto.h5.RechargePageVO;
import com.red.circle.other.app.dto.h5.UserIdentityVO; import com.red.circle.other.app.dto.h5.UserIdentityVO;
import com.red.circle.other.app.service.h5.MemberActiveService; import com.red.circle.other.app.service.h5.MemberActiveService;
import com.red.circle.other.app.service.recharge.RechargeUserService;
import com.red.circle.other.app.service.user.user.UserCountService; import com.red.circle.other.app.service.user.user.UserCountService;
import com.red.circle.other.app.service.user.user.UserIdentityService; import com.red.circle.other.app.service.user.user.UserIdentityService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -18,6 +25,7 @@ public class MemberActiveController extends BaseController {
private final MemberActiveService memberActiveService; private final MemberActiveService memberActiveService;
private final UserIdentityService userIdentityService; private final UserIdentityService userIdentityService;
private final RechargeUserService rechargeUserService;
/** /**
* 工会裂变活动列表 * 工会裂变活动列表
@ -46,4 +54,12 @@ public class MemberActiveController extends BaseController {
return userIdentityService.getUserIdentity(cmd.getReqUserId()); return userIdentityService.getUserIdentity(cmd.getReqUserId());
} }
/**
* 货运代理分页列表
*/
@GetMapping("/recharge-page")
public PageResult<RechargePageVO> rechargePage(PageUserIdCmd page, AppExtCommand cmd) {
return rechargeUserService.getRechargePage(page, cmd);
}
} }

View File

@ -214,7 +214,7 @@ public class TeamBdRestController extends BaseController {
/** /**
* BD 列表接口 * BD 列表接口
*/ */
@GetMapping("/page") @GetMapping("/page2")
public PageResult<BdPageCO> bdPage(BdTeamPageQryCmd qryCmd) { public PageResult<BdPageCO> bdPage(BdTeamPageQryCmd qryCmd) {
return teamBdService.bdPage(qryCmd); return teamBdService.bdPage(qryCmd);
} }

View File

@ -0,0 +1,102 @@
package com.red.circle.other.app.service.user.user;
import cn.hutool.core.lang.Assert;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.common.business.dto.cmd.PageUserIdCmd;
import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.response.CommonErrorCode;
import com.red.circle.framework.dto.PageQuery;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.framework.dto.ResultResponse;
import com.red.circle.order.inner.endpoint.UserMonthlyRechargeClient;
import com.red.circle.order.inner.model.dto.UserMonthlyRechargeDTO;
import com.red.circle.other.app.dto.h5.RechargePageVO;
import com.red.circle.other.app.dto.h5.RechargeVO;
import com.red.circle.other.app.service.recharge.RechargeUserService;
import com.red.circle.other.infra.database.rds.service.sys.AdministratorService;
import com.red.circle.other.inner.endpoint.user.user.UserProfileClient;
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.date.LocalDateUtils;
import com.red.circle.wallet.inner.endpoint.freight.FreightGoldClient;
import com.red.circle.wallet.inner.model.cmd.UserFreightBalancePageQryCmd;
import com.red.circle.wallet.inner.model.dto.UserFreightBalanceDTO;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class RechargeUserServiceImpl implements RechargeUserService {
private final UserMonthlyRechargeClient userMonthlyRechargeClient;
private final FreightGoldClient freightGoldClient;
private final UserProfileClient userProfileClient;
private final AdministratorService administratorService;
@Override
public PageResult<RechargePageVO> getRechargePage(PageUserIdCmd page, AppExtCommand cmd) {
boolean b = administratorService.existsAdmin(cmd.getReqUserId());
if(!b) {
ResponseAssert.failure(CommonErrorCode.OPERATING_FAILURE);
}
UserFreightBalancePageQryCmd qryCmd = new UserFreightBalancePageQryCmd();
qryCmd.setClose(false);
qryCmd.setDisplay(false);
qryCmd.setSysOrigin(cmd.getReqSysOrigin().getOrigin());
qryCmd.setPageQuery(page.getPageQuery());
PageResult<UserFreightBalanceDTO> pageResult = freightGoldClient.pageFreight(qryCmd).getBody();
if (pageResult == null || pageResult.getRecords().isEmpty()) {
return null;
}
List<Long> collect = pageResult.getRecords().stream().map(UserFreightBalanceDTO::getUserId).toList();
Map<Long, BigDecimal> userMonthlyAmountMap = getThisMonthRechargeAmount(collect);
Map<Long, BigDecimal> userLastMonthAmountMap = getLastMonthRechargeAmount(collect);
return pageResult.convert(e -> {
UserProfileDTO body = userProfileClient.getByUserId(e.getUserId()).getBody();
return new RechargePageVO()
.setUserId(e.getUserId())
.setAccount(body.getAccount())
.setUserNickname(body.getUserNickname())
.setUserAvatar(body.getUserAvatar())
.setThisMonth(userMonthlyAmountMap.get(e.getUserId()))
.setLastMonth(userLastMonthAmountMap.get(e.getUserId()));
});
}
private Map<Long, BigDecimal> getThisMonthRechargeAmount(List<Long> collect) {
List<UserMonthlyRechargeDTO> recharges = userMonthlyRechargeClient.listThisMonthByIds(collect).getBody();
return getLongBigDecimalMap(recharges);
}
private Map<Long, BigDecimal> getLastMonthRechargeAmount(List<Long> collect) {
List<UserMonthlyRechargeDTO> recharges = userMonthlyRechargeClient.listLastMonthByIds(collect).getBody();
return getLongBigDecimalMap(recharges);
}
private static Map<Long, BigDecimal> getLongBigDecimalMap(List<UserMonthlyRechargeDTO> recharges) {
Map<Long, List<UserMonthlyRechargeDTO>> userMonthlyMap = recharges.stream()
.collect(Collectors.groupingBy(UserMonthlyRechargeDTO::getUserId));
return userMonthlyMap.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream()
.map(UserMonthlyRechargeDTO::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add)
));
}
}

View File

@ -0,0 +1,45 @@
package com.red.circle.other.app.dto.h5;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@Accessors(chain = true)
public class RechargePageVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long userId;
/**
* 账号.
*/
private String account;
/**
* 头像.
*/
private String userAvatar;
/**
* 用户昵称.
*/
private String userNickname;
/**
* 这个月金额
*/
private BigDecimal thisMonth;
/**
* 上个月金额
*/
private BigDecimal lastMonth;
}

View File

@ -0,0 +1,50 @@
package com.red.circle.other.app.dto.h5;
import com.red.circle.framework.dto.ClientObject;
import com.red.circle.order.inner.model.dto.UserMonthlyRechargeDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serial;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.List;
/**
* 累计用户每月充值
*
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class RechargeVO extends ClientObject {
@Serial
private static final long serialVersionUID = 1L;
/**
* 充值信息.
*/
private List<UserMonthlyRechargeDTO> recharges;
/**
* 总额.
*/
private BigDecimal totalAmount;
/**
* 充值年月(yyyyMM).
*/
private Integer rechargeDate;
/**
* 创建时间.
*/
private Timestamp createTime;
/**
* 修改时间.
*/
private Timestamp updateTime;
}

View File

@ -0,0 +1,15 @@
package com.red.circle.other.app.service.recharge;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.common.business.dto.cmd.PageUserIdCmd;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.app.dto.h5.RechargePageVO;
public interface RechargeUserService {
/**
* 货运代理用户列表
*/
PageResult<RechargePageVO> getRechargePage(PageUserIdCmd page, AppExtCommand cmd);
}