20 Commits

Author SHA1 Message Date
willy 79bf9daadd 修改小bug 2 weeks ago
willy eeede35de1 修bug 2 weeks ago
willy 19d01f225f 修改反馈的bug 2 weeks ago
jihaipeng 144c296eb0 正式环境 3 weeks ago
jihaipeng 70b6497f86 修改 3 weeks ago
jihaipeng 2efab94a0d 修改地址逻辑 3 weeks ago
jihaipeng 08971e9023 Merge branch 'milestone-20250723-wwl' of http://39.101.133.168:8807/qimaohong/ActivityProject into milestone-20250723-wwl 3 weeks ago
jihaipeng caba10623d 修改地址 3 weeks ago
willy c7e142a187 小修改 3 weeks ago
jihaipeng f0ee6915db Merge branch 'milestone-20250723-wwl' into jihaipeng/feature-20250714184358-抽奖众筹 3 weeks ago
jihaipeng 64f4240453 添加地址 3 weeks ago
willy 52dfd81b80 Merge branch 'wuweili/feature-20250715095139-抽奖众筹' into milestone-20250723-wwl 3 weeks ago
willy 62f4fe7392 Merge branch 'milestone-20250723-wwl' of http://39.101.133.168:8807/qimaohong/ActivityProject into milestone-20250723-wwl 3 weeks ago
willy 71eaf8faa3 修改内定用户软删 3 weeks ago
jihaipeng 9406e3c182 正式版 3 weeks ago
jihaipeng c01e83bff7 Merge branch 'milestone-20250723-wwl' into jihaipeng/feature-20250714184358-抽奖众筹 3 weeks ago
lihuilin 1a95fb8e4e 批量删除 3 weeks ago
willy 4f212ebfda 修改 3 weeks ago
jihaipeng 6e521d2b40 Merge branch 'milestone-20250723-wwl' into jihaipeng/feature-20250714184358-抽奖众筹 3 weeks ago
jihaipeng b55df8da81 最终版 3 weeks ago
  1. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingActivityDto.java
  2. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java
  3. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java
  4. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java
  5. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserExportDto.java
  6. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingExport.java
  7. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java
  8. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java
  9. 1
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserVo.java
  10. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java
  11. 1
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java
  12. 7
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  13. 5
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java
  14. 1
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java
  15. 9
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java
  16. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java
  17. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java
  18. 43
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java
  19. 66
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  20. 53
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  21. 243
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  22. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  23. 17
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java
  24. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java
  25. 5
      lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/ApiIFundingMapper.java
  26. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java
  27. 30
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java
  28. 44
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  29. 28
      lottery-system/lottery-service/src/main/java/com/lottery/config/ApiConfig.java
  30. 3
      lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java
  31. 4
      lottery-system/lottery-service/src/main/resources/application-dev.yml
  32. 10
      lottery-system/lottery-service/src/main/resources/application-prod.yml
  33. 20
      lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml
  34. 15
      lottery-system/lottery-service/src/main/resources/mapper/api/ApiIFundingService.xml

2
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingActivityDto.java

@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDate;
import java.util.Date;
@ -19,6 +20,7 @@ import java.util.Date;
public class FundingActivityDto {
@NotNull(message = "活动名称不能为空")
@Size(min = 1, max = 20, message = "活动名称长度必须在 1 到 20 个字符之间")
private String activityName; // 活动名称
@NotNull(message = "市场一不能为空")
private Integer marketOne; // 市场一(如USA)

2
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java

@ -15,5 +15,5 @@ public class PageSimpleDto {
private Integer pageNum;
private Integer pageSize;
private Integer pageSize;
}

3
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java

@ -28,7 +28,8 @@ public class UserDto {
private String username;
@Pattern(regexp = "^\\d{5,12}$", message = "精网号必须是5到12位的数字")
@Size(min = 8, max = 8, message = "jwcode必须是8位")
@Pattern(regexp = "^\\d{8}$", message = "jwcode必须全是数字")
@NotNull(message = "精网号不能为空")
private String jwcode;
}

4
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java

@ -3,6 +3,10 @@ package com.lottery.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/**
* @program: lottery
* @ClassName UserImportDto

3
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserExportDto.java

@ -28,4 +28,7 @@ public class WinUserExportDto {
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private Date winTime;
@ExcelProperty("所在地区")
private String locMarket;
}

3
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingExport.java

@ -39,4 +39,7 @@ public class FundingExport {
public LocalDateTime getJoinTime() {
return joinTime;
}
@ExcelProperty("所在地区")
private String locMarket;
}

4
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/JwcodeTable.java

@ -1,5 +1,7 @@
package com.lottery.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -21,6 +23,8 @@ import java.time.LocalDateTime;
@AllArgsConstructor
@TableName("jwcode_table")
public class JwcodeTable {
@TableId(value = "id", type = IdType.AUTO) // 明确指定主键字段和生成策略
private Long id;
private String jwcode;
private LocalDateTime createTime;
}

3
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java

@ -34,6 +34,7 @@ public class WinnerRecord {
private Long prizeId; // 奖品ID
@TableField("loc_market")
private String locMarket;
@TableField("is_del")
@ -42,4 +43,6 @@ public class WinnerRecord {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date winTime; // 中奖时间
}

1
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserVo.java

@ -22,4 +22,5 @@ public class FundingUserVo {
private String username; // 用户名
private String jwcode; // 用户唯一码
private LocalDateTime joinTime; // 参与时间
private String locMarket;
}

4
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java

@ -27,9 +27,9 @@ public class WinUserVo {
private String prizeName;
private String LocMarket;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date winTime; // 中奖时间;
private String locMarket;
}

1
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java

@ -52,6 +52,7 @@ public class AdminGradeController {
if (pageSimpleDto.getPageNum() == null) {
pageSimpleDto.setPageNum(1);
}
if (pageSimpleDto.getPageSize() == null) {
pageSimpleDto.setPageSize(10);
}

7
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java

@ -80,9 +80,10 @@ public class AdminPrizeController {
//新增内定
@PostMapping("/addFixUser")
public Result addWinUser(@RequestBody @Valid FixUserDto fixUserDto) {
public Result addWinUser(@RequestBody @Valid FixUserDto fixUserDto) throws Exception {
if(!fixUserDto.getJwcode().startsWith("9")){
return Result.failure("添加精网号失败");
}
return adminPrizeService.addWinUser(fixUserDto);
}
}

5
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java

@ -52,8 +52,11 @@ public class AdminUserController {
private com.lottery.propertise.jwtPropertice jwtPropertice;
@PostMapping("/add")
public Result add(@RequestBody @Valid UserDto userDto) {
public Result add(@RequestBody @Valid UserDto userDto) throws Exception {
if(!userDto.getJwcode().startsWith("9")){
return Result.failure("添加精网号失败");
}
LOGGER.info("新增用户:{}",userDto);
if (!adminUserService.addUser(userDto)){
return Result.failure("用户名或精网号已存在,无法添加");

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

@ -86,6 +86,7 @@ public class FundingController {
//根据活动id查询助力详情
@PostMapping("/getActivityDetail")
public Result<Map<String, Object>> getActivityDetail(@RequestBody @Valid FundingUserDto fundingUserDto) {
//检查活动是否存在
LOGGER.info("接口getActivityDetail查询助力详情,查询条件{}", fundingUserDto);

9
lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java

@ -86,10 +86,17 @@ public interface IFundingMapper {
Integer selectmarket(Integer id);
Integer selectmarketCount(Integer market);
Integer selectActivityStatus(Integer id);
@Select("select jwcode from z_user")
@Select("select jwcode from z_user where loc_market in('usa','cn','sg','my','th','hk','vi','can')")
ArrayList<String> selectJwcode();
@Update("update z_user set loc_market = #{locMarket} where jwcode = #{jwcode}")
void updateLocMarket(String jwcode, String locMarket);
@Select("select text from market where market = #{locMarket}")
String updateLocMarketToCn(String locMarket);
String selectm(String locM);
}

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

@ -25,7 +25,7 @@ public interface AdminPrizeService extends IService<Prize> {
PrizeVo getPrizeById(Long id);
Result addWinUser(FixUserDto fixUserDto);
Result addWinUser(FixUserDto fixUserDto) throws Exception;
boolean removePrizeById(Long id);
}

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

@ -32,7 +32,7 @@ public interface AdminUserService extends IService<User> {
Result<UserLoginVo> AdminUserlogin(AdminLogin adminLogin);
boolean addUser(UserDto userDto);
boolean addUser(UserDto userDto) throws Exception;
PageInfo<UserVo> listUser(int pageNum, int pageSize, UserQueryDto userQueryDto);

43
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java

@ -6,16 +6,10 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.LotteryApplication;
import com.lottery.admin.mapper.AdminGradeMapper;
import com.lottery.admin.mapper.AdminPrizeMapper;
import com.lottery.admin.mapper.AdminUserDetailMapper;
import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.admin.mapper.*;
import com.lottery.admin.service.AdminGradeService;
import com.lottery.dto.GradeDto;
import com.lottery.entity.Grade;
import com.lottery.entity.Prize;
import com.lottery.entity.UserDetail;
import com.lottery.entity.WinnerRecord;
import com.lottery.entity.*;
import com.lottery.exception.SomeException;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
@ -27,8 +21,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.ParameterResolutionDelegate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@ -56,6 +52,8 @@ public class AdminGradeServiceImpl extends ServiceImpl<AdminGradeMapper, Grade>
@Autowired
private AdminWinMapper adminWinMapper;
@Autowired
private AdminUserMapper adminUserMapper;
public AdminGradeServiceImpl(AdminGradeMapper adminGradeMapper) {
this.adminGradeMapper = adminGradeMapper;
@ -78,11 +76,11 @@ public class AdminGradeServiceImpl extends ServiceImpl<AdminGradeMapper, Grade>
.orderByAsc(Grade::getId); //sort一样按照id排序
Page<Grade> gradePage = this.page(page, gradeLambdaQueryWrapper);
List<GradeVo> gradeVos = ConvertBeanUtil.convertList(gradePage.getRecords(), GradeVo.class);
return PageInfo.of(gradePage, gradeVos);
}
@Override
public List<GradeSimpleVo> selectAllGrade() {
// List<String> GradeNameList = new ArrayList<>();
@ -119,29 +117,46 @@ public class AdminGradeServiceImpl extends ServiceImpl<AdminGradeMapper, Grade>
.select(Prize::getId)
);
// 2. 批量逻辑删除关联的 win_record
if (!prizes.isEmpty()) {
List<Long> prizeIds = prizes.stream()
.map(Prize::getId)
.collect(Collectors.toList());
//修改user的isWin
LambdaQueryWrapper<WinnerRecord> queryWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<WinnerRecord> in = queryWrapper.in(WinnerRecord::getPrizeId, prizeIds);
List<WinnerRecord> winnerRecords = adminWinMapper.selectList(in);
List<Long> userIds = winnerRecords.stream().map(WinnerRecord::getUserId).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(userIds)) {
LambdaUpdateWrapper<User> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userLambdaUpdateWrapper.in(User::getId, userIds).set(User::getIsWin, 0);
adminUserMapper.update(null, userLambdaUpdateWrapper);
}
// 2. 批量逻辑删除关联的 win_record
LambdaUpdateWrapper<WinnerRecord> winRecordWrapper = new LambdaUpdateWrapper<>();
winRecordWrapper.in(WinnerRecord::getPrizeId, prizeIds)
.set(WinnerRecord::getIsDel, 1);
adminWinMapper.update(null, winRecordWrapper);
}
// 3. 逻辑删除关联的 prize
LambdaUpdateWrapper<Prize> prizeWrapper = new LambdaUpdateWrapper<>();
prizeWrapper.eq(Prize::getGradeId, id)
.set(Prize::getIs_del, 1);
adminPrizeMapper.update(null, prizeWrapper);
// 4. 逻辑删除关联的 user_detail
// 4.删除关联的 user_detail
LambdaUpdateWrapper<UserDetail> userDetailWrapper = new LambdaUpdateWrapper<>();
userDetailWrapper.eq(UserDetail::getGradeId, id)
.set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, userDetailWrapper);
// userDetailWrapper.eq(UserDetail::getGradeId, id)
// .set(UserDetail::getIsDel, 1);
// adminUserDetailMapper.update(null, userDetailWrapper);
userDetailWrapper.eq(UserDetail::getGradeId, id);
adminUserDetailMapper.delete(userDetailWrapper);
// 5. 逻辑删除 grade
adminGradeMapper.deleteGradeById(id);

66
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java

@ -5,22 +5,31 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lottery.admin.mapper.*;
import com.lottery.admin.service.AdminPrizeService;
import com.lottery.config.ApiConfig;
import com.lottery.dto.PrizeDto;
import com.lottery.dto.FixUserDto;
import com.lottery.entity.*;
import com.lottery.exception.BusinessException;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.utils.HttpUtils;
import com.lottery.vo.PageInfo;
import com.lottery.vo.PrizeVo;
import org.apache.ibatis.annotations.Lang;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @program: lottery
@ -47,6 +56,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
@Autowired
private AdminWinMapper adminWinMapper;
@Autowired
private ApiConfig apiConfig;
@Autowired
private ObjectMapper objectMapper;
@Override
public PageInfo<PrizeVo> pageListPrize(int pageNum, int pageSize) {
Page<Prize> page = new Page<>(pageNum, pageSize);
@ -203,9 +217,12 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
prizeVo.setGradeName(grade.getGradeName());
return prizeVo;
}
@Autowired
private IFundingMapper fundingMapper;
@Override
public Result addWinUser(FixUserDto fixUserDto) {
public Result addWinUser(FixUserDto fixUserDto) throws Exception {
// //先判断新增的内定用户是否在总的抽奖用户中
// Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode());
@ -232,10 +249,30 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// userDetail.setIsFixed(1);
// userDetail.setIsDel(0);
// adminUserDetailMapper.insert(userDetail);
String url = apiConfig.getHljwUrl() + "/api/v2/member/info";
String jwcode = fixUserDto.getJwcode();
// 准备请求参数
Map<String, String> params = new HashMap<>();
params.put("jwcode", jwcode);
// 调用接口
String response = HttpUtils.postUrlencoded(url, params);
JsonNode rootNode = objectMapper.readTree(response);
String locMarket = rootNode.path("data").path("loc_market").asText();
if(rootNode.path("code").asInt() == 401){
throw new BusinessException(400, "精网号错误");
}
try {
// 1. 检查用户是否存在不存在则创建
Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode());
String s = fundingMapper.updateLocMarketToCn(locMarket);
if (adminUserMapper.selectById(userId) != null && adminUserMapper.selectById(userId).getIsDel() == 1) {
LambdaUpdateWrapper<User> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userLambdaUpdateWrapper.eq(User::getId, userId).set(User::getIsDel, 0);
adminUserMapper.update(null, userLambdaUpdateWrapper);
}
if (userId == null) {
User user = User.builder()
.username(fixUserDto.getUsername())
@ -245,11 +282,14 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
.isDel(0)
.createTime(new Date())
.updateTime(new Date())
.locMarket(s)
.build();
adminUserMapper.insert(user);
userId = user.getId();
}
Long gradeId = fixUserDto.getGradeId();
// 2. 检查该等级下是否已存在未删除的内定用户
@ -315,6 +355,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
}
@Override
@Transactional
public boolean removePrizeById(Long id) {
//把关联的win_record表删了
@ -322,10 +363,29 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
updateWrapper.eq(WinnerRecord::getPrizeId, id).set(WinnerRecord::getIsDel, 1);
adminWinMapper.update(null, updateWrapper);
//更新user的isWIn
//修改user的isWin
LambdaQueryWrapper<WinnerRecord> queryWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<WinnerRecord> eq = queryWrapper.eq(WinnerRecord::getPrizeId, id);
List<WinnerRecord> winnerRecords = adminWinMapper.selectList(eq);
List<Long> userIds = winnerRecords.stream().map(WinnerRecord::getUserId).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(userIds)) {
LambdaUpdateWrapper<User> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
userLambdaUpdateWrapper.in(User::getId, userIds).set(User::getIsWin, 0);
adminUserMapper.update(null, userLambdaUpdateWrapper);
}
//把关联的user_detail表删了
LambdaUpdateWrapper<UserDetail> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, wrapper);
// wrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1);
// adminUserDetailMapper.update(null, wrapper);
Prize prize = adminPrizeMapper.selectById(id);
wrapper.eq(UserDetail::getGradeId, prize.getGradeId());
adminUserDetailMapper.delete(wrapper);
//最后逻辑删除奖品
return adminPrizeMapper.deletePrizeById(id);

53
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java

@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.admin.mapper.AdminGradeMapper;
import com.lottery.admin.mapper.AdminUserDetailMapper;
import com.lottery.admin.mapper.AdminUserMapper;
import com.lottery.admin.mapper.IFundingMapper;
import com.lottery.admin.service.AdminUserDetailService;
import com.lottery.admin.service.AdminUserService;
import com.lottery.api.mapper.IUserDetailMapper;
@ -55,6 +56,8 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Autowired
private AdminGradeMapper adminGradeMapper;
@Autowired
private FundingServiceImpl fundingServiceImpl;
@Override
public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) {
@ -384,6 +387,26 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
.distinct()
.collect(Collectors.toList());
int filteredCount = 0;
List<UserImportDto> filteredUserDtos = new ArrayList<>();
for (UserImportDto dto : userDtos) {
if (dto.getJwcode() != null && dto.getJwcode().startsWith("9")) {
filteredUserDtos.add(dto);
} else {
filteredCount++;
LOGGER.warn("剔除以9开头的精网号: {}", dto.getJwcode());
}
}
// 3. 提取所有精网号并去重且只保留以9开头的数字
jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.filter(jwcode -> jwcode != null && jwcode.startsWith("9")) // 添加过滤条件
.distinct()
.collect(Collectors.toList());
// 4. 批量检查member表中存在的精网号优化为单次查询
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
.stream()
@ -436,7 +459,7 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
}
// 6. 构建结果信息
String message = String.format("导入完成: 成功%d条,跳过%d条", successCount, skipCount);
String message = String.format("导入完成: 成功%d条,跳过%d条,失败%d条", successCount, skipCount, filteredCount);
if (!invalidJwCodes.isEmpty()) {
message += String.format(",其中%d个精网号无效(示例: %s)",
invalidJwCodes.size(),
@ -492,8 +515,7 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override
public boolean removeFixUserById(Long id) {
return adminUserDetailMapper.removeFixUserById(id) > 0;
return this.removeById(id);
// return this.update(
// new LambdaUpdateWrapper<UserDetail>()
// .eq(UserDetail::getId, id)
@ -503,17 +525,15 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override
public boolean removeFixUserBatchByIds(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
return false;
}
// 使用 UpdateWrapper 批量更新 is_del 字段
LambdaUpdateWrapper<UserDetail> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(UserDetail::getId, ids) // WHERE id IN (ids)
.set(UserDetail::getIsDel, 1); // SET is_del = 1
// 执行更新不更新其他字段
return this.update(updateWrapper);
return this.removeByIds(ids);
//
//// 使用 UpdateWrapper 批量更新 is_del 字段
//LambdaUpdateWrapper<UserDetail> updateWrapper = new LambdaUpdateWrapper<>();
//updateWrapper.in(UserDetail::getId, ids) // WHERE id IN (ids)
// .set(UserDetail::getIsDel, 1); // SET is_del = 1
//
//// 执行更新不更新其他字段
//return this.update(updateWrapper);
}
private void validateUser(UserImportDto dto, int rowNum, Set<String> processedCodes) {
@ -529,6 +549,8 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
throw new IllegalArgumentException("第" + rowNum + "行: 精网号在当前文件中重复");
}
}
@Autowired
private IFundingMapper fundingMapper;
private User convertToEntity(UserImportDto dto) {
User user = new User();
@ -538,7 +560,8 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
user.setUpdateTime(new Date());
// 查询并设置loc_market
String locMarket = adminUserMapper.selectLocMarketByJwcode(dto.getJwcode());
user.setLocMarket(locMarket != null ? locMarket : "未知"); // 默认值
String s = fundingMapper.updateLocMarketToCn(locMarket);
user.setLocMarket(s); // 默认值
// 密码加密
user.setPassword("123456");
return user;

243
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java

@ -6,12 +6,15 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lottery.LotteryApplication;
import com.lottery.admin.controller.AdminUserController;
import com.lottery.admin.mapper.AdminIsLoginMapper;
import com.lottery.admin.mapper.AdminUserDetailMapper;
import com.lottery.admin.mapper.AdminUserMapper;
import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.admin.mapper.*;
import com.lottery.admin.service.AdminUserService;
import com.lottery.config.ApiConfig;
import com.lottery.config.ApiConfig;
import com.lottery.dto.AdminLogin;
import com.lottery.dto.UserDto;
import com.lottery.dto.UserImportDto;
@ -19,8 +22,10 @@ import com.lottery.dto.UserQueryDto;
import com.lottery.entity.User;
import com.lottery.entity.UserDetail;
import com.lottery.entity.WinnerRecord;
import com.lottery.exception.BusinessException;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.utils.HttpUtils;
import com.lottery.utils.JwtUtil;
import com.lottery.vo.PageInfo;
import com.lottery.vo.UserLoginVo;
@ -36,7 +41,9 @@ import org.springframework.web.multipart.MultipartFile;
import org.json.JSONObject;
import javax.persistence.criteria.CriteriaBuilder;
import javax.transaction.Transactional;
import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@ -58,8 +65,12 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
private AdminUserMapper adminUserMapper;
private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class);
@Autowired
private ApiConfig apiConfig;
@Autowired
private ObjectMapper objectMapper;
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
@ -122,16 +133,33 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
redisTemplate.opsForValue().set( "token:"+token, adminLogin.getUsername(),24, TimeUnit.HOURS);
return Result.success(userLoginVo);
}
@Autowired
private IFundingMapper fundingMapper;
@Override
public boolean addUser(@Valid UserDto userDto) {
public boolean addUser(@Valid UserDto userDto) throws Exception {
String jwcode = userDto.getJwcode();
User user1 = adminUserMapper.selectByName(userDto.getUsername());
if (user1 != null) {
return false;
//TODO 接入API
// 1. 定义请求 URL
String url = apiConfig.getHljwUrl() + "/api/v2/member/info";
// 准备请求参数
Map<String, String> params = new HashMap<>();
params.put("jwcode", jwcode);
// 调用接口
String response = HttpUtils.postUrlencoded(url, params);
JsonNode rootNode = objectMapper.readTree(response);
if(rootNode.path("code").asInt() == 401){
throw new BusinessException(400, "精网号错误");
}
String locMarket = rootNode.path("data").path("loc_market").asText();
// User user1 = adminUserMapper.selectByName(userDto.getUsername());
// if (user1 != null) {
// return false;
// }
// 1. 查询是否已存在相同精网号的用户
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getJwcode, jwcode);
@ -155,6 +183,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
user.setIsDel(0);
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
String cnName = fundingMapper.updateLocMarketToCn(locMarket);
user.setLocMarket(cnName);
user.setPassword("123456"); // 默认密码
return this.save(user);
@ -179,6 +209,130 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
return PageInfo.of(userPage, userVolist);
}
// @Override
// public Result importUsers(MultipartFile file) {
// try {
// // 1. 解析Excel
// List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
// .head(UserImportDto.class)
// .sheet()
// .doReadSync();
//
// // 2. 过滤保留以"9"开头的精网号数据并记录被剔除的数据
// List<Map<String, Object>> filteredOutData = new ArrayList<>(); // 存储被剔除的数据行号 + jwcode
// List<UserImportDto> filteredUserDtos = new ArrayList<>();
//
// for (int i = 0; i < userDtos.size(); i++) {
// UserImportDto dto = userDtos.get(i);
// if (dto.getJwcode() != null && dto.getJwcode().startsWith("9")) {
// filteredUserDtos.add(dto); // 符合条件的数据
// } else {
// // 记录被剔除的数据行号和jwcode
// Map<String, Object> filteredRecord = new HashMap<>();
// filteredRecord.put("row", i + 2); // Excel行号从2开始1是表头
// filteredRecord.put("jwcode", dto.getJwcode());
// filteredOutData.add(filteredRecord);
// }
// }
//
// // 3. 检查数据量是否超过限制基于过滤后的数据
// if (filteredUserDtos.size() > 2000) {
// return Result.failure("单次导入最多支持2000条数据");
// }
//
// // 4. 获取所有精网号过滤后的
// List<String> jwcodes = filteredUserDtos.stream()
// .map(UserImportDto::getJwcode)
// .distinct()
// .collect(Collectors.toList());
//
// // 5. 检查member表中存在的精网号
// Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
// .stream()
// .collect(Collectors.toSet());
//
// // 6. 获取已存在的精网号及其删除状态
// Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus()
// .stream()
// .collect(Collectors.toMap(
// User::getJwcode,
// User::getIsDel,
// (existing, replacement) -> existing
// ));
//
// List<User> usersToAdd = new ArrayList<>();
// List<User> usersToUpdate = new ArrayList<>();
// Set<String> processedCodes = new HashSet<>();
// int skipCount = 0;
//
// // 7. 校验数据并分类新增/更新/跳过
// for (int i = 0; i < filteredUserDtos.size(); i++) {
// UserImportDto dto = filteredUserDtos.get(i);
// try {
// validateUser(dto, i + 2); // 行号校正基于过滤后的数据
//
// // 检查member表中是否存在
// if (!existingMemberCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException(String.format("第%d行: 精网号%s不存在于member表中", i + 2, dto.getJwcode()));
// }
//
// // 文件内去重
// if (processedCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException(String.format("第%d行: 精网号%s在当前文件中重复", i + 2, dto.getJwcode()));
// }
// processedCodes.add(dto.getJwcode());
//
// // 处理数据库中的重复情况
// if (existingUserMap.containsKey(dto.getJwcode())) {
// Integer isDel = existingUserMap.get(dto.getJwcode());
// if (isDel == 1) {
// User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode());
// User userToUpdate = convertToEntity(dto);
// userToUpdate.setId(existingUser.getId());
// userToUpdate.setIsDel(0);
// usersToUpdate.add(userToUpdate);
// } else {
// throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode()));
// }
// } else {
// usersToAdd.add(convertToEntity(dto));
// }
// } catch (IllegalArgumentException e) {
// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
// skipCount++;
// }
// }
//
// // 8. 执行数据库操作
// int successCount = 0;
// if (!usersToAdd.isEmpty()) {
// boolean addSuccess = this.saveBatch(usersToAdd);
// successCount += addSuccess ? usersToAdd.size() : 0;
// }
// if (!usersToUpdate.isEmpty()) {
// boolean updateSuccess = this.updateBatchById(usersToUpdate);
// successCount += updateSuccess ? usersToUpdate.size() : 0;
// }
//
// // 9. 返回结果包含被剔除的数据
// Map<String, Object> resultData = new HashMap<>();
// resultData.put("successCount", successCount);
// resultData.put("addedCount", usersToAdd.size());
// resultData.put("updatedCount", usersToUpdate.size());
// resultData.put("skippedCount", skipCount);
// resultData.put("filteredOutData", filteredOutData); // 被剔除的数据非9开头
//
// return successCount > 0 ?
// Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条",
// successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) :
// Result.failure("没有有效数据可导入");
//
// } catch (Exception e) {
// LOGGER.error("导入用户失败", e);
// return Result.failure("导入失败: " + e.getMessage());
// }
// }
@Override
public Result importUsers(MultipartFile file) {
try {
@ -188,6 +342,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
.sheet()
.doReadSync();
// 2. 检查数据量是否超过限制
if (userDtos.size() > 2000) {
return Result.failure("单次导入最多支持2000条数据");
@ -198,6 +354,23 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
// 3. 提取所有精网号并去重且只保留以9开头的数字
jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.filter(jwcode -> jwcode != null && jwcode.startsWith("9")) // 添加过滤条件
.distinct()
.collect(Collectors.toList());
int filteredCount = 0;
List<UserImportDto> filteredUserDtos = new ArrayList<>();
for (UserImportDto dto : userDtos) {
if (dto.getJwcode() != null && dto.getJwcode().startsWith("9")) {
filteredUserDtos.add(dto);
} else {
filteredCount++;
LOGGER.warn("剔除以9开头的精网号: {}", dto.getJwcode());
}
}
// 4. 检查member表中存在的精网号
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
@ -213,6 +386,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
(existing, replacement) -> existing
));
List<User> usersToAdd = new ArrayList<>();
List<User> usersToUpdate = new ArrayList<>();
Set<String> processedCodes = new HashSet<>();
@ -267,8 +441,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
}
return successCount > 0 ?
Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条",
successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) :
Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条,失败%d条",
successCount, usersToAdd.size(), usersToUpdate.size(), skipCount,filteredCount)) :
Result.failure("没有有效数据可导入");
} catch (Exception e) {
LOGGER.error("导入用户失败", e);
@ -277,12 +451,21 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
}
@Override
@Transactional
public void removeUserById(Long id) {
//关联删除user_detail
LambdaUpdateWrapper<UserDetail> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, updateWrapper);
//关联硬删删除user_detail
//LambdaUpdateWrapper<UserDetail> updateWrapper = new LambdaUpdateWrapper<>();
//updateWrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1);
LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
userLambdaQueryWrapper.eq(User::getId, id);
User one = this.getOne(userLambdaQueryWrapper);
LambdaQueryWrapper<UserDetail> userDetailLambdaQueryWrapper = new LambdaQueryWrapper<>();
userDetailLambdaQueryWrapper.eq(UserDetail::getUserId, one.getId());
adminUserDetailMapper.delete(userDetailLambdaQueryWrapper);
//关联删除winrecord
LambdaUpdateWrapper<WinnerRecord> updateWrapper1 = new LambdaUpdateWrapper<>();
@ -292,19 +475,29 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
adminUserMapper.deleteUserById(id);
}
@Transactional
@Override
public boolean removeUserBatchByIds(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
public boolean removeUserBatchByIds(List<Long> userIds) {
if (userIds == null || userIds.isEmpty()) {
return false;
}
// 使用 UpdateWrapper 批量更新 is_del 字段
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(User::getId, ids) // WHERE id IN (ids)
.set(User::getIsDel, 1); // SET is_del = 1
try {
// 1. 硬删除 user_detail 表的关联数据
LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.in(UserDetail::getUserId, userIds);
adminUserDetailMapper.delete(detailWrapper); // 物理删除
// 2. 软删除 user 表数据
LambdaUpdateWrapper<User> userWrapper = new LambdaUpdateWrapper<>();
userWrapper.in(User::getId, userIds)
.set(User::getIsDel, 1); // 逻辑删除
return this.update(userWrapper);
// 执行更新不更新其他字段
return this.update(updateWrapper);
} catch (Exception e) {
// 事务会自动回滚
throw new RuntimeException("批量删除用户失败", e);
}
}
@Override
@ -324,7 +517,6 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
}
private User convertToEntity(UserImportDto dto) {
User user = new User();
user.setJwcode(dto.getJwcode());
@ -335,7 +527,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
user.setIsDel(0);
// 查询并设置loc_market
String locMarket = adminUserMapper.selectLocMarketByJwcode(dto.getJwcode());
user.setLocMarket(locMarket != null ? locMarket : "未知"); // 默认值
String s = fundingMapper.updateLocMarketToCn(locMarket);
user.setLocMarket(s); // 默认值
// 设置默认密码
user.setPassword("123456");
return user;

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

@ -190,7 +190,7 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
.excelType(ExcelTypeEnum.XLSX)
.sheet("中奖名单")
.doWrite(convertToExportDto(winUserVoPageInfo.getList()));
}
}
@Override
public PageInfo<WinUserVo> listWinUserWin(int pageNum, int pageSize) {
@ -215,6 +215,7 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
dto.setPrizeName(vo.getPrizeName());
dto.setWinTime(vo.getWinTime());
dto.setGradeName(vo.getGradeName());
dto.setLocMarket(vo.getLocMarket());
result.add(dto);
}
return result;

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

@ -87,6 +87,7 @@ public class FundingServiceImpl implements IFundingService {
//添加众筹活动
@Override
@Transactional(rollbackOn = SQLException.class)
public Result<String> addActivity(FundingActivityDto fundingActivityDto) {
if (fundingActivityDto.getActivityName() == null || fundingActivityDto.getActivityName().equals("")) {
return Result.failure("活动名称不能为空");
@ -119,6 +120,7 @@ public class FundingServiceImpl implements IFundingService {
//查询市场是否存在
Integer count = fundingMapper.selectmarketCount(fundingActivityDto.getMarketOne());
Integer count2 = fundingMapper.selectmarketCount(fundingActivityDto.getMarketTwo());
if(count == 0){
return Result.failure("市场一不存在");
}
@ -199,6 +201,7 @@ public class FundingServiceImpl implements IFundingService {
result.put("total", total);
result.put("page", fundingUserDto.getPage());
result.put("pageSize", fundingUserDto.getPagesize());
return Result.success(result);
}
@ -326,8 +329,8 @@ public class FundingServiceImpl implements IFundingService {
}
//查询当前的虚拟
Integer virtual = fundingMapper.searchVirtual(activityId, stock);
if(total + addTotal+markerTwoVirtual > 1500){
return Result.failure("所在市场助力值最大1500");
if(total + addTotal+markerTwoVirtual > 4200){
return Result.failure("所在市场助力值最大4200");
}
if(total + addTotal + markerTwoVirtual< 0){
@ -448,6 +451,11 @@ public class FundingServiceImpl implements IFundingService {
@Transactional(rollbackOn = SQLException.class)
public Result<String> deleteActivity(Integer id) {
//查看活动的状态
Integer status = fundingMapper.selectActivityStatus(id);
if(status != 0){
return Result.failure("活动正在运行中,请禁用再删除");
}
//产看股票是否存在
Integer count = fundingMapper.selectActivityCount(id);
@ -477,6 +485,7 @@ public class FundingServiceImpl implements IFundingService {
*/
String apiUrl = "http://api.homilychart.com/hljwgo/api/v2/member/info";
@Override
@Transactional
public boolean flushData() throws Exception {
ArrayList<String> jwcodes = new ArrayList<>();
jwcodes = fundingMapper.selectJwcode();
@ -492,7 +501,9 @@ public class FundingServiceImpl implements IFundingService {
params.put("jwcode", jwcode);
// JSON库解析
String json = HttpUtils.postUrlencoded(apiUrl, params);
return JsonPath.read(json, "$.data.loc_market");
String locM = JsonPath.read(json, "$.data.loc_market");
return fundingMapper.selectm(locM);
}
}

2
lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java

@ -29,7 +29,7 @@ public class LotteryController {
//TODO 一个用户内定多个等奖会出现bug
@PostMapping("/start")
public Result<LotteryVo> StartLottery(@RequestBody StartLotteryDto startLotteryDto){
public Result<LotteryVo> StartLottery(@RequestBody StartLotteryDto startLotteryDto) throws Exception {
LOGGER.info("开始抽奖: 等级是:{},奖品是:{},抽取人数:{}",startLotteryDto.getGradeId(),startLotteryDto.getPrizeId(),startLotteryDto.getPerWin());
LotteryVo userVos = userDetailService.StartLottery(startLotteryDto);

5
lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/ApiIFundingMapper.java

@ -30,7 +30,7 @@ public interface ApiIFundingMapper {
Integer selectStatus();
void addRecord(Integer activityId, String username, String jwcode, Integer marketSign, LocalDateTime joinTime);
void addRecord(Integer activityId, String username, String jwcode, Integer marketSign, LocalDateTime joinTime,String locMarket);
LocalDate selectCount(String jwcode, Integer marketSign,Integer activityId);
@ -43,4 +43,7 @@ public interface ApiIFundingMapper {
Integer selectActivityISExist(Integer activityId);
Integer selectMarketISExist(Integer market);
String selectBYMarket(String locMarket1);
}

2
lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java

@ -14,5 +14,5 @@ import com.lottery.vo.LotteryVo;
* @Version 1.0
**/
public interface IUserDetailService extends IService<UserDetail> {
LotteryVo StartLottery(StartLotteryDto startLotteryDto);
LotteryVo StartLottery(StartLotteryDto startLotteryDto) throws Exception;
}

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

@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lottery.api.mapper.ApiIFundingMapper;
import com.lottery.api.service.ApiIFundingService;
import com.lottery.config.ApiConfig;
import com.lottery.dto.FundingRecordDto;
import com.lottery.result.Result;
import com.lottery.utils.HttpUtils;
@ -38,6 +39,8 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
@Autowired
ObjectMapper objectMapper = new ObjectMapper();
@Autowired
ApiConfig apiConfig;
@Override
public Result getActivityDetailOne(String token) {
@ -49,17 +52,13 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
if (count == null || count == 0 || count > 1) {
// 根据业务逻辑这里可以分别处理count为null小于0和大于1的情况
// 但为了简化示例我们统一返回一个失败结果
return Result.failure(200,"操作成功");
return Result.failure(400,"活动未开启");
}
Integer activityId = fundingMapper.selectStatus();
//根据活动id查询俩个市场,俩个市场是一条数据
ApiFundingTimeVo data= fundingMapper.getMarket(activityId);
Integer marketOne = data.getMarketOne();
Integer marketTwo = data.getMarketTwo();
LocalDate startTime = (LocalDate) data.getStartTime();
@ -70,7 +69,7 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
try {
// 1. 定义请求 URL
String url = "http://39.101.133.168:8828/hljw/api/v2/member/info";
String url = apiConfig.getHljwUrl() +"/api/v2/member/info";
// 准备请求参数
Map<String, String> params = new HashMap<>();
@ -78,6 +77,9 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
// 调用接口
String response = HttpUtils.postUrlencoded(url, params);
JsonNode rootNode = objectMapper.readTree(response);
if(rootNode.path("code").asInt() == 401){
return Result.failure("登录凭证错误");
}
// 提取 username
username = rootNode.path("data").path("username").asText();
jwcode = rootNode.path("data").path("jwcode").asText();
@ -169,7 +171,7 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
try {
// 1. 定义请求 URL
String url = "http://39.101.133.168:8828/hljw/api/v2/member/info";
String url = apiConfig.getHljwUrl() + "/api/v2/member/info";
// 准备请求参数
Map<String, String> params = new HashMap<>();
@ -194,20 +196,28 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
}
Integer Show = markerTwoTotal + markerTwoVirtual;
if((Show+1)>1500){
if((Show+1)>4200){
return Result.failure(200,"美股实时数据助力成功!");
}
// 提取 username
String username = rootNode.path("data").path("username").asText();
String jwcode = rootNode.path("data").path("jwcode").asText();
String locMarket1 = rootNode.path("data").path("loc_market").asText();
//通过
String locMarket = fundingMapper.selectBYMarket(locMarket1);
LocalDateTime joinTime = LocalDateTime.now();
Integer marketSign = fundingRecordDto.getMarketSign();
Integer activityId = fundingRecordDto.getActivityId();
//获取最近的助力时间
LocalDate zhulishijian= fundingMapper.selectIsZhuli(activityId, jwcode, marketSign);
if(zhulishijian==null || !zhulishijian.isEqual(LocalDate.now())){
if(zhulishijian==null || !zhulishijian.isEqual(LocalDate.now())) {
//添加到数据库
fundingMapper.addRecord(activityId, username, jwcode, marketSign, joinTime);
fundingMapper.addRecord(activityId, username, jwcode, marketSign, joinTime, locMarket);
}if(zhulishijian.isEqual(LocalDate.now())){
return Result.failure("请勿重复助力");
}

44
lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java

@ -4,19 +4,26 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lottery.admin.controller.AdminPrizeController;
import com.lottery.admin.mapper.AdminPrizeMapper;
import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.admin.mapper.IFundingMapper;
import com.lottery.api.mapper.IGradeMapper;
import com.lottery.api.mapper.IUserDetailMapper;
import com.lottery.api.mapper.IUserMapper;
import com.lottery.api.service.IUserDetailService;
import com.lottery.config.ApiConfig;
import com.lottery.dto.StartLotteryDto;
import com.lottery.entity.Grade;
import com.lottery.entity.User;
import com.lottery.entity.UserDetail;
import com.lottery.entity.WinnerRecord;
import com.lottery.exception.BaseException;
import com.lottery.exception.SomeException;
import com.lottery.result.Result;
import com.lottery.utils.HttpUtils;
import com.lottery.vo.UserVo;
import com.lottery.vo.LotteryVo;
import org.slf4j.Logger;
@ -53,6 +60,12 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
@Autowired
private AdminWinMapper adminWinMapper;
@Autowired
private ApiConfig apiConfig;
@Autowired
public ObjectMapper objectMapper;
// public List<UserVo> StartLottery(StartLotteryDto startLotteryDto) {
//
@ -138,7 +151,7 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
@Override
@Transactional(rollbackFor = Exception.class)
public LotteryVo StartLottery(StartLotteryDto startLotteryDto) {
public LotteryVo StartLottery(StartLotteryDto startLotteryDto) throws Exception {
// 校验
Grade grade = gradeMapper.selectById(startLotteryDto.getGradeId());
if (grade == null) {
@ -181,7 +194,7 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
// List<User> supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size()));
// winners.addAll(convertToUserVoList(supplementWinners));
// markUsersAsWinners(supplementWinners, startLotteryDto);
// }
// } requir
if (winners.size() < requiredWinners) {
int remaining = requiredWinners - winners.size();
List<User> allAvailableUsers = getAllAvailableUsers(startLotteryDto.getGradeId());
@ -304,7 +317,7 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
// 3. 获取所有未中奖用户
LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>();
userWrapper.eq(User::getIsWin, 0);
userWrapper.eq(User::getIsWin, 0).eq(User::getIsDel, 0);
List<User> allAvailableUsers = userMapper.selectList(userWrapper);
// 4. 过滤掉所有内定用户(当前等级内定用户已在前面处理)
@ -335,9 +348,11 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
.collect(Collectors.toList());
}
@Autowired
private IFundingMapper fundingMapper;
private final static Logger LOGGER = LoggerFactory.getLogger(UserDetailServiceImpl.class);
// 标记用户为中奖状态
private void markUsersAsWinners(List<User> winners, StartLotteryDto startLotteryDto) {
private void markUsersAsWinners(List<User> winners, StartLotteryDto startLotteryDto) throws Exception {
for (User user : winners) {
// 1. 检查该用户是否已有有效中奖记录(is_del=0)
LambdaQueryWrapper<WinnerRecord> queryWrapper = new LambdaQueryWrapper<>();
@ -363,12 +378,33 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
existingRecord.setPrizeId(startLotteryDto.getPrizeId());
adminWinMapper.updateById(existingRecord);
} else {
//
// // 1. 定义请求 URL
// String url = apiConfig.getHljwUrl() + "/api/v2/member/info";
//
// // 准备请求参数
// Map<String, String> params = new HashMap<>();
//
// params.put("jwcode", user.getJwcode()); // 如果接口需要 token 作为参数
// // 调用接口
// String response = HttpUtils.postUrlencoded(url, params);
// JsonNode rootNode = objectMapper.readTree(response);
// String locMarket = "";
// if(rootNode.path("code").asInt() == 401){
// locMarket = "else";
// }else{
// locMarket = rootNode.path("data").path("loc_market").asText();
// }
// 4. 如果不存在任何记录则插入新记录
// String cnName = fundingMapper.updateLocMarketToCn(user.getLocMarket());
WinnerRecord winnerRecord = WinnerRecord.builder()
.userId(user.getId())
.winTime(new Date())
.prizeId(startLotteryDto.getPrizeId())
.isDel(0) // 明确设置为未删除
.locMarket(user.getLocMarket())
.build();
adminWinMapper.insert(winnerRecord);
}

28
lottery-system/lottery-service/src/main/java/com/lottery/config/ApiConfig.java

@ -0,0 +1,28 @@
package com.lottery.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @program: lottery-system
* @ClassName ApiConfig
* @description:
* @author:jihaipeng
* @create: 202507-25 13:00
* @Version 1.0
**/
@Component
@ConfigurationProperties(prefix = "api")
public class ApiConfig {
private String hljwUrl; // 自动匹配当前环境的 api.hljw-url
// Getter & Setter必须提供否则绑定失败
public String getHljwUrl() {
return hljwUrl;
}
public void setHljwUrl(String hljwUrl) {
this.hljwUrl = hljwUrl;
}
}

3
lottery-system/lottery-service/src/main/java/com/lottery/interceptor/AuthInterceptor.java

@ -40,6 +40,9 @@ public class AuthInterceptor implements HandlerInterceptor {
if("/api/user/list".equals(request.getRequestURI())) {
return true;
}
if("/admin/user/logout".equals(request.getRequestURI())) {
return true;
}
// if("/admin/win/list".equals(request.getRequestURI())) {
// return true;
// }

4
lottery-system/lottery-service/src/main/resources/application-dev.yml

@ -30,6 +30,6 @@ spring:
max-idle: 20 # 最大空闲连接
min-idle: 10 # 最小空闲连接
api:
hljw-url: "http://39.101.133.168:8828/hljw"

10
lottery-system/lottery-service/src/main/resources/application-prod.yml

@ -5,7 +5,7 @@ spring:
# ========== 数据源配置 (MySQL) ==========
datasource:
url: jdbc:mysql://18.143.76.3:3306/activty?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
url: jdbc:mysql://localhost:3306/activty?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: activty
password: LnAcwpp5ayps5xnc
driver-class-name: com.mysql.cj.jdbc.Driver
@ -15,11 +15,11 @@ spring:
connection-timeout: 30000 # 连接超时时间(毫秒),默认 30s
idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟)
max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟)
leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s)
leak-detection-threshold: 50000 # 连接泄漏检测(毫秒,建议 5s)
# ========== Redis 配置 ==========
redis:
host: 18.143.76.3
host: localhost
port: 10703
password: Ngc0FYUTA6h3wC5J
database: 8 # 默认DB索引
@ -31,6 +31,8 @@ spring:
min-idle: 10 # 最小空闲连接
# 不同环境的 API 路径配置
api:
hljw-url: "http://api.homilychart.com/hljw"

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

@ -106,7 +106,7 @@
</select>
<select id="selectByCondition" resultType="com.lottery.vo.FundingUserVo">
SELECT
z_user.id, activity_id, username, jwcode, market.text, join_time
z_user.id, activity_id, username, jwcode, market.text, join_time, loc_market
FROM
z_user left join market on z_user.market_sign = market.id
WHERE
@ -175,7 +175,7 @@
</select>
<select id="selectByConditionExport" resultType="com.lottery.entity.FundingExport">
SELECT
username, jwcode, market.text, join_time
username, jwcode, market.text, join_time, loc_market
FROM
z_user left join market on z_user.market_sign = market.id
WHERE
@ -250,5 +250,21 @@
from market
where id = #{market}
</select>
<select id="selectActivityStatus" resultType="java.lang.Integer" parameterType="java.lang.Integer">
SELECT
status
FROM
activity
WHERE
id = #{activityId}
</select>
<select id="selectm" resultType="java.lang.String" parameterType="java.lang.String">
SELECT
text
FROM
market
WHERE
market = #{locM}
</select>
</mapper>

15
lottery-system/lottery-service/src/main/resources/mapper/api/ApiIFundingService.xml

@ -6,12 +6,14 @@
username,
jwcode,
market_sign,
join_time)
join_time,
loc_market)
VALUES (#{activityId},
#{username},
#{jwcode},
#{marketSign},
#{joinTime})
#{joinTime},
#{locMarket})
</insert>
<select id="getTime" resultType="java.lang.Integer">
@ -111,6 +113,13 @@
WHERE
id = #{market}
</select>
<select id="selectBYMarket" resultType="java.lang.String" parameterType="java.lang.String">
SELECT
text
FROM
market
WHERE
market = #{locMarket1}
</select>
</mapper>
Loading…
Cancel
Save