MouldFileServiceImpl.java 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947
  1. package com.hssx.cloudmodel.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.github.pagehelper.PageHelper;
  4. import com.github.pagehelper.PageInfo;
  5. import com.hssx.cloudmodel.constant.Constant;
  6. import com.hssx.cloudmodel.entity.*;
  7. import com.hssx.cloudmodel.entity.vo.MouldFileVO;
  8. import com.hssx.cloudmodel.entity.vo.UserVO;
  9. import com.hssx.cloudmodel.mapper.*;
  10. import com.hssx.cloudmodel.service.MouldFileService;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import com.hssx.cloudmodel.util.*;
  13. import lombok.extern.slf4j.Slf4j;
  14. import net.lingala.zip4j.core.ZipFile;
  15. import net.lingala.zip4j.model.ZipParameters;
  16. import net.lingala.zip4j.util.Zip4jConstants;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.web.bind.annotation.RequestParam;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import javax.annotation.Resource;
  23. import javax.servlet.ServletOutputStream;
  24. import javax.servlet.http.HttpServletRequest;
  25. import javax.servlet.http.HttpServletResponse;
  26. import java.io.*;
  27. import java.net.URLEncoder;
  28. import java.text.DateFormat;
  29. import java.text.ParseException;
  30. import java.text.SimpleDateFormat;
  31. import java.time.LocalDateTime;
  32. import java.time.format.DateTimeFormatter;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. import java.util.zip.ZipEntry;
  36. import java.util.zip.ZipOutputStream;
  37. /**
  38. * <p>
  39. * 服务实现类
  40. * </p>
  41. *
  42. * @author 吴涛涛
  43. * @since 2019-08-07
  44. */
  45. @Service
  46. @Slf4j
  47. public class MouldFileServiceImpl extends ServiceImpl<MouldFileMapper, MouldFile> implements MouldFileService {
  48. @Resource
  49. UserMapper userMapper;
  50. @Resource
  51. MouldFileMapper mouldFileMapper;
  52. @Resource
  53. MouldOperationDynamicsMapper mouldOperationDynamicsMapper;
  54. @Resource
  55. ProjectMapper projectMapper;
  56. @Resource
  57. MouldMapper mouldMapper;
  58. @Resource
  59. ProjectUserMapper projectUserMapper;
  60. @Resource
  61. ProjectApproveMapper projectApproveMapper;
  62. @Resource
  63. PartMapper partMapper;
  64. @Resource
  65. NewsNoticeMapper newsNoticeMapper;
  66. @Resource
  67. NewsNoticeUserMapper newsNoticeUserMapper;
  68. @Autowired
  69. private OpenOfficeService openOfficeService;
  70. @Resource
  71. PdfFileMapper pdfFileMapper;
  72. @Override
  73. public HttpRespMsg addFile(UserVO userVO, Integer blongType, MultipartFile file, MultipartFile file2, String path) {
  74. HttpRespMsg msg = new HttpRespMsg();
  75. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  76. Mould mould = mouldMapper.selectById(userVO.getMouldId());
  77. if (user != null) {
  78. if (file != null && !file.isEmpty()) {
  79. MouldFile projectFile = new MouldFile();
  80. projectFile.setUplodtorId(user.getId());
  81. projectFile.setUploadtor(user.getUsername());
  82. projectFile.setModelId(userVO.getMouldId());
  83. File dir = null;
  84. dir = new File(path);
  85. // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  86. if (!dir.exists()) {
  87. dir.mkdirs();
  88. }
  89. String fileName = "";
  90. if (file != null && !file.isEmpty()) {
  91. fileName = file.getOriginalFilename();
  92. projectFile.setFileName(fileName);
  93. projectFile.setFileSize(FileUtil.getReadableFileSize(file.getSize()));
  94. System.out.println("上传文件名称" + file.getName() + ", dir = " + dir.getAbsolutePath());
  95. int pos = fileName.lastIndexOf(".");
  96. String rand = UUID.randomUUID().toString().replaceAll("-", "");
  97. String sufix = fileName.substring(pos);
  98. fileName = rand + sufix;
  99. projectFile.setFileType(sufix);//文件后缀
  100. projectFile.setFileUrl("/upload/" + fileName);
  101. projectFile.setBlongType(blongType);
  102. File saveFile = new File(dir, fileName);
  103. try {
  104. saveFile.createNewFile();
  105. file.transferTo(saveFile);
  106. } catch (IOException e) {
  107. e.printStackTrace();
  108. projectFile = null;
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. projectFile = null;
  112. }
  113. //模具报废情况下,设置files2
  114. String dFile2 = "";
  115. if (blongType == 5 && file2 != null && !file2.isEmpty()) {
  116. String fileName2 = file2.getOriginalFilename();
  117. projectFile.setFileName2(fileName2);
  118. projectFile.setFileSize2(FileUtil.getReadableFileSize(file2.getSize()));
  119. System.out.println("上传文件2名称" + file2.getName() + ", dir = " + dir.getAbsolutePath());
  120. pos = fileName2.lastIndexOf(".");
  121. rand = UUID.randomUUID().toString().replaceAll("-", "");
  122. sufix = fileName2.substring(pos);
  123. fileName2 = rand + sufix;
  124. projectFile.setFileType2(sufix);//文件后缀
  125. projectFile.setFileUrl2("/upload/" + fileName2);
  126. File saveFile2 = new File(dir, fileName2);
  127. try {
  128. saveFile2.createNewFile();
  129. file2.transferTo(saveFile2);
  130. } catch (IOException e) {
  131. e.printStackTrace();
  132. projectFile = null;
  133. } catch (Exception e) {
  134. e.printStackTrace();
  135. projectFile = null;
  136. }
  137. }
  138. //关闭openOffice
  139. openOfficeService.shutdown();
  140. //零件文档时存上零件id
  141. if (blongType == 1 && null != userVO.getPartId()) {
  142. projectFile.setPartId(userVO.getPartId());
  143. }
  144. //上传零件文档和上传模具文档的时候需要区分是否为2D或者3D
  145. if (userVO.getDwgType() != null) {
  146. projectFile.setDwgType(userVO.getDwgType());
  147. }
  148. mouldFileMapper.insert(projectFile);
  149. //上传完,需要生成pdf
  150. String dFile1 = path+UUID.randomUUID().toString().replaceAll("-", "")+".pdf";
  151. openOfficeService.start();
  152. File testFile = new File(dFile1);
  153. if(!testFile .exists()){
  154. openOfficeService.office2PDF(path + fileName,dFile1);
  155. }
  156. PdfFile pdfFile = new PdfFile();
  157. pdfFile.setPdfUrl("/upload/"+dFile1.substring(path.length()));
  158. pdfFile.setFileId(projectFile.getId());
  159. pdfFile.setType(0);
  160. pdfFile.setRafId(projectFile.getModelId());
  161. pdfFile.setSourceFileUrl(projectFile.getFileUrl());
  162. pdfFileMapper.insert(pdfFile);
  163. if(blongType == 5 && file2 != null && !file2.isEmpty()){
  164. dFile2 = path+UUID.randomUUID().toString().replaceAll("-", "")+".pdf";
  165. testFile = new File(dFile2);
  166. if(!testFile .exists()){
  167. openOfficeService.office2PDF(path + fileName,dFile2);
  168. }
  169. pdfFile = new PdfFile();
  170. pdfFile.setPdfUrl("/upload/"+dFile2.substring(path.length()));
  171. pdfFile.setFileId(projectFile.getId());
  172. pdfFile.setType(0);
  173. pdfFile.setRafId(projectFile.getModelId());
  174. pdfFile.setSourceFileUrl(projectFile.getFileUrl2());
  175. pdfFileMapper.insert(pdfFile);
  176. }
  177. Project project = projectMapper.selectById(mould.getProjectId());
  178. Integer count = projectApproveMapper.selectCount(new QueryWrapper<ProjectApprove>().eq("approver_id", user.getId()).eq("project_id", project.getId()));
  179. // if(count>0){
  180. // if (user.getSubordinateType() == 0) {
  181. // //上传人为资产方审批人,自动审核通过
  182. // projectFile.setState(1);
  183. // MouldOperationDynamics dynamics = new MouldOperationDynamics();
  184. // dynamics.setMouldId(userVO.getMouldId());
  185. // dynamics.setBelongType(blongType);
  186. // dynamics.setFileId(projectFile.getId());
  187. // if (null != projectFile.getFileName2()) {
  188. // dynamics.setFileName(projectFile.getFileName() + "," + projectFile.getFileName2());
  189. // } else {
  190. // dynamics.setFileName(projectFile.getFileName());
  191. // }
  192. // dynamics.setOperatorId(user.getId());
  193. // dynamics.setOperatorName(user.getUsername());
  194. // dynamics.setContent(Constant.APPROVAL);
  195. // mouldOperationDynamicsMapper.insert(dynamics);
  196. // } else if (user.getSubordinateType() == 1) {
  197. // //上传人为生产方,自动审核通过
  198. // projectFile.setState(2);
  199. // //上传人为资产方审批人,自动审核通过
  200. // MouldOperationDynamics dynamics = new MouldOperationDynamics();
  201. // dynamics.setMouldId(userVO.getMouldId());
  202. // dynamics.setBelongType(blongType);
  203. // dynamics.setFileId(projectFile.getId());
  204. // if (null != projectFile.getFileName2()) {
  205. // dynamics.setFileName(projectFile.getFileName() + "," + projectFile.getFileName2());
  206. // } else {
  207. // dynamics.setFileName(projectFile.getFileName());
  208. // }
  209. // dynamics.setOperatorId(user.getId());
  210. // dynamics.setOperatorName(user.getUsername());
  211. // dynamics.setContent(Constant.APPROVAL);
  212. // mouldOperationDynamicsMapper.insert(dynamics);
  213. // } else {
  214. // projectFile.setState(0);
  215. // }
  216. // }else{
  217. projectFile.setState(0);
  218. // }
  219. //添加上传记录
  220. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  221. dynamics.setContent(Constant.UPLOAD);
  222. dynamics.setFileName(file.getOriginalFilename());
  223. dynamics.setOperatorId(user.getId());
  224. dynamics.setFileId(projectFile.getId());
  225. dynamics.setOperatorName(user.getUsername());
  226. dynamics.setMouldId(userVO.getMouldId());
  227. dynamics.setBelongType(blongType);
  228. mouldOperationDynamicsMapper.insert(dynamics);
  229. //添加消息通知记录
  230. if (mould.getProjectId() != null) {
  231. List<ProjectApprove> projectApproves = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("project_id", project.getId()));
  232. String content = "";
  233. NewsNotice newsNotice = new NewsNotice();
  234. newsNotice.setRefId(projectFile.getModelId());
  235. newsNotice.setProjectId(project.getId());
  236. newsNotice.setBelongType(projectFile.getBlongType());
  237. newsNotice.setProjectName(project.getProjectName() + "-" + mould.getModelName());
  238. newsNotice.setNoticeType(Constant.APPROVEL_TYPE);
  239. if (blongType == 0) {
  240. content = "模具文档";
  241. } else if (blongType == 1) {
  242. content = "零件文档";
  243. } else if (blongType == 2) {
  244. content = "试模验收文档";
  245. } else if (blongType == 3) {
  246. content = "保养方案文档";
  247. } else if (blongType == 5) {
  248. content = "模具报废文档";
  249. }
  250. newsNotice.setContent("有新的" + content +"上传,待您审批。");
  251. newsNoticeMapper.insert(newsNotice);
  252. for (ProjectApprove projectApprove : projectApproves) {
  253. NewsNoticeUser newsNoticeUser = new NewsNoticeUser();
  254. newsNoticeUser.setUserId(projectApprove.getApproverId());
  255. newsNoticeUser.setNewsId(newsNotice.getId());
  256. newsNoticeUserMapper.insert(newsNoticeUser);
  257. }
  258. }
  259. }
  260. msg.data = projectFile;
  261. } else {
  262. //模具更新操作
  263. MouldFile projectFile = new MouldFile();
  264. projectFile.setUplodtorId(user.getId());
  265. projectFile.setUploadtor(user.getUsername());
  266. projectFile.setModelId(userVO.getMouldId());
  267. projectFile.setBlongType(blongType);
  268. mouldFileMapper.insert(projectFile);
  269. //添加上传记录
  270. // MouldOperationDynamics dynamics = new MouldOperationDynamics();
  271. // dynamics.setContent(Constant.UPDATE);
  272. // dynamics.setOperatorId(user.getId());
  273. // dynamics.setOperatorName(user.getUsername());
  274. // dynamics.setMouldId(userVO.getMouldId());
  275. // dynamics.setBelongType(blongType);
  276. // mouldOperationDynamicsMapper.insert(dynamics);
  277. Project project = projectMapper.selectOne(new QueryWrapper<Project>().eq("id", mould.getProjectId()));
  278. List<ProjectApprove> projectApproves = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("project_id", project.getId()));
  279. String content = "模具更新";
  280. NewsNotice newsNotice = new NewsNotice();
  281. newsNotice.setRefId(projectFile.getModelId());
  282. newsNotice.setProjectId(project.getId());
  283. newsNotice.setBelongType(projectFile.getBlongType());
  284. newsNotice.setProjectName(project.getProjectName() + "-" + mould.getModelName());
  285. newsNotice.setNoticeType(Constant.APPROVEL_TYPE);
  286. newsNotice.setContent("有新的" + content + "申请记录,待您审批。");
  287. newsNoticeMapper.insert(newsNotice);
  288. for (ProjectApprove projectApprove : projectApproves) {
  289. NewsNoticeUser newsNoticeUser = new NewsNoticeUser();
  290. newsNoticeUser.setUserId(projectApprove.getApproverId());
  291. newsNoticeUser.setNewsId(newsNotice.getId());
  292. newsNoticeUserMapper.insert(newsNoticeUser);
  293. }
  294. }
  295. } else {
  296. msg.setError("用户不存在或者未登录");
  297. }
  298. return msg;
  299. }
  300. @Override
  301. public HttpRespMsg check(Integer mouldFileId, Integer isPass, UserVO userVO) {
  302. HttpRespMsg msg = new HttpRespMsg();
  303. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  304. MouldFile mf = new MouldFile();
  305. mf.setId(mouldFileId);
  306. MouldFile oldData = mouldFileMapper.selectById(mouldFileId);
  307. Mould md = mouldMapper.selectById(oldData.getModelId());
  308. String approverNames = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("project_id", md.getProjectId()))
  309. .stream().map(ProjectApprove::getApproverName).collect(Collectors.joining(","));
  310. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  311. if (user != null) {
  312. if (user.getSubordinateType() == 0) {
  313. //资产方
  314. if (isPass == 1) {
  315. if (oldData.getState() == 2) {//生产方也审核通过了
  316. mf.setState(3);
  317. //审批通过
  318. dynamics.setIsPass(1);
  319. //模具更新的审批
  320. if (oldData.getBlongType() == 5) {
  321. //将模具修改为已报废
  322. Mould mould = new Mould();
  323. mould.setId(oldData.getModelId());
  324. mould.setState(4 + "");//4已报废状态
  325. mouldMapper.updateById(mould);
  326. }
  327. } else {
  328. mf.setState(1);
  329. dynamics.setIsPass(1);
  330. }
  331. } else {
  332. mf.setState(-1);
  333. dynamics.setIsPass(0);
  334. }
  335. mouldFileMapper.updateById(mf);
  336. if (oldData.getBlongType() == 4) {
  337. if (mf.getState() == 3) {
  338. Integer count = mouldOperationDynamicsMapper.selectCount(new QueryWrapper<MouldOperationDynamics>().eq("belong_type", 4).eq("is_pass", 1).eq("mould_id", oldData.getModelId()));
  339. if (count == 0) {
  340. dynamics.setMouldId(oldData.getModelId());
  341. dynamics.setApplicantName(oldData.getUploadtor());
  342. dynamics.setApplicantId(oldData.getUplodtorId());
  343. dynamics.setBelongType(oldData.getBlongType());
  344. dynamics.setContent(Constant.APPROVAL);
  345. dynamics.setOperatorName(approverNames);
  346. dynamics.setIsPass(1);
  347. mouldOperationDynamicsMapper.insert(dynamics);
  348. }
  349. } else if (mf.getState() < 0) {
  350. Integer count = mouldOperationDynamicsMapper.selectCount(new QueryWrapper<MouldOperationDynamics>().eq("belong_type", 4).eq("is_pass", 0).eq("mould_id", oldData.getModelId()));
  351. if (count == 0) {
  352. dynamics.setMouldId(oldData.getModelId());
  353. dynamics.setApplicantName(oldData.getUploadtor());
  354. dynamics.setApplicantId(oldData.getUplodtorId());
  355. dynamics.setBelongType(oldData.getBlongType());
  356. dynamics.setContent(Constant.APPROVAL);
  357. dynamics.setOperatorName(approverNames);
  358. mouldOperationDynamicsMapper.insert(dynamics);
  359. }
  360. }
  361. } else {
  362. //添加审批记录
  363. dynamics.setMouldId(oldData.getModelId());
  364. dynamics.setBelongType(oldData.getBlongType());
  365. dynamics.setFileId(oldData.getId());
  366. if (null != oldData.getFileName2()) {
  367. dynamics.setFileName(oldData.getFileName() + "," + oldData.getFileName2());
  368. } else {
  369. dynamics.setFileName(oldData.getFileName());
  370. }
  371. dynamics.setOperatorId(user.getId());
  372. dynamics.setOperatorName(user.getUsername());
  373. dynamics.setContent(Constant.APPROVAL);
  374. mouldOperationDynamicsMapper.insert(dynamics);
  375. }
  376. } else if (user.getSubordinateType() == 1) {
  377. //生产方
  378. if (isPass == 1) {
  379. if (oldData.getState() == 1) {//资产方也审核通过了
  380. mf.setState(3);
  381. dynamics.setIsPass(1);
  382. //将模具修改为已报废
  383. if (oldData.getBlongType() == 5) {
  384. Mould mould = new Mould();
  385. mould.setId(oldData.getModelId());
  386. mould.setState(4 + "");//4已报废状态
  387. mouldMapper.updateById(mould);
  388. }
  389. } else {
  390. mf.setState(2);
  391. dynamics.setIsPass(1);
  392. }
  393. } else {
  394. mf.setState(-2);
  395. dynamics.setIsPass(0);
  396. }
  397. mouldFileMapper.updateById(mf);
  398. if (oldData.getBlongType() == 4) {
  399. if (mf.getState() == 3) {
  400. Integer count = mouldOperationDynamicsMapper.selectCount(new QueryWrapper<MouldOperationDynamics>().eq("belong_type", 4).eq("is_pass", 1).eq("mould_id", oldData.getModelId()));
  401. if (count == 0) {
  402. dynamics.setMouldId(oldData.getModelId());
  403. dynamics.setApplicantName(oldData.getUploadtor());
  404. dynamics.setApplicantId(oldData.getUplodtorId());
  405. dynamics.setBelongType(oldData.getBlongType());
  406. dynamics.setContent(Constant.APPROVAL);
  407. dynamics.setOperatorName(approverNames);
  408. dynamics.setIsPass(1);
  409. mouldOperationDynamicsMapper.insert(dynamics);
  410. }
  411. } else if (mf.getState() < 0) {
  412. Integer count = mouldOperationDynamicsMapper.selectCount(new QueryWrapper<MouldOperationDynamics>().eq("belong_type", 4).eq("is_pass", 0).eq("mould_id", oldData.getModelId()));
  413. if (count == 0) {
  414. dynamics.setMouldId(oldData.getModelId());
  415. dynamics.setApplicantName(oldData.getUploadtor());
  416. dynamics.setApplicantId(oldData.getUplodtorId());
  417. dynamics.setBelongType(oldData.getBlongType());
  418. dynamics.setContent(Constant.APPROVAL);
  419. dynamics.setOperatorName(approverNames);
  420. mouldOperationDynamicsMapper.insert(dynamics);
  421. }
  422. }
  423. } else {
  424. //添加审批记录
  425. dynamics.setMouldId(oldData.getModelId());
  426. dynamics.setBelongType(oldData.getBlongType());
  427. dynamics.setFileId(oldData.getId());
  428. if (null != oldData.getFileName2()) {
  429. dynamics.setFileName(oldData.getFileName() + "," + oldData.getFileName2());
  430. } else {
  431. dynamics.setFileName(oldData.getFileName());
  432. }
  433. dynamics.setOperatorId(user.getId());
  434. dynamics.setOperatorName(user.getUsername());
  435. dynamics.setContent(Constant.APPROVAL);
  436. mouldOperationDynamicsMapper.insert(dynamics);
  437. }
  438. } else {
  439. msg.setError("只有生产方和资产方审批人才能审核");
  440. }
  441. }
  442. return msg;
  443. }
  444. @Override
  445. public HttpRespMsg dowloadFile(MouldFile projectFile, String token) {
  446. HttpRespMsg msg = new HttpRespMsg();
  447. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", token));
  448. //添加上传记录
  449. MouldFile file = mouldFileMapper.selectById(projectFile.getId());
  450. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  451. dynamics.setContent(Constant.DOWNLOAD);
  452. dynamics.setApplicantId(file.getUplodtorId());
  453. dynamics.setApplicantName(file.getUploadtor());
  454. dynamics.setFileName(file.getFileName());
  455. dynamics.setOperatorId(user.getId());
  456. dynamics.setOperatorName(user.getUsername());
  457. dynamics.setMouldId(file.getModelId());
  458. dynamics.setFileId(file.getId());
  459. dynamics.setBelongType(file.getBlongType());
  460. mouldOperationDynamicsMapper.insert(dynamics);
  461. return msg;
  462. }
  463. @Override
  464. public HttpRespMsg getAllFileList(int mouldId, UserVO userVO) {
  465. List<HashMap> dataList = new ArrayList<HashMap>();
  466. int maxBlongType = 5;
  467. for (int i = 0; i <= maxBlongType; i++) {
  468. HashMap<String, Object> data = new HashMap<>();
  469. data.put("blongType", i);
  470. List<MouldFile> list = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", mouldId).eq("blong_type", i).orderByDesc("id"));
  471. data.put("list", list);
  472. dataList.add(data);
  473. }
  474. HttpRespMsg msg = new HttpRespMsg();
  475. msg.data = dataList;
  476. return msg;
  477. }
  478. @Override
  479. public HttpRespMsg getFileList(int mouldId, Integer blongType, UserVO userVO, String path) {
  480. HttpRespMsg msg = new HttpRespMsg();
  481. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  482. List<MouldFile> list = new ArrayList<>();
  483. List<Integer> ids = new ArrayList<>();
  484. // if(blongType == 4){
  485. // List<Integer> recursion = recursion(mouldId, ids);
  486. // list = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().in("model_id", recursion).orderByDesc("id"));
  487. // }else{
  488. list = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", mouldId).eq("blong_type", blongType).orderByDesc("id"));
  489. // }
  490. // for (MouldFile mouldFile : list) {
  491. // mouldFile.setFileUrl(path+mouldFile.getFileUrl().substring("/upload/".length()));
  492. // }
  493. msg.data = list;
  494. return msg;
  495. }
  496. @Override
  497. public HttpRespMsg delFile(MouldFile mouldFile,String token) {
  498. HttpRespMsg msg = new HttpRespMsg();
  499. User currentUser = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", token));
  500. if(currentUser == null){
  501. msg.setError("用户不存在或者未登录");
  502. }else{
  503. if(Constant.SYS_ID .equals(currentUser.getParentId())){
  504. //判断是不是资产方管理员
  505. msg.data = mouldFileMapper.deleteById(mouldFile.getId());
  506. }else{
  507. msg.setError("您没有该权限!");
  508. }
  509. }
  510. return msg;
  511. }
  512. @Override
  513. public HttpRespMsg getListByUserAndProjectId(UserVO userVO, PageUtil page) {
  514. HttpRespMsg msg = new HttpRespMsg();
  515. List<Integer> proIds = new ArrayList<>();
  516. proIds.add(-1);
  517. List<MouldFileVO> list = new ArrayList<>();
  518. User currentUser = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  519. PageHelper.startPage(page.getPageNum(), page.getPageSize());
  520. if (currentUser != null) {
  521. if (Constant.SYS_ID .equals(currentUser.getParentId())) {
  522. //此时是admin,查询他所创建的项目
  523. QueryWrapper<Project> qw = new QueryWrapper<>();
  524. List<Project> projects = projectMapper.selectList(qw.eq("creator_id", currentUser.getId()));
  525. for (Project pro : projects) {
  526. proIds.add(pro.getId());
  527. }
  528. list = mouldFileMapper.getFileListByProjectId(userVO, proIds);
  529. } else if (Constant.SYS_PARENT_ID .equals(currentUser.getParentId())) {
  530. //系统管理员
  531. List<Project> projects = projectMapper.selectList(new QueryWrapper<Project>());
  532. for (Project pro : projects) {
  533. proIds.add(pro.getId());
  534. }
  535. list = mouldFileMapper.getFileListByProjectId(userVO, proIds);
  536. } else {
  537. QueryWrapper<Project> qw = new QueryWrapper<>();
  538. qw.eq("manager_id", userVO.getId());
  539. List<Project> projects = projectMapper.selectList(qw);
  540. if (projects.size() > 0) {
  541. for (Project project : projects) {
  542. proIds.add(project.getId());
  543. }
  544. }
  545. // //充当普通人员参与的项目
  546. List<ProjectUser> projectUsers = projectUserMapper.selectList(new QueryWrapper<ProjectUser>().eq("user_id", currentUser.getId()));
  547. if (projectUsers.size() > 0) {
  548. for (ProjectUser projectUser : projectUsers) {
  549. proIds.add(projectUser.getProjectId());
  550. }
  551. }
  552. //充当审批人员参与的项目
  553. List<ProjectApprove> projectss = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("approver_id", currentUser.getId()));
  554. if (projectss.size() > 0) {
  555. for (ProjectApprove projectUser : projectss) {
  556. proIds.add(projectUser.getProjectId());
  557. }
  558. }
  559. list = mouldFileMapper.getFileListByProjectId(userVO, proIds);
  560. }
  561. PageInfo<MouldFileVO> pageInfos = new PageInfo<>(list);
  562. msg.data = pageInfos;
  563. } else {
  564. msg.setError("用户不存在或者未登录");
  565. }
  566. return msg;
  567. }
  568. @Override
  569. public HttpRespMsg dowloadFileList(UserVO userVO, HttpServletRequest request, HttpServletResponse response, String downloadPath, String path) throws IOException {
  570. HttpRespMsg msg = new HttpRespMsg();
  571. User currentUser = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  572. List<String> sourceFileUrls = new ArrayList<>();
  573. if (null != userVO.getIds()) {
  574. List<Integer> ids = ListUtil.convertIntegerIdsArrayToList(userVO.getIds());
  575. List<MouldFile> mouldFiles = new ArrayList<>();
  576. List<String> newFolders = new ArrayList<>();
  577. for (Integer id : ids) {
  578. Mould mould = mouldMapper.selectById(id);
  579. if (0 == userVO.getDwgType()) {
  580. mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3).ne("blong_type", 4));
  581. } else if (1 == userVO.getDwgType()) {
  582. //模具3D
  583. mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3).isNull("part_id").eq("dwg_type", 1).eq("blong_type", 0));
  584. } else if (2 == userVO.getDwgType()) {
  585. //模具2D
  586. mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3).isNull("part_id").eq("dwg_type", 0).eq("blong_type", 0));
  587. } else if (3 == userVO.getDwgType()) {
  588. //零件3D
  589. mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3).isNotNull("part_id").eq("dwg_type", 1).eq("blong_type", 1));
  590. } else if (4 == userVO.getDwgType()) {
  591. //零件2D
  592. mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3).isNotNull("part_id").eq("dwg_type", 0).eq("blong_type", 1));
  593. } else {
  594. mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3).eq("blong_type", 3));
  595. }
  596. if(mouldFiles.size()==0){
  597. continue;
  598. }
  599. // feedBackDirectMultiDownload(request, response, downloadPath, mould, mouldFiles, path);
  600. String folderPath = path + mould.getModelNo() + mould.getModelName();
  601. for (MouldFile mouldFile : mouldFiles) {
  602. sourceFileUrls.add(path.substring(0, path.length() - "/upload/".length()) + mouldFile.getFileUrl());
  603. //添加下载动态
  604. MouldOperationDynamics mod = new MouldOperationDynamics();
  605. mod.setApplicantId(mouldFile.getUplodtorId());
  606. mod.setApplicantName(mouldFile.getUploadtor());
  607. mod.setFileName(mouldFile.getFileName());
  608. mod.setOperatorId(currentUser.getId());
  609. mod.setOperatorName(currentUser.getUsername());
  610. mod.setContent(Constant.DOWNLOAD);
  611. mod.setFileId(mouldFile.getId());
  612. mod.setMouldId(mould.getId());
  613. mod.setBelongType(mouldFile.getBlongType());
  614. mouldOperationDynamicsMapper.insert(mod);
  615. }
  616. if (sourceFileUrls.size() > 0) {
  617. String folder = FileCopyToFolderUtil.copy(sourceFileUrls, folderPath);
  618. newFolders.add(folder);
  619. }
  620. }
  621. try {
  622. // 生成的压缩文件
  623. if(newFolders.size() > 0){
  624. ZipFile zipFile = null;
  625. SimpleDateFormat dateSdf2 = new SimpleDateFormat("yyyy年MM月dd+HH时mm分ss秒");
  626. String fileName = dateSdf2.format(new Date()) + ".zip";
  627. zipFile = new ZipFile(path + fileName);
  628. ZipParameters parameters = new ZipParameters();
  629. // 压缩方式
  630. parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
  631. // 压缩级别
  632. parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
  633. // 要打包的文件夹
  634. if(newFolders.size()>0){
  635. for (String newFolder : newFolders) {
  636. zipFile.addFolder(newFolder, parameters);
  637. }
  638. }
  639. msg.data = "/upload/"+fileName;
  640. }else{
  641. msg.setError("暂无文件");
  642. return msg;
  643. }
  644. // File[] fs = currentFile.listFiles();
  645. // // 遍历test文件夹下所有的文件、文件夹
  646. // for (File f : fs) {
  647. // if (f.isDirectory()) {
  648. // zipFile.addFolder(f.getPath(), parameters);
  649. // } else {
  650. // zipFile.addFile(f, parameters);
  651. // }
  652. // }
  653. } catch (Exception e) {
  654. e.printStackTrace();
  655. }
  656. // String filePath = this.download(downloadPath, mould, mouldFiles, path, currentUser);
  657. }
  658. return msg;
  659. }
  660. @Override
  661. public HttpRespMsg addPartFile(UserVO userVO, String path, MultipartFile[] files) {
  662. HttpRespMsg msg = new HttpRespMsg();
  663. Mould mould = mouldMapper.selectById(userVO.getMouldId());
  664. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  665. if (user != null) {
  666. List<Part> partLists = partMapper.selectList(new QueryWrapper<Part>().eq("mould_id", userVO.getMouldId()));
  667. openOfficeService.start();
  668. for (MultipartFile file : files) {
  669. MouldFile partFile = new MouldFile();
  670. partFile.setModelId(userVO.getMouldId());
  671. partFile.setBlongType(1);
  672. File dir = null;
  673. dir = new File(path);
  674. // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  675. if (!dir.exists()) {
  676. dir.mkdirs();
  677. }
  678. String fileName = "";
  679. // if (!file.isEmpty()) {
  680. fileName = file.getOriginalFilename();
  681. String fileNamePrex = fileName.substring(0, fileName.lastIndexOf("."));
  682. String[] split = fileNamePrex.split("\\+");
  683. System.out.println("split" + split);
  684. for (Part part : partLists) {
  685. if (part.getPartNo().equals(split[0])) {
  686. partFile.setPartId(part.getId());
  687. if (Constant.PART_FILE_2D.equals(split[1])) {
  688. MouldFile mouldFile = mouldFileMapper.selectOne(new QueryWrapper<MouldFile>().eq("part_id", part.getId()).eq("dwg_type", 0));
  689. if (mouldFile != null) {
  690. //把之前的文件删除
  691. mouldFileMapper.deleteById(mouldFile);
  692. }
  693. partFile.setDwgType(0);
  694. } else if (Constant.PART_FILE_3D.equals(split[1])) {
  695. MouldFile mouldFile = mouldFileMapper.selectOne(new QueryWrapper<MouldFile>().eq("part_id", part.getId()).eq("dwg_type", 1));
  696. if (mouldFile != null) {
  697. //把之前的文件删除
  698. mouldFileMapper.deleteById(mouldFile);
  699. }
  700. partFile.setDwgType(1);
  701. }
  702. }
  703. }
  704. partFile.setFileName(fileName);
  705. partFile.setFileSize(FileUtil.getReadableFileSize(file.getSize()));
  706. System.out.println("上传文件名称" + file.getName() + ", dir = " + dir.getAbsolutePath());
  707. int pos = fileName.lastIndexOf(".");
  708. String rand = UUID.randomUUID().toString().replaceAll("-", "");
  709. String sufix = fileName.substring(pos);
  710. fileName = rand + sufix;
  711. partFile.setFileType(sufix);//文件后缀
  712. partFile.setFileUrl("/upload/" + fileName);
  713. partFile.setUplodtorId(user.getId());
  714. partFile.setUploadtor(user.getUsername());
  715. File saveFile = new File(dir, fileName);
  716. mouldFileMapper.insert(partFile);
  717. try {
  718. saveFile.createNewFile();
  719. file.transferTo(saveFile);
  720. //上传完,需要生成pdf
  721. String dFile1 = path+UUID.randomUUID().toString().replaceAll("-", "")+".pdf";
  722. File newFile = new File(dFile1);
  723. if(!newFile .exists()){
  724. openOfficeService.office2PDF(path + fileName,dFile1);
  725. PdfFile pdfFile = new PdfFile();
  726. pdfFile.setPdfUrl("/upload/"+dFile1.substring(path.length()));
  727. pdfFile.setFileId(partFile.getId());
  728. pdfFile.setType(1);
  729. pdfFile.setRafId(partFile.getModelId());
  730. pdfFile.setSourceFileUrl(partFile.getFileUrl());
  731. pdfFileMapper.insert(pdfFile);
  732. }
  733. } catch (IOException e) {
  734. e.printStackTrace();
  735. partFile = null;
  736. } catch (Exception e) {
  737. e.printStackTrace();
  738. partFile = null;
  739. }
  740. //添加上传记录
  741. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  742. dynamics.setContent(Constant.UPLOAD);
  743. dynamics.setFileName(file.getOriginalFilename());
  744. dynamics.setOperatorId(user.getId());
  745. dynamics.setOperatorName(user.getUsername());
  746. dynamics.setMouldId(userVO.getMouldId());
  747. dynamics.setFileId(partFile.getId());
  748. mouldOperationDynamicsMapper.insert(dynamics);
  749. Project project = projectMapper.selectOne(new QueryWrapper<Project>().eq("id", mould.getProjectId()));
  750. List<ProjectApprove> projectApproves = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("project_id", project.getId()));
  751. String content = "零件文档";
  752. NewsNotice newsNotice = new NewsNotice();
  753. newsNotice.setRefId(mould.getId());
  754. newsNotice.setProjectId(project.getId());
  755. newsNotice.setBelongType(1);
  756. newsNotice.setProjectName(project.getProjectName() + "-" + mould.getModelName());
  757. newsNotice.setNoticeType(Constant.APPROVEL_TYPE);
  758. newsNotice.setContent("有新的" + content + "上传,待您审批。");
  759. newsNoticeMapper.insert(newsNotice);
  760. for (ProjectApprove projectApprove : projectApproves) {
  761. NewsNoticeUser newsNoticeUser = new NewsNoticeUser();
  762. newsNoticeUser.setUserId(projectApprove.getApproverId());
  763. newsNoticeUser.setNewsId(newsNotice.getId());
  764. newsNoticeUserMapper.insert(newsNoticeUser);
  765. }
  766. // }
  767. msg.data = partFile;
  768. }
  769. openOfficeService.shutdown();
  770. } else {
  771. msg.setError("用户不存在或者未登录");
  772. }
  773. return msg;
  774. }
  775. @Override
  776. public HttpRespMsg downloadFileListExcel(UserVO userVO, HttpServletResponse response, String downloadPath) throws ParseException {
  777. HttpRespMsg msg = new HttpRespMsg();
  778. List<List<String>> list = new ArrayList<List<String>>();
  779. //标题
  780. List<String> titleList = new ArrayList<String>();
  781. titleList.add("文件名");
  782. titleList.add("下载者姓名");
  783. titleList.add("文件类型");
  784. titleList.add("下载时间");
  785. list.add(titleList);
  786. QueryWrapper<MouldOperationDynamics> qw = new QueryWrapper<MouldOperationDynamics>();
  787. qw.eq("content", Constant.DOWNLOAD);
  788. // String start = userVO.getStartTime().replace("Z", " UTC");//是空格+UTC
  789. // String end = userVO.getEndTime().replace("Z", " UTC");//是空格+UTC
  790. // DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  791. // Date date1 = df.parse(start);
  792. // System.out.println(date1);
  793. // Date date2 = df.parse(end);
  794. // System.out.println(date2);
  795. // SimpleDateFormat df1 = new SimpleDateFormat ("EEE MMM dd HH:mm:ss Z yyyy", Locale.CHINA);
  796. // Calendar calendar = new GregorianCalendar();
  797. // calendar.setTime(date1);
  798. // calendar.add(calendar.DATE, -1);//把日期往后增加一天.整数往后推,负数往前移动 date=calendar.getTime();
  799. // Date startDate1 = calendar.getTime();
  800. // calendar.setTime(date2);
  801. // calendar.add(calendar.DATE, -1);
  802. // Date startDate = df1.parse(date1.toString());
  803. // Date endDate2 = calendar.getTime();
  804. // Date endDate = df1.parse(date2.toString());
  805. SimpleDateFormat dateSdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  806. SimpleDateFormat dateSdf = new SimpleDateFormat("yyyy-MM-dd");
  807. SimpleDateFormat dateSdf2 = new SimpleDateFormat("yyyy年MM月dd+HH时mm分ss秒");
  808. // String startDate = dateSdf.format(startDate1);
  809. // String endDate = dateSdf.format(endDate2);
  810. List<MouldOperationDynamics> mouldOperationDynamics = new ArrayList<>();
  811. if (userVO.getStartTime() != null && userVO.getEndTime() != null) {
  812. mouldOperationDynamics = mouldOperationDynamicsMapper.selectOperationDynamicsList(userVO);
  813. }
  814. for (MouldOperationDynamics dynamic : mouldOperationDynamics) {
  815. List<String> rowList = new ArrayList<String>();
  816. //文件名
  817. rowList.add(dynamic.getFileName());
  818. //操作者名字
  819. rowList.add(dynamic.getOperatorName());
  820. //文件类型
  821. if (dynamic.getBelongType() == 0) {
  822. rowList.add("模具文档");
  823. } else if (dynamic.getBelongType() == 1) {
  824. rowList.add("零件文档");
  825. } else if (dynamic.getBelongType() == 2) {
  826. rowList.add("试模验收");
  827. } else if (dynamic.getBelongType() == 3) {
  828. rowList.add("保养方案");
  829. } else if (dynamic.getBelongType() == 4) {
  830. rowList.add("模具更新");
  831. } else if (dynamic.getBelongType() == 5) {
  832. rowList.add("模具报废");
  833. }
  834. //下载时间
  835. rowList.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(dynamic.getIndate())
  836. );
  837. list.add(rowList);
  838. }
  839. Mould mould = mouldMapper.selectById(userVO.getMouldId());
  840. String fileUrl = ExcelUtil.exportGeneralExcelByTitleAndList(response, mould.getModelNo() + mould.getModelName() + dateSdf2.format(new Date()), list, downloadPath);
  841. msg.data = fileUrl;
  842. return msg;
  843. }
  844. @Override
  845. public HttpRespMsg mouldUpdateCheck(UserVO userVO) {
  846. HttpRespMsg msg = new HttpRespMsg();
  847. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  848. boolean isCanCreate = false;
  849. if (user == null) {
  850. msg.setError("用户不存在或者未登录");
  851. return msg;
  852. } else {
  853. MouldOperationDynamics dynamics = mouldOperationDynamicsMapper.selectOne(new QueryWrapper<MouldOperationDynamics>().eq("belongType", 4).eq("mould_id", userVO.getMouldId()).orderByDesc("id"));
  854. if (null != dynamics) {
  855. if (0 == dynamics.getIsPass()) {
  856. isCanCreate = true;
  857. }
  858. } else {
  859. isCanCreate = true;
  860. }
  861. }
  862. msg.data = isCanCreate;
  863. return msg;
  864. }
  865. //生成.zip文件
  866. public String download(String downloadPath, Mould vo, List<MouldFile> mouldFiles, String oldFilePath, User user) {
  867. //需要压缩的文件--包括文件地址和文件名
  868. // 要生成的压缩文件地址和文件名称
  869. String desPath = oldFilePath + vo.getModelNo() + vo.getModelName() + ".zip";
  870. File zipFile = new File(desPath);
  871. ZipOutputStream zipStream = null;
  872. FileInputStream zipSource = null;
  873. BufferedInputStream bufferStream = null;
  874. try {
  875. //构造最终压缩包的输出流
  876. zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
  877. if (mouldFiles.size() > 0) {
  878. log.info("mouldFiles------------->" + mouldFiles);
  879. for (int i = 0; i < mouldFiles.size(); i++) {
  880. //添加下载动态
  881. MouldOperationDynamics mod = new MouldOperationDynamics();
  882. mod.setApplicantId(mouldFiles.get(i).getUplodtorId());
  883. mod.setApplicantName(mouldFiles.get(i).getUploadtor());
  884. mod.setFileName(mouldFiles.get(i).getFileName());
  885. mod.setOperatorId(user.getId());
  886. mod.setOperatorName(user.getUsername());
  887. mod.setContent(Constant.DOWNLOAD);
  888. mod.setFileId(mouldFiles.get(i).getId());
  889. mod.setMouldId(vo.getId());
  890. mod.setBelongType(mouldFiles.get(i).getBlongType());
  891. mouldOperationDynamicsMapper.insert(mod);
  892. File file = new File(oldFilePath.substring(0, oldFilePath.length() - "/upload/".length()) + mouldFiles.get(i).getFileUrl());
  893. log.info("file=========>" + oldFilePath.substring(0, oldFilePath.length() - "/upload/".length()) + mouldFiles.get(i).getFileUrl());
  894. //将需要压缩的文件格式化为输入流
  895. zipSource = new FileInputStream(file);
  896. //压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样
  897. ZipEntry zipEntry = new ZipEntry(mouldFiles.get(i).getFileName());
  898. //定位该压缩条目位置,开始写入文件到压缩包中
  899. zipStream.putNextEntry(zipEntry);
  900. //输入缓冲流
  901. bufferStream = new BufferedInputStream(zipSource, 1024 * 10);
  902. int read = 0;
  903. //创建读写缓冲区
  904. byte[] buf = new byte[1024 * 10];
  905. while ((read = bufferStream.read(buf, 0, 1024 * 10)) != -1) {
  906. zipStream.write(buf, 0, read);
  907. }
  908. }
  909. }
  910. } catch (Exception e) {
  911. e.printStackTrace();
  912. } finally {
  913. //关闭流
  914. try {
  915. if (null != bufferStream) bufferStream.close();
  916. if (null != zipStream) zipStream.close();
  917. if (null != zipSource) zipSource.close();
  918. } catch (IOException e) {
  919. e.printStackTrace();
  920. }
  921. }
  922. return "/upload/" + vo.getModelNo() + vo.getModelName() + ".zip";
  923. }
  924. }