java利用MailService接口发送邮件

本文介绍了在Java项目中使用snaker流程引擎进行邮件通知的实现过程。通过配置message.properties文件设置发送者信息,利用MailService接口和MailServiceImpl接口进行邮件发送。在遇到SMTPSendFailedException错误时,可以通过在接口中给自己抄送邮件来解决该问题。具体调用示例位于ApplyPackageController.java控制器中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


公司项目使用到snaker流程引擎,要使用发送邮件功能,即在审批提交的时候通知下一步的处理人处理审批。主要涉及到MailService接口,mailServiceImpl接口,*.properties文件中配置发送者信息以及在具体地方调用接口。

1、我在message.properties中配置:

send_mail_adress=smtp.163.com
send_mail_userName=1825607****@163.com
send_mail_passwd=*****



2、MailService.java接口代码如下:

package com.wonders.bigdata.manageplatform.service.common.service;

import java.util.Map;

public interface MailService {
    /**
     * 发送邮件
     * @return
     */
    public void sendEmailData(String receiver,String subject,Map<String,String> content);
      /**
     * 发送邮件
     * @param receiver 邮件接受者
     * @param subject 邮件主题
     * @param content 邮件内容
     */
}



3、MailServiceImpl.java接口的代码如下:(也可以看详细的对于方法参数的讲解http://blog.163.com/java_star/blog/static/11771480520136511023957/(转侵删))

package com.wonders.bigdata.manageplatform.service.common.service.Impl;

import com.wonders.bigdata.manageplatform.service.common.service.MailService;
import com.wonders.bigdata.manageplatform.utils.Messages;
import org.springframework.stereotype.Service;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Map;
import java.util.Properties;

/**
 * Created by Administrator on 2016/3/23.
 */
@Service("MailServiceImpl")
public class MailServiceImpl implements MailService{

    private static String send_mail_adress = Messages.getString("send_mail_adress");

    private static String send_mail_userName = Messages.getString("send_mail_userName");

    private static String send_mail_passwd = Messages.getString("send_mail_passwd");

    private static Thread thread;
    @Override
    public void sendEmailData(final String receiver, final String subject, final Map<String, Object> content) {
        final Properties props = new Properties();

        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //表示SMTP发送邮件,需要进行身份验证
                props.put("mail.smtp.auth","true");
                props.put("mail.smtp.host",send_mail_adress);
                //发件人帐号
                props.put("mail.user",send_mail_userName);
                props.put("mail.password",send_mail_passwd);

                //构建授权信息,用于进行SMTP身份验证
                Authenticator authenticator = new Authenticator(){
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication(){
                        String userName = props.getProperty("mail.user");
                        String password = props.getProperty("mail.password");
                        return new PasswordAuthentication(userName,password);
                    }
                };

                //使用环境属性和授权信息,创建邮件会话
                Session mailSession = Session.getInstance(props,authenticator);
                //创建邮件消息
                MimeMessage message = new MimeMessage(mailSession);
                //设置发件人
                InternetAddress form = null;
                try {
                    form = new InternetAddress(props.getProperty("mail.user"));
                    message.setFrom(form);

                    //设置收件人
                    InternetAddress to = new InternetAddress(receiver);//receiver为收件人邮箱!
                    message.setRecipient(Message.RecipientType.TO,to);
                      

                    //设置邮件标题
                    message.setSubject("【大数据管理平台】"+subject);


                    //设置邮件的内容体
                    String cd = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>"
                            + "<html xmlns='http://www.w3.org/1999/xhtml'>"
                            + "<head>"
                            + "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"
                            + "<title>无标题文档</title>"
                            + "</head>"
                            + "<body>"
   //                         + "<p>【大数据管理平台】</p>"
                            + "<p>尊敬的"+content.get("userName")+",您好:</p>"
                            + "<p>您有一条来自"+"【大数据管理平台】"+"的"+"【"+subject+"】"+"待处理事件,请及时处理!</p>"
   //                         + "<p>您有一条来自"+"["+content.get("applyOwner")+"]"+"的"+"["+subject+"]"+"申请,请及时处理!</p>"
                            + "<p>【大数据管理平台】网址:https://data.wondersgroup.com</p>"
                            + "<div align='center'>"
                                                  
                            + "<p align='center'> </p>"
                            + "<div data-spm='100' class='copyright-100 ' margin-up='300px'>"
                            + "<div class='y-row copyright' data-spm='25'>"
                            + "<h4 align='center' class='big'>"
                            + "<a target='blank' href='http://www.wondersgroup.com/about-wd/201412310639133820.html'>关于我们</a>  "
                            + "<a target='blank' href='http://www.wondersgroup.com/news'>服务公告</a>  "
                            + "<a target='blank' href='http://www.wondersgroup.com/contact'>联系我们</a>  "
                            + "</h4><h5> &copy; 1995 - 2015 WONDERS INFORMATION CO., LTD. ALL RIGHTS RESERVED. **信息股份有限公司版权所有 沪ICP备05002296号 </h5></div></div></body></html>";


                    message.setContent(cd,"text/html;charset=UTF-8");

                    //发送邮件
                    Transport.send(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }
}


备注:如出现com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 126 smtp6,j9KowAAnRcUi.......这样的bug。 在MailService接口中将邮件给自己抄送一份就行了不懂的见http://blog.163.com/java_star/blog/static/11771480520136511023957/


4.1 项目ApplyPackageController.java中具体调用的地方:

 //发送短信、邮件
            String nextOperator_message = params.get("S-ACTOR").toString();//本项目中获取下一步处理人
            String applyName_message = params.get("packName").toString();//本项目中获取申请名称
            String decision_message = params.get("decision").toString();//这也是本项目独有的

            if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
                UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
                if (userPO != null) {
                    String reciver = userPO.getName();      //获取接收人用户名
                    String reciveNum =  userPO.getMobile(); //获取接收人手机号
                    Map<String,Object> map = new HashMap<>();
                    map.put("userMailAddress",userPO.getEmail());//给map增加的信息,以备使用
                    map.put("userName",userPO.getName());//给map增加的信息,以备使用
                    String receiver = userPO.getEmail();//接受人的邮箱赋值给receiver
                    if (decision_message.equals("1")) {

                    }
                    //以上都是获取需要的相关参数,比如发送邮件方法中的接受邮箱, 申请名,map包含的信息,再调用发送邮件接口,
                    mailService.sendEmailData(receiver, applyName_message,map );
                    //调用发送短信接口,这是项目的另一个功能
                    textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
                }
            }
4.2 整个ApplyPackageController.java:(可以不看)

package com.wonders.bigdata.manageplatform.web.flow;

import com.wonders.bigdata.manageplatform.engine.EngineFacets;
import com.wonders.bigdata.manageplatform.service.common.service.HiveService;
import com.wonders.bigdata.manageplatform.service.common.service.MailService;//导入
import com.wonders.bigdata.manageplatform.service.common.service.TextAndEmailService;
import com.wonders.bigdata.manageplatform.service.datapackage.model.po.DataPackagePO;
import com.wonders.bigdata.manageplatform.service.datapackage.service.DataPackageService;
import com.wonders.bigdata.manageplatform.service.metadata.model.po.MetadataTablePO;
import com.wonders.bigdata.manageplatform.service.metadata.service.MetadataTableService;
import com.wonders.bigdata.manageplatform.service.processrelate.service.ProcessRelateService;
import com.wonders.bigdata.manageplatform.service.resourcetype.model.po.CatalogTablePO;
import com.wonders.bigdata.manageplatform.service.resourcetype.model.po.StandardCatalogPO;
import com.wonders.bigdata.manageplatform.service.resourcetype.service.CatalogTableService;
import com.wonders.bigdata.manageplatform.service.resourcetype.service.StandardCatalogService;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.model.po.UserUsergroupPO;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.model.po.UsergroupPO;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.service.UserUsergroupService;
import com.wonders.bigdata.manageplatform.service.sysauthoritymanage.service.UsergroupService;
import com.wonders.bigdata.manageplatform.service.user.dao.UserDao;
import com.wonders.bigdata.manageplatform.service.user.model.po.UserDataPackagePO;
import com.wonders.bigdata.manageplatform.service.user.model.po.UserPO;
import com.wonders.bigdata.manageplatform.service.user.service.Impl.ShiroDbRealm.ShiroUser;
import com.wonders.bigdata.manageplatform.service.user.service.AccountService;
import com.wonders.bigdata.manageplatform.service.user.service.UserDataPackageService;
import com.wonders.bigdata.manageplatform.service.user.service.UserGradeService;
import com.wonders.bigdata.manageplatform.utils.Constant;
import com.wonders.bigdata.manageplatform.utils.LogsSave;
import com.wonders.bigdata.manageplatform.utils.Messages;
import com.wonders.bud.framework.common.util.RestMsg;
import com.wonders.engine.SnakerEngine;
import com.wonders.engine.access.QueryFilter;
import com.wonders.engine.entity.HistoryOrder;
import com.wonders.engine.entity.HistoryTask;
import com.wonders.engine.entity.Order;
import com.wonders.engine.entity.Task;
import com.wonders.engine.helper.JsonHelper;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.hibernate.internal.util.ConfigHelper;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

@Controller
@RequestMapping("api/flow/applyPacakgeprocess")
public class ApplyPackageController {
    protected Logger log = Logger.getLogger(ApplyPackageController.class);
    private Log logProgress = LogFactory.getLog("Administrator_Process");

    private Log logger = LogFactory.getLog("Tenant_Application"); //数据申请日志	输出日志格式:数据申请+”  ”+用户名+”  ”+ip地址+”  ”+日期+”  ”+申请名称+”  ”+表名(多表用逗号隔开)+”  ”+所属数据目录+Description;
	
    @Autowired
    private EngineFacets facets;

    @Autowired
    private UserDataPackageService userDataPackageService;

    @Autowired
    private DataPackageService dataPackageService;

    @Autowired
    private HiveService hiveService;

    @Autowired
    private MetadataTableService metadataTableService;

    @Autowired
    private CatalogTableService catalogTableService;

    @Autowired
    private UserDao userDao;

    @Autowired
    private StandardCatalogService standardCatalogService;

    @Autowired
    private AccountService accountService;

    @Resource
    private UserUsergroupService userUsergroupService;

    @Resource
    private UsergroupService usergroupService;

    @Resource
    private TextAndEmailService textAndEmailService;

    @Resource
    private MailService mailService;//导入

    /**
     * 用户暂存申请信息
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/tempStore", method = RequestMethod.POST)
    @ResponseBody
    public RestMsg<String> tempStore(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<String>();
        Map<String, Object> params = GetParametersCommon(request);

        //数据申请日志
        LogsSave.Tenant_Application(logger,this.getUname(),request.getRemoteAddr(),params.get("packName").toString(),params.get("selectedTablesName").toString(),params.get("selectedSourcesName").toString()," 用户暂存申请信息");

        //根据流程类型获取流程id
        CommonProcess commonProcess = new CommonProcess(facets);
        String processId = commonProcess.getProcessIdByType(Constant.PROCESS_TYPE_USERAPPLY);
        String orderId = request.getParameter("orderId");
        String taskId = request.getParameter("taskId");
        String username = getUname();
        if (StringUtils.isEmpty(orderId) && StringUtils.isEmpty(taskId)) {
            facets.startAndTempStore(processId, username, params);
        } else {
            String methodStr = request.getParameter("method");
            int method = 0;
            if (StringUtils.isNotEmpty(methodStr)) {
                method = Integer.parseInt(methodStr);
            }
            switch (method) {
                case 0://任务执行
                    Task task = facets.getEngine().query().getTask(taskId);
                    task.setVariable(JsonHelper.toJson(params));
                    facets.getEngine().task().updateTask(task);
                    break;
                case -1://驳回、任意跳转
                    facets.executeAndJump(taskId, username, params, request.getParameter("nodeName"));
                    break;
                default:
                    facets.execute(taskId, username, params);
                    break;
            }
        }
        rm.successMsg();
        return rm;
    }

    /**
     * 管理员暂存申请包的生成
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/adminTempStoreApply", method = RequestMethod.POST)
    @ResponseBody
    public RestMsg<String> adminTempStoreApply(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<String>();
        Map<String, Object> params = new HashMap<String, Object>();
        Enumeration<String> paraNames = request.getParameterNames();
        while (paraNames.hasMoreElements()) {
            String element = paraNames.nextElement();
            int index = element.indexOf("_");
            String paraValue = request.getParameter(element);
            if (element.equals("processId") || element.equals("orderId") || element.equals("taskId")) {
                continue;
            } else {
                if (index == -1) {
                    params.put(element, paraValue);
                } else {
                    char type = element.charAt(0);
                    String name = element.substring(index + 1);
                    Object value = null;
                    switch (type) {
                        default:
                            value = paraValue;
                            break;
                    }
                    params.put(name, value);
                }
            }
        }
        String processId = request.getParameter("processId");
        String orderId = request.getParameter("orderId");
        String taskId = request.getParameter("taskId");
        String username = getUname();
        if (StringUtils.isEmpty(orderId) && StringUtils.isEmpty(taskId)) {
            facets.startAndExecute(processId, username, params);
        } else {
            String methodStr = request.getParameter("method");
            int method = 0;
            if (StringUtils.isNotEmpty(methodStr)) {
                method = Integer.parseInt(methodStr);
            }
            switch (method) {
                case 0://任务执行
                    facets.AdminTempStoreDeason(taskId, username, params);
                    break;
                case -1://驳回、任意跳转
                    facets.executeAndJump(taskId, username, params, request.getParameter("nodeName"));
                    break;
                default:
                    facets.execute(taskId, username, params);
                    break;
            }
        }
        rm.successMsg();
        return rm;
    }

    /**
     * 申请包管理员创建
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/admincreate", method = RequestMethod.POST)
    @ResponseBody
    public RestMsg<String> adminCreate(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<String>();
        String i_decision = request.getParameter("I_decision");
        boolean allowUpdate = false;
        allowUpdate = Boolean.valueOf(request.getParameter("allowUpdate"));
        String dataPackageName = request.getParameter("S_dataPackageName");
        String tableInfos = request.getParameter("S_tableInfos");
        String tableInfosLogger = "";
        Long dpId = 0L;
        if (Integer.valueOf(i_decision) == 0) {
            ArrayList<String> flag = new ArrayList<String>();
            JSONObject infosJson = new JSONObject();
            List<Integer> tableGrade = new ArrayList<>();
            try {
                infosJson = new JSONObject(tableInfos);
                JSONArray jsonTableArray = infosJson.getJSONArray("tables");// 得到页面传过来的表信息
                for (int t = 0; t < jsonTableArray.length(); t++) {
                    JSONObject tableJsonObject = jsonTableArray.getJSONObject(t);
                    tableInfosLogger += tableJsonObject.getString("name")+"("+tableJsonObject.getString("remark")+")"+",";

                    //处理新增的表
                    if (tableJsonObject.getString("type").equals("0")) {
                        //获取申请租户loginName
                        String orderId = request.getParameter("orderId");
                        HistoryOrder historyOrder = facets.getEngine().query().getHistOrder(orderId);
                        String creator = historyOrder.getCreator();

                        String tableName = creator + "_" + tableJsonObject.getString("name");// 将用户登录名+前台填写的表名作为生成表的名字
                        tableJsonObject.put("name", tableName);// 更新name字段的值
                        String selectSql = tableJsonObject.getString("sql");// 得到表的select语句
                        selectSql = selectSql.toLowerCase();
                        //解析sql语句获得源表
                        tableGrade = analyseSQLgetTable(selectSql);

                        String previewData = genPreviewData(selectSql);// 生成预览数据
                        tableJsonObject.put("previewData", previewData);
                        tableJsonObject.put("dataGrade", tableGrade.get(0));
                        if (previewData.indexOf("error") > -1) {
                            flag.add(Integer.toString(t + 1));
                        }
                    } else {//处理选择已有表
                        String tableType = tableJsonObject.getString("type");
                        String tableId = tableJsonObject.getString("sqlId");
                        String tableRemark = "";
                        String tableDescription = "";
                        String previewData = "";
                        String dataGrade = "";
                        //如果是公共包
                        if (tableType.equals("2")) {
                            MetadataTablePO metadataTablePO = metadataTableService.findById(Long.parseLong(tableId));
                            tableRemark = metadataTablePO.getRemark() == null ? "" : metadataTablePO.getRemark();
                            tableDescription = metadataTablePO.getDescription() == null ? "" : metadataTablePO.getDescription();
                            previewData = metadataTablePO.getExample() == null ? "" : metadataTablePO.getExample();
                            dataGrade = metadataTablePO.getOpenLevel().toString();
                        } else {//如果是数据目录
                            CatalogTablePO catalogTablePO = catalogTableService.findById(Long.parseLong(tableId));
                            tableRemark = catalogTablePO.getRemark();
                            tableDescription = catalogTablePO.getDescription();
                            previewData = catalogTablePO.getExample();
                            dataGrade = catalogTablePO.getDataGrade().toString();
                        }
                        tableJsonObject.put("remark", tableRemark);// 更新remark字段的值
                        tableJsonObject.put("desription", tableDescription);//更新description字段的值
                        tableJsonObject.put("previewData", previewData);
                        tableJsonObject.put("type", "1");
                        tableJsonObject.put("dataGrade", dataGrade);
                    }
                    tableJsonObject.put("allowUpdate", allowUpdate);

                }
            } catch (JSONException e) {
                e.printStackTrace();
                flag.add("json转换异常");
                log.error("json转换", e);
            }
            boolean index = false;
            if (flag != null && flag.size() > 0) {
                if (flag.get(0).indexOf("json转换异常") > -1) {
                    rm.errorMsg("json数据转换异常");
                } else {
                    StringBuffer sb = new StringBuffer();
                    for (String str : flag) {
                        if (index) {
                            sb.append(",");
                        } else {
                            index = true;
                        }
                        sb.append(str);
                    }
                    rm.errorMsg(sb.toString());
                }
            } else {
                String dataPackRemark = "";
                String dataPackdescript = "";
                dataPackRemark = request.getParameter("S_dataPackRemark");
                dataPackdescript = request.getParameter("S_dataPackdescript");
                String resourceTypeId = request.getParameter("S_resourceTypeId");
                Long userId = getUid();// 当前登录的用户id
                try {
                    dpId = dataPackageService.flowCreatePubPackView(dpId, userId, dataPackageName, infosJson.toString(),
                            resourceTypeId, dataPackRemark, dataPackdescript).getId();
                    DataPackagePO dataPackagePO1 = dataPackageService.getDataPackageById(dpId);
                    dataPackagePO1.setType(Constant.DATA_DATAPACKAGE_TYPE_APPLY);
                    dataPackagePO1.setTypeId((long) -1);
                    dataPackageService.saveDataPackage(dataPackagePO1);
                    // 结束
                } catch (Exception e) {
                    e.printStackTrace();
                    rm.errorMsg("发生异常,请稍后再试");
                    log.error("管理员创建数据包", e);
                    return rm;
                }
            }
            /*tableInfosLogger = tableInfosLogger.substring(0,tableInfosLogger.length()-1);
            LogsSave.Administrator_Process(logProgress,getUname(),request.getRemoteAddr(),dataPackageName,tableInfosLogger,"创建数据包");
            rm.successMsg();
            return rm;*/
        }

        //执行流程引擎方法
        Map<String, Object> params = GetParametersCommon(request);

        if (dpId == 0L)
        { params.put("dpId", "");}
        else
        { params.put("dpId", dpId);}

        Date date = new Date();
        SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        params.put("adminFinishTime",bartDateFormat.format(date));
        params.put("isAdminCreated","true");//标志管理员已创建
        params.put("adminName",getUname());//数据包创建者管理员的名字
        params.put("isUserConfirm","");
        String processId = request.getParameter("processId");
        String orderId = request.getParameter("orderId");
        String taskId = request.getParameter("taskId");

        String sActorName = facets.getEngine().query().getOrder(orderId).getVariableMap().get("S-ACTOR").toString();
        UserPO sActor = accountService.findUserByLoginName(sActorName);
        if("0".equals(i_decision)){//在管理员同意创建的情况下
            UserPO  po = accountService.findUserById(getUserGroupHeadManId(sActor.getId()));
            if(po.getLoginName().equals(Constant.SK_ZUZHANG1)){//如果该申请的组长是gaoju,decision置为1
                params.put("decision",1);
            }
            //TODO 更多组长需要补充更多的判断
        }
        String username = getUname();
        try {
            if (StringUtils.isEmpty(orderId) && StringUtils.isEmpty(taskId) && orderId != null && taskId != null) {
                facets.startAndExecute(processId, username, params);
            } else {
                String methodStr = request.getParameter("method");
                int method = 0;
                if (StringUtils.isNotEmpty(methodStr)) {
                    method = Integer.parseInt(methodStr);
                }
                switch (method) {
                    case 0://任务执行
                        Task task = facets.executeAdminTempStore(taskId, username, params);
                        if (task != null) {
                            facets.execute(task.getId(), username, params);
                        } else {
                            facets.execute(taskId, username, params);
                        }
                        break;
                    case -1://驳回、任意跳转
                        facets.executeAndJump(taskId, username, params, request.getParameter("nodeName"));
                        break;
                    default:
                        facets.execute(taskId, username, params);
                        break;
                }
            }

            //发送短信、邮件
            String nextOperator_message = params.get("S-ACTOR").toString();
            String applyName_message = params.get("packName").toString();


            if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
                UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
                if (userPO != null) {
                    String reciver = userPO.getName();      //获取接收人用户名
                    String reciveNum =  userPO.getMobile(); //获取接收人手机号
                    Map<String,Object> map = new HashMap<>();
                    map.put("userMailAddress",userPO.getEmail());
                    map.put("userName",userPO.getName());
                    String receiver = userPO.getEmail();
                    //调用发送邮件接口
                    mailService.sendEmailData(receiver, applyName_message,map );
                    //调用发送短信接口
                    textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            dataPackageService.deleteDataPackageById(dpId);
            log.error("管理员创建数据包", e);
            rm.errorMsg("流程执行出错,回退完成...");
            return rm;
        }
        if(tableInfosLogger != null && !"".equals(tableInfosLogger)){
        	tableInfosLogger = tableInfosLogger.substring(0,tableInfosLogger.length()-1);
        	LogsSave.Administrator_Process(logProgress,getUname(),request.getRemoteAddr(),dataPackageName,tableInfosLogger,"创建数据包");
        }
        rm.successMsg();
        return rm;
    }

    //解析sql语句获得源表
    private List<Integer> analyseSQLgetTable(String selectSql) {
        List<Integer> tableGrade = new ArrayList<>();
        if (selectSql.contains("where")) {//包含where条件的解析方法
            String namesWhere = selectSql.split("from")[1];
            String names = namesWhere.split("where")[0];
            names = names.trim();
            if (names.contains(",")) {//有","说明包含多个表名
                String[] catalogTableNames = names.split(",");
                int grade = -1;
                for (String catalogTableName : catalogTableNames) {
                    List<CatalogTablePO> tempCatalogTablePOs = catalogTableService.getByTableOrPackageName(catalogTableName);
                    if (tempCatalogTablePOs.size() != 0) {
                        int temp = catalogTableService.getByTableOrPackageName(catalogTableName).get(0).getDataGrade();
                        if (temp > grade) {
                            grade = temp;
                        }
                    }
                }
                tableGrade.add(grade);
            } else {
                List<CatalogTablePO> tempCatalogTablePOs = catalogTableService.getByTableOrPackageName(names);
                if (tempCatalogTablePOs.size() != 0) {
                    int grade = catalogTableService.getByTableOrPackageName(names).get(0).getDataGrade();
                    tableGrade.add(grade);
                } else {
                    int grade = 1;
                    tableGrade.add(grade);
                }
            }
        } else {//不包含where的解析方法
            String names = selectSql.split("from")[1];
            if (names.contains("group by")) {
                names = names.split("group by")[0];
                names = names.trim();
                if (names.contains(",")) {//有","说明包含多个表名
                    String[] catalogTableNames = names.split(",");
                    int grade = -1;
                    for (String catalogTableName : catalogTableNames) {
                        catalogTableName = catalogTableName.trim();
                        List<CatalogTablePO> tempCatalogTablePOs = catalogTableService.getByTableOrPackageName(catalogTableName);
                        if (tempCatalogTablePOs.size() != 0) {
                            int temp = catalogTableService.getByTableOrPackageName(catalogTableName).get(0).getDataGrade();
                            if (temp > grade) {
                                grade = temp;
                            }
                        }
                    }
                    tableGrade.add(grade);
                } else {
                    List<CatalogTablePO> tempCatalogTablePOs = catalogTableService.getByTableOrPackageName(names);
                    if (tempCatalogTablePOs.size() != 0) {
                        int grade = catalogTableService.getByTableOrPackageName(names).get(0).getDataGrade();
                        tableGrade.add(grade);
                    } else {
                        int grade = 1;
                        tableGrade.add(grade);
                    }
                }
            } else {
                names = names.trim();
                if (names.contains(",")) {//有","说明包含多个表名
                    String[] catalogTableNames = names.split(",");
                    int grade = -1;
                    for (String catalogTableName : catalogTableNames) {
                        catalogTableName = catalogTableName.trim();
                        List<CatalogTablePO> tempCatalogTablePOs = catalogTableService.getByTableOrPackageName(catalogTableName);
                        if (tempCatalogTablePOs.size() != 0) {
                            int temp = catalogTableService.getByTableOrPackageName(catalogTableName).get(0).getDataGrade();
                            if (temp > grade) {
                                grade = temp;
                            }
                        }
                    }
                    tableGrade.add(grade);
                } else {
                    List<CatalogTablePO> tempCatalogTablePOs = catalogTableService.getByTableOrPackageName(names);
                    if (tempCatalogTablePOs.size() != 0) {
                        int grade = catalogTableService.getByTableOrPackageName(names).get(0).getDataGrade();
                        tableGrade.add(grade);
                    } else {
                        int grade = 1;
                        tableGrade.add(grade);
                    }
                }
            }
        }
        return tableGrade;
    }


    /*
     * 生成预览数据
     *
     * @param sql
     *
     * @return result String
     */
    private String genPreviewData(String sql) {
        try {
            ArrayList<String[]> datas = hiveService.searchBySelcet(sql);
            if (datas != null && datas.size() > 0) {
                String data = "";
                for (int c = 0; c < datas.size(); c++) {
                    if (c == 0) {
                        data = data + "<tr>";
                        String[] rows = datas.get(c);
                        for (int r = 0; r < rows.length; r++) {
                            String row = rows[r];
                            if (row.contains(".")) {
                                row = row.split("\\.")[1];
                            }
                            data = data + "<th>" + row + "</th>";
                        }
                        data = data + "</tr>";
                    } else {
                        data = data + "<tr>";
                        String[] rows = datas.get(c);
                        for (int r = 0; r < rows.length; r++) {
                            String row = rows[r];
                            data = data + "<td>" + row + "</td>";
                        }
                        data = data + "</tr>";
                    }
                }
                return data;
            } else {
                return "select error";
            }
        } catch (SQLException e) {
            e.printStackTrace();
            log.error("生成预览数据", e);
            return "select error";
        }
    }

    /**
     * 租户确认生成数据包,写入user_datapacakge表
     *
     * @return
     * @author WYP
     */
    @RequestMapping(value = "/userConfirm", method = RequestMethod.POST)
    @ResponseBody
    public RestMsg<String> UserConfirm(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<String>();
        String orderId = request.getParameter("orderId");
        Map<String, Object> params = GetParametersCommon(request);//得到前端页面传来的参数
        int usrDecision = Integer.parseInt(request.getParameter("I_decision"));
        String dpId = "";
        List<HistoryTask> listasks = facets.getEngine().query().getHistoryTasks(new QueryFilter().setOrderId(orderId));
        try {
            for (HistoryTask e : listasks) {
                JSONObject contentJsonObject = new JSONObject(e.getVariable());
                if (contentJsonObject.has("dpId")) {
                    dpId = contentJsonObject.getString("dpId");
                    break;
                } else continue;
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("", e);
        }
        Long dataPackageId = 0L;
        try {
            if(usrDecision != 2){
            if (StringUtils.isNotBlank(dpId)) {
                dataPackageId = Long.parseLong(dpId);
                DataPackagePO dpPo = dataPackageService.getDataPackageById(dataPackageId);
                dpPo.setDeleteFlag(Constant.DATA_DATAPACKAGE_NOT_DELETE);
                dpPo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATING);//设置创建状态为创建中
                dpPo.setCreator(userDao.get(getUid()).getLoginName());
                dataPackageService.saveDataPackage(dpPo);
                UserDataPackagePO udpPos = userDataPackageService.findByDpId(dataPackageId);
                if (udpPos == null) {//判断是新增用户数据包还是更新用户数据包
                    UserDataPackagePO udpPo = new UserDataPackagePO();
                    udpPo.setUserId(getUid());
                    udpPo.setDpId(dataPackageId);
                    udpPo.setStatus(Constant.USERDATAPACKAGE_NOT_USED);//用户数据包未使用标志
                    udpPo.setType(Constant.USERDATAPACKAGE_TYPE_APPLY);//用户数据包是申请包
                    udpPo.setCreateDate(new Date());
                    udpPo.setDeleteFlag(Constant.USERDATAPACKAGE_NOT_DELETE);
                    udpPo.setCreator(dpPo.getCreator());
                    userDataPackageService.addUserDataPackage(udpPo);
                } else {
                    udpPos.setCreateDate(new Date());
                    userDataPackageService.addUserDataPackage(udpPos);
                }
                String result = "";
                if (request.getParameter("I_decision").equals("0")) {
                    result = "true";
                } else {
                    result = "false";
                }
                if ("true".equals(result)) {
                    String flag = dataPackageService.confirmGenPriPackage(dataPackageId, result, getUid());
                    if ("success".equals(flag) || "您的账户空间已满".equals(flag)) {
                        DataPackagePO ddpo = dataPackageService.getDataPackageById(dataPackageId);
                        ddpo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATED);
                        dataPackageService.saveDataPackage(ddpo);
                        dataPackageService.saveUserCatalogInfo(dataPackageId, getUid());//保存租户生成申请资产到租户目录中
                        params.put("decision", 1);//转向
                        RunFlowProcess(request, params);//运行流程
                    } else {
                        int failReason = getFailConstantValueFromTheFlag(flag);//获得确认生成数据包失败原因
                        DataPackagePO ddpo = dataPackageService.getDataPackageById(dataPackageId);
                        ddpo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATE_FAIL);
                        ddpo.setFailReason(failReason);//保存确认生成失败原因
                        dataPackageService.saveDataPackage(ddpo);
                        dataPackageService.saveUserCatalogInfo(dataPackageId, getUid());//保存租户生成申请资产到租户目录中
                        RunFlowProcess(request, params);//运行流程
                        rm.errorMsg(flag);
                        rm.setCode(-1);
                        return rm;
                    }
                    rm.successMsg("数据包生成成功!");
                } else if ("false".equals(result)) {
                    DataPackagePO ddpo = dataPackageService.getDataPackageById(dataPackageId);
                    ddpo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATE_FAIL);
                    dataPackageService.saveDataPackage(ddpo);
                    rm.successMsg("不接受确认生成,操作已成功!");
                    RunFlowProcess(request, params);//运行流程
                    HistoryOrder histOrder = facets.getEngine().query().getHistOrder(orderId);
                    histOrder.setOrderState(Constant.SNAKE_ORDER_STATE_NotAccept);
                    facets.getEngine().order().updateHistoryOrder(histOrder);
                }
            } else {
                rm.errorMsg();
                return rm;
            }
            }else{
                params.put("decision", 2);//转向
                params.put("isUserConfirm","true");//设置组长已经接受这个申请
                RunFlowProcess(request, params);//运行流程
            }
        } catch (Exception e) {
            DataPackagePO ddpo = dataPackageService.getDataPackageById(dataPackageId);
            ddpo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATE_FAIL);
            dataPackageService.saveDataPackage(ddpo);
            /*facets.getEngine().order().terminate(orderId);//终结流程*/
            String adminName = (String) facets.getEngine().query().getOrder(orderId).getVariableMap().get("adminName");
            if(adminName.equals(Constant.SK_ADMIN0)){//管理员是钱涌
                params.put("decision", 1);//转向
            }else if(adminName.equals(Constant.SK_ADMIN1)){
                params.put("decision", 2);//转向
            }

            RunFlowProcess(request, params);//运行流程
            e.printStackTrace();
            rm = rm.errorMsg("确认生成数据包失败!");
            rm.setCode(-1);
            return rm;
        }
        rm.successMsg();
        return rm;
    }

    /**
     * 数据回填s
     *
     * @param request
     * @return DataPackageApplyVO
     * @throws JSONException
     * @author holysanwish
     */
    @RequestMapping(value = "/getReWritenInfo", method = RequestMethod.GET, produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String getReWritenInfo(HttpServletRequest request) {
        try {
            String taskId = request.getParameter("taskId");
            Task temp = facets.getEngine().query().getTask(taskId);
            if (temp != null) {
                JSONObject variable = new JSONObject(temp.getVariable());
                if (variable.has("tableInfos")) {
                    JSONObject tableInfos = new JSONObject(variable.getString("tableInfos"));
                    JSONArray tables = tableInfos.getJSONArray("tables");
                    if (null != tables) {
                        for (int i = 0; i < tables.length(); i++) {
                            JSONObject table = tables.getJSONObject(i);
                            if(table.has("catalogId")){
                            	String catalogId = table.getString("catalogId");
                            	table.put("catalogName", "");
                            	if (null != catalogId && !"".equals(catalogId)) {
                            		Long standCatalogId = Long.parseLong(catalogId);
                            		StandardCatalogPO standardCatalogPO = standardCatalogService.findById(standCatalogId);
                            		if (null != standardCatalogPO) {
                            			table.put("catalogName", standardCatalogPO.getName());
                            		}
                            	}
                            }
                        }
                    }
                    variable.put("tableInfos", tableInfos.toString());
                    return variable.toString();
                } else {
                    return temp.getVariable();
                }

            } else {
                return null;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            log.error("获取数据包暂存数据", e);
            return null;
        }
    }

    /**
     * 根据失败的具体详情,取得对应常量标示
     *
     * @param flag 具体错误详情
     * @return 对应常量标示
     * @author XB 2015-12-1 16:45:29
     */
    private int getFailConstantValueFromTheFlag(String flag) {
        int failReson = -1;
        log.info("根据失败的具体详情,取得对应常量标示");
        if (StringUtils.isEmpty(flag)) {//如果参数为空,则返回默认值-1
            return failReson;
        }
        switch (flag) {
            case "hive表已经存在":
                failReson = Constant.DATA_DATAPACKAGE_FAIL_REASON_TABLE_EXIST;
                break;
            case "没有sql语句!":
                failReson = Constant.DATA_DATAPACKAGE_FAIL_REASON_NO_SQL;
                break;
            case "您的账户空间已满":
                failReson = Constant.DATA_DATAPACKAGE_FAIL_REASON_USER_NOPLACE;
                break;
            default:
                failReson = Constant.DATA_DATAPACKAGE_FAIL_REASON_OTHER;
                break;
        }

        return failReson;
    }


    /**
     * @param : 无
     * @return : Page<Process>
     * @Description : 管理员帮助重新申请
     * @author : XCL
     * @date : 2016年6月15日15:17:29
     */
    @RequestMapping(value = "/managerHelp/ReApplyAgain", method = RequestMethod.GET)
    @ResponseBody
    public RestMsg<String> ReApplyAgain(HttpServletRequest request) {
        Map<String, Object> params = null;
        RestMsg<String> rm = new RestMsg<>();
        String dpId = request.getParameter("dpId");
        String taskId = request.getParameter("taskId");
        String orderId = request.getParameter("orderId");
        if (!(StringUtils.isNotEmpty(dpId) && StringUtils.isNotEmpty(taskId) && StringUtils.isNotEmpty(orderId))) {
            rm.errorMsg();
            rm.setMsg("传入参数缺少或者为空!");
            return rm;
        }
        Long dataPackageId = Long.parseLong(dpId);
        String flag = null;
        try {
            DataPackagePO ddpo = dataPackageService.getDataPackageById(dataPackageId);
            UserPO userPO = accountService.findUserByLoginName(ddpo.getCreator());//获取申请数据用户信息
            flag = dataPackageService.confirmGenPriPackage(dataPackageId, "true", userPO.getId());
            if ("success".equals(flag)) {
                ddpo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATED);
                dataPackageService.saveDataPackage(ddpo);
                dataPackageService.saveUserCatalogInfo(dataPackageId, userPO.getId());//保存租户生成申请资产到租户目录中
                rm.successMsg();
                rm.setResult("数据包生成成功!");
                facets.execute(taskId, getUname(), params);
            } else {
                int failReason = getFailConstantValueFromTheFlag(flag);//获得确认生成数据包失败原因
                ddpo.setCreateStatus(Constant.DATA_DATAPACKAGE_CREATE_STATUS_CREATE_FAIL);
                ddpo.setFailReason(failReason);//保存确认生成失败原因
                dataPackageService.saveDataPackage(ddpo);
                dataPackageService.saveUserCatalogInfo(dataPackageId, userPO.getId());//保存租户生成申请资产到租户目录中
                rm.errorMsg(flag);
                rm.setResult("数据包生成失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            facets.getEngine().order().terminate(orderId, getUname());
        }
        return rm;
    }


    /**
     * 用户申请信息显示
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/applyInfo", method = RequestMethod.POST)
    @ResponseBody
    public RestMsg<String> applyInfo(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<String>();
        try {
            String taskId = request.getParameter("taskId");
            Task task = facets.getEngine().query().getTask(taskId);
            JSONObject json = new JSONObject(task.getVariable());
            if (json.has("packName")) rm.setResult(task.getVariable());
            else {
                String orderId = task.getOrderId();
                Order order = facets.getEngine().query().getOrder(orderId);
                rm.setResult(order.getVariable());
            }
        } catch (Exception e) {
            e.printStackTrace();
            rm.errorMsg();
            log.error("用户申请信息显示", e);
        }
        return rm;
    }

    /**
     * 申请名称重名判断
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/checkReName", method = RequestMethod.POST)
    @ResponseBody
    public RestMsg<String> checkReName(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<String>();
        try {
            String name = request.getParameter("name");
            String orderId = request.getParameter("orderId");
            Long userId = getUid();//获取当前用户id
            String userLoginName = getUname();//获取当前用户的登录名
            //在数据包列表中查找
            List<DataPackagePO> list = dataPackageService.getDataPackageAndApply(name, userId);
            //在order列表中查找
            String sql = "SELECT * FROM wf_order WHERE variable LIKE \'%\"packName\":\"" + name + "\"%\' AND creator=\'" + userLoginName + "\' AND id!=\'" + orderId + "\';";
            List<Order> rs = facets.getEngine().query().nativeQueryList(Order.class, sql);
            if ((list != null && list.size() > 0) || (rs != null && rs.size() > 0)) {
                rm.setResult("重名");
            } else {
                rm.setResult("无重名");
            }
            rm.successMsg();
        } catch (Exception e) {
            e.printStackTrace();
            rm.errorMsg("查询信息失败,无法判断重名!");
            log.error("申请名称重名判断", e);
        }
        return rm;
    }


    /**
     * @param
     * @return RestMsg
     * @description 查询管理员驳回信息,回填给领导
     * @author WYP
     */
    @RequestMapping(value = "/managerRejShow", method = RequestMethod.GET)
    @ResponseBody
    public RestMsg<String> managerRegShow(HttpServletRequest request) {
        RestMsg<String> rm = new RestMsg<>();
        String taskId = request.getParameter("taskId");
        try {
            Task task = facets.getEngine().query().getTask(taskId);
            String variable = task.getVariable();
            JSONObject var = new JSONObject(variable);
            if (var.has("managerResult")) {
                rm.setResult(var.getString("managerResult"));
                rm.successMsg();
            }
        } catch (Exception e) {
            rm.setCode(-1);
            rm.errorMsg();
            e.printStackTrace();
        }
        return rm;
    }

    /**
     * 租户申请资产进入流程方法
     * create by XB 2016-6-17 15:51:00
     *
     * @return
     */
    @RequestMapping(value = "/enterProcess", method = RequestMethod.POST)
    @ResponseBody
    public String enterProcess(MultipartHttpServletRequest request) {
        Map<String, Object> params = null;
        String info = "";
        List<String> fileAdresses = new ArrayList<>();
        String fileAdress = "";
        try {
        	params =  GetParametersCommon(request);
            List<MultipartFile> list = request.getFiles("S_file");
            //SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date d = new Date();
            long currentTime = d.getTime();//为防止申请名是中文的情况,改用毫秒时间来记录不同的申请

            String packName = (String) params.get("packName");

            String isAdminCreated = "false";//用来记录管理员是否已经创建,作为领导端页面判断的依据

            String realPath = Messages.getString("skFile");
            int fileCount = 0;//记录总共有多少个文件
            //获得上传文件
            for(MultipartFile file:list){
                File inFile = new File(realPath);
                if(!inFile.isFile() && !inFile.isDirectory()){
                    inFile.mkdirs();
                }
                File rootfile = new File(realPath+ "/" +this.getUname());
                if(!rootfile.isFile() && !rootfile.isDirectory()){
                    rootfile.mkdirs();
                }
                File outfile = new File(realPath+this.getUname() + "/" + currentTime);
                if(!outfile.isFile() && !outfile.isDirectory()){
                    outfile.mkdirs();
                }

                String fileName = file.getOriginalFilename();
                int idx = fileName.lastIndexOf(".");
                String suffix = fileName.substring(idx + 1, fileName.length());//文件后缀名

                //因为a标签无法用中文下载;所有
                String filePath = realPath+this.getUname() + "/" + currentTime + "/" + fileName;
                /*params.put("userFile"+fileCount,fileName);
                fileCount++;*/

                File tartFile = new File(filePath);
                if (tartFile.exists()) {
                    tartFile.delete();
                }
                fileAdresses.add(filePath);
                file.transferTo(tartFile);
            }

            for(String adress:fileAdresses){
                fileAdress = fileAdress + adress + ";";
            }

            //去除最后一个“;”
            if (!fileAdress.equals("")) {
                fileAdress = fileAdress.substring(0, fileAdress.length() - 1);
            }
            //补充地址入流程引擎
            params.put("isAdminCreated",isAdminCreated);

            params.put("fileAdress",fileAdress);
            //补充创建者入流程引擎
            params.put("creator",this.getUname());
            //补充三领导审批结果的数据入流程引擎
            params.put("leaderDecision0","-2");
            params.put("leaderDecisionTime0","-2");
            params.put("leaderDecision1","-2");
            params.put("leaderDecisionTime1","-2");
            params.put("leaderDecision2","-2");
            params.put("leaderDecisionTime2","-2");
            params.put("leaderDecision3","-2");
            params.put("leaderDecisionTime3","-2");
            //补充管理员创建完成时间入流程引擎
            params.put("adminFinishTime","-2");
        	//数据申请日志
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        	logger.info("数据申请"+"  "+this.getUname()+"  "+request.getRemoteAddr()+"  "+df.format(new Date())+"  "+params.get("packName")+"  "+params.get("selectedTablesName")+"  "+params.get("selectedSourcesName")+"  租户申请资产进入流程方法");


        	//根据流程类型获取流程id
            CommonProcess commonProcess = new CommonProcess(facets);
            String processId = commonProcess.getProcessIdByType(Constant.PROCESS_TYPE_USERAPPLY);
            String taskId = request.getParameter("taskId");
            String orderId = request.getParameter("orderId");
            String nextOperator = request.getParameter("");
            String username = getUname();



            if (StringUtils.isEmpty(orderId) && StringUtils.isEmpty(taskId)) {
                facets.startAndExecute(processId, username, params);

                //发送短信、邮件
                String nextOperator_message = params.get("S-ACTOR").toString();
                String applyName_message = params.get("packName").toString();

                if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
                    UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
                    if (userPO != null) {

                        String reciver = userPO.getName();      //获取接收人用户名
                        String reciveNum =  userPO.getMobile(); //获取接收人手机号
                        Map<String,Object> map = new HashMap<>();
                        map.put("userMailAddress",userPO.getEmail());
                        map.put("userName",userPO.getName());
                        String receiver = userPO.getEmail();
                        //调用发送邮件接口
                        mailService.sendEmailData(receiver, applyName_message,map );
                        //调用发送短信接口
                        textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
                    }
                }

            } else {
                String methodStr = request.getParameter("method");
                int method = 0;
                if (StringUtils.isNotEmpty(methodStr)) {
                    method = Integer.parseInt(methodStr);
                }
                switch (method) {
                    case 0://任务执行
                        Task task = facets.executeTempStore(taskId, username, params);
                        if (task == null) {
                            facets.execute(taskId, username, params);

                            //发送短信、邮件
                            String nextOperator_message = params.get("S-ACTOR").toString();
                            String applyName_message = params.get("packName").toString();

                            if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
                                UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
                                if (userPO != null) {

                                    String reciver = userPO.getName();      //获取接收人用户名
                                    String reciveNum =  userPO.getMobile(); //获取接收人手机号
                                    Map<String,Object> map = new HashMap<>();
                                    map.put("userMailAddress",userPO.getEmail());
                                    map.put("userName",userPO.getName());
                                    String receiver = userPO.getEmail();
                                    //调用发送邮件接口
                                    mailService.sendEmailData(receiver, applyName_message,map );
                                    //调用发送短信接口
                                    textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
                                }
                            }

                        } else {
                            List<Task> listtask = facets.getEngine().query().getActiveTasks(new QueryFilter().setOrderId(orderId));
                            for (Task t : listtask) {
                                if (!taskId.equals(t.getId())) {
                                    facets.getEngine().task().complete(t.getId());
                                } else continue;
                            }
                            facets.execute(task.getId(), username, params);

                            //发送短信、邮件
                            String nextOperator_message = params.get("S-ACTOR").toString();
                            String applyName_message = params.get("packName").toString();

                            if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
                                UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
                                if (userPO != null) {

                                    String reciver = userPO.getName();      //获取接收人用户名
                                    String reciveNum =  userPO.getMobile(); //获取接收人手机号
                                    Map<String,Object> map = new HashMap<>();
                                    map.put("userMailAddress",userPO.getEmail());
                                    map.put("userName",userPO.getName());
                                    String receiver = userPO.getEmail();
                                    //调用发送邮件接口
                                    mailService.sendEmailData(receiver, applyName_message,map );
                                    //调用发送短信接口
                                    textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
                                }
                            }

                        }
                        break;
                    case -1://驳回、任意跳转
                        facets.executeAndJump(taskId, username, params, request.getParameter("nodeName"));
                        break;
                    case 1://转办
                        if (StringUtils.isNotEmpty(nextOperator)) {
                            facets.transferMajor(taskId, username, nextOperator.split(","));
                        }
                        break;
                    case 2://协办
                        if (StringUtils.isNotEmpty(nextOperator)) {
                            facets.transferAidant(taskId, username, nextOperator.split(","));
                        }
                        break;
                    default:
                        facets.execute(taskId, username, params);
                        break;
                }
            }
            info = "1";
        } catch (Exception e) {
            e.printStackTrace();
            log.error("租户申请资产进入流程", e);
            info = "进入租户申请资产流程失败!";
        }
        return info;
    }

    /**
     * 通用流程,增加leader2用户
     *
     * @return
     */
    @RequestMapping(value = "/process", method = RequestMethod.POST)
    @ResponseBody
    public String process(HttpServletRequest request) {
        try{
            Map<String, Object> params = null;
            params = GetParametersCommon(request);
            RunFlowProcess(request, params);
            return "1";
        }catch (Exception e){
            log.error(e.getLocalizedMessage());
            return "1";
        }
    }

    //读取前台数据
    public Map<String, Object> GetParametersCommon(HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        Enumeration<String> paraNames = request.getParameterNames();
        while (paraNames.hasMoreElements()) {
            String element = paraNames.nextElement();
            int index = element.indexOf("_");
            String paraValue = request.getParameter(element);
            //过滤processId、orderId和taskId
            if (element.equals("processId") || element.equals("orderId") || element.equals("taskId")) {
                continue;
            } else {
                if (index == -1) {
                    params.put(element, paraValue);
                } else {
                    char type = element.charAt(0);
                    String name = element.substring(index + 1);
                    Object value = null;
                    //这段对于前台传过来的表单每个Id的name值作为参数,这里的S,I指类型String和Integer
                    switch (type) {
                        case 'S':
                            value = paraValue;
                            break;
                        case 'I':
                            value = ConvertUtils.convert(paraValue, Integer.class);
                            break;
                        default:
                            value = paraValue;
                            break;
                    }
                    params.put(name, value);
                }
            }
        }
        return params;
    }

    /**
     * 领导上传文件
     * author rk
     * @param request
     * @return
     */
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public String upload(MultipartHttpServletRequest request) {
        List<MultipartFile> list = request.getFiles("S_leaderfile");
        String realPath = Messages.getString("skFile");
        String orderId = request.getParameter("orderId");
        List<String> fileAdresses = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        String fileAdress = "";
        try {
        Date d = new Date();
        long currentTime = d.getTime();
        for(MultipartFile file:list){
            File inFile = new File(realPath);
            if(!inFile.isFile() && !inFile.isDirectory()){
                inFile.mkdirs();
            }
            File rootfile = new File(realPath+ "/" +this.getUname());
            if(!rootfile.isFile() && !rootfile.isDirectory()){
                rootfile.mkdirs();
            }
            File outfile = new File(realPath+this.getUname() + "/" + currentTime);
            if(!outfile.isFile() && !outfile.isDirectory()){
                outfile.mkdirs();
            }

            String fileName = file.getOriginalFilename();
            int idx = fileName.lastIndexOf(".");
            String suffix = fileName.substring(idx + 1, fileName.length());//文件后缀名

            String filePath = realPath+this.getUname() + "/" + currentTime + "/" + fileName;
                /*params.put("userFile"+fileCount,fileName);
                fileCount++;*/

            File tartFile = new File(filePath);
            if (tartFile.exists()) {
                tartFile.delete();
            }
            fileAdresses.add(filePath);
            file.transferTo(tartFile);
        }
            for(String adress:fileAdresses){
                fileAdress = fileAdress + adress + ";";
            }

            if (!fileAdress.equals("")) {
                fileAdress = fileAdress.substring(0, fileAdress.length() - 1);
            }
            Map<String,Object> vMap = facets.getEngine().query().getOrder(orderId).getVariableMap();
            String oldAdress = "";
            if(vMap.containsKey("leaderFileAdress")){
                oldAdress = vMap.get("leaderFileAdress").toString();
            }
            if(!"".equals(oldAdress.trim())){
                fileAdress = oldAdress + ";" + fileAdress;
            }
            map.put("leaderFileAdress",fileAdress);
            facets.getEngine().order().addVariable(orderId,map);
        } catch (IOException e) {
            e.printStackTrace();
            return "发生错误";
        }
        return "1";
    }

    /**
     * 领导第二次上传文件
     * author rk
     * @param request
     * @return
     */
    @RequestMapping(value = "/uploadSecond", method = RequestMethod.POST)
    @ResponseBody
    public String uploadSecond(MultipartHttpServletRequest request) {
        List<MultipartFile> list = request.getFiles("S_leaderfile");
        String realPath = Messages.getString("skFile");
        String orderId = request.getParameter("orderId");
        List<String> fileAdresses = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        String fileAdress = "";
        try {
            Date d = new Date();
            long currentTime = d.getTime();
            for(MultipartFile file:list){
                File inFile = new File(realPath);
                if(!inFile.isFile() && !inFile.isDirectory()){
                    inFile.mkdirs();
                }
                File rootfile = new File(realPath+ "/" +this.getUname());
                if(!rootfile.isFile() && !rootfile.isDirectory()){
                    rootfile.mkdirs();
                }
                File outfile = new File(realPath+this.getUname() + "/" + currentTime);
                if(!outfile.isFile() && !outfile.isDirectory()){
                    outfile.mkdirs();
                }

                String fileName = file.getOriginalFilename();
                int idx = fileName.lastIndexOf(".");
                String suffix = fileName.substring(idx + 1, fileName.length());//文件后缀名

                String filePath = realPath+this.getUname() + "/" + currentTime + "/" + fileName;
                /*params.put("userFile"+fileCount,fileName);
                fileCount++;*/

                File tartFile = new File(filePath);
                if (tartFile.exists()) {
                    tartFile.delete();
                }
                fileAdresses.add(filePath);
                file.transferTo(tartFile);
            }
            for(String adress:fileAdresses){
                fileAdress = fileAdress + adress + ";";
            }

            if (!fileAdress.equals("")) {
                fileAdress = fileAdress.substring(0, fileAdress.length() - 1);
            }

            map.put("leaderFileAdressSecond",fileAdress);
            facets.getEngine().order().addVariable(orderId,map);
        } catch (IOException e) {
            e.printStackTrace();
            return "发生错误";
        }
        return "1";
    }



    //流程运转
    public void RunFlowProcess(HttpServletRequest request, Map<String, Object> params) {
        String processId = request.getParameter("processId");
        String taskId = request.getParameter("taskId");
        String orderId = request.getParameter("orderId");
        String nextOperator = request.getParameter("");
        String isCreated = "";
        String leaderDataType = "";
        String leaderExecuteOpnion = "";
        String isLastLeader = "";
        if(params.containsKey("isAdminCreateInput")) {
            isCreated =  params.get("isAdminCreateInput").toString();
        }
        if(params.containsKey("leaderDataType")) {
            leaderDataType = params.get("leaderDataType").toString();
        }
        if(params.containsKey("leaderExecuteOpnion")) {
            leaderExecuteOpnion = params.get("leaderExecuteOpnion").toString();
        }
        String dataTypeOther = "";
        if(params.containsKey("dataTypeOther")) {
            dataTypeOther = params.get("dataTypeOther").toString();
        }
        if(params.containsKey("isLastLeader")) {
            isLastLeader = params.get("isLastLeader").toString();
        }
        if(getUrow().equals("leadership,领导") && isCreated.equals("true")){
            params.put("realLeaderDataType",leaderDataType);
            params.put("realDataTypeOther",dataTypeOther);
        }
        if(getUrow().equals("leadership,领导") && isCreated.equals("false")){
            params.put("realleaderExecuteOpnion",leaderExecuteOpnion);
        }
        if(getUrow().equals("leadership,领导") && isLastLeader.equals("1")){
            String sActorName = facets.getEngine().query().getOrder(orderId).getVariableMap().get("S-ACTOR").toString();
            UserPO sActor = accountService.findUserByLoginName(sActorName);
            UserPO  po = accountService.findUserById(getUserGroupHeadManId(sActor.getId()));
            if(po.getLoginName().equals(Constant.SK_ZUZHANG1)){//如果该申请的组长是gaoju,decision置为1
                params.put("decision",1);
            }
        }
        String username = getUname();
        Date date = new Date();
        SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Object decision = params.get("decision");
        if(isCreated.equals("false")){
            if(this.getUrow().equals("leadership,领导")) {
                params.put("leaderDecision0", decision);
                params.put("leaderDecisionTime0",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult0",params.get("leaderResult"));
                    params.put("leaderChoosen0",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership1")){
                params.put("leaderDecision1", decision);
                params.put("leaderDecisionTime1",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult1",params.get("leaderResult"));
                    params.put("leaderChoosen1",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership2")){
                params.put("leaderDecision2", decision);
                params.put("leaderDecisionTime2",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult2",params.get("leaderResult"));
                    params.put("leaderChoosen2",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership3")){
                params.put("leaderDecision3", decision);
                params.put("leaderDecisionTime3",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult3",params.get("leaderResult"));
                    params.put("leaderChoosen3",params.get("leaderChoosen"));
                }
            }
        }else{
            if(this.getUrow().equals("leadership,领导")) {
                params.put("leaderDecision0after", decision);
                params.put("leaderDecisionTime0after",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult0after",params.get("leaderResult"));
                    params.put("leaderChoosen0after",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership1")){
                params.put("leaderDecision1after", decision);
                params.put("leaderDecisionTime1after",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult1after",params.get("leaderResult"));
                    params.put("leaderChoosen1after",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership2")){
                params.put("leaderDecision2after", decision);
                params.put("leaderDecisionTime2after",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult2after",params.get("leaderResult"));
                    params.put("leaderChoosen2after",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership3")){
                params.put("leaderDecision3after", decision);
                params.put("leaderDecisionTime3after",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult3after",params.get("leaderResult"));
                    params.put("leaderChoosen3after",params.get("leaderChoosen"));
                }
            }else if(this.getUrow().equals("leadership4")){
                params.put("leaderDecision4after", decision);
                params.put("leaderDecisionTime4after",bartDateFormat.format(date));
                if(params.containsKey("leaderResult")){
                    params.put("leaderResult4after",params.get("leaderResult"));
                    params.put("leaderChoosen4after",params.get("leaderChoosen"));
                }
            }
        }

        if (StringUtils.isEmpty(orderId) && StringUtils.isEmpty(taskId)) {
            facets.startAndExecute(processId, username, params);
        } else {
            String methodStr = request.getParameter("method");
            int method = 0;
            if (StringUtils.isNotEmpty(methodStr)) {
                method = Integer.parseInt(methodStr);
            }
            /*
            * 虚拟机申请流程中的前端和其他前端利用的流程判断字段不同
            * 所以单独写一段代码判断该流程的流向
            * */
            CommonProcess commonProcess = new CommonProcess(facets);
            String processId1 = commonProcess.getProcessIdByType(Constant.PROCESS_TYPE_VIRTUALAPPLY);
            if(!processId.isEmpty() && processId.equals(processId1)){
                methodStr = request.getParameter("I_decision");
                if(StringUtils.isNotEmpty(methodStr)){
                    method = Integer.parseInt(methodStr);
                }
            }
            switch (method) {
                case 0://任务执行
                    Task task = facets.executeTempStore(taskId, username, params);
                    if (task == null) {
                        facets.execute(taskId, username, params);
                    } else {
                        List<Task> listtask = facets.getEngine()
                                .query()
                                .getActiveTasks(new QueryFilter().setOrderId(orderId));
                        for (Task t : listtask) {
                            if (!taskId.equals(t.getId())) {
                                facets.getEngine().task().complete(t.getId());
                            } else continue;
                        }
                        facets.execute(task.getId(), username, params);
                    }
                    break;
                case -1://驳回、任意跳转
                    facets.executeAndJump(taskId, username, params, request.getParameter("nodeName"));
                    break;
                case 1://转办
                    if (StringUtils.isNotEmpty(nextOperator)) {
                        facets.transferMajor(taskId, username, nextOperator.split(","));
                    }
                    break;
                case 2://协办
                    if (StringUtils.isNotEmpty(nextOperator)) {
                        facets.transferAidant(taskId, username, nextOperator.split(","));
                    }
                    break;
                default:
                    facets.execute(taskId, username, params);
                    break;
            }

            //发送短信、邮件
            String nextOperator_message = params.get("S-ACTOR").toString();
            String applyName_message = params.get("packName").toString();
            String decision_message = params.get("decision").toString();

            if (StringUtils.isNotEmpty(nextOperator_message) && StringUtils.isNotEmpty(applyName_message)) {
                UserPO userPO = accountService.findUserByLoginName(nextOperator_message);
                if (userPO != null) {
                    String reciver = userPO.getName();      //获取接收人用户名
                    String reciveNum =  userPO.getMobile(); //获取接收人手机号
                    Map<String,Object> map = new HashMap<>();
                    map.put("userMailAddress",userPO.getEmail());
                    map.put("userName",userPO.getName());
                    String receiver = userPO.getEmail();
                    if (decision_message.equals("1")) {

                    }
                    //调用发送邮件接口
                    mailService.sendEmailData(receiver, applyName_message,map );
                    //调用发送短信接口
                    textAndEmailService.sendMessageInfo(reciver, reciveNum, applyName_message);
                }
            }
        }
    }

    //获取当前用户id
    public Long getUid() {
        log.info("获取当前用户id");
        ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
        return shiroUser.getId();
    }

    public String getUname() {
        log.info("获取当前用户登录名");
        ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
        return shiroUser.getLoginName();
    }

    public String getUrow() {
        log.info("获取当前用户角色");
        ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
        return shiroUser.getRoles();
    }

    @RequestMapping(value = "/getUrow", method = RequestMethod.POST)
    @ResponseBody
    public String getAjaxUrow() {
        log.info("获取当前用户角色");
        ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
        return shiroUser.getRoles();
    }

    public Long getUserGroupHeadManId(Long userId){
        //根据用户Id,找到用户所在的所有组
        List<UserUsergroupPO> userUsergroupPOs = userUsergroupService.getByUserId(userId);
        if(userUsergroupPOs == null || userUsergroupPOs.size()<2){//判空,只有用户同时在用户组和协作组中才有意义
            return null;
        }else {
            for(UserUsergroupPO po : userUsergroupPOs){//遍历po
                UsergroupPO usergroupPO = usergroupService.get(po.getUsergroupId());//根据组Id找到相应的组信息
                if(usergroupPO.getType() == Constant.USERGROUP_TYPE_TEAM) {//当为true时,该组为协作组
                    String name[] = usergroupPO.getName().trim().split("&");//根据该协作组,得到组长ID
                    if (name[0] != null && name[1] != null) {
                        return accountService.findUserByLoginName(name[1]).getId();
                    }
                }
            }
        }
        return null;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值