Для реализации вашего сценария в ScriptRunner для Jira, можно использовать Groovy — язык программирования, который используется в ScriptRunner. Ниже приведен пример скрипта, который выполняет ваши требования.
Этот скрипт будет перебрать все подзадачи родительской задачи и суммировать значения пользовательского поля выбора, если значение еще не было добавлено:
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.util.IssueChangeHolder
import com.atlassian.jira.issue.MutableIssue
// Получаем текущую задачу (родительскую задачу)
MutableIssue parentIssue = issue // Это ссылается на текущую задачу, если вы запускаете скрипт из контекста задачи
// Получаем менеджеры
IssueManager issueManager = ComponentAccessor.getIssueManager()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
// Указываем имя пользовательского поля выбора
def customFieldName = "Ваше пользовательское поле выбора"
def customField = customFieldManager.getCustomFieldObjectByName(customFieldName)
if (!customField) {
log.error("Пользовательское поле '${customFieldName}' не найдено.")
return
}
// Инициализация переменной для хранения уникальных значений
Set<String> uniqueValues = [] as Set
// Получаем список подзадач родительской задачи
def subTasks = parentIssue.getSubTaskObjects()
// Перебираем все подзадачи и извлекаем значения пользовательского поля выбора
subTasks.each { Issue subTask ->
def value = subTask.getCustomFieldValue(customField)
if (value && !uniqueValues.contains(value)) {
uniqueValues.add(value)
}
}
// Формируем результат из уникальных значений
def result = uniqueValues.join(", ") // Используйте запятую или другой разделитель по желанию
// Выводим результат
log.info("Уникальные значения для пользовательского поля '${customFieldName}': ${result}")
// Вы можете сохранить результат в родительское поле выбора, если это необходимо
// Например, если у вас есть отдельное поле для записи суммы:
def resultField = customFieldManager.getCustomFieldObjectByName("Ваше поле для записи результата")
if (resultField) {
parentIssue.setCustomFieldValue(resultField, result)
IssueChangeHolder changeHolder = new DefaultIssueChangeHolder()
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), parentIssue, EventDispatchOption.DO_NOT_DISPATCH, changeHolder)
}
```
### Пояснения к коду:
1. **Импортируем необходимые классы:** Загружаем необходимые классы из библиотеки Jira для работы с задачами и пользовательскими полями.
2. **Получаем родительскую задачу:** Используем переменную `issue`, чтобы получить текущую задачу, если скрипт выполняется в контексте задачи.
3. **Инициализация пользовательского поля:** Находим поле выбора по имени.
4. **Перебор подзадач:** Получаем все подзадачи текущей задачи и извлекаем значения указанного пользовательского поля выбора.
5. **Проверка уникальности:** Используем `Set` для хранения уникальных значений.
6. **Запись результата:** Если требуется, записываем полученные уникальные значения в отдельное пользовательское поле (можно убрать, если нет необходимости).
### Примечание:
- Убедитесь, что у вас есть необходимые права на выполнение этого скрипта и что названия пользовательских полей прописаны верно.
- Проверьте, что вы обрабатываете типы значений, которые ожидаются для вашего пользовательского поля (например, строковые значения, если это текстовое поле).