Parcourir la source

王子文 专项培养
1) 解决了季度汇报导师页面会议日期查询推迟一天的问题
2) 季度汇报会议一周后,邮件通知学员
3) 解决了季度汇报学员页面会议时间未满七天可见导师评论的问题
4) 导师给出月度反馈后,邮件通知学员

wangggziwen il y a 3 ans
Parent
commit
84aa55bed1

+ 48 - 44
master/src/main/java/com/ruoyi/common/thread/Trainning/MeetingFeedbackMailThread.java

@@ -12,16 +12,20 @@ import java.util.Date;
 public class MeetingFeedbackMailThread implements Runnable {
 
     private IMailService mailService;
-    private String email;
-    private String username;
-    private String usernameEN;
-    private String feedbackYear;
-    private String feedbackSeason;
+    private String email;   // 邮箱
+    private String username;    // 用户名(中)
+    private String usernameEN;  // 用户名(英)
+    private String feedbackYear;    // 年
+    private String feedbackSeason;  // 季度
+    private String meetingDate; // 会议日期
+    private String mentorNamesString;   // 参会导师名单
 
     public MeetingFeedbackMailThread() {
     }
 
-    public MeetingFeedbackMailThread(IMailService mailService, String email, String username, String usernameEN, String feedbackYear, String feedbackSeason) {
+    public MeetingFeedbackMailThread(IMailService mailService, String email, String username, String usernameEN, String feedbackYear, String feedbackSeason, String meetingDate, String mentorNamesString) {
+        this.mentorNamesString = mentorNamesString;
+        this.meetingDate = meetingDate;
         this.mailService = mailService;
         this.email = email;
         this.username = username;
@@ -36,44 +40,44 @@ public class MeetingFeedbackMailThread implements Runnable {
     }
 
     private void sendMail() {
-//        String jumpUrl = "/training/spec/myplan";
-//        //写html开始内容
-//        String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
-//                "<table cellpadding=\"0\" align=\"center\"" +
-//                "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;\">" +
-//                "<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;\">" +
-//                "<font face=\"微软雅黑\" size=\"5\" style=\"color: rgb(255, 255, 255); \">CPMS管理系统 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">CPMS System</font></th></tr>";
-//        //表html中间内容
-//        String prime = "";
-//        String center = "<tr><td><div style=\"padding:25px 35px 40px; background-color:#fff;\"><h2 style=\"margin: 5px 0px; \">" +
-//                "<font color=\"#333333\" style=\"line-height: 20px; \"><font style=\"line-height: 22px; \" size=\"4\">" +
-//                "亲爱的call username</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
-//                "Dear usernameEN</font></font></h2>" +
-//                "<p>您的培训计划有新状态:<br>" +
-//                "You have a new to-do task:<br>" +
-//                "培训内容:<b>plantName</b><br>" +
-//                "学习状态:<b>studyState</b><br>" +
-//                "学员:<b>staffName</b><br>" +
-//                "请登录<a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#jumpUrl\">CPMS管理系统</a>查看。<br>" +
-//                "Please log in the <a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#jumpUrl\">CPMS</a> to handle it.</p>" +
-//                "<p align=\"right\">date</p>" +
-//                "<div style=\"width:700px;margin:0 auto;\">" +
-//                "<div style=\"padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;\">" +
-//                "<p>此为系统邮件,请勿回复<br>This e-Mail is an automatic reminder sent by CPMS, please do not reply</p>" +
-//                "</div></div></div></td></tr>";
-//        String one = center.replaceFirst("username", username);
-//        String two = one.replaceFirst("usernameEN", usernameEN);
-//        String three = two.replaceFirst("plantName", tStPlan.getPlantName());
-//        String four = three.replaceFirst("call",call);
-//        String five = four.replaceFirst("studyState",studyState);
-//        String seven = five.replaceFirst("staffName", tStPlan.getStaffName());
-//        String result = seven.replaceFirst("date", String.valueOf(new Date())).replaceFirst("jumpUrl",jumpUrl).replaceFirst("jumpUrl",jumpUrl);
-//        prime = prime + result;
-//        //写html结尾内容
-//        String end = "</tbody></table></div></body></html>";
-//        //拼接html
-//        String html = start + prime + end;
-//        mailService.sendHtmlMail(email, "CPMS:您的培训计划"+ studyState +" (" + tStPlan.getPlantName() + ")", html);
+        String jumpUrl = "/training/spec/seasonalfeedback";
+        //写html开始内容
+        String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
+                "<table cellpadding=\"0\" align=\"center\"" +
+                "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;\">" +
+                "<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;\">" +
+                "<font face=\"微软雅黑\" size=\"5\" style=\"color: rgb(255, 255, 255); \">CPMS管理系统 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">CPMS System</font></th></tr>";
+        //表html中间内容
+        String prime = "";
+        String center = "<tr><td><div style=\"padding:25px 35px 40px; background-color:#fff;\"><h2 style=\"margin: 5px 0px; \">" +
+                "<font color=\"#333333\" style=\"line-height: 20px; \"><font style=\"line-height: 22px; \" size=\"4\">" +
+                "亲爱的username</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                "Dear usernameEN</font></font></h2>" +
+                "<p>您的季度汇报有新状态:<br>" +
+                "You have a new to-do task:<br>" +
+                "汇报内容:<b>feedbackYear年第feedbackSeason季度汇报</b><br>" +
+                "会议日期:<b>meetingDate</b><br>" +
+                "参会导师:<b>mentorNamesString</b><br>" +
+                "请登录<a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#jumpUrl\">CPMS管理系统</a>查看。<br>" +
+                "Please log in the <a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#jumpUrl\">CPMS</a> to handle it.</p>" +
+                "<p align=\"right\">date</p>" +
+                "<div style=\"width:700px;margin:0 auto;\">" +
+                "<div style=\"padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;\">" +
+                "<p>此为系统邮件,请勿回复<br>This e-Mail is an automatic reminder sent by CPMS, please do not reply</p>" +
+                "</div></div></div></td></tr>";
+        String one = center.replaceFirst("username", username);
+        String two = one.replaceFirst("usernameEN", usernameEN);
+        String three = two.replaceFirst("feedbackYear", feedbackYear);
+        String four = three.replaceFirst("feedbackSeason",feedbackSeason);
+        String five = four.replaceFirst("meetingDate",meetingDate);
+        String six = five.replaceFirst("mentorNamesString",mentorNamesString);
+        String result = six.replaceFirst("date", String.valueOf(new Date())).replaceFirst("jumpUrl",jumpUrl).replaceFirst("jumpUrl",jumpUrl);
+        prime = prime + result;
+        //写html结尾内容
+        String end = "</tbody></table></div></body></html>";
+        //拼接html
+        String html = start + prime + end;
+        mailService.sendHtmlMail(email, "CPMS:您的导师已提交季度汇报反馈 (" + feedbackYear + "年第" + feedbackSeason + "季度)", html);
     }
 
 }

+ 81 - 0
master/src/main/java/com/ruoyi/common/thread/Trainning/MonthlyFeedbackMailThread.java

@@ -0,0 +1,81 @@
+package com.ruoyi.common.thread.Trainning;
+
+import com.ruoyi.common.sendEmail.IMailService;
+
+import java.util.Date;
+
+/**
+ * @author Wang Zi Wen
+ * @email wangggziwen@163.com
+ * @date 2022/05/25 10:35:59
+ */
+public class MonthlyFeedbackMailThread implements Runnable {
+
+    private IMailService mailService;
+    private String email;   // 学员邮箱
+    private String successorName;    // 学员用户名(中)
+    private String successorNameEN;  // 学员用户名(英)
+    private String mentorName;    // 导师用户名(中)
+    private String mentorNameEN;  // 导师用户名(英)
+    private String feedbackYear;    // 年
+    private String feedbackMonth;  // 月
+
+    public MonthlyFeedbackMailThread() {
+    }
+
+    public MonthlyFeedbackMailThread(IMailService mailService, String email, String successorName, String successorNameEN, String mentorName, String mentorNameEN, String feedbackYear, String feedbackMonth) {
+        this.mailService = mailService;
+        this.email = email;
+        this.successorName = successorName;
+        this.successorNameEN = successorNameEN;
+        this.mentorName = mentorName;
+        this.mentorNameEN = mentorNameEN;
+        this.feedbackYear = feedbackYear;
+        this.feedbackMonth = feedbackMonth;
+    }
+
+    @Override
+    public void run() {
+        this.sendMail();
+    }
+
+    private void sendMail() {
+        String jumpUrl = "/training/spec/monthlyfeedback";
+        //写html开始内容
+        String start = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title></title></head><body><div style=\"background-color:#ECECEC; padding: 35px;\">" +
+                "<table cellpadding=\"0\" align=\"center\"" +
+                "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;\">" +
+                "<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;\">" +
+                "<font face=\"微软雅黑\" size=\"5\" style=\"color: rgb(255, 255, 255); \">CPMS管理系统 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">CPMS System</font></th></tr>";
+        //表html中间内容
+        String prime = "";
+        String center = "<tr><td><div style=\"padding:25px 35px 40px; background-color:#fff;\"><h2 style=\"margin: 5px 0px; \">" +
+                "<font color=\"#333333\" style=\"line-height: 20px; \"><font style=\"line-height: 22px; \" size=\"4\">" +
+                "亲爱的successorName</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                "Dear successorNameEN</font></font></h2>" +
+                "<p>您的月度反馈有新状态:<br>" +
+                "You have a new to-do task:<br>" +
+                "导师:<b>mentorName</b><br>" +
+                "反馈月份:<b>feedbackYear年feedbackMonth月</b><br>" +
+                "请登录<a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#jumpUrl\">CPMS管理系统</a>查看。<br>" +
+                "Please log in the <a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#jumpUrl\">CPMS</a> to handle it.</p>" +
+                "<p align=\"right\">date</p>" +
+                "<div style=\"width:700px;margin:0 auto;\">" +
+                "<div style=\"padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;\">" +
+                "<p>此为系统邮件,请勿回复<br>This e-Mail is an automatic reminder sent by CPMS, please do not reply</p>" +
+                "</div></div></div></td></tr>";
+        String one = center.replaceFirst("successorName", successorName);
+        String two = one.replaceFirst("successorNameEN", successorNameEN);
+        String three = two.replaceFirst("mentorName", mentorName);
+        String four = three.replaceFirst("feedbackYear",feedbackYear);
+        String five = four.replaceFirst("feedbackMonth",feedbackMonth);
+        String result = five.replaceFirst("date", String.valueOf(new Date())).replaceFirst("jumpUrl",jumpUrl).replaceFirst("jumpUrl",jumpUrl);
+        prime = prime + result;
+        //写html结尾内容
+        String end = "</tbody></table></div></body></html>";
+        //拼接html
+        String html = start + prime + end;
+        mailService.sendHtmlMail("wangggziwen@163.com", "CPMS:您的导师已提交月度反馈 (" + feedbackYear + "年" + feedbackMonth + "月)", html);
+    }
+
+}

+ 28 - 2
master/src/main/java/com/ruoyi/project/training/spec/controller/TStFeedbackController.java

@@ -4,6 +4,11 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.github.stuxuhai.jpinyin.PinyinException;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.ruoyi.common.sendEmail.IMailService;
+import com.ruoyi.common.thread.Trainning.MonthlyFeedbackMailThread;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.service.ISysUserService;
 import com.ruoyi.project.training.spec.domain.*;
@@ -57,6 +62,9 @@ public class TStFeedbackController extends BaseController
     @Autowired
     private ITStSuccessorScoreService stSuccessorScoreService;
 
+    @Autowired
+    private IMailService mailService;
+
      /**
      * 保存季度反馈内容
      * @param feedbackSeasonalVO 季度反馈数据传输对象
@@ -516,8 +524,26 @@ public class TStFeedbackController extends BaseController
     @PreAuthorize("@ss.hasPermi('spec:feedback:edit')")
     @Log(title = "专项培训反馈", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody TStFeedback tStFeedback)
-    {
+    public AjaxResult edit(@RequestBody TStFeedback tStFeedback) throws PinyinException {
+        TStFeedback feedback = tStFeedbackService.selectTStFeedbackById(tStFeedback.getId());
+        // 反馈类型为季度反馈
+        if (feedback.getFeedbackType() == 2) {
+            // 根据学员staffId获取用户对象
+            SysUser successor = sysUserService.selectUserByStaffId(feedback.getSuccessorId());
+            String email = successor.getEmail();
+            String successorName = successor.getNickName();
+            String successorNameEN = PinyinHelper.convertToPinyinString(successorName, " ", PinyinFormat.WITHOUT_TONE);
+            String feedbackYear = feedback.getFeedbackYear();
+            String feedbackMonth = feedback.getFeedbackMonth();
+            // 根据导师staffId获取用户对象
+            SysUser mentor = sysUserService.selectUserByStaffId(feedback.getMentorId());
+            String mentorName = mentor.getNickName();
+            String mentorNameEN = PinyinHelper.convertToPinyinString(mentorName, " ", PinyinFormat.WITHOUT_TONE);
+            // 邮件通知导师
+//            MonthlyFeedbackMailThread monthlyFeedbackMailThread = new MonthlyFeedbackMailThread(mailService, email, successorName, successorNameEN, mentorName, mentorNameEN, feedbackYear, feedbackMonth);
+//            Thread thread = new Thread(monthlyFeedbackMailThread);
+//            thread.start();
+        }
         return toAjax(tStFeedbackService.updateTStFeedback(tStFeedback));
     }
 

+ 18 - 9
master/src/main/java/com/ruoyi/project/training/spec/scheduler/TStFeedbackScheduler.java

@@ -40,20 +40,14 @@ public class TStFeedbackScheduler {
 
     /**
      * 会议时间一周后给学员发送邮件
-     * 每日8:00触发定时任务
-     * 扫描TStFeedback表,获取所有会议日期 = 当前日期 - 7 的记录,给学员发送邮件
+     * 定时任务触发条件:每日8:00
      */
-    // 生产环境触发条件:每日8:00
 //    @Scheduled(cron = "0 0 8 * * ?")
-    // 测试环境触发条件:每秒
-//    @Scheduled(cron = "0 * * * * ?")
     private void mailSuccessorAfterMeeting() throws PinyinException {
         // 获取所有反馈记录
         List<TStFeedback> tStFeedbackList = tStFeedbackService.selectTStFeedbackList(null);
-
         // 过滤出所有会议日期不为空的反馈记录
         tStFeedbackList = tStFeedbackList.stream().filter(tStFeedback -> tStFeedback.getMeetingDate()!=null).collect(Collectors.toList());
-
         // 过滤出会议日期为七日前的反馈记录
         tStFeedbackList = tStFeedbackList.stream().filter(tStFeedback -> {
             // 当前日期毫秒数
@@ -72,16 +66,31 @@ public class TStFeedbackScheduler {
             }
             return sendMail;
         }).collect(Collectors.toList());
-
         // 发送邮件
         for (TStFeedback feedback : tStFeedbackList) {
+            // 根据学员staffId获取用户对象
             SysUser successor = sysUserService.selectUserByStaffId(feedback.getSuccessorId());
             String email = successor.getEmail();
             String username = successor.getNickName();
             String usernameEN = PinyinHelper.convertToPinyinString(username, " ", PinyinFormat.WITHOUT_TONE);
             String feedbackYear = feedback.getFeedbackYear();
             String feedbackSeason = feedback.getFeedbackSeason();
-            MeetingFeedbackMailThread meetingFeedbackMailThread = new MeetingFeedbackMailThread(mailService, email, username, usernameEN, feedbackYear, feedbackSeason);
+            Date meetingDate = feedback.getMeetingDate();
+            String meetingDateString = "20" + (meetingDate.getYear() + "年" + (meetingDate.getMonth() + 1 + "月") + meetingDate.getDate() + "日").substring(1);
+            // 根据导师staffId获取用户对象
+            SysUser mentor = sysUserService.selectUserByStaffId(feedback.getMentorId());
+            // 参会导师名单
+            String mentorNamesString = mentor.getNickName();
+            TStFeedback queryObj = new TStFeedback();
+            queryObj.setParentId(feedback.getId());
+            List<TStFeedback> invitedMentorsFeedback = tStFeedbackService.selectTStFeedbackList(queryObj);
+            for (TStFeedback tStFeedback : invitedMentorsFeedback) {
+                // 根据受邀导师staffId获取用户对象
+                SysUser invitedMentor = sysUserService.selectUserByStaffId(tStFeedback.getMentorId());
+                mentorNamesString += ",";
+                mentorNamesString += invitedMentor.getNickName();
+            }
+            MeetingFeedbackMailThread meetingFeedbackMailThread = new MeetingFeedbackMailThread(mailService, email, username, usernameEN, feedbackYear, feedbackSeason, meetingDateString, mentorNamesString);
             Thread thread = new Thread(meetingFeedbackMailThread);
             thread.start();
         }

+ 1 - 1
ui/src/views/training/spec/monthlyfeedback/index.vue

@@ -769,4 +769,4 @@ export default {
   h3{
     margin: 20px 0px;
   }
-</style>
+</style>

+ 13 - 14
ui/src/views/training/spec/seasonalfeedback/index.vue

@@ -342,19 +342,20 @@
         </div>
         <!-- 导师反馈 -->
         <div>
-          <h3>导师反馈</h3>
           <div v-if="showSaveButton && ( staffId == activeName )">
+            <h3>导师反馈</h3>
             <editor
               :min-height="300"
               v-model="mentorFeedback"
             />
           </div>
-          <span
-            v-if="!showSaveButton || ( staffId != activeName )"
-            v-html="mentorFeedback"
-            style="overflow:scroll; display:block; border:1px solid #CCCCCC; height: 300px; padding:15px;font-family: Helvetica, Arial, sans-serif; font-size: 13px;"
-          >
-          </span>
+          <div v-if="!showSaveButton || ( isMentor && ( staffId != activeName ) )">
+            <h3>导师反馈</h3>
+            <span
+              v-html="mentorFeedback"
+              style="overflow:scroll; display:block; border:1px solid #CCCCCC; height: 300px; padding:15px;font-family: Helvetica, Arial, sans-serif; font-size: 13px;"
+            ></span>
+          </div>
         </div>
         <!-- 保存按钮 -->
         <div style="text-align:center;margin: 20px auto;">
@@ -725,15 +726,11 @@ export default {
       // 当前日期
       let now = new Date();
       if (lastDay > now) {
-        // 导师可修改反馈内容
+        // 导师可修改反馈内容,学员不可查看导师反馈内容
         this.showSaveButton = true;
-        // 学员可查看导师反馈内容
-
       } else {
-        // 导师不可修改反馈内容
+        // 导师不可修改反馈内容,学员可查看导师反馈内容
         this.showSaveButton = false;
-        // 学员不可查看导师反馈内容
-
       }
     },
     /** 标签页切换事件 */
@@ -868,7 +865,9 @@ export default {
               this.feedbackId = data.id;
               this.mentorId = data.mentorId;
               this.parentId = data.id;
-              this.meetingDate = data.meetingDate;
+              let meetingDate = data.meetingDate;
+              meetingDate.setTime(meetingDate.getTime() - 3600 * 1000 * 24);
+              this.meetingDate = meetingDate;
               this.resetLastDay();
               this.mentorFeedback = data.mentorFeedback;
               // 初始化汇报附件