%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/bizproc/lib/automation/ |
Current File : /home/bitrix/www/bitrix/modules/bizproc/lib/automation/tracker.php |
<?php namespace Bitrix\Bizproc\Automation; use Bitrix\Bizproc\WorkflowTemplateTable; use Bitrix\Bizproc\Automation\Target\BaseTarget; use Bitrix\Bizproc\WorkflowStateTable; class Tracker { const STATUS_WAITING = 0; const STATUS_RUNNING = 1; const STATUS_COMPLETED = 2; const STATUS_AUTOCOMPLETED = 3; /** @var BaseTarget */ protected $target; public function __construct(BaseTarget $target) { $this->target = $target; } public function getLog(array $statuses) { $log = []; $currentStatus = $this->target->getDocumentStatus(); $statusEntries = $this->getBizprocTrackingEntries($statuses); foreach ($statusEntries as $status => $entries) { $log[$status] = $this->convertBizprocTrackingToLog($entries, $status == $currentStatus); } return $log; } private function convertBizprocTrackingToLog($entries, $isCurrentStatus) { $trigger = null; $robotEntries = array(); $robots = array(); foreach ($entries as $entry) { if ($entry['TYPE'] == \CBPTrackingType::Trigger) { $trigger = array( 'ID' => $entry['ACTION_NOTE'], 'STATUS' => static::STATUS_COMPLETED, 'MODIFIED' => $entry['MODIFIED'] ); } else { $robotEntries[$entry['ACTION_NAME']][] = $entry; } } foreach ($robotEntries as $robotId => $robotEntry) { $status = static::STATUS_WAITING; $modified = null; $isExecute = $isClosed = $isAutocompleted = false; $executeTime = $closedTime = $autocompletedTime = null; $errors = array(); foreach ($robotEntry as $entry) { if ($entry['TYPE'] == \CBPTrackingType::ExecuteActivity) { $isExecute = true; $executeTime = $entry['MODIFIED']; } elseif ($entry['TYPE'] == \CBPTrackingType::CloseActivity) { $isClosed = true; $closedTime = $entry['MODIFIED']; } elseif ($entry['TYPE'] == \CBPTrackingType::Error) { $errors[] = $entry['ACTION_NOTE']; } } if ($isAutocompleted) { $status = static::STATUS_AUTOCOMPLETED; $modified = $autocompletedTime; } elseif ($isClosed) { $status = static::STATUS_COMPLETED; $modified = $closedTime; } elseif ($isExecute) { $status = $isCurrentStatus? static::STATUS_RUNNING : static::STATUS_COMPLETED; $modified = $executeTime; } $robots[$robotId] = array( 'ID' => $robotId, 'STATUS' => $status, 'MODIFIED' => $modified, 'ERRORS' => $errors ); } return array( 'trigger' => $trigger, 'robots' => $robots ); } private function getBizprocTrackingEntries($statuses) { $entries = array(); $states = $this->getStatusesStates($statuses); if ($states) { $trackIterator = \CBPTrackingService::GetList(array('ID' => 'DESC'), array( '@WORKFLOW_ID' => array_keys($states) )); while ($row = $trackIterator->fetch()) { $status = $states[$row['WORKFLOW_ID']]; $entries[$status][] = $row; } } return $entries; } private function getStatusesStates($statuses) { $states = array(); $templateIds = $this->getBizprocTemplateIds($statuses); if (!$templateIds) return $states; $stateIterator = WorkflowStateTable::getList(array( 'select' => array('ID', 'WORKFLOW_TEMPLATE_ID'), 'filter' => array( '=DOCUMENT_ID' => $this->target->getDocumentId(), '@WORKFLOW_TEMPLATE_ID' => array_keys($templateIds) ), 'order' => array('STARTED' => 'DESC') )); while ($row = $stateIterator->fetch()) { $status = $templateIds[$row['WORKFLOW_TEMPLATE_ID']]; if (!in_array($status, $states)) $states[$row['ID']] = $status; } return $states; } private function getBizprocTemplateIds($statuses) { $documentType = $this->target->getDocumentType(); $ids = array(); $iterator = WorkflowTemplateTable::getList(array( 'select' => array('ID', 'DOCUMENT_STATUS'), 'filter' => array( '=MODULE_ID' => $documentType[0], '=ENTITY' => $documentType[1], '=DOCUMENT_TYPE' => $documentType[2], '=AUTO_EXECUTE' => \CBPDocumentEventType::Automation, '@DOCUMENT_STATUS' => $statuses ) )); while ($row = $iterator->fetch()) { $ids[$row['ID']] = $row['DOCUMENT_STATUS']; } return $ids; } }