Snaker如何配置期望完成时间、提醒时间、重复提醒间隔

最近在学习Snaker工作流,在Git上(下载地址)下载了一份代码,跑通后简单用了一下功能,(建议使用IE浏览器,其他浏览器会出现页面显示不完整的情况)对时间相关的几个属性一头雾水,调试了代码,感觉这份代码里没有实现这几个功能,于是在网上找了些相关资料,自己在项目中添加了该功能(不知道作者是不是这样的实现思路)

 

图中标记的几处,我的理解是 ,第一张图里设置的期望完成时间是总流程的期望完成时间,即系统时间超过该时间这个流程就更改状态为已结束,第二张图里设置的期望完成时间是该节点的结束时间,如果“是否自动执行”为“是”,超过该时间流程就自动走到下一节点,反之则停留在该节点,直至整个流程结束。

思考一下,此处设置的时间何时生效?是在保存流程时生效还是启动流程时生效?应该是在启动流程的时候吧。通过F12找到启动时调用的接口为http://localhost:8080/config/form/submit,在项目中找到该方法,在该方法中加上设置的时间即可,这是我的思路,接下来就想办法实现代码吧!

首先引入需要的jar包,如果你不是maven工程,需要下载jar包,下载地址https://mvnrepository.com/artifact/com.github.snakerflow/snaker-quartz/2.5.1,点击jar即可,将下载jar包导入项目中。

  其次在snaker.xml中配置时限控制的拦截器、定时调度的实现类

<bean class="org.snaker.engine.impl.SchedulerInterceptor"/>
<bean class="org.snaker.engine.scheduling.quartz.QuartzScheduler"/>

以上两步已经完成了时限的配置工作,下面就可以针对提醒、超时自动执行做自定义扩展了。 

接下来编写自定义的提醒类,实现IRminder接口,并在snaker.xml中配置

<bean class="com.snakerflow.framework.flow.service.SnakerReminder"/>

  

package com.snakerflow.framework.flow.service;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.snaker.engine.entity.Process;
import org.snaker.engine.model.NodeModel;
import org.snaker.engine.scheduling.IReminder;

import java.util.Map;

/**
 * @author Lebron
 * @ClassName SnakerReminder
 * @Description 提醒类 TODO
 * @Date 2020/4/22 15:45
 * @Version 1.0
 */
public class SnakerReminder implements IReminder {

    private static Log logger = LogFactory.getLog(SnakerReminder.class);

    @Override
    public void remind(Process process, String orderId, String taskId, NodeModel nodeModel, Map<String, Object> data) {
        logger.info("orderId:" + orderId);
        logger.info("taskId:" + taskId);
        logger.info("process:" + process.getDisplayName());
        logger.info("nodeModel:" + nodeModel.getDisplayName());
        for (String key : data.keySet()) {
            logger.info(key + ":" + data.get(key));
        }
    }
}

 回调类代码,回调类的路径也需要配置在工作流中!

<bean class="com.snakerflow.framework.flow.service.SnakerJobCallback"/>
package com.snakerflow.framework.flow.service;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.snaker.engine.entity.Task;
import org.snaker.engine.scheduling.JobCallback;

import java.util.List;

/**
 * @author Lebron
 * @ClassName SnakerJobCallback
 * @Description 回调类 TODO
 * @Date 2020/4/22 15:47
 * @Version 1.0
 */
public class SnakerJobCallback implements JobCallback {

    private static Log logger = LogFactory.getLog(SnakerReminder.class);

    @Override
    public void callback(String taskId, List<Task> newTasks) {
        logger.info("taskId:" + taskId);
    }
}

 最后在启动流程方法中加入配置时间的代码即可,将submit方法修改为

@RequestMapping(value = "submit", method = RequestMethod.POST)
    public String submit(HttpServletRequest request, long formId) {
        String processId = request.getParameter(PARA_PROCESSID);
        String orderId = request.getParameter(PARA_ORDERID);
        String taskId = request.getParameter(PARA_TASKID);
        List<Field> fields = dynamicFormManager.getFields(formId);
        Map<String, Object> params = new HashMap<String, Object>();
        for (Field field : fields) {
            if (Field.FLOW.equals(field.getFlow())) {
                String name = field.getName();
                String type = field.getType();
                String paraValue = request.getParameter(name);
                Object value = null;
                if ("text".equalsIgnoreCase(type)) {
                    value = paraValue;
                } else if ("int".equalsIgnoreCase(type)) {
                    if (paraValue == null || "".equals(paraValue)) {
                        value = 0;
                    } else {
                        try {
                            value = Integer.parseInt(request.getParameter(name));
                        } catch (Exception e) {
                            value = 0;
                        }
                    }
                } else if ("float".equalsIgnoreCase(type)) {
                    if (paraValue == null || "".equals(paraValue)) {
                        value = 0.0;
                    } else {
                        try {
                            value = Double.parseDouble(request.getParameter(name));
                        } catch (Exception e) {
                            value = 0.0;
                        }
                    }
                } else {
                    value = paraValue;
                }
                params.put(name, value);
            }
        }

        Map<String, String[]> paraMap = request.getParameterMap();

        if (!orderId.equals("") || !taskId.equals("")) {
            dynamicFormManager.submit(formId, fields, params, request, processId, orderId, taskId);
        } else {
            Map<String, Object> args = new HashMap<String, Object>();
            args.put("time.expireTime", new DateTime(2020, 4, 27, 19, 00).toDate());
            args.put("time1.reminderTime", new Date());
            args.put("time1.expireTime", new Date());
            args.put("time2.reminderTime", new DateTime(2020, 4, 27, 14, 05).toDate());
            args.put("time2.expireTime", new DateTime(2020, 4, 27, 14, 10).toDate());
            engine.startInstanceById(processId, "admin", args);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        if (StringUtils.isNotEmpty(processId)) {
            return "redirect:/snaker/task/active";
        } else {
            return "redirect:/config/form";
        }
    }

 

 这段代码的属性值根据自己的流程图文件定义,这里我在流程图里定义了变量,下面是我的流程文件,另外如果需要多次提醒的话,需要在snaker.properties中配置snaker.properties,是一个数字,表示提醒的次数。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process name="test_time" displayName="时间测试" expireTime="time.expireTime" instanceUrl="/snaker/flow/all" >
<start layout="-20,117,50,50" name="start" >
<transition offset="0,-10" to="rect2" name="path5" />
</start>
<task layout="88,115,100,50" name="rect2" displayName="发起审批" form="/config/form/use/1" taskType="Major" performType="ANY" reminderTime="time1.reminderTime" reminderRepeat="2" expireTime="time1.expireTime" autoExecute="Y" >
<transition offset="0,-10" to="rect3" name="path6" />
</task>
<task layout="307,116,100,50" name="rect3" displayName="主管审批" form="/config/form/use/1" assignee="lebron" assigneeDisplay="lebron" taskType="Major" performType="ANY" reminderTime="time2.reminderTime" reminderRepeat="2" expireTime="time2.expireTime" autoExecute="Y" >
<transition offset="0,-10" to="end" name="path7" />
</task>
<end layout="533,115,50,50" name="end" >
</end>
</process> 

从代码中可以看出,我希望这个流程在19:00结束,第一个节点在流程启动的同时执行,第二个节点在14:05提醒,提醒间隔为2分钟,并且在14:10到达期望完成时间,如果到达14:10没有执行,则自动执行,即整个流程走完。通过打断点可以测试出,提醒方式是查询到的流程信息打印在控制台,大家可以根据需求自行编写代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值