提交 215063f9 编写于 作者: zhouweidong's avatar zhouweidong

加签、待阅

上级 fdf1e93d
...@@ -8,6 +8,7 @@ import cn.ibizlab.core.workflow.service.IWFGroupService; ...@@ -8,6 +8,7 @@ import cn.ibizlab.core.workflow.service.IWFGroupService;
import cn.ibizlab.core.workflow.service.IWFProcessDefinitionService; import cn.ibizlab.core.workflow.service.IWFProcessDefinitionService;
import cn.ibizlab.core.workflow.service.IWFUserService; import cn.ibizlab.core.workflow.service.IWFUserService;
import cn.ibizlab.util.client.IBZUAAFeignClient; import cn.ibizlab.util.client.IBZUAAFeignClient;
import cn.ibizlab.util.enums.ProcFunction;
import cn.ibizlab.util.enums.TaskType; import cn.ibizlab.util.enums.TaskType;
import cn.ibizlab.util.errors.BadRequestAlertException; import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.helper.RuleUtils; import cn.ibizlab.util.helper.RuleUtils;
...@@ -33,7 +34,6 @@ import org.flowable.engine.history.HistoricProcessInstance; ...@@ -33,7 +34,6 @@ import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.ProcessInstanceHistoryLog; import org.flowable.engine.history.ProcessInstanceHistoryLog;
import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentBuilder; import org.flowable.engine.repository.DeploymentBuilder;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Comment; import org.flowable.engine.task.Comment;
import org.flowable.identitylink.api.IdentityLink; import org.flowable.identitylink.api.IdentityLink;
...@@ -97,8 +97,8 @@ public class WFCoreService ...@@ -97,8 +97,8 @@ public class WFCoreService
@Autowired @Autowired
private RuntimeService runtimeService; private RuntimeService runtimeService;
@Autowired @Autowired
protected ManagementService managementService; protected ManagementService managementService;
@Autowired @Autowired
private WFModelService wfModelService; private WFModelService wfModelService;
...@@ -416,9 +416,9 @@ public class WFCoreService ...@@ -416,9 +416,9 @@ public class WFCoreService
} }
context.getSearchCond().in("DefinitionKey",keys); context.getSearchCond().in("DefinitionKey",keys);
if(TaskType.READ == type) if(TaskType.READ == type)
tasks = searchMyTask(context); tasks = searchMyTask(context);
else else
tasks = searchMyUnreadTask(context); tasks = searchMyUnreadTask(context);
if(!ObjectUtils.isEmpty(tasks)){ if(!ObjectUtils.isEmpty(tasks)){
for(WFTask task:tasks.getContent()) { for(WFTask task:tasks.getContent()) {
Object key=task.getProcessinstancebusinesskey(); Object key=task.getProcessinstancebusinesskey();
...@@ -429,6 +429,7 @@ public class WFCoreService ...@@ -429,6 +429,7 @@ public class WFCoreService
Map<String,Object> params = new HashMap(); Map<String,Object> params = new HashMap();
params.put("srfprocessdefinitionkey",task.getProcessdefinitionkey()); params.put("srfprocessdefinitionkey",task.getProcessdefinitionkey());
params.put("srftaskdefinitionkey",task.getTaskdefinitionkey()); params.put("srftaskdefinitionkey",task.getTaskdefinitionkey());
params.put("srftaskid",task.getId());
businessKeys.put(str,params); businessKeys.put(str,params);
} }
} }
...@@ -520,51 +521,16 @@ public class WFCoreService ...@@ -520,51 +521,16 @@ public class WFCoreService
return instance; return instance;
} }
public List<WFTaskWay> getWFLink(String system,String appname, public List<WFTaskWay> getWFLink(String system,String appname,
String entity, String businessKey,String taskDefinitionKey) { String entity, String businessKey,String taskDefinitionKey) {
List<WFTaskWay> taskWays=new ArrayList<>();
String processInstanceBusinessKey=system+":"+entity+":k-"+businessKey;
String userId=AuthenticationUser.getAuthenticationUser().getUserid();
if(StringUtils.isEmpty(userId))
return taskWays;
TaskQuery query=taskService.createTaskQuery().taskCandidateOrAssigned(userId).processInstanceBusinessKey(processInstanceBusinessKey);
if(!StringUtils.isEmpty(taskDefinitionKey))
query.taskDefinitionKey(taskDefinitionKey);
List<Task> list=query.orderByTaskCreateTime().desc().listPage(0,1);
if(list.size()==0)
return taskWays;
Task task=list.get(0);
if((!StringUtils.isEmpty(task.getProcessDefinitionId()))&&(!StringUtils.isEmpty(task.getTaskDefinitionKey()))) {
UserTask userTask = wfModelService.getModelStepById(task.getProcessDefinitionId()).get(task.getTaskDefinitionKey());
//设置流程表单
setProcessForm(userTask);
if(userTask!=null&&userTask.getOutgoingFlows()!=null) {
for(SequenceFlow sequenceFlow:userTask.getOutgoingFlows()) {
WFTaskWay way=new WFTaskWay();
way.setSequenceflowid(sequenceFlow.getId());
way.setSequenceflowname(sequenceFlow.getName());
if(task.getProcessDefinitionId().indexOf(":")>0)
way.setProcessdefinitionkey(task.getProcessDefinitionId().split(":")[0]);
way.setTaskid(task.getId());
way.setProcessinstanceid(task.getProcessInstanceId());
way.setTaskdefinitionkey(task.getTaskDefinitionKey());
way.setProcessinstancebusinesskey(processInstanceBusinessKey);
//设置流程交互表单
setTaskWayForm(sequenceFlow,way);
taskWays.add(way);
}
}
}
return taskWays;
}
public List<WFTaskWay> getTaskLink(String system,String appname, String entity, String businessKey,String taskId) {
List<WFTaskWay> taskWays=new ArrayList<>(); List<WFTaskWay> taskWays=new ArrayList<>();
String processInstanceBusinessKey=system+":"+entity+":k-"+businessKey; String processInstanceBusinessKey=system+":"+entity+":k-"+businessKey;
String userId=AuthenticationUser.getAuthenticationUser().getUserid(); String userId=AuthenticationUser.getAuthenticationUser().getUserid();
if(StringUtils.isEmpty(userId)) if(StringUtils.isEmpty(userId))
return taskWays; return taskWays;
TaskQuery query=taskService.createTaskQuery().taskCandidateOrAssigned(userId).taskId(taskId); TaskQuery query=taskService.createTaskQuery().taskCandidateOrAssigned(userId).processInstanceBusinessKey(processInstanceBusinessKey);
if(!StringUtils.isEmpty(taskDefinitionKey))
query.taskDefinitionKey(taskDefinitionKey);
List<Task> list=query.orderByTaskCreateTime().desc().listPage(0,1); List<Task> list=query.orderByTaskCreateTime().desc().listPage(0,1);
if(list.size()==0) if(list.size()==0)
return taskWays; return taskWays;
...@@ -574,6 +540,20 @@ public class WFCoreService ...@@ -574,6 +540,20 @@ public class WFCoreService
//设置流程表单 //设置流程表单
setProcessForm(userTask); setProcessForm(userTask);
if(userTask!=null&&userTask.getOutgoingFlows()!=null) { if(userTask!=null&&userTask.getOutgoingFlows()!=null) {
//加签逻辑
String procFuncs = getParam(userTask,"form","procfunc");
if(DelegationState.PENDING == task.getDelegationState() && userId.equals(task.getAssignee())
&& !StringUtils.isEmpty(procFuncs) && procFuncs.contains(ProcFunction.BEFORESIGN.value)){
WFTaskWay way = getFuncWay(task,ProcFunction.FINISH.value);
if(way!=null)
taskWays.add(way);
return taskWays;
}
//流程辅助功能
List<WFTaskWay> functions = getProcessFunc(task,userTask);
if (functions.size() > 0) {
taskWays.addAll(functions);
}
for(SequenceFlow sequenceFlow:userTask.getOutgoingFlows()) { for(SequenceFlow sequenceFlow:userTask.getOutgoingFlows()) {
WFTaskWay way=new WFTaskWay(); WFTaskWay way=new WFTaskWay();
way.setSequenceflowid(sequenceFlow.getId()); way.setSequenceflowid(sequenceFlow.getId());
...@@ -588,100 +568,94 @@ public class WFCoreService ...@@ -588,100 +568,94 @@ public class WFCoreService
setTaskWayForm(sequenceFlow,way); setTaskWayForm(sequenceFlow,way);
taskWays.add(way); taskWays.add(way);
} }
LinkedHashMap rollBackMap = getTaskProcessForm(userTask);
if(rollBackMap.size()>0){
WFTaskWay rollBackWay = new WFTaskWay();
rollBackWay.set("rollback",rollBackMap.get("rollback"));
taskWays.add(rollBackWay);
}
} }
} }
return taskWays; return taskWays;
} }
public static LinkedHashMap getTaskProcessForm(UserTask userTask){ public List<WFTaskWay> getTaskLink(String system,String appname, String entity, String businessKey,String taskId) {
List<WFTaskWay> taskWays=new ArrayList<>();
if(ObjectUtils.isEmpty(userTask)){ String processInstanceBusinessKey=system+":"+entity+":k-"+businessKey;
return null; String userId=AuthenticationUser.getAuthenticationUser().getUserid();
} if(StringUtils.isEmpty(userId))
List<ExtensionElement> elements = userTask.getExtensionElements().get("form"); return taskWays;
if(ObjectUtils.isEmpty(elements)){ TaskQuery query=taskService.createTaskQuery().taskCandidateOrAssigned(userId).taskId(taskId);
return null; List<Task> list=query.orderByTaskCreateTime().desc().listPage(0,1);
} if(list.size()==0)
LinkedHashMap processMap = new LinkedHashMap(); return taskWays;
for (ExtensionElement element : elements) { Task task=list.get(0);
List<ExtensionAttribute> extensionAttributes = element.getAttributes().get("process-form"); if((!StringUtils.isEmpty(task.getProcessDefinitionId()))&&(!StringUtils.isEmpty(task.getTaskDefinitionKey()))) {
if(!ObjectUtils.isEmpty(extensionAttributes)){ UserTask userTask = wfModelService.getModelStepById(task.getProcessDefinitionId()).get(task.getTaskDefinitionKey());
for (ExtensionAttribute attribute : extensionAttributes) { //设置流程表单
String[] keyValue = attribute.getValue().split(":"); setProcessForm(userTask);
if(keyValue.length > 1){ if(userTask!=null&&userTask.getOutgoingFlows()!=null) {
processMap.put(keyValue[0],keyValue[1]); for(SequenceFlow sequenceFlow:userTask.getOutgoingFlows()) {
} WFTaskWay way=new WFTaskWay();
way.setSequenceflowid(sequenceFlow.getId());
way.setSequenceflowname(sequenceFlow.getName());
if(task.getProcessDefinitionId().indexOf(":")>0)
way.setProcessdefinitionkey(task.getProcessDefinitionId().split(":")[0]);
way.setTaskid(task.getId());
way.setProcessinstanceid(task.getProcessInstanceId());
way.setTaskdefinitionkey(task.getTaskDefinitionKey());
way.setProcessinstancebusinesskey(processInstanceBusinessKey);
//设置流程交互表单
setTaskWayForm(sequenceFlow,way);
taskWays.add(way);
} }
} }
} }
return processMap; return taskWays;
} }
/** /**
* @param taskId 当前需要回退的节点 * 流程辅助功能
* @return 回退上一个节点 * @param userTask
* @return
*/ */
public boolean wfback(String system,String appname,String entity,String taskId) { private List<WFTaskWay> getProcessFunc(Task task , UserTask userTask) {
try { List<WFTaskWay> taskWays = new ArrayList<>();
Boolean flag = true; String procFuncs = getParam(userTask,"form","procfunc");
String sourceRef = null; if(!StringUtils.isEmpty(procFuncs)){
Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); for(String func : procFuncs.split(";")){
String taskDefinitionKey = task.getTaskDefinitionKey(); WFTaskWay taskWay = getFuncWay(task,func);
if (taskDefinitionKey == null) { if(taskWay!=null)
log.debug("taskDefinitionKey不存在"); taskWays.add(taskWay);
return false;
}
String processInstanceId = task.getProcessInstanceId();
if (processInstanceId == null) {
log.debug("processInstanceId不存在");
return false;
} }
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
// 获取历史路径
WFProcessInstance instance = getWFHistory(system, appname, entity, taskDefinitionKey, task.getProcessInstanceId());
if (!ObjectUtils.isEmpty(flowNode) && !ObjectUtils.isEmpty(instance)) {
List<WFProcessNode> usertasks = new ArrayList((Collection<? extends WFProcessNode>) instance.getExtensionparams().get("usertasks"));
for (WFProcessNode node : usertasks) {
for (SequenceFlow flow : flowNode.getIncomingFlows()) {
if (node.getUsertaskid().equals(flow.getSourceRef())&&flow.getSourceRef().startsWith("tid")) {
sourceRef = flow.getSourceRef();
flag = false;
break;
}
}
if (!flag) {
break;
}
}
} else {
return false;
}
// 执行回退
runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId).moveActivityIdTo(taskDefinitionKey, sourceRef).changeState();
} catch (Exception e) {
throw new BadRequestAlertException("回退失败","WFCoreService","wfback");
} }
return true; return taskWays;
} }
/**
// public void delegateTask(String taskId,String delegater) { * 流程辅助功能连接
// String userId = SecurityUtils.getCurrentUserObject().getId(); * @param funcType
// Task task = permissionService.validateDelegatePermissionOnTask(taskId, userId, delegater); * @return
// taskService.addComment(taskId, processInstanceId, type.toString(), message); */
// taskService.delegateTask(task.getId(), delegater); public WFTaskWay getFuncWay(Task task , String funcType){
// } WFTaskWay way = new WFTaskWay();
if(funcType.equals(ProcFunction.ROLLBACK.value)){
way.set("type",ProcFunction.ROLLBACK.value);
way.setSequenceflowname(ProcFunction.ROLLBACK.text);
}
else if(funcType.equals(ProcFunction.BEFORESIGN.value)){
way.set("type",ProcFunction.BEFORESIGN.value);
way.setSequenceflowname(ProcFunction.BEFORESIGN.text);
}
else if(funcType.equals(ProcFunction.TURN.value)){
way.set("type",ProcFunction.TURN.value);
way.setSequenceflowname(ProcFunction.TURN.text);
}
else if(funcType.equals(ProcFunction.FINISH.value)){
way.set("type",ProcFunction.FINISH.value);
way.setSequenceflowname(ProcFunction.FINISH.text);
}
else{
return null;
}
way.setTaskid(task.getId());
way.setTaskdefinitionkey(task.getTaskDefinitionKey());
return way;
}
public WFProcessInstance wfsubmit(String system,String appname, public WFProcessInstance wfsubmit(String system,String appname,
String entity,String businessKey,String taskId,WFTaskWay taskWay) { String entity,String businessKey,String taskId,WFTaskWay taskWay) {
...@@ -1119,7 +1093,7 @@ public class WFCoreService ...@@ -1119,7 +1093,7 @@ public class WFCoreService
bpmnLayout.execute(); bpmnLayout.execute();
byte[] bs= bpmnXMLConverter.convertToXML(entitymodel); byte[] bs= bpmnXMLConverter.convertToXML(entitymodel);
bmpmfileId=DigestUtils.md5DigestAsHex(bs); bmpmfileId=DigestUtils.md5DigestAsHex(bs);
if(bmpmfileId.equals(1)) if(bmpmfileId.equals(old.getMd5check()))
{ {
log.warn("部署流程没有变化,忽略 name:" + curProcess.getName() + " key " + processDefinitionKey + " deploy " + bmpmfileId); log.warn("部署流程没有变化,忽略 name:" + curProcess.getName() + " key " + processDefinitionKey + " deploy " + bmpmfileId);
deployInfo+=curProcess.getName()+" key:" + processDefinitionKey +",流程配置没有变化,忽略发布"+"\r\n"; deployInfo+=curProcess.getName()+" key:" + processDefinitionKey +",流程配置没有变化,忽略发布"+"\r\n";
...@@ -1407,28 +1381,28 @@ public class WFCoreService ...@@ -1407,28 +1381,28 @@ public class WFCoreService
* @param taskId * @param taskId
* @param taskWay * @param taskWay
*/ */
public boolean beforeSign(String system, String appname, public boolean beforeSign(String system, String appname,
String entity, String businessKey, String taskId, WFTaskWay taskWay) { String entity, String businessKey, String taskId, WFTaskWay taskWay) {
String userId=AuthenticationUser.getAuthenticationUser().getUserid(); String userId=AuthenticationUser.getAuthenticationUser().getUserid();
if (StringUtils.isEmpty(userId)) if (StringUtils.isEmpty(userId))
throw new BadRequestAlertException("未传入当前用户", entity, businessKey); throw new BadRequestAlertException("未传入当前用户", entity, businessKey);
Object signUsers = taskWay.get("users"); Object signUser = taskWay.get("srfwfannotator");
if (ObjectUtils.isEmpty(signUsers)) { if (ObjectUtils.isEmpty(signUser)) {
throw new BadRequestAlertException("未传入加签用户", entity, businessKey); throw new BadRequestAlertException("未传入加签用户", entity, businessKey);
} }
Task curTask = taskService.createTaskQuery().taskId(taskId).singleResult(); Task curTask = taskService.createTaskQuery().taskId(taskId).singleResult();
if (curTask == null) { if (curTask == null) {
throw new BadRequestAlertException(String.format("未能获取到[%s]运行任务", curTask.getId()), "", ""); throw new BadRequestAlertException(String.format("未能获取到[%s]运行任务", curTask.getId()), "", "");
} }
if (DelegationState.PENDING != curTask.getDelegationState()) { if (DelegationState.PENDING != curTask.getDelegationState()) {
taskService.delegateTask(taskId, String.valueOf(signUsers)); taskService.delegateTask(taskId, String.valueOf(signUser));
//saveTask(curTask); //saveTask(curTask);
} else { } else {
throw new BadRequestAlertException(String.format("任务正在加签中,无法进行二次加签", curTask.getId()), "", ""); throw new BadRequestAlertException(String.format("任务正在加签中,无法进行二次加签", curTask.getId()), "", "");
} }
return true; return true;
} }
/** /**
* 后加签 (转办) * 后加签 (转办)
...@@ -1440,12 +1414,12 @@ public class WFCoreService ...@@ -1440,12 +1414,12 @@ public class WFCoreService
* @param taskWay * @param taskWay
*/ */
public boolean afterSign(String system,String appname, public boolean afterSign(String system,String appname,
String entity,String businessKey,String taskId,WFTaskWay taskWay){ String entity,String businessKey,String taskId,WFTaskWay taskWay){
String userId=AuthenticationUser.getAuthenticationUser().getUserid(); String userId=AuthenticationUser.getAuthenticationUser().getUserid();
if (StringUtils.isEmpty(userId)) if (StringUtils.isEmpty(userId))
throw new BadRequestAlertException("未传入当前用户", entity, businessKey); throw new BadRequestAlertException("未传入当前用户", entity, businessKey);
Object signUser = taskWay.get("users"); Object signUser = taskWay.get("srfwftransfertor");
if (ObjectUtils.isEmpty(signUser)) { if (ObjectUtils.isEmpty(signUser)) {
throw new BadRequestAlertException("未传入转办用户", entity, businessKey); throw new BadRequestAlertException("未传入转办用户", entity, businessKey);
} }
......
package cn.ibizlab.util.enums;
/**
* 工作流辅助功能
*/
public enum ProcFunction {
/**
* 退回
*/
ROLLBACK("rollback","退回"),
/**
* 前加签
*/
BEFORESIGN("beforesign","前加签"),
/**
* 转办
*/
TURN("turn","转办"),
/**
* 加签完成
*/
FINISH("finish","完成");
ProcFunction(String value, String text) {
this.value = value;
this.text = text;
}
public String value;
public String text;
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册