您的位置:首页 > 其它

activiti自定义流程之整合(六):获取我的申请任务

2016-04-16 13:34 597 查看
流程启动后,流程节点便进入到了任务相关的部分。可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据。实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置。

至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种。

而在任务相关的部分,我是把用户任务分成了两种,一种是我的申请,一种是我的任务。区别就是我发起的任务,和别人提交给我的或者反馈给我的任务。

那么流程一启动,第一个自然就是自己的申请了,这里便说明这个问题。

在这一篇中,需要注意的并不在于form表单,而是如何判断是不是初次申请,我一开始用的是流程节点来判断,这样就需要拿到流程节点并进行相关的遍历。

但是后来我回过头来再看时便发现其实远不止着一种方法,比如也可以通过任务来区分,如果整个流程实例只有一个任务,那么这个任务自然就是申请。当然了,前提是要限制任务是不能删除的。

还有就是,每一个任务都有启动时间,根据这个时间进行排序也应该可以进行判断,只是这个我还没有尝试,可行性究竟如何还有待确定。

那么下边就又到了上代码的时刻:

后台代码如下:

[java] view
plain copy







/**

* @throwsXMLStreamException

* 查询我申请未提交的任务

*

* @author:tuzongxun

* @Title: findTask

* @param@return

* @return Object

* @date Mar 17, 20162:44:11 PM

* @throws

*/

@RequestMapping(value = "/findFirstTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")

@ResponseBody

public Object findFirstTask(HttpServletRequest req)

throws XMLStreamException {

Map<String, Object> map = new HashMap<String, Object>();

boolean isLogin = this.isLogin(req);

if (isLogin) {

List<TaskModel> taskList = new ArrayList<TaskModel>();

HttpSession session = req.getSession();

String assginee = (String) session.getAttribute("userName");

List<Task> taskList1 = taskService.createTaskQuery()

.taskAssignee(assginee).list();

if (taskList1 != null && taskList1.size() > 0) {

for (Task task : taskList1) {

TaskModel taskModel = new TaskModel();

// 获取部署名

String processdefintionId = task.getProcessDefinitionId();

ProcessDefinition processDefinition = repositoryService

.createProcessDefinitionQuery()

.processDefinitionId(processdefintionId)

.singleResult();

// 根据taskname和节点判断是否是第一个

String taskName = task.getName();

Iterator<FlowElement> iterator = this

.findFlow(processdefintionId);

String row0 = null;

String eleName0 = null;

while (iterator.hasNext()) {

FlowElement flowElement0 = iterator.next();

// 下一个节点

FlowElement flowElement = iterator.next();

String eleName = flowElement.getName();

if (taskName.equals(eleName)) {

row0 = flowElement0.getXmlRowNumber() + "";

eleName0 = flowElement0.getClass().getSimpleName();

break;

}

}

// 提交申请时

if (eleName0.equals("StartEvent")) {

///////////////////////////

// 获取流程变量

Map<String, Object> variables = runtimeService

.getVariables(task.getProcessInstanceId());

Set<String> keysSet = variables.keySet();

Iterator<String> keySet = keysSet.iterator();

Map<String, String> formData = new HashMap<String,String>();

taskModel.setLastForm(this

.getStartForm1((String) variables

.get("deploymentId")));

taskModel.setAssignee(task.getAssignee());

taskModel.setCreateTime(task.getCreateTime());

taskModel.setId(task.getId());

taskModel.setName(task.getName());

taskModel.setProcessInstanceId(task

.getProcessInstanceId());

taskModel

.setProcessDefId(task.getProcessDefinitionId());

taskModel.setFormKey(task.getFormKey());

String deploymentId = processDefinition

.getDeploymentId();

Deployment deployment = repositoryService

.createDeploymentQuery()

.deploymentId(deploymentId).singleResult();

String deploymentName = deployment.getName();

taskModel.setDeploymentName(deploymentName);

while (keySet.hasNext()) {

String key = keySet.next();

String value = (String) variables.get(key);

if (key.contains(row0)) {

formData.put(key, value);

}

}

taskModel.setFormData(formData);

taskList.add(taskModel);

}

}

}

map.put("isLogin", "yes");

map.put("userName",

(String) req.getSession().getAttribute("userName"));

map.put("result", "success");

map.put("data", taskList);

} else {

map.put("isLogin", "no");

}

return map;

}

注意上边的方法中有调用getStartForm1这个方法,可在上一篇中找到。另外一个调用查询流程节点的方法如下:

[java] view
plain copy







/**

* @throwsXMLStreamException

* 查询流程节点

*

* @author:tuzongxun

* @Title: findFlow

* @param@return

* @return Iterator<FlowElement>

* @date Mar 21, 20169:31:42 AM

* @throws

*/

public Iterator<FlowElement> findFlow(String processDefId)

throws XMLStreamException {

List<ProcessDefinition> lists = repositoryService

.createProcessDefinitionQuery()

.processDefinitionId(processDefId)

.orderByProcessDefinitionVersion().desc().list();

ProcessDefinition processDefinition = lists.get(0);

processDefinition.getCategory();

String resourceName = processDefinition.getResourceName();

InputStream inputStream = repositoryService.getResourceAsStream(

processDefinition.getDeploymentId(), resourceName);

BpmnXMLConverter converter = new BpmnXMLConverter();

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLStreamReader reader = factory.createXMLStreamReader(inputStream);

BpmnModel bpmnModel = converter.convertToBpmnModel(reader);

Process process = bpmnModel.getMainProcess();

Collection<FlowElement> elements = process.getFlowElements();

Iterator<FlowElement> iterator = elements.iterator();

return iterator;

}

前台的代码,我想经过这么久的代码罗列,app.js和html中的写法应该没有必要再写了,业务逻辑如下:

[javascript] view
plain copy







angular.module('activitiApp')

.controller('findFirstTaskCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){

$scope.init=function(){

$http.post("./findFirstTask.do").success(function(result) {

if(result.isLogin==="yes"){

$rootScope.userName=result.userName;

$scope.taskList=result.data;

}else{

$location.path("/login");

}

});

}

//查看findDetail(task)

$scope.findDetail=function(task){

console.log(task);

$('#findDetail').html('').dialog({

title:'节点名称[' + task.name + ']',

modal:true,

width:$.common.window.getClientWidth() * 0.6,

height:$.common.window.getClientHeight() * 0.9,

open:function() {

// 获取json格式的表单数据,就是流程定义中的所有field

var dialog = this;

// 读取启动时的表单

// 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来

$(dialog).append("<div class='formContent' />");

$('.formContent').html('').wrap("<form id='findDetailForm' class='formkey-form1'method='post' />");

var $form = $('.formkey-form1');

//设置部署的Id

$form.append("任务Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");

$form.append("申请时间:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='createTime' value="+new Date(task.createTime).format('yyyy-MM-dd hh:mm:ss')+"></br>");

//根据formData设置申请页面

//处理form字符串

var form=task.lastForm;

//console.log(form);

varindex0=form.lastIndexOf(">");

var p=form.split("<p>");

for(var i=1;i<p.length;i++){

var pName=p[i].substring(0,p[i].indexOf(":")+1);

var index1=p[i].indexOf('name="');

var p0=p[i].substring(index1,p[i].lastIndexOf(">"));

var index2=p0.indexOf('"');

var keyName=p[i].substring(index1+6,index2+index1+7);

var value=null;

for(var key in task.formData){

// var keyString=key+"";

// if(keyString===keyName){

// value=(task.formData)[key];

var keyString=key.substring(0,key.length-1);

if(keyString===keyName){

value=(task.formData)[key];

}

}

$form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='createTime'value='"+value+"'></br>");

}

// 初始化日期组件

$form.find('.datetime').datetimepicker({

stepMinute: 5

});

$form.find('.date').datepicker();

// 表单验证

$form.validate($.extend({},$.common.plugin.validator));

},

buttons:[{

text:'关闭',

click:function() {

$("#findDetail").dialog("close");

//sendStartupRequest();

}

}]

}).position({

//my:"center",

//at:"center",

offset:'300 300',

of: window,

collision:"fit"

});

}

//完成任务

$scope.completeTaskTo=function(task){

console.log(task);

$('#comTask').html('').dialog({

title:'节点名称[' + task.name + ']',

modal:true,

width:$.common.window.getClientWidth() * 0.6,

height:$.common.window.getClientHeight() * 0.9,

open:function() {

// 获取json格式的表单数据,就是流程定义中的所有field

var dialog = this;

// 读取启动时的表单

// 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来

$(dialog).append("<div class='formContent' />");

$('.formContent').html('').wrap("<form id='completeTask' class='formkey-form'method='post' />");

var $form = $('.formkey-form');

// 设置表单action getStartFormAndStartProcess

$form.attr('action', './completeTask');

//设置部署的Id

$form.append("任务Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");

$form.append("申请时间:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' value="+new Date(task.createTime).format('yyyy-MM-dd hh:mm:ss')+"></br>");

//根据formData设置申请页面

//处理form字符串

varform=task.lastForm;

//console.log(form);

varindex0=form.lastIndexOf(">");

var p=form.split("<p>");

for(var i=1;i<p.length;i++){

var pName=p[i].substring(0,p[i].indexOf(":")+1);

var index1=p[i].indexOf('name="');

varp0=p[i].substring(index1,p[i].lastIndexOf(">"));

var index2=p0.indexOf('"');

var keyName=p[i].substring(index1+6,index2+index1+7);

var value=null;

for(var key in task.formData){

var keyString=key.substring(0,key.length-1);

if(keyString===keyName){

value=(task.formData)[key];

}

}

$form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' value='"+value+"'></br>");

}

///////////////////////////////////////

$.post('./getTaskForm.do',task.formKey, function(result) {

//设置部署的Id

//$form.append("<inputtype='hidden' name='deploymentId' value="+deploymentId+">");

$form.append(result.form);

});

////////////////////////////////////////

// 初始化日期组件

$form.find('.datetime').datetimepicker({

stepMinute: 5

});

$form.find('.date').datepicker();

// 表单验证

$form.validate($.extend({},$.common.plugin.validator));

},

buttons:[{

text:'提交',

click:function() {

$("#comTask").dialog("close");

sendStartupRequest();

}

}]

}).position({

//my:"center",

//at:"center",

offset:'300 300',

of: window,

collision:"fit"

});

}

/**

* 提交表单

* @return {[type]} [description]

*/

functionsendStartupRequest() {

if ($(".formkey-form").valid()) {

var url = './completeTask.do';

var args = $('#completeTask').serialize();

$.post(url,args, function(data){

$("#comTask").dialog("close");

//$location.path("/processList");

window.location.href=("#/processList");

setTimeout(function(){

//$location.path("/findFirstTask");

window.location.href =("#/findFirstTask");

},1500);

});

}

}

}])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: