本文主要是介绍BOS项目12:基于activiti物流配送流程,启动,查询,办理,项目知识点复习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录(?)[-]
- 1 设计物流配送流程
- 2 启动流程配送流程
- 3 查询组任务
- 4 拾取组任务
- 5 查询个人任务
- 6 办理任务
- 项目复习
内容:
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代码:
- public List<Workordermanage> findListNotStart() {
- DetachedCriteria detachedCriteria = DetachedCriteria
- .forClass(Workordermanage.class);
- // 添加条件:start == 0
- detachedCriteria.add(Restrictions.eq("start", "0"));
- return workordermanageDao.findByCondition(detachedCriteria);
- }
第二步:配置struts.xml
第三步:提供startranster.jsp页面,展示工作单
第四步:在工作单管理Action中提供start方法,启动物流配送流程
Service代码:
通过id获取Workordermanage对象设置start状态为1启动状态,并且启动物流配送流程实例
- @Resource
- private ProcessEngine processEngine;
- // 启动物流配送流程,将工作单对象设置到流程变量中
- public void start(String id) {
- Workordermanage workordermanage = workordermanageDao.findById(id);
- workordermanage.setStart("1");
- String processDefinitionKey = "transfer";// 物流配送流程key
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("业务数据", workordermanage);
- processEngine.getRuntimeService().startProcessInstanceByKey(
- processDefinitionKey, variables);
- }
3. 查询组任务
第一步:创建一个TaskAction,提供findGroupTask,查询当前登录用户的组(公共)任务
- @Controller
- @Scope("prototype")
- public class TaskAction extends ActionSupport {
- @Resource
- private ProcessEngine processEngine;
- /**
- * 查询组任务
- */
- public String findGroupTask() {
- // 任务查询
- TaskQuery query = processEngine.getTaskService().createTaskQuery();
- String candidateUser = BOSContext.getLoginUser().getId();
- // 根据组任务过滤
- query.taskCandidateUser(candidateUser);
- query.orderByTaskCreateTime().desc();
- List<Task> list = query.list();
- ActionContext.getContext().getValueStack().set("list", list);
- return "groupTaskList";
- }
第二步:配置struts.xml
第三步:grouptask.jsp页面展示组任务数据
- <body class="easyui-layout">
- <div data-options="region:'center'">
- <table class="easyui-datagrid" fit="true" nowrap="false">
- <thead>
- <tr>
- <th data-options="field:'id',width:120">任务编号</th>
- <th data-options="field:'name',width:120">任务名称</th>
- <th data-options="field:'data',width:520">业务数据</th>
- <th data-options="field:'pick',width:120">拾取任务</th>
- </tr>
- </thead>
- <script type="text/javascript">
- function showData(taskId){
- $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
- $("#div"+taskId).html(data);
- });
- }
- function toggleData(taskId){
- $("#div"+taskId).toggle();
- }
- </script>
- <tbody>
- <s:iterator value="list" var="task">
- <tr>
- <td><s:property value="id"/> </td>
- <td><s:property value="name"/></td>
- <td>
- <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>
- <div style="display: none" id="div${id }">
- <script type="text/javascript">
- showData('${id}');
- </script>
- </div>
- </td>
- <td>
- <s:a action="taskAction_takeTask" namespace="/" cssClass="easyui-linkbutton">拾取
- <s:param name="taskId" value="id"></s:param>
- </s:a>
- </td>
- </tr>
- </s:iterator>
- </tbody>
- </table>
- </div>
- </body>
第四步:在TaskAction中提供showData方法,根据任务ID查询流程变量
- // 接收任务ID
- private String taskId;
- public String getTaskId() {
- return taskId;
- }
- public void setTaskId(String taskId) {
- this.taskId = taskId;
- }
- /**
- * ajax查询流程变量
- *
- * @throws IOException
- */
- public String showData() throws IOException {
- Map<String, Object> map = processEngine.getTaskService().getVariables(
- taskId);
- ServletActionContext.getResponse().setContentType(
- "text/html;charset=UTF-8");
- ServletActionContext.getResponse().getWriter().print(map);
- return NONE;
- }
效果:
toggle()[如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。] 控制div的 style="display: none"
4. 拾取组任务
第一步:在TaskAction中提供拾取组任务的方法takeTask
- /**
- * 拾取组任务
- */
- public String takeTask() {
- processEngine.getTaskService().claim(taskId,
- BOSContext.getLoginUser().getId());
- return "toGroupTaskList";
- }
第二步:配置struts.xml
5. 查询个人任务
第一步:在TaskAction中提供findPersonalTask方法,查询个人任务
Assignee的值取决于用户表同步时activiti的user_id值的同步设置
- /**
- * 查询当前登录人的个人任务
- */
- public String findPersonalTask() {
- TaskQuery query = processEngine.getTaskService().createTaskQuery();
- query.taskAssignee(BOSContext.getLoginUser().getId());
- query.orderByTaskCreateTime().desc();
- List<Task> list = query.list();
- ActionContext.getContext().getValueStack().set("list", list);
- return "personalTaskList";
- }
第二步:配置struts.xml
第三步:提供personaltask.jsp
- <body class="easyui-layout">
- <div data-options="region:'center'">
- <table class="easyui-datagrid" fit="true" nowrap="false">
- <thead>
- <tr>
- <th data-options="field:'id',width:120">任务编号</th>
- <th data-options="field:'name',width:120">任务名称</th>
- <th data-options="field:'data',width:520">业务数据</th>
- <th data-options="field:'pick',width:120">办理任务</th>
- </tr>
- </thead>
- <script type="text/javascript">
- function showData(taskId){
- $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
- $("#div"+taskId).html(data);
- });
- }
- function toggleData(taskId){
- $("#div"+taskId).toggle();
- }
- </script>
- <tbody>
- <s:iterator value="list" var="task">
- <tr>
- <td><s:property value="id"/> </td>
- <td><s:property value="name"/></td>
- <td>
- <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>
- <div style="display: none" id="div${id }">
- <script type="text/javascript">
- showData('${id}');
- </script>
- </div>
- </td>
- <td>
- <s:a action="taskAction_%{taskDefinitionKey}" namespace="/" cssClass="easyui-linkbutton">办理任务
- <s:param name="taskId" value="id"></s:param>
- </s:a>
- </td>
- </tr>
- </s:iterator>
- </tbody>
- </table>
- </div>
- </body>
6. 办理任务
6.1 办理审核工作单任务
第一步:在TaskAction中提供审核工作单办理的方法
- private Integer check;// 审核结果
- public Integer getCheck() {
- return check;
- }
- public void setCheck(Integer check) {
- this.check = check;
- }
- @Resource
- private IWorkordermanageService workordermanageService;
- /**
- * 办理审核工作单任务
- */
- public String checkWorkOrderManage() {
- if (check == null) {
- // 跳转到审核工作单表单页面
- // 根据任务的ID查询流程变量
- Map<String, Object> map = processEngine.getTaskService()
- .getVariables(taskId);
- ActionContext.getContext().getValueStack().set("map", map);
- return "checkUI";
- } else {
- // 2、修改工作单中的managerCheck为“1”
- Workordermanage workOrderManage = (Workordermanage) processEngine
- .getTaskService().getVariable(taskId, "业务数据");
- workOrderManage.setManagerCheck("1");
- // 3、如果审核不通过,修改工作单的start为“0”
- if (check == 0) {
- workOrderManage.setStart("0");
- }
- workordermanageService.update(workOrderManage);
- // 1、根据任务ID办理任务,设置流程变量check
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("check", check);
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
- }
第二步:提供check.jsp页面,作为审核工作单的表单页面
- <body>
- <h3>审核工作单</h3>
- ${map }
- <s:form namespace="/" action="taskAction_checkWorkOrderManage">
- <s:hidden name="taskId"></s:hidden>
- 审核结果:<select name="check">
- <option value="1">通过</option>
- <option value="0">不通过</option>
- </select>
- <input type="submit" value="提交">
- </s:form>
- </body>
6.2 办理其他任务
- // 办理出库任务
- public String outStore() {
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("仓库管理员", BOSContext.getLoginUser().getUsername());
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
- // 办理配送任务
- public String transferGoods() {
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("取派员", BOSContext.getLoginUser().getUsername());
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
- // 办理签收任务
- public String receive() {
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("取派员", BOSContext.getLoginUser().getUsername());
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
项目复习
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 设计物流配送流程
- 2 启动流程配送流程
- 3 查询组任务
- 4 拾取组任务
- 5 查询个人任务
- 6 办理任务
- 项目复习
内容:
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代码:
- public List<Workordermanage> findListNotStart() {
- DetachedCriteria detachedCriteria = DetachedCriteria
- .forClass(Workordermanage.class);
- // 添加条件:start == 0
- detachedCriteria.add(Restrictions.eq("start", "0"));
- return workordermanageDao.findByCondition(detachedCriteria);
- }
第二步:配置struts.xml
第三步:提供startranster.jsp页面,展示工作单
第四步:在工作单管理Action中提供start方法,启动物流配送流程
Service代码:
通过id获取Workordermanage对象设置start状态为1启动状态,并且启动物流配送流程实例
- @Resource
- private ProcessEngine processEngine;
- // 启动物流配送流程,将工作单对象设置到流程变量中
- public void start(String id) {
- Workordermanage workordermanage = workordermanageDao.findById(id);
- workordermanage.setStart("1");
- String processDefinitionKey = "transfer";// 物流配送流程key
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("业务数据", workordermanage);
- processEngine.getRuntimeService().startProcessInstanceByKey(
- processDefinitionKey, variables);
- }
3. 查询组任务
第一步:创建一个TaskAction,提供findGroupTask,查询当前登录用户的组(公共)任务
- @Controller
- @Scope("prototype")
- public class TaskAction extends ActionSupport {
- @Resource
- private ProcessEngine processEngine;
- /**
- * 查询组任务
- */
- public String findGroupTask() {
- // 任务查询
- TaskQuery query = processEngine.getTaskService().createTaskQuery();
- String candidateUser = BOSContext.getLoginUser().getId();
- // 根据组任务过滤
- query.taskCandidateUser(candidateUser);
- query.orderByTaskCreateTime().desc();
- List<Task> list = query.list();
- ActionContext.getContext().getValueStack().set("list", list);
- return "groupTaskList";
- }
第二步:配置struts.xml
第三步:grouptask.jsp页面展示组任务数据
- <body class="easyui-layout">
- <div data-options="region:'center'">
- <table class="easyui-datagrid" fit="true" nowrap="false">
- <thead>
- <tr>
- <th data-options="field:'id',width:120">任务编号</th>
- <th data-options="field:'name',width:120">任务名称</th>
- <th data-options="field:'data',width:520">业务数据</th>
- <th data-options="field:'pick',width:120">拾取任务</th>
- </tr>
- </thead>
- <script type="text/javascript">
- function showData(taskId){
- $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
- $("#div"+taskId).html(data);
- });
- }
- function toggleData(taskId){
- $("#div"+taskId).toggle();
- }
- </script>
- <tbody>
- <s:iterator value="list" var="task">
- <tr>
- <td><s:property value="id"/> </td>
- <td><s:property value="name"/></td>
- <td>
- <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>
- <div style="display: none" id="div${id }">
- <script type="text/javascript">
- showData('${id}');
- </script>
- </div>
- </td>
- <td>
- <s:a action="taskAction_takeTask" namespace="/" cssClass="easyui-linkbutton">拾取
- <s:param name="taskId" value="id"></s:param>
- </s:a>
- </td>
- </tr>
- </s:iterator>
- </tbody>
- </table>
- </div>
- </body>
第四步:在TaskAction中提供showData方法,根据任务ID查询流程变量
- // 接收任务ID
- private String taskId;
- public String getTaskId() {
- return taskId;
- }
- public void setTaskId(String taskId) {
- this.taskId = taskId;
- }
- /**
- * ajax查询流程变量
- *
- * @throws IOException
- */
- public String showData() throws IOException {
- Map<String, Object> map = processEngine.getTaskService().getVariables(
- taskId);
- ServletActionContext.getResponse().setContentType(
- "text/html;charset=UTF-8");
- ServletActionContext.getResponse().getWriter().print(map);
- return NONE;
- }
效果:
toggle()[如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。] 控制div的 style="display: none"
4. 拾取组任务
第一步:在TaskAction中提供拾取组任务的方法takeTask
- /**
- * 拾取组任务
- */
- public String takeTask() {
- processEngine.getTaskService().claim(taskId,
- BOSContext.getLoginUser().getId());
- return "toGroupTaskList";
- }
第二步:配置struts.xml
5. 查询个人任务
第一步:在TaskAction中提供findPersonalTask方法,查询个人任务
Assignee的值取决于用户表同步时activiti的user_id值的同步设置
- /**
- * 查询当前登录人的个人任务
- */
- public String findPersonalTask() {
- TaskQuery query = processEngine.getTaskService().createTaskQuery();
- query.taskAssignee(BOSContext.getLoginUser().getId());
- query.orderByTaskCreateTime().desc();
- List<Task> list = query.list();
- ActionContext.getContext().getValueStack().set("list", list);
- return "personalTaskList";
- }
第二步:配置struts.xml
第三步:提供personaltask.jsp
- <body class="easyui-layout">
- <div data-options="region:'center'">
- <table class="easyui-datagrid" fit="true" nowrap="false">
- <thead>
- <tr>
- <th data-options="field:'id',width:120">任务编号</th>
- <th data-options="field:'name',width:120">任务名称</th>
- <th data-options="field:'data',width:520">业务数据</th>
- <th data-options="field:'pick',width:120">办理任务</th>
- </tr>
- </thead>
- <script type="text/javascript">
- function showData(taskId){
- $.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
- $("#div"+taskId).html(data);
- });
- }
- function toggleData(taskId){
- $("#div"+taskId).toggle();
- }
- </script>
- <tbody>
- <s:iterator value="list" var="task">
- <tr>
- <td><s:property value="id"/> </td>
- <td><s:property value="name"/></td>
- <td>
- <a onclick="toggleData('${id}')" class="easyui-linkbutton">查看业务数据</a>
- <div style="display: none" id="div${id }">
- <script type="text/javascript">
- showData('${id}');
- </script>
- </div>
- </td>
- <td>
- <s:a action="taskAction_%{taskDefinitionKey}" namespace="/" cssClass="easyui-linkbutton">办理任务
- <s:param name="taskId" value="id"></s:param>
- </s:a>
- </td>
- </tr>
- </s:iterator>
- </tbody>
- </table>
- </div>
- </body>
6. 办理任务
6.1 办理审核工作单任务
第一步:在TaskAction中提供审核工作单办理的方法
- private Integer check;// 审核结果
- public Integer getCheck() {
- return check;
- }
- public void setCheck(Integer check) {
- this.check = check;
- }
- @Resource
- private IWorkordermanageService workordermanageService;
- /**
- * 办理审核工作单任务
- */
- public String checkWorkOrderManage() {
- if (check == null) {
- // 跳转到审核工作单表单页面
- // 根据任务的ID查询流程变量
- Map<String, Object> map = processEngine.getTaskService()
- .getVariables(taskId);
- ActionContext.getContext().getValueStack().set("map", map);
- return "checkUI";
- } else {
- // 2、修改工作单中的managerCheck为“1”
- Workordermanage workOrderManage = (Workordermanage) processEngine
- .getTaskService().getVariable(taskId, "业务数据");
- workOrderManage.setManagerCheck("1");
- // 3、如果审核不通过,修改工作单的start为“0”
- if (check == 0) {
- workOrderManage.setStart("0");
- }
- workordermanageService.update(workOrderManage);
- // 1、根据任务ID办理任务,设置流程变量check
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("check", check);
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
- }
第二步:提供check.jsp页面,作为审核工作单的表单页面
- <body>
- <h3>审核工作单</h3>
- ${map }
- <s:form namespace="/" action="taskAction_checkWorkOrderManage">
- <s:hidden name="taskId"></s:hidden>
- 审核结果:<select name="check">
- <option value="1">通过</option>
- <option value="0">不通过</option>
- </select>
- <input type="submit" value="提交">
- </s:form>
- </body>
6.2 办理其他任务
- // 办理出库任务
- public String outStore() {
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("仓库管理员", BOSContext.getLoginUser().getUsername());
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
- // 办理配送任务
- public String transferGoods() {
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("取派员", BOSContext.getLoginUser().getUsername());
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
- // 办理签收任务
- public String receive() {
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("取派员", BOSContext.getLoginUser().getUsername());
- processEngine.getTaskService().complete(taskId, variables);
- return "toPersonalTaskList";
- }
项目复习
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物流配送流程,启动,查询,办理,项目知识点复习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!