BOS项目笔记 第11天

 

今天内容安排:

1、流程实例管理(查询、查看运行状态)

2、将bos系统中的用户和角色同步到activiti的用户和组表

3、设计物流配送流程

4、启动物流配送流程

5、组任务操作(查询、拾取)

6、个人任务操作(查询、办理)

 

1. 流程实例管理

1.1 查询流程实例列表

第一步:创建一个流程实例管理Action,提供list方法,查询流程实例列表数据

 

第二步:配置struts.xml

 

第三步:提供processinstance.jsp页面,展示列表数据

<s:iterator value="list">
   <tr>
   <td>${id }</td>
   <td>${processDefinitionId }</td>
   <td>${activityId }</td>
   <td>
   <div id="div${id }"></div>
   <script type="text/javascript">
根据流程实例id查询流程变量
   $.post("${pageContext.request.contextPath}/processInstanceAction_findData.action",{"id":'${id}'},function(data){
   $("#div${id}").html(data);
   });
   </script>
   <script type="text/javascript">
   function showPng(id){
   window.showModalDialog("${pageContext.request.contextPath}/processInstanceAction_showPng.action?id="+id);
   }
   </script>
   </td>
   <td>
   <a οnclick="showPng('${id}');" href="#">查看流程图</a>
   </td>
   </tr>
   </s:iterator>

 

第四步:在Action中提供findData的方法,根据流程实例id查询对应的流程变量数据

 

 

 

1.2 查询流程实例运行状态

第一步:为“查看流程图”按钮绑定事件

<script type="text/javascript">
   function showPng(id){
弹出模式对话框
   window.showModalDialog("${pageContext.request.contextPath}/processInstanceAction_showPng.action?id="+id);
   }
   </script>
   <a class="easyui-linkbutton" data-options="iconCls:'icon-search'" 
   οnclick="showPng('${id}');" href="#">查看流程图</a>

 

第二步:在Action中提供showPng方法,根据流程实例id查询坐标、部署id、图片名称

/**
根据流程实例id查询坐标、部署id、图片名称
 */
public String showPng(){
//1、根据流程实例id查询流程实例对象
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
//2、根据流程实例对象查询流程定义id
String processDefinitionId = processInstance.getProcessDefinitionId();
//3、根据流程定义id查询流程定义对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
//4、根据流程定义对象查询部署id
deploymentId = processDefinition.getDeploymentId();
imageName = processDefinition.getDiagramResourceName();
 
//查询坐标
//1、获得当前流程实例执行到哪个节点
String activityId = processInstance.getActivityId();//usertask1
//2、加载bpmn(xml)文件,获得一个流程定义对象
ProcessDefinitionEntity pd = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);//查询act_ge_bytearray
//3、根据activitiId获取含有坐标信息的对象
ActivityImpl findActivity = pd.findActivity(activityId);
int x = findActivity.getX();
int y = findActivity.getY();
int width = findActivity.getWidth();
int height = findActivity.getHeight();
 
ActionContext.getContext().getValueStack().set("x", x);
ActionContext.getContext().getValueStack().set("y", y);
ActionContext.getContext().getValueStack().set("width", width);
ActionContext.getContext().getValueStack().set("height", height);
 
return "showPng";
}

第三步:配置struts.xml,跳转到image.jsp页面

 

第四步:提供image.jsp页面

<!-- 1.获取到规则流程图 -->
<img style="position: absolute;top: 0px;left: 0px;"
 src="processInstanceAction_viewImage?deploymentId=${deploymentId }&imageName=${imageName}">
 
<!-- 2.根据当前活动的坐标,动态绘制DIV -->
<div style="position: absolute;border:1px solid red;top:${y-1}px;left:${x-1}px;width:${width}px;height:${height}px;">
</div>

第五步:在Action中提供viewImage方法,根据部署id和图片名称获得对应的输入流

 

第六步:配置struts.xml

 

 

 

2. 将bos系统中用户和角色同步到activiti

2.1 将角色同步到act_id_group表

修改RoleServiceImpl中的save方法

 

2.2 将用户同步到act_id_user表

修改UserServiceImpl的save方法

 

 

3. 设计物流配送流程

l 流程定义的id:

 

l 使用排他网关:

 

l 使用组任务:

 

l 任务的id(对应Action中的方法名):

 

 

4. 启动物流配送流程

l 修改工作单类

 

l 修改工作单hbm映射文件

 

4.1 查询工作单列表数据

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

 

Service代码:

 

第二步:配置struts.xml

 

第三步:提供startransfer.sjp页面,展示工作单列表数据

 

 

4.2 根据key启动流程实例

第一步:修改列表页面中启动按钮绑定事件

 

第二步:在工作单Action中提供start方法,启动物流配送流程对应的流程实例

 

第三步:在工作单Service中提供start方法

 

5. 组任务操作

5.1 查询组任务

第一步:创建一个TaskAction,提供查询组任务的方法findGroupTask

 

第二步:配置struts.xml

 

第三步:提供grouptask.jsp页面,展示任务列表数据

<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 οnclick="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>

 

5.2 拾取组任务

第一步:修改jsp页面中拾取按钮事件

 

第二步:在TaskAction中提供拾取任务的方法

 

第三步:配置struts.xml

 

 

6. 个人任务操作

6.1 查询个人任务

第一步:在TaskAction中提供findPersonalTask,查询当前登录人的个人任务

 

第二步:配置struts.xml

 

第三步:提供personaltask.jsp页面,展示个人任务列表数据

<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 οnclick="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>

 

 

6.2 办理个人任务

6.2.1 办理审核工作单任务

第一步:修改personaltask.jsp页面中办理任务按钮的事件

 

第二步:在TaskAction中提供checkWorkOrderManage方法,处理审核工作单任务

/**
办理审核工作单任务
 */
public String checkWorkOrderManage() {
// 根据任务id查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
// 根据任务对象查询流程实例id
String processInstanceId = task.getProcessInstanceId();
// 根据流程实例id查询流程实例对象
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
String workordermanageId = processInstance.getBusinessKey();
Workordermanage workordermanage = workordermanageService.findById(workordermanageId);
if(check == null){
//跳转到审核页面
// 跳转到一个审核工作单页面,展示当前对应的工作单信息
ActionContext.getContext().getValueStack().set("map", workordermanage);
return "check";
}else{
workordermanageService.checkWorkordermanage(taskId,check,workordermanageId);
return "topersonaltasklist";
}
}

第三步:如果是跳转页面,配置struts.xml

 

第四步:提供check.jsp页面,展示审核工作单表单页面

 

第五步:在工作单Service中提供方法,处理审核工作单任务

 

 

6.2.2 办理其他任务