Поправлен функционал экспорта спринтов

master
an.nechaev 2026-06-18 19:18:02 +04:00
parent 0d2501a16d
commit fde8f9690a
4 changed files with 55 additions and 23 deletions

View File

@ -2,7 +2,8 @@ CREATE TABLE IF NOT EXISTS teams (
id SERIAL PRIMARY KEY,
team_name character(16) NOT NULL,
team_board_id INT NOT NULL,
has_own_project BOOLEAN NOT NULL DEFAULT FALSE
has_own_project BOOLEAN NOT NULL DEFAULT FALSE,
sprint_alias TEXT
);
CREATE TYPE role AS ENUM ('analytic', 'backend', 'designer', 'frontend', 'qa', 'project');

View File

@ -1,10 +1,10 @@
-- Teams
INSERT INTO teams (id, team_name, team_board_id, has_own_project)
INSERT INTO teams (id, team_name, team_board_id, has_own_project, sprint_alias)
VALUES
(1, 'ts', 613, TRUE),
(2, 'ts-uh', 327, FALSE),
(3, 'ts-prime', 327, FALSE),
(4, 'bryansk', 166, TRUE);
(1, 'ts', 613, TRUE, 'TS'),
(2, 'ts-uh', 327, FALSE, 'Center'),
(3, 'ts-prime', 327, FALSE, 'Center'),
(4, 'bryansk', 166, TRUE, 'Брянск');
-- Employees

View File

@ -19,7 +19,7 @@ class JiraApiClient {
]);
}
public function getClosedSprintsListByBoardId(int $boardId, int $lastCount = 100): array
public function getClosedSprintsListByBoardId(int $boardId, int $lastCount = 100, string $alias = ''): array
{
$sprintList = [];
try {
@ -38,7 +38,19 @@ class JiraApiClient {
$isLast = $sprints['isLast'];
$startAt += 50;
$sprintList = array_merge($sprintList, $sprints['values']);
$newSprints = [];
if ($alias !== '') {
foreach ($sprints['values'] as $sprint) {
if (str_starts_with($sprint['name'], $alias)) {
$newSprints[] = $sprint;
}
}
} else {
$newSprints = $sprints['values'];
}
$sprintList = array_merge($sprintList, $newSprints);
} while (!$isLast);
return array_slice($sprintList, $lastCount*(-1));

View File

@ -6,7 +6,7 @@ require_once __DIR__ . '/../functions.php';
require_once __DIR__ . '/../../init.php';
try {
$teamList = App::getDb()->getRowset("SELECT id, TRIM(team_name) as name, team_board_id FROM teams");
$teamList = App::getDb()->getRowset("SELECT id, TRIM(team_name) as name, team_board_id, sprint_alias FROM teams");
$availableTeams = array_column($teamList, 'name');
} catch (PDOException $e) {
die("Ошибка: " . $e->getMessage());
@ -14,7 +14,7 @@ try {
$numberOfSprints = 100;
$options = getopt('h::', ['team::', 'number-of-sprints::', 'non-interactive::', 'help::']);
$options = getopt('h::', ['team::', 'number-of-sprints::', 'non-interactive::', 'dry-run::', 'help::']);
if (isset($options['h']) || isset($options['help'])) {
$helpText = "Использование: php " . basename($argv[0]) . " [ОПЦИИ]\n" .
@ -23,7 +23,8 @@ if (isset($options['h']) || isset($options['help'])) {
" -h, --help Вывести эту справку\n" .
" --team Команда, для которой сделать экспорт. Доступные варианты: ".implode(', ', $availableTeams)."\n" .
" --number-of-sprints Количество спринтов для экпорта, начиная с самых свежих, по умолчанию: {$numberOfSprints}\n" .
" --non-interactive Не задавать вопросы в процессе работы\n";
" --non-interactive Не задавать вопросы в процессе работы\n" .
" --dry-run Не записывать данные в БД, только вывести, что будет сделано\n";
fwrite(STDOUT, $helpText);
exit(0);
@ -33,6 +34,8 @@ $team = 'all';
$interactiveMode = !isset($options['non-interactive']);
$dryRun = isset($options['dry-run']);
if (!empty($options['team'])) {
if (!in_array(strtolower($options['team']), $availableTeams)) {
echo "Не корректное название команды: '".$options['team']."'\n";
@ -47,6 +50,10 @@ if (!empty($options['number-of-sprints'])) {
$numberOfSprints = ((int)$options['number-of-sprints']);
}
if ($dryRun) {
echo "Режим dry-run: данные не будут записаны в БД.\n";
}
if ($interactiveMode) {
$answer = readline("Получаем данные по спринтам команды '{$team}' в количестве {$numberOfSprints} шт. Продолжить? (Y/n): ");
// Приводим ответ к нижнему регистру для надежности
@ -70,25 +77,37 @@ foreach ($teamList as $team) {
}
$boardId = $team['team_board_id'];
$sprintAlias = isset($team['sprint_alias']) ? trim((string)$team['sprint_alias']) : '';
$sprints = App::getJiraApiClient()->getClosedSprintsListByBoardId($boardId, $numberOfSprints);
$sprints = App::getJiraApiClient()->getClosedSprintsListByBoardId($boardId, $numberOfSprints, $sprintAlias);
foreach ($sprints as $sprintRawData) {
$data = [];
$data['jiraSprintId'] = (int)$sprintRawData['jiraSprintId'];
$data['teamId'] = (int)$sprintRawData['teamId'];
$data['jiraSprintId'] = (int)$sprintRawData['id'];
$data['teamId'] = (int)$team['id'];
$data['sprintName'] = $sprintRawData['name'];
$data['sprintActivateDatetime'] = $sprintRawData['activeDate'];
$data['sprintCompleteDatetime'] = $sprintRawData['completionDate'];
$data['sprintActivateDatetime'] = $sprintRawData['activatedDate'];
$data['sprintCompleteDatetime'] = $sprintRawData['completeDate'];
$query = "
INSERT INTO sprints
SET
jira_sprint_id = :jiraSprintId,
team_id = :teamId,
sprint_name = :sprintName,
sprint_activate_datetime = :sprintActivateDatetime,
sprint_complete_datetime = :sprintCompleteDatetime
INSERT INTO sprints (
jira_sprint_id,
team_id,
sprint_name,
sprint_activate_datetime,
sprint_complete_datetime
) VALUES (
:jiraSprintId,
:teamId,
:sprintName,
:sprintActivateDatetime,
:sprintCompleteDatetime
)
";
if ($dryRun) {
echo "[dry-run] Спринт '{$data['sprintName']}' (jiraSprintId={$data['jiraSprintId']}, teamId={$data['teamId']}) будет добавлен.\n";
continue;
}
App::getDb()->execute($query, $data);
}
}