package com.hssx.cloudmodel.service.impl;
import java.io.RandomAccessFile;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hssx.cloudmodel.constant.Constant;
import com.hssx.cloudmodel.entity.*;
import com.hssx.cloudmodel.entity.vo.UserVO;
import com.hssx.cloudmodel.mapper.*;
import com.hssx.cloudmodel.service.ProjectFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hssx.cloudmodel.service.ProjectOperationDynamicsService;
import com.hssx.cloudmodel.util.FileUtil;
import com.hssx.cloudmodel.util.HttpRespMsg;
import com.hssx.cloudmodel.util.OpenOfficeService;
import com.hssx.cloudmodel.util.QcloudUntil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Base64Utils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
/**
*
* 服务实现类
*
*
* @author 吴涛涛
* @since 2019-07-30
*/
@Service
public class ProjectFileServiceImpl extends ServiceImpl implements ProjectFileService {
@Resource
UserMapper userMapper;
@Resource
ProjectFileMapper projectFileMapper;
@Resource
ProjectOperationDynamicsMapper projectOperationDynamicsMapper;
@Resource
ProjectMapper projectMapper;
@Resource
PdfFileMapper pdfFileMapper;
@Resource
ProjectApproveMapper projectApproveMapper;
@Resource
NewsNoticeMapper newsNoticeMapper;
@Resource
NewsNoticeUserMapper newsNoticeUserMapper;
@Override
public HttpRespMsg addFile(UserVO userVO, MultipartFile file, String path) {
HttpRespMsg msg = new HttpRespMsg();
User user = userMapper.selectOne(new QueryWrapper().eq("head_imgurl", userVO.getToken()));
if (user != null) {
if (file != null) {
ProjectFile projectFile = new ProjectFile();
projectFile.setUploaderId(user.getId());
projectFile.setUploader(user.getUsername());
projectFile.setProjectId(userVO.getProjectId());
File dir = null;
dir = new File(path);
// D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
if (!dir.exists()) {
dir.mkdirs();
}
String fileName = "";
if (file != null) {
fileName = file.getOriginalFilename();
projectFile.setFileName(fileName);
projectFile.setFileSize(FileUtil.getReadableFileSize(file.getSize()));
System.out.println("上传文件名称" + file.getName() + ", dir = " + dir.getAbsolutePath());
int pos = fileName.lastIndexOf(".");
String rand = UUID.randomUUID().toString().replaceAll("-", "");
String sufix = fileName.substring(pos);
fileName = rand + sufix;
projectFile.setFileType(sufix);//文件后缀
projectFile.setUrl("/upload/" + fileName);
File saveFile = new File(dir, fileName);
projectFileMapper.insert(projectFile);
try {
saveFile.createNewFile();
file.transferTo(saveFile);
//将文件传到腾讯云
final String qFileName = fileName;
new Thread(){
public void run() {
QcloudUntil.upload(path + qFileName,qFileName);
QcloudUntil.close();
}
}.start();
if (OpenOfficeService.canTransferToPdf(projectFile.getFileType())) {
//上传完,需要生成pdf
OpenOfficeService openOfficeService = new OpenOfficeService();
String dFile1 = path+UUID.randomUUID().toString().replaceAll("-", "")+".pdf";
openOfficeService.start();
File newFile = new File(dFile1);
if(!newFile .exists()){
openOfficeService.office2PDF(path + fileName,dFile1);
PdfFile pdfFile = new PdfFile();
pdfFile.setPdfUrl("/upload/"+dFile1.substring(path.length()));
pdfFile.setFileId(projectFile.getId());
pdfFile.setType(1);
pdfFile.setRafId(projectFile.getProjectId());
pdfFile.setSourceFileUrl(projectFile.getUrl());
pdfFileMapper.insert(pdfFile);
}
openOfficeService.shutdown();
}
} catch (IOException e) {
e.printStackTrace();
projectFile = null;
} catch (Exception e) {
e.printStackTrace();
projectFile = null;
}
//添加上传记录
ProjectOperationDynamics dynamics = new ProjectOperationDynamics();
dynamics.setContent(Constant.UPLOAD);
dynamics.setFileName(file.getOriginalFilename());
dynamics.setOperatorId(user.getId());
dynamics.setOperator(user.getUsername());
dynamics.setProjectId(userVO.getProjectId());
projectOperationDynamicsMapper.insert(dynamics);
}
msg.data = projectFile;
}
} else {
msg.setError("当前用户不存在或者未登录");
}
return msg;
}
@Override
public HttpRespMsg dowloadFile(ProjectFile projectFile, String token, String downLoadpath, HttpServletResponse response, String path) throws FileNotFoundException, UnsupportedEncodingException {
HttpRespMsg msg = new HttpRespMsg();
User user = userMapper.selectOne(new QueryWrapper().eq("head_imgurl", token));
//添加上传记录
ProjectOperationDynamics dynamics = new ProjectOperationDynamics();
dynamics.setContent(Constant.DOWNLOAD);
ProjectFile file = projectFileMapper.selectById(projectFile.getId());
dynamics.setFileName(file.getFileName());
dynamics.setOperatorId(user.getId());
dynamics.setOperator(user.getUsername());
dynamics.setProjectId(file.getProjectId());
projectOperationDynamicsMapper.insert(dynamics);
downloadLocal(response, downLoadpath, file, path);
return msg;
}
public void downloadLocal(HttpServletResponse response, String downLoadpath, ProjectFile file, String path) throws FileNotFoundException, UnsupportedEncodingException {
// // 下载本地文件
// String fileName = file.getFileName().toString(); // 文件的默认保存名
// // 读到流中
// File dir = null;
// dir = new File(downLoadpath);
// // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
// if (!dir.exists()) {
// dir.mkdirs();
// }
// InputStream inStream = new FileInputStream(path.substring(0, path.length() - "/upload/".length())+file.getUrl());// 文件的存放路径
// // 设置输出的格式
// response.reset();
// response.setContentType("bin");
// response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// // 循环取出流中的数据
// byte[] b = new byte[100];
// int len;
// try {
// while ((len = inStream.read(b)) > 0)
// response.getOutputStream().write(b, 0, len);
// inStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
/*文件下载*/
// public static void downloadFile (HttpServletResponse response, String fileName, String path){
//下载本地文件
String fileName = file.getFileName().toString(); // 文件的默认保存名
// 读到流中
File dir = null;
dir = new File(downLoadpath);
// D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
if (!dir.exists()) {
dir.mkdirs();
}
if (fileName != null) {
//设置文件路径
File file1 = new File(path.substring(0, path.length() - "/upload/".length()) + file.getUrl());
if (file1.exists()) {
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
try {
response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file1);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
@Override
public HttpRespMsg getFileList(UserVO userVO, String path) {
HttpRespMsg msg = new HttpRespMsg();
User user = userMapper.selectOne(new QueryWrapper().eq("head_imgurl", userVO.getToken()));
List list = projectFileMapper.selectList(new QueryWrapper().eq("project_id", userVO.getProjectId()).orderByDesc("id"));
// for (ProjectFile projectFile : list) {
// projectFile.setUrl(path+projectFile.getUrl().substring("/upload/".length()));
// }
msg.data = list;
return msg;
}
@Override
public HttpRespMsg delFile(ProjectFile projectFile, String token, Integer isPass) {
HttpRespMsg msg = new HttpRespMsg();
User user = userMapper.selectOne(new QueryWrapper().eq("head_imgurl", token));//当前审批人
//查询项目
// Project project = projectMapper.selectById(projectFile.getProjectId());
if (user == null) {
msg.setError("当前用户不存在或者未登录");
return msg;
} else {
if(user != null){
projectFile = projectFileMapper.selectById(projectFile.getId());
ProjectOperationDynamics dynamics = new ProjectOperationDynamics();
dynamics.setProjectId(projectFile.getProjectId());
dynamics.setOperatorId(user.getId());
dynamics.setOperator(user.getUsername());
dynamics.setFileName(projectFile.getFileName());
if (isPass == 1) {
//同意
dynamics.setContent("已同意申请,自动删除该文件");
msg.data = projectFileMapper.deleteById(projectFile.getId());
} else {
//不同意
dynamics.setContent("拒绝了删除申请");
//更新文件状态
projectFile.setStatus(0);
projectFileMapper.updateById(projectFile);
}
projectOperationDynamicsMapper.insert(dynamics);
}else{
msg.setError("当前用户不存在或者未登录");
return msg;
}
}
return msg;
}
@Override
public HttpRespMsg delFileApplication(ProjectFile projectFile, String token, String reason) {
HttpRespMsg msg = new HttpRespMsg();
User user = userMapper.selectOne(new QueryWrapper().eq("head_imgurl", token));
Project project = projectMapper.selectById(projectFileMapper.selectById(projectFile.getId()).getProjectId());
if (user == null) {
msg.setError("当前用户不存在或者未登录");
return msg;
} else {
if((Constant.SYS_ID.equals(user.getParentId()) && user.getSubordinateType()==0)||project.getManagerId().equals(user.getId())){
//修改状态, 发送消息通知资方审批人
projectFile.setStatus(1);//删除待审批
projectFileMapper.updateById(projectFile);
projectFile = projectFileMapper.selectById(projectFile.getId());
ProjectOperationDynamics dynamic = new ProjectOperationDynamics();
ProjectApprove approve = projectApproveMapper.selectOne(new QueryWrapper().eq("project_id", project.getId()).eq("subordinate_type", 0));
dynamic.setContent("申请删除文件"+(StringUtils.isNotEmpty(reason)?("(原因:"+reason+")"):"")+",待"+approve.getApproverName()+"审批");
dynamic.setFileName(projectFile.getFileName());
dynamic.setOperator(user.getUsername());
dynamic.setOperatorId(user.getId());
dynamic.setProjectId(project.getId());
projectOperationDynamicsMapper.insert(dynamic);
NewsNotice notice = new NewsNotice();
notice.setContent("申请删除文件"+(StringUtils.isNotEmpty(reason)?("(原因:"+reason+")"):"")+",请审批");
notice.setNoticeType(0);//待审批
notice.setRefId(projectFile.getId());//附带项目文件id
notice.setProjectName(project.getProjectName());
notice.setProjectId(project.getId());
notice.setBelongType(6);//项目文档类型
newsNoticeMapper.insert(notice);
//发送给审批人
NewsNoticeUser newsNoticeUser = new NewsNoticeUser();
newsNoticeUser.setNewsId(notice.getId());
newsNoticeUser.setUserId(approve.getApproverId());
newsNoticeUser.setIsRead(0);
newsNoticeUserMapper.insert(newsNoticeUser);
msg.data = approve.getApproverName();//返回审批人姓名
}else{
msg.setError("当前用户不存在或者未登录");
return msg;
}
}
return msg;
}
}