工作流引擎系列(一)之JBPM引擎使用

JBMP流程引擎

流程设计

最简单的一个流程配置包括下面几部分:

  • 开始节点、人工处理环节(包括参与人、动作)、结束节点;
  • 参与人:可配置具体用户、用户组、或者表达式,动作可以配置执行的后置事件。


  • 参与人表达式配置。

  • 动作配置执行的后置事件。


流程发起

  • 发起的主要方法:bwService.startProcess(userid, "RFP_TRADETRANSACTIONS_APPROVE", sendapprovelist, map);
  • userid:发起用户
  • RFP_TRADETRANSACTIONS_APPROVE:流程设计阶段定义的流程KEY
  • sendapprovelist:与流程相关的业务数据,主要是单据的主键,用于流程审批时加载自定义表单查询数据使用
  • map:传入流程中的变量,可以用于流程条件

public void sendApprove(CommonTransfer<TransAccountDetail> context) throws Exception {
    String[] urids = ((String)context.getProperties().get("ids")).split(",");
    String userid = (String)context.getProperties().get("userid");
    IDBSession session = DBSessionAdapter.getSession();
    TransAccountDetailDao transAccountDetailDao=new TransAccountDetailDao(session);


    TradeAccountDao tradeAccountDao=new TradeAccountDao(session);
    for (String urid : urids) {
        if (FString.isNullOrEmpty(urid)) {
            throw new Exception("数据异常,urid字段值非法(为空)!");
        }


        TransAccountDetail transAccountDetail = transAccountDetailDao.getByUrid(urid);
        if (transAccountDetail == null) {
            throw new Exception("数据异常,无法通过urid找到相应的交易明细");
        }
        if(transAccountDetailDao.existApproving(transAccountDetail)){
            throw new ServiceException(ErrorCodeConstants.TAM00013);
        }
        TradeAccount tradeAccount = tradeAccountDao.getByUrid(transAccountDetail.getTradeaccountsid());


        IBusinessWorkflowService bwService = (IBusinessWorkflowService) Globals.getBean("bizWorkflowService");
        List<String> sendapprovelist = new ArrayList<String>();
        Map<String, Object> map = new HashMap<String, Object>();


        sendapprovelist.add(transAccountDetail.getUrid());


        map.put("$_ORG_ID", tradeAccount.getOrgid());


        bwService.startProcess(userid, "RFP_TRADETRANSACTIONS_APPROVE", sendapprovelist, map);
        //更新审批状态为审批中
        transAccountDetail.setRowversion(transAccountDetail.getRowversion()+1);
        transAccountDetail.setApprovestate(ENApproveState.APPROVING.getValue());
        transAccountDetailDao.updateWithRowversion(transAccountDetail);


    }
}

流程中查找审批用户表达式

  • 新建一个普通类,配置spring Bean,UserQueryDao就是bean的名称
 
     
public List<User> getUserByOrgAndRole(String orgid, String Roles) {
		List<User> list = new ArrayList<User>();
		StringBuilder SQL = new StringBuilder();
		SQL.append("select e.user_code from tsys_user e where e.org_id ='"+orgid+"'" and e.role_code in ("+Roles+") and e.right_flag = 1");


		List<String> result=ht.getSessionFactory().getCurrentSession().createSQLQuery(SQL.toString()).list();
		for(String userId:result){
			UserImpl uimpl=new UserImpl();
			uimpl.setId(userId);
			list.add(uimpl);
		}
		return list; 
	}

后置事件

  • 新建一个普通类,实现ISubmitCallBack接口
  • 重写submitCallBack方法,参数data就是放入流程中的数据
public void submitCallBack(Map<String, Object> data) {
  String urid = data.get("urid").toString();
}






锅炉炉温的传递函数可以通过自动控制原理中的控制系统建模方法来推导。首先,我们需要了解锅炉炉温受到哪些因素的影响以及如何控制这些因素。 锅炉炉温受到燃料供给、空气供给、水位控制等因素的影响。为了控制锅炉炉温,我们可以通过控制这些因素的值来实现。因此,我们可以将锅炉炉温的传递函数表示为输入变量(燃料供给、空气供给、水位控制等因素)和输出变量(锅炉炉温)之间的关系。 假设我们控制锅炉炉温的输入变量为燃料供给量 F(t)、空气供给量 A(t) 和水位控制量 W(t),输出变量为锅炉炉温 T(t),则锅炉炉温的传递函数可以表示为: T(s)/F(s) = G1(s) T(s)/A(s) = G2(s) T(s)/W(s) = G3(s) 其中,G1(s)、G2(s) 和 G3(s) 分别表示燃料供给、空气供给和水位控制对锅炉炉温的影响。 现在我们需要推导出 G1(s)、G2(s) 和 G3(s) 的表达式。这可以通过锅炉炉温的物理模型和控制理论中的传递函数推导公式来实现。 首先,我们可以将锅炉炉温的物理模型表示为: m*Cp*dT/dt = Q - U*A*(T - Ta) - m*λ 其中,m 是锅炉的质量,Cp 是锅炉的比热容,Q 是燃料的热量,U 是传热系数,A 是传热面积,Ta 是锅炉的环境温度,λ 是蒸汽的焓值。 然后,我们可以将上述方程进行拉普拉斯变换,得到: m*Cp*T(s)*s = Q(s) - U*A*(T(s) - Ta(s))*s - m*λ*W(s) 化简后可得: T(s)/Q(s) = 1/(m*Cp*s + U*A + λ*W(s)) T(s)/Ta(s) = -U*A/(m*Cp*s + U*A + λ*W(s)) 根据控制理论中的传递函数推导公式,我们可以将上述表达式转换为一般形式的传递函数: G1(s) = T(s)/Q(s) = 1/(m*Cp*s + U*A + λ*W(s)) G2(s) = T(s)/A(s) = -U*A/(m*Cp*s + U*A + λ*W(s)) G3(s) = T(s)/W(s) = -m*λ/(m*Cp*s + U*A + λ*W(s)) 因此,锅炉炉温的传递函数为: T(s)/F(s) = 1/(m*Cp*s + U*A + λ*W(s)) T(s)/A(s) = -U*A/(m*Cp*s + U*A + λ*W(s)) T(s)/W(s) = -m*λ/(m*Cp*s + U*A + λ*W(s))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值