Example #1
0
 /**
  *
  * @param Model_Tudu_Tudu $tudu
  * @param Model_Tudu_Extension_Flow $flow
  */
 public function appendTuduFlow(Model_Tudu_Tudu &$tudu, Model_Tudu_Extension_Flow &$flow)
 {
     // 手动工作流,可修改当前步骤或不同意的后续步骤
     $isExceed = false;
     $prev = $flow->currentStepId ? $flow->currentStepId : '^head';
     $flowTo = null;
     if ($tudu->reviewer) {
         $reviewer = $tudu->reviewer;
         $stepId = $flow->addStep(array('type' => Dao_Td_Tudu_Step::TYPE_EXAMINE, 'prev' => $prev));
         $flowTo = $prev = $stepId;
         foreach ($reviewer as $item) {
             $flow->addStepSection($stepId, $item);
         }
         $tudu->reviewer = $flow->getStepSection($stepId, 0);
     }
     if ($tudu->to) {
         $to = $tudu->to;
         $stepId = $flow->addStep(array('type' => $tudu->acceptMode ? Dao_Td_Tudu_Step::TYPE_CLAIM : Dao_Td_Tudu_Step::TYPE_EXECUTE, 'prev' => $prev));
         foreach ($to as $item) {
             $flow->addStepSection($stepId, $item);
         }
         $tudu->to = $flow->getStepSection($stepId, 0);
         if (0 !== strpos($prev, '^')) {
             $flow->updateStep($prev, array('next' => $stepId));
         }
         if (null === $flowTo) {
             $flowTo = $stepId;
         }
     }
     $flow->flowTo($flowTo);
     // 到头了
     if (0 == strpos($flow->currentStepId, '^')) {
         return;
     }
     $step = $flow->getStep($flow->currentStepId);
     $su = $flow->getStepSection($flow->currentStepId);
     $users = array();
     foreach ($su as $k => $u) {
         $users[$u['username']] = array('uniqueid' => $u['uniqueid'], 'username' => $u['username'], 'truename' => $u['truename'], 'email' => $u['username']);
     }
     if ($step['type'] == 1) {
         if (!$tudu->reviewer) {
             $tudu->reviewer = $users;
         }
     } else {
         if ($step['type'] == 2) {
             $tudu->acceptMode = 1;
         }
         if (!$tudu->to) {
             $tudu->to = $users;
         }
     }
 }
Example #2
0
    /**
     * 认领
     *
     * 必要参数
     * 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);
            }
        }
    }
Example #3
0
 /**
  *
  * @param Model_Tudu_Tudu $tudu
  * @param Model_Tudu_Extension_Flow $flow
  */
 public function renewTuduFlow(Model_Tudu_Tudu &$tudu, Model_Tudu_Extension_Flow &$flow)
 {
     // 手动工作流,可修改当前步骤或不同意的后续步骤
     $isExceed = false;
     $prev = '^head';
     if ($tudu->reviewer || $tudu->to) {
         foreach ($flow->steps as $key => $item) {
             $stepId = $item['stepid'];
             foreach ($item['section'] as $idx => $section) {
                 if ($isExceed) {
                     $flow->deleteStep($stepId);
                     continue;
                 }
                 foreach ($section as $k => $u) {
                     if (isset($u['status']) && $u['status'] >= 2) {
                         $isExceed = true;
                         $prev = $stepId;
                     }
                     if ($isExceed && $u['status'] < 2) {
                         $flow->removeStepSection($key, $idx);
                     }
                 }
                 if ($isExceed && empty($item['section'])) {
                     $prev = $item['prev'];
                     $flow->deleteStep($stepId);
                 }
             }
         }
     }
     $flowTo = null;
     if ($tudu->reviewer) {
         $reviewer = $tudu->reviewer;
         $stepId = $flow->addStep(array('type' => Dao_Td_Tudu_Step::TYPE_EXAMINE, 'prev' => $prev));
         $flowTo = $prev = $stepId;
         foreach ($reviewer as $item) {
             $flow->addStepSection($stepId, $item);
         }
         $tudu->reviewer = $flow->getStepSection($stepId, 0);
     }
     if ($tudu->to) {
         $to = $tudu->to;
         $stepId = $flow->addStep(array('type' => $tudu->acceptMode ? Dao_Td_Tudu_Step::TYPE_CLAIM : Dao_Td_Tudu_Step::TYPE_EXECUTE, 'prev' => $prev));
         foreach ($to as $item) {
             $flow->addStepSection($stepId, $item);
         }
         $tudu->to = $flow->getStepSection($stepId, 0);
         if (0 !== strpos($prev, '^')) {
             $flow->updateStep($prev, array('next' => $stepId));
         }
         if (null === $flowTo) {
             $flowTo = $stepId;
         }
     }
     $flow->flowTo($flowTo);
     $step = $flow->getStep($flow->currentStepId);
     if ($step['type'] == 1) {
         if (!$tudu->reviewer) {
             $tudu->reviewer = $flow->getStepSection($flow->currentStepId);
         }
     } else {
         if (!$tudu->to) {
             $tudu->to = $flow->getStepSection($flow->currentStepId);
         }
     }
 }