Browse Source

Merge branch 'wuweili/feature-20250715095139-抽奖众筹' into milestone-20250723-wwl

# Conflicts:合并
#	lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java
dev
willy 3 weeks ago
parent
commit
52dfd81b80
  1. 26
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/ApiUrlResp.java
  2. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingUser.java
  3. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java
  4. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java
  5. 20
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserNewVo.java
  6. 23
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ImportResultVo.java
  7. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java
  8. 29
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/TongBuController.java
  9. 12
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java
  10. 10
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java
  11. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IFundingService.java
  12. 249
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  13. 50
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  14. 1
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  15. 37
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java
  16. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  17. 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;
}
}

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

@ -31,4 +31,6 @@ public class FundingUser {
private String jwcode; // 用户唯一码 private String jwcode; // 用户唯一码
private LocalDateTime joinTime; // 参与时间 private LocalDateTime joinTime; // 参与时间
private Integer activityId; // 关联的活动ID 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 int isDel;
private String locMarket;
private Date createTime; // 创建时间 private Date createTime; // 创建时间
private Date updateTime; // 更新时间 private Date updateTime; // 更新时间

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

@ -34,6 +34,8 @@ public class WinnerRecord {
private Long prizeId; // 奖品ID private Long prizeId; // 奖品ID
private String locMarket;
@TableField("is_del") @TableField("is_del")
private int isDel; private int isDel;

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

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

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

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.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lottery.entity.User; import com.lottery.entity.User;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update; import org.apache.ibatis.annotations.Update;
@ -40,4 +41,15 @@ public interface AdminUserMapper extends BaseMapper<User> {
@Select("select * from user where username = #{username}") @Select("select * from user where username = #{username}")
User selectByName(String 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.FundingUserVo;
import com.lottery.vo.MarketVo; import com.lottery.vo.MarketVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -85,4 +88,11 @@ public interface IFundingMapper {
Integer selectmarketCount(Integer market); Integer selectmarketCount(Integer market);
Integer selectActivityStatus(Integer id); 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/IFundingService.java

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

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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Result importFixUsers(MultipartFile file, Long gradeId) { public Result importFixUsers(MultipartFile file, Long gradeId) {
////
//
// try { // try {
// // 1. 解析Excel // // 1. 解析Excel
// List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream()) // List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
@ -300,134 +302,71 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
// .sheet() // .sheet()
// .doReadSync(); // .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 successCount = 0;
// int skipCount = 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++) { // for (int i = 0; i < userDtos.size(); i++) {
// UserImportDto dto = userDtos.get(i); // UserImportDto dto = userDtos.get(i);
// try { // try {
// validateUser(dto, i + 2, processedCodes); // 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 { // } 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++; // successCount++;
//
// } catch (IllegalArgumentException e) { // } catch (IllegalArgumentException e) {
// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
// LOGGER.warn("导入失败(行{}): {}", i + 2, e.getMessage());
// skipCount++; // 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)); // return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
// } catch (Exception e) { // } catch (Exception e) {
// LOGGER.error("导入用户失败", e);
// LOGGER.error("导入失败", e);
// return Result.failure("导入失败: " + e.getMessage()); // return Result.failure("导入失败: " + e.getMessage());
// } // }
try { try {
// 1. 解析Excel // 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream()) List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
@ -435,56 +374,57 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
.sheet() .sheet()
.doReadSync(); .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 successCount = 0;
int skipCount = 0; int skipCount = 0;
Set<String> processedCodes = new HashSet<>(); Set<String> processedCodes = new HashSet<>();
List<String> invalidJwCodes = new ArrayList<>();
for (int i = 0; i < userDtos.size(); i++) { for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i); UserImportDto dto = userDtos.get(i);
try { try {
// 基础校验
validateUser(dto, i + 2, processedCodes); validateUser(dto, i + 2, processedCodes);
processedCodes.add(dto.getJwcode()); 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()); User user = adminUserMapper.selectUserByJwcode(dto.getJwcode());
if (user == null) { if (user == null) {
// 新增用户
user = convertToEntity(dto); user = convertToEntity(dto);
adminUserMapper.insert(user); adminUserMapper.insert(user);
} else if (user.getIsDel() == 1) { } else if (user.getIsDel() == 1) {
// 恢复已删除用户
user.setIsDel(0); user.setIsDel(0);
adminUserMapper.updateById(user); 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); UserDetail newDetail = createUserDetail(user.getId(), gradeId);
adminUserDetailMapper.insert(newDetail); adminUserDetailMapper.insert(newDetail);
successCount++; 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) { } catch (Exception e) {
LOGGER.error("导入失败", e);
LOGGER.error("导入内定用户失败", e);
return Result.failure("导入失败: " + e.getMessage()); 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 // 辅助方法创建UserDetail
private UserDetail createUserDetail(Long userId, Long gradeId) { private UserDetail createUserDetail(Long userId, Long gradeId) {
UserDetail detail = new UserDetail(); UserDetail detail = new UserDetail();
@ -555,6 +533,9 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
user.setUsername(dto.getUsername()); user.setUsername(dto.getUsername());
user.setCreateTime(new Date()); user.setCreateTime(new Date());
user.setUpdateTime(new Date()); user.setUpdateTime(new Date());
// 查询并设置loc_market
String locMarket = adminUserMapper.selectLocMarketByJwcode(dto.getJwcode());
user.setLocMarket(locMarket != null ? locMarket : "未知"); // 默认值
// 密码加密 // 密码加密
user.setPassword("123456"); user.setPassword("123456");
return user; return user;

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

@ -183,31 +183,52 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
@Override @Override
public Result importUsers(MultipartFile file) { public Result importUsers(MultipartFile file) {
try { try {
// 1. 解析Excel // 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream()) List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
.head(UserImportDto.class) // 映射到 DTO 对象
.head(UserImportDto.class)
.sheet() .sheet()
.doReadSync(); // 同步读取所有数据适用于读取量小的场景
.doReadSync();
// 2. 检查数据量是否超过限制
if (userDtos.size() > 2000) {
return Result.failure("单次导入最多支持2000条数据");
}
// 3. 获取所有精网号
List<String> jwcodes = userDtos.stream()
.map(UserImportDto::getJwcode)
.distinct()
.collect(Collectors.toList());
// 2. 获取已存在的精网号及其删除状态
// 4. 检查member表中存在的精网号
Set<String> existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes)
.stream()
.collect(Collectors.toSet());
// 5. 获取已存在的精网号及其删除状态
Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus() Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus()
.stream() .stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
User::getJwcode, User::getJwcode,
User::getIsDel, // 保持 Integer
User::getIsDel,
(existing, replacement) -> existing (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++) { for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i); UserImportDto dto = userDtos.get(i);
try { 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())) { if (processedCodes.contains(dto.getJwcode())) {
@ -219,25 +240,24 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
if (existingUserMap.containsKey(dto.getJwcode())) { if (existingUserMap.containsKey(dto.getJwcode())) {
Integer isDel = existingUserMap.get(dto.getJwcode()); Integer isDel = existingUserMap.get(dto.getJwcode());
if (isDel == 1) { if (isDel == 1) {
// 已删除的用户可以更新
User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode()); User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode());
User userToUpdate = convertToEntity(dto); User userToUpdate = convertToEntity(dto);
userToUpdate.setId(existingUser.getId()); userToUpdate.setId(existingUser.getId());
userToUpdate.setIsDel(0); // 恢复为未删除状态
userToUpdate.setIsDel(0);
usersToUpdate.add(userToUpdate); usersToUpdate.add(userToUpdate);
} else { } else {
throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode())); throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode()));
} }
} else { } else {
// 全新用户直接添加
usersToAdd.add(convertToEntity(dto)); usersToAdd.add(convertToEntity(dto));
} }
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage()); LOGGER.warn("导入数据校验失败: {}", e.getMessage());
skipCount++;
} }
} }
// 3. 执行数据库操作
// 6. 执行数据库操作
int successCount = 0; int successCount = 0;
if (!usersToAdd.isEmpty()) { if (!usersToAdd.isEmpty()) {
boolean addSuccess = this.saveBatch(usersToAdd); boolean addSuccess = this.saveBatch(usersToAdd);
@ -248,7 +268,6 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
successCount += updateSuccess ? usersToUpdate.size() : 0; successCount += updateSuccess ? usersToUpdate.size() : 0;
} }
int skipCount = userDtos.size() - usersToAdd.size() - usersToUpdate.size();
return successCount > 0 ? return successCount > 0 ?
Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条", Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条",
successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) : successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) :
@ -335,6 +354,9 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
user.setCreateTime(new Date()); user.setCreateTime(new Date());
user.setUpdateTime(new Date()); user.setUpdateTime(new Date());
user.setIsDel(0); user.setIsDel(0);
// 查询并设置loc_market
String locMarket = adminUserMapper.selectLocMarketByJwcode(dto.getJwcode());
user.setLocMarket(locMarket != null ? locMarket : "未知"); // 默认值
// 设置默认密码 // 设置默认密码
user.setPassword("123456"); user.setPassword("123456");
return user; return user;

1
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.setWinTime(record.getWinTime());
vo.setId(record.getId()); vo.setId(record.getId());
vo.setLocMarket(record.getLocMarket());
return vo; return vo;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());

37
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.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum; 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.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.FundingActivityDto;
import com.lottery.dto.FundingUserDto; import com.lottery.dto.FundingUserDto;
import com.lottery.entity.Activity; import com.lottery.entity.Activity;
import com.lottery.admin.mapper.IFundingMapper; import com.lottery.admin.mapper.IFundingMapper;
import com.lottery.admin.service.IFundingService; import com.lottery.admin.service.IFundingService;
import com.lottery.entity.FundingExport; import com.lottery.entity.FundingExport;
import com.lottery.entity.FundingUser;
import com.lottery.exception.BusinessException; import com.lottery.exception.BusinessException;
import com.lottery.result.Result; import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil; import com.lottery.utils.ConvertBeanUtil;
import com.lottery.utils.HttpUtils;
import com.lottery.utils.ValidationUtils; import com.lottery.utils.ValidationUtils;
import com.lottery.vo.*; import com.lottery.vo.*;
import io.jsonwebtoken.UnsupportedJwtException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional; import javax.transaction.Transactional;
@ -46,6 +55,10 @@ public class FundingServiceImpl implements IFundingService {
private IFundingMapper fundingMapper; private IFundingMapper fundingMapper;
@Autowired @Autowired
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
@Autowired
private PrizeController prizeController;
@Autowired
private WebApplicationContext webApplicationContext;
// 获取所有众筹活动 // 获取所有众筹活动
@Override @Override
@ -463,5 +476,29 @@ public class FundingServiceImpl implements IFundingService {
throw new BusinessException(400,"所要查询的活动不存在"); throw new BusinessException(400,"所要查询的活动不存在");
return Result.success(fundingMapper.getMarketListByActivityId(activityId)); 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/service/Impl/UserDetailServiceImpl.java

@ -294,7 +294,7 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
// 1. 获取所有内定用户(所有等级) // 1. 获取所有内定用户(所有等级)
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>(); 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); List<UserDetail> allFixedUsers = userDetailMapper.selectList(wrapper);
// 2. 获取所有内定用户的ID // 2. 获取所有内定用户的ID

14
lottery-system/pom.xml

@ -32,6 +32,8 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
@ -136,6 +138,18 @@
<version>0.11.5</version> <version>0.11.5</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </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> </dependencies>
<build> <build>
<pluginManagement> <pluginManagement>

Loading…
Cancel
Save