TMtdDailyController.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. package com.ruoyi.project.plant.controller;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import com.alibaba.fastjson.JSON;
  11. import com.deepoove.poi.XWPFTemplate;
  12. import com.deepoove.poi.config.Configure;
  13. import com.deepoove.poi.data.Pictures;
  14. import com.deepoove.poi.data.Texts;
  15. import com.deepoove.poi.plugin.table.LoopColumnTableRenderPolicy;
  16. import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
  17. import com.deepoove.poi.policy.RenderPolicy;
  18. import com.ruoyi.common.sendEmail.IMailService;
  19. import com.ruoyi.common.utils.DateUtils;
  20. import com.ruoyi.common.utils.file.FileUploadUtils;
  21. import com.ruoyi.framework.config.RuoYiConfig;
  22. import com.ruoyi.project.plant.domain.TMtdItem;
  23. import com.ruoyi.project.plant.mapper.TMtdItemMapper;
  24. import com.ruoyi.project.sems.safecheck.domain.TSpecWeekcheck;
  25. import com.ruoyi.project.system.domain.SysUser;
  26. import com.ruoyi.project.system.mapper.SysUserMapper;
  27. import io.jsonwebtoken.lang.Assert;
  28. import org.apache.commons.lang.StringUtils;
  29. import org.springframework.security.access.prepost.PreAuthorize;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.web.bind.annotation.GetMapping;
  32. import org.springframework.web.bind.annotation.PostMapping;
  33. import org.springframework.web.bind.annotation.PutMapping;
  34. import org.springframework.web.bind.annotation.DeleteMapping;
  35. import org.springframework.web.bind.annotation.PathVariable;
  36. import org.springframework.web.bind.annotation.RequestBody;
  37. import org.springframework.web.bind.annotation.RequestMapping;
  38. import org.springframework.web.bind.annotation.RestController;
  39. import com.ruoyi.framework.aspectj.lang.annotation.Log;
  40. import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
  41. import com.ruoyi.project.plant.domain.TMtdDaily;
  42. import com.ruoyi.project.plant.service.ITMtdDailyService;
  43. import com.ruoyi.framework.web.controller.BaseController;
  44. import com.ruoyi.framework.web.domain.AjaxResult;
  45. import com.ruoyi.common.utils.poi.ExcelUtil;
  46. import com.ruoyi.framework.web.page.TableDataInfo;
  47. import javax.annotation.Resource;
  48. /**
  49. * 调度会议Controller
  50. *
  51. * @author ssy
  52. * @date 2023-11-14
  53. */
  54. @RestController
  55. @RequestMapping("/plant/dailyMeeting")
  56. public class TMtdDailyController extends BaseController
  57. {
  58. @Autowired
  59. private ITMtdDailyService tMtdDailyService;
  60. @Resource
  61. private TMtdItemMapper tMtdItemMapper;
  62. @Autowired
  63. private IMailService mailService;
  64. //系统基础配置
  65. @Autowired
  66. private RuoYiConfig ruoyiConfig;
  67. @Resource
  68. private SysUserMapper sysUserMapper;
  69. /**
  70. * 查询调度会议列表
  71. */
  72. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:list')")
  73. @GetMapping("/list")
  74. public TableDataInfo list(TMtdDaily tMtdDaily)
  75. {
  76. startPage();
  77. List<TMtdDaily> list = tMtdDailyService.selectTMtdDailyList(tMtdDaily);
  78. return getDataTable(list);
  79. }
  80. /**
  81. * 导出调度会议列表
  82. */
  83. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:export')")
  84. @Log(title = "调度会议", businessType = BusinessType.EXPORT)
  85. @GetMapping("/export")
  86. public AjaxResult export(TMtdDaily tMtdDaily)
  87. {
  88. List<TMtdDaily> list = tMtdDailyService.selectTMtdDailyList(tMtdDaily);
  89. ExcelUtil<TMtdDaily> util = new ExcelUtil<TMtdDaily>(TMtdDaily.class);
  90. return util.exportExcel(list, "dailyMeeting");
  91. }
  92. /**
  93. * 获取调度会议详细信息
  94. */
  95. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:query')")
  96. @GetMapping(value = "/{id}")
  97. public AjaxResult getInfo(@PathVariable("id") Long id)
  98. {
  99. TMtdDaily tMtdDaily = tMtdDailyService.selectTMtdDailyById(id);
  100. //获取item列表
  101. TMtdItem item = new TMtdItem();
  102. item.setDailyId(id);
  103. item.setItemType(0);
  104. List<TMtdItem> item0 = tMtdItemMapper.selectTMtdItemList(item);
  105. tMtdDaily.setItems0(item0);
  106. item.setItemType(1);
  107. List<TMtdItem> item1 = tMtdItemMapper.selectTMtdItemList(item);
  108. tMtdDaily.setItems1(item1);
  109. item.setItemType(2);
  110. List<TMtdItem> item2 = tMtdItemMapper.selectTMtdItemList(item);
  111. tMtdDaily.setItems2(item2);
  112. item.setItemType(3);
  113. List<TMtdItem> item3 = tMtdItemMapper.selectTMtdItemList(item);
  114. tMtdDaily.setItems3(item3);
  115. item.setItemType(4);
  116. List<TMtdItem> item4 = tMtdItemMapper.selectTMtdItemList(item);
  117. tMtdDaily.setItems4(item4);
  118. item.setItemType(5);
  119. List<TMtdItem> item5 = tMtdItemMapper.selectTMtdItemList(item);
  120. tMtdDaily.setItems5(item5);
  121. return AjaxResult.success(tMtdDaily);
  122. }
  123. /**
  124. * 新增调度会议
  125. */
  126. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:add')")
  127. @Log(title = "调度会议", businessType = BusinessType.INSERT)
  128. @PostMapping
  129. public AjaxResult add(@RequestBody TMtdDaily tMtdDaily)
  130. {
  131. logger.info(JSON.toJSONString(tMtdDaily));
  132. return toAjax(tMtdDailyService.insertTMtdDaily(tMtdDaily));
  133. }
  134. /**
  135. * 修改调度会议
  136. */
  137. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:edit')")
  138. @Log(title = "调度会议", businessType = BusinessType.UPDATE)
  139. @PutMapping
  140. public AjaxResult edit(@RequestBody TMtdDaily tMtdDaily) throws IOException {
  141. logger.info(JSON.toJSONString(tMtdDaily));
  142. String url = PreView(tMtdDaily.getId());
  143. tMtdDaily.setWordUrl(url);
  144. return toAjax(tMtdDailyService.updateTMtdDaily(tMtdDaily));
  145. }
  146. /**
  147. * 删除调度会议
  148. */
  149. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:remove')")
  150. @Log(title = "调度会议", businessType = BusinessType.DELETE)
  151. @DeleteMapping("/{ids}")
  152. public AjaxResult remove(@PathVariable Long[] ids)
  153. {
  154. return toAjax(tMtdDailyService.deleteTMtdDailyByIds(ids));
  155. }
  156. /**
  157. * 发送调度会议邮件
  158. */
  159. @PreAuthorize("@ss.hasPermi('plant:dailyMeeting:edit')")
  160. @Log(title = "发送调度会议邮件", businessType = BusinessType.OTHER)
  161. @GetMapping("/sendMail")
  162. public AjaxResult sendMail(TMtdDaily tMtdDaily)
  163. {
  164. TMtdDaily daily = tMtdDailyService.selectTMtdDailyById(tMtdDaily.getId());
  165. //写html开始内容
  166. String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
  167. "<table cellpadding=\"0\" align=\"center\"" +
  168. "style=\"width: 600px; margin: 0px auto; text-align: left; position: relative; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-size: 14px; font-family:微软雅黑, 黑体; line-height: 1.5; box-shadow: rgb(153, 153, 153) 0px 0px 5px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;background:#fff;\">" +
  169. "<tbody><tr><th valign=\"middle\" style=\"height: 25px; line-height: 25px; padding: 15px 35px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #42a3d3; background-color: #49bcff; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;\">" +
  170. "<font face=\"微软雅黑\" size=\"5\" style=\"color: rgb(255, 255, 255); \">化工装置管理系统 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">Chemical Plant Management System(CPMS)</font></th></tr>";
  171. //写html结尾内容
  172. String end = "</tbody></table></div></body></html>";
  173. String username = "";
  174. String[] email = {"735032128@qq.com", "1213269375@qq.com"};
  175. String[] emailCc = {"ly@seashoreept.com", "ly735032128@gmail.com"};
  176. // email = "735032128@qq.com";
  177. //表html中间内容
  178. String prime = "";
  179. String firstcenter = "<tr><td><div style=\"padding:25px 35px 40px; background-color:#fff;\"><h2 style=\"margin: 5px 0px; \">" +
  180. "<font color=\"#333333\" style=\"line-height: 20px; \"><font style=\"line-height: 22px; \" size=\"4\">" +
  181. "亲爱的 CPMS用户</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
  182. "<p>您有一条新的调度会议:<br>" +
  183. "会议日期:<b>meetingDate</b><br>" +
  184. "请前往<a href=\"requestJumpPath/plant/meeting/detail/dailyId\">会议详情</a>查看或下载邮件附件。<br>" +
  185. "<p align=\"right\">date</p>" +
  186. "<div style=\"width:700px;margin:0 auto;\">" +
  187. "<div style=\"padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;\">" +
  188. "<p>此为系统邮件,请勿回复<br>This e-Mail is an automatic reminder sent by CPMS, please do not reply</p>" +
  189. "</div></div></div></td></tr>";
  190. String pattern = "yyyy年MM月dd日"; // 定义日期格式化模板
  191. SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); // 创建日期格式化器
  192. String formattedDate = dateFormat.format(daily.getMeetingDate()); // 将日期转换为字符串
  193. String one = firstcenter.replaceFirst("meetingDate", formattedDate);
  194. String two = one.replace("requestJumpPath", this.ruoyiConfig.getRequestJumpPath());
  195. String three = two.replace("dailyId", daily.getId().toString());
  196. String result = three.replaceFirst("date", dateFormat.format(new Date()));
  197. prime = prime + result;
  198. //拼接html
  199. String html = start + prime + end;
  200. // 需要转换的文件路径
  201. String filePath = RuoYiConfig.getProfile()+daily.getWordUrl().replace("/profile","");
  202. mailService.sendAttachmentsMail(email, "CPMS:您有一条"+ formattedDate+"装置调度会议信息", html, emailCc,filePath);
  203. return AjaxResult.success();
  204. }
  205. /**
  206. * @param id 生成文件名
  207. * @return
  208. * @throws IOException
  209. */
  210. public String PreView(Long id) throws IOException {
  211. //根据ID查询并生成
  212. TMtdDaily tMtdDaily = tMtdDailyService.selectTMtdDailyById(id);
  213. //获取item列表
  214. TMtdItem item = new TMtdItem();
  215. item.setDailyId(id);
  216. item.setItemType(0);
  217. List<TMtdItem> item0 = tMtdItemMapper.selectTMtdItemList(item);
  218. tMtdDaily.setItems0(item0);
  219. item.setItemType(1);
  220. List<TMtdItem> item1 = tMtdItemMapper.selectTMtdItemList(item);
  221. tMtdDaily.setItems1(getItemAndName(item1 , "1",tMtdDaily));
  222. item.setItemType(2);
  223. List<TMtdItem> item2 = tMtdItemMapper.selectTMtdItemList(item);
  224. tMtdDaily.setItems2(getItemAndName(item2 , "2",tMtdDaily));
  225. item.setItemType(3);
  226. List<TMtdItem> item3 = tMtdItemMapper.selectTMtdItemList(item);
  227. tMtdDaily.setItems3(getItemAndName(item3 , "3",tMtdDaily));
  228. item.setItemType(4);
  229. List<TMtdItem> item4 = tMtdItemMapper.selectTMtdItemList(item);
  230. tMtdDaily.setItems4(getItemAndName(item4 , "4",tMtdDaily));
  231. item.setItemType(5);
  232. List<TMtdItem> item5 = tMtdItemMapper.selectTMtdItemList(item);
  233. tMtdDaily.setItems5(getItemAndName(item5 , "5",tMtdDaily));
  234. String url = this.createcheck(tMtdDaily);
  235. return url;
  236. }
  237. private List<TMtdItem> getItemAndName(List<TMtdItem> items, String itemNum, TMtdDaily tMtdDaily){
  238. int num = 1;
  239. for (TMtdItem t: items
  240. ) {
  241. t.setItem(itemNum + "." + num);
  242. if (StringUtils.isNotEmpty(t.getActionby())){
  243. SysUser sysUser = sysUserMapper.selectUserByStaffId(t.getActionby());
  244. t.setActionName(sysUser.getNickName());
  245. }
  246. t.setBeginTime(DateUtils.parseDateToStr("MM-dd",tMtdDaily.getMeetingDate()));
  247. num++;
  248. }
  249. return items;
  250. }
  251. /**
  252. * 生成wordt
  253. */
  254. public String createcheck(TMtdDaily tMtdDaily) throws IOException {
  255. //生成word
  256. //渲染文本
  257. Map<String, Object> params = getWordData(tMtdDaily);
  258. // 模板路径
  259. String templatePath = "static/word/plant/dailymeeting.docx";
  260. // 生成word的路径
  261. String fileDir = RuoYiConfig.getProfile() + "/" + "plant/dailymeeting";
  262. // 生成word的文件名称
  263. String fileName = DateUtils.parseDateToStr("YYYY-MM-dd",tMtdDaily.getMeetingDate())+"装置调度会议"+tMtdDaily.getId() + ".docx";
  264. String wordPath = this.createWord(templatePath, fileDir, fileName, params);
  265. return wordPath;
  266. }
  267. /**
  268. * 获取word数据
  269. */
  270. public Map<String, Object> getWordData(TMtdDaily tMtdDaily) {
  271. Map<String, Object> params = new HashMap<>();
  272. params.put("meetingDate", DateUtils.parseDateToStr("YYYY-MM-dd",tMtdDaily.getMeetingDate()));
  273. params.put("reDate", DateUtils.parseDateToStr("MM-dd",tMtdDaily.getMeetingDate()));
  274. params.put("venue", tMtdDaily.getVenue());
  275. params.put("optMode", tMtdDaily.getOptMode());
  276. params.put("optItem", tMtdDaily.getOptItem());
  277. params.put("split", tMtdDaily.getSplit());
  278. params.put("pgu", tMtdDaily.getPgu());
  279. params.put("aeu", tMtdDaily.getAeu());
  280. SysUser recorder = sysUserMapper.selectUserByStaffId(tMtdDaily.getRecorder());
  281. params.put("recorder", recorder.getNickName());
  282. params.put("cracker",tMtdDaily.getAttendCracker());
  283. params.put("ctm",tMtdDaily.getAttendCtm());
  284. params.put("cta",tMtdDaily.getAttendCta());
  285. params.put("lab",tMtdDaily.getAttendLab());
  286. params.put("item1",tMtdDaily.getItems1());
  287. params.put("item2",tMtdDaily.getItems2());
  288. params.put("item3",tMtdDaily.getItems3());
  289. params.put("item4",tMtdDaily.getItems4());
  290. params.put("item5",tMtdDaily.getItems5());
  291. // 渲染文本
  292. return params;
  293. }
  294. private String getUserName(String str){
  295. String names = "";
  296. if (str == null) return "";
  297. String[] arr = str.split(",");
  298. for (int i = 0; i < arr.length; i++) {
  299. SysUser user = sysUserMapper.selectUserByStaffId(arr[i]);
  300. names = names + user.getNickName() + ",";
  301. }
  302. return names;
  303. };
  304. /**
  305. * @param templatePath word模板文件路径
  306. * @param fileDir 生成的文件存放地址
  307. * @param fileName 生成的文件名
  308. * @param paramMap 参数集合
  309. * @return 返回word生成的路径
  310. */
  311. public String createWord(String templatePath, String fileDir, String fileName, Map<String, Object> paramMap) throws IOException {
  312. Assert.notNull(templatePath, "word模板文件路径不能为空");
  313. Assert.notNull(fileDir, "生成的文件存放地址不能为空");
  314. Assert.notNull(fileName, "生成的文件名不能为空");
  315. File dir = new File(fileDir);
  316. if (!dir.exists()) {
  317. logger.info("目录不存在,创建文件夹{}!", fileDir);
  318. dir.mkdirs();
  319. }
  320. fileName = fileName.replaceAll("/", "_"); //替换文件中敏感字段
  321. logger.info("目录文件{}!", fileName);
  322. String filePath = fileDir + "/" + fileName;
  323. logger.info("目录{}!", filePath);
  324. // 读取模板渲染参数
  325. InputStream is = getClass().getClassLoader().getResourceAsStream(templatePath);
  326. LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
  327. RenderPolicy hackLoopSameLineTableRenderPolicy = new LoopColumnTableRenderPolicy(true);
  328. Configure config = Configure.builder()
  329. .bind("item1", policy)
  330. .bind("item2", policy)
  331. .bind("item3", policy)
  332. .bind("item4", policy)
  333. .bind("item5", policy)
  334. .build();
  335. XWPFTemplate template = XWPFTemplate.compile(is,config).render(paramMap);
  336. try {
  337. // 将模板参数写入路径
  338. template.writeToFile(filePath);
  339. template.close();
  340. } catch (Exception e) {
  341. logger.error("生成word异常{}", e.getMessage());
  342. e.printStackTrace();
  343. }
  344. String pathFileName = FileUploadUtils.getPathFileName(RuoYiConfig.getFilePath("/" + "plant/dailymeeting"), fileName);
  345. return pathFileName;
  346. }
  347. }