添加组员加锁

master
yqy 11 months ago
parent 0562c508b4
commit 67131138f7

@ -36,12 +36,14 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@ -66,6 +68,7 @@ public class OrganizeServiceImpl implements OrganizeService {
private final LabelService labelService; private final LabelService labelService;
private final TaskUserDistributionRepository taskUserDistributionRepository; private final TaskUserDistributionRepository taskUserDistributionRepository;
private final ExtensionUserRepository extensionUserRepository; private final ExtensionUserRepository extensionUserRepository;
private final RedisTemplate<Object, Object> redisTemplate;
/** /**
* *
@ -187,32 +190,32 @@ public class OrganizeServiceImpl implements OrganizeService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void addMember(ValidList<OrganizeUser> organizeUser) { public void addMember(ValidList<OrganizeUser> organizeUser) {
if (CollUtil.isNotEmpty(organizeUser)) { if (CollUtil.isNotEmpty(organizeUser)) {
List<OrganizeUser> organizeUserAll = organizeUserRepository.findAll(); List<Long> userIdList = organizeUser.stream().map(OrganizeUser::getUserId).collect(Collectors.toList());
Set<Long> allUserIdList = organizeUserAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toSet()); this.addMemberLock(userIdList);
try {
OrganizeUser organizeUserByUserId = organizeUserRepository.findByUserId(SecurityUtils.getCurrentUserId()); OrganizeUser organizeUserByUserId = organizeUserRepository.findByUserId(SecurityUtils.getCurrentUserId());
if (organizeUserByUserId == null) { if (organizeUserByUserId == null) {
CommonLog.error("用户还未分配到组内"); CommonLog.error("用户还未分配到组内");
throw new BadRequestException("用户未分配到组,请创建小组"); throw new BadRequestException("用户未分配到组,请创建小组");
} }
Long organizeId = organizeUserByUserId.getOrganizeId(); List<OrganizeUser> organizeUserAll = organizeUserRepository.findByUserIdIn(userIdList);
Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new); if (CollUtil.isNotEmpty(organizeUserAll)) throw new BadRequestException("已有用户分配到组,请重新选择!");
// 添加组员信息
List<Long> userIdList = new ArrayList<>(); Long organizeId = organizeUserByUserId.getOrganizeId();
for (OrganizeUser addOrganizeUser : organizeUser) { Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new);
if (allUserIdList.contains(addOrganizeUser.getUserId())) throw new BadRequestException("用户已经分配到组!"); // 添加组员信息
addOrganizeUser.setOrganizeId(organizeId); for (OrganizeUser addOrganizeUser : organizeUser) {
addOrganizeUser.setIsLeader(false); addOrganizeUser.setOrganizeId(organizeId);
addOrganizeUser.setCreateBy(SecurityUtils.getCurrentUserId()); addOrganizeUser.setIsLeader(false);
//添加分机号 addOrganizeUser.setCreateBy(SecurityUtils.getCurrentUserId());
if (organize.getCallMode() == 1) { //添加分机号
extensionNumberService.assignExtensionNum(organizeId, addOrganizeUser.getUserId()); if (organize.getCallMode() == 1)
extensionNumberService.assignExtensionNum(organizeId, addOrganizeUser.getUserId());
} }
userIdList.add(addOrganizeUser.getUserId()); organizeUserRepository.saveAll(organizeUser);
} finally {
this.addMemberUnlock(userIdList);
} }
organizeUserRepository.saveAll(organizeUser);
List<OrganizeUser> 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<Long> userIds = organizeMemberDistributionDTO.getUserIds(); Set<Long> userIds = organizeMemberDistributionDTO.getUserIds();
Long organizeId = organizeMemberDistributionDTO.getOrganizeId(); Long organizeId = organizeMemberDistributionDTO.getOrganizeId();
Long taskId = organizeMemberDistributionDTO.getTaskId(); Long taskId = organizeMemberDistributionDTO.getTaskId();
Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new);
// 查询所有的组员 this.addMemberLock(userIds);
List<OrganizeUser> userRepositoryAll = organizeUserRepository.findByOrganizeId(organizeId); try {
List<Long> allUserIdList = userRepositoryAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toList()); Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new);
// 查询所有的组员
// 新增小组成员-分机号 List<OrganizeUser> userRepositoryAll = organizeUserRepository.findByUserIdIn(userIds);
List<OrganizeUser> addOrganizeUserList = new ArrayList<>(); List<Long> allUserIdList = userRepositoryAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toList());
for (Long userId : userIds) {
if (!allUserIdList.contains(userId)) { // 新增小组成员-分机号
OrganizeUser organizeUser = new OrganizeUser(organizeId, userId, false, SecurityUtils.getCurrentUserId()); List<OrganizeUser> addOrganizeUserList = new ArrayList<>();
addOrganizeUserList.add(organizeUser); for (Long userId : userIds) {
//添加分机号 if (!allUserIdList.contains(userId)) {
if (organize.getCallMode() == 1) extensionNumberService.assignExtensionNum(organizeId, 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<String> 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<String> sourceLabelList = organizeMemberDistributionDTO.getSourceLabel();
List<String> sourceLabe = new ArrayList<>(new TreeSet<>(sourceLabelList));
updateTaskOrganize.setOrganizeLabel(sourceLabe);
} }
taskOrganizeRepository.save(updateTaskOrganize);
} finally {
this.addMemberUnlock(userIds);
} }
if (CollUtil.isNotEmpty(addOrganizeUserList)){
List<OrganizeUser> organizeUsers = organizeUserRepository.saveAll(addOrganizeUserList);
List<Long> userIdList = organizeUsers.stream().map(OrganizeUser::getUserId).collect(Collectors.toList());
List<OrganizeUser> 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<String> 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<String> sourceLabelList = organizeMemberDistributionDTO.getSourceLabel();
List<String> sourceLabe = new ArrayList<>(new TreeSet<>(sourceLabelList));
updateTaskOrganize.setOrganizeLabel(sourceLabe);
}
taskOrganizeRepository.save(updateTaskOrganize);
return new ResponseEntity<>(CommonResponse.createBySuccess(ResponseCode.SUCCESS), HttpStatus.OK); return new ResponseEntity<>(CommonResponse.createBySuccess(ResponseCode.SUCCESS), HttpStatus.OK);
} }
@ -913,4 +917,43 @@ public class OrganizeServiceImpl implements OrganizeService {
return findUser(userIds, organizeUserQueryCriteria); return findUser(userIds, organizeUserQueryCriteria);
} }
/**
*
*/
public void addMemberLock(Collection<Long> 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<Long> userIdList) {
for (Long val : userIdList) {
String keyStr = "addMember::" + val;
if (Objects.equals(redisTemplate.opsForValue().get(keyStr), keyStr)) {
redisTemplate.delete(keyStr);
}
}
}
} }

Loading…
Cancel
Save