From 4268b7d19fe92479d3bdc27adcfb2ad33d556261 Mon Sep 17 00:00:00 2001 From: willy <2462310981@qq.com> Date: Sat, 26 Jul 2025 18:03:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=B0=E5=8C=BA=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/lottery/dto/ApiUrlResp.java | 26 +++ .../main/java/com/lottery/entity/FundingUser.java | 2 + .../src/main/java/com/lottery/entity/User.java | 2 + .../main/java/com/lottery/entity/WinnerRecord.java | 2 + .../main/java/com/lottery/vo/FundingUserNewVo.java | 20 ++ .../main/java/com/lottery/vo/ImportResultVo.java | 23 ++ .../src/main/java/com/lottery/vo/WinUserVo.java | 2 + .../lottery/admin/controller/TongBuController.java | 29 +++ .../com/lottery/admin/mapper/AdminUserMapper.java | 12 + .../com/lottery/admin/mapper/IFundingMapper.java | 9 + .../com/lottery/admin/service/IFundingService.java | 2 + .../service/Impl/AdminUserDetailServiceImpl.java | 249 ++++++++++----------- .../admin/service/Impl/AdminUserServiceImpl.java | 50 +++-- .../admin/service/Impl/AdminWinServiceImpl.java | 1 + .../admin/service/Impl/FundingServiceImpl.java | 37 +++ lottery-system/pom.xml | 14 ++ 16 files changed, 332 insertions(+), 148 deletions(-) create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/dto/ApiUrlResp.java create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserNewVo.java create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ImportResultVo.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/TongBuController.java diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/ApiUrlResp.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/ApiUrlResp.java new file mode 100644 index 0000000..6c98011 --- /dev/null +++ b/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; + } +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingUser.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingUser.java index d8236ac..0d4de79 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/FundingUser.java +++ b/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; //地区 } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java index b77604f..8d68e5c 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java +++ b/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; // 更新时间 diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java index 26be3c5..ec609f5 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java @@ -34,6 +34,8 @@ public class WinnerRecord { private Long prizeId; // 奖品ID + private String locMarket; + @TableField("is_del") private int isDel; diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserNewVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/FundingUserNewVo.java new file mode 100644 index 0000000..13dcd25 --- /dev/null +++ b/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 { + +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ImportResultVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ImportResultVo.java new file mode 100644 index 0000000..593772f --- /dev/null +++ b/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 invalidJwCodes; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java index 5525c80..9b3ec61 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java @@ -27,6 +27,8 @@ public class WinUserVo { private String prizeName; + private String LocMarket; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date winTime; // 中奖时间; diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/TongBuController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/TongBuController.java new file mode 100644 index 0000000..956fb6f --- /dev/null +++ b/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(); + } +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java index 2a3be6a..7cfda8a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java +++ b/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 { @Select("select * from user where username = #{username}") User selectByName(String username); + + @Select("") + Set selectExistingJwCodes(@Param("jwcode") List batchJwCodes); + + @Select("select loc_market from member_info where jwcode = #{jwcode}") + String selectLocMarketByJwcode(String jwcode); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java index b369718..2157f6a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IFundingMapper.java +++ b/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; @@ -83,4 +86,10 @@ public interface IFundingMapper { Integer selectmarket(Integer id); Integer selectmarketCount(Integer market); + + @Select("select jwcode from z_user") + ArrayList selectJwcode(); + + @Update("update z_user set loc_market = #{locMarket} where jwcode = #{jwcode}") + void updateLocMarket(String jwcode, String locMarket); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IFundingService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IFundingService.java index 8dd9313..0668d79 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IFundingService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IFundingService.java @@ -49,4 +49,6 @@ public interface IFundingService { Result deleteActivity(Integer activityId); Result> getMarketListByActivityId(Integer activityId); + + boolean flushData() throws Exception; } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java index b32c5ef..3c21075 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java @@ -293,6 +293,8 @@ public class AdminUserDetailServiceImpl extends ServiceImpl userDtos = EasyExcel.read(file.getInputStream()) @@ -300,134 +302,71 @@ public class AdminUserDetailServiceImpl extends ServiceImpl newUsers = new ArrayList<>(); // 需要新增到user表的用户 -// List usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户 -// List newUserDetails = new ArrayList<>(); // 新增的userDetail -// List detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail -// -// Set processedCodes = new HashSet<>(); // int successCount = 0; // int skipCount = 0; -// -// // 3. 查询所有已存在的jwcode(user表) -// Set existingJwCodes = adminUserMapper.selectAllUserCodes(); -// -// // 4. 查询所有已存在的user_detail记录(避免N+1查询) -// Map existingDetails = adminUserDetailMapper.selectList(null) -// .stream() -// .collect(Collectors.toMap( -// detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(), -// detail -> detail -// )); +// Set 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 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 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 userDtos = EasyExcel.read(file.getInputStream()) @@ -435,56 +374,57 @@ public class AdminUserDetailServiceImpl extends ServiceImpl 2000) { + return Result.failure("单次导入最多支持2000条数据"); + } + // 3. 提取所有精网号并去重 + List jwcodes = userDtos.stream() + .map(UserImportDto::getJwcode) + .distinct() + .collect(Collectors.toList()); + + // 4. 批量检查member表中存在的精网号(优化为单次查询) + Set existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes) + .stream() + .collect(Collectors.toSet()); + + // 5. 处理导入逻辑 int successCount = 0; int skipCount = 0; Set processedCodes = new HashSet<>(); + List 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 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 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 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 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 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(); @@ -558,6 +536,9 @@ public class AdminUserDetailServiceImpl extends ServiceImpl imp @Override public Result importUsers(MultipartFile file) { - try { // 1. 解析Excel List userDtos = EasyExcel.read(file.getInputStream()) - .head(UserImportDto.class) // 映射到 DTO 对象 + .head(UserImportDto.class) .sheet() - .doReadSync(); // 同步读取所有数据,适用于读取量小的场景 + .doReadSync(); + + // 2. 检查数据量是否超过限制 + if (userDtos.size() > 2000) { + return Result.failure("单次导入最多支持2000条数据"); + } + + // 3. 获取所有精网号 + List jwcodes = userDtos.stream() + .map(UserImportDto::getJwcode) + .distinct() + .collect(Collectors.toList()); - // 2. 获取已存在的精网号及其删除状态 + // 4. 检查member表中存在的精网号 + Set existingMemberCodes = adminUserMapper.selectExistingJwCodes(jwcodes) + .stream() + .collect(Collectors.toSet()); + + // 5. 获取已存在的精网号及其删除状态 Map existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus() .stream() .collect(Collectors.toMap( User::getJwcode, - User::getIsDel, // 保持 Integer + User::getIsDel, (existing, replacement) -> existing )); - List usersToAdd = new ArrayList<>(); //新增用户列表 - List usersToUpdate = new ArrayList<>(); //待更新的用户列表 - Set processedCodes = new HashSet<>(); // 用于当前文件内的去重 + List usersToAdd = new ArrayList<>(); + List usersToUpdate = new ArrayList<>(); + Set 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())) { @@ -217,25 +238,24 @@ public class AdminUserServiceImpl extends ServiceImpl 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); @@ -246,7 +266,6 @@ public class AdminUserServiceImpl extends ServiceImpl 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)) : @@ -314,6 +333,9 @@ public class AdminUserServiceImpl extends ServiceImpl 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; diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java index bc484a8..3a228ec 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java @@ -148,6 +148,7 @@ public class AdminWinServiceImpl extends ServiceImpl 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 params = new HashMap<>(); + params.put("jwcode", jwcode); + // JSON库解析 + String json = HttpUtils.postUrlencoded(apiUrl, params); + return JsonPath.read(json, "$.data.loc_market"); + } } diff --git a/lottery-system/pom.xml b/lottery-system/pom.xml index 67bc7c3..93cc545 100644 --- a/lottery-system/pom.xml +++ b/lottery-system/pom.xml @@ -32,6 +32,8 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot spring-boot-starter-validation @@ -136,6 +138,18 @@ 0.11.5 runtime + + + com.fasterxml.jackson.core + jackson-databind + 2.13.3 + + + + com.jayway.jsonpath + json-path + 2.7.0 +