基于若依的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、对于待办任务的标题也需要进行后续动态更新。

相关推荐
Flynt9 分钟前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet11 分钟前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持32 分钟前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin1 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI2 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
cfm_29143 小时前
单例模式详解
java
我叫张土豆3 小时前
本体论、DDD、SDD、TDD:AI 编程时代的四层认知栈
java·人工智能
白远山4 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
海南java第二人4 小时前
从诞生到回收:JVM对象生命周期与垃圾回收全链路解析
java
SL_staff4 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈