package com.fdkankan.scene.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.fdkankan.common.constant.RecStatus;
import com.fdkankan.common.constant.SceneConstant;
import com.fdkankan.common.constant.TbStatus;
import com.fdkankan.common.response.ResultData;
import com.fdkankan.common.util.DateExtUtil;
import com.fdkankan.scene.entity.Folder;
import com.fdkankan.scene.entity.FolderScene;
import com.fdkankan.scene.entity.ScenePro;
import com.fdkankan.scene.mapper.IFolderMapper;
import com.fdkankan.scene.service.IFolderSceneService;
import com.fdkankan.scene.service.IFolderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.scene.service.ISceneProService;
import com.fdkankan.scene.vo.FolderParamVO;
import com.fdkankan.scene.vo.FolderVO;
import com.fdkankan.common.constant.ErrorCode;
import com.fdkankan.common.exception.BusinessException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
*
* 文件夹表 服务实现类
*
*
* @author dengsixing
* @since 2021-12-24
*/
@Service
public class FolderServiceImpl extends ServiceImpl implements IFolderService {
@Autowired
IFolderSceneService folderSceneService;
@Autowired
ISceneProService sceneProService;
@Override
public List findByParentId(Long parentId) {
return baseMapper.selectList(
new LambdaQueryWrapper()
.eq(Folder::getTbStatus, TbStatus.VALID.code())
.eq(Folder::getParentId, parentId));
}
@Override
public List findByParentIdAndName(Long parentId, String folderName, Long userId) {
return baseMapper.selectByCondition(
FolderVO.builder()
.recStatus(RecStatus.VALID.code())
.folderName(folderName)
.userId(userId)
.parentId(parentId).build());
}
@Override
public List findByUserIdAndType(Long userId, Integer folderType, String folderName) {
return baseMapper.selectByUserIdAndType(
FolderVO.builder()
.folderName(folderName)
.userId(userId)
.folderType(folderType).build());
}
/**
* 这里的ids似乎没用
* @param id
* @param ids
*/
@Override
public void deleteAllFile(Long id, Set ids) {
Folder folder = new Folder();
folder.setTbStatus(TbStatus.DELETE.code());
this.update(new LambdaUpdateWrapper()
.eq(Folder::getId, id)
.set(Folder::getTbStatus, TbStatus.DELETE.code()));
List folderSceneList = folderSceneService.findByFolderId(id);
if(CollUtil.isNotEmpty(folderSceneList)){
folderSceneList.forEach(folderScene -> ids.add(folderScene.getSceneId()));
}
folderSceneService.deleteByFolderId(id);
List list = this.findByParentId(id);
if(CollUtil.isNotEmpty(list)){
for (Folder item : list) {
deleteAllFile(item.getId(), ids);
}
}
}
@Override
public void move(FolderVO folderVO) {
if(StrUtil.isEmpty(folderVO.getFolderIds()) && StrUtil.isEmpty(folderVO.getSceneIds())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
if(Objects.isNull(folderVO.getFolderType())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
String[] folderIds = folderVO.getFolderIds().split(",");
Folder folder = null;
for (String folderId : folderIds) {
folder = this.getOne(
new LambdaQueryWrapper()
.eq(Folder::getTbStatus, TbStatus.VALID.code())
.eq(Folder::getId, Long.valueOf(folderId)));
if(Objects.isNull(folder)){
continue;
}
folder.setParentId(folderVO.getParentId());
List subList = this.findByParentIdAndName(folderVO.getParentId(), folder.getFolderName(), folderVO.getUserId());
if(CollUtil.isNotEmpty(subList)){
//表示迁移回当前目录,不做处理
if(subList.get(0).getId().equals(Long.parseLong(folderId))){
return;
}
throw new BusinessException(ErrorCode.FAILURE_CODE_5030);
}
updateById(folder);
}
if(StrUtil.isNotEmpty(folderVO.getSceneIds())){
String[] sceneIds = folderVO.getSceneIds().split(",");
FolderScene folderScene = null;
for (String sceneId : sceneIds) {
folderScene = folderSceneService.findByType(Long.valueOf(sceneId), folderVO.getFolderType());
if(Objects.nonNull(folderScene)){
folderSceneService.removeById(folderScene.getId());
}
if(Objects.nonNull(folderVO.getParentId())){
folderScene = new FolderScene();
folderScene.setSceneId(Long.valueOf(sceneId));
folderScene.setFolderId(folderVO.getParentId());
folderSceneService.save(folderScene);
}
}
}
}
@Override
public List convert(List list) {
List responseFolders = new ArrayList<>();
Integer sceneNumFile = 0;
for (Folder folder : list){
sceneNumFile = 0;
FolderVO folderVO = FolderVO.builder().build();
BeanUtils.copyProperties(folder, folderVO);
folderVO.setName(folder.getFolderName());
folderVO.setType(folder.getFolderType());
if(folder.getCreateTime() != null){
folderVO.setCreateTimeStr(DateUtil.format(folder.getCreateTime(), DateExtUtil.dateStyle4));
}
folderVO.setIsFolder(1);
Integer sceneNum = 0;
List folderSceneList =
folderSceneService.list(
new LambdaQueryWrapper()
.eq(FolderScene::getFolderId, folder.getId())
.orderByDesc(FolderScene::getId));
if(CollUtil.isNotEmpty(folderSceneList)){
sceneNumFile = sceneProService.findFolderIdScence(folder.getId(),folder.getUserId());
}
sceneNum += sceneNumFile;
//获取当前文件夹里面文件夹的场景数
sceneNum = folderChildrenSceneNum(folderVO.getId(), sceneNum);
// log.info(responseFolder.getName() + ",该场景最终数量:" + sceneNum);
folderVO.setSceneNum(sceneNum);
if(CollUtil.isNotEmpty(folderSceneList)){
ScenePro scenePro = sceneProService.getOne(
new LambdaQueryWrapper()
.select(ScenePro::getThumb)
.eq(ScenePro::getId,folderSceneList.get(0).getSceneId()));
folderVO.setImg(scenePro == null? "" : scenePro.getThumb());
}
responseFolders.add(folderVO);
}
return responseFolders;
}
@Override
public ResultData save(FolderParamVO param) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
.eq(Folder::getFolderName, param.getName()).eq(Folder::getUserId, param.getUserId());
if(Objects.isNull(param.getParentId())){
wrapper.isNull(Folder::getParentId);
}else{
wrapper.eq(Folder::getParentId, param.getParentId());
}
long count = this.count(wrapper);
if(count > 0){
throw new BusinessException(ErrorCode.FAILURE_CODE_5030);
}
Folder folder = new Folder();
BeanUtils.copyProperties(param, folder);
folder.setFolderName(param.getName());
folder.setFolderType(param.getType());
this.save(folder);
return ResultData.ok();
}
//根据文件夹,递归获取该文件夹中所有文件夹的场景数量之和
public int folderChildrenSceneNum(Long parentId, Integer sceneNum){
List byParentId = this.findByParentId(parentId);
if(byParentId != null && byParentId.size() > 0){
Integer sceneNumFile = 0;
for (Folder folder : byParentId) {
sceneNumFile = 0;
List folderSceneList =
folderSceneService.list(
new LambdaQueryWrapper()
.eq(FolderScene::getFolderId, folder.getId())
.orderByDesc(FolderScene::getId));
if(CollUtil.isNotEmpty(folderSceneList)){
sceneNumFile = sceneProService.findFolderIdScence(folder.getId(),folder.getUserId());
}
sceneNum += sceneNumFile;
sceneNum = folderChildrenSceneNum(folder.getId(), sceneNum);
}
}
return sceneNum;
}
}