|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|