Przeglądaj źródła

-添加邮件通知

jiangbiao 2 lat temu
rodzic
commit
115a128504

+ 9 - 1
master/src/main/java/com/ruoyi/project/apply/controller/TApplySafetychangeController.java

@@ -19,6 +19,10 @@ import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.project.apply.domain.TApplySafetychange;
 import com.ruoyi.project.apply.service.ITApplySafetychangeService;
 import com.ruoyi.project.approve.damain.DevTask;
+import com.ruoyi.project.listener.apply.change.ChangeEndFailListener;
+import com.ruoyi.project.listener.apply.change.ChangeEndSuccessListener;
+import com.ruoyi.project.listener.apply.change.ChangeFlowListener;
+import com.ruoyi.project.listener.apply.change.ChangeNextTaskListener;
 import com.ruoyi.project.plant.domain.TStaffmgr;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.service.ISysUserService;
@@ -121,7 +125,7 @@ public class TApplySafetychangeController extends BaseController {
         tApplySafetychange.setConfirmer(tApplySafetychange.getSafaer());
 //        tApplySafetychange.setConfirmerName(tApplySafetychange.getSafaerName());
         if(StringUtils.isNotEmpty(tApplySafetychange.getRemarks())&&(!tApplySafetychange.getRemarks().endsWith(";")||!tApplySafetychange.getRemarks().endsWith(";")))
-            tApplySafetychange.setRemarks(tApplySafetychange.getRemarks()+";");
+            tApplySafetychange.setRemarks("申请人-" + tApplySafetychange.getRemarks()+";");
         tApplySafetychangeService.insertTApplySafetychange(tApplySafetychange);
 
         // 开始申请流程
@@ -164,6 +168,10 @@ public class TApplySafetychangeController extends BaseController {
             changeExecutors = new StringBuilder(changeExecutors.substring(0, changeExecutors.length() - 1));
         }
         variables.put("changeExecutor", changeExecutors.toString());
+        variables.put("changeNextTaskListener",new ChangeNextTaskListener());
+        variables.put("changeEndFailListener", new ChangeEndFailListener());
+        variables.put("changeEndSuccessListener", new ChangeEndSuccessListener());
+        variables.put("changeFlowListener", new ChangeFlowListener());
         //采用key来启动流程定义并设置流程变量,返回流程实例
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("safetychange", String.valueOf(businessKey), variables);
         logger.info("流程定义id:" + pi.getProcessDefinitionId());

+ 1 - 1
master/src/main/java/com/ruoyi/project/apply/service/impl/TApplySafetychangeServiceImpl.java

@@ -14,7 +14,7 @@ import java.util.List;
  * @author ruoyi
  * @date 2023-02-09
  */
-@Service
+@Service("tApplySafetychangeService")
 public class TApplySafetychangeServiceImpl implements ITApplySafetychangeService
 {
     @Autowired

+ 83 - 0
master/src/main/java/com/ruoyi/project/listener/apply/change/ChangeEndFailListener.java

@@ -0,0 +1,83 @@
+package com.ruoyi.project.listener.apply.change;
+
+import com.alibaba.fastjson.JSON;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.ruoyi.common.sendEmail.IMailService;
+import com.ruoyi.common.utils.SpringContextUtils;
+import com.ruoyi.project.apply.domain.TApplySafetychange;
+import com.ruoyi.project.apply.service.ITApplySafetychangeService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.service.ISysUserService;
+import org.activiti.engine.delegate.DelegateExecution;
+import org.activiti.engine.delegate.ExecutionListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Service("changeEndFailListener")
+public class ChangeEndFailListener implements Serializable, ExecutionListener {
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateExecution execution) {
+        String businessKey = execution.getProcessInstanceBusinessKey();
+        ITApplySafetychangeService entityService = (ITApplySafetychangeService) SpringContextUtils.getBean("tApplySafetychangeService");
+        TApplySafetychange entity = entityService.selectTApplySafetychangeById(Long.valueOf(businessKey));
+        logger.info("==========================businessKey:" + businessKey);
+        logger.info("==========================entity:" + entity);
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        try {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(entity.getApplicant()));
+            String email = sysUser.getEmail();
+            String apNo = entity.getApNo();
+            logger.info("apNo:" + apNo);
+            String username = sysUser.getNickName();
+            String loginName = sysUser.getUserName();
+            String usernameEN = PinyinHelper.convertToPinyinString(username, " ", PinyinFormat.WITHOUT_TONE);
+            logger.info("email:" + email);
+            logger.info("username:" + username);
+            logger.info("====================================本次拒绝邮件发送给:" + username);
+            //写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); \">组织保护措施状态变更申请 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">Organization of protection measure status change application</font></th></tr>";
+            //表html中间内容
+            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(loginName)</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                    "Dear usernameEN(loginName)</font></font></h2>" +
+                    "<p><font style=\"line-height: 22px; \" size=\"5\"><b>您的申请已被拒绝<br>" +
+                    "Your application has been rejected</b></font><br>"+
+                    "任务名:<b>组织保护措施状态变更申请</b><br>" +
+                    "Task Name: <b>Organization of protection measure status change application</b><br>" +
+                    "任务编号:<b>apNo</b><br>" +
+                    "Task Number: <b>apNoEN</b><br>" +
+                    "<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.replace("loginName", loginName);
+            String four = three.replaceFirst("apNo", apNo);
+            String five = four.replaceFirst("apNoEN", apNo);
+            String result = five.replaceFirst("date", String.valueOf(new Date()));
+            //写html结尾内容
+            String end = "</tbody></table></div></body></html>";
+            //拼接html
+            String html = start + result + end;
+            logger.info("=======================邮件内容:" + html);
+            mailService.sendHtmlMail(email, "组织保护措施状态变更申请:您的申请已被拒绝 Organization of protection measure status change application:Your application has been rejected (" + apNo + ")", html);
+        } catch (Exception e) {
+            logger.error("邮件发送失败" + JSON.toJSONString(e));
+        }
+    }
+}

+ 85 - 0
master/src/main/java/com/ruoyi/project/listener/apply/change/ChangeEndSuccessListener.java

@@ -0,0 +1,85 @@
+package com.ruoyi.project.listener.apply.change;
+
+import com.alibaba.fastjson.JSON;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.ruoyi.common.sendEmail.IMailService;
+import com.ruoyi.common.utils.SpringContextUtils;
+import com.ruoyi.project.apply.domain.TApplySafetychange;
+import com.ruoyi.project.apply.service.ITApplySafetychangeService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.service.ISysUserService;
+import org.activiti.engine.delegate.DelegateExecution;
+import org.activiti.engine.delegate.ExecutionListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Service("changeEndSuccessListener")
+public class ChangeEndSuccessListener implements Serializable, ExecutionListener {
+
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateExecution execution) {
+        String businessKey = execution.getProcessInstanceBusinessKey();
+        ITApplySafetychangeService entityService = (ITApplySafetychangeService) SpringContextUtils.getBean("tApplySafetychangeService");
+        TApplySafetychange entity = entityService.selectTApplySafetychangeById(Long.valueOf(businessKey));
+        logger.info("==========================businessKey:" + businessKey);
+        logger.info("==========================entity:" + entity);
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        try {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(entity.getApplicant()));
+            String email = sysUser.getEmail();
+            String apNo = entity.getApNo();
+            logger.info("apNo:" + apNo);
+            String username = sysUser.getNickName();
+            String loginName = sysUser.getUserName();
+            String usernameEN = PinyinHelper.convertToPinyinString(username, " ", PinyinFormat.WITHOUT_TONE);
+            logger.info("email:" + email);
+            logger.info("username:" + username);
+            logger.info("====================================本次通过邮件发送给:" + username);
+            //写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); \">组织保护措施状态变更申请 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">Organization of protection measure status change application</font></th></tr>";
+            //表html中间内容
+            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(loginName)</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                    "Dear usernameEN(loginName)</font></font></h2>" +
+                    "<p><font style=\"line-height: 22px; \" size=\"5\"><b>您的申请已通过<br>" +
+                    "Your application has passed</b></font><br>" +
+                    "任务名:<b>组织保护措施状态变更申请</b><br>" +
+                    "Task Name: <b>Organization of protection measure status change application</b><br>" +
+                    "任务编号:<b>apNo</b><br>" +
+                    "Task Number: <b>apNoEN</b><br>" +
+                    "<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.replace("loginName", loginName);
+            String four = three.replaceFirst("apNo", apNo);
+            String five = four.replaceFirst("apNoEN", apNo);
+            String result = five.replaceFirst("date", String.valueOf(new Date()));
+            //写html结尾内容
+            String end = "</tbody></table></div></body></html>";
+            //拼接html
+            String html = start + result + end;
+            logger.info("=======================邮件内容:" + html);
+            mailService.sendHtmlMail(email, "组织保护措施状态变更申请:您的申请已通过 Organization of protection measure status change application:Your application has been passed (" + apNo + ")", html);
+        } catch (Exception e) {
+            logger.error("邮件发送失败" + JSON.toJSONString(e));
+        }
+
+    }
+}

+ 85 - 0
master/src/main/java/com/ruoyi/project/listener/apply/change/ChangeFlowListener.java

@@ -0,0 +1,85 @@
+package com.ruoyi.project.listener.apply.change;
+
+import com.alibaba.fastjson.JSON;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.ruoyi.common.sendEmail.IMailService;
+import com.ruoyi.common.utils.SpringContextUtils;
+import com.ruoyi.project.apply.domain.TApplySafetychange;
+import com.ruoyi.project.apply.service.ITApplySafetychangeService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.service.ISysUserService;
+import org.activiti.engine.delegate.DelegateExecution;
+import org.activiti.engine.delegate.ExecutionListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Service("changeFlowListener")
+public class ChangeFlowListener implements Serializable, ExecutionListener {
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateExecution execution) {
+        String businessKey = execution.getProcessInstanceBusinessKey();
+        ITApplySafetychangeService entityService = (ITApplySafetychangeService) SpringContextUtils.getBean("tApplySafetychangeService");
+        TApplySafetychange entity = entityService.selectTApplySafetychangeById(Long.valueOf(businessKey));
+        logger.info("==========================businessKey:" + businessKey);
+        logger.info("==========================entity:" + entity);
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        try {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(entity.getApplicant()));
+            String email = sysUser.getEmail();
+            String apNo = entity.getApNo();
+            logger.info("apNo:" + apNo);
+            String username = sysUser.getNickName();
+            String loginName = sysUser.getUserName();
+            String usernameEN = PinyinHelper.convertToPinyinString(username, " ", PinyinFormat.WITHOUT_TONE);
+            logger.info("email:" + email);
+            logger.info("username:" + username);
+            logger.info("====================================本次驳回邮件发送给:" + username);
+            //写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); \">组织保护措施状态变更申请 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">Organization of protection measure status change application</font></th></tr>";
+            //表html中间内容
+            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(loginName)</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                    "Dear usernameEN(loginName)</font></font></h2>" +
+                    "<p><font style=\"line-height: 22px; \" size=\"5\"><b>您的申请已被驳回<br>" +
+                    "Your application has been rejected</b></font><br>"+
+                    "任务名:<b>组织保护措施状态变更申请</b><br>" +
+                    "Task Name: <b>Organization of protection measure status change application</b><br>" +
+                    "任务编号:<b>apNo</b><br>" +
+                    "Task Number: <b>apNoEN</b><br>" +
+                    "请登录<a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#/approve/pending\">我的待办</a>查看。<br>" +
+                    "Please log in the <a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#/approve/pending\">My To-do</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.replace("loginName", loginName);
+            String four = three.replaceFirst("apNo", apNo);
+            String five = four.replaceFirst("apNoEN", apNo);
+            String result = five.replaceFirst("date", String.valueOf(new Date()));
+            //写html结尾内容
+            String end = "</tbody></table></div></body></html>";
+            //拼接html
+            String html = start + result + end;
+            logger.info("=======================邮件内容:" + html);
+            mailService.sendHtmlMail(email, "组织保护措施状态变更申请:您的申请已被驳回 Organization of protection measure status change application:Your application has been rejected (" + apNo + ")", html);
+        } catch (Exception e) {
+            logger.error("邮件发送失败" + JSON.toJSONString(e));
+        }
+    }
+}

+ 104 - 0
master/src/main/java/com/ruoyi/project/listener/apply/change/ChangeNextTaskListener.java

@@ -0,0 +1,104 @@
+package com.ruoyi.project.listener.apply.change;
+
+import com.alibaba.fastjson.JSON;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+import com.ruoyi.common.sendEmail.IMailService;
+import com.ruoyi.common.utils.SpringContextUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.project.apply.domain.TApplySafetychange;
+import com.ruoyi.project.apply.service.ITApplySafetychangeService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.service.ISysUserService;
+import org.activiti.engine.delegate.DelegateTask;
+import org.activiti.engine.delegate.TaskListener;
+import org.activiti.engine.task.IdentityLink;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service("changeNextTaskListener")
+public class ChangeNextTaskListener implements Serializable, TaskListener {
+
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateTask delegateTask) {
+        String businessKey = delegateTask.getExecution().getProcessInstanceBusinessKey();
+        ITApplySafetychangeService entityService = (ITApplySafetychangeService) SpringContextUtils.getBean("tApplySafetychangeService");
+        TApplySafetychange entity = entityService.selectTApplySafetychangeById(Long.valueOf(businessKey));
+        logger.info("==========================businessKey:" + businessKey);
+        logger.info("==========================entity:" + entity);
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        String assignee = delegateTask.getAssignee();
+        List<String> userIds = new ArrayList<>();
+        if (StringUtils.isEmpty(assignee)) {
+            for (IdentityLink candidate : delegateTask.getCandidates()) {
+                userIds.add(candidate.getUserId());
+            }
+        } else {
+            userIds.add(assignee);
+        }
+        StringBuilder to = new StringBuilder();
+        for (String userId : userIds) {
+            //发送邮件
+            try {
+                SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userId));
+                String email = sysUser.getEmail();
+                String apNo = entity.getApNo();
+                logger.info("apNo:" + apNo);
+                String username = sysUser.getNickName();
+                to.append(username).append(" ");
+                String loginName = sysUser.getUserName();
+                String usernameEN = PinyinHelper.convertToPinyinString(username, " ", PinyinFormat.WITHOUT_TONE);
+                logger.info("email:" + email);
+                logger.info("username:" + username);
+                //写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); \">组织保护措施状态变更申请 </font><font face=\"微软雅黑\" size=\"3\" style=\"color: rgb(255, 255, 255); \">Organization of protection measure status change application</font></th></tr>";
+                //表html中间内容
+                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(loginName)</font><br><font style=\"line-height: 22px; \" size=\"4\">" +
+                        "Dear usernameEN(loginName)</font></font></h2>" +
+                        "<p>您有一个新的待办任务:<br>" +
+                        "You have a new to-do task:<br>" +
+                        "任务名:<b>组织保护措施状态变更申请审批</b><br>" +
+                        "Task Name: <b>Approval of Organization of protection measure status change application</b><br>" +
+                        "任务编号:<b>apNo</b><br>" +
+                        "Task Number: <b>apNoEN</b><br>" +
+                        "请登录<a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#/approve/pending\">我的待办</a>查看。<br>" +
+                        "Please log in the <a href=\"https://cpms.basf-ypc.net.cn/cpms/index.html#/approve/pending\">My To-do</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.replace("loginName", loginName);
+                String four = three.replaceFirst("apNo", apNo);
+                String five = four.replaceFirst("apNoEN", apNo);
+                String result = five.replaceFirst("date", String.valueOf(new Date()));
+                //写html结尾内容
+                String end = "</tbody></table></div></body></html>";
+                //拼接html
+                String html = start + result + end;
+                logger.info("=======================邮件内容:" + html);
+                mailService.sendHtmlMail(email, "组织保护措施状态变更申请:您有一个新的待办任务 Organization of protection measure status change application:You have a new to-do task (" + apNo + ")", html);
+            } catch (Exception e) {
+                logger.error("邮件发送失败" + JSON.toJSONString(e));
+            }
+        }
+        logger.info("====================================本次通过邮件发送给:" + to);
+    }
+}

+ 66 - 23
master/src/main/resources/processes/apply/safetychange.bpmn

@@ -4,34 +4,77 @@
     <startEvent id="startevent1" name="Start"></startEvent>
     <userTask id="applytask" name="申请人提交申请" activiti:assignee="#{applyuser}"></userTask>
     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="applytask"></sequenceFlow>
-    <userTask id="safaertask1" name="安全评估人1" activiti:candidateUsers="#{safaer}"></userTask>
+    <userTask id="safaertask1" name="安全评估人1" activiti:candidateUsers="#{safaer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
     <sequenceFlow id="flow2" name="提交" sourceRef="applytask" targetRef="safaertask1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="flow3" name="驳回" sourceRef="safaertask1" targetRef="applytask">
+      <extensionElements>
+        <activiti:executionListener event="take" delegateExpression="${changeFlowListener}"></activiti:executionListener>
+      </extensionElements>
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="approvertask" name="批准人" activiti:candidateUsers="#{approver}"></userTask>
+    <userTask id="approvertask" name="批准人" activiti:candidateUsers="#{approver}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
     <sequenceFlow id="flow4" name="通过" sourceRef="safaertask1" targetRef="approvertask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="flow5" name="驳回" sourceRef="approvertask" targetRef="safaertask1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
     </sequenceFlow>
-    <endEvent id="endevent1" name="End"></endEvent>
+    <endEvent id="endevent1" name="End">
+      <extensionElements>
+        <activiti:executionListener event="end" delegateExpression="${changeEndFailListener}"></activiti:executionListener>
+      </extensionElements>
+    </endEvent>
     <sequenceFlow id="flow6" name="拒绝" sourceRef="safaertask1" targetRef="endevent1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 0}]]></conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="flow7" name="拒绝" sourceRef="approvertask" targetRef="endevent1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 0}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="executortask" name="措施执行人" activiti:assignee="#{executor}"></userTask>
-    <userTask id="confirmertask" name="措施确认人" activiti:candidateUsers="#{confirmer}"></userTask>
-    <userTask id="changetask" name="变更执行人" activiti:candidateUsers="#{changeExecutor}"></userTask>
-    <userTask id="safaertask2" name="安全评估人2" activiti:candidateUsers="#{safaer}"></userTask>
-    <userTask id="resetConfirmer1" name="确认人1" activiti:candidateUsers="#{resetConfirmer1}"></userTask>
-    <userTask id="resetConfirmer2" name="确认人2" activiti:assignee="#{resetConfirmer2}"></userTask>
-    <endEvent id="endevent2" name="End"></endEvent>
+    <userTask id="executortask" name="措施执行人" activiti:assignee="#{executor}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="confirmertask" name="措施确认人" activiti:candidateUsers="#{confirmer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="changetask" name="变更执行人" activiti:candidateUsers="#{changeExecutor}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="safaertask2" name="安全评估人2" activiti:candidateUsers="#{safaer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="resetConfirmer1" name="确认人1" activiti:candidateUsers="#{resetConfirmer1}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="resetConfirmer2" name="确认人2" activiti:assignee="#{resetConfirmer2}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${changeNextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <endEvent id="endevent2" name="End">
+      <extensionElements>
+        <activiti:executionListener event="end" delegateExpression="${changeEndSuccessListener}"></activiti:executionListener>
+      </extensionElements>
+    </endEvent>
     <sequenceFlow id="flow8" name="通过" sourceRef="approvertask" targetRef="executortask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
@@ -100,7 +143,7 @@
         <omgdi:waypoint x="437.0" y="175.0"></omgdi:waypoint>
         <omgdi:waypoint x="437.0" y="220.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="175.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="437.0" y="175.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
@@ -110,14 +153,14 @@
         <omgdi:waypoint x="293.0" y="147.0"></omgdi:waypoint>
         <omgdi:waypoint x="385.0" y="147.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="301.0" y="189.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="301.0" y="189.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
         <omgdi:waypoint x="437.0" y="275.0"></omgdi:waypoint>
         <omgdi:waypoint x="437.0" y="330.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="275.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="437.0" y="275.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
@@ -126,7 +169,7 @@
         <omgdi:waypoint x="298.0" y="247.0"></omgdi:waypoint>
         <omgdi:waypoint x="385.0" y="247.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="301.0" y="300.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="301.0" y="289.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
@@ -134,63 +177,63 @@
         <omgdi:waypoint x="627.0" y="247.0"></omgdi:waypoint>
         <omgdi:waypoint x="627.0" y="340.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="490.0" y="247.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="490.0" y="247.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
         <omgdi:waypoint x="490.0" y="357.0"></omgdi:waypoint>
         <omgdi:waypoint x="610.0" y="357.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="490.0" y="357.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="490.0" y="357.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
         <omgdi:waypoint x="437.0" y="385.0"></omgdi:waypoint>
         <omgdi:waypoint x="437.0" y="440.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="385.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="437.0" y="385.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
         <omgdi:waypoint x="490.0" y="467.0"></omgdi:waypoint>
         <omgdi:waypoint x="550.0" y="467.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="490.0" y="467.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="490.0" y="467.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
         <omgdi:waypoint x="655.0" y="467.0"></omgdi:waypoint>
         <omgdi:waypoint x="720.0" y="467.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="655.0" y="467.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="655.0" y="467.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
         <omgdi:waypoint x="772.0" y="495.0"></omgdi:waypoint>
         <omgdi:waypoint x="772.0" y="570.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="772.0" y="495.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="772.0" y="495.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow12" id="BPMNEdge_flow12">
         <omgdi:waypoint x="720.0" y="597.0"></omgdi:waypoint>
         <omgdi:waypoint x="655.0" y="597.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="681.0" y="597.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="681.0" y="597.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13">
         <omgdi:waypoint x="550.0" y="597.0"></omgdi:waypoint>
         <omgdi:waypoint x="490.0" y="597.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="512.0" y="597.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="512.0" y="597.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow14" id="BPMNEdge_flow14">
         <omgdi:waypoint x="437.0" y="625.0"></omgdi:waypoint>
         <omgdi:waypoint x="437.0" y="670.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="625.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="24.0" x="437.0" y="625.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>