You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
3.4 KiB

<?php
class MergeNodeHandler
{
private $currentNode;
private $flowContext;
const DEFAULT_MERGE_OPTION = "AND";
function __construct($node, $Context)
{
$this->currentNode = $node;
$this->flowContext = $Context;
}
/**
* 1.从流程图中解析出下个节点的Code 更新
*/
function doWork()
{
$flow = new Flow($this->flowContext->getFormKey());
$sm = new SubflowManager(new Flow($flow->getParentKey()));
$flag = $this->flowContext->assignStatus == AssignStatus::ACCEPT_STATUS ? 'Y' : 'N';
SubflowManager::updateReplyFlag($flow->getFormKey(), $flag);
$unReplyCount = $sm->getUnReplyCount(SubflowManager::getSeqByFormKey($flow->getFormKey()));
if ($unReplyCount == 0) {
$mergeOption = $this->currentNode->getMergeOption();
$mergeOption = empty($mergeOption) ? self::DEFAULT_MERGE_OPTION : $mergeOption;
$function = "cond" . strtoupper($mergeOption);
$this->$function($sm);
Subflow::delete($flow->getFormKey());
}
/**
*遍历所有下层节点 ,执行对应Handler类doWork方法
*/
}
/**
* 同意一个即可
* @param SubflowManager $sm
*/
private function condOR(SubflowManager $sm)
{
$cnt = $sm->getAcceptOpinionCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
if ($cnt >= 1) {
$this->nextAssign();
} else {
$this->backAssign();
}
}
/**
* 全部同意
* @param SubflowManager $sm
*/
private function condAND(SubflowManager $sm)
{
$cnt = $sm->getRejectOpinionCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
if ($cnt == 0) {
$this->nextAssign();
} else {
$this->backAssign();
}
}
/**
*同意的占多数
* @param SubflowManager $sm
*/
private function condVOTE(SubflowManager $sm)
{
$reject = $sm->getRejectOpinionCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
$accept = $sm->getAcceptOpinionCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
if ($accept >= $reject) {
$this->nextAssign();
} else {
$this->backAssign();
}
}
private function backAssign()
{
$code = SubflowManager::getCurrentParentFlowCode($this->flowContext->formKey);
$node = $this->flowContext->workFlowParser->getNodeByCode($code);
$handleClass = get_class($node) . "Handler";
$obj = new $handleClass($node, $this->flowContext, $this->formData);
$obj->doWork();
}
private function nextAssign()
{
$nextAssigner = $this->flowContext->nextAssigner;
$nextFlowNodes = $this->flowContext->workFlowParser->getNextLevelNodes($this->currentNode->getNodeId());
foreach (Node::$nodeTypes as $type) {
if (!array_key_exists($type, $nextFlowNodes)) continue;
foreach ($nextFlowNodes[$type] as $node) {
$nextFlowCode = $node->getFlowCode();
break 2;
}
}
$currentFlow = new Flow($this->flowContext->formKey);
Flow::updateFlowCode($currentFlow->getParentKey(), $nextFlowCode);
// Subflow::updateCurrentUser($currentFlow->getParentKey(), $nextAssigner);
}
}