ProjectFileServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. package com.hssx.cloudmodel.service.impl;
  2. import java.io.RandomAccessFile;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.hssx.cloudmodel.constant.Constant;
  5. import com.hssx.cloudmodel.entity.*;
  6. import com.hssx.cloudmodel.entity.vo.UserVO;
  7. import com.hssx.cloudmodel.mapper.*;
  8. import com.hssx.cloudmodel.service.ProjectFileService;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.hssx.cloudmodel.service.ProjectOperationDynamicsService;
  11. import com.hssx.cloudmodel.util.FileUtil;
  12. import com.hssx.cloudmodel.util.HttpRespMsg;
  13. import com.hssx.cloudmodel.util.OpenOfficeService;
  14. import com.hssx.cloudmodel.util.QcloudUntil;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.util.Base64Utils;
  19. import org.springframework.web.multipart.MultipartFile;
  20. import javax.annotation.Resource;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.io.*;
  23. import java.net.URLEncoder;
  24. import java.time.LocalDateTime;
  25. import java.util.List;
  26. import java.util.UUID;
  27. /**
  28. * <p>
  29. * 服务实现类
  30. * </p>
  31. *
  32. * @author 吴涛涛
  33. * @since 2019-07-30
  34. */
  35. @Service
  36. public class ProjectFileServiceImpl extends ServiceImpl<ProjectFileMapper, ProjectFile> implements ProjectFileService {
  37. @Resource
  38. UserMapper userMapper;
  39. @Resource
  40. ProjectFileMapper projectFileMapper;
  41. @Resource
  42. ProjectOperationDynamicsMapper projectOperationDynamicsMapper;
  43. @Resource
  44. ProjectMapper projectMapper;
  45. @Resource
  46. PdfFileMapper pdfFileMapper;
  47. @Resource
  48. ProjectApproveMapper projectApproveMapper;
  49. @Resource
  50. NewsNoticeMapper newsNoticeMapper;
  51. @Resource
  52. NewsNoticeUserMapper newsNoticeUserMapper;
  53. @Override
  54. public HttpRespMsg addFile(UserVO userVO, MultipartFile file, String path) {
  55. HttpRespMsg msg = new HttpRespMsg();
  56. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  57. if (user != null) {
  58. if (file != null) {
  59. ProjectFile projectFile = new ProjectFile();
  60. projectFile.setUploaderId(user.getId());
  61. projectFile.setUploader(user.getUsername());
  62. projectFile.setProjectId(userVO.getProjectId());
  63. File dir = null;
  64. dir = new File(path);
  65. // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  66. if (!dir.exists()) {
  67. dir.mkdirs();
  68. }
  69. String fileName = "";
  70. if (file != null) {
  71. fileName = file.getOriginalFilename();
  72. projectFile.setFileName(fileName);
  73. projectFile.setFileSize(FileUtil.getReadableFileSize(file.getSize()));
  74. System.out.println("上传文件名称" + file.getName() + ", dir = " + dir.getAbsolutePath());
  75. int pos = fileName.lastIndexOf(".");
  76. String rand = UUID.randomUUID().toString().replaceAll("-", "");
  77. String sufix = fileName.substring(pos);
  78. fileName = rand + sufix;
  79. projectFile.setFileType(sufix);//文件后缀
  80. projectFile.setUrl("/upload/" + fileName);
  81. File saveFile = new File(dir, fileName);
  82. projectFileMapper.insert(projectFile);
  83. try {
  84. saveFile.createNewFile();
  85. file.transferTo(saveFile);
  86. //将文件传到腾讯云
  87. final String qFileName = fileName;
  88. new Thread(){
  89. public void run() {
  90. QcloudUntil.upload(path + qFileName,qFileName);
  91. QcloudUntil.close();
  92. }
  93. }.start();
  94. if (OpenOfficeService.canTransferToPdf(projectFile.getFileType())) {
  95. //上传完,需要生成pdf
  96. OpenOfficeService openOfficeService = new OpenOfficeService();
  97. String dFile1 = path+UUID.randomUUID().toString().replaceAll("-", "")+".pdf";
  98. openOfficeService.start();
  99. File newFile = new File(dFile1);
  100. if(!newFile .exists()){
  101. openOfficeService.office2PDF(path + fileName,dFile1);
  102. PdfFile pdfFile = new PdfFile();
  103. pdfFile.setPdfUrl("/upload/"+dFile1.substring(path.length()));
  104. pdfFile.setFileId(projectFile.getId());
  105. pdfFile.setType(1);
  106. pdfFile.setRafId(projectFile.getProjectId());
  107. pdfFile.setSourceFileUrl(projectFile.getUrl());
  108. pdfFileMapper.insert(pdfFile);
  109. }
  110. openOfficeService.shutdown();
  111. }
  112. } catch (IOException e) {
  113. e.printStackTrace();
  114. projectFile = null;
  115. } catch (Exception e) {
  116. e.printStackTrace();
  117. projectFile = null;
  118. }
  119. //添加上传记录
  120. ProjectOperationDynamics dynamics = new ProjectOperationDynamics();
  121. dynamics.setContent(Constant.UPLOAD);
  122. dynamics.setFileName(file.getOriginalFilename());
  123. dynamics.setOperatorId(user.getId());
  124. dynamics.setOperator(user.getUsername());
  125. dynamics.setProjectId(userVO.getProjectId());
  126. projectOperationDynamicsMapper.insert(dynamics);
  127. }
  128. msg.data = projectFile;
  129. }
  130. } else {
  131. msg.setError("当前用户不存在或者未登录");
  132. }
  133. return msg;
  134. }
  135. @Override
  136. public HttpRespMsg dowloadFile(ProjectFile projectFile, String token, String downLoadpath, HttpServletResponse response, String path) throws FileNotFoundException, UnsupportedEncodingException {
  137. HttpRespMsg msg = new HttpRespMsg();
  138. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", token));
  139. //添加上传记录
  140. ProjectOperationDynamics dynamics = new ProjectOperationDynamics();
  141. dynamics.setContent(Constant.DOWNLOAD);
  142. ProjectFile file = projectFileMapper.selectById(projectFile.getId());
  143. dynamics.setFileName(file.getFileName());
  144. dynamics.setOperatorId(user.getId());
  145. dynamics.setOperator(user.getUsername());
  146. dynamics.setProjectId(file.getProjectId());
  147. projectOperationDynamicsMapper.insert(dynamics);
  148. downloadLocal(response, downLoadpath, file, path);
  149. return msg;
  150. }
  151. public void downloadLocal(HttpServletResponse response, String downLoadpath, ProjectFile file, String path) throws FileNotFoundException, UnsupportedEncodingException {
  152. // // 下载本地文件
  153. // String fileName = file.getFileName().toString(); // 文件的默认保存名
  154. // // 读到流中
  155. // File dir = null;
  156. // dir = new File(downLoadpath);
  157. // // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  158. // if (!dir.exists()) {
  159. // dir.mkdirs();
  160. // }
  161. // InputStream inStream = new FileInputStream(path.substring(0, path.length() - "/upload/".length())+file.getUrl());// 文件的存放路径
  162. // // 设置输出的格式
  163. // response.reset();
  164. // response.setContentType("bin");
  165. // response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
  166. // // 循环取出流中的数据
  167. // byte[] b = new byte[100];
  168. // int len;
  169. // try {
  170. // while ((len = inStream.read(b)) > 0)
  171. // response.getOutputStream().write(b, 0, len);
  172. // inStream.close();
  173. // } catch (IOException e) {
  174. // e.printStackTrace();
  175. // }
  176. /*文件下载*/
  177. // public static void downloadFile (HttpServletResponse response, String fileName, String path){
  178. //下载本地文件
  179. String fileName = file.getFileName().toString(); // 文件的默认保存名
  180. // 读到流中
  181. File dir = null;
  182. dir = new File(downLoadpath);
  183. // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  184. if (!dir.exists()) {
  185. dir.mkdirs();
  186. }
  187. if (fileName != null) {
  188. //设置文件路径
  189. File file1 = new File(path.substring(0, path.length() - "/upload/".length()) + file.getUrl());
  190. if (file1.exists()) {
  191. response.setHeader("content-type", "application/octet-stream");
  192. response.setContentType("application/octet-stream");
  193. try {
  194. response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1"));
  195. } catch (UnsupportedEncodingException e) {
  196. e.printStackTrace();
  197. }
  198. byte[] buffer = new byte[1024];
  199. FileInputStream fis = null;
  200. BufferedInputStream bis = null;
  201. try {
  202. fis = new FileInputStream(file1);
  203. bis = new BufferedInputStream(fis);
  204. OutputStream os = response.getOutputStream();
  205. int i = bis.read(buffer);
  206. while (i != -1) {
  207. os.write(buffer, 0, i);
  208. i = bis.read(buffer);
  209. }
  210. } catch (Exception e) {
  211. e.printStackTrace();
  212. } finally {
  213. if (bis != null) {
  214. try {
  215. bis.close();
  216. } catch (IOException e) {
  217. e.printStackTrace();
  218. }
  219. }
  220. if (fis != null) {
  221. try {
  222. fis.close();
  223. } catch (IOException e) {
  224. e.printStackTrace();
  225. }
  226. }
  227. }
  228. }
  229. }
  230. }
  231. @Override
  232. public HttpRespMsg getFileList(UserVO userVO, String path) {
  233. HttpRespMsg msg = new HttpRespMsg();
  234. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  235. List<ProjectFile> list = projectFileMapper.selectList(new QueryWrapper<ProjectFile>().eq("project_id", userVO.getProjectId()).orderByDesc("id"));
  236. // for (ProjectFile projectFile : list) {
  237. // projectFile.setUrl(path+projectFile.getUrl().substring("/upload/".length()));
  238. // }
  239. msg.data = list;
  240. return msg;
  241. }
  242. @Override
  243. public HttpRespMsg delFile(ProjectFile projectFile, String token, Integer isPass) {
  244. HttpRespMsg msg = new HttpRespMsg();
  245. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", token));//当前审批人
  246. //查询项目
  247. // Project project = projectMapper.selectById(projectFile.getProjectId());
  248. if (user == null) {
  249. msg.setError("当前用户不存在或者未登录");
  250. return msg;
  251. } else {
  252. if(user != null){
  253. projectFile = projectFileMapper.selectById(projectFile.getId());
  254. ProjectOperationDynamics dynamics = new ProjectOperationDynamics();
  255. dynamics.setProjectId(projectFile.getProjectId());
  256. dynamics.setOperatorId(user.getId());
  257. dynamics.setOperator(user.getUsername());
  258. dynamics.setFileName(projectFile.getFileName());
  259. if (isPass == 1) {
  260. //同意
  261. dynamics.setContent("已同意申请,自动删除该文件");
  262. msg.data = projectFileMapper.deleteById(projectFile.getId());
  263. } else {
  264. //不同意
  265. dynamics.setContent("拒绝了删除申请");
  266. //更新文件状态
  267. projectFile.setStatus(0);
  268. projectFileMapper.updateById(projectFile);
  269. }
  270. projectOperationDynamicsMapper.insert(dynamics);
  271. }else{
  272. msg.setError("当前用户不存在或者未登录");
  273. return msg;
  274. }
  275. }
  276. return msg;
  277. }
  278. @Override
  279. public HttpRespMsg delFileApplication(ProjectFile projectFile, String token, String reason) {
  280. HttpRespMsg msg = new HttpRespMsg();
  281. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", token));
  282. Project project = projectMapper.selectById(projectFileMapper.selectById(projectFile.getId()).getProjectId());
  283. if (user == null) {
  284. msg.setError("当前用户不存在或者未登录");
  285. return msg;
  286. } else {
  287. if((Constant.SYS_ID.equals(user.getParentId()) && user.getSubordinateType()==0)||project.getManagerId().equals(user.getId())){
  288. //修改状态, 发送消息通知资方审批人
  289. projectFile.setStatus(1);//删除待审批
  290. projectFileMapper.updateById(projectFile);
  291. projectFile = projectFileMapper.selectById(projectFile.getId());
  292. ProjectOperationDynamics dynamic = new ProjectOperationDynamics();
  293. ProjectApprove approve = projectApproveMapper.selectOne(new QueryWrapper<ProjectApprove>().eq("project_id", project.getId()).eq("subordinate_type", 0));
  294. dynamic.setContent("申请删除文件"+(StringUtils.isNotEmpty(reason)?("(原因:"+reason+")"):"")+",待"+approve.getApproverName()+"审批");
  295. dynamic.setFileName(projectFile.getFileName());
  296. dynamic.setOperator(user.getUsername());
  297. dynamic.setOperatorId(user.getId());
  298. dynamic.setProjectId(project.getId());
  299. projectOperationDynamicsMapper.insert(dynamic);
  300. NewsNotice notice = new NewsNotice();
  301. notice.setContent("申请删除文件"+(StringUtils.isNotEmpty(reason)?("(原因:"+reason+")"):"")+",请审批");
  302. notice.setNoticeType(0);//待审批
  303. notice.setRefId(projectFile.getId());//附带项目文件id
  304. notice.setProjectName(project.getProjectName());
  305. notice.setProjectId(project.getId());
  306. notice.setBelongType(6);//项目文档类型
  307. newsNoticeMapper.insert(notice);
  308. //发送给审批人
  309. NewsNoticeUser newsNoticeUser = new NewsNoticeUser();
  310. newsNoticeUser.setNewsId(notice.getId());
  311. newsNoticeUser.setUserId(approve.getApproverId());
  312. newsNoticeUser.setIsRead(0);
  313. newsNoticeUserMapper.insert(newsNoticeUser);
  314. msg.data = approve.getApproverName();//返回审批人姓名
  315. }else{
  316. msg.setError("当前用户不存在或者未登录");
  317. return msg;
  318. }
  319. }
  320. return msg;
  321. }
  322. }