提交 6e4a7541 编写于 作者: tangyaolong's avatar tangyaolong

rollback

上级 b8af9be0
......@@ -20,8 +20,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.api.history.HistoricData;
import org.flowable.common.engine.api.identity.AuthenticationContext;
import org.flowable.common.engine.impl.identity.Authentication;
......@@ -98,8 +98,8 @@ public class WFCoreService
@Autowired
private RuntimeService runtimeService;
@Autowired
protected ManagementService managementService;
@Autowired
protected ManagementService managementService;
@Autowired
private WFModelService wfModelService;
......@@ -659,65 +659,6 @@ public class WFCoreService
return way;
}
/**
* @param taskId 当前需要回退的节点
* @return 回退上一个节点
*/
public boolean wfback(String system,String appname,String entity,String taskId) {
try {
Boolean flag = true;
String sourceRef = null;
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String taskDefinitionKey = task.getTaskDefinitionKey();
if (taskDefinitionKey == null) {
log.debug("taskDefinitionKey不存在");
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;
}
// public void delegateTask(String taskId,String delegater) {
// String userId = SecurityUtils.getCurrentUserObject().getId();
// Task task = permissionService.validateDelegatePermissionOnTask(taskId, userId, delegater);
// taskService.addComment(taskId, processInstanceId, type.toString(), message);
// taskService.delegateTask(task.getId(), delegater);
// }
public WFProcessInstance wfsubmit(String system,String appname,
String entity,String businessKey,String taskId,WFTaskWay taskWay) {
......@@ -1154,7 +1095,7 @@ public class WFCoreService
bpmnLayout.execute();
byte[] bs= bpmnXMLConverter.convertToXML(entitymodel);
bmpmfileId=DigestUtils.md5DigestAsHex(bs);
if(bmpmfileId.equals(1))
if(bmpmfileId.equals(old.getMd5check()))
{
log.warn("部署流程没有变化,忽略 name:" + curProcess.getName() + " key " + processDefinitionKey + " deploy " + bmpmfileId);
deployInfo+=curProcess.getName()+" key:" + processDefinitionKey +",流程配置没有变化,忽略发布"+"\r\n";
......@@ -1442,28 +1383,28 @@ public class WFCoreService
* @param taskId
* @param taskWay
*/
public boolean beforeSign(String system, String appname,
String entity, String businessKey, String taskId, WFTaskWay taskWay) {
public boolean beforeSign(String system, String appname,
String entity, String businessKey, String taskId, WFTaskWay taskWay) {
String userId=AuthenticationUser.getAuthenticationUser().getUserid();
if (StringUtils.isEmpty(userId))
throw new BadRequestAlertException("未传入当前用户", entity, businessKey);
Object signUsers = taskWay.get("users");
if (ObjectUtils.isEmpty(signUsers)) {
throw new BadRequestAlertException("未传入加签用户", entity, businessKey);
}
Task curTask = taskService.createTaskQuery().taskId(taskId).singleResult();
if (curTask == null) {
throw new BadRequestAlertException(String.format("未能获取到[%s]运行任务", curTask.getId()), "", "");
}
if (DelegationState.PENDING != curTask.getDelegationState()) {
taskService.delegateTask(taskId, String.valueOf(signUsers));
//saveTask(curTask);
} else {
throw new BadRequestAlertException(String.format("任务正在加签中,无法进行二次加签", curTask.getId()), "", "");
}
return true;
}
Object signUser = taskWay.get("srfwfannotator");
if (ObjectUtils.isEmpty(signUser)) {
throw new BadRequestAlertException("未传入加签用户", entity, businessKey);
}
Task curTask = taskService.createTaskQuery().taskId(taskId).singleResult();
if (curTask == null) {
throw new BadRequestAlertException(String.format("未能获取到[%s]运行任务", curTask.getId()), "", "");
}
if (DelegationState.PENDING != curTask.getDelegationState()) {
taskService.delegateTask(taskId, String.valueOf(signUser));
//saveTask(curTask);
} else {
throw new BadRequestAlertException(String.format("任务正在加签中,无法进行二次加签", curTask.getId()), "", "");
}
return true;
}
/**
* 后加签 (转办)
......@@ -1475,12 +1416,12 @@ public class WFCoreService
* @param taskWay
*/
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();
if (StringUtils.isEmpty(userId))
throw new BadRequestAlertException("未传入当前用户", entity, businessKey);
Object signUser = taskWay.get("users");
Object signUser = taskWay.get("srfwftransfertor");
if (ObjectUtils.isEmpty(signUser)) {
throw new BadRequestAlertException("未传入转办用户", entity, businessKey);
}
......@@ -1600,87 +1541,87 @@ public class WFCoreService
}
}
/**
* 设置流程表单
*
* @param sequenceFlow
* @param way
*/
private void setTaskWayForm(SequenceFlow sequenceFlow, WFTaskWay way) {
Map<String,String> attributes = getAllParam(sequenceFlow,"form");
if (!ObjectUtils.isEmpty(attributes)) {
for (Map.Entry<String,String> entry : attributes.entrySet()) {
way.set(entry.getKey(), entry.getValue());
}
}
}
/**
* 将流程表单设置到请求头中
*
* @param userTask
*/
private void setProcessForm(UserTask userTask) {
Object objReq = RequestContextHolder.currentRequestAttributes();
if (!ObjectUtils.isEmpty(objReq) && objReq instanceof ServletRequestAttributes) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = attr.getRequest();
Map<String,String> attributes = getAllParam(userTask,"form");
if (!ObjectUtils.isEmpty(attributes)) {
for (Map.Entry<String,String> entry : attributes.entrySet()) {
req.setAttribute(entry.getKey(), entry.getValue());
}
}
}
}
/**
* 获取流程节点指定参数
* @param element
* @param property
* @param attribute
* @return
*/
public String getParam(FlowElement element, String property, String attribute) {
List<ExtensionElement> formProps = element.getExtensionElements().get(property);
if (formProps == null) {
return null;
}
for (ExtensionElement prop : formProps) {
if (prop.getAttributes() == null)
return null;
Map<String, List<ExtensionAttribute>> attributes = prop.getAttributes();
if (attributes.containsKey(attribute)) {
return ObjectUtils.isEmpty(attributes.get(attribute)) ? null : String.valueOf(attributes.get(attribute).get(0).getValue());
}
}
return null;
}
/**
* 获取流程节点所有参数
* @param element
* @param property
* @return
*/
public Map<String, String> getAllParam(FlowElement element, String property) {
Map<String, String> params = new HashMap();
List<ExtensionElement> formProps = element.getExtensionElements().get(property);
if (formProps == null) {
return null;
}
for (ExtensionElement prop : formProps) {
if (prop.getAttributes() == null)
return null;
Map<String, List<ExtensionAttribute>> attributes = prop.getAttributes();
for (String attribute : attributes.keySet()) {
if (!ObjectUtils.isEmpty(attributes.get(attribute))) {
params.put(attribute, attributes.get(attribute).get(0).getValue());
}
}
}
return params;
}
/**
* 设置流程表单
*
* @param sequenceFlow
* @param way
*/
private void setTaskWayForm(SequenceFlow sequenceFlow, WFTaskWay way) {
Map<String,String> attributes = getAllParam(sequenceFlow,"form");
if (!ObjectUtils.isEmpty(attributes)) {
for (Map.Entry<String,String> entry : attributes.entrySet()) {
way.set(entry.getKey(), entry.getValue());
}
}
}
/**
* 将流程表单设置到请求头中
*
* @param userTask
*/
private void setProcessForm(UserTask userTask) {
Object objReq = RequestContextHolder.currentRequestAttributes();
if (!ObjectUtils.isEmpty(objReq) && objReq instanceof ServletRequestAttributes) {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest req = attr.getRequest();
Map<String,String> attributes = getAllParam(userTask,"form");
if (!ObjectUtils.isEmpty(attributes)) {
for (Map.Entry<String,String> entry : attributes.entrySet()) {
req.setAttribute(entry.getKey(), entry.getValue());
}
}
}
}
/**
* 获取流程节点指定参数
* @param element
* @param property
* @param attribute
* @return
*/
public String getParam(FlowElement element, String property, String attribute) {
List<ExtensionElement> formProps = element.getExtensionElements().get(property);
if (formProps == null) {
return null;
}
for (ExtensionElement prop : formProps) {
if (prop.getAttributes() == null)
return null;
Map<String, List<ExtensionAttribute>> attributes = prop.getAttributes();
if (attributes.containsKey(attribute)) {
return ObjectUtils.isEmpty(attributes.get(attribute)) ? null : String.valueOf(attributes.get(attribute).get(0).getValue());
}
}
return null;
}
/**
* 获取流程节点所有参数
* @param element
* @param property
* @return
*/
public Map<String, String> getAllParam(FlowElement element, String property) {
Map<String, String> params = new HashMap();
List<ExtensionElement> formProps = element.getExtensionElements().get(property);
if (formProps == null) {
return null;
}
for (ExtensionElement prop : formProps) {
if (prop.getAttributes() == null)
return null;
Map<String, List<ExtensionAttribute>> attributes = prop.getAttributes();
for (String attribute : attributes.keySet()) {
if (!ObjectUtils.isEmpty(attributes.get(attribute))) {
params.put(attribute, attributes.get(attribute).get(0).getValue());
}
}
}
return params;
}
/**
* 获取动态实例标识
......@@ -1728,24 +1669,24 @@ public class WFCoreService
}
}
/**
* 获取连接线条件 (all/any/all|role:any)
*
* @param execution
* @param sequenceFlowId
* @return
*/
public String getNextCondition(DelegateExecution execution, Object sequenceFlowId) {
if (!ObjectUtils.isEmpty(execution.getCurrentFlowElement()) && execution.getCurrentFlowElement() instanceof UserTask) {
UserTask userTask = (UserTask) execution.getCurrentFlowElement();
for (SequenceFlow flow : userTask.getOutgoingFlows()) {
if (sequenceFlowId.equals(flow.getId())) {
return getParam(flow, "form", "nextCondition");
}
}
}
return null;
}
/**
* 获取连接线条件 (all/any/all|role:any)
*
* @param execution
* @param sequenceFlowId
* @return
*/
public String getNextCondition(DelegateExecution execution, Object sequenceFlowId) {
if (!ObjectUtils.isEmpty(execution.getCurrentFlowElement()) && execution.getCurrentFlowElement() instanceof UserTask) {
UserTask userTask = (UserTask) execution.getCurrentFlowElement();
for (SequenceFlow flow : userTask.getOutgoingFlows()) {
if (sequenceFlowId.equals(flow.getId())) {
return getParam(flow, "form", "nextCondition");
}
}
}
return null;
}
/**
* 获取用户所属的工作流角色
......@@ -1753,55 +1694,55 @@ public class WFCoreService
* @param execution
* @return
*/
public Set<String> getRoleByUserId(String userId, DelegateExecution execution) {
Set roles = new HashSet();
if (!ObjectUtils.isEmpty(userId)) {
String candidateUsers = getParam(execution.getCurrentFlowElement(),"form","candidateUsersList");
if (!StringUtils.isEmpty(candidateUsers)) {
LinkedHashMap executionMap = (LinkedHashMap) execution.getVariable("activedata");
String[] groups = candidateUsers.split("\\|\\|");
if (groups.length > 0) {
for (String group : groups) {
if (group.contains("activedata")) {
for (String elUserId : group.split("\\|")) {
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
Expression exp = parser.parseExpression(elUserId);
context.addPropertyAccessor(new MapAccessor());
context.setVariable("activedata", executionMap);
String processUserId = exp.getValue(context, String.class);
if (!StringUtils.isEmpty(processUserId) && processUserId.contains(userId)) {
roles.add(group);
}
}
}
if (group.contains("wfCoreService.getGroupUsers")) {
String exp = group;
EvaluationContext oldContext = new StandardEvaluationContext();
oldContext.setVariable("wfCoreService", this);
oldContext.setVariable("execution", execution);
Expression oldExp = parser.parseExpression(exp);
List<WFMember> users = oldExp.getValue(oldContext, List.class);
if (!StringUtils.isEmpty(users)) {
users.forEach(groupMember -> {
if (!ObjectUtils.isEmpty(groupMember.getUserid()) && userId.equals(groupMember.getUserid())) {
String roleId;
if (!ObjectUtils.isEmpty(groupMember.getMdeptid())) {
roleId = String.format("%s_%s", groupMember.getGroupid(), groupMember.getMdeptid());
} else {
roleId = groupMember.getGroupid();
}
roles.add(roleId);
}
});
}
}
}
}
}
}
return roles;
}
public Set<String> getRoleByUserId(String userId, DelegateExecution execution) {
Set roles = new HashSet();
if (!ObjectUtils.isEmpty(userId)) {
String candidateUsers = getParam(execution.getCurrentFlowElement(),"form","candidateUsersList");
if (!StringUtils.isEmpty(candidateUsers)) {
LinkedHashMap executionMap = (LinkedHashMap) execution.getVariable("activedata");
String[] groups = candidateUsers.split("\\|\\|");
if (groups.length > 0) {
for (String group : groups) {
if (group.contains("activedata")) {
for (String elUserId : group.split("\\|")) {
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
Expression exp = parser.parseExpression(elUserId);
context.addPropertyAccessor(new MapAccessor());
context.setVariable("activedata", executionMap);
String processUserId = exp.getValue(context, String.class);
if (!StringUtils.isEmpty(processUserId) && processUserId.contains(userId)) {
roles.add(group);
}
}
}
if (group.contains("wfCoreService.getGroupUsers")) {
String exp = group;
EvaluationContext oldContext = new StandardEvaluationContext();
oldContext.setVariable("wfCoreService", this);
oldContext.setVariable("execution", execution);
Expression oldExp = parser.parseExpression(exp);
List<WFMember> users = oldExp.getValue(oldContext, List.class);
if (!StringUtils.isEmpty(users)) {
users.forEach(groupMember -> {
if (!ObjectUtils.isEmpty(groupMember.getUserid()) && userId.equals(groupMember.getUserid())) {
String roleId;
if (!ObjectUtils.isEmpty(groupMember.getMdeptid())) {
roleId = String.format("%s_%s", groupMember.getGroupid(), groupMember.getMdeptid());
} else {
roleId = groupMember.getGroupid();
}
roles.add(roleId);
}
});
}
}
}
}
}
}
return roles;
}
/**
* 创建任务
......@@ -1864,7 +1805,7 @@ public class WFCoreService
public Set<String> getUsersByRole(Set roles, DelegateExecution execution) {
Set userIds = new HashSet();
if (!ObjectUtils.isEmpty(roles)) {
String candidateUsers = getParam(execution.getCurrentFlowElement(),"form","candidateUsersList");
String candidateUsers = getParam(execution.getCurrentFlowElement(),"form","candidateUsersList");
if (!StringUtils.isEmpty(candidateUsers)) {
LinkedHashMap executionMap = (LinkedHashMap) execution.getVariable("activedata");
String[] groups = candidateUsers.split("\\|\\|");
......@@ -1912,24 +1853,24 @@ public class WFCoreService
return userIds;
}
/**
* 审批记录
* @param curTask
* @return
*/
private Task saveTask(Task curTask){
String userId = "0100";
if (StringUtils.isEmpty(userId))
if (StringUtils.isEmpty(userId))
throw new BadRequestAlertException("未传入当前用户", "", "");
Task signTask = createTask(curTask);
signTask.setParentTaskId(curTask.getId());
taskService.saveTask(signTask);
taskService.addUserIdentityLink(signTask.getId(), userId, "candidate");
taskService.complete(signTask.getId());
return signTask;
}
/**
* 审批记录
* @param curTask
* @return
*/
private Task saveTask(Task curTask){
String userId = "0100";
if (StringUtils.isEmpty(userId))
if (StringUtils.isEmpty(userId))
throw new BadRequestAlertException("未传入当前用户", "", "");
Task signTask = createTask(curTask);
signTask.setParentTaskId(curTask.getId());
taskService.saveTask(signTask);
taskService.addUserIdentityLink(signTask.getId(), userId, "candidate");
taskService.complete(signTask.getId());
return signTask;
}
/**
* 标记任务为已读
......@@ -1963,6 +1904,7 @@ public class WFCoreService
});
return true;
}
/**
* @param taskId 当前需要回退的节点
* @return 回退上一个节点
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册