完整工作流JBPM项目实战全过程教程2---项目详细讲解

jbpm4.4工作流管理系统入门实战教程 在现代IT行业中,工作流管理系统成为了提高工作效率和业务自动化不可或缺的工具之一。Jbpm作为一种灵活而强大的工作流解决方案,对于企业来说,不仅能够简化复杂的业务流程,还能够加速业务流程的设计和执行。jbpm4.4的核心组件包括引擎、API、执行管理器、任务管理器、历史管理器和用户界面等。引擎是核心部分,负责整体的流程执行和调度。API是与jbpm进行交互的主要方式,使得开发者能够以编程方式操作流程。执行管理器负责流程的生命周期,包括创建、挂起、终止等。任务管理器负责用户任务的分配和管理。 阅读详情
  完整工作流JBPM项目实战全过程教程2---项目详细讲解


继续上一篇。
当数据库建立完成后,下载源代码,部署到服务器后,即可以开始体验完整的JBPM+SSH应用了。 
  项目采用的是ssh+jbpm开发模式,而且,项目功能比较齐全,代码量比较大,所以,本教程就不介绍开发过程了。
如果你对SSH整合开发应用已经够熟悉了的话,相信本项目对你来说将并不会有多大难度 。
下面我们把重点放在JBPM上。当然你得先把项目部署成功,才好边做边理解jbpm是怎么在项目中管理流程的。 
     ok,假定你已经把项目跑起来了吧。
先以管理员manager登录系统,管理员具有添加新文章类型的权限。当你添加一个文章类型后,需要指定该类型的文章到时候是按哪个流程来进行审批的。你需要上传一个zip格式的流程定义文件文件(其中压缩了gpd.xml,processdifinition.xml,和processimage.jpg)。点击发布,系统转到articletypeaddsub.do,执行ArticleTypeAddSubAction.java
......
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
........
/**
*
* 增加文章类型操作Action类
*
* @struts.action path="/articletypeaddsub" scope="request" validate="false"
*/
public class ArticleTypeAddSubAction extends Action {
private static final Log log = LogFactory.getLog(MainAction.class);

    /**
     * JBPM服务接口实现对象
     */
private JbpmConfiguration jbpmConfiguration;   //参见spring的配置文件applicationContext.xml
    /**
     * 文章类型服务接口实现对象
     */
private ArticleTypeService articleTypeService;
/**
  * Method execute
  *
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("MainAction.execute()");

  UploadDeployForm theForm = (UploadDeployForm) form;
  FormFile file = theForm.getFiles();// 取得上传的文件
  //得到JBPM环境
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  try {
   //解压zip文件流
   ZipInputStream zipInputStream = new ZipInputStream(file
     .getInputStream());
   ProcessDefinition processDefinition = ProcessDefinition
     .parseParZipInputStream(zipInputStream);
   //发布流程文件
   jbpmContext.deployProcessDefinition(processDefinition);
   jbpmContext.close();
   zipInputStream.close();
   //增加文章类型
   ArticleType articleType = new ArticleType();
   articleType.setPdName(processDefinition.getName());
   articleType.setTypeName(theForm.getTypeName());
  
   articleTypeService.addArticleType(articleType);
  } catch (IOException e) {
   log.error("exception", e);
  }
 
  request.setAttribute("success","发布成功");
 
  return mapping.findForward("success");
}

/**
  * 得到JBPM服务接口实现对象
  * @return jbpmConfiguration
  */
public JbpmConfiguration getJbpmConfiguration() {
  return jbpmConfiguration;
}

/**
  * 设置JBPM服务接口实现对象
  * @param jbpmConfiguration
  *            要设置的 jbpmConfiguration
  */
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
}

/**
  * 得到文章类型服务接口实现对象
  * @return articleTypeService
  */
public ArticleTypeService getArticleTypeService() {
  return articleTypeService;
}

/**
  * 设置文章类型服务接口实现对象
  * @param articleTypeService 要设置的 articleTypeService
  */
public void setArticleTypeService(ArticleTypeService articleTypeService) {
  this.articleTypeService = articleTypeService;
}

}
执行到这步后,你可以去查看下数据库中表jbpm_processdifinition,你会发现表中多出里一条记录,并且名字就是你上传的压缩文件中processdifinition.xml中的name属性的值。其他的表也会有相应的变化,具体看字段的定义就会大概明白了。
好了,流程已经发布到了系统中了。当然你还可以增加其他的文章类型并且指定不同的流程定义。

      我们退出系统,以guest用户登录系统,然后编写文章,这里需要说明的是,当你选择不同的文章类型后,该文章的审批过程就会与你刚才定义的执行流程相关了。 
     点击保存,
系统调用的ACTION为: 
   MyArticleAddSubAction.java
.........
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;

........
/**
*
* 撰写文章操作Action类
* @struts.action path="/myarticleaddsub" scope="request" validate="false"
*/
public class MyArticleAddSubAction extends Action{
    private static final Log log = LogFactory.getLog(MyArticleAddSubAction.class);
    /**
     * 文章服务接口实现对象
     */
    private ArticleService articleService;
    /**
     * 文章类型服务接口实现对象
     */
    private ArticleTypeService articleTypeService;
    /**
     * JBPM服务接口实现对象
     */
    private JbpmConfiguration jbpmConfiguration;
/**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("MyArticleAction.execute()");
 
  UserSession userSesssion = UserSession.getSession(request, response);
  //得到文章信息
  String stypeNo = request.getParameter("typeNo");
  int typeNo = ConvertUtil.convertInt(stypeNo);
  String articleName = request.getParameter("articleName");
  String content = request.getParameter("content");
 
  Article article = new Article();
  article.setArticleName(articleName);
  article.setContent(content);
  article.setState(Article.EDITED);
  article.setTypeNo(new Integer(typeNo));
  article.setUserNo(new Integer(userSesssion.getUserNo()));

  //得到相应的文章类型
  ArticleType articleType = articleTypeService.getArticleType(article.getTypeNo().intValue());

  //得到相应的流程定义,启动流程实例
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
 
  ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition(articleType.getPdName());
  ProcessInstance processInstance = new ProcessInstance(processDefinition);
 
  //让流程往下进行一步
  Token token = processInstance.getRootToken();
  token.signal();
 
  //保存流程实例与状态
  jbpmContext.save(processInstance);
  jbpmContext.save(token);
  jbpmContext.close();

 
  article.setPiId(processInstance.getId());
 
  //增加文章
  articleService.addArticle(article); 
      return mapping.findForward("success");
}
/**
  * 得到文章服务接口实现对象
  * @return articleService
  */
public ArticleService getArticleService() {
  return articleService;
}
/**
  * 设置文章服务接口实现对象
  * @param articleService 要设置的 articleService
  */
public void setArticleService(ArticleService articleService) {
  this.articleService = articleService;
}
/**
  * 得到文章类型服务接口实现对象
  * @return articleTypeService
  */
public ArticleTypeService getArticleTypeService() {
  return articleTypeService;
}
/**
  * 设置文章类型服务接口实现对象
  * @param articleTypeService 要设置的 articleTypeService
  */
public void setArticleTypeService(ArticleTypeService articleTypeService) {
  this.articleTypeService = articleTypeService;
}
/**
  * 得到JBPM服务接口实现对象
  * @return jbpmConfiguration
  */
public JbpmConfiguration getJbpmConfiguration() {
  return jbpmConfiguration;
}
/**
  * 设置JBPM服务接口实现对象
  * @param jbpmConfiguration 要设置的 jbpmConfiguration
  */
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
}

} 

    执行该action后,则就创建了一个与之匹配的流程实例。
查看数据库中article表的变化。可以发现
PiId记录了一个数字编号,同时jbpm_processinstance表中最大的一个id号与之匹配,这说明当保存文章时,系统后台创建了一个流程实例,该流程实例就是记录该文章的审批过程的JBPM实例。(你可以运行一个文章的审批全过程来跟踪与之匹配的流程实例变化情况)。
下一步就是发布该文章了。
到你的文章列表中点击“发布”。 
  系统调用ACTION:MyArticlePubAction.java继而转到MyArticlePubSubAction.java
.......
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
.........

/**
*
* 发布文章操作Action类
* @struts.action path="/myarticle" scope="request" validate="false"
*/
public class MyArticlePubAction extends Action{
    private static final Log log = LogFactory.getLog(MyArticlePubAction.class);
   
    private ArticleService articleService;
   
    private ArticleTypeService articleTypeService;

    private JbpmConfiguration jbpmConfiguration;
       
/**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("MyArticleAction.execute()");
 
  UserSession userSesssion = UserSession.getSession(request, response);
  //得到文章信息
  //得到文章号
  String sarticleNo = request.getParameter("articleNo");
  int articleNo = ConvertUtil.convertInt(sarticleNo);
 
  Article article = articleService.getArticle(articleNo);
  request.setAttribute("article", article);
  //判断是否是此用户文章
  if(article.getUserNo() != null && article.getUserNo().intValue() == userSesssion.getUserNo()){
  
   //创建相应的流程实例
   //得到相应的文章类型
   ArticleType articleType = articleTypeService.getArticleType(article.getTypeNo().intValue());
   request.setAttribute("articleType", articleType);
   //得到相应的流程
   JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  
   ProcessInstance processInstance = jbpmContext.getProcessInstance(article.getPiId());
   log.error("instance:" + processInstance.getId());
  
    //得到当前的执行令牌
   Token token = processInstance.getRootToken();
   //得到当前的可执行转换
   //Set transitions = token.getNode().getArrivingTransitions();
   List transitions = token.getNode().getLeavingTransitions();
   Set transitionnames = new HashSet();
   if(transitions != null){
    for(int i=0; i<transitions.size(); i++){
     Transition transition = (Transition)transitions.get(i);
     System.err.println("transition.getName()" + transition.getName());
     transitionnames.add(transition.getName());
    }
   }
   request.setAttribute("transitionnames", transitionnames);
   jbpmContext.close();
  
  }
 
 
return mapping.findForward("success");
 }
 public ArticleService getArticleService() {
  return articleService;
 }
 public void setArticleService(ArticleService articleService) {
  this.articleService = articleService;
 }
 public JbpmConfiguration getJbpmConfiguration() {
  return jbpmConfiguration;
 }
 public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
 }
 public ArticleTypeService getArticleTypeService() {
  return articleTypeService;
 }
 public void setArticleTypeService(ArticleTypeService articleTypeService) {
  this.articleTypeService = articleTypeService;
 }

}

 

ok,到这里,你仍然可以去查看数据库中article表的变化情况。你会发现表中的Auditstate字段

由null变成了一级审批,这是为什么,因为该文章对应的流程的下一个节点就是一级审批。

然后我们以one(一级审批)用户登录,就可以看到需要一级审批用户审批的文章列表了。

  需要说明的是:这些文章是按照登录用户的权限来显示的,只要是该权限级别的用户,就可以看到系统中所有的Auditstate为该状态(权限名和状态名相同,方便查询)的文章article了 。

执行相关的审批操作。继续调用相应的action,然后按照流程定义,一直执行下去,知道该文章的审批流程结束(这里就不再一一说明了)。

OK,流程执行完成。一个完整的JBPM实例执行结束。

  思考的问题来了!

  我们并不知道articl表中的Auditstate是怎么变化的啊?

在Struts的action中并没有看见显示的代码调用来修改数据库Auditstate字段啊,难道是JBPM自动做的处理?

当然不是!不过我们可以让JBPM帮助我们来完成。

你注意到了processdefinition.xml配置文件吗?

-<state name="编辑完成">
-<transition name="发布" to="一级审批">
  <action name="action" class="c20.jbpm.action.PubActionHandler" />
</transition>
</state>

没错,就是<action name="action" class="c20.jbpm.action.PubActionHandler" /> 的功劳。

当一个流程中一个state执行完,需要transition 到下一个State时,JBPM将会自动执行class指定的句柄。

 

.......

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.ProcessInstance;

........

/**
 * 文章发布处理器
 * @author yuxd
 *
 */
public class PubActionHandler implements ActionHandler {

 private static final long serialVersionUID = 1L;
 
 /**
  * A message process variable is assigned the value of the message
  * member. The process variable is created if it doesn't exist yet.
  */
 public void execute(ExecutionContext context) throws Exception {
  //得到对应实例ID
  ProcessInstance processInstance = context.getContextInstance().getProcessInstance();
  
  //得到当前执行转换
  Transition transition = context.getTransition();
  Node node = transition.getTo();
  
  //得到对应的文章
  ArticleService articleService = (ArticleService)BeanFactory.getBean("articleService");

  List list = articleService.getArticlesByPdInstance(processInstance.getId());
  
  //设置文章状态为发布中
  if(list != null){
   for(int i=0; i<list.size(); i++){
    Article article = (Article)list.get(i);
    
    if(article.getState() != null && article.getState().intValue() == Article.EDITED){
     article.setState(new Integer(Article.PUBLISH));
     
     article.setAuditState(node.getName());
     
     articleService.modArticle(article);
    }
   }
  }
 }

}

 

由此,可以得知,JBPM中句柄是怎么在流程运作的过程中对业务数据做出处理的吧!,这也正是JBPM句柄的作用之所在!

 

 

 到这里,JBPM的具体应用就介绍的已经很详细了。

下面来说说项目中是怎么巧妙的将业务和JBPM流程结合使用的吧。

我们来看看业务表article的结构,

article  CREATE TABLE `article` (                                                                     
           `ArticleNo` int(11) NOT NULL auto_increment COMMENT '文章号',                           
           `UserNo` int(11) default NULL COMMENT '用户号',                                         
           `TypeNo` int(11) default NULL COMMENT '文章类型号',                                   
           `ArticleName` varchar(128) default NULL COMMENT '文章名称',                            
           `Content` text COMMENT '文章内容',                                                     
           `PiId` bigint(20) default NULL COMMENT '对应流程实例号',                            
           `AuditState` varchar(64) default NULL COMMENT '审批状态',                              
           `AuditComment` varchar(255) default NULL COMMENT '审批说明',                           
           `State` int(11) default NULL COMMENT '文章状态',                                       
           PRIMARY KEY  (`ArticleNo`),                                                                
           KEY `FK_Relationship_1` (`TypeNo`),                                                        
           KEY `FK_Relationship_2` (`UserNo`),                                                        
           CONSTRAINT `FK_Relationship_1` FOREIGN KEY (`TypeNo`) REFERENCES `articletype` (`TypeNo`), 
           CONSTRAINT `FK_Relationship_2` FOREIGN KEY (`UserNo`) REFERENCES `user` (`UserNo`)         
         ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=gb2312 COMMENT='文章表'                 
不然看出,恰恰是表中的 `PiId` bigint(20) default NULL COMMENT '对应流程实例号字段,完美的和流程的ID映射起来,使得一篇文章绑定到一个具体的流程实例。并且文章的状态在流程的运作当中利用JBPM句柄ActionHandler动态变化。最终实现业务的运作。

 

     so,JBPM在web项目中的具体应用就介绍完了。希望通过本教程学习的朋友,能够得到确实的提高。并且在教程中的一些个人拙见,望大侠们积极的批正!

jbpm工作流管理系统与SSH集成的完整示例 本文还有配套的精品资源,点击获取 简介:jbpm工作流是一种开源工作流程管理系统,提供流程建模、部署、执行、监控和管理的企业级Java工具集。它基于BPEL的工作流引擎支持复杂业务流程自动化。SSH功能用于远程登录、文件传输和安全网络服务。jbpm4.4_0400_completesample是jbpm 4.4版本的具体示例,可能包含了完整的集成SSH的jbpm项目。开发者... 阅读详情

相关推荐

jbpm中文教程-详细

java业务流程管理,当今企业主流流程管理技术,结合当今最流行的orm框架-hibernate

基于springboot开发的工作流系统,bpmn.js,vue源码及功能分析(activiti)

本项目拥有用户管理,部门管理,代码生成,系统监管,报表,大屏展示,业务审批等功能。功能太强大,只能粗矿的介绍,所见即所得,体验一下吧。

2301_81867536的博客 1387

完整工作流JBPM项目实战全过程教程3----项目后续DIY

   接着上一篇。 从数据库中表的定义不难看出,每篇文章的审批将新建一个JBPM流程实例来跟踪。 文章的表article中,利用PiId来关联一个流程实例,并且定义State字段来表示文章的当前状态(编辑中,审批中,审批通过,nulll),定义AuditState字段来表示文章当前由何权限的人员来审批(一级审批,二级审批,三级审批,四级审批,当然还可以自定义权限)   下面就来演示如何自定义权限 ...

zpchen 229

ARM学习 | 紧耦合存储器 (TCM)

TCM 是一种专用的片上存储器,直接与处理器核心耦合。确定性访问:由于不涉及缓存替换或一致性管理,访问延迟固定。高带宽:TCM 通常通过专用总线连接处理器核心,可以提供更高的数据吞吐率。用户管理:TCM 的分配和管理完全由开发者控制,不依赖硬件缓存策略。ARM 处理器中的 TCM 通常分为ITCM(指令紧耦合存储器)和DTCM(数据紧耦合存储器),分别用于存储指令和数据。TCM 是 ARM 处理器中不可忽视的重要特性,在实时系统和高性能嵌入式应用中具有重要地位。

qq_43167806的博客 3328

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2171

JBPM使用详解

1. 工作流基础 1.1. 工作流相关概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。 通俗的说,流程就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是工作流。 工作流管理系统(Wf

linux__xu的博客 5272

Ollama模型路径迁移实战:Windows/Mac/Linux三平台保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大平台。通过设置OLLAMA_MODELS环境变量或创建符号链接,指导用户将模型从默认路径安全迁移至新位置,以释放系统盘空间或提升性能。教程包含迁移前的准备、分平台步骤、迁移后的验证以及常见问题排查,确保迁移过程平滑可靠。

js777的博客 1183

jbpm工作流安装教程

要进行jbpm的开发,我们使用eclipse开发。下面逐步介绍环境搭建过程,首先看一下用的软件。 JBPM4.4.zip 下载地址:http://sourceforge.net/projects/jbpm/files/jBPM%204/ JDK5 或者更高版本,我用的是jdk7 数据库,我用的是mysql,也可以用其它任何hibernate支持的数据库。 GPD(jbpm在eclipse中...

C/C++ 430

GB28181协议实战:5分钟搞定海康摄像头SIP注册失败问题(附Wireshark抓包分析)

本文详细解析了海康摄像头在GB28181协议下SIP注册失败的7个关键原因及解决方案,包括网络可达性、鉴权参数、NAT穿越等核心问题。通过Wireshark抓包分析,提供快速定位方法,帮助工程师高效解决SIP注册失败问题,提升实时图像联调效率。

weixin_29212867的博客 548

一分钟理解 AP(Affinity Propagation) 亲和⼒传播算法

这篇博客发出来后,我用 Rust 复现代码出现问题。为此,我对对照了 sklearn 的相关代码,反复比较了两天,发现一处 bug,把 += 误写成了 =,导致数据量大的时候完全无法聚类。这个debug过程让我仔细梳理的 AP 算法的计算过程,今天我对这篇博客做了大规模修改,以便能原样展现原论文思想。

程序猿视角 3216

完整工作流JBPM项目实战全过程教程1

完整工作流JBPM项目实战全过程教程1---准备工作       偶然机会,认识了工作流系统,并且在www.open-open.com(相当不错的开源项目站点,极力推荐!)上了解了些相当出色的工作流系统,不过呼声最高的应该属JBoss 的JBPM工作流组件了。     正好有个项目需要用到工作流机制,遂学习了下JBPM,感受了下JBPM带来的的便捷体验。现在我就把我的学习经历记录下

小红帽 3430

Rocky Linux 9 远程桌面配置全攻略:从零搭建XRDP服务(含防火墙设置)

本文提供了在Rocky Linux 9上从零开始配置XRDP远程桌面服务的完整指南。详细介绍了系统准备、XRDP服务安装、防火墙与SELinux安全设置、多用户性能优化以及多平台客户端连接实测。重点解决了使用Windows远程桌面协议(RDP)连接Rocky Linux时常见的配置难点与安全问题,帮助用户获得稳定高效的图形化远程访问体验。

vodka的博客 645

完整工作流JBPM项目实战全过程教程2

完整工作流JBPM项目实战全过程教程2---项目详细讲解 继续上一篇。  当数据库建立完成后,下载源代码,部署到服务器后,即可以开始体验完整的JBPM+SSH应用了。    项目采用的是ssh+jbpm开发模式,而且,项目功能比较齐全,代码量比较大,所以,本教程就不介绍开发过程了。  如果你对SSH整合开发应用已经够熟悉了的话,相信本项目对你来说将并不会有多大难度 。  下面我们

小红帽 997

智能车图像处理19-进阶篇11--斜入十字补线

这篇文章主要讲述智能车竞赛中如何对于斜入十字进行补线操作。

taiyuezyh的博客 7471

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JBPM学习(一):实现一个简单的工作流例子全过程

最近发现这篇文章挺多人看的,也挺多人有疑问,我很想帮你们解答,但是很无奈,这篇文章只是我当时在自学时看的一个教程的记录,当时对JBPM也没有深入去学习,并且到现在也已经快4年了,这期间我都没用过JBPM,因此JBPM的东西我也忘得差不多了。庆幸的是我把当时看的教程保存了下来,因此如果对此文章有疑问的可以直接看JBPM的教程。另外,通过我分享的视频大家也能看到这是一个OA教程,我当时刚入门自学Jav...

程序员囧辉 6万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

完整工作流JBPM项目实战全过程教程1---准备工作

完整工作流JBPM项目实战全过程教程1---准备工作      偶然机会,认识了工作流系统,并且在www.open-open.com(相当不错的开源项目站点,极力推荐!)上了解了些相当出色的工作流系统,不过呼声最高的应该属JBoss 的JBPM工作流组件了。    正好有个项目需要用到工作流机制,遂学习了下JBPM,感受了下JBPM带来的的便捷体验。现在我就把我的学习经历记录下来。

4015

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JAVA的jBPM工作流框架

工作流(Workflow)是指将一个工作过程分解成一系列有序的任务、活动或操作,并定义它们之间的关系和依赖,以实现对工作流程的管理、控制和优化。在 Java 中,工作流通常是指使用 Java 技术来实现和管理工作流程的系统或框架。工作流 Java 可以用于管理和自动化各种类型的业务流程,如审批流程、订单处理流程、报销流程等。它可以帮助组织和企业实现业务流程的自动化、标准化和优化,提高工作效率和质量。

m0_65037354的博客 3489

SSH+JBPM+ExtJs项目实战视频教程

基于J2EE平台下SSH2+JBPM4.4+ExtJs4.1 框架整合&项目实战(HR项目开发、SSH2作为框架) 适合人群:中级 课时数量:46课时 用到技术:Extjs、SSH2、Mvc 涉及项目:HR项目用户管理、Extjs树形结构、流程接口 咨询qq:1840215592 行业前景: J2EE是一套全然不同于传统应用开发的技术架构,包含许多组件,主要可简化且规

xiarilove的专栏 1586

JBPM工作流

1.     概要jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统。JBPM也是一款非常好的开源工作流引擎。现在这里从技术角度来分析jbpm的优点和缺点,简单罗列几个大家都容易看见的:2.优点a.       自带工作流引擎,思路清晰,编写代码减少;b.       采用JBPL语言建立工作流程图,可方便

hitlermen的专栏 6410

工作流JBPM笔记:了解JBPM

JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源代码项目,使用它要遵循 ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。

一个老码农 2214

jbpm工作流

前言       之前做.net的时候,工作流用过.net的workflow。在java中,用到的工作流框架有Jbpm、OSWorkflow、ActiveBPEL、YAWL等,下面就简单介绍一下Jbpm框架实现的工作流。   工作流       工作流就是业务过程的部分或整体在计算机应用环境下的自动化,它主要解决的是使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进...

Coder Yasmine 1517

工作流 jbpm概述

JBPM(Java Business Process Model)是一个开源的基于 Java 的工作流引擎,用于管理业务流程和决策逻辑。它允许开发人员创建、执行和管理业务流程,从而提高组织的效率和灵活性。

莫等闲 白了少年头 空悲切 1307

JBPM4+ExtJS实战视频教程

共享一套ExtJs4.1、JBPM、SSH2的视频。一套好的架构,性能必须好,更能满足客户需求,基本采用通用方式。实现的代码只会写一次。 大家好,本套视频讲解是SSH2+JBPM+ExtJs4实战,JBPM是重点讲解。实战与demo的区别我不再多说,在以前工作中走过一些弯路,一些实现都是靠自己想象或者听其他人应该怎么实现才是项目中真正需要的。JBPM书上是讲解以工作流为核心去开发应用,那

Java方向程序员_张帅鹏 4569

java jbpm工作流_jbpm工作流

一、JBPM(java business process manager)1、工作流管理流程O--->定义工作流(使用流程设计器生成,png和xml文件,分别面向用户和系统)--->执行工作流(核心对象:流程引擎ProcessEngine)--->连接数据库(jbpm18张表,jbpm4_deploymen,jbpm4_deployprop,jbpm4_execution,jbp...

weixin_33464488的博客 1361
上一篇: 完整工作流JBPM项目实战全过程教程1---准备工作
下一篇: 完整工作流JBPM项目实战全过程教程3----项目后续DIY
myjava_024
博客等级 码龄20年 59粉丝 45原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值