8 Commits

Author SHA1 Message Date
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 4268b7d19f 添加地区字段 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
willy 54a95e0a11 Merge branch 'milestone-20250723-wwl' into wuweili/feature-20250715095139-抽奖众筹 3 weeks ago
willy 2dbba1f07a 修改 3 weeks ago
  1. 26
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/ApiUrlResp.java
  2. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java
  3. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java
  4. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserExportDto.java
  5. 3
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingExport.java
  6. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingUser.java
  7. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java
  8. 5
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java
  9. 20
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserNewVo.java
  10. 1
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserVo.java
  11. 23
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ImportResultVo.java
  12. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java
  13. 1
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java
  14. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  15. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java
  16. 29
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/TongBuController.java
  17. 12
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java
  18. 10
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java
  19. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java
  20. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java
  21. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IFundingService.java
  22. 11
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java
  23. 35
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  24. 249
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  25. 81
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  26. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  27. 38
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java
  28. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java
  29. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/ApiIFundingMapper.java
  30. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java
  31. 10
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java
  32. 37
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  33. 2
      lottery-system/lottery-service/src/main/resources/application.yml
  34. 4
      lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml
  35. 6
      lottery-system/lottery-service/src/main/resources/mapper/api/ApiIFundingService.xml
  36. 14
      lottery-system/pom.xml

26
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/ApiUrlResp.java

@ -0,0 +1,26 @@
package com.lottery.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* @program: lottery
* @ClassName ApiUrlResp
* @description:
* @author: wwl
* @create: 2025-07-26 14:12
* @Version 1.0
**/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class ApiUrlResp {
private int code;
private String msg;
private Data data;
@lombok.Data
public static class Data {
private String loc_market;
}
}

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;
}

2
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingUser.java

@ -31,4 +31,6 @@ public class FundingUser {
private String jwcode; // 用户唯一码
private LocalDateTime joinTime; // 参与时间
private Integer activityId; // 关联的活动ID
private String LocMarket; //地区
}

2
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java

@ -40,6 +40,8 @@ public class User {
private int isDel;
private String locMarket;
private Date createTime; // 创建时间
private Date updateTime; // 更新时间

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

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

20
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserNewVo.java

@ -0,0 +1,20 @@
package com.lottery.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @program: lottery
* @ClassName FundingUserNewVo
* @description:
* @author: wwl
* @create: 2025-07-26 13:49
* @Version 1.0
**/
@Data
public class FundingUserNewVo {
}

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;
}

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

@ -0,0 +1,23 @@
package com.lottery.vo;
import lombok.Data;
import java.util.List;
/**
* @program: lottery
* @ClassName ImportResultVo
* @description:
* @author: wwl
* @create: 2025-07-26 17:10
* @Version 1.0
**/
// 导入结果内部类
@Data
public class ImportResultVo {
private int successCount;
private int addedCount;
private int updatedCount;
private int skipCount;
private List<String> invalidJwCodes;
}

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

@ -30,4 +30,6 @@ public class WinUserVo {
@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);
}

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

@ -80,7 +80,7 @@ public class AdminPrizeController {
//新增内定
@PostMapping("/addFixUser")
public Result addWinUser(@RequestBody @Valid FixUserDto fixUserDto) {
public Result addWinUser(@RequestBody @Valid FixUserDto fixUserDto) throws Exception {
return adminPrizeService.addWinUser(fixUserDto);

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

@ -52,7 +52,7 @@ 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 {
LOGGER.info("新增用户:{}",userDto);
if (!adminUserService.addUser(userDto)){

29
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/TongBuController.java

@ -0,0 +1,29 @@
package com.lottery.admin.controller;
import com.lottery.admin.service.IFundingService;
import com.lottery.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: lottery
* @ClassName TongBuController
* @description:
* @author: wwl
* @create: 2025-07-26 13:46
* @Version 1.0
**/
@RestController
@RequestMapping("/admin/funding")
public class TongBuController {
@Autowired
private IFundingService fundingService;
@PostMapping("/flush")
public boolean flushData() throws Exception {
return fundingService.flushData();
}
}

12
lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java

@ -3,6 +3,7 @@ package com.lottery.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lottery.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
@ -40,4 +41,15 @@ public interface AdminUserMapper extends BaseMapper<User> {
@Select("select * from user where username = #{username}")
User selectByName(String username);
@Select("<script>" +
"SELECT jwcode FROM member_info WHERE jwcode IN " +
"<foreach collection='jwcode' item='code' open='(' separator=',' close=')'>" +
"#{code}" +
"</foreach>" +
"</script>")
Set<String> selectExistingJwCodes(@Param("jwcode") List<String> batchJwCodes);
@Select("select loc_market from member_info where jwcode = #{jwcode}")
String selectLocMarketByJwcode(String jwcode);
}

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

@ -6,8 +6,11 @@ import com.lottery.vo.FundingActivityVo;
import com.lottery.vo.FundingUserVo;
import com.lottery.vo.MarketVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -85,4 +88,11 @@ public interface IFundingMapper {
Integer selectmarketCount(Integer market);
Integer selectActivityStatus(Integer id);
@Select("select jwcode from z_user")
ArrayList<String> selectJwcode();
@Update("update z_user set loc_market = #{locMarket} where jwcode = #{jwcode}")
void updateLocMarket(String jwcode, String locMarket);
}

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);

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

@ -49,4 +49,6 @@ public interface IFundingService {
Result<String> deleteActivity(Integer activityId);
Result<List<MarketVo>> getMarketListByActivityId(Integer activityId);
boolean flushData() throws Exception;
}

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

@ -137,11 +137,14 @@ public class AdminGradeServiceImpl extends ServiceImpl<AdminGradeMapper, Grade>
.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);

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

@ -5,13 +5,18 @@ 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;
@ -20,7 +25,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @program: lottery
@ -47,6 +54,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);
@ -205,7 +217,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
}
@Override
public Result addWinUser(FixUserDto fixUserDto) {
public Result addWinUser(FixUserDto fixUserDto) throws Exception {
// //先判断新增的内定用户是否在总的抽奖用户中
// Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode());
@ -232,6 +244,18 @@ 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);
if(rootNode.path("code").asInt() == 401){
throw new BusinessException(400, "精网号错误");
}
try {
// 1. 检查用户是否存在不存在则创建
@ -245,6 +269,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
.isDel(0)
.createTime(new Date())
.updateTime(new Date())
.locMarket(rootNode.path("data").path("loc_market").asText())
.build();
adminUserMapper.insert(user);
userId = user.getId();
@ -315,6 +340,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
}
@Override
@Transactional
public boolean removePrizeById(Long id) {
//把关联的win_record表删了
@ -324,8 +350,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
//把关联的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);

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

@ -293,6 +293,8 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override
@Transactional(rollbackFor = Exception.class)
public Result importFixUsers(MultipartFile file, Long gradeId) {
////
//
// try {
// // 1. 解析Excel
// List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
@ -300,134 +302,71 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
// .sheet()
// .doReadSync();
//
// // 2. 准备数据集合
// List<User> newUsers = new ArrayList<>(); // 需要新增到user表的用户
// List<User> usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户
// List<UserDetail> newUserDetails = new ArrayList<>(); // 新增的userDetail
// List<UserDetail> detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail
//
// Set<String> processedCodes = new HashSet<>();
// int successCount = 0;
// int skipCount = 0;
//
// // 3. 查询所有已存在的jwcodeuser表
// Set<String> existingJwCodes = adminUserMapper.selectAllUserCodes();
//
// // 4. 查询所有已存在的user_detail记录避免N+1查询
// Map<String, UserDetail> existingDetails = adminUserDetailMapper.selectList(null)
// .stream()
// .collect(Collectors.toMap(
// detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(),
// detail -> detail
// ));
// Set<String> processedCodes = new HashSet<>();
//
// for (int i = 0; i < userDtos.size(); i++) {
// UserImportDto dto = userDtos.get(i);
// try {
// validateUser(dto, i + 2, processedCodes);
// processedCodes.add(dto.getJwcode());
//
// // 检查是否已在当前文件中处理过
// if (processedCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode());
// // 2. 查询用户是否存在按jwcode
// User user = adminUserMapper.selectUserByJwcode(dto.getJwcode());
// if (user == null) {
// // 新增用户
// user = convertToEntity(dto);
// adminUserMapper.insert(user);
// } else if (user.getIsDel() == 1) {
// // 恢复已删除用户
// user.setIsDel(0);
// adminUserMapper.updateById(user);
// }
// processedCodes.add(dto.getJwcode());
//
// // 处理逻辑
// if (existingJwCodes.contains(dto.getJwcode())) {
// // --- 用户已存在 ---
// User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode());
// // 3. 检查用户是否已经是其他等级的内定用户全局检查
// LambdaQueryWrapper<UserDetail> globalCheckWrapper = new LambdaQueryWrapper<>();
// globalCheckWrapper.eq(UserDetail::getUserId, user.getId())
// .eq(UserDetail::getIsFixed, 1)
// .eq(UserDetail::getIsDel, 0)
// .ne(UserDetail::getGradeId, gradeId); // 排除当前等级
//
// // 检查user表状态
// if (existingUser.getIsDel() == 1) {
// // user表已删除恢复用户
// existingUser.setIsDel(0);
// usersToRecover.add(existingUser);
// }
// if (adminUserDetailMapper.selectCount(globalCheckWrapper) > 0) {
// throw new IllegalArgumentException("用户已是其他等级的内定用户,无法重复内定: " + dto.getJwcode());
// }
//
// // 3. 检查是否已是当前gradeId的内定用户
// LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
// wrapper.eq(UserDetail::getUserId, user.getId())
// .eq(UserDetail::getGradeId, gradeId)
// .eq(UserDetail::getIsFixed, 1);
//
//// // 检查user_detail状态
//// UserDetail existingDetail = existingDetails.get(dto.getJwcode());
//// if (existingDetail != null) {
//// if (existingDetail.getIsDel() == 1) {
//// // user_detail已删除恢复记录
//// existingDetail.setIsDel(0);
//// existingDetail.setGradeId(gradeId);
//// detailsToRecover.add(existingDetail);
//// } else {
//// // user_detail已存在且未删除跳过
//// throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode());
//// }
//// } else {
//// // user_detail不存在新增
//// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId));
//// }
//// } else {
//// // --- 全新用户 ---
//// User newUser = convertToEntity(dto);
//// newUsers.add(newUser);
//// }
//// successCount++;
//// } catch (IllegalArgumentException e) {
//// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
//// skipCount++;
//// }
//// }
// // 检查用户是否已经是其他等级的内定用户
// UserDetail existingFixedDetail = existingDetails.get(existingUser.getId());
// if (existingFixedDetail != null) {
// if (existingFixedDetail.getGradeId().equals(gradeId)) {
// // 已经是当前等级的内定用户
// if (existingFixedDetail.getIsDel() == 1) {
// // 恢复已删除的记录
// existingFixedDetail.setIsDel(0);
// detailsToRecover.add(existingFixedDetail);
// } else {
// throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode());
// }
// } else {
// // 已经是其他等级的内定用户
// throw new IllegalArgumentException("用户已是其他等级的内定用户,无法添加到本等级: " + dto.getJwcode());
// }
// UserDetail existingDetail = adminUserDetailMapper.selectOne(wrapper);
// if (existingDetail != null) {
// if (existingDetail.getIsDel() == 0) {
// throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode());
// } else {
// // 不是任何等级的内定用户可以添加
// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId));
// // 物理删除旧记录再新增一条
// adminUserDetailMapper.deleteById(existingDetail.getId());
// }
// } else {
// // --- 全新用户 ---
// User newUser = convertToEntity(dto);
// newUsers.add(newUser);
// }
//
// // 4. 新增内定记录
// UserDetail newDetail = createUserDetail(user.getId(), gradeId);
// adminUserDetailMapper.insert(newDetail);
// successCount++;
//
// } catch (IllegalArgumentException e) {
// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
// LOGGER.warn("导入失败(行{}): {}", i + 2, e.getMessage());
// skipCount++;
// }
// }
// // 5. 批量操作数据库
// if (!newUsers.isEmpty()) {
// adminUserService.saveBatch(newUsers);
// // 为新用户创建userDetail
// newUsers.forEach(user ->
// newUserDetails.add(createUserDetail(user.getId(), gradeId)));
// }
//
// if (!usersToRecover.isEmpty()) {
// adminUserService.updateBatchById(usersToRecover);
// }
//
// if (!detailsToRecover.isEmpty()) {
// this.updateBatchById(detailsToRecover);
// }
//
// if (!newUserDetails.isEmpty()) {
// this.saveBatch(newUserDetails);
// }
//
// return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
// } catch (Exception e) {
// LOGGER.error("导入用户失败", e);
// LOGGER.error("导入失败", e);
// return Result.failure("导入失败: " + e.getMessage());
// }
try {
// 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
@ -435,56 +374,57 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
.sheet()
.doReadSync();
// 2. 检查数据量是否超过限制
if (userDtos.size() > 2000) {
return Result.failure("单次导入最多支持2000条数据");
}
// 3. 提取所有精网号并去重
List<String> jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
// 4. 批量检查member表中存在的精网号优化为单次查询
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
.stream()
.collect(Collectors.toSet());
// 5. 处理导入逻辑
int successCount = 0;
int skipCount = 0;
Set<String> processedCodes = new HashSet<>();
List<String> invalidJwCodes = new ArrayList<>();
for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i);
try {
// 基础校验
validateUser(dto, i + 2, processedCodes);
processedCodes.add(dto.getJwcode());
// 2. 查询用户是否存在按jwcode
// 检查精网号是否存在于member表
if (!existingMemberCodes.contains(dto.getJwcode())) {
invalidJwCodes.add(dto.getJwcode());
throw new IllegalArgumentException("精网号不存在于会员系统: " + dto.getJwcode());
}
// 查询或创建用户
User user = adminUserMapper.selectUserByJwcode(dto.getJwcode());
if (user == null) {
// 新增用户
user = convertToEntity(dto);
adminUserMapper.insert(user);
} else if (user.getIsDel() == 1) {
// 恢复已删除用户
user.setIsDel(0);
adminUserMapper.updateById(user);
}
// 3. 检查用户是否已经是其他等级的内定用户全局检查
LambdaQueryWrapper<UserDetail> globalCheckWrapper = new LambdaQueryWrapper<>();
globalCheckWrapper.eq(UserDetail::getUserId, user.getId())
.eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 0)
.ne(UserDetail::getGradeId, gradeId); // 排除当前等级
if (adminUserDetailMapper.selectCount(globalCheckWrapper) > 0) {
throw new IllegalArgumentException("用户已是其他等级的内定用户,无法重复内定: " + dto.getJwcode());
}
// 检查是否已是其他等级的内定用户
checkGlobalFixedUser(user.getId(), gradeId, dto.getJwcode());
// 3. 检查是否已是当前gradeId的内定用户
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getUserId, user.getId())
.eq(UserDetail::getGradeId, gradeId)
.eq(UserDetail::getIsFixed, 1);
UserDetail existingDetail = adminUserDetailMapper.selectOne(wrapper);
if (existingDetail != null) {
if (existingDetail.getIsDel() == 0) {
throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode());
} else {
// 物理删除旧记录再新增一条
adminUserDetailMapper.deleteById(existingDetail.getId());
}
}
// 处理当前等级的内定记录
processGradeFixedUser(user.getId(), gradeId);
// 4. 新增内定记录
// 新增内定记录
UserDetail newDetail = createUserDetail(user.getId(), gradeId);
adminUserDetailMapper.insert(newDetail);
successCount++;
@ -495,13 +435,51 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
}
}
return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
// 6. 构建结果信息
String message = String.format("导入完成: 成功%d条,跳过%d条", successCount, skipCount);
if (!invalidJwCodes.isEmpty()) {
message += String.format(",其中%d个精网号无效(示例: %s)",
invalidJwCodes.size(),
invalidJwCodes.stream().limit(5).collect(Collectors.joining(",")));
}
return successCount > 0 ? Result.success(message) : Result.failure("没有有效数据可导入");
} catch (Exception e) {
LOGGER.error("导入失败", e);
LOGGER.error("导入内定用户失败", e);
return Result.failure("导入失败: " + e.getMessage());
}
}
// 检查用户是否已是其他等级的内定用户
private void checkGlobalFixedUser(Long userId, Long currentGradeId, String jwcode) {
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getUserId, userId)
.eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 0)
.ne(UserDetail::getGradeId, currentGradeId);
if (adminUserDetailMapper.selectCount(wrapper) > 0) {
throw new IllegalArgumentException("用户已是其他等级的内定用户,无法重复内定: " + jwcode);
}
}
// 处理当前等级的内定记录
private void processGradeFixedUser(Long userId, Long gradeId) {
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getUserId, userId)
.eq(UserDetail::getGradeId, gradeId)
.eq(UserDetail::getIsFixed, 1);
UserDetail existingDetail = adminUserDetailMapper.selectOne(wrapper);
if (existingDetail != null) {
if (existingDetail.getIsDel() == 0) {
throw new IllegalArgumentException("用户已是当前等级的内定用户");
} else {
adminUserDetailMapper.deleteById(existingDetail.getId());
}
}
}
// 辅助方法创建UserDetail
private UserDetail createUserDetail(Long userId, Long gradeId) {
UserDetail detail = new UserDetail();
@ -555,6 +533,9 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
user.setUsername(dto.getUsername());
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
// 查询并设置loc_market
String locMarket = adminUserMapper.selectLocMarketByJwcode(dto.getJwcode());
user.setLocMarket(locMarket != null ? locMarket : "未知"); // 默认值
// 密码加密
user.setPassword("123456");
return user;

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

@ -6,6 +6,9 @@ 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;
@ -13,6 +16,8 @@ import com.lottery.admin.mapper.AdminUserDetailMapper;
import com.lottery.admin.mapper.AdminUserMapper;
import com.lottery.admin.mapper.AdminWinMapper;
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;
@ -20,8 +25,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;
@ -39,6 +46,7 @@ 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;
@ -60,8 +68,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
@ -126,8 +138,23 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
}
@Override
public boolean addUser(@Valid UserDto userDto) {
public boolean addUser(@Valid UserDto userDto) throws Exception {
String jwcode = userDto.getJwcode();
//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) {
@ -157,6 +184,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
user.setIsDel(0);
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
user.setLocMarket(locMarket);
user.setPassword("123456"); // 默认密码
return this.save(user);
@ -183,31 +211,52 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
@Override
public Result importUsers(MultipartFile file) {
try {
// 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
.head(UserImportDto.class) // 映射到 DTO 对象
.head(UserImportDto.class)
.sheet()
.doReadSync(); // 同步读取所有数据适用于读取量小的场景
.doReadSync();
// 2. 检查数据量是否超过限制
if (userDtos.size() > 2000) {
return Result.failure("单次导入最多支持2000条数据");
}
// 2. 获取已存在的精网号及其删除状态
// 3. 获取所有精网号
List<String> jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
// 4. 检查member表中存在的精网号
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
.stream()
.collect(Collectors.toSet());
// 5. 获取已存在的精网号及其删除状态
Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus()
.stream()
.collect(Collectors.toMap(
User::getJwcode,
User::getIsDel, // 保持 Integer
User::getIsDel,
(existing, replacement) -> existing
));
List<User> usersToAdd = new ArrayList<>(); //新增用户列表
List<User> usersToUpdate = new ArrayList<>(); //待更新的用户列表
Set<String> processedCodes = new HashSet<>(); // 用于当前文件内的去重
List<User> usersToAdd = new ArrayList<>();
List<User> usersToUpdate = new ArrayList<>();
Set<String> processedCodes = new HashSet<>();
int skipCount = 0;
for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i);
try {
validateUser(dto, i + 2); // 基础校验
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())) {
@ -219,25 +268,24 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
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); // 恢复为未删除状态
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++;
}
}
// 3. 执行数据库操作
// 6. 执行数据库操作
int successCount = 0;
if (!usersToAdd.isEmpty()) {
boolean addSuccess = this.saveBatch(usersToAdd);
@ -248,7 +296,6 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
successCount += updateSuccess ? usersToUpdate.size() : 0;
}
int skipCount = userDtos.size() - usersToAdd.size() - usersToUpdate.size();
return successCount > 0 ?
Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条",
successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) :
@ -260,6 +307,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
}
@Override
@Transactional
public void removeUserById(Long id) {
//关联硬删删除user_detail
//LambdaUpdateWrapper<UserDetail> updateWrapper = new LambdaUpdateWrapper<>();
@ -334,6 +382,9 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
user.setIsDel(0);
// 查询并设置loc_market
String locMarket = adminUserMapper.selectLocMarketByJwcode(dto.getJwcode());
user.setLocMarket(locMarket != null ? locMarket : "未知"); // 默认值
// 设置默认密码
user.setPassword("123456");
return user;

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

@ -148,6 +148,7 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
// 设置中奖时间
vo.setWinTime(record.getWinTime());
vo.setId(record.getId());
vo.setLocMarket(record.getLocMarket());
return vo;
})
.collect(Collectors.toList());
@ -189,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) {
@ -214,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;

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

@ -2,20 +2,29 @@ package com.lottery.admin.service.Impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.JsonPath;
import com.lottery.api.controller.PrizeController;
import com.lottery.dto.ApiUrlResp;
import com.lottery.dto.FundingActivityDto;
import com.lottery.dto.FundingUserDto;
import com.lottery.entity.Activity;
import com.lottery.admin.mapper.IFundingMapper;
import com.lottery.admin.service.IFundingService;
import com.lottery.entity.FundingExport;
import com.lottery.entity.FundingUser;
import com.lottery.exception.BusinessException;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.utils.HttpUtils;
import com.lottery.utils.ValidationUtils;
import com.lottery.vo.*;
import io.jsonwebtoken.UnsupportedJwtException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;
@ -46,6 +55,10 @@ public class FundingServiceImpl implements IFundingService {
private IFundingMapper fundingMapper;
@Autowired
ObjectMapper objectMapper = new ObjectMapper();
@Autowired
private PrizeController prizeController;
@Autowired
private WebApplicationContext webApplicationContext;
// 获取所有众筹活动
@Override
@ -187,6 +200,7 @@ public class FundingServiceImpl implements IFundingService {
result.put("total", total);
result.put("page", fundingUserDto.getPage());
result.put("pageSize", fundingUserDto.getPagesize());
return Result.success(result);
}
@ -463,5 +477,29 @@ public class FundingServiceImpl implements IFundingService {
throw new BusinessException(400,"所要查询的活动不存在");
return Result.success(fundingMapper.getMarketListByActivityId(activityId));
}
/**
* 条api
*/
String apiUrl = "http://api.homilychart.com/hljwgo/api/v2/member/info";
@Override
public boolean flushData() throws Exception {
ArrayList<String> jwcodes = new ArrayList<>();
jwcodes = fundingMapper.selectJwcode();
for (String jwcode : jwcodes) {
String locMarket = getMemberInfo(jwcode);
fundingMapper.updateLocMarket(jwcode, locMarket);
}
return true;
}
public String getMemberInfo(String jwcode) throws Exception {
Map<String, String> params = new HashMap<>();
params.put("jwcode", jwcode);
// JSON库解析
String json = HttpUtils.postUrlencoded(apiUrl, params);
return JsonPath.read(json, "$.data.loc_market");
}
}

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);

2
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);

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;
}

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

@ -202,14 +202,20 @@ public class ApiFundingServiceImpl implements ApiIFundingService {
// 提取 username
String username = rootNode.path("data").path("username").asText();
String jwcode = rootNode.path("data").path("jwcode").asText();
String locMarket = rootNode.path("data").path("loc_market").asText();
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("请勿重复助力");
}

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

@ -4,6 +4,8 @@ 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;
@ -11,12 +13,16 @@ 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 +59,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 +150,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) {
@ -294,7 +306,7 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
// 1. 获取所有内定用户(所有等级)
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getIsFixed, 1);
wrapper.eq(UserDetail::getIsFixed, 1).eq(UserDetail::getIsDel, 0);
List<UserDetail> allFixedUsers = userDetailMapper.selectList(wrapper);
// 2. 获取所有内定用户的ID
@ -337,7 +349,7 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
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 +375,31 @@ 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. 如果不存在任何记录则插入新记录
WinnerRecord winnerRecord = WinnerRecord.builder()
.userId(user.getId())
.winTime(new Date())
.prizeId(startLotteryDto.getPrizeId())
.isDel(0) // 明确设置为未删除
.locMarket(user.getLocMarket())
.build();
adminWinMapper.insert(winnerRecord);
}

2
lottery-system/lottery-service/src/main/resources/application.yml

@ -1,7 +1,7 @@
spring:
# 基础配置 (所有环境通用)
profiles:
active: prod
active: dev
# Jackson 基础配置
jackson:

4
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

6
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">

14
lottery-system/pom.xml

@ -32,6 +32,8 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
@ -136,6 +138,18 @@
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- 如果使用JsonPath -->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement>

Loading…
Cancel
Save