BOS项目12:基于activiti物流配送流程,启动,查询,办理,项目知识点复习

本文主要是介绍BOS项目12:基于activiti物流配送流程,启动,查询,办理,项目知识点复习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



目录(?)[-]

  1. 1    设计物流配送流程
  2. 2    启动流程配送流程
  3. 3    查询组任务
  4. 4    拾取组任务
  5. 5    查询个人任务
  6. 6    办理任务
  7. 项目复习

内容:

1、设计物流配送流程

2、启动物流配送流程

3、查询组任务、拾取组任务

4、查询个人任务、办理个人任务

 

1.    设计物流配送流程

  

    物流配送流程

基于组任务进行任务分配、使用排他网关,分支选择使用流程变量实现

Activiti图形界面中:

Process的Id值 对应流程定义表中的key值,可以用于启动最新版本的流程实例

 



 

任务节点中:

General的 Id值对应任务表中的Task_def_key既 taskDefinitionKey值,用于定义项目中TaskAction中的任务办理方法名

 

 



Main config的Candidate grops属性的值对应角色Role的name名字,activiti表中Group的Id值(role和group同步保存的时候 group Id 的值应设定为role的name,因为id值为uuid不便于阅读)

 

 



排他网关,分支选择使用流程变量实现,条件中condition 的表达式获取流程变量中的值来判定true or false 选择分支

 

 

 

2.    启动流程配送流程

第一步:在工作单管理WorkordermanageAction中提供list方法,查询start状态为"0"的工作单

Service代码:

[java]  view plain  copy
  1. public List<Workordermanage> findListNotStart() {  
  2.     DetachedCriteria detachedCriteria = DetachedCriteria  
  3.             .forClass(Workordermanage.class);  
  4.     // 添加条件:start == 0  
  5.     detachedCriteria.add(Restrictions.eq("start""0"));  
  6.     return workordermanageDao.findByCondition(detachedCriteria);  
  7. }  

 

第二步:配置struts.xml

第三步:提供startranster.jsp页面,展示工作单 

第四步:在工作单管理Action中提供start方法,启动物流配送流程 

Service代码:

通过id获取Workordermanage对象设置start状态为1启动状态,并且启动物流配送流程实例

[java]  view plain  copy
  1. @Resource  
  2. private ProcessEngine processEngine;  
  3.   
  4. // 启动物流配送流程,将工作单对象设置到流程变量中  
  5. public void start(String id) {  
  6.     Workordermanage workordermanage = workordermanageDao.findById(id);  
  7.     workordermanage.setStart("1");  
  8.     String processDefinitionKey = "transfer";// 物流配送流程key  
  9.     Map<String, Object> variables = new HashMap<String, Object>();  
  10.     variables.put("业务数据", workordermanage);  
  11.     processEngine.getRuntimeService().startProcessInstanceByKey(  
  12.             processDefinitionKey, variables);  
  13. }  

 

 

3.    查询组任务

第一步:创建一个TaskAction,提供findGroupTask,查询当前登录用户的组(公共)任务

[java]  view plain  copy
  1. @Controller  
  2. @Scope("prototype")  
  3. public class TaskAction extends ActionSupport {  
  4.     @Resource  
  5.     private ProcessEngine processEngine;  
  6.   
  7.     /** 
  8.      * 查询组任务 
  9.      */  
  10.     public String findGroupTask() {  
  11.         // 任务查询  
  12.         TaskQuery query = processEngine.getTaskService().createTaskQuery();  
  13.         String candidateUser = BOSContext.getLoginUser().getId();  
  14.         // 根据组任务过滤  
  15.         query.taskCandidateUser(candidateUser);  
  16.         query.orderByTaskCreateTime().desc();  
  17.         List<Task> list = query.list();  
  18.         ActionContext.getContext().getValueStack().set("list", list);  
  19.         return "groupTaskList";  
  20.     }  

 

第二步:配置struts.xml

第三步:grouptask.jsp页面展示组任务数据

[html]  view plain  copy
  1. <body class="easyui-layout">  
  2.     <div data-options="region:'center'">  
  3.         <table class="easyui-datagrid" fit="true" nowrap="false">  
  4.             <thead>  
  5.                 <tr>  
  6.                     <th data-options="field:'id',width:120">任务编号</th>  
  7.                     <th data-options="field:'name',width:120">任务名称</th>  
  8.                     <th data-options="field:'data',width:520">业务数据</th>  
  9.                     <th data-options="field:'pick',width:120">拾取任务</th>  
  10.                 </tr>  
  11.             </thead>  
  12.             <script type="text/javascript">  
  13.                 function showData(taskId){  
  14.                     $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){  
  15.                         $("#div"+taskId).html(data);  
  16.                     });  
  17.                 }  
  18.                   
  19.                 function toggleData(taskId){  
  20.                         $("#div"+taskId).toggle();  
  21.                 }  
  22.             </script>  
  23.             <tbody>  
  24.               
  25.                 <s:iterator value="list" var="task">  
  26.                     <tr>  
  27.                         <td><s:property value="id"/> </td>  
  28.                         <td><s:property value="name"/></td>  
  29.                         <td>  
  30.                             <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>  
  31.                             <div style="display: none" id="div${id }">  
  32.                                 <script type="text/javascript">  
  33.                                     showData('${id}');  
  34.                                 </script>  
  35.                             </div>  
  36.                         </td>  
  37.                         <td>  
  38.                             <s:a action="taskAction_takeTask" namespace="/" cssClass="easyui-linkbutton">拾取  
  39.                                 <s:param name="taskId" value="id"></s:param>  
  40.                             </s:a>  
  41.                         </td>  
  42.                     </tr>  
  43.                 </s:iterator>  
  44.             </tbody>  
  45.         </table>  
  46.     </div>  
  47. </body>  

 

第四步:在TaskAction中提供showData方法,根据任务ID查询流程变量

[java]  view plain  copy
  1. // 接收任务ID  
  2. private String taskId;  
  3. public String getTaskId() {  
  4.     return taskId;  
  5. }  
  6.   
  7. public void setTaskId(String taskId) {  
  8.     this.taskId = taskId;  
  9. }  
  10.   
  11. /** 
  12.  * ajax查询流程变量 
  13.  *  
  14.  * @throws IOException 
  15.  */  
  16. public String showData() throws IOException {  
  17.     Map<String, Object> map = processEngine.getTaskService().getVariables(  
  18.             taskId);  
  19.     ServletActionContext.getResponse().setContentType(  
  20.             "text/html;charset=UTF-8");  
  21.     ServletActionContext.getResponse().getWriter().print(map);  
  22.     return NONE;  
  23. }  

 

效果:

toggle()[如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。] 控制div的  style="display: none" 

 

 

4.    拾取组任务

第一步:在TaskAction中提供拾取组任务的方法takeTask

 

[java]  view plain  copy
  1. /** 
  2.  * 拾取组任务 
  3.  */  
  4. public String takeTask() {  
  5.     processEngine.getTaskService().claim(taskId,  
  6.             BOSContext.getLoginUser().getId());  
  7.     return "toGroupTaskList";  
  8. }  

第二步:配置struts.xml

 

5.    查询个人任务

第一步:在TaskAction中提供findPersonalTask方法,查询个人任务

Assignee的值取决于用户表同步时activiti的user_id值的同步设置

[java]  view plain  copy
  1. /** 
  2.  * 查询当前登录人的个人任务 
  3.  */  
  4. public String findPersonalTask() {  
  5.     TaskQuery query = processEngine.getTaskService().createTaskQuery();  
  6.     query.taskAssignee(BOSContext.getLoginUser().getId());  
  7.     query.orderByTaskCreateTime().desc();  
  8.     List<Task> list = query.list();  
  9.     ActionContext.getContext().getValueStack().set("list", list);  
  10.     return "personalTaskList";  
  11. }  
 

第二步:配置struts.xml

第三步:提供personaltask.jsp

 

[html]  view plain  copy
  1. <body class="easyui-layout">  
  2.     <div data-options="region:'center'">  
  3.         <table class="easyui-datagrid" fit="true" nowrap="false">  
  4.             <thead>  
  5.                 <tr>  
  6.                     <th data-options="field:'id',width:120">任务编号</th>  
  7.                     <th data-options="field:'name',width:120">任务名称</th>  
  8.                     <th data-options="field:'data',width:520">业务数据</th>  
  9.                     <th data-options="field:'pick',width:120">办理任务</th>  
  10.                 </tr>  
  11.             </thead>  
  12.             <script type="text/javascript">  
  13.                 function showData(taskId){  
  14.                     $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){  
  15.                         $("#div"+taskId).html(data);  
  16.                     });  
  17.                 }  
  18.                   
  19.                 function toggleData(taskId){  
  20.                         $("#div"+taskId).toggle();  
  21.                 }  
  22.             </script>  
  23.             <tbody>  
  24.                 <s:iterator value="list" var="task">  
  25.                     <tr>  
  26.                         <td><s:property value="id"/> </td>  
  27.                         <td><s:property value="name"/></td>  
  28.                         <td>  
  29.                             <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>  
  30.                             <div style="display: none" id="div${id }">  
  31.                                 <script type="text/javascript">  
  32.                                     showData('${id}');  
  33.                                 </script>  
  34.                             </div>  
  35.                         </td>  
  36.                         <td>  
  37.                             <s:a action="taskAction_%{taskDefinitionKey}" namespace="/" cssClass="easyui-linkbutton">办理任务  
  38.                                 <s:param name="taskId" value="id"></s:param>  
  39.                             </s:a>  
  40.                         </td>  
  41.                     </tr>  
  42.                 </s:iterator>  
  43.             </tbody>  
  44.         </table>  
  45.     </div>  
  46. </body>  

 

6.    办理任务


6.1   办理审核工作单任务


第一步:在TaskAction中提供审核工作单办理的方法

[java]  view plain  copy
  1. private Integer check;// 审核结果  
  2. public Integer getCheck() {  
  3.     return check;  
  4. }  
  5.   
  6. public void setCheck(Integer check) {  
  7.     this.check = check;  
  8. }  
  9. @Resource  
  10. private IWorkordermanageService workordermanageService;  
  11. /** 
  12.  * 办理审核工作单任务 
  13.  */  
  14. public String checkWorkOrderManage() {  
  15.     if (check == null) {  
  16.         // 跳转到审核工作单表单页面  
  17.         // 根据任务的ID查询流程变量  
  18.         Map<String, Object> map = processEngine.getTaskService()  
  19.                 .getVariables(taskId);  
  20.         ActionContext.getContext().getValueStack().set("map", map);  
  21.         return "checkUI";  
  22.     } else {  
  23.         // 2、修改工作单中的managerCheck为“1”  
  24.         Workordermanage workOrderManage = (Workordermanage) processEngine  
  25.                 .getTaskService().getVariable(taskId, "业务数据");  
  26.         workOrderManage.setManagerCheck("1");  
  27.         // 3、如果审核不通过,修改工作单的start为“0”  
  28.         if (check == 0) {  
  29.             workOrderManage.setStart("0");  
  30.         }  
  31.         workordermanageService.update(workOrderManage);  
  32.         // 1、根据任务ID办理任务,设置流程变量check  
  33.         Map<String, Object> variables = new HashMap<String, Object>();  
  34.         variables.put("check", check);  
  35.         processEngine.getTaskService().complete(taskId, variables);  
  36.         return "toPersonalTaskList";  
  37.     }  
  38. }  

 

第二步:提供check.jsp页面,作为审核工作单的表单页面

[html]  view plain  copy
  1. <body>  
  2.     <h3>审核工作单</h3>  
  3.     ${map }  
  4.     <s:form namespace="/" action="taskAction_checkWorkOrderManage">  
  5.         <s:hidden name="taskId"></s:hidden>  
  6.          审核结果:<select name="check">  
  7.                     <option value="1">通过</option>  
  8.                     <option value="0">不通过</option>  
  9.                 </select>  
  10.                 <input type="submit" value="提交">  
  11.     </s:form>  
  12. </body>  

 

6.2   办理其他任务

[java]  view plain  copy
  1. // 办理出库任务  
  2. public String outStore() {  
  3.     Map<String, Object> variables = new HashMap<String, Object>();  
  4.     variables.put("仓库管理员", BOSContext.getLoginUser().getUsername());  
  5.     processEngine.getTaskService().complete(taskId, variables);  
  6.     return "toPersonalTaskList";  
  7. }  
  8.   
  9. // 办理配送任务  
  10. public String transferGoods() {  
  11.     Map<String, Object> variables = new HashMap<String, Object>();  
  12.     variables.put("取派员", BOSContext.getLoginUser().getUsername());  
  13.     processEngine.getTaskService().complete(taskId, variables);  
  14.     return "toPersonalTaskList";  
  15. }  
  16.   
  17. // 办理签收任务  
  18. public String receive() {  
  19.     Map<String, Object> variables = new HashMap<String, Object>();  
  20.     variables.put("取派员", BOSContext.getLoginUser().getUsername());  
  21.     processEngine.getTaskService().complete(taskId, variables);  
  22.     return "toPersonalTaskList";  
  23. }  





项目复习



1.    项目第一天

    项目概述

1、项目背景介绍、软件开发流程(瀑布模型)、常见的软件项目类型(OA、CRM、ERP、CMS)

2、搭建bos项目开发环境(SSH +MySQL+tomcat)

3、主页设计(easyUI中layout、accordion、tabs 、   ztree插件使用(使用标准json数据4、构造ztree、使用简单json数据构造ztree树))

4、使用PowerDesigner设计数据库

 

2.    项目第二天

1、抽取BaseDao和BaseAction(泛型+反射)

2、实现用户登录(基于BaseDao和BaseAction)、验证码使用

3、easyUI的消息提示框messager(show、alert、confirm、prompt、progress)

4、easyUI的菜单按钮menubutton

5、编写struts2自定义拦截器(如果用户没有登录,自动跳转到登录页面)

6、使用easyUI的validatebox控件进行表单校验

6、基于window窗口实现修改密码功能

 

3.    项目第三天

1、基础设置部分需求分析(取派员、区域、分区、定区)

       整个bos项目分为基础设置、取派、中转、路由、报表部分

2、根据提供pdm文件导出sql文件,生成实体类和hbm

3、easyUI中datagrid的用法

       方式一:将页面中HTML代码渲染为datagrid样式

       方式二:发送ajax请求加载服务端json数据构造datagrid数据

       方式三:通过js代码动态创建datagrid

4、基于datagrid实现取派员的分页查询(在BaseDao中实现通用的分页查询方法)

5、修改取派员回显(基于form的load方法实现回显)

6、添加取派员(扩展手机号的校验规则)

7、删除取派员(逻辑删除)

 

4.    项目第四天

1、OCUpload一键上传js插件的使用(模拟ajax异步效果)

2、使用apache的POI技术读取excel文件中的数据

3、pinyin4j工具类使用

4、基于(一键上传、POI、pinyin4j)实现区域的批量导入功能

5、区域的分页查询

6、重构分页查询代码(BaseAction)

7、easyUI中combobox(下拉框)控件的使用

8、基于combobox实现分区的添加功能(combobox过滤功能)

9、实现分区的组合条件分页查询

10、基于POI实现分区数据导出功能

 

5.    项目第五天

1、定区的添加功能(添加窗口中使用combobox展示取派员数据、使用datagrid展示分区数据 )

2、定区分页查询

3、hessian框架的使用(远程调用技术)

       远程调用技术:hessian、webservice(cxf 、axis2)、httpClient

4、在crm服务端使用hessian发布服务,提供查询客户信息的服务

5、在bos项目中远程调用crm服务

       a.在bos中提供一个接口,和crm中的接口对应

       b.针对接口创建客户端的代理对象,通过代理对象远程调用crm

 

6.    项目第六天

1、业务受理(业务通知单、工单、工作单)

       a.在bos项目中根据手机号远程调用crm获得客户信息,并回显到页面中

       b.根据客户的取件地址实现自动分单

2、datagrid的编辑功能

       a.设置editor属性,指定那一列具有编辑功能

       b.调用方法beginEdit开启编辑功能

       c.调用方法endEdit结束编辑功能

       d.通过方法insertRow动态在数据表格中插入一行

       e.通过方法getRowIndex获得某一行的索引

       f.通过事件onAfterEdit监听结束编辑事件

3、基于数据表格编辑功能实现工作单快速录入功能

 

7.    项目第七天

1、权限概述(认证、授权)

2、常见进行权限控制的方式(URL拦截、方法注解(代理)、页面标签控制)

3、shiro框架的入门

       a.功能:认证、授权、会话管理、加密

       b.shiro运行流程:Application Code ----->>Subject-------->>SecurityManager------>Realm

4、将shiro应用到bos项目中进行认证和授权

       a.在web.xml中配置一个过滤器,spring提供的用于整合shiro的

       b.在applicationContext.xml中配置一个bean,ID为shiroFilter

       c.在applicationContext.xml中配置一个安全管理器,并注入给shiroFilter

       d.在applicationContext.xml中配置一个Realm,并注入给安全管理器

       e.修改UserAction中的login方法,使用shiro的方式进行认证,最终调用到Realm

5、使用shiro注解进行权限控制

       a.开启注解功能(在spring配置文件中配置自动代理、切面类)

       b.在Action方法上使用shiro的注解

       c.修改BaseAction的构造方法

8.    项目第八天

1、初始化权限数据(通过sql脚本插入权限数据到权限表)

2、角色管理(添加、查询)

3、用户管理(添加、查询)

4、修改BOSRealm中的授权方法,根据登录人查询对应的权限

5、使用ehcache缓存权限数据

       a.导入ehcache的jar

       b.提供ehcache的配置文件(从jar包中获得)

       c.在spring配置文件中配置一个缓存管理器,并注入给安全管理器

6、shiro标签使用

7、系统左侧菜单按照登录人的权限展示

      

9.    项目第九天

1、工作流概念

2、安装插件eclipse插件,设计流程

3、创建activiti框架的23张表(部署表、流程定义表、流程实例表、任务表、二进制表、流程变量表、组表、用户表、关系表)

4、部署流程定义、查询流程定义、启动流程实例、查询流程实例、流程图片名称和输入流、查询任务、办理任务

5、网页版流程设计器使用

 

10.   项目第十天

1、查询历史数据

2、流程变量设置、获取

3、组任务(候选人、候选组)

4、监听器(执行、任务)

5、网关(排他、并行)

6、spring整合activiti

 

11.   项目第十一天

1、部署流程定义(通过zip文件上传到服务端,完成部署)

2、查询最新版本的流程定义列表数据

3、基于struts2的文件下载实现查看png流程图片功能

4、查看正在运行的流程实例(运行状态,查询任务节点的坐标)

5、将bos系统中的角色数据和用户数据同步到activiti的表中

       也可以通过数据库的触发器实现

 

12.   项目第十二天

1、设计物流配送流程(基于组任务进行任务分配、使用排他网关,分支选择使用流程变量实现)

2、启动物流配送流程(设置流程变量---工作单)

3、查询组任务

4、拾取组任务,变为个人任务

5、查询个人任务

6、办理个人任务(每个任务的办理对应一个action的方法)

目录(?)[-]

  1. 1    设计物流配送流程
  2. 2    启动流程配送流程
  3. 3    查询组任务
  4. 4    拾取组任务
  5. 5    查询个人任务
  6. 6    办理任务
  7. 项目复习

内容:

1、设计物流配送流程

2、启动物流配送流程

3、查询组任务、拾取组任务

4、查询个人任务、办理个人任务

 

1.    设计物流配送流程

  

    物流配送流程

基于组任务进行任务分配、使用排他网关,分支选择使用流程变量实现

Activiti图形界面中:

Process的Id值 对应流程定义表中的key值,可以用于启动最新版本的流程实例

 



 

任务节点中:

General的 Id值对应任务表中的Task_def_key既 taskDefinitionKey值,用于定义项目中TaskAction中的任务办理方法名

 

 



Main config的Candidate grops属性的值对应角色Role的name名字,activiti表中Group的Id值(role和group同步保存的时候 group Id 的值应设定为role的name,因为id值为uuid不便于阅读)

 

 



排他网关,分支选择使用流程变量实现,条件中condition 的表达式获取流程变量中的值来判定true or false 选择分支

 

 

 

2.    启动流程配送流程

第一步:在工作单管理WorkordermanageAction中提供list方法,查询start状态为"0"的工作单

Service代码:

[java]  view plain  copy
  1. public List<Workordermanage> findListNotStart() {  
  2.     DetachedCriteria detachedCriteria = DetachedCriteria  
  3.             .forClass(Workordermanage.class);  
  4.     // 添加条件:start == 0  
  5.     detachedCriteria.add(Restrictions.eq("start""0"));  
  6.     return workordermanageDao.findByCondition(detachedCriteria);  
  7. }  

 

第二步:配置struts.xml

第三步:提供startranster.jsp页面,展示工作单 

第四步:在工作单管理Action中提供start方法,启动物流配送流程 

Service代码:

通过id获取Workordermanage对象设置start状态为1启动状态,并且启动物流配送流程实例

[java]  view plain  copy
  1. @Resource  
  2. private ProcessEngine processEngine;  
  3.   
  4. // 启动物流配送流程,将工作单对象设置到流程变量中  
  5. public void start(String id) {  
  6.     Workordermanage workordermanage = workordermanageDao.findById(id);  
  7.     workordermanage.setStart("1");  
  8.     String processDefinitionKey = "transfer";// 物流配送流程key  
  9.     Map<String, Object> variables = new HashMap<String, Object>();  
  10.     variables.put("业务数据", workordermanage);  
  11.     processEngine.getRuntimeService().startProcessInstanceByKey(  
  12.             processDefinitionKey, variables);  
  13. }  

 

 

3.    查询组任务

第一步:创建一个TaskAction,提供findGroupTask,查询当前登录用户的组(公共)任务

[java]  view plain  copy
  1. @Controller  
  2. @Scope("prototype")  
  3. public class TaskAction extends ActionSupport {  
  4.     @Resource  
  5.     private ProcessEngine processEngine;  
  6.   
  7.     /** 
  8.      * 查询组任务 
  9.      */  
  10.     public String findGroupTask() {  
  11.         // 任务查询  
  12.         TaskQuery query = processEngine.getTaskService().createTaskQuery();  
  13.         String candidateUser = BOSContext.getLoginUser().getId();  
  14.         // 根据组任务过滤  
  15.         query.taskCandidateUser(candidateUser);  
  16.         query.orderByTaskCreateTime().desc();  
  17.         List<Task> list = query.list();  
  18.         ActionContext.getContext().getValueStack().set("list", list);  
  19.         return "groupTaskList";  
  20.     }  

 

第二步:配置struts.xml

第三步:grouptask.jsp页面展示组任务数据

[html]  view plain  copy
  1. <body class="easyui-layout">  
  2.     <div data-options="region:'center'">  
  3.         <table class="easyui-datagrid" fit="true" nowrap="false">  
  4.             <thead>  
  5.                 <tr>  
  6.                     <th data-options="field:'id',width:120">任务编号</th>  
  7.                     <th data-options="field:'name',width:120">任务名称</th>  
  8.                     <th data-options="field:'data',width:520">业务数据</th>  
  9.                     <th data-options="field:'pick',width:120">拾取任务</th>  
  10.                 </tr>  
  11.             </thead>  
  12.             <script type="text/javascript">  
  13.                 function showData(taskId){  
  14.                     $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){  
  15.                         $("#div"+taskId).html(data);  
  16.                     });  
  17.                 }  
  18.                   
  19.                 function toggleData(taskId){  
  20.                         $("#div"+taskId).toggle();  
  21.                 }  
  22.             </script>  
  23.             <tbody>  
  24.               
  25.                 <s:iterator value="list" var="task">  
  26.                     <tr>  
  27.                         <td><s:property value="id"/> </td>  
  28.                         <td><s:property value="name"/></td>  
  29.                         <td>  
  30.                             <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>  
  31.                             <div style="display: none" id="div${id }">  
  32.                                 <script type="text/javascript">  
  33.                                     showData('${id}');  
  34.                                 </script>  
  35.                             </div>  
  36.                         </td>  
  37.                         <td>  
  38.                             <s:a action="taskAction_takeTask" namespace="/" cssClass="easyui-linkbutton">拾取  
  39.                                 <s:param name="taskId" value="id"></s:param>  
  40.                             </s:a>  
  41.                         </td>  
  42.                     </tr>  
  43.                 </s:iterator>  
  44.             </tbody>  
  45.         </table>  
  46.     </div>  
  47. </body>  

 

第四步:在TaskAction中提供showData方法,根据任务ID查询流程变量

[java]  view plain  copy
  1. // 接收任务ID  
  2. private String taskId;  
  3. public String getTaskId() {  
  4.     return taskId;  
  5. }  
  6.   
  7. public void setTaskId(String taskId) {  
  8.     this.taskId = taskId;  
  9. }  
  10.   
  11. /** 
  12.  * ajax查询流程变量 
  13.  *  
  14.  * @throws IOException 
  15.  */  
  16. public String showData() throws IOException {  
  17.     Map<String, Object> map = processEngine.getTaskService().getVariables(  
  18.             taskId);  
  19.     ServletActionContext.getResponse().setContentType(  
  20.             "text/html;charset=UTF-8");  
  21.     ServletActionContext.getResponse().getWriter().print(map);  
  22.     return NONE;  
  23. }  

 

效果:

toggle()[如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。] 控制div的  style="display: none" 

 

 

4.    拾取组任务

第一步:在TaskAction中提供拾取组任务的方法takeTask

 

[java]  view plain  copy
  1. /** 
  2.  * 拾取组任务 
  3.  */  
  4. public String takeTask() {  
  5.     processEngine.getTaskService().claim(taskId,  
  6.             BOSContext.getLoginUser().getId());  
  7.     return "toGroupTaskList";  
  8. }  

第二步:配置struts.xml

 

5.    查询个人任务

第一步:在TaskAction中提供findPersonalTask方法,查询个人任务

Assignee的值取决于用户表同步时activiti的user_id值的同步设置

[java]  view plain  copy
  1. /** 
  2.  * 查询当前登录人的个人任务 
  3.  */  
  4. public String findPersonalTask() {  
  5.     TaskQuery query = processEngine.getTaskService().createTaskQuery();  
  6.     query.taskAssignee(BOSContext.getLoginUser().getId());  
  7.     query.orderByTaskCreateTime().desc();  
  8.     List<Task> list = query.list();  
  9.     ActionContext.getContext().getValueStack().set("list", list);  
  10.     return "personalTaskList";  
  11. }  
 

第二步:配置struts.xml

第三步:提供personaltask.jsp

 

[html]  view plain  copy
  1. <body class="easyui-layout">  
  2.     <div data-options="region:'center'">  
  3.         <table class="easyui-datagrid" fit="true" nowrap="false">  
  4.             <thead>  
  5.                 <tr>  
  6.                     <th data-options="field:'id',width:120">任务编号</th>  
  7.                     <th data-options="field:'name',width:120">任务名称</th>  
  8.                     <th data-options="field:'data',width:520">业务数据</th>  
  9.                     <th data-options="field:'pick',width:120">办理任务</th>  
  10.                 </tr>  
  11.             </thead>  
  12.             <script type="text/javascript">  
  13.                 function showData(taskId){  
  14.                     $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){  
  15.                         $("#div"+taskId).html(data);  
  16.                     });  
  17.                 }  
  18.                   
  19.                 function toggleData(taskId){  
  20.                         $("#div"+taskId).toggle();  
  21.                 }  
  22.             </script>  
  23.             <tbody>  
  24.                 <s:iterator value="list" var="task">  
  25.                     <tr>  
  26.                         <td><s:property value="id"/> </td>  
  27.                         <td><s:property value="name"/></td>  
  28.                         <td>  
  29.                             <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>  
  30.                             <div style="display: none" id="div${id }">  
  31.                                 <script type="text/javascript">  
  32.                                     showData('${id}');  
  33.                                 </script>  
  34.                             </div>  
  35.                         </td>  
  36.                         <td>  
  37.                             <s:a action="taskAction_%{taskDefinitionKey}" namespace="/" cssClass="easyui-linkbutton">办理任务  
  38.                                 <s:param name="taskId" value="id"></s:param>  
  39.                             </s:a>  
  40.                         </td>  
  41.                     </tr>  
  42.                 </s:iterator>  
  43.             </tbody>  
  44.         </table>  
  45.     </div>  
  46. </body>  

 

6.    办理任务


6.1   办理审核工作单任务


第一步:在TaskAction中提供审核工作单办理的方法

[java]  view plain  copy
  1. private Integer check;// 审核结果  
  2. public Integer getCheck() {  
  3.     return check;  
  4. }  
  5.   
  6. public void setCheck(Integer check) {  
  7.     this.check = check;  
  8. }  
  9. @Resource  
  10. private IWorkordermanageService workordermanageService;  
  11. /** 
  12.  * 办理审核工作单任务 
  13.  */  
  14. public String checkWorkOrderManage() {  
  15.     if (check == null) {  
  16.         // 跳转到审核工作单表单页面  
  17.         // 根据任务的ID查询流程变量  
  18.         Map<String, Object> map = processEngine.getTaskService()  
  19.                 .getVariables(taskId);  
  20.         ActionContext.getContext().getValueStack().set("map", map);  
  21.         return "checkUI";  
  22.     } else {  
  23.         // 2、修改工作单中的managerCheck为“1”  
  24.         Workordermanage workOrderManage = (Workordermanage) processEngine  
  25.                 .getTaskService().getVariable(taskId, "业务数据");  
  26.         workOrderManage.setManagerCheck("1");  
  27.         // 3、如果审核不通过,修改工作单的start为“0”  
  28.         if (check == 0) {  
  29.             workOrderManage.setStart("0");  
  30.         }  
  31.         workordermanageService.update(workOrderManage);  
  32.         // 1、根据任务ID办理任务,设置流程变量check  
  33.         Map<String, Object> variables = new HashMap<String, Object>();  
  34.         variables.put("check", check);  
  35.         processEngine.getTaskService().complete(taskId, variables);  
  36.         return "toPersonalTaskList";  
  37.     }  
  38. }  

 

第二步:提供check.jsp页面,作为审核工作单的表单页面

[html]  view plain  copy
  1. <body>  
  2.     <h3>审核工作单</h3>  
  3.     ${map }  
  4.     <s:form namespace="/" action="taskAction_checkWorkOrderManage">  
  5.         <s:hidden name="taskId"></s:hidden>  
  6.          审核结果:<select name="check">  
  7.                     <option value="1">通过</option>  
  8.                     <option value="0">不通过</option>  
  9.                 </select>  
  10.                 <input type="submit" value="提交">  
  11.     </s:form>  
  12. </body>  

 

6.2   办理其他任务

[java]  view plain  copy
  1. // 办理出库任务  
  2. public String outStore() {  
  3.     Map<String, Object> variables = new HashMap<String, Object>();  
  4.     variables.put("仓库管理员", BOSContext.getLoginUser().getUsername());  
  5.     processEngine.getTaskService().complete(taskId, variables);  
  6.     return "toPersonalTaskList";  
  7. }  
  8.   
  9. // 办理配送任务  
  10. public String transferGoods() {  
  11.     Map<String, Object> variables = new HashMap<String, Object>();  
  12.     variables.put("取派员", BOSContext.getLoginUser().getUsername());  
  13.     processEngine.getTaskService().complete(taskId, variables);  
  14.     return "toPersonalTaskList";  
  15. }  
  16.   
  17. // 办理签收任务  
  18. public String receive() {  
  19.     Map<String, Object> variables = new HashMap<String, Object>();  
  20.     variables.put("取派员", BOSContext.getLoginUser().getUsername());  
  21.     processEngine.getTaskService().complete(taskId, variables);  
  22.     return "toPersonalTaskList";  
  23. }  





项目复习



1.    项目第一天

    项目概述

1、项目背景介绍、软件开发流程(瀑布模型)、常见的软件项目类型(OA、CRM、ERP、CMS)

2、搭建bos项目开发环境(SSH +MySQL+tomcat)

3、主页设计(easyUI中layout、accordion、tabs 、   ztree插件使用(使用标准json数据4、构造ztree、使用简单json数据构造ztree树))

4、使用PowerDesigner设计数据库

 

2.    项目第二天

1、抽取BaseDao和BaseAction(泛型+反射)

2、实现用户登录(基于BaseDao和BaseAction)、验证码使用

3、easyUI的消息提示框messager(show、alert、confirm、prompt、progress)

4、easyUI的菜单按钮menubutton

5、编写struts2自定义拦截器(如果用户没有登录,自动跳转到登录页面)

6、使用easyUI的validatebox控件进行表单校验

6、基于window窗口实现修改密码功能

 

3.    项目第三天

1、基础设置部分需求分析(取派员、区域、分区、定区)

       整个bos项目分为基础设置、取派、中转、路由、报表部分

2、根据提供pdm文件导出sql文件,生成实体类和hbm

3、easyUI中datagrid的用法

       方式一:将页面中HTML代码渲染为datagrid样式

       方式二:发送ajax请求加载服务端json数据构造datagrid数据

       方式三:通过js代码动态创建datagrid

4、基于datagrid实现取派员的分页查询(在BaseDao中实现通用的分页查询方法)

5、修改取派员回显(基于form的load方法实现回显)

6、添加取派员(扩展手机号的校验规则)

7、删除取派员(逻辑删除)

 

4.    项目第四天

1、OCUpload一键上传js插件的使用(模拟ajax异步效果)

2、使用apache的POI技术读取excel文件中的数据

3、pinyin4j工具类使用

4、基于(一键上传、POI、pinyin4j)实现区域的批量导入功能

5、区域的分页查询

6、重构分页查询代码(BaseAction)

7、easyUI中combobox(下拉框)控件的使用

8、基于combobox实现分区的添加功能(combobox过滤功能)

9、实现分区的组合条件分页查询

10、基于POI实现分区数据导出功能

 

5.    项目第五天

1、定区的添加功能(添加窗口中使用combobox展示取派员数据、使用datagrid展示分区数据 )

2、定区分页查询

3、hessian框架的使用(远程调用技术)

       远程调用技术:hessian、webservice(cxf 、axis2)、httpClient

4、在crm服务端使用hessian发布服务,提供查询客户信息的服务

5、在bos项目中远程调用crm服务

       a.在bos中提供一个接口,和crm中的接口对应

       b.针对接口创建客户端的代理对象,通过代理对象远程调用crm

 

6.    项目第六天

1、业务受理(业务通知单、工单、工作单)

       a.在bos项目中根据手机号远程调用crm获得客户信息,并回显到页面中

       b.根据客户的取件地址实现自动分单

2、datagrid的编辑功能

       a.设置editor属性,指定那一列具有编辑功能

       b.调用方法beginEdit开启编辑功能

       c.调用方法endEdit结束编辑功能

       d.通过方法insertRow动态在数据表格中插入一行

       e.通过方法getRowIndex获得某一行的索引

       f.通过事件onAfterEdit监听结束编辑事件

3、基于数据表格编辑功能实现工作单快速录入功能

 

7.    项目第七天

1、权限概述(认证、授权)

2、常见进行权限控制的方式(URL拦截、方法注解(代理)、页面标签控制)

3、shiro框架的入门

       a.功能:认证、授权、会话管理、加密

       b.shiro运行流程:Application Code ----->>Subject-------->>SecurityManager------>Realm

4、将shiro应用到bos项目中进行认证和授权

       a.在web.xml中配置一个过滤器,spring提供的用于整合shiro的

       b.在applicationContext.xml中配置一个bean,ID为shiroFilter

       c.在applicationContext.xml中配置一个安全管理器,并注入给shiroFilter

       d.在applicationContext.xml中配置一个Realm,并注入给安全管理器

       e.修改UserAction中的login方法,使用shiro的方式进行认证,最终调用到Realm

5、使用shiro注解进行权限控制

       a.开启注解功能(在spring配置文件中配置自动代理、切面类)

       b.在Action方法上使用shiro的注解

       c.修改BaseAction的构造方法

8.    项目第八天

1、初始化权限数据(通过sql脚本插入权限数据到权限表)

2、角色管理(添加、查询)

3、用户管理(添加、查询)

4、修改BOSRealm中的授权方法,根据登录人查询对应的权限

5、使用ehcache缓存权限数据

       a.导入ehcache的jar

       b.提供ehcache的配置文件(从jar包中获得)

       c.在spring配置文件中配置一个缓存管理器,并注入给安全管理器

6、shiro标签使用

7、系统左侧菜单按照登录人的权限展示

      

9.    项目第九天

1、工作流概念

2、安装插件eclipse插件,设计流程

3、创建activiti框架的23张表(部署表、流程定义表、流程实例表、任务表、二进制表、流程变量表、组表、用户表、关系表)

4、部署流程定义、查询流程定义、启动流程实例、查询流程实例、流程图片名称和输入流、查询任务、办理任务

5、网页版流程设计器使用

 

10.   项目第十天

1、查询历史数据

2、流程变量设置、获取

3、组任务(候选人、候选组)

4、监听器(执行、任务)

5、网关(排他、并行)

6、spring整合activiti

 

11.   项目第十一天

1、部署流程定义(通过zip文件上传到服务端,完成部署)

2、查询最新版本的流程定义列表数据

3、基于struts2的文件下载实现查看png流程图片功能

4、查看正在运行的流程实例(运行状态,查询任务节点的坐标)

5、将bos系统中的角色数据和用户数据同步到activiti的表中

       也可以通过数据库的触发器实现

 

12.   项目第十二天

1、设计物流配送流程(基于组任务进行任务分配、使用排他网关,分支选择使用流程变量实现)

2、启动物流配送流程(设置流程变量---工作单)

3、查询组任务

4、拾取组任务,变为个人任务

5、查询个人任务

6、办理个人任务(每个任务的办理对应一个action的方法)

这篇关于BOS项目12:基于activiti物流配送流程,启动,查询,办理,项目知识点复习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369143

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定