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); } }