package cc.mrbird.febs.server.hr.service.impl; import java.io.*; import java.util.*; import java.util.stream.Collectors; import cc.mrbird.febs.common.core.constant.ModuleCode; import cc.mrbird.febs.common.core.exception.FebsException; import cc.mrbird.febs.common.core.utils.FebsUtil; import cc.mrbird.febs.common.core.utils.MyUtil; import cc.mrbird.febs.common.core.utils.SequenceUtil; import cc.mrbird.febs.server.hr.entity.EmpAccessory; import cc.mrbird.febs.server.hr.entity.EmpBaseInfo; import cc.mrbird.febs.server.hr.entity.FilesUpload; import cc.mrbird.febs.server.hr.entity.Folder; import cc.mrbird.febs.server.hr.mapper.FilesUploadMapper; import cc.mrbird.febs.server.hr.properties.FebsServerHrProperties; import cc.mrbird.febs.server.hr.service.IEmpBaseInfoService; import cc.mrbird.febs.server.hr.service.IFilesUploadService; import cc.mrbird.febs.server.hr.service.IFolderService; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Propagation; import lombok.RequiredArgsConstructor; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import cc.mrbird.febs.common.core.entity.QueryRequest; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 文件上传 Service实现 * * @author yz * @date 2021-02-05 22:51:00 */ @Service @RequiredArgsConstructor @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class FilesUploadServiceImpl extends ServiceImpl implements IFilesUploadService { private final IFolderService iFolderService; private final FebsServerHrProperties properties; private final IEmpBaseInfoService empBaseInfoService; private final String operatorId = Optional.ofNullable(FebsUtil.getCurrentUser()) .map(u -> u.getUserId().toString()) .orElse("1"); /** * 参数2为数据中心ID 参数1为终端ID */ private Snowflake snowflake = IdUtil.getSnowflake(ModuleCode.HR_FIlE, 1); @Override public IPage findFilesUploads(QueryRequest request, FilesUpload filesUpload) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); Page page = new Page<>(request.getPageNum(), request.getPageSize()); return this.page(page, queryWrapper); } @Override public List findFilesUploads(FilesUpload filesUpload) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(FilesUpload::getDelFlag, 0); if (null != filesUpload.getFolderid()) { queryWrapper.eq(FilesUpload::getFolderid, filesUpload.getFolderid()); } if (StrUtil.isNotBlank(filesUpload.getFilesname())) { queryWrapper.like(FilesUpload::getFilesname, filesUpload.getFilesname()); } queryWrapper.orderByDesc(FilesUpload::getModifytime); return this.baseMapper.selectList(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void createFilesUpload(Long folderid, MultipartFile file) throws FebsException, IOException { Folder folder = iFolderService.getById(folderid); Dict dict = MyUtil.filesUpload(file, properties.getUploadCommonPath() + folder.getFoldername() + "/", snowflake.nextIdStr()); FilesUpload filesUpload = new FilesUpload(); filesUpload.setCreatetime(new Date()); filesUpload.setCreator(operatorId); filesUpload.setDelFlag(0); filesUpload.setFilesaddress(dict.getStr("newName")); filesUpload.setFilesformat(StrUtil.isBlank(dict.getStr("suffix")) ? dict.getStr("suffix") : dict.getStr("suffix").substring(1)); filesUpload.setFilesid(SequenceUtil.generateId(0L, ModuleCode.HR_FIlE)); filesUpload.setFilesname(dict.getStr("fileName")); filesUpload.setFolderid(folderid); filesUpload.setModifier(operatorId); filesUpload.setModifytime(new Date()); filesUpload.setVersion(0); this.save(filesUpload); } @Override @Transactional(rollbackFor = Exception.class) public void updateFilesUpload(FilesUpload filesUpload) throws FebsException { if ( filesUpload.getFilesname().indexOf(".")<=0){ throw new FebsException("文件名格式错误"); } LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(FilesUpload::getFilesid,filesUpload.getFilesid()) .set(FilesUpload::getFilesname,filesUpload.getFilesname()).set(FilesUpload::getFilesformat, filesUpload.getFilesname().substring( filesUpload.getFilesname().indexOf(".")+1)); this.update(wrapper); } @Override @Transactional(rollbackFor = Exception.class) public void deleteFilesUpload(String fileids) { String[] arr = fileids.split(","); LambdaUpdateWrapper wapper = new LambdaUpdateWrapper<>(); wapper.in(FilesUpload::getFilesid, arr); wapper.set(FilesUpload::getDelFlag, 1); wapper.set(FilesUpload::getModifier, operatorId); wapper.set(FilesUpload::getModifytime, new Date()); this.update(wapper); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(FilesUpload::getFilesid, arr); List list = this.list(queryWrapper); list.parallelStream().forEach(i -> { Folder folder = iFolderService.getById(i.getFolderid()); FileUtil.del(properties.getUploadCommonPath() + folder.getFoldername() + "/" + i.getFilesaddress()); }); } @Override public void download(String fileids, HttpServletRequest request, HttpServletResponse response) { String[] arr = fileids.split(","); List files = new ArrayList<>(); List fileName = new ArrayList<>(); Arrays.stream(arr).forEach(i -> { FilesUpload filesUpload = this.getById(i); Folder folder = iFolderService.getById(filesUpload.getFolderid()); files.add(new File(properties.getUploadCommonPath() + folder.getFoldername() + "/" + filesUpload.getFilesaddress())); if (fileName.parallelStream().filter(filter -> StrUtil.equals(filesUpload.getFilesname(), filter)).count() == 0) { fileName.add(filesUpload.getFilesname()); } else { fileName.add(filesUpload.getFilesname() + fileName.parallelStream().filter(filter -> StrUtil.equals(filesUpload.getFilesname(), filter)).count() + 1); } }); MyUtil.download(request, response, files, fileName); } @Override public void mvFiles(String fileids, Long folderid) { String[] arr = fileids.split(","); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(FilesUpload::getFilesid, arr); List list = this.list(queryWrapper); list.parallelStream().forEach(i -> { Folder folder = iFolderService.getById(i.getFolderid()); Folder newfolder = iFolderService.getById(folderid); File oldfile = new File(properties.getUploadCommonPath() + folder.getFoldername() + "/" + i.getFilesaddress()); File newfile = new File(properties.getUploadCommonPath() + newfolder.getFoldername() + "/" + i.getFilesaddress()); FileUtil.move(oldfile, newfile, true); }); LambdaUpdateWrapper wapper = new LambdaUpdateWrapper<>(); wapper.in(FilesUpload::getFilesid, arr); wapper.set(FilesUpload::getFolderid, fileids); wapper.set(FilesUpload::getModifier, operatorId); wapper.set(FilesUpload::getModifytime, new Date()); this.update(wapper); } @Override public void getImage(String filesid, HttpServletResponse response) throws Exception { FilesUpload filesUpload = this.getById(filesid); if (StrUtil.isBlank(filesUpload.getFilesaddress())) { return; } Folder folder = iFolderService.getById(filesUpload.getFolderid()); String path = properties.getUploadCommonPath() + folder.getFoldername() + "/" + filesUpload.getFilesaddress(); try (InputStream inputStream = new FileInputStream(path); OutputStream out = response.getOutputStream()) { //byte数组用于存放图片字节数据 byte[] buff = new byte[inputStream.available()]; inputStream.read(buff); inputStream.close(); if (filesUpload.getFilesformat().equals("tif")){ //设置发送到客户端的响应内容类型 response.setContentType("image/tiff"); }else if (filesUpload.getFilesformat().equals("bmp")){ response.setContentType("application/x-bmp"); }else if (filesUpload.getFilesformat().equals("jpg")){ response.setContentType("image/jpeg"); }else if (filesUpload.getFilesformat().equals("png")){ response.setContentType("image/png"); }else if (filesUpload.getFilesformat().equals("gif")){ response.setContentType("image/gif"); } out.write(buff); } } }