添加组员加锁

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.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<Object, Object> redisTemplate;
/**
*
@ -187,32 +190,32 @@ public class OrganizeServiceImpl implements OrganizeService {
@Transactional(rollbackFor = Exception.class)
public void addMember(ValidList<OrganizeUser> organizeUser) {
if (CollUtil.isNotEmpty(organizeUser)) {
List<OrganizeUser> organizeUserAll = organizeUserRepository.findAll();
Set<Long> allUserIdList = organizeUserAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toSet());
List<Long> 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<OrganizeUser> organizeUserAll = organizeUserRepository.findByUserIdIn(userIdList);
if (CollUtil.isNotEmpty(organizeUserAll)) throw new BadRequestException("已有用户分配到组,请重新选择!");
Long organizeId = organizeUserByUserId.getOrganizeId();
Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new);
// 添加组员信息
List<Long> 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) {
if (organize.getCallMode() == 1)
extensionNumberService.assignExtensionNum(organizeId, addOrganizeUser.getUserId());
}
userIdList.add(addOrganizeUser.getUserId());
}
organizeUserRepository.saveAll(organizeUser);
List<OrganizeUser> list = organizeUserRepository.findByUserIdIn(userIdList);
if (CollUtil.isEmpty(list) || list.size() != userIdList.size()) throw new BadRequestException("已有用户分配到组,请重新选择!");
} finally {
this.addMemberUnlock(userIdList);
}
}
}
@ -495,9 +498,12 @@ public class OrganizeServiceImpl implements OrganizeService {
Set<Long> userIds = organizeMemberDistributionDTO.getUserIds();
Long organizeId = organizeMemberDistributionDTO.getOrganizeId();
Long taskId = organizeMemberDistributionDTO.getTaskId();
this.addMemberLock(userIds);
try {
Organize organize = organizeRepository.findById(organizeId).orElseGet(Organize::new);
// 查询所有的组员
List<OrganizeUser> userRepositoryAll = organizeUserRepository.findByOrganizeId(organizeId);
List<OrganizeUser> userRepositoryAll = organizeUserRepository.findByUserIdIn(userIds);
List<Long> allUserIdList = userRepositoryAll.stream().map(OrganizeUser::getUserId).collect(Collectors.toList());
// 新增小组成员-分机号
@ -510,12 +516,7 @@ public class OrganizeServiceImpl implements OrganizeService {
if (organize.getCallMode() == 1) extensionNumberService.assignExtensionNum(organizeId, userId);
}
}
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("已有用户分配到组,请重新选择!");
}
if (CollUtil.isNotEmpty(addOrganizeUserList)) organizeUserRepository.saveAll(addOrganizeUserList);
//分配组员资源
ClueQueryCriteria clueQueryCriteria = new ClueQueryCriteria();
clueQueryCriteria.setOrganizeId(organizeId);
@ -540,6 +541,9 @@ public class OrganizeServiceImpl implements OrganizeService {
updateTaskOrganize.setOrganizeLabel(sourceLabe);
}
taskOrganizeRepository.save(updateTaskOrganize);
} finally {
this.addMemberUnlock(userIds);
}
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<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