Browse Source

Merge branch 'jihaipeng/feature-20250714184358-抽奖众筹' into milestone-20250723-wwl

feature/0725lihuilin
jihaipeng 4 weeks ago
parent
commit
58338b82d3
  1. 112
      lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java
  2. 9
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingRecordDto.java
  3. 6
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingUserDto.java
  4. 10
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApiFundingVO.java
  5. 23
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApimarketVo.java
  6. 10
      lottery-system/lottery-service/pom.xml
  7. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java
  8. 1
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  9. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java
  10. 22
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java
  11. 1
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/ApiIFundingService.java
  12. 94
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java
  13. 4
      lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml
  14. 10
      lottery-system/pom.xml

112
lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java

@ -2,30 +2,110 @@ package com.lottery.exception;
import com.lottery.result.Result; import com.lottery.result.Result;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* @program: lottery-system
* @ClassName GlobalExceptionHandler
* @description:
* @author:jihaipeng
* @create: 202507-14 17:02
* @Version 1.0
**/
@ControllerAdvice // 确保该类被 Spring 管理
* 全局异常处理器
*/
@RestControllerAdvice
@Slf4j @Slf4j
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
// 处理 GlobalException
@ExceptionHandler(GlobalException.class)
public Result<String> handleGlobalException(GlobalException e) {
log.error("业务异常: {}", e.getMessage(), e);
return Result.failure(e.getMessage());
/**
* 处理参数校验异常统一入口
*/
@ExceptionHandler({
MethodArgumentNotValidException.class,
BindException.class,
ConstraintViolationException.class,
MethodArgumentTypeMismatchException.class,
MissingServletRequestParameterException.class
})
public Result<Object> handleValidationException(Exception ex) {
String errorMessage;
if (ex instanceof MethodArgumentNotValidException) {
errorMessage = handleMethodArgumentNotValid((MethodArgumentNotValidException) ex);
} else if (ex instanceof BindException) {
errorMessage = handleBindException((BindException) ex);
} else if (ex instanceof ConstraintViolationException) {
errorMessage = handleConstraintViolation((ConstraintViolationException) ex);
} else if (ex instanceof MethodArgumentTypeMismatchException) {
errorMessage = handleTypeMismatch((MethodArgumentTypeMismatchException) ex);
} else if (ex instanceof MissingServletRequestParameterException) {
errorMessage = handleMissingParameter((MissingServletRequestParameterException) ex);
} else {
errorMessage = "参数校验失败";
}
log.warn("参数校验异常: {}", errorMessage);
return Result.failure(400, errorMessage);
}
/**
* 处理 MethodArgumentNotValidException
*/
private String handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
List<String> errors = ex.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.toList());
return String.join(", ", errors);
}
/**
* 处理 BindException
*/
private String handleBindException(BindException ex) {
List<String> errors = ex.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.toList());
return String.join(", ", errors);
}
/**
* 处理 ConstraintViolationException
*/
private String handleConstraintViolation(ConstraintViolationException ex) {
List<String> errors = ex.getConstraintViolations().stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.toList());
return String.join(", ", errors);
} }
// 处理其他异常
/**
* 处理类型不匹配异常
*/
private String handleTypeMismatch(MethodArgumentTypeMismatchException ex) {
return String.format("参数 '%s' 类型不匹配,期望类型: %s",
ex.getName(),
ex.getRequiredType().getSimpleName());
}
/**
* 处理缺失参数异常
*/
private String handleMissingParameter(MissingServletRequestParameterException ex) {
return String.format("缺失必填参数: '%s' (类型: %s)",
ex.getParameterName(),
ex.getParameterType());
}
/**
* 处理系统异常
*/
@ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)
public Result<String> handleException(Exception e) {
public Result<String> handleSystemException(Exception e) {
log.error("系统异常: ", e); log.error("系统异常: ", e);
return Result.failure(500, "系统繁忙,请稍后再试"); return Result.failure(500, "系统繁忙,请稍后再试");
} }

9
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingRecordDto.java

@ -1,6 +1,11 @@
package com.lottery.dto; package com.lottery.dto;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import javax.validation.constraints.NotNull;
/** /**
* @program: lottery-system * @program: lottery-system
@ -10,10 +15,12 @@ import lombok.Data;
* @create: 202507-15 14:27 * @create: 202507-15 14:27
* @Version 1.0 * @Version 1.0
**/ **/
@Slf4j
@Data @Data
public class FundingRecordDto { public class FundingRecordDto {
@NotNull(message = "活动ID不能为空")
private Integer activityId; private Integer activityId;
@NotNull(message = "市场标识不能为空")
private Integer marketSign; private Integer marketSign;
} }

6
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingUserDto.java

@ -1,7 +1,10 @@
package com.lottery.dto; package com.lottery.dto;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
@ -12,8 +15,11 @@ import java.time.LocalDateTime;
* @create: 202507-15 10:47 * @create: 202507-15 10:47
* @Version 1.0 * @Version 1.0
**/ **/
@Slf4j
@Data @Data
public class FundingUserDto { public class FundingUserDto {
@NotNull(message = "活动ID不能为空")
public Integer activityId; public Integer activityId;
private Integer marketSign; // 市场标识(usa/hk) private Integer marketSign; // 市场标识(usa/hk)

10
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApiFundingVO.java

@ -3,6 +3,7 @@ package com.lottery.vo;
import lombok.Data; import lombok.Data;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List;
/** /**
* @program: lottery-system * @program: lottery-system
@ -14,15 +15,8 @@ import java.time.LocalDate;
**/ **/
@Data @Data
public class ApiFundingVO { public class ApiFundingVO {
private Integer marketOneId;
private Integer marketTwoId;
private String marketOne;
private String marketTwo;
private List<ApimarketVo> data;
private LocalDate startTime; private LocalDate startTime;
private LocalDate endTime; private LocalDate endTime;
private Integer Totalcount; private Integer Totalcount;
private Integer marketOneCount;
private Integer marketTwoCount;
private String marketOneStatus;
private String marketTwoStatus;
} }

23
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApimarketVo.java

@ -0,0 +1,23 @@
package com.lottery.vo;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDate;
/**
* @program: lottery-system
* @ClassName ApimarketVo
* @description:
* @author:jihaipeng
* @create: 202507-21 14:10
* @Version 1.0
**/
@Slf4j
@Data
public class ApimarketVo {
private Integer marketId;
private String market;
private Integer marketCount;
private String marketStatus;
}

10
lottery-system/lottery-service/pom.xml

@ -30,11 +30,21 @@
<artifactId>lottery-common</artifactId> <artifactId>lottery-common</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>

3
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java

@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.*;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -154,7 +155,7 @@ public class FundingController {
//导出活动数据 //导出活动数据
@PostMapping("/exportActivityData") @PostMapping("/exportActivityData")
public void exportActivityData(@RequestBody FundingUserDto fundingUserDto, HttpServletResponse response) throws IOException {
public void exportActivityData(@RequestBody @Valid FundingUserDto fundingUserDto, HttpServletResponse response) throws IOException {
LOGGER.info("导出活动数据,参数为{}", fundingUserDto); LOGGER.info("导出活动数据,参数为{}", fundingUserDto);
fundingService.exportActivityData(fundingUserDto,response); fundingService.exportActivityData(fundingUserDto,response);
} }

1
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java

@ -61,6 +61,7 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
// 1. 创建分页对象直接查询WinnerRecord表 // 1. 创建分页对象直接查询WinnerRecord表
Page<WinnerRecord> page = new Page<>(pageNum, pageSize); Page<WinnerRecord> page = new Page<>(pageNum, pageSize);
// 2. 构建查询条件 // 2. 构建查询条件
LambdaQueryWrapper<WinnerRecord> recordWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WinnerRecord> recordWrapper = new LambdaQueryWrapper<>();

2
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java

@ -300,7 +300,7 @@ public class FundingServiceImpl implements IFundingService {
} }
//市场二的虚拟次数 //市场二的虚拟次数
Integer markerTwoVirtual = fundingMapper.searchVirtual(activityId, Two); Integer markerTwoVirtual = fundingMapper.searchVirtual(activityId, Two);
if(markerTwoVirtual != null ){
if(markerTwoVirtual == null ){
markerTwoVirtual = 0; markerTwoVirtual = 0;
} }

22
lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java

@ -9,8 +9,11 @@ import lombok.Data;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/** /**
* @program: lottery-system * @program: lottery-system
* @ClassName FundingController * @ClassName FundingController
@ -27,23 +30,24 @@ public class ApiFundingController {
private ApiIFundingService fundingService; private ApiIFundingService fundingService;
private final static Logger LOGGER = LoggerFactory.getLogger(ApiFundingController.class); private final static Logger LOGGER = LoggerFactory.getLogger(ApiFundingController.class);
//前台获取活动列表
@GetMapping("/getActivity")
public Result<ApiFundingVO> getFundingActivity(@RequestParam Integer activityId){
LOGGER.info("前台获取众筹活动所有数据");
return Result.success(fundingService.getActivityDetail(activityId));
}
//前台获取活动详情 //前台获取活动详情
@PostMapping("/getActivity1")
public Result<ApiFundingVO> getFundingActivity1(@RequestHeader String token){
@PostMapping("/getActivity")
public Result<ApiFundingVO> getFundingActivity(@RequestHeader String token){
if(token == null|| token.trim().isEmpty()){
return Result.failure("请先登录");
}
LOGGER.info("前台获取众筹活动所有数据"); LOGGER.info("前台获取众筹活动所有数据");
return fundingService.getActivityDetailOne(token); return fundingService.getActivityDetailOne(token);
} }
//添加用户参与记录 //添加用户参与记录
@PostMapping("/addRecord") @PostMapping("/addRecord")
public Result<String> addRecord(@RequestHeader String token,@RequestBody FundingRecordDto fundingRecordDto) throws Exception {
public Result<String> addRecord(@RequestHeader String token,@RequestBody @Valid FundingRecordDto fundingRecordDto) throws Exception {
if(token == null|| token.trim().isEmpty()){
return Result.failure("请先登录");
}
LOGGER.info("添加用户参与记录,参数为{}", fundingRecordDto); LOGGER.info("添加用户参与记录,参数为{}", fundingRecordDto);
return fundingService.addRecord(token,fundingRecordDto); return fundingService.addRecord(token,fundingRecordDto);
} }

1
lottery-system/lottery-service/src/main/java/com/lottery/api/service/ApiIFundingService.java

@ -16,7 +16,6 @@ import javax.print.DocFlavor;
**/ **/
public interface ApiIFundingService { public interface ApiIFundingService {
ApiFundingVO getActivityDetail(Integer activityId);
Result getActivityDetailOne(String token); Result getActivityDetailOne(String token);

94
lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java

@ -9,14 +9,14 @@ import com.lottery.result.Result;
import com.lottery.utils.HttpUtils; import com.lottery.utils.HttpUtils;
import com.lottery.vo.ApiFundingTimeVo; import com.lottery.vo.ApiFundingTimeVo;
import com.lottery.vo.ApiFundingVO; import com.lottery.vo.ApiFundingVO;
import com.lottery.vo.ApimarketVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/** /**
* @program: lottery-system * @program: lottery-system
@ -36,66 +36,6 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
@Autowired @Autowired
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
//返回前台所有数据
@Override
public ApiFundingVO getActivityDetail(Integer activityId) {
//根据活动id查询活动时间市场一市场二设置的初始时间俩个市场总助力次数
//根据活动id查询俩个市场,俩个市场是一条数据
ApiFundingTimeVo data= fundingMapper.getMarket(activityId);
Integer marketOne = data.getMarketOne();
Integer marketTwo = data.getMarketTwo();
LocalDate startTime = (LocalDate) data.getStartTime();
LocalDate endTime = (LocalDate) data.getEndTime();
//市场一的总的助力次数
Integer markerOneTotal = fundingMapper.searchMarketTotal(activityId, marketOne);
if (markerOneTotal == null) {
markerOneTotal = 0; // 默认值
}
//市场一的虚拟次数
Integer markerOneVirtual = fundingMapper.searchVirtual(activityId, marketOne);
if (markerOneVirtual == null) {
markerOneVirtual = 0; // 默认值
}
//市场二的总的助力次数
Integer markerTwoTotal = fundingMapper.searchMarketTotal(activityId, marketTwo);
if (markerTwoTotal == null) {
markerTwoTotal = 0; // 默认值
}
//市场二的虚拟次数
Integer markerTwoVirtual = fundingMapper.searchVirtual(activityId, marketTwo);
if (markerTwoVirtual == null) {
markerTwoVirtual = 0; // 默认值
}
//获取的设置时间
Integer time = fundingMapper.getTime(activityId,marketOne);
Integer oneShow = markerOneTotal + markerOneVirtual;
Integer twoShow = markerTwoTotal + markerTwoVirtual;
ApiFundingVO apiFundingVO = new ApiFundingVO();
//
String marketOneName = fundingMapper.selectMarket(marketOne);
String marketTwoName = fundingMapper.selectMarket(marketTwo);
apiFundingVO.setMarketOne(marketOneName);
apiFundingVO.setMarketTwo(marketTwoName);
apiFundingVO.setMarketOneCount(oneShow);
apiFundingVO.setMarketTwoCount(twoShow);
apiFundingVO.setTotalcount(time);
apiFundingVO.setStartTime(startTime);
apiFundingVO.setEndTime(endTime);
return apiFundingVO;
}
@Override @Override
public Result getActivityDetailOne(String token) { public Result getActivityDetailOne(String token) {
@ -103,10 +43,10 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
//先查询一下有几个活动开启 //先查询一下有几个活动开启
Integer count = fundingMapper.selectStatusCount(); Integer count = fundingMapper.selectStatusCount();
if (count == null || count < 0 || count > 1) {
if (count == null || count == 0 || count > 1) {
// 根据业务逻辑这里可以分别处理count为null小于0和大于1的情况 // 根据业务逻辑这里可以分别处理count为null小于0和大于1的情况
// 但为了简化示例我们统一返回一个失败结果 // 但为了简化示例我们统一返回一个失败结果
return Result.failure("活动数量不符合要求,请检查关闭多余的活动");
return Result.failure("活动数量不符合要求,请检查打开或关闭多余的活动");
} }
Integer activityId = fundingMapper.selectStatus(); Integer activityId = fundingMapper.selectStatus();
@ -185,21 +125,27 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
ApiFundingVO apiFundingVO = new ApiFundingVO(); ApiFundingVO apiFundingVO = new ApiFundingVO();
String marketOneName = fundingMapper.selectMarket(marketOne); String marketOneName = fundingMapper.selectMarket(marketOne);
String marketTwoName = fundingMapper.selectMarket(marketTwo); String marketTwoName = fundingMapper.selectMarket(marketTwo);
apiFundingVO.setMarketOne(marketOneName);
apiFundingVO.setMarketTwo(marketTwoName);
apiFundingVO.setMarketOneId(marketOne);
apiFundingVO.setMarketTwoId(marketTwo);
apiFundingVO.setMarketOneCount(oneShow);
apiFundingVO.setMarketTwoCount(twoShow);
apiFundingVO.setTotalcount(time); apiFundingVO.setTotalcount(time);
apiFundingVO.setStartTime(startTime); apiFundingVO.setStartTime(startTime);
apiFundingVO.setEndTime(endTime); apiFundingVO.setEndTime(endTime);
apiFundingVO.setMarketOneStatus(markeroneadd);
apiFundingVO.setMarketTwoStatus(marketTwoadd);
ApimarketVo marketone = new ApimarketVo();
ApimarketVo markettwo = new ApimarketVo();
marketone.setMarketId(marketOne);
marketone.setMarket(marketOneName);
marketone.setMarketCount(oneShow);
marketone.setMarketStatus(markeroneadd);
markettwo.setMarketId(marketTwo);
markettwo.setMarket(marketTwoName);
markettwo.setMarketCount(twoShow);
markettwo.setMarketStatus(marketTwoadd);
apiFundingVO.setData(Arrays.asList(marketone,markettwo));
return Result.success(apiFundingVO); return Result.success(apiFundingVO);
} }

4
lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml

@ -160,19 +160,19 @@
FROM activity FROM activity
WHERE status = 1 WHERE status = 1
</select> </select>
<select id="searchMarketTotal" resultType="java.lang.Integer"> <select id="searchMarketTotal" resultType="java.lang.Integer">
SELECT COUNT(*) SELECT COUNT(*)
FROM z_user FROM z_user
WHERE market_sign = #{marketSign} WHERE market_sign = #{marketSign}
AND activity_id = #{activityId} AND activity_id = #{activityId}
</select> </select>
<select id="selectActivityName" resultType="java.lang.String"> <select id="selectActivityName" resultType="java.lang.String">
SELECT activity_name SELECT activity_name
FROM activity FROM activity
WHERE id = #{activityId} WHERE id = #{activityId}
</select> </select>
<select id="selectByConditionExport" resultType="com.lottery.entity.FundingExport"> <select id="selectByConditionExport" resultType="com.lottery.entity.FundingExport">
SELECT SELECT
username, jwcode, market.text, join_time username, jwcode, market.text, join_time

10
lottery-system/pom.xml

@ -34,6 +34,16 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> </dependency>
<dependency> <dependency>

Loading…
Cancel
Save