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.
 
 
 
 
 
 

141 lines
4.7 KiB

<?php
/**
* User: user
* Date: 2018/9/10
* Time: 12:03
* @
*/
class CounterSignSubtaskHandler
{
private $formData;
private $flowContext;
private $currentNode;
const DEFAULT_MERGE_OPTION = "AND";
function __construct(FlowContext $flowContext, $formData = array())
{
$this->formData = $formData;
$this->flowContext = $flowContext;
$parser = $flowContext->getWorkFLowParser();
$this->currentNode = $parser->getNodeByCode($flowContext->getFlowCode());
}
/**
* 1,根据签核状态变更workflow_sublow reply_flag Y:同意; N:不同意; NULL:未回复
*/
public function doWork()
{
$flow = new Flow ($this->flowContext->getFormKey());
$sm = new SubflowManager(new Flow($flow->getParentKey()));
#是否同意标志
$flag = $this->flowContext->getAssignStatus() == AssignStatus::ACCEPT_STATUS ? 'Y' : 'N';
SubflowManager::updateReplyFlag($this->flowContext->getFormKey(), $flag);
SubflowManager::updateReplyComment($this->flowContext->getFormKey(), $this->flowContext->getAssignOpinion());
$unReplyCount = $sm->getUnReplyCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
if ($unReplyCount == 0) {
$mergeOption = $this->currentNode->getMergeOption();
$mergeOption = empty($mergeOption) ? self::DEFAULT_MERGE_OPTION : $mergeOption;
$function = "cond" . strtoupper($mergeOption);
$this->$function($sm);
}
#关闭任务
$task = new NodeTask();
$task->setFormKey($this->flowContext->getFormKey())
->setFlowCode($this->flowContext->getCurrentNode()->getFlowCode())
->setState("OPEN")
->setTaskType("COUNTER_SIGN_SUBTASK")
->setPhase("SUBMIT");
$tasks = TaskManager::getTasks($task);
foreach ($tasks as $task) {
$task->setState(NodeTask::TASK_FINISH_STATE)->update();
}
}
/**
* 同意一个即可
*/
private function condOR($sm)
{
$cnt = $sm->getAcceptOpinionCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
if ($cnt >= 1) {
$this->nextAssign();
} else {
$this->backAssign();
}
}
/**
* 全部同意
*/
private function condAND($sm)
{
$cnt = $sm->getRejectOpinionCount(SubflowManager::getSeqByFormKey($this->flowContext->formKey));
if ($cnt == 0) {
$this->nextAssign();
} else {
$this->backAssign();
}
}
/**
*同意的占多数
*/
private function condVOTE($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()
{
$currentFlow = new Flow($this->flowContext->getFormKey());
$parentKey = $currentFlow->getParentKey();
$prevNodes = $this->flowContext->getWorkFLowParser()->getPrevLevelNodes($this->flowContext->getCurrentNode()->getNodeId(),
Node::FLOW_NODE | Node::LOGIC_NODE);
foreach ($prevNodes as $key => $prevNode) {
$tmpNode = $prevNode[0];
$backFlowCode = $tmpNode->getFlowCode();
$backAssign = Assign::get_lastest_record($parentKey, $backFlowCode);
if (empty($backFlowCode)) continue;
Flow::updateFlowCode($parentKey, $backAssign['flow_code']);
Subflow::updateCurrentUser($parentKey, $backAssign['assigner']);
}
}
private function nextAssign()
{
$nextFlowNodes = $this->flowContext->getWorkFLowParser()->getNextLevelNodes($this->currentNode->getNodeId());
$nextFlowCode = "";
foreach (Node::$nodeTypes as $type) {
if (!array_key_exists($type, $nextFlowNodes)) continue;
foreach ($nextFlowNodes[$type] as $node) {
$nextFlowCode = $node->getFlowCode();
$nextAssigners = $node->getAssignerList($this->flowContext->getWorkFLowParser());
break 2;
}
}
//array(1) { [0]=> array(2) { [0]=> string(2) "F1" [1]=> string(29) "00017-贺正时 协理特助," } }
$nextAssigner = substr($nextAssigners[0][1], 0, 5);
$currentFlow = new Flow($this->flowContext->getFormKey());
Flow::updateFlowCode($currentFlow->getParentKey(), $nextFlowCode);
Subflow::updateCurrentUser($currentFlow->getParentKey(), $nextAssigner);
}
}