/** * 认领 * * 必要参数 * tuduid|uniqueid|orgid|username|server|postparams|truename */ public function claim(array $params) { if (empty($params['tuduid'])) { require_once 'Model/Tudu/Exception.php'; throw new Model_Tudu_Exception('Missing or invalid value of parameter "tuduid"', self::CODE_INVALID_TUDUID); } $orgId = $this->_user->orgId; $uniqueId = $this->_user->uniqueId; $userName = $this->_user->userName; $tuduId = $params['tuduid']; //$manager = $this->getManager(); /* @var $daoFlow Dao_Td_Tudu_Flow*/ $daoFlow = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Flow', Tudu_Dao_Manager::DB_TS); /* @var $daoTudu Dao_Td_Tudu_Flow*/ $daoTudu = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Tudu', Tudu_Dao_Manager::DB_TS); // 获取图度信息 $tudu = $daoTudu->getTuduById($uniqueId, $tuduId); // 判读图度是否存在 if (null == $tudu) { require_once 'Model/Tudu/Exception.php'; throw new Model_Tudu_Exception('This tudu is not exists', self::CODE_TUDU_NOTEXISTS); } // 获取步骤 $flowRecord = $daoFlow->getFlow(array('tuduid' => $tudu->tuduId)); $step = isset($flowRecord->steps[$flowRecord->currentStepId]) ? $flowRecord->steps[$flowRecord->currentStepId] : null; // 判断当前是否为认领操作 if (!$step || $step['type'] != Dao_Td_Tudu_Step::TYPE_CLAIM) { require_once 'Model/Tudu/Exception.php'; throw new Model_Tudu_Exception('This tudu current step is not claim', self::CODE_STEP_NOTCLAIM); } // 判读图度是否已有user认领 if ($tudu->acceptTime) { require_once 'Model/Tudu/Exception.php'; throw new Model_Tudu_Exception('This tudu current step is claimed', self::CODE_STEP_CLAIM_FINISH); } $accepters = $daoTudu->getAccepters($tuduId); foreach ($accepters as $accepter) { if ($uniqueId == $accepter['uniqueid']) { $claimAccepter = $accepter; } else { $removeAccepter[] = $accepter; } } require_once 'Model/Tudu/Extension/Flow.php'; $flow = new Model_Tudu_Extension_Flow(); $flow->setAttributes($flowRecord->toArray()); // 插入新的步骤 $stepId = Dao_Td_Tudu_Step::getStepId(); $flow->complete($flow->currentStepId, $this->_user->uniqueId); if ($tudu->flowId && strstr($step['next'], 'ST-')) { $flow->deleteStep($step['next']); } $flow->addStep(array('stepid' => $stepId, 'prev' => $step['stepid'], 'next' => $step['next'], 'type' => 0)); $flow->updateStep($step['stepid'], array('next' => $stepId)); $flow->addStepSection($stepId, array(array('uniqueid' => $this->_user->uniqueId, 'truename' => $this->_user->trueName, 'username' => $this->_user->userName, 'email' => $this->_user->userName, 'status' => 0))); $flow->flowTo($stepId); if (!$daoFlow->updateFlow($flow->tuduId, $flow->toArray())) { require_once 'Model/Tudu/Exception.php'; throw new Model_Tudu_Exception('Tudu flow save failed', self::CODE_SAVE_FAILED); } $ret = $daoTudu->updateTudu($tuduId, array('to' => $claimAccepter['accepterinfo'], 'stepid' => $stepId, 'stepnum' => count($flow->steps), 'acceptmode' => 0)); $params = array('accepttime' => time(), 'tudustatus' => Dao_Td_Tudu_Tudu::STATUS_DOING); // 更新认领人 td_tudu_user $ret = $daoTudu->updateTuduUser($tuduId, $uniqueId, $params); if (!$ret) { require_once 'Model/Tudu/Exception.php'; throw new Model_Tudu_Exception('Claim tudu failed', self::CODE_SAVE_FAILED); } // 更新图度的接受时间 $daoTudu->updateLastAcceptTime($tuduId); // 更新需要移除的执行人及去除“我执行”标签 if (!empty($removeAccepter)) { foreach ($removeAccepter as $rmAccept) { if (!$daoTudu->updateTuduUser($tuduId, $rmAccept['uniqueid'], array('role' => null))) { continue; } if (!$daoTudu->deleteLabel($tuduId, $rmAccept['uniqueid'], '^a')) { continue; } } } /* @var $daoPost Dao_Td_Tudu_Post */ $daoPost = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Post', Tudu_Dao_Manager::DB_TS); $content = sprintf('%s 认领了该图度。', $this->_user->trueName); $header = array('action' => 'claim', 'tudu-claimer' => $this->_user->trueName); $postParams = array('orgid' => $this->_user->orgId, 'boardid' => $tudu->boardId, 'tuduid' => $tudu->tuduId, 'uniqueid' => $this->_user->uniqueId, 'poster' => $this->_user->trueName, 'posterinfo' => $this->_user->position, 'email' => $this->_user->userName, 'postid' => Dao_Td_Tudu_Post::getPostId($tuduId), 'header' => $header, 'content' => $content, 'lastmodify' => implode(chr(9), array($this->_user->uniqueId, time(), $this->_user->trueName))); $postId = $daoPost->createPost($postParams); //发送回复 $daoPost->sendPost($tuduId, $postId); //标记未读 $daoTudu->markAllUnRead($tuduId); // 添加操作日志 $this->_writeLog(Dao_Td_Log_Log::TYPE_TUDU, $tuduId, Dao_Td_Log_Log::ACTION_TUDU_CLAIM, array('orgid' => $orgId, 'uniqueid' => $uniqueId, 'userinfo' => $this->_user->userInfo), array('claimuser' => $this->_user->trueName, 'claimtime' => time(), 'status' => Dao_Td_Tudu_Tudu::STATUS_DOING)); if (Tudu_Model::hasResource(Tudu_Model::RESOURCE_CONFIG)) { $config = Tudu_Model::getResource(Tudu_Model::RESOURCE_CONFIG); if ($config['httpsqs']) { $options = $config['httpsqs']; $charset = isset($config['charset']) ? $config['charset'] : 'utf-8'; $httpsqs = new Oray_Httpsqs($options['host'], $options['port'], $charset, $options['name']); $notifyTo = array($tudu->sender); $notifyTo = array_merge($notifyTo, array_keys($tudu->to)); if ($tudu->notifyAll) { $notifyTo = array_merge($notifyTo, array_keys($tudu->cc)); } $tpl = <<<HTML <strong>您刚收到一个新的回复</strong><br /> <a href="http://{$this->_user->domainName}/frame#m=view&tid=%s&page=1" target="_blank" _tid="{$tuduId}">%s</a><br /> 发起人:{$this->_user->trueName}<br /> 更新日期:%s<br /> {$content} HTML; $data = implode(' ', array('tudu', 'reply', '', http_build_query(array('tuduid' => $tudu->tuduId, 'from' => $userName, 'to' => implode(',', $notifyTo), 'content' => sprintf($tpl, $tudu->tuduId, $tudu->subject, date('Y-m-d H:i:s', time())))))); $httpsqs->put($data); } } }
/** * 编辑图度时进行的流程 * * @param Model_Tudu_Tudu $tudu */ public function updateTuduFlow(Model_Tudu_Tudu &$tudu) { /* @var $flow Model_Tudu_Extension_Flow */ $flow = $tudu->getExtension('Model_Tudu_Extension_Flow'); if (null === $flow) { /** * @see Model_Tudu_Extension_Flow */ require_once 'Model/Tudu/Extension/Flow.php'; $flow = new Model_Tudu_Extension_Flow(); } if ($flow->isPrepared) { return; } $isCreate = true; if ($tudu->tuduId) { /* @var $daoFlow Dao_Td_Tudu_Flow */ $daoFlow = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Flow', Tudu_Dao_Manager::DB_TS); $savedFlow = $daoFlow->getFlow(array('tuduid' => $tudu->tuduId)); $isCreate = false; if (null != $savedFlow) { $flow->fromFlow = true; } if (!$tudu->isDraft && $savedFlow) { $flowInfo = $savedFlow->toArray(); $flowSteps = array(); foreach ($flowInfo['steps'] as $sid => $st) { if (empty($sid) || empty($st)) { continue; } $flowSteps[$sid] = $st; } $flowInfo['steps'] = $flowSteps; // 工作流,检查是否有拒绝或不同意项目,然后重发 if ($tudu->flowId || $tudu->fromTudu && $tudu->fromTudu->appId == 'attend') { $isBreak = false; $flowTo = $flowInfo['currentstepid']; foreach ($flowInfo['steps'] as $sid => $st) { foreach ($st['section'] as $idx => $sec) { foreach ($sec as $i => $u) { if (isset($u['status']) && $u['status'] > 2) { $isTo = 0 === strpos($flowTo, '^') || null === $flowTo; $flowInfo['steps'][$sid]['section'][$idx][$i]['status'] = $isTo ? 1 : 0; if ($isTo) { $flowTo = $st['stepid']; } } } } } $flow->setAttributes($flowInfo); $flow->flowTo($flowTo); //var_dump($flow->steps);exit; if (0 !== strpos($flow->currentStepId, '^')) { $step = $flow->getStep($flow->currentStepId); $users = $flow->getCurrentUser(); $receiver = array(); foreach ($users as $u) { $receiver[$u['username']] = array('uniqueid' => $u['uniqueid'], 'email' => $u['username'], 'username' => $u['username'], 'truename' => $u['truename']); } if ($step['type'] == 2) { $tudu->acceptMode = 1; } if ($step['type'] == 1) { $tudu->reviewer = $receiver; } else { $tudu->to = $receiver; } } return; } } else { $isCreate = true; } } if (!isset($flowInfo)) { $flowInfo = array('orgid' => $tudu->orgId, 'tuduid' => $tudu->tuduId); } $flow->setAttributes($flowInfo); // 已经存在流程 // 1. 定位当前步骤 // 2. 对比当前执行和审批是否与输入一致 // 3. 不一致则标记原有,一样则维持原状 if ($isCreate) { if ($tudu->flowId) { $this->prepareFlowFromTemplate($tudu, $flow); } else { $this->renewTuduFlow($tudu, $flow); } } else { if (!$flow->steps || !is_array($flow->steps)) { return $this->appendTuduFlow($tudu, $flow); } $steps = $flow->steps; $lastStep = end($steps); $currentStepId = $flow->currentStepId == '^end' ? $lastStep['stepid'] : $flow->currentStepId; $step = isset($flow->steps[$currentStepId]) ? $flow->steps[$currentStepId] : null; $isDisagree = false; foreach ($flow->steps as $item) { if (!isset($item['section']) || !is_array($item['section'])) { continue; } foreach ($item['section'] as $sec) { foreach ($sec as $u) { if ($item['type'] == 1 && isset($u['status']) && $u['status'] > 2) { if (null === $step && 0 === strpos($flow->currentStepId, '^')) { $step = $item; $flow->currentStepId = $item['stepid']; } $isDisagree = $item['type'] == 1; break 3; // 拒绝的 } elseif ($item['type'] == 0 && isset($u['status']) && ($u['status'] <= 1 || $u['status'] == 3)) { if (null === $step && 0 === strpos($flow->currentStepId, '^')) { $step = $item; $flow->currentStepId = $item['stepid']; } break 3; } } } } if (null === $step) { if (empty($flow->steps)) { return $this->appendTuduFlow($tudu, $flow); } return; } $isModified = false; $isReview = $step['type'] == 1; $users = $isReview ? (array) $tudu->reviewer : (array) $tudu->to; $isPass = true; $base = 0; $mBase = 0; $secIdx = 0; // 处理输入 $section = $step['section'][$step['currentSection']]; $currentSection = array(); $completeUsers = array(); $currentUsers = array(); $currentStepId = $flow->currentStepId; $prev = $flow->currentStepId; $flowTo = null; $flowToSec = null; // 保持当前已经完成或审批通过的帐号信息 foreach ($section as $u) { $currentUsers[] = $u['username']; if ($u['status'] == 2) { $currentSection[] = $u; $completeUsers[] = $u['username']; } } // 当前步骤为执行,把非完成的步骤设为取消 if (!$isReview) { $section = $step['section'][$step['currentSection']]; $to = reset($users); $isCancel = count($section) != count($to) && $tudu->operation == 'send' && !$isDisagree; if (!$isCancel) { $toArr = array(); foreach ($to as $item) { $toArr[] = $item['username']; } foreach ($section as $u) { if (!in_array($u['username'], $toArr)) { $isCancel = !$isDisagree; break; } } } if ($isCancel) { $flow->cancelStepSection($step['stepid'], $step['currentSection']); $prev = $step['prev']; } } // 移除当前步骤后续 //if (!$isDisagree) { /*for ($i = $step['currentSection'] + 1, $l = count($step['section']); $i < $l; $i++) { $flow->removeStepSection($step['stepid'], $i); }*/ //} // 移除后续的所有步骤 $steps = $flow->getSteps(); $isExceed = false; foreach ($steps as $id => $item) { if ($id == $flow->currentStepId) { $isExceedSection = false; foreach ($item['section'] as $idx => $sec) { if ($idx == $item['currentSection']) { $isExceedSection = true; if ($isReview) { continue; } } if ($isExceedSection) { $flow->removeStepSection($id, $idx); } } $isExceed = true; continue; } if ($isExceed) { $flow->deleteStep($id); if ($id == $prev) { $prev = $item['prev']; } } } if (empty($flow->steps[$flow->currentStepId]['section'])) { $flow->deleteStep($step['stepid']); if ($isReview) { $isReview = false; } } if (!isset($flow->steps[$prev])) { $prev = '^head'; } // 添加审批人 if ($tudu->reviewer) { $reviewer = $tudu->reviewer; if (!$isReview) { $stepId = $flow->addStep(array('type' => Dao_Td_Tudu_Step::TYPE_EXAMINE, 'prev' => $prev)); if (!$tudu->flowId) { $flow->updateStep($prev, array('next' => $stepId)); } $prev = $stepId; } else { $stepId = $flow->currentStepId; } $flowTo = $stepId; foreach ($reviewer as $idx => $sec) { $users = $isReview && $idx == 0 ? $currentSection : array(); if ($isReview && $idx == 0 && isset($flow->steps[$currentStepId]['currentSection'])) { $secIdx = $flow->steps[$currentStepId]['currentSection']; $section = $flow->steps[$currentStepId]['section'][$secIdx]; foreach ($section as $i => $cu) { if (!isset($sec[$cu['username']]) && $cu['status'] != 2) { $flow->removeStepSectionUser($currentStepId, $secIdx, $cu['username']); } elseif ($cu['status'] == 3) { $flow->updateStepSectionUser($currentStepId, $secIdx, $cu['username'], array('status' => 1)); $completeUsers[] = $cu['username']; } } } foreach ($sec as $u) { // 跳过已经完成审批的用户 if ($idx == 0 && $isReview) { if (!in_array($u['username'], $completeUsers)) { $u['status'] = 1; $flow->addStepSectionUser($currentStepId, $flow->steps[$currentStepId]['currentSection'], $u); } continue; } $users[] = $u; } if (!empty($users) && !($isReview && $idx == 0)) { $flow->addStepSection($stepId, $users); } } $tudu->reviewer = reset($reviewer); // 移除当前审批人 } elseif ($isReview) { $secIdx = $flow->steps[$currentStepId]['currentSection']; $section = $flow->steps[$currentStepId]['section'][$secIdx]; foreach ($section as $i => $cu) { if ($cu['status'] != 2) { $flow->removeStepSectionUser($currentStepId, $secIdx, $cu['username']); } } if (empty($flow->steps[$currentStepId]['section'])) { $flow->deleteStep($step['stepid']); } } if (!count($flow->steps)) { $prev = '^head'; } if ($prev && 0 !== strpos($prev, '^head')) { $step = $flow->getStep($prev); if (empty($step['section'])) { $flow->deleteStep($prev); $prev = '^head'; } } // 添加当前步骤 if ($tudu->to) { $to = $tudu->to; $executeStepId = $flow->addStep(array('type' => $tudu->acceptMode ? Dao_Td_Tudu_Step::TYPE_CLAIM : Dao_Td_Tudu_Step::TYPE_EXECUTE, 'prev' => $prev, 'next' => '^end')); if (null === $flowTo) { $flowTo = $executeStepId; } foreach ($to as $idx => $sec) { $users = !$isReview && $idx == 0 ? $currentSection : array(); foreach ($sec as $u) { if ($idx == 0 && !$isReview && in_array($u['username'], $completeUsers)) { continue; } $users[] = $u; } $flow->addStepSection($executeStepId, $users); } $tudu->to = reset($to); } $flow->flowTo($flowTo); } }