예제 #1
0
파일: Flow.php 프로젝트: bjtenao/tudu-web
 /**
  * 整理工作步骤
  *
  * @param Tudu_Tudu_Storage_Tudu $tudu
  */
 public function onPrepareFlow(Tudu_Tudu_Storage_Tudu &$tudu)
 {
     $flow = $this->getFlowById($tudu->flowId);
     if (null !== $flow) {
         $flow = $flow->toArray();
         // 没有步骤
         if (count($flow['steps']) <= 0) {
             require_once 'Tudu/Tudu/Exception.php';
             throw new Tudu_Tudu_Exception('Flow has not any steps', Tudu_Tudu_Exception::CODE_FLOW_STEP_NULL);
         }
         // 整理抄送人
         if (!empty($flow['cc'])) {
             $cc = array();
             foreach ($flow['cc'] as $key => $item) {
                 if (false !== strpos($key, '@')) {
                     $cc[$key] = array('email' => $key, 'truename' => $item[0]);
                 } else {
                     $cc[$key] = array('groupid' => $key, 'truename' => $item[0]);
                 }
             }
             $tudu->cc = array_merge($tudu->cc, $cc);
         }
         // 第一步骤ID
         $steps = $flow['steps'];
         $prevUsers = array(array('email' => $tudu->email));
         $prevType = 0;
         $addressBook = Tudu_AddressBook::getInstance();
         $depts = $this->_getDepartments($tudu->orgId);
         $tuduSteps = array();
         $orderNum = 1;
         foreach ($steps as $key => $step) {
             $stepId = $step['id'];
             if ($step['type'] == 1) {
                 // 上级审批
                 if ($step['users'] == '^upper') {
                     // 上一步是审批
                     $reviewerIds = array();
                     if ($prevType == 1) {
                         foreach ($prevUsers as $item) {
                             foreach ($item as $user) {
                                 $user = $addressBook->searchUser($tudu->orgId, $user['email']);
                                 if (!$user) {
                                     require_once 'Tudu/Tudu/Exception.php';
                                     throw new Tudu_Tudu_Exception('User is not exists', Tudu_Tudu_Exception::CODE_NOT_EXISTS_USER);
                                 }
                                 $moderatorIds = $this->_getUpper($user['email'], $tudu->orgId, $user['deptid']);
                                 foreach ($moderatorIds as $uid) {
                                     $reviewerIds[] = $uid;
                                 }
                             }
                         }
                     } else {
                         foreach ($prevUsers as $user) {
                             $user = $addressBook->searchUser($tudu->orgId, $user['email']);
                             if (!$user) {
                                 require_once 'Tudu/Tudu/Exception.php';
                                 throw new Tudu_Tudu_Exception('User is not exists', Tudu_Tudu_Exception::CODE_NOT_EXISTS_USER);
                             }
                             $moderatorIds = $this->_getUpper($user['email'], $tudu->orgId, $user['deptid']);
                             foreach ($moderatorIds as $uid) {
                                 $reviewerIds[] = $uid;
                             }
                         }
                     }
                     if (empty($reviewerIds)) {
                         require_once 'Tudu/Tudu/Exception.php';
                         throw new Tudu_Tudu_Exception('Upper is not exists', Tudu_Tudu_Exception::CODE_NOT_EXISTS_UPPER);
                     }
                     $reviewers = array();
                     $reviewerIds = array_unique($reviewerIds);
                     foreach ($reviewerIds as $uId) {
                         $user = $addressBook->searchUser($tudu->orgId, $uId . '@' . $tudu->orgId);
                         if (empty($user)) {
                             require_once 'Tudu/Tudu/Exception.php';
                             throw new Tudu_Tudu_Exception('User is not exists', Tudu_Tudu_Exception::CODE_NOT_EXISTS_USER);
                         }
                         $reviewers[] = $user;
                     }
                     $users = array($reviewers);
                     $prevUsers = $users;
                     // 指定
                 } else {
                     $prevUsers = $users = Tudu_Tudu_Storage::formatReviewer($step['users']);
                     foreach ($users as $item) {
                         foreach ($item as $u) {
                             $user = $addressBook->searchUser($tudu->orgId, $u['email']);
                             if (!$user) {
                                 require_once 'Tudu/Tudu/Exception.php';
                                 throw new Tudu_Tudu_Exception('User is not exists', Tudu_Tudu_Exception::CODE_NOT_EXISTS_USER);
                             }
                         }
                     }
                 }
                 $recipients = array();
                 $processIndex = 1;
                 foreach ($users as $item) {
                     foreach ($item as $user) {
                         $recipients[] = array('email' => $user['email'], 'truename' => $user['truename'], 'processindex' => $processIndex, 'stepstatus' => $processIndex == 1 ? 1 : 0);
                     }
                     $processIndex++;
                 }
                 $tuduSteps[$stepId] = array('orgid' => $tudu->orgId, 'tuduid' => $tudu->tuduId, 'uniqueid' => $tudu->uniqueId, 'stepid' => $stepId, 'type' => Dao_Td_Tudu_Step::TYPE_EXAMINE, 'prevstepid' => $step['prev'], 'nextstepid' => $step['next'], 'users' => $recipients, 'ordernum' => $orderNum++, 'createtime' => time());
             } else {
                 $prevUsers = $users = Tudu_Tudu_Storage::formatRecipients($step['users']);
                 foreach ($prevUsers as $u) {
                     $user = $addressBook->searchUser($tudu->orgId, $u['email']);
                     if (!$user) {
                         require_once 'Tudu/Tudu/Exception.php';
                         throw new Tudu_Tudu_Exception('User is not exists', Tudu_Tudu_Exception::CODE_NOT_EXISTS_USER);
                     }
                 }
                 $tuduSteps[$stepId] = array('orgid' => $tudu->orgId, 'tuduid' => $tudu->tuduId, 'uniqueid' => $tudu->uniqueId, 'stepid' => $stepId, 'type' => $step['type'] == 2 ? Dao_Td_Tudu_Step::TYPE_CLAIM : Dao_Td_Tudu_Step::TYPE_EXECUTE, 'prevstepid' => $step['prev'], 'nextstepid' => $step['next'], 'users' => $users, 'ordernum' => $orderNum++, 'createtime' => time());
             }
             $prevType = $step['type'];
         }
         $tudu->steps = $tuduSteps;
         // 第一步骤ID
         $firstStep = reset($tuduSteps);
         $tudu->stepId = $firstStep['stepid'];
         if ($firstStep['type'] == 1) {
             $users = $firstStep['users'];
             $reviewers = array();
             foreach ($users as $user) {
                 if ($user['processindex'] == 1) {
                     $reviewers[] = $user;
                 }
             }
             $tudu->reviewer = array($reviewers);
         } else {
             $tudu->to = $firstStep['users'];
         }
         $tudu->status = Dao_Td_Tudu_Tudu::STATUS_DOING;
     }
 }