基于若依的ruoyi-nbcio流程管理系统自定义业务实现一种简单的动态任务标题需求

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统

更多nbcio-boot功能请看演示系统

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://122.227.135.243:9888

今天讲一个根据自定义业务表单的字段内容来动态修改发送标题。

1、全局任务创建监听如下修改

java 复制代码
/**
 * 全局监听-工作流待办消息提醒
 *
 * @author nbacheng
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class TaskCreateListener implements FlowableEventListener {
	
    private final TaskService taskService;
    
    @Resource
    private CommonService commonService;
    
    @Resource
	protected RepositoryService repositoryService;
	
	@Resource
    protected HistoryService historyService;
	   

    @Override
    public void onEvent(FlowableEvent flowableEvent) {
    	FlowableEventType type = flowableEvent.getType();
    	if (type == FlowableEngineEventType.TASK_ASSIGNED) { 
    		if(flowableEvent instanceof org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl ) {
    			TaskEntity taskEntity = (TaskEntity) ((org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl) flowableEvent).getEntity();
    			String taskId = taskEntity.getId();
    	        String procInsId = taskEntity.getProcessInstanceId();
    	        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
    	                .processInstanceId(procInsId)
    	                .singleResult();
    	        List<Task> listtask = taskService.createTaskQuery().processInstanceId(procInsId).active().list();
    			String dataId =  historicProcessInstance.getBusinessKey();
    			String deployId = historicProcessInstance.getDeploymentId();
    			String startUserId = historicProcessInstance.getStartUserId();
    	        //获取任务接收人
    			String receiver = taskEntity.getAssignee();
    	        if (StringUtils.isNotEmpty(receiver)) {
    	            //发送提醒消息
    	        	String category = "";
    	        	if(taskService.getVariables(taskId).get("category") != null) {
    	        		category = taskService.getVariables(taskId).get("category").toString();
    	        	}
    	      
    	        	LoginUser loginUser = commonService.getLoginUser();
    	        	String taskMessageUrl;
    	        	if(StringUtils.isNotBlank(dataId)) {
    	    			taskMessageUrl = "<a href=" + commonService.getBaseUrl() + procInsId + "?taskId="
    	    					          + taskId + "&businessKey=" + dataId + "&category=" 
    	    					          + category + "&processed=true"  + ">点击这个进行处理</a>" ;
    	    		}
    	    		else {
    	    			taskMessageUrl = "<a href=" + commonService.getBaseUrl() + procInsId + "?taskId="
    	    					         + taskId + "&businessKey" + "&category=" 
    	    					         + category + "&processed=true" + ">点击这个进行处理</a>" ;
    	    		}
    	        	String msgContent = "流程待办通知" + taskMessageUrl;
    	      		if(!StringUtils.equals((loginUser.getUserId()).toString(),receiver)) {//发起人或登录人自己不发送
    	      			String taskTitle = "";
    	      			if( ObjectUtils.isNotEmpty(listtask)) {
    	      				String field = listtask.get(0).getDescription();
    	      				field = field.substring(field.lastIndexOf("{") + 1, field.lastIndexOf("}"));
    	      				taskTitle = commonService.getTaskTitle(dataId, field);
    	      			}
    	      			log.info("任务标题:" + taskTitle);
    	      			log.info("流程待办通知给:" + receiver);
    	      			commonService.sendSysNotice(loginUser.getUserId().toString(), receiver, taskTitle+"流程待办通知", msgContent, Constants.MSG_CATEGORY_3);//setMsgCategory=3是待办
    	        	}
    	        }
    		}
    	}	
    }

    @Override
    public boolean isFailOnException() {
        return false;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false;
    }

    @Override
    public String getOnTransaction() {
        return null;
    }
}

2、其中上面的getTaskTitle如下:

java 复制代码
public String getTaskTitle(String dataId, String field) {
		//设置自定义表单dataid的数据 
        WfMyBusiness flowmybusiness = wfMyBusinessServiceImpl.getByDataId(dataId);
        String serviceImplName = flowmybusiness.getServiceImplName();
        WfCallBackServiceI flowCallBackService = (WfCallBackServiceI) SpringContextUtils.getBean(serviceImplName);
        if (flowCallBackService!=null){
        	return flowCallBackService.getFieldBydataId(dataId, field); 
        }	
		return null;
	}

3、上面的getFieldBydataId调用了自定义业务的实际类

java 复制代码
@Override
	public String getFieldBydataId(String dataId, String field) {
		return baseMapper.getFieldBydataId(dataId, field);
	}
public interface WfDemoMapper extends BaseMapperPlus<WfDemoMapper, WfDemo, WfDemoVo> {

	Page<WfDemoVo> myPage(Page<WfDemoVo> page, @Param(Constants.WRAPPER) QueryWrapper<WfDemoVo> queryWrapper);

	@Select("select ${field} from wf_demo where demo_id = #{dataId}")
	String getFieldBydataId(@Param("dataId") String dataId, @Param("field") String field);

}

4、流程定义

这里做了一个测试例子,用了wf_demo里的字段user_name

5、效果图

6、当然上面对于多实例并发,子流程等还没有进行测试,以后需要进一步修改确认。

7、对于待办任务的标题也需要进行后续动态更新。

相关推荐
越来越无动于衷26 分钟前
JAVA包装类
java·开发语言
北执南念27 分钟前
ThreadLocalMap
java
Brookty31 分钟前
【Java学习】枚举(匿名类详解)
java·学习
wgc2k1 小时前
Java游戏服务器开发流水账(4)游戏的数据持久化
java·服务器·游戏
向哆哆1 小时前
Spring 框架实战:如何实现高效的依赖注入,优化项目结构?
java·spring·log4j
忘梓.1 小时前
从父类到子类:C++ 继承的奇妙旅程(2)
java·开发语言·c++
小杜-coding6 小时前
黑马点评day04(分布式锁-setnx)
java·spring boot·redis·分布式·spring·java-ee·mybatis
caihuayuan56 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计
佩奇的技术笔记7 小时前
Java学习手册:单体架构到微服务演进
java·微服务·架构
zm8 小时前
服务器多客户端连接核心要点(1)
java·开发语言