package com.fdkankan.ucenter.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fdkankan.ucenter.entity.Folder;
import com.fdkankan.ucenter.entity.FolderScene;
import com.fdkankan.ucenter.entity.ScenePlus;
import com.fdkankan.ucenter.entity.ScenePro;
import com.fdkankan.ucenter.mapper.IFolderSceneMapper;
import com.fdkankan.ucenter.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.ucenter.vo.response.GroupByCount;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 文件夹和场景关联表 服务实现类
*
*
* @author
* @since 2022-07-08
*/
@Service
public class FolderSceneServiceImpl extends ServiceImpl implements IFolderSceneService {
@Autowired
private ISceneProService sceneProService;
@Autowired
private IScenePlusService scenePlusService;
@Autowired
private IFolderService folderService;
@Override
public void deleteByFolderIds(List delIds,Long userId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(FolderScene::getFolderId,delIds);
List list = this.list(wrapper);
List sceneIds = list.parallelStream().map(FolderScene::getSceneId).collect(Collectors.toList());
if(sceneIds.size() >0){
sceneProService.deleteByIds(sceneIds,userId);
}
List ids = list.parallelStream().map(FolderScene::getId).collect(Collectors.toList());
this.removeByIds(ids);
}
@Override
public FolderScene getByTypeNum(String num, Integer type) {
return getBaseMapper().getByTypeNum(num,type);
}
@Override
public FolderScene getByType(String sceneId, Integer type) {
return getBaseMapper().getByType(sceneId,type);
}
@Override
public HashMap getGroupByFolderIds(List folderIds) {
List ids = folderIds.parallelStream().map(Folder::getId).collect(Collectors.toList());
List list = getBaseMapper().getGroupByFolderIds(ids);
HashMap folderMap = new HashMap<>();
for (Folder folder : folderIds) {
folderMap.put(folder.getId(),folder);
}
HashMap map = new HashMap<>();
for (GroupByCount groupByCount : list) {
Folder folder = this.getParentFolder(folderMap,groupByCount.getId());
map.merge(folder.getId(), groupByCount.getCount(), Long::sum);
}
return map;
}
private Folder getParentFolder(HashMap folderMap, Long id) {
Folder folder = folderMap.get(id);
if(folder != null && folder.getParentId()!=null && folderMap.containsKey(folder.getParentId())){
return getParentFolder(folderMap,folder.getParentId());
}
return folder;
}
@Override
public Long getCountByFolderAndSon(Long folderId) {
List folderIdList = new ArrayList<>();
folderIdList.add(folderId);
this.getFolderSon(folderId,folderIdList);
if(folderIdList.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(FolderScene::getFolderId,folderIdList);
return this.count(wrapper);
}
return 0L;
}
private void getFolderSon(Long folderId, List folderIdList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Folder::getParentId,folderId);
List list = folderService.list(wrapper);
if(list.size() <=0){
return;
}
List collect = list.stream().map(Folder::getId).collect(Collectors.toList());
folderIdList.addAll(collect);
for (Long aLong : collect) {
this.getFolderSon(aLong,folderIdList);
}
}
@Override
public void delBySceneId(List proIds) {
if(proIds.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(FolderScene::getSceneId,proIds);
this.remove(wrapper);
}
}
@Override
public void delByCameraIds(List cameraIds) {
if(cameraIds.size() >0){
List proList = sceneProService.getListByCameraIds(cameraIds);
List plusList = scenePlusService.getListByCameraIds(cameraIds);
List sceneIds = new ArrayList<>();
if(proList.size() >0){
List proIds = proList.stream().map(ScenePro::getId).collect(Collectors.toList());
if(proIds.size() >0){
sceneIds.addAll(proIds);
}
}
if(plusList.size() >0){
List plusIds = plusList.stream().map(ScenePlus::getId).collect(Collectors.toList());
if(plusIds.size() >0){
sceneIds.addAll(plusIds);
}
}
if(sceneIds.size() >0){
this.delBySceneId(sceneIds);
}
}
}
}