实现根据条件筛选返回TradeLog数据接口 #20

Merged
hnu202326010219 merged 1 commits from mayinghe_branch into develop 4 months ago

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="1.95.38.94" uuid="76281212-869f-4321-b3fb-4c14533fb84e">
<driver-ref>mongo.4</driver-ref>
<data-source source="LOCAL" name="@1.95.38.94" uuid="76281212-869f-4321-b3fb-4c14533fb84e">
<driver-ref>mongo</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.dbschema.MongoJdbcDriver</jdbc-driver>
<jdbc-url>mongodb://1.95.38.94:27127</jdbc-url>

@ -15,6 +15,6 @@ public class WebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/api/admin/login"); // ★ 放行登录接口
.excludePathPatterns("/api/admin/login", "/api/finance/**"); // ★ 放行登录接口和财务接口
}
}

@ -0,0 +1,44 @@
package com.datadashboard.controller;
import com.datadashboard.common.PageResult;
import com.datadashboard.common.Result;
import com.datadashboard.dto.TradeLogQueryDto;
import com.datadashboard.entity.TradeLog;
import com.datadashboard.service.TradeLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* (TradeLog)
*/
@Slf4j
@RestController
@RequestMapping("/api/finance")
public class TradeLogController {
private final TradeLogService tradeLogService;
@Autowired
public TradeLogController(TradeLogService tradeLogService) {
this.tradeLogService = tradeLogService;
}
/**
* TradeLog
*
* @param queryDto DTO
* @return TradeLog
*/
@GetMapping("/logs")
public Result<PageResult<TradeLog>> getTradeLogsByCondition(@RequestBody TradeLogQueryDto queryDto) {
log.info("接收到TradeLog查询请求{}", queryDto);
try {
return tradeLogService.getTradeLogsByCondition(queryDto);
} catch (Exception e) {
log.error("查询TradeLog失败", e);
return Result.error(500, "Failed to fetch latest TradeLog: database error");
}
}
}

@ -0,0 +1,20 @@
package com.datadashboard.dto;
import lombok.Data;
/**
* TradeLogDTO
*/
@Data
public class TradeLogQueryDto {
private Integer page = 1; // 当前页
private Integer pageSize = 20; // 每页条数
private Long userId; // 精确查询玩家ID
private String name; // 模糊查询昵称
private Integer logType; // 筛选记录类型 (5 或 6)
private Integer tradeType; // 筛选交易具体场景
private String startDate; // 开始日期 (yyyy-MM-dd HH:mm:ss)
private String endDate; // 结束日期 (yyyy-MM-dd HH:mm:ss)
}

@ -6,6 +6,7 @@ import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.List;
import java.util.Map;
/**
*
@ -16,6 +17,8 @@ import java.util.List;
public class TradeLog {
@Id
private String _id; // MongoDB的_id字段
private String logId;
@Indexed
@ -27,7 +30,7 @@ public class TradeLog {
@Indexed
private String playerId;
private String userId;
private Long userId; // 改为Long类型匹配示例数据
private String name;
// -------------------------------------------
@ -45,8 +48,8 @@ public class TradeLog {
// 该局游戏所有参与者的playerId
private List<String> playerIdList;
// 具体的交易详情列表
private List<TradeDetail> tradeData;
// 具体的交易详情 - 使用Map结构匹配示例数据
private Map<String, TradeDetail> tradeData;
/**
*
@ -54,7 +57,7 @@ public class TradeLog {
@Data
public static class TradeDetail {
private String playerId;
private String userId;
private Long userId;
private String name;
private Long gold; // 变化量
private Long diamond; // 变化量

@ -0,0 +1,19 @@
package com.datadashboard.repository;
import com.datadashboard.common.PageResult;
import com.datadashboard.dto.TradeLogQueryDto;
import com.datadashboard.entity.TradeLog;
/**
* TradeLog访
*/
public interface TradeLogRepository {
/**
* TradeLog
*
* @param queryDto
* @return
*/
PageResult<TradeLog> findTradeLogsByCondition(TradeLogQueryDto queryDto);
}

@ -0,0 +1,124 @@
package com.datadashboard.repository.impl;
import com.datadashboard.common.PageResult;
import com.datadashboard.dto.TradeLogQueryDto;
import com.datadashboard.entity.TradeLog;
import com.datadashboard.repository.TradeLogRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
/**
* TradeLog访
*/
@Slf4j
@Repository
public class TradeLogRepositoryImpl implements TradeLogRepository {
@Autowired
private MongoTemplate mongoTemplate;
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public PageResult<TradeLog> findTradeLogsByCondition(TradeLogQueryDto queryDto) {
try {
Query query = buildQuery(queryDto);
// 计算总数
long total = mongoTemplate.count(query, TradeLog.class);
// 分页查询
int skip = (queryDto.getPage() - 1) * queryDto.getPageSize();
query.skip(skip).limit(queryDto.getPageSize());
// 按时间倒序排列
query.with(Sort.by(Sort.Direction.DESC, "time"));
List<TradeLog> list = mongoTemplate.find(query, TradeLog.class);
return new PageResult<>(total, queryDto.getPage(), queryDto.getPageSize(), list);
} catch (Exception e) {
log.error("查询TradeLog失败", e);
throw new RuntimeException("数据库查询异常", e);
}
}
/**
*
*/
private Query buildQuery(TradeLogQueryDto queryDto) {
Query query = new Query();
// 精确查询玩家ID
if (queryDto.getUserId() != null) {
query.addCriteria(Criteria.where("userId").is(queryDto.getUserId()));
}
// 模糊查询昵称
if (StringUtils.hasText(queryDto.getName())) {
Pattern pattern = Pattern.compile(queryDto.getName(), Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
}
// 筛选记录类型
if (queryDto.getLogType() != null) {
query.addCriteria(Criteria.where("logType").is(queryDto.getLogType()));
}
// 筛选交易具体场景
if (queryDto.getTradeType() != null) {
query.addCriteria(Criteria.where("tradeType").is(queryDto.getTradeType()));
}
// 时间范围查询
addDateRangeCriteria(query, queryDto);
return query;
}
/**
*
*/
private void addDateRangeCriteria(Query query, TradeLogQueryDto queryDto) {
try {
Criteria timeCriteria = null;
if (StringUtils.hasText(queryDto.getStartDate())) {
Date startDate = DATE_FORMAT.parse(queryDto.getStartDate());
long startTime = startDate.getTime();
timeCriteria = Criteria.where("time").gte(startTime);
}
if (StringUtils.hasText(queryDto.getEndDate())) {
Date endDate = DATE_FORMAT.parse(queryDto.getEndDate());
long endTime = endDate.getTime();
if (timeCriteria != null) {
timeCriteria = timeCriteria.lte(endTime);
} else {
timeCriteria = Criteria.where("time").lte(endTime);
}
}
if (timeCriteria != null) {
query.addCriteria(timeCriteria);
}
} catch (ParseException e) {
log.error("日期格式解析错误", e);
throw new RuntimeException("日期格式错误,请使用 yyyy-MM-dd HH:mm:ss 格式", e);
}
}
}

@ -0,0 +1,20 @@
package com.datadashboard.service;
import com.datadashboard.common.PageResult;
import com.datadashboard.common.Result;
import com.datadashboard.dto.TradeLogQueryDto;
import com.datadashboard.entity.TradeLog;
/**
* TradeLog
*/
public interface TradeLogService {
/**
* TradeLog
*
* @param queryDto
* @return
*/
Result<PageResult<TradeLog>> getTradeLogsByCondition(TradeLogQueryDto queryDto);
}

@ -0,0 +1,51 @@
package com.datadashboard.service.impl;
import com.datadashboard.common.PageResult;
import com.datadashboard.common.Result;
import com.datadashboard.dto.TradeLogQueryDto;
import com.datadashboard.entity.TradeLog;
import com.datadashboard.repository.TradeLogRepository;
import com.datadashboard.service.TradeLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* TradeLog
*/
@Slf4j
@Service
public class TradeLogServiceImpl implements TradeLogService {
@Autowired
private TradeLogRepository tradeLogRepository;
@Override
public Result<PageResult<TradeLog>> getTradeLogsByCondition(TradeLogQueryDto queryDto) {
try {
log.info("开始查询TradeLog条件{}", queryDto);
// 参数校验
if (queryDto.getPage() == null || queryDto.getPage() < 1) {
queryDto.setPage(1);
}
if (queryDto.getPageSize() == null || queryDto.getPageSize() < 1) {
queryDto.setPageSize(20);
}
if (queryDto.getPageSize() > 100) {
queryDto.setPageSize(100); // 限制最大页面大小
}
PageResult<TradeLog> result = tradeLogRepository.findTradeLogsByCondition(queryDto);
log.info("查询TradeLog成功总数{},当前页:{},页面大小:{}",
result.getTotal(), result.getPage(), result.getSize());
return Result.success(result);
} catch (Exception e) {
log.error("查询TradeLog失败", e);
return Result.error(500, "Failed to fetch TradeLog: " + e.getMessage());
}
}
}
Loading…
Cancel
Save