/** * 拒绝图度 */ 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']); }