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