diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/OrganizeServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/OrganizeServiceImpl.java index 087a62c2..75999490 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/OrganizeServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/OrganizeServiceImpl.java @@ -36,12 +36,14 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service @@ -66,6 +68,7 @@ public class OrganizeServiceImpl implements OrganizeService { private final LabelService labelService; private final TaskUserDistributionRepository taskUserDistributionRepository; private final ExtensionUserRepository extensionUserRepository; + private final RedisTemplate redisTemplate; /** * 新增小组 @@ -187,32 +190,32 @@ public class OrganizeServiceImpl implements OrganizeService { @Transactional(rollbackFor = Exception.class) public void addMember(ValidList organizeUser) { if (CollUtil.isNotEmpty(organizeUser)) { - List organizeUserAll = organizeUserRepository.findAll(); - Set allUserIdList = organizeUserAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toSet()); - - OrganizeUser organizeUserByUserId = organizeUserRepository.findByUserId(SecurityUtils.getCurrentUserId()); - if (organizeUserByUserId == null) { - CommonLog.error("用户还未分配到组内"); - throw new BadRequestException("用户未分配到组,请创建小组"); - } - Long organizeId = organizeUserByUserId.getOrganizeId(); - Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new); - // 添加组员信息 - List userIdList = new ArrayList<>(); - for (OrganizeUser addOrganizeUser : organizeUser) { - if (allUserIdList.contains(addOrganizeUser.getUserId())) throw new BadRequestException("用户已经分配到组!"); - addOrganizeUser.setOrganizeId(organizeId); - addOrganizeUser.setIsLeader(false); - addOrganizeUser.setCreateBy(SecurityUtils.getCurrentUserId()); - //添加分机号 - if (organize.getCallMode() == 1) { - extensionNumberService.assignExtensionNum(organizeId, addOrganizeUser.getUserId()); + List userIdList = organizeUser.stream().map(OrganizeUser::getUserId).collect(Collectors.toList()); + this.addMemberLock(userIdList); + try { + OrganizeUser organizeUserByUserId = organizeUserRepository.findByUserId(SecurityUtils.getCurrentUserId()); + if (organizeUserByUserId == null) { + CommonLog.error("用户还未分配到组内"); + throw new BadRequestException("用户未分配到组,请创建小组"); + } + List organizeUserAll = organizeUserRepository.findByUserIdIn(userIdList); + if (CollUtil.isNotEmpty(organizeUserAll)) throw new BadRequestException("已有用户分配到组,请重新选择!"); + + Long organizeId = organizeUserByUserId.getOrganizeId(); + Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new); + // 添加组员信息 + for (OrganizeUser addOrganizeUser : organizeUser) { + addOrganizeUser.setOrganizeId(organizeId); + addOrganizeUser.setIsLeader(false); + addOrganizeUser.setCreateBy(SecurityUtils.getCurrentUserId()); + //添加分机号 + if (organize.getCallMode() == 1) + extensionNumberService.assignExtensionNum(organizeId, addOrganizeUser.getUserId()); } - userIdList.add(addOrganizeUser.getUserId()); + organizeUserRepository.saveAll(organizeUser); + } finally { + this.addMemberUnlock(userIdList); } - organizeUserRepository.saveAll(organizeUser); - List list = organizeUserRepository.findByUserIdIn(userIdList); - if (CollUtil.isEmpty(list) || list.size() != userIdList.size()) throw new BadRequestException("已有用户分配到组,请重新选择!"); } } @@ -495,51 +498,52 @@ public class OrganizeServiceImpl implements OrganizeService { Set userIds = organizeMemberDistributionDTO.getUserIds(); Long organizeId = organizeMemberDistributionDTO.getOrganizeId(); Long taskId = organizeMemberDistributionDTO.getTaskId(); - Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new); - // 查询所有的组员 - List userRepositoryAll = organizeUserRepository.findByOrganizeId(organizeId); - List allUserIdList = userRepositoryAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toList()); - - // 新增小组成员-分机号 - List addOrganizeUserList = new ArrayList<>(); - for (Long userId : userIds) { - if (!allUserIdList.contains(userId)) { - OrganizeUser organizeUser = new OrganizeUser(organizeId, userId, false, SecurityUtils.getCurrentUserId()); - addOrganizeUserList.add(organizeUser); - //添加分机号 - if (organize.getCallMode() == 1) extensionNumberService.assignExtensionNum(organizeId, userId); + + this.addMemberLock(userIds); + try { + Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new); + // 查询所有的组员 + List userRepositoryAll = organizeUserRepository.findByUserIdIn(userIds); + List allUserIdList = userRepositoryAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toList()); + + // 新增小组成员-分机号 + List addOrganizeUserList = new ArrayList<>(); + for (Long userId : userIds) { + if (!allUserIdList.contains(userId)) { + OrganizeUser organizeUser = new OrganizeUser(organizeId, userId, false, SecurityUtils.getCurrentUserId()); + addOrganizeUserList.add(organizeUser); + //添加分机号 + if (organize.getCallMode() == 1) extensionNumberService.assignExtensionNum(organizeId, userId); + } + } + if (CollUtil.isNotEmpty(addOrganizeUserList)) organizeUserRepository.saveAll(addOrganizeUserList); + //分配组员资源 + ClueQueryCriteria clueQueryCriteria = new ClueQueryCriteria(); + clueQueryCriteria.setOrganizeId(organizeId); + clueQueryCriteria.setUserIds(userIds); + clueQueryCriteria.setTaskId(taskId); + CommonLog.infoNewTraceId("调用服务,分配资源"); + ResponseEntity rse = sourceClueClient.queryOrganizeIdList(clueQueryCriteria); + if (rse.getBody() != null && !rse.getBody().equals("success")) { + UserDto user = userService.findById(Long.parseLong(rse.getBody())); + throw new BadRequestException(user.getNickName() + "比例过低,分配数量不能低于0"); + } + //修改小组任务信息 + CommonLog.infoNewTraceId("修改小组任务信息"); + TaskOrganize updateTaskOrganize = taskOrganizeRepository.findByOrganizeIdAndTaskId(organizeId, taskId); + updateTaskOrganize.setTaskStatus(1); + updateTaskOrganize.setBeginTime(organizeMemberDistributionDTO.getBeginTime()); + updateTaskOrganize.setEndTime(organizeMemberDistributionDTO.getEndTime()); + updateTaskOrganize.setUpdateTime(new Date()); + if (organizeMemberDistributionDTO.getSourceLabel() != null) { + List sourceLabelList = organizeMemberDistributionDTO.getSourceLabel(); + List sourceLabe = new ArrayList<>(new TreeSet<>(sourceLabelList)); + updateTaskOrganize.setOrganizeLabel(sourceLabe); } + taskOrganizeRepository.save(updateTaskOrganize); + } finally { + this.addMemberUnlock(userIds); } - if (CollUtil.isNotEmpty(addOrganizeUserList)){ - List organizeUsers = organizeUserRepository.saveAll(addOrganizeUserList); - List userIdList = organizeUsers.stream().map(OrganizeUser::getUserId).collect(Collectors.toList()); - List list = organizeUserRepository.findByUserIdIn(userIdList); - if (CollUtil.isEmpty(list) || list.size() != userIdList.size()) throw new BadRequestException("已有用户分配到组,请重新选择!"); - } - //分配组员资源 - ClueQueryCriteria clueQueryCriteria = new ClueQueryCriteria(); - clueQueryCriteria.setOrganizeId(organizeId); - clueQueryCriteria.setUserIds(userIds); - clueQueryCriteria.setTaskId(taskId); - CommonLog.infoNewTraceId("调用服务,分配资源"); - ResponseEntity rse = sourceClueClient.queryOrganizeIdList(clueQueryCriteria); - if (rse.getBody() != null && !rse.getBody().equals("success")) { - UserDto user = userService.findById(Long.parseLong(rse.getBody())); - throw new BadRequestException(user.getNickName() + "比例过低,分配数量不能低于0"); - } - //修改小组任务信息 - CommonLog.infoNewTraceId("修改小组任务信息"); - TaskOrganize updateTaskOrganize = taskOrganizeRepository.findByOrganizeIdAndTaskId(organizeId, taskId); - updateTaskOrganize.setTaskStatus(1); - updateTaskOrganize.setBeginTime(organizeMemberDistributionDTO.getBeginTime()); - updateTaskOrganize.setEndTime(organizeMemberDistributionDTO.getEndTime()); - updateTaskOrganize.setUpdateTime(new Date()); - if (organizeMemberDistributionDTO.getSourceLabel() != null) { - List sourceLabelList = organizeMemberDistributionDTO.getSourceLabel(); - List sourceLabe = new ArrayList<>(new TreeSet<>(sourceLabelList)); - updateTaskOrganize.setOrganizeLabel(sourceLabe); - } - taskOrganizeRepository.save(updateTaskOrganize); return new ResponseEntity<>(CommonResponse.createBySuccess(ResponseCode.SUCCESS), HttpStatus.OK); } @@ -913,4 +917,43 @@ public class OrganizeServiceImpl implements OrganizeService { return findUser(userIds, organizeUserQueryCriteria); } + /** + * 添加组员时加锁 防止重复 + */ + public void addMemberLock(Collection userIdList) { + boolean flag = true; + while (true) { + for (Long val : userIdList) { + String keyStr = "addMember::" + val; + Boolean bool = redisTemplate.opsForValue().setIfAbsent(keyStr, keyStr, 30L, TimeUnit.SECONDS); + if (bool != null && !bool){ + flag = false; + break; + } + } + if (!flag){ + try { + TimeUnit.MILLISECONDS.sleep(30); + } catch (InterruptedException e) { + throw new BadRequestException("刷新后重试!"); + } + }else { + break; + } + } + } + + /** + * 添加组员时解锁 + */ + public void addMemberUnlock(Collection userIdList) { + for (Long val : userIdList) { + String keyStr = "addMember::" + val; + if (Objects.equals(redisTemplate.opsForValue().get(keyStr), keyStr)) { + redisTemplate.delete(keyStr); + } + } + + + } }