Commit 5e8b9908 by renyizhao

2026普惠算力平台优化260702

parent cf3c8baf
package com.luhu.computility.framework.common.biz.infra.logger.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
......@@ -11,6 +12,7 @@ import java.time.LocalDateTime;
* @author 芋道源码
*/
@Data
@Accessors(chain = true)
public class ApiAccessLogCreateReqDTO {
/**
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil;
import com.luhu.computility.framework.common.enums.UserTypeEnum;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
import java.util.HashMap;
......@@ -16,6 +17,7 @@ import java.util.Map;
* @author 芋道源码
*/
@Data
@Accessors(chain = true)
public class LoginUser {
public static final String INFO_KEY_NICKNAME = "nickname";
......
......@@ -2,6 +2,7 @@ package com.luhu.computility.framework.websocket.core.message;
import com.luhu.computility.framework.websocket.core.listener.WebSocketMessageListener;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
......@@ -11,6 +12,7 @@ import java.io.Serializable;
* @author 芋道源码
*/
@Data
@Accessors(chain = true)
public class JsonWebSocketMessage implements Serializable {
/**
......
package com.luhu.computility.module.apihub.api.apicalllog.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
public class ApiCallLogSaveReqDTO {
private Long id;
......
......@@ -42,7 +42,7 @@ public interface IndustryApplicationMapper extends BaseMapperX<IndustryApplicati
default List<IndustryApplicationDO> selectShowList() {
return selectList((new LambdaQueryWrapperX<IndustryApplicationDO>()
.eqIfPresent(IndustryApplicationDO::getShowStatus, ShowStatus.YES.getValue())
.orderByDesc(IndustryApplicationDO::getId)));
.orderByAsc(IndustryApplicationDO::getOrderNum)));
}
}
\ No newline at end of file
......@@ -39,6 +39,7 @@ import org.springframework.validation.annotation.Validated;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.framework.tenant.core.aop.TenantIgnore;
import com.luhu.computility.module.compute.dal.mysql.resourceorder.ResourceOrderMapper;
@Tag(name = "管理后台 - 算力资源订单")
@RestController
......@@ -53,6 +54,9 @@ public class ResourceOrderController {
@Resource
private PayOrderService payOrderService;
@Resource
private ResourceOrderMapper resourceOrderMapper;
/**
* 内部支付任务回调
......@@ -106,8 +110,8 @@ public class ResourceOrderController {
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('compute:resource-order:query')")
public CommonResult<ResourceOrderRespVO> getResourceOrder(@RequestParam("id") Long id) {
ResourceOrderDO resourceOrder = resourceOrderService.getResourceOrder(id);
return success(BeanUtils.toBean(resourceOrder, ResourceOrderRespVO.class));
ResourceOrderRespVO resourceOrder = resourceOrderMapper.selectByIdWithUser(id);
return success(resourceOrder);
}
@GetMapping("/page")
......
......@@ -45,7 +45,12 @@ public class AppResourceOrderRespVO {
@Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
private Integer status;
@Schema(description = "租赁开始时间")
private LocalDateTime rentStartTime;
@Schema(description = "租赁结束时间")
private LocalDateTime rentEndTime;
@Schema(description = "开票状态", example = "0")
private Integer invoiceStatus;
......
......@@ -49,6 +49,7 @@ public interface ResourceOrderMapper extends BaseMapperX<ResourceOrderDO> {
.eqIfPresent(ResourceOrderDO::getInvoiceStatus, reqVO.getInvoiceStatus())
.eqIfPresent(ResourceOrderDO::getInvoiceUrl, reqVO.getInvoiceUrl())
.betweenIfPresent(ResourceOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ResourceOrderDO::getCreateTime)
.orderByDesc(ResourceOrderDO::getId));
}
......@@ -73,6 +74,7 @@ public interface ResourceOrderMapper extends BaseMapperX<ResourceOrderDO> {
.eqIfPresent(ResourceOrderDO::getInvoiceStatus, reqVO.getInvoiceStatus())
.eqIfPresent(ResourceOrderDO::getInvoiceUrl, reqVO.getInvoiceUrl())
.betweenIfPresent(ResourceOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ResourceOrderDO::getCreateTime)
.orderByDesc(ResourceOrderDO::getId));
}
......@@ -82,6 +84,16 @@ public interface ResourceOrderMapper extends BaseMapperX<ResourceOrderDO> {
.eq(ResourceOrderDO::getDeleted, false));
}
default ResourceOrderRespVO selectByIdWithUser(Long id) {
return selectJoinOne(ResourceOrderRespVO.class, new MPJLambdaWrapperX<ResourceOrderDO>()
.selectAll(ResourceOrderDO.class)
.selectAs(MemberUserDO::getNickname, ResourceOrderRespVO::getNickname)
.selectAs(MemberUserDO::getMobile, ResourceOrderRespVO::getMobile)
.leftJoin(MemberUserDO.class, MemberUserDO::getId, ResourceOrderDO::getUserId)
.eq(ResourceOrderDO::getId, id)
.eq(ResourceOrderDO::getDeleted, false));
}
default List<ResourceOrderDO> selectListByStatusAndCreateTime(Integer status, LocalDateTime[] timeRange) {
return selectList(new LambdaQueryWrapperX<ResourceOrderDO>()
.eq(ResourceOrderDO::getStatus, status)
......
package com.luhu.computility.module.member.controller.admin.recharge;
import cn.hutool.core.collection.CollectionUtil;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeExcelVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeExportReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeManualReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
......@@ -14,6 +19,14 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import static com.luhu.computility.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
......@@ -58,4 +71,19 @@ public class MemberRechargeController {
return CommonResult.success(rechargeService.getPendingRechargeCount());
}
@GetMapping("/export-excel")
@Operation(summary = "导出充值记录 Excel")
@PreAuthorize("@ss.hasPermission('member:recharge:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportRechargeExcel(@Valid MemberRechargeExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<MemberRechargeExcelVO> list = rechargeService.getRechargeExportList(exportReqVO);
if (CollectionUtil.isEmpty(list)) {
ExcelUtils.write(response, "充值记录.xls", "数据",
MemberRechargeExcelVO.class, new ArrayList<>());
return;
}
ExcelUtils.write(response, "充值记录.xls", "数据", MemberRechargeExcelVO.class, list);
}
}
package com.luhu.computility.module.member.controller.admin.recharge.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MemberRechargeExcelVO {
@ExcelProperty("手机号")
private String userMobile;
@ExcelProperty("充值金额(元)")
private BigDecimal amount;
@ExcelProperty("获得额度")
private BigDecimal quota;
@ExcelProperty("支付渠道")
private String payChannelName;
@ExcelProperty("支付状态")
private String payStatusName;
@ExcelProperty("充值状态")
private String redeemedName;
@ExcelProperty("支付时间")
private String payTime;
@ExcelProperty("交易流水号")
private String transactionId;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("创建时间")
private String createTime;
@ExcelProperty("处理人")
private String manualOperatorName;
@ExcelProperty("处理时间")
private String manualProcessTime;
}
package com.luhu.computility.module.member.controller.admin.recharge.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 充值记录导出请求 VO")
@Data
public class MemberRechargeExportReqVO {
@Schema(description = "用户ID", example = "1")
private Long userId;
@Schema(description = "用户ID列表", example = "[1, 2, 3]")
private List<Long> userIds;
@Schema(description = "用户手机号", example = "13800138000")
private String userMobile;
@Schema(description = "支付渠道", example = "wx")
private String payChannel;
@Schema(description = "支付状态", example = "1")
private Integer payStatus;
@Schema(description = "充值状态", example = "1")
private Integer redeemed;
@Schema(description = "创建时间", example = "[2024-01-01 00:00:00, 2024-12-31 23:59:59]")
private LocalDateTime[] createTime;
}
......@@ -52,4 +52,15 @@ public interface MemberRechargeMapper extends BaseMapperX<MemberRechargeDO> {
.eq(MemberRechargeDO::getRedeemed, 2));
}
default List<MemberRechargeDO> selectList(MemberRechargePageReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<MemberRechargeDO>()
.eqIfPresent(MemberRechargeDO::getUserId, reqVO.getUserId())
.inIfPresent(MemberRechargeDO::getUserId, reqVO.getUserIds())
.eqIfPresent(MemberRechargeDO::getPayChannel, reqVO.getPayChannel())
.eqIfPresent(MemberRechargeDO::getPayStatus, reqVO.getPayStatus())
.eqIfPresent(MemberRechargeDO::getRedeemed, reqVO.getRedeemed())
.betweenIfPresent(MemberRechargeDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberRechargeDO::getId));
}
}
......@@ -2,6 +2,8 @@ package com.luhu.computility.module.member.service.recharge;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeExcelVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeExportReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.dal.dataobject.recharge.MemberRechargeDO;
......@@ -74,4 +76,9 @@ public interface MemberRechargeService {
*/
long getPendingRechargeCount();
/**
* 导出充值记录列表
*/
List<MemberRechargeExcelVO> getRechargeExportList(MemberRechargeExportReqVO reqVO);
}
......@@ -5,6 +5,8 @@ import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.config.MemberNewApiClient;
import com.luhu.computility.module.member.config.MemberNewApiProperties;
import com.luhu.computility.module.member.config.MemberNewApiResponse;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeExcelVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeExportReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.dal.dataobject.recharge.MemberRechargeDO;
......@@ -19,6 +21,8 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -393,6 +397,88 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
return rechargeMapper.selectPendingCount();
}
@Override
public List<MemberRechargeExcelVO> getRechargeExportList(MemberRechargeExportReqVO reqVO) {
// 如果有手机号,先查用户ID列表
List<Long> userIds = null;
if (reqVO.getUserMobile() != null && !reqVO.getUserMobile().isEmpty()) {
List<MemberUserDO> users = memberUserService.getUserListByMobileLike(reqVO.getUserMobile());
if (users.isEmpty()) {
return Collections.emptyList();
}
userIds = users.stream().map(MemberUserDO::getId).collect(Collectors.toList());
}
// 构建查询条件
MemberRechargePageReqVO queryVO = new MemberRechargePageReqVO();
queryVO.setUserIds(userIds);
queryVO.setPayChannel(reqVO.getPayChannel());
queryVO.setPayStatus(reqVO.getPayStatus());
queryVO.setRedeemed(reqVO.getRedeemed());
queryVO.setCreateTime(reqVO.getCreateTime());
List<MemberRechargeDO> list = rechargeMapper.selectList(queryVO);
if (list.isEmpty()) {
return Collections.emptyList();
}
// 批量获取所有用户信息
List<Long> rechargeUserIds = list.stream()
.map(MemberRechargeDO::getUserId)
.distinct()
.collect(Collectors.toList());
Map<Long, MemberUserDO> userMap = new java.util.HashMap<>();
for (Long uid : rechargeUserIds) {
if (uid != null) {
MemberUserDO user = memberUserService.getUser(uid);
if (user != null) {
userMap.put(uid, user);
}
}
}
// 批量获取管理员用户信息
List<Long> adminUserIds = list.stream()
.map(MemberRechargeDO::getManualOperatorId)
.filter(id -> id != null)
.distinct()
.collect(Collectors.toList());
Map<Long, AdminUserRespDTO> adminUserMap = new java.util.HashMap<>();
if (!adminUserIds.isEmpty()) {
List<AdminUserRespDTO> adminUsers = adminUserApi.getUserList(adminUserIds);
for (AdminUserRespDTO adminUser : adminUsers) {
if (adminUser != null) {
adminUserMap.put(adminUser.getId(), adminUser);
}
}
}
// 转换为ExcelVO
return list.stream()
.map(recharge -> convertToExcelVO(recharge, userMap.get(recharge.getUserId()),
adminUserMap.get(recharge.getManualOperatorId())))
.collect(Collectors.toList());
}
private MemberRechargeExcelVO convertToExcelVO(MemberRechargeDO recharge, MemberUserDO user, AdminUserRespDTO adminUser) {
MemberRechargeExcelVO vo = new MemberRechargeExcelVO();
vo.setUserMobile(user != null ? user.getMobile() : null);
vo.setAmount(recharge.getAmount());
vo.setQuota(recharge.getQuota());
vo.setPayChannelName(PAY_CHANNEL_NAMES.getOrDefault(recharge.getPayChannel(), recharge.getPayChannel()));
vo.setPayStatusName(PAY_STATUS_NAMES.getOrDefault(recharge.getPayStatus(), "未知"));
if (recharge.getRedeemed() != null) {
vo.setRedeemedName(REDEEM_STATUS_NAMES.getOrDefault(recharge.getRedeemed(), "未知"));
}
vo.setPayTime(recharge.getPayTime() != null ? recharge.getPayTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null);
vo.setTransactionId(recharge.getTransactionId());
vo.setRemark(recharge.getRemark());
vo.setCreateTime(recharge.getCreateTime() != null ? recharge.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null);
vo.setManualOperatorName(adminUser != null ? adminUser.getNickname() : null);
vo.setManualProcessTime(recharge.getManualProcessTime() != null ? recharge.getManualProcessTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null);
return vo;
}
private MemberRechargeRespVO convertToRespVO(MemberRechargeDO recharge, MemberUserDO user, AdminUserRespDTO adminUser) {
MemberRechargeRespVO vo = new MemberRechargeRespVO();
vo.setId(recharge.getId());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment