|
|
@@ -12,6 +12,7 @@ import com.wflow.workflow.bean.dto.ReqProcessHandlerDTO; |
|
|
|
import com.wflow.workflow.bean.process.ProgressNode; |
|
|
|
import com.wflow.workflow.bean.process.enums.NodeTypeEnum; |
|
|
|
import com.wflow.workflow.bean.vo.ProcessProgressVo; |
|
|
|
import com.wflow.workflow.enums.ProcessHandlerEnum; |
|
|
|
import com.wflow.workflow.enums.ProcessStatusEnum; |
|
|
|
import lombok.AllArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
@@ -85,10 +86,12 @@ public class WithDrawHandle { |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
String taskId = param.getTaskId(); |
|
|
|
|
|
|
|
//1.判断出 当前审批人和上一个审批人 如果传了taskid |
|
|
|
ProgressNode progressNode = StringUtils.isBlank(param.getTaskId()) ? |
|
|
|
ProgressNode progressNode = StringUtils.isBlank(taskId) ? |
|
|
|
currentProgressInfo.get(currentProgressInfo.size() - 1) |
|
|
|
: findSubNodeByTaskId(param.getTaskId(),currentProgressInfo); |
|
|
|
: findSubNodeByTaskId(taskId,currentProgressInfo); |
|
|
|
|
|
|
|
if (Objects.isNull(progressNode)){ |
|
|
|
return Boolean.FALSE; |
|
|
@@ -129,52 +132,58 @@ public class WithDrawHandle { |
|
|
|
|
|
|
|
Boolean isAndOr = Boolean.FALSE; |
|
|
|
|
|
|
|
//判断当前子流程是否结束 如果结束了 必不能撤回 |
|
|
|
Boolean thisSubNodeOver = Boolean.FALSE; |
|
|
|
//当前节点是 会签|或签的情况 |
|
|
|
//还有种情况是 会签 或签 并且在当前节点 并且已经通过 |
|
|
|
if(CollUtil.isNotEmpty(thisAndOr)){ |
|
|
|
Integer finishNodes = 0; |
|
|
|
for(ProgressNode n : thisAndOr){ |
|
|
|
if(Objects.nonNull(n.getFinishTime())){ |
|
|
|
//当前会签 有审批过的 那么上个会签|或签 无论如何 就不可能可以撤回了 |
|
|
|
beforeAndOr = Collections.emptyList(); |
|
|
|
finishNodes ++; |
|
|
|
} |
|
|
|
//找到了 当前的操作人 在当前的 会签|或签 中 并且已经审批了 |
|
|
|
if(n.getUserId().equals(user.getEmployeeCode()) && |
|
|
|
Objects.nonNull(n.getFinishTime())){ |
|
|
|
beforeProgressNode = n; |
|
|
|
//说明当前操作人 在上个会签或者或签节点 |
|
|
|
if(n.getUserId().equals(String.valueOf(user.getUserId())) && |
|
|
|
Objects.nonNull(n.getFinishTime()) |
|
|
|
){ |
|
|
|
//肯定是可以撤回的 |
|
|
|
isAndOr = Boolean.TRUE; |
|
|
|
if(Objects.nonNull(n.getResult()) && n.getResult().equals(ProcessHandlerEnum.BACK)){ |
|
|
|
//如果上个节点被退回了 直接返回false |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
if(taskId.equals(n.getTaskId())){ |
|
|
|
//说明当前操作人 在这个会签或者或签节点 |
|
|
|
beforeProgressNode = n; |
|
|
|
return Boolean.TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
//如果都审批过了 结束了 那说明此子流程已经结束了 不能再撤回了 |
|
|
|
if(finishNodes.equals(thisAndOr.size())){ |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
}else{ |
|
|
|
//如果当前不是会签|或签 就判断 当前最后一个节点 结束了没 |
|
|
|
//如果结束了 也同样 直接不能撤回 |
|
|
|
if(Objects.nonNull(currentProgressNode.getFinishTime())){ |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// |
|
|
|
if(isAndOr){ |
|
|
|
//在本个会签节点有 但是taskId对不上 那这种情况话 其它task都不能撤回了 |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
//如果上个会签没取到 还有种情况是 会签 或签 并且在上个节点 |
|
|
|
if(!isAndOr && CollUtil.isNotEmpty(beforeAndOr)) { |
|
|
|
for (ProgressNode n : beforeAndOr) { |
|
|
|
if (n.getUserId().equals(user.getEmployeeCode()) |
|
|
|
if (n.getUserId().equals(String.valueOf(user.getUserId())) |
|
|
|
&& !TodoCenterContant.Handler.OR_SIGN_FLAG.equals(n.getWithdrawFlag())) { |
|
|
|
beforeProgressNode = n; |
|
|
|
if(Objects.nonNull(n.getResult()) && n.getResult().equals(ProcessHandlerEnum.BACK)){ |
|
|
|
//如果上个节点被退回了 直接返回false |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
//说明当前操作人 在上个会签或者或签节点 |
|
|
|
isAndOr = Boolean.TRUE; |
|
|
|
break; |
|
|
|
if(taskId.equals(n.getTaskId())){ |
|
|
|
beforeProgressNode = n; |
|
|
|
//肯定是可以撤回的 |
|
|
|
return Boolean.TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(!isAndOr && (Objects.isNull(beforeProgressNode) |
|
|
|
|| !user.getEmployeeCode().equals(beforeProgressNode.getUserId()))){ |
|
|
|
|| !String.valueOf(user.getUserId()).equals(beforeProgressNode.getUserId())) |
|
|
|
|| !taskId.equals(beforeProgressNode.getTaskId()) |
|
|
|
|| beforeProgressNode.getResult().equals(ProcessHandlerEnum.BACK)){ |
|
|
|
return Boolean.FALSE; |
|
|
|
} |
|
|
|
|
|
|
|