Kaynağa Gözat

-修改流程
-添加邮件通知

jiangbiao 2 yıl önce
ebeveyn
işleme
bd858a40fb

+ 64 - 36
master/src/main/java/com/ruoyi/project/apply/controller/TApplyOfflinevalveController.java

@@ -12,12 +12,17 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.framework.interceptor.annotation.RepeatSubmit;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.project.apply.domain.TApplyOfflinevalve;
 import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
 import com.ruoyi.project.approve.damain.DevTask;
+import com.ruoyi.project.listener.apply.valve.EndFailListener;
+import com.ruoyi.project.listener.apply.valve.EndSuccessListener;
+import com.ruoyi.project.listener.apply.valve.FlowListener;
+import com.ruoyi.project.listener.apply.valve.NextTaskListener;
 import com.ruoyi.project.plant.domain.TStaffmgr;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.service.ISysUserService;
@@ -99,6 +104,7 @@ public class TApplyOfflinevalveController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('apply:offlinevalve:add')")
     @Log(title = "安全阀离线切出申请", businessType = BusinessType.INSERT)
+    @RepeatSubmit
     @PostMapping
     public AjaxResult add(@RequestBody TApplyOfflinevalve tApplyOfflinevalve) {
         Long userId = getUserId();
@@ -109,7 +115,7 @@ public class TApplyOfflinevalveController extends BaseController {
         tApplyOfflinevalve.setCreatedate(new Date());
         tApplyOfflinevalve.setCreaterCode(userId.toString());
         if (StringUtils.isNotEmpty(tApplyOfflinevalve.getRemarks()) && (!tApplyOfflinevalve.getRemarks().endsWith(";") || !tApplyOfflinevalve.getRemarks().endsWith(";")))
-            tApplyOfflinevalve.setRemarks(tApplyOfflinevalve.getRemarks() + ";");
+            tApplyOfflinevalve.setRemarks("申请人-" + getNickName() + ":" + tApplyOfflinevalve.getRemarks() + ";");
         tApplyOfflinevalveService.insertTApplyOfflinevalve(tApplyOfflinevalve);
 
         // 开始申请流程
@@ -120,14 +126,37 @@ public class TApplyOfflinevalveController extends BaseController {
         Authentication.setAuthenticatedUserId(applyUser);//设置当前申请人
         Map<String, Object> variables = new HashMap<>();
         variables.put("applyuser", applyUser);
-        variables.put("confirmer", tApplyOfflinevalve.getConfirmer());
-        variables.put("executor", tApplyOfflinevalve.getExecutor());
+        String confirmers = tApplyOfflinevalve.getConfirmer();
+        StringBuilder confirmer = new StringBuilder();
+        for (String staffId : confirmers.split(",")) {
+            SysUser user = userService.selectUserByStaffId(staffId);
+            confirmer.append(user.getUserId()).append(",");
+        }
+        if (StringUtils.isNotEmpty(confirmer.toString())) {
+            confirmer = new StringBuilder(confirmer.substring(0, confirmer.length() - 1));
+        }
+        variables.put("confirmer", confirmer.toString());
+        TStaffmgr tStaffmgr = new TStaffmgr();
+        tStaffmgr.setActualposts("12");
+        StringBuilder executor = new StringBuilder();
+        for (SysUser user : userService.selectUserPost(tStaffmgr)) {
+            executor.append(user.getUserId().toString()).append(",");
+        }
+        if (StringUtils.isNotEmpty(executor.toString())) {
+            executor = new StringBuilder(executor.substring(0, executor.length() - 1));
+        }
+        variables.put("executor", executor.toString());
+        variables.put("nextTaskListener", new NextTaskListener());
+        variables.put("flowListener", new FlowListener());
+        variables.put("endSuccessListener", new EndSuccessListener());
+        variables.put("endFailListener", new EndFailListener());
+        tApplyOfflinevalveService.updateTApplyOfflinevalve(tApplyOfflinevalve);
         //采用key来启动流程定义并设置流程变量,返回流程实例
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("offlinevalve", String.valueOf(businessKey), variables);
         logger.info("流程定义id:" + pi.getProcessDefinitionId());
         logger.info("流程实例id:" + pi.getProcessInstanceId());
         tApplyOfflinevalve.setProcessId(pi.getProcessInstanceId());
-        tApplyOfflinevalveService.updateTApplyOfflinevalve(tApplyOfflinevalve);
+
 
         // 申请人申请直接通过
         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@@ -143,6 +172,7 @@ public class TApplyOfflinevalveController extends BaseController {
     }
 
     @Log(title = "安全阀离线切出申请审核处理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit
     @PutMapping("/handle")
     public AjaxResult handle(@RequestBody DevTask devTask) {
         //更新数据
@@ -158,9 +188,7 @@ public class TApplyOfflinevalveController extends BaseController {
         String taskName = task.getName();//实例名
         // 添加备注
         String remarks = StringUtils.isEmpty(tApplyOfflinevalve.getRemarks()) ? "" : tApplyOfflinevalve.getRemarks();
-        if (taskName.contains("临时措施确认人")) {
-            taskName = "临时措施确认人";
-        } else if (taskName.contains("信息确认人")) {
+        if (taskName.contains("信息确认人")) {
             taskName = "信息确认人";
         }
         //流程审批意见
@@ -185,24 +213,25 @@ public class TApplyOfflinevalveController extends BaseController {
         // 根据实例名判断当前流程节点
         Map<String, Object> param = new HashMap<>();
         switch (task.getName()) {
-            case "临时措施确认人1":
-            case "临时措施确认人2":
+            case "临时措施制定人":
+                form.setConfirmer(getUserId().toString());
+                form.setConfirmerName(getNickName());
+                break;
+            case "临时措施确认人":
                 form.setConfirmer(getUserId().toString());
                 form.setConfirmerName(getNickName());
                 form.setTemporaryTime(new Date());
-                if ("临时措施确认人2".equals(task.getName())) {
-                    //查询经理
-                    TStaffmgr tStaffmgr = new TStaffmgr();
-                    tStaffmgr.setActualposts("24,26");
-                    StringBuilder approvers = new StringBuilder();
-                    for (SysUser user : userService.selectUserPost(tStaffmgr)) {
-                        approvers.append(user.getUserId().toString()).append(",");
-                    }
-                    if (StringUtils.isNotEmpty(approvers.toString())) {
-                        approvers = new StringBuilder(approvers.substring(0, approvers.length() - 1));
-                    }
-                    param.put("approver", approvers.toString());
+                //查询经理
+                TStaffmgr tStaffmgr = new TStaffmgr();
+                tStaffmgr.setActualposts("24,26");
+                StringBuilder approvers = new StringBuilder();
+                for (SysUser user : userService.selectUserPost(tStaffmgr)) {
+                    approvers.append(user.getUserId().toString()).append(",");
+                }
+                if (StringUtils.isNotEmpty(approvers.toString())) {
+                    approvers = new StringBuilder(approvers.substring(0, approvers.length() - 1));
                 }
+                param.put("approver", approvers.toString());
                 break;
             case "临时措施执行人":
                 form.setExecutor(getUserId().toString());
@@ -218,32 +247,31 @@ public class TApplyOfflinevalveController extends BaseController {
                 param.put("infoconfirmer", tApplyOfflinevalve.getConfirmer());
                 break;
             case "信息确认人":
-            case "信息确认人2":
+                param.put("lockConfirmer", form.getLockConfirmer1());//设置上锁确认人
+                form.setLockConfirmer1(null);
+                break;
+            case "确认人":
+                // 如果上锁确认人1不为空上锁确认人2即信息确认人2
                 form.setInfoConfirmer(getUserId().toString());
                 form.setInfoConfirmerName(getNickName());
+                form.setStatus(1L);//信息确认人2确认后申请单状态为已完成
                 form.setConfirmTime(new Date());
-                // 如果上锁确认人1不为空上锁确认人2即信息确认人2
-                if ("信息确认人2".equals(task.getName())) {
-                    form.setStatus(1L);//信息确认人2确认后申请单状态为已完成
-                    if (StringUtils.isNotEmpty(tApplyOfflinevalve.getLockConfirmer1())) {
-                        form.setLockConfirmer2(getUserId().toString());
-                        form.setLockConfirmer2Name(getNickName());
-                    } else {
-                        form.setLockConfirm("NA");//否则确认是否已上锁为NA
-                    }
+                if (StringUtils.isNotEmpty(tApplyOfflinevalve.getLockConfirmer1())) {
+                    form.setLockConfirmer2(getUserId().toString());
+                    form.setLockConfirmer2Name(getNickName());
+                } else {
+                    form.setLockConfirm("NA");//否则确认是否已上锁为NA
                 }
-                param.put("lockConfirmer", form.getLockConfirmer1());//设置上锁确认人
-                form.setLockConfirmer1(null);
                 break;
-            case "确认人1":
+            case "上锁人":
                 form.setLockConfirmer1(getUserId().toString());
                 form.setLockConfirmer1Name(getNickName());
                 break;
         }
         //网关判断
-        if (StringUtils.isNotEmpty(tApplyOfflinevalve.getDisassembly()) && !"NA".equals(tApplyOfflinevalve.getDisassembly())) {
+        if (StringUtils.isNotEmpty(tApplyOfflinevalve.getDisassembly()) && "是".equals(tApplyOfflinevalve.getDisassembly())) {
             param.put("is_unlock", "1");
-        } else if (StringUtils.isNotEmpty(tApplyOfflinevalve.getDisassembly()) && "NA".equals(tApplyOfflinevalve.getDisassembly())) {
+        } else if (StringUtils.isNotEmpty(tApplyOfflinevalve.getDisassembly()) && !"是".equals(tApplyOfflinevalve.getDisassembly())) {
             param.put("is_unlock", "0");
         }
         param.put("condition", devTask.getCondition());

+ 29 - 4
master/src/main/java/com/ruoyi/project/apply/controller/TApplySafetychangeController.java

@@ -12,6 +12,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.framework.interceptor.annotation.RepeatSubmit;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.page.TableDataInfo;
@@ -108,6 +109,7 @@ public class TApplySafetychangeController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('apply:safetychange:add')")
     @Log(title = "组织保护措施状态变更申请", businessType = BusinessType.INSERT)
+    @RepeatSubmit
     @PostMapping
     public AjaxResult add(@RequestBody TApplySafetychange tApplySafetychange) {
         String userId = getUserId().toString();
@@ -117,7 +119,7 @@ public class TApplySafetychangeController extends BaseController {
         tApplySafetychange.setCreatedate(new Date());
         tApplySafetychange.setCreaterCode(getUserId().toString());
         tApplySafetychange.setConfirmer(tApplySafetychange.getSafaer());
-        tApplySafetychange.setConfirmerName(tApplySafetychange.getSafaerName());
+//        tApplySafetychange.setConfirmerName(tApplySafetychange.getSafaerName());
         if(StringUtils.isNotEmpty(tApplySafetychange.getRemarks())&&(!tApplySafetychange.getRemarks().endsWith(";")||!tApplySafetychange.getRemarks().endsWith(";")))
             tApplySafetychange.setRemarks(tApplySafetychange.getRemarks()+";");
         tApplySafetychangeService.insertTApplySafetychange(tApplySafetychange);
@@ -129,9 +131,18 @@ public class TApplySafetychangeController extends BaseController {
         Authentication.setAuthenticatedUserId(userId);//设置当前申请人
         Map<String, Object> variables = new HashMap<>();
         variables.put("applyuser", userId);
-        variables.put("confirmer", tApplySafetychange.getConfirmer());
+        String confirmers = tApplySafetychange.getConfirmer();
+        StringBuilder confirmer= new StringBuilder();
+        for (String staffId : confirmers.split(",")) {
+            SysUser user = userService.selectUserByStaffId(staffId);
+            confirmer.append(user.getUserId()).append(",");
+        }
+        if (StringUtils.isNotEmpty(confirmer.toString())) {
+            confirmer = new StringBuilder(confirmer.substring(0, confirmer.length() - 1));
+        }
+        variables.put("confirmer", confirmer.toString());
         variables.put("executor", tApplySafetychange.getExecutor());
-        variables.put("safaer", tApplySafetychange.getSafaer());
+        variables.put("safaer", confirmer.toString());
         //查询经理
         TStaffmgr tStaffmgr = new TStaffmgr();
         tStaffmgr.setActualposts("24,26");
@@ -174,6 +185,7 @@ public class TApplySafetychangeController extends BaseController {
     }
 
     @Log(title = "组织保护措施状态变更申请审核处理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit
     @PutMapping("/handle")
     public AjaxResult handle(@RequestBody DevTask devTask) {
         TApplySafetychange form = devTask.getSafetychange();
@@ -213,6 +225,8 @@ public class TApplySafetychangeController extends BaseController {
         Map<String, Object> param = new HashMap<>();
         switch (task.getName()) {
             case "安全评估人1":
+                form.setSafaer(getUserId().toString());
+                form.setSafaerName(getNickName());
                 form.setSafaTime(new Date());
                 break;
             case "批准人":
@@ -226,6 +240,8 @@ public class TApplySafetychangeController extends BaseController {
                 form.setExecutionTime(new Date());
                 break;
             case "措施确认人":
+                form.setConfirmerName(getNickName());
+                form.setConfirmer(getUserId().toString());
                 form.setConfirmTime(new Date());
                 break;
             case "变更执行人":
@@ -234,7 +250,16 @@ public class TApplySafetychangeController extends BaseController {
                 form.setChangeExecutorTime(new Date());
                 break;
             case "安全评估人2":
-                param.put("resetConfirmer1", form.getResetConfirmer1());
+                TStaffmgr tStaffmgr = new TStaffmgr();
+                tStaffmgr.setActualposts("12");
+                StringBuilder resetConfirmer1 = new StringBuilder();
+                for (SysUser user : userService.selectUserPost(tStaffmgr)) {
+                    resetConfirmer1.append(user.getUserId().toString()).append(",");
+                }
+                if (StringUtils.isNotEmpty(resetConfirmer1.toString())) {
+                    resetConfirmer1 = new StringBuilder(resetConfirmer1.substring(0, resetConfirmer1.length() - 1));
+                }
+                param.put("resetConfirmer1", resetConfirmer1.toString());
                 break;
             case "确认人1":
                 param.put("resetConfirmer2", tApplySafetychange.getConfirmer());

+ 6 - 5
master/src/main/java/com/ruoyi/project/apply/service/impl/TApplyOfflinevalveServiceImpl.java

@@ -1,11 +1,12 @@
 package com.ruoyi.project.apply.service.impl;
 
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.project.apply.mapper.TApplyOfflinevalveMapper;
 import com.ruoyi.project.apply.domain.TApplyOfflinevalve;
+import com.ruoyi.project.apply.mapper.TApplyOfflinevalveMapper;
 import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * 安全阀离线切出申请Service业务层处理
@@ -13,7 +14,7 @@ import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
  * @author ruoyi
  * @date 2023-02-08
  */
-@Service
+@Service("tApplyOfflinevalveService")
 public class TApplyOfflinevalveServiceImpl implements ITApplyOfflinevalveService
 {
     @Autowired

+ 81 - 0
master/src/main/java/com/ruoyi/project/listener/apply/valve/EndFailListener.java

@@ -0,0 +1,81 @@
+package com.ruoyi.project.listener.apply.valve;
+
+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.TApplyOfflinevalve;
+import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
+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("endFailListener")
+public class EndFailListener implements Serializable, ExecutionListener {
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateExecution execution) {
+        String businessKey = execution.getProcessInstanceBusinessKey();
+        ITApplyOfflinevalveService tApplyOfflinevalveService = (ITApplyOfflinevalveService) SpringContextUtils.getBean("tApplyOfflinevalveService");
+        TApplyOfflinevalve tApplyOfflinevalve = tApplyOfflinevalveService.selectTApplyOfflinevalveById(Long.valueOf(businessKey));
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        try {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(tApplyOfflinevalve.getApplicant()));
+            String email = sysUser.getEmail();
+            String apNo = tApplyOfflinevalve.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); \">Safety valve offline/cut-out 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>Safety valve offline/cut-out 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:" + html);
+            mailService.sendHtmlMail(email, "安全阀离线/切出申请:您的申请已被拒绝 Safety valve offline/cut-out application:Your application has been rejected (" + apNo + ")", html);
+        } catch (Exception e) {
+            logger.error("邮件发送失败" + JSON.toJSONString(e));
+        }
+    }
+}

+ 83 - 0
master/src/main/java/com/ruoyi/project/listener/apply/valve/EndSuccessListener.java

@@ -0,0 +1,83 @@
+package com.ruoyi.project.listener.apply.valve;
+
+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.TApplyOfflinevalve;
+import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
+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("endSuccessListener")
+public class EndSuccessListener implements Serializable, ExecutionListener {
+
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateExecution execution) {
+        String businessKey = execution.getProcessInstanceBusinessKey();
+        ITApplyOfflinevalveService tApplyOfflinevalveService = (ITApplyOfflinevalveService) SpringContextUtils.getBean("tApplyOfflinevalveService");
+        TApplyOfflinevalve tApplyOfflinevalve = tApplyOfflinevalveService.selectTApplyOfflinevalveById(Long.valueOf(businessKey));
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        try {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(tApplyOfflinevalve.getApplicant()));
+            String email = sysUser.getEmail();
+            String apNo = tApplyOfflinevalve.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); \">Safety valve offline/cut-out 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>Safety valve offline/cut-out 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:" + html);
+            mailService.sendHtmlMail(email, "安全阀离线/切出申请:您的申请已通过 Safety valve offline/cut-out application:Your application has been passed (" + apNo + ")", html);
+        } catch (Exception e) {
+            logger.error("邮件发送失败" + JSON.toJSONString(e));
+        }
+
+    }
+}

+ 89 - 0
master/src/main/java/com/ruoyi/project/listener/apply/valve/FlowListener.java

@@ -0,0 +1,89 @@
+package com.ruoyi.project.listener.apply.valve;
+
+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.TApplyOfflinevalve;
+import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.service.ISysUserService;
+import org.activiti.bpmn.model.FlowElement;
+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("flowListener")
+public class FlowListener implements Serializable, ExecutionListener {
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateExecution execution) {
+        FlowElement currentFlowElement = execution.getCurrentFlowElement();
+        String id = currentFlowElement.getId();
+        if (!id.equals("toApplyUser")) {
+            return;
+        }
+        String businessKey = execution.getProcessInstanceBusinessKey();
+        ITApplyOfflinevalveService tApplyOfflinevalveService = (ITApplyOfflinevalveService) SpringContextUtils.getBean("tApplyOfflinevalveService");
+        TApplyOfflinevalve tApplyOfflinevalve = tApplyOfflinevalveService.selectTApplyOfflinevalveById(Long.valueOf(businessKey));
+        ISysUserService sysUserService = (ISysUserService) SpringContextUtils.getBean("sysUserService");
+        IMailService mailService = (IMailService) SpringContextUtils.getBean("mailService");
+        try {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(tApplyOfflinevalve.getApplicant()));
+            String email = sysUser.getEmail();
+            String apNo = tApplyOfflinevalve.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); \">Safety valve offline/cut-out 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>Safety valve offline/cut-out 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:" + html);
+            mailService.sendHtmlMail(email, "安全阀离线/切出申请:您的申请已被驳回 Safety valve offline/cut-out 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/valve/NextTaskListener.java

@@ -0,0 +1,104 @@
+package com.ruoyi.project.listener.apply.valve;
+
+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.TApplyOfflinevalve;
+import com.ruoyi.project.apply.service.ITApplyOfflinevalveService;
+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("nextTaskListener")
+public class NextTaskListener implements Serializable, TaskListener {
+
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public void notify(DelegateTask delegateTask) {
+        String businessKey = delegateTask.getExecution().getProcessInstanceBusinessKey();
+        ITApplyOfflinevalveService tApplyOfflinevalveService = (ITApplyOfflinevalveService) SpringContextUtils.getBean("tApplyOfflinevalveService");
+        TApplyOfflinevalve tApplyOfflinevalve = tApplyOfflinevalveService.selectTApplyOfflinevalveById(Long.valueOf(businessKey));
+        logger.info("==========================businessKey:" + businessKey);
+        logger.info("==========================tApplyOfflinevalve:" + tApplyOfflinevalve);
+        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 = tApplyOfflinevalve.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); \">Safety valve offline/cut-out 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 safety valve offline/cut-out 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:" + html);
+                mailService.sendHtmlMail(email, "安全阀离线/切出申请:您有一个新的待办任务 Safety valve offline/cut-out application:You have a new to-do task (" + apNo + ")", html);
+            } catch (Exception e) {
+                logger.error("邮件发送失败" + JSON.toJSONString(e));
+            }
+        }
+        logger.info("====================================本次通过邮件发送给:" + to);
+    }
+}

+ 2 - 0
master/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java

@@ -1,5 +1,6 @@
 package com.ruoyi.project.system.mapper;
 
+import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
 import com.ruoyi.project.plant.domain.TStaffmgr;
 import com.ruoyi.project.system.domain.SysUser;
 import org.apache.ibatis.annotations.Param;
@@ -38,6 +39,7 @@ public interface SysUserMapper
     public List<SysUser> selectUserByDept(Long deptId);
     public List<SysUser> selectAllUser();
 
+    @DataScope(deptAlias = "d")
     public List<SysUser> selectUserPost(TStaffmgr tStaffmgr);
 
     public List<SysUser> selectUserListByRoleAndDept(SysUser sysUser);

+ 63 - 21
master/src/main/resources/processes/apply/offlinevalve.bpmn

@@ -2,16 +2,32 @@
 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
   <process id="offlinevalve" name="安全阀离线/切出申请流程" isExecutable="true">
     <startEvent id="startevent1" name="Start"></startEvent>
-    <userTask id="confirmertask1" name="临时措施确认人1" activiti:candidateUsers="#{confirmer}"></userTask>
-    <userTask id="executortask" name="临时措施执行人" activiti:assignee="#{executor}"></userTask>
+    <userTask id="confirmertask1" name="临时措施制定人" activiti:candidateUsers="#{confirmer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <userTask id="executortask" name="临时措施执行人" activiti:candidateUsers="#{executor}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
     <sequenceFlow id="flow1" name="通过" sourceRef="confirmertask1" targetRef="executortask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="confirmertask2" name="临时措施确认人2" activiti:candidateUsers="#{confirmer}"></userTask>
+    <userTask id="confirmertask2" name="临时措施确认人" activiti:candidateUsers="#{confirmer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
     <sequenceFlow id="flow2" name="通过" sourceRef="executortask" targetRef="confirmertask2">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="approvertask" name="批准人" activiti:candidateUsers="#{approver}"></userTask>
+    <userTask id="approvertask" name="批准人" activiti:candidateUsers="#{approver}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
     <sequenceFlow id="flow3" name="通过" sourceRef="confirmertask2" targetRef="approvertask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
@@ -19,19 +35,35 @@
     <sequenceFlow id="flow4" name="通过" sourceRef="approvertask" targetRef="isunlock">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <endEvent id="endevent1" name="End"></endEvent>
-    <userTask id="infoconfirmertask2" name="信息确认人2" activiti:assignee="#{infoconfirmer}"></userTask>
-    <sequenceFlow id="flow7" name="NA" sourceRef="isunlock" targetRef="infoconfirmertask2">
+    <endEvent id="endevent1" name="End">
+      <extensionElements>
+        <activiti:executionListener event="end" delegateExpression="${endSuccessListener}"></activiti:executionListener>
+      </extensionElements>
+    </endEvent>
+    <userTask id="infoconfirmertask2" name="确认人" activiti:assignee="#{infoconfirmer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow7" name="否/NA" sourceRef="isunlock" targetRef="infoconfirmertask2">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${is_unlock == 0}]]></conditionExpression>
     </sequenceFlow>
     <sequenceFlow id="flow8" name="通过" sourceRef="infoconfirmertask2" targetRef="endevent1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="infoconfirmertask" name="信息确认人" activiti:assignee="#{infoconfirmer}"></userTask>
-    <sequenceFlow id="flow9" name="是/否" sourceRef="isunlock" targetRef="infoconfirmertask">
+    <userTask id="infoconfirmertask" name="信息确认人" activiti:assignee="#{infoconfirmer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow9" name="是" sourceRef="isunlock" targetRef="infoconfirmertask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${is_unlock == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="lockconfirmertask" name="确认人1" activiti:assignee="#{lockConfirmer}"></userTask>
+    <userTask id="lockconfirmertask" name="上锁人" activiti:assignee="#{lockConfirmer}">
+      <extensionElements>
+        <activiti:taskListener event="create" delegateExpression="${nextTaskListener}"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
     <sequenceFlow id="flow10" name="通过" sourceRef="infoconfirmertask" targetRef="lockconfirmertask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
@@ -43,13 +75,23 @@
     <sequenceFlow id="flow14" name="通过" sourceRef="applytask" targetRef="confirmertask1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="flow15" name="驳回" sourceRef="confirmertask1" targetRef="applytask">
+    <sequenceFlow id="toApplyUser" name="驳回" sourceRef="confirmertask1" targetRef="applytask">
+      <extensionElements>
+        <activiti:executionListener event="take" delegateExpression="${flowListener}"></activiti:executionListener>
+      </extensionElements>
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="flow16" name="驳回" sourceRef="approvertask" targetRef="confirmertask1">
+    <sequenceFlow id="toConfirmer" name="驳回" sourceRef="approvertask" targetRef="confirmertask1">
+      <extensionElements>
+        <activiti:executionListener event="take" delegateExpression="${flowListener}"></activiti:executionListener>
+      </extensionElements>
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
     </sequenceFlow>
-    <endEvent id="endevent2" name="End"></endEvent>
+    <endEvent id="endevent2" name="End">
+      <extensionElements>
+        <activiti:executionListener event="end" delegateExpression="${endFailListener}"></activiti:executionListener>
+      </extensionElements>
+    </endEvent>
     <sequenceFlow id="flow17" name="拒绝" sourceRef="approvertask" targetRef="endevent2">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 0}]]></conditionExpression>
     </sequenceFlow>
@@ -127,7 +169,7 @@
         <omgdi:waypoint x="417.0" y="560.0"></omgdi:waypoint>
         <omgdi:waypoint x="416.0" y="600.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="15.0" x="421.0" y="568.0"></omgdc:Bounds>
+          <omgdc:Bounds height="42.0" width="15.0" x="421.0" y="568.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
@@ -141,7 +183,7 @@
         <omgdi:waypoint x="397.0" y="540.0"></omgdi:waypoint>
         <omgdi:waypoint x="355.0" y="540.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="27.0" x="368.0" y="547.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="12.0" x="368.0" y="547.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
@@ -170,22 +212,22 @@
           <omgdc:Bounds height="14.0" width="24.0" x="417.0" y="135.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15">
+      <bpmndi:BPMNEdge bpmnElement="toApplyUser" id="BPMNEdge_toApplyUser">
         <omgdi:waypoint x="470.0" y="197.0"></omgdi:waypoint>
         <omgdi:waypoint x="538.0" y="197.0"></omgdi:waypoint>
         <omgdi:waypoint x="538.0" y="107.0"></omgdi:waypoint>
         <omgdi:waypoint x="470.0" y="107.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="24.0" x="509.0" y="149.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="470.0" y="197.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16">
+      <bpmndi:BPMNEdge bpmnElement="toConfirmer" id="BPMNEdge_toConfirmer">
         <omgdi:waypoint x="470.0" y="467.0"></omgdi:waypoint>
-        <omgdi:waypoint x="537.0" y="467.0"></omgdi:waypoint>
-        <omgdi:waypoint x="537.0" y="197.0"></omgdi:waypoint>
+        <omgdi:waypoint x="535.0" y="467.0"></omgdi:waypoint>
+        <omgdi:waypoint x="535.0" y="197.0"></omgdi:waypoint>
         <omgdi:waypoint x="470.0" y="197.0"></omgdi:waypoint>
         <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="14.0" width="24.0" x="509.0" y="316.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="470.0" y="467.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow17" id="BPMNEdge_flow17">

+ 111 - 105
master/src/main/resources/processes/apply/safetychange.bpmn

@@ -2,189 +2,195 @@
 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
   <process id="safetychange" name="组织保护措施状态变更申请流程" isExecutable="true">
     <startEvent id="startevent1" name="Start"></startEvent>
-    <userTask id="safaertask1" name="安全评估人1" activiti:assignee="#{safaer}"></userTask>
-    <userTask id="approvertask" name="批准人" activiti:assignee="#{approver}"></userTask>
-    <userTask id="executortask" name="措施执行人" activiti:assignee="#{executor}"></userTask>
-    <sequenceFlow id="flow3" name="通过" sourceRef="approvertask" targetRef="executortask">
+    <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>
+    <sequenceFlow id="flow2" name="提交" sourceRef="applytask" targetRef="safaertask1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="confirmertask" name="措施确认人" activiti:assignee="#{confirmer}"></userTask>
-    <sequenceFlow id="flow4" name="通过" sourceRef="executortask" targetRef="confirmertask">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
+    <sequenceFlow id="flow3" name="驳回" sourceRef="safaertask1" targetRef="applytask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="changetask" name="变更执行人" activiti:assignee="#{changeExecutor}"></userTask>
-    <sequenceFlow id="flow5" name="通过" sourceRef="confirmertask" targetRef="changetask">
+    <userTask id="approvertask" name="批准人" activiti:candidateUsers="#{approver}"></userTask>
+    <sequenceFlow id="flow4" name="通过" sourceRef="safaertask1" targetRef="approvertask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="resetConfirmer1" name="确认人1" activiti:assignee="#{resetConfirmer1}"></userTask>
-    <sequenceFlow id="flow6" name="通过" sourceRef="safaertask2" targetRef="resetConfirmer1">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
+    <sequenceFlow id="flow5" name="驳回" sourceRef="approvertask" targetRef="safaertask1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
     </sequenceFlow>
+    <endEvent id="endevent1" name="End"></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>
-    <sequenceFlow id="flow7" name="通过" sourceRef="resetConfirmer1" targetRef="resetConfirmer2"></sequenceFlow>
-    <userTask id="applytask" name="申请人提交申请" activiti:assignee="#{applyuser}"></userTask>
-    <sequenceFlow id="flow12" name="通过" sourceRef="safaertask1" targetRef="approvertask">
+    <endEvent id="endevent2" name="End"></endEvent>
+    <sequenceFlow id="flow8" name="通过" sourceRef="approvertask" targetRef="executortask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="flow13" name="驳回" sourceRef="approvertask" targetRef="safaertask1">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
-    </sequenceFlow>
-    <endEvent id="endevent1" name="End"></endEvent>
-    <sequenceFlow id="flow14" name="通过" sourceRef="resetConfirmer2" targetRef="endevent1">
+    <sequenceFlow id="flow9" name="通过" sourceRef="executortask" targetRef="confirmertask">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <endEvent id="endevent2" name="End"></endEvent>
-    <sequenceFlow id="flow15" name="拒绝" sourceRef="safaertask1" targetRef="endevent2">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 0}]]></conditionExpression>
+    <sequenceFlow id="flow10" name="通过" sourceRef="confirmertask" targetRef="changetask">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="flow16" name="拒绝" sourceRef="approvertask" targetRef="endevent2">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 0}]]></conditionExpression>
+    <sequenceFlow id="flow11" name="通过" sourceRef="changetask" targetRef="safaertask2">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <userTask id="safaertask2" name="安全评估人2" activiti:assignee="#{safaer}"></userTask>
-    <sequenceFlow id="flow17" name="通过" sourceRef="changetask" targetRef="safaertask2">
+    <sequenceFlow id="flow12" name="通过" sourceRef="safaertask2" targetRef="resetConfirmer1">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="flow18" sourceRef="startevent1" targetRef="applytask"></sequenceFlow>
-    <sequenceFlow id="flow19" sourceRef="applytask" targetRef="safaertask1">
+    <sequenceFlow id="flow13" name="通过" sourceRef="resetConfirmer1" targetRef="resetConfirmer2">
       <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
-    <sequenceFlow id="flow20" name="驳回" sourceRef="safaertask1" targetRef="applytask">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 2}]]></conditionExpression>
+    <sequenceFlow id="flow14" name="通过" sourceRef="resetConfirmer2" targetRef="endevent2">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${condition == 1}]]></conditionExpression>
     </sequenceFlow>
   </process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_safetychange">
     <bpmndi:BPMNPlane bpmnElement="safetychange" id="BPMNPlane_safetychange">
       <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="410.0" y="1.0"></omgdc:Bounds>
+        <omgdc:Bounds height="35.0" width="35.0" x="420.0" y="60.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="applytask" id="BPMNShape_applytask">
+        <omgdc:Bounds height="55.0" width="105.0" x="385.0" y="120.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="safaertask1" id="BPMNShape_safaertask1">
-        <omgdc:Bounds height="55.0" width="105.0" x="375.0" y="219.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="385.0" y="220.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="approvertask" id="BPMNShape_approvertask">
-        <omgdc:Bounds height="55.0" width="105.0" x="375.0" y="343.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="385.0" y="330.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="610.0" y="340.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="executortask" id="BPMNShape_executortask">
-        <omgdc:Bounds height="55.0" width="105.0" x="375.0" y="451.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="385.0" y="440.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="confirmertask" id="BPMNShape_confirmertask">
-        <omgdc:Bounds height="55.0" width="105.0" x="520.0" y="451.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="550.0" y="440.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="changetask" id="BPMNShape_changetask">
-        <omgdc:Bounds height="55.0" width="105.0" x="670.0" y="451.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="720.0" y="440.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="safaertask2" id="BPMNShape_safaertask2">
+        <omgdc:Bounds height="55.0" width="105.0" x="720.0" y="570.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="resetConfirmer1" id="BPMNShape_resetConfirmer1">
-        <omgdc:Bounds height="55.0" width="105.0" x="520.0" y="570.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="550.0" y="570.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="resetConfirmer2" id="BPMNShape_resetConfirmer2">
-        <omgdc:Bounds height="71.0" width="105.0" x="377.0" y="562.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="applytask" id="BPMNShape_applytask">
-        <omgdc:Bounds height="55.0" width="105.0" x="375.0" y="91.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="412.0" y="670.0"></omgdc:Bounds>
+        <omgdc:Bounds height="55.0" width="105.0" x="385.0" y="570.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape bpmnElement="endevent2" id="BPMNShape_endevent2">
-        <omgdc:Bounds height="35.0" width="35.0" x="620.0" y="353.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="safaertask2" id="BPMNShape_safaertask2">
-        <omgdc:Bounds height="55.0" width="105.0" x="670.0" y="570.0"></omgdc:Bounds>
+        <omgdc:Bounds height="35.0" width="35.0" x="420.0" y="670.0"></omgdc:Bounds>
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="437.0" y="95.0"></omgdi:waypoint>
+        <omgdi:waypoint x="437.0" y="120.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <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>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
-        <omgdi:waypoint x="427.0" y="398.0"></omgdi:waypoint>
-        <omgdi:waypoint x="427.0" y="451.0"></omgdi:waypoint>
+        <omgdi:waypoint x="385.0" y="247.0"></omgdi:waypoint>
+        <omgdi:waypoint x="293.0" y="247.0"></omgdi:waypoint>
+        <omgdi:waypoint x="293.0" y="198.0"></omgdi:waypoint>
+        <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="24.0" x="427.0" y="398.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="301.0" y="189.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
-        <omgdi:waypoint x="480.0" y="478.0"></omgdi:waypoint>
-        <omgdi:waypoint x="520.0" y="478.0"></omgdi:waypoint>
+        <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="24.0" x="480.0" y="478.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="275.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
-        <omgdi:waypoint x="625.0" y="478.0"></omgdi:waypoint>
-        <omgdi:waypoint x="670.0" y="478.0"></omgdi:waypoint>
+        <omgdi:waypoint x="385.0" y="357.0"></omgdi:waypoint>
+        <omgdi:waypoint x="298.0" y="357.0"></omgdi:waypoint>
+        <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="24.0" x="625.0" y="478.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="301.0" y="300.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
-        <omgdi:waypoint x="670.0" y="597.0"></omgdi:waypoint>
-        <omgdi:waypoint x="625.0" y="597.0"></omgdi:waypoint>
+        <omgdi:waypoint x="490.0" y="247.0"></omgdi:waypoint>
+        <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="24.0" x="631.0" y="597.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="490.0" y="247.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
-        <omgdi:waypoint x="520.0" y="597.0"></omgdi:waypoint>
-        <omgdi:waypoint x="482.0" y="597.0"></omgdi:waypoint>
+        <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="24.0" x="491.0" y="597.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="490.0" y="357.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow12" id="BPMNEdge_flow12">
-        <omgdi:waypoint x="427.0" y="274.0"></omgdi:waypoint>
-        <omgdi:waypoint x="427.0" y="343.0"></omgdi:waypoint>
+      <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="24.0" x="427.0" y="274.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="385.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13">
-        <omgdi:waypoint x="375.0" y="370.0"></omgdi:waypoint>
-        <omgdi:waypoint x="287.0" y="370.0"></omgdi:waypoint>
-        <omgdi:waypoint x="287.0" y="246.0"></omgdi:waypoint>
-        <omgdi:waypoint x="375.0" y="246.0"></omgdi:waypoint>
+      <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="24.0" x="321.0" y="370.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="490.0" y="467.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow14" id="BPMNEdge_flow14">
-        <omgdi:waypoint x="429.0" y="633.0"></omgdi:waypoint>
-        <omgdi:waypoint x="429.0" y="670.0"></omgdi:waypoint>
+      <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="24.0" x="429.0" y="633.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="655.0" y="467.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15">
-        <omgdi:waypoint x="480.0" y="246.0"></omgdi:waypoint>
-        <omgdi:waypoint x="637.0" y="246.0"></omgdi:waypoint>
-        <omgdi:waypoint x="637.0" y="353.0"></omgdi:waypoint>
+      <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="24.0" x="606.0" y="311.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="772.0" y="495.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16">
-        <omgdi:waypoint x="480.0" y="370.0"></omgdi:waypoint>
-        <omgdi:waypoint x="620.0" y="370.0"></omgdi:waypoint>
+      <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="24.0" x="522.0" y="370.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="681.0" y="597.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow17" id="BPMNEdge_flow17">
-        <omgdi:waypoint x="722.0" y="506.0"></omgdi:waypoint>
-        <omgdi:waypoint x="722.0" y="570.0"></omgdi:waypoint>
+      <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="24.0" x="722.0" y="506.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="512.0" y="597.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow18" id="BPMNEdge_flow18">
-        <omgdi:waypoint x="427.0" y="36.0"></omgdi:waypoint>
-        <omgdi:waypoint x="427.0" y="91.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow19" id="BPMNEdge_flow19">
-        <omgdi:waypoint x="427.0" y="146.0"></omgdi:waypoint>
-        <omgdi:waypoint x="427.0" y="219.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow20" id="BPMNEdge_flow20">
-        <omgdi:waypoint x="375.0" y="246.0"></omgdi:waypoint>
-        <omgdi:waypoint x="284.0" y="246.0"></omgdi:waypoint>
-        <omgdi:waypoint x="284.0" y="118.0"></omgdi:waypoint>
-        <omgdi:waypoint x="375.0" y="118.0"></omgdi:waypoint>
+      <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="291.0" y="171.0"></omgdc:Bounds>
+          <omgdc:Bounds height="14.0" width="100.0" x="437.0" y="625.0"></omgdc:Bounds>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>

+ 10 - 13
ui/src/views/apply/offlinevalve/index.vue

@@ -79,7 +79,7 @@
         >新增
         </el-button>
       </el-col>
-      <el-col :span="1.5">
+<!--      <el-col :span="1.5">
         <el-button
           type="success"
           icon="el-icon-edit"
@@ -89,7 +89,7 @@
           v-hasPermi="['apply:offlinevalve:edit']"
         >修改
         </el-button>
-      </el-col>
+      </el-col>-->
 <!--      <el-col :span="1.5">
         <el-button
           type="danger"
@@ -222,7 +222,7 @@
         <el-form-item label="离线原因" prop="offlineReason">
           <el-input type="textarea" v-model="form.offlineReason" placeholder="请输入离线原因"/>
         </el-form-item>
-        <el-form-item label="临时措施执行人" prop="executor">
+<!--        <el-form-item label="临时措施执行人" prop="executor">
           <el-select v-model="form.executor" placeholder="请选择临时措施执行人" clearable size="small" filterable style="width: 100%" @change="getExecutorName(form.executor)">
             <el-option
               v-for="item in executorList"
@@ -231,14 +231,14 @@
               :value="item.userId"
             ></el-option>
           </el-select>
-        </el-form-item>
+        </el-form-item>-->
         <el-form-item label="临时措施确认人" prop="confirmer">
-          <el-select v-model="form.confirmer" placeholder="请选择临时措施确认人" clearable size="small" filterable style="width: 100%" @change="getConfirmerName(form.confirmer)">
+          <el-select v-model="form.confirmer" placeholder="请选择临时措施确认人" clearable size="small" filterable style="width: 100%">
             <el-option
               v-for="item in confirmerList"
-              :key="item.userId"
-              :label="item.nickName"
-              :value="item.userId"
+              :key="item.dictValue"
+              :label="item.dictLabel"
+              :value="item.dictValue"
             ></el-option>
           </el-select>
         </el-form-item>
@@ -550,11 +550,8 @@ export default {
     }).then(response => {
       this.executorList = response;
     });
-    listUserPost({
-      actualposts:"24,26,18,14,16",
-      deptId:103
-    }).then(response => {
-      this.confirmerList = response;
+    this.getDicts("apply_safaer").then(response => {
+      this.confirmerList = response.data;
     });
     //设置表格高度对应屏幕高度
     this.$nextTick(() => {

+ 8 - 11
ui/src/views/apply/safetychange/index.vue

@@ -57,7 +57,7 @@
         >新增
         </el-button>
       </el-col>
-      <el-col :span="1.5">
+<!--      <el-col :span="1.5">
         <el-button
           type="success"
           icon="el-icon-edit"
@@ -67,7 +67,7 @@
           v-hasPermi="['apply:safetychange:edit']"
         >修改
         </el-button>
-      </el-col>
+      </el-col>-->
       <!--      <el-col :span="1.5">
               <el-button
                 type="danger"
@@ -211,12 +211,12 @@
         </el-form-item>
         <el-form-item label="安全评估人" prop="safaer">
           <el-select v-model="form.safaer" placeholder="请选择临时措施执行人" clearable size="small" filterable
-                     style="width: 100%" @change="getSafaerName(form.safaer)">
+                     style="width: 100%">
             <el-option
               v-for="item in safaerList"
-              :key="item.userId"
-              :label="item.nickName"
-              :value="item.userId"
+              :key="item.dictValue"
+              :label="item.dictLabel"
+              :value="item.dictValue"
             ></el-option>
           </el-select>
         </el-form-item>
@@ -563,11 +563,8 @@ export default {
     }).then(response => {
       this.executorList = response;
     });
-    listUserPost({
-      actualposts: "24,26,18,14,16",
-      deptId: 103
-    }).then(response => {
-      this.safaerList = response;
+    this.getDicts("apply_safaer").then(response => {
+      this.safaerList = response.data;
     });
   },
   methods: {

+ 6 - 6
ui/src/views/approve/approveDetail/offlinevalve-detail.vue

@@ -82,7 +82,7 @@
     <el-form ref="form" :model="form" label-position="left" :rules="rules" label-width="340px"
              style="margin-top: 30px">
       <div v-if="flag">
-        <div v-if="taskName=='临时措施确认人1'">
+        <div v-if="taskName=='临时措施制定人'">
           <el-form-item label="安全评估以及临时措施执行" prop="safa">
             <el-input type="textarea" v-model="form.safa" placeholder="请输入安全评估以及临时措施执行"/>
           </el-form-item>
@@ -94,7 +94,7 @@
             </el-radio-group>
           </el-form-item>
         </div>
-        <div v-if="taskName=='信息确认人'||(taskName=='信息确认人2'&&dataForm.disassembly=='NA')">
+        <div v-if="taskName=='信息确认人'||(taskName=='确认人'&&dataForm.disassembly!='是')">
           <el-row>
             <el-col span="12">
               <el-form-item label="离线安全阀是否已经复位" prop="resetConfirm">
@@ -122,7 +122,7 @@
                 </el-radio-group>
               </el-form-item>
             </el-col>
-            <div v-if="dataForm.disassembly!='NA'">
+            <div v-if="dataForm.disassembly=='是'">
               <el-col span="12">
                 <el-form-item label="离线安全复位后,是否已经重新上锁" prop="lockConfirm">
                   <el-radio-group v-model="form.lockConfirm">
@@ -134,7 +134,7 @@
               </el-col>
             </div>
           </el-row>
-          <div v-if="dataForm.disassembly!='NA'">
+          <div v-if="dataForm.disassembly=='是'">
             <el-form-item label="上锁确认人" prop="lockConfirmer1">
               <el-select v-model="form.lockConfirmer1" placeholder="请选择上锁确认人" clearable size="small" filterable
                          style="width: 100%">
@@ -182,13 +182,13 @@
       </div>
     </el-form>
     <span slot="footer" class="dialog-footer">
-      <el-button v-if="!this.taskForm.taskId == ''&&(this.taskName=='临时措施确认人1'||this.taskName=='批准人')"
+      <el-button v-if="!this.taskForm.taskId == ''&&(this.taskName=='临时措施制定人'||this.taskName=='批准人')"
                  type="warning"
                  @click="dataFormSubmit(2)" :disabled="submitDisabled">{{ $t('驳回') }}</el-button>
       <el-button v-if="!this.taskForm.taskId == ''" type="primary"
                  @click="dataFormSubmit(1)"
                  :disabled="submitDisabled">{{ $t(taskName != '申请人提交申请' ? '通过' : '提交') }}</el-button>
-      <el-button v-if="!this.taskForm.taskId == ''&&(this.taskName=='临时措施确认人1'||this.taskName=='批准人')"
+      <el-button v-if="!this.taskForm.taskId == ''&&(this.taskName=='临时措施制定人'||this.taskName=='批准人')"
                  type="danger"
                  @click="dataFormSubmit(0)" :disabled="submitDisabled">{{ $t('拒绝') }}</el-button>
       <el-button @click="visible = false">{{ $t('返回') }}</el-button>

+ 4 - 4
ui/src/views/approve/approveDetail/safetychange-detail.vue

@@ -129,7 +129,7 @@
               <el-radio label="NA">NA</el-radio>
             </el-radio-group>
           </el-form-item>
-          <el-form-item label="确认人" prop="resetConfirmer1">
+<!--          <el-form-item label="确认人" prop="resetConfirmer1">
             <el-select v-model="form.resetConfirmer1" placeholder="请选择确认人" clearable size="small" filterable
                        style="width: 100%">
               <el-option
@@ -139,7 +139,7 @@
                 :value="item.userId"
               ></el-option>
             </el-select>
-          </el-form-item>
+          </el-form-item>-->
         </div>
         <el-form-item label="备注" prop="remarks" v-if="taskName!='申请人提交申请'">
           <el-input type="textarea" v-model="form.remarks" placeholder="选填"/>
@@ -204,7 +204,7 @@ export default {
       devList: [],
       form: {},
       rules: {
-        resetConfirmer1: [{required: true, message: "请选择确认人", trigger: "blur"}],
+        //resetConfirmer1: [{required: true, message: "请选择确认人", trigger: "blur"}],
         resetConfirm: [{required: true, message: "请选择是/否", trigger: "blur"}],
         changeExecution: [{required: true, message: "请输入组织保护措施状态变更执行", trigger: "blur"}],
         safa: [{required: true, message: "请输入安全评估及临时的安全措施", trigger: "blur"}],
@@ -394,9 +394,9 @@ export default {
       return <el-tag type={type}>{s}</el-tag>;
     },
     dataFormSubmit(val) {
-      this.submitDisabled = true;
       this.$refs["form"].validate(valid => {
         if (valid || val != 1) {
+          this.submitDisabled = true;
           this.taskForm.condition = val;
           this.taskForm.safetychange = this.form;
           handle(this.taskForm).then(res=>{