Example #1
0
 /**
  * 拒绝图度
  */
 public function rejectAction()
 {
     $tuduIds = explode(',', $this->_request->getParam('tid'));
     // 参数:图度ID必须存在
     if (!count($tuduIds)) {
         return $this->json(false, $this->lang['invalid_tuduid']);
     }
     /* @var $daoTudu Dao_Td_Tudu_Tudu */
     $daoTudu = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Tudu', Tudu_Dao_Manager::DB_TS);
     /* @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_Group */
     $daoTuduGroup = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Group', Tudu_Dao_Manager::DB_TS);
     $resourceManager = new Tudu_Model_ResourceManager_Registry();
     $resourceManager->setResource(Tudu_Model::RESOURCE_CONFIG, $this->bootstrap->getOptions());
     Tudu_Model::setResourceManager($resourceManager);
     $success = 0;
     //用于计数操作成功个数
     foreach ($tuduIds as $tuduId) {
         // 获得图度数据
         $tudu = $daoTudu->getTuduById($this->_user->uniqueId, $tuduId);
         // 图度必须存在
         if (null == $tudu) {
             continue;
         }
         // 图度不能是已确定状态
         if ($tudu->isDone) {
             continue;
         }
         // 图度不能是“已完成”,“已拒绝”, “已取消”状态
         if ($tudu->selfTuduStatus > Dao_Td_Tudu_Tudu::STATUS_DOING) {
             continue;
         }
         // 操作人必须为图度执行人
         $isAccepter = in_array($this->_user->userName, $tudu->accepter);
         // 会议执行人有群组
         if ($tudu->type == 'meeting') {
             foreach ($tudu->accepter as $item) {
                 if ($isAccepter) {
                     break;
                 }
                 if (strpos($item, '^') == 0) {
                     $isAccepter = in_array($item, $this->_user->groups, true);
                 }
             }
         }
         if (!$isAccepter) {
             continue;
         }
         $isFlow = !empty($tudu->flowId) ? true : false;
         $tuduStatus = $daoTudu->rejectTudu($tuduId, $this->_user->uniqueId, $isFlow);
         if (false !== $tuduStatus) {
             $success++;
             //记录次数
             $updateTudu = array();
             /*if ($tudu->type == 'task' && empty($tudu->flowId)) { //任务拒绝步骤的指向
                   $updateTudu = array('stepid' => '^head');
               }*/
             // 拒绝后任务状态为完成的,生成周期任务
             if ($tudu->cycleId && $tuduStatus >= Dao_Td_Tudu_Tudu::STATUS_DONE) {
                 $config = $this->bootstrap->getOption('httpsqs');
                 // 插入消息队列
                 $httpsqs = new Oray_Httpsqs($config['host'], $config['port'], $config['chartset'], $config['name']);
                 $updateTudu = array('cycleid' => null);
                 $data = implode(' ', array('tudu', 'cycle', '', http_build_query(array('tuduid' => $tudu->tuduId, 'tsid' => $this->_user->tsId, 'cycleid' => $tudu->cycleId))));
                 $httpsqs->put($data, 'tudu');
             }
             if (!empty($updateTudu)) {
                 $daoTudu->updateTudu($tuduId, $updateTudu);
             }
             $tudu = $tudu->toArray();
             // 工作流 拒绝 步骤就拒绝
             if ($tudu['flowid']) {
                 $tudu['cc'] = null;
                 $flowRecord = $daoFlow->getFlow(array('tuduid' => $tudu['tuduid']));
                 $flow = new Model_Tudu_Extension_Flow($flowRecord->toArray());
                 $composeTudu = new Model_Tudu_Tudu(array('tuduid' => $tudu['tuduid'], 'status' => 1, 'type' => $tudu['type'], 'flowid' => $tudu['flowid']));
                 if (isset($flow->steps[$flow->currentStepId])) {
                     $step = $flow->steps[$flow->currentStepId];
                     $prevId = $step['prev'];
                     $isFrowardStep = false;
                     // 工作流中转发的步骤
                     // 如果所有人拒绝,则删除
                     if (0 !== strpos($tudu['stepid'], 'F-')) {
                         $flow->deleteStep($flow->currentStepId);
                         $isFrowardStep = true;
                     } else {
                         // 更新当前步骤状态
                         $flow->reject($flow->currentStepId, $this->_user->userName);
                     }
                     if (isset($flow->steps[$prevId])) {
                         $prev = $flow->steps[$prevId];
                         $updateStatus = $isFrowardStep;
                         $nextIndex = null;
                         // 上一步骤系审批
                         if ($prev['type'] == Dao_Td_Tudu_Step::TYPE_EXAMINE) {
                             $reviewer = array();
                             $flow->resetStep($prevId);
                             foreach ($prev['section'] as $idx => $sec) {
                                 foreach ($sec as $i => $u) {
                                     if ($idx == 0) {
                                         $reviewer[$u['username']] = array('username' => $u['username'], 'truename' => $u['truename'], 'uniqueid' => $u['uniqueid']);
                                     }
                                 }
                             }
                             $composeTudu->reviewer = $reviewer;
                             // 上一步骤系执行
                         } else {
                             $to = array();
                             $flow->resetStep($prevId);
                             foreach ($prev['section'] as $idx => $sec) {
                                 foreach ($sec as $i => $u) {
                                     if ($idx == 0) {
                                         $to[$u['username']] = array('username' => $u['username'], 'truename' => $u['truename'], 'uniqueid' => $u['uniqueid']);
                                     }
                                 }
                             }
                             $composeTudu->reviewer = null;
                             $composeTudu->to = $to;
                         }
                         $stepId = $prev['stepid'];
                     } else {
                         $stepId = $prevId;
                     }
                 } else {
                     $stepId = '^break';
                 }
                 $flow->flowTo($stepId);
                 $composeTudu->stepId = $stepId;
                 if ($stepId == '^break' || $stepId == '^head') {
                     $composeTudu->to = array($tudu['from'][3] => array('username' => $tudu['from'][3], 'truename' => $tudu['from'][0]));
                 }
                 // 准备发送
                 //$modelCompose = new Model_Tudu_Compose_Save($tudu);
                 $modelSend = new Model_Tudu_Send_Common();
                 //$recipients = $deliver->prepareRecipients($this->_user->uniqueId, $this->_user->userId, $tudu);
                 // 移除原执行人
                 if ($composeTudu->to && !$composeTudu->reviewer) {
                     $accepters = $daoTudu->getAccepters($tudu['tuduid']);
                     $to = $composeTudu->to;
                     foreach ($accepters as $item) {
                         list($email, ) = explode(' ', $item['accepterinfo'], 2);
                         // 移除执行人角色,我执行标签
                         if (!empty($to) && !array_key_exists($email, $to) && $daoTuduGroup->getChildrenCount($tudu['tuduid'], $item['uniqueid']) <= 0) {
                             $daoTudu->removeAccepter($tudu['tuduid'], $item['uniqueid']);
                             $this->manager->deleteLabel($tudu['tuduid'], $item['uniqueid'], '^a');
                         }
                     }
                 }
                 // 执行人自动接受图度
                 $currentStep = $flow->getStep($flow->currentStepId);
                 if ($stepId != '^break' && $stepId != '^head' && isset($steps[$stepId]) && $currentStep['type'] != Dao_Td_Tudu_Step::TYPE_EXAMINE) {
                     if ($currentStep['type'] == Dao_Td_Tudu_Step::TYPE_EXECUTE) {
                         foreach ($currentStep['section'][0] as $item) {
                             $daoTudu->acceptTudu($tudu['tuduid'], $item['uniqueid'], null);
                         }
                         $updateParams['acceptmode'] = 0;
                     } else {
                         if ($currentStep['type'] == Dao_Td_Tudu_Step::TYPE_CLAIM) {
                             $composeTudu->acceptMode = 1;
                             $composeTudu->acceptTime = null;
                         }
                     }
                 }
                 //$this->manager->updateTudu($tudu->tuduId, $updateParams);
                 $daoFlow->updateFlow($flow->tuduId, $flow->toArray());
                 //$modelCompose->compose($composeTudu);
                 $params = $composeTudu->getStorageParams();
                 $daoTudu->updateTudu($tudu['tuduid'], $params);
                 $modelSend->send($composeTudu, true);
                 $daoTudu->markAllUnRead($tudu['tuduid']);
                 $daoTudu->updateFlowProgress($tudu['tuduid'], null, $flow->currentStepId);
                 // 不是自动工作流,回到发起
             } else {
                 $flowRecord = $daoFlow->getFlow(array('tuduid' => $tudu['tuduid']));
                 $flow = new Model_Tudu_Extension_Flow($flowRecord->toArray());
                 $flow->flowTo('^head');
                 $daoFlow->updateFlow($tudu['tuduid'], $flow->toArray());
             }
             if ($tudu['parentid']) {
                 $daoTudu->calParentsProgress($tudu['parentid']);
             }
             // 添加操作日志
             $this->_writeLog(Dao_Td_Log_Log::TYPE_TUDU, $tuduId, Dao_Td_Log_Log::ACTION_TUDU_DECLINE, array('selfstatus' => Dao_Td_Tudu_Tudu::STATUS_REJECT, 'status' => $tuduStatus));
         }
     }
     if ($success <= 0) {
         return $this->json(false, $this->lang['reject_failure']);
     }
     return $this->json(true, $this->lang['reject_success']);
 }