/** * 整理工作步骤 * * @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; } }