Управління проблемами та RFI
Керуйте проблемами та RFI за допомогою масових операцій, експорту та автоматизації.

Огляд робочого процесу
Проблеми ACC
Issues API
RFI
Вкладення
Операції
Перелік/Фільтрація
Експорт
Оновлення
Створення
Формати експорту
JSON
CSV
Звіт
Аналіз
Зведення за статусом
Відстеження прострочених
Звіт по відповідальних
Проблеми → Операції → Експорт → Аналіз
Підхід через CLI
Перелік усіх проблем
PROJECT_ID="b.project-id"
# List all issues
raps acc issue list "$PROJECT_ID"
# Export to JSON
raps acc issue list "$PROJECT_ID" --output json > issues.json
# Filter open issues
cat issues.json | jq '[.[] | select(.status == "open")]' > open-issues.json
Експорт проблем у CSV
cat issues.json | jq -r '
["ID", "Title", "Status", "Priority", "Assignee", "Due Date", "Created"],
(.[] | [
.id,
.title,
.status,
.priority,
.assignee,
.dueDate,
.createdAt
]) | @csv
' > issues-report.csv
Деталі проблеми з вкладеннями
ISSUE_ID="issue-123"
# Get issue details
raps acc issue get "$PROJECT_ID" "$ISSUE_ID" --output json > issue-detail.json
# List attachments
jq -r '.attachments[] | "\(.id): \(.name)"' issue-detail.json
# Download attachments
jq -r '.attachments[].id' issue-detail.json | while read attach_id; do
raps acc attachment download "$PROJECT_ID" "$attach_id" --output ./attachments/
done
Пошук прострочених проблем
TODAY=$(date +%Y-%m-%d)
cat issues.json | jq --arg today "$TODAY" '
[.[] | select(.status == "open" and .dueDate != null and .dueDate < $today)]
' > overdue-issues.json
echo "Overdue issues: $(jq 'length' overdue-issues.json)"
Управління RFI
# List all RFIs
raps acc rfi list "$PROJECT_ID" --output json > rfis.json
# Export RFI summary
cat rfis.json | jq -r '
["Number", "Subject", "Status", "Ball In Court", "Due Date"],
(.[] | [.number, .subject, .status, .ballInCourt, .dueDate])
| @csv
' > rfi-summary.csv
# Find open RFIs
cat rfis.json | jq '[.[] | select(.status == "open")]' > open-rfis.json
CI/CD-конвеєр
# .github/workflows/issue-management.yml
name: Issue Management
on:
schedule:
- cron: '0 8 * * 1-5' # Weekdays at 8 AM
workflow_dispatch:
env:
PROJECT_ID: ${{ secrets.ACC_PROJECT_ID }}
jobs:
issue-report:
runs-on: ubuntu-latest
steps:
- name: Install RAPS
run: cargo install raps
- name: Authenticate
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
APS_ACCESS_TOKEN: ${{ secrets.APS_ACCESS_TOKEN }}
APS_REFRESH_TOKEN: ${{ secrets.APS_REFRESH_TOKEN }}
run: raps auth login --token "$APS_ACCESS_TOKEN" --refresh-token "$APS_REFRESH_TOKEN" --non-interactive
- name: Export issues
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
raps acc issue list "$PROJECT_ID" --output json > issues.json
raps acc rfi list "$PROJECT_ID" --output json > rfis.json
- name: Generate report
run: |
TODAY=$(date +%Y-%m-%d)
echo "# Issue & RFI Report" > report.md
echo "Generated: $(date)" >> report.md
echo "" >> report.md
# Issues summary
echo "## Issues Summary" >> report.md
TOTAL=$(jq 'length' issues.json)
OPEN=$(jq '[.[] | select(.status == "open")] | length' issues.json)
OVERDUE=$(jq --arg today "$TODAY" '[.[] | select(.status == "open" and .dueDate < $today)] | length' issues.json)
echo "- Total: $TOTAL" >> report.md
echo "- Open: $OPEN" >> report.md
echo "- Overdue: $OVERDUE" >> report.md
echo "" >> report.md
# RFI summary
echo "## RFI Summary" >> report.md
RFI_TOTAL=$(jq 'length' rfis.json)
RFI_OPEN=$(jq '[.[] | select(.status == "open")] | length' rfis.json)
echo "- Total: $RFI_TOTAL" >> report.md
echo "- Open: $RFI_OPEN" >> report.md
echo "" >> report.md
# Overdue list
if [ "$OVERDUE" -gt 0 ]; then
echo "## Overdue Issues" >> report.md
jq --arg today "$TODAY" -r '
.[] | select(.status == "open" and .dueDate < $today) |
"- \(.title) (Due: \(.dueDate), Assignee: \(.assignee))"
' issues.json >> report.md
fi
- name: Export CSV
run: |
jq -r '["ID","Title","Status","Priority","Due Date"], (.[] | [.id,.title,.status,.priority,.dueDate]) | @csv' issues.json > issues.csv
jq -r '["Number","Subject","Status","Due Date"], (.[] | [.number,.subject,.status,.dueDate]) | @csv' rfis.json > rfis.csv
- name: Upload reports
uses: actions/upload-artifact@v4
with:
name: issue-reports
path: |
report.md
issues.csv
rfis.csv
Потік конвеєра
Розклад
Щодня о 8:00
→
Експорт
Отримання проблем
Отримання RFI
→
Аналіз
Підрахунок за статусом
Пошук прострочених
→
Звіти
report.md
issues.csv
rfis.csv
Інтеграція з MCP
Зведення проблем
User: "How many open issues do we have on the Main Street project?"
КористувачAI-асистентRAPS MCPACC Cloud
Корист.Кількість відкритих проблем Main StreetAI
AIaps_acc_issue_list(project_id)MCP
MCPОтримання всіх проблемACC
ACCIssues JSONMCP
AI: Фільтрація + Групування за пріоритетом/відповідальним
AIЗведення проблемКорист.
Відповідь AI:
Проєкт Main Street - Відкриті проблеми:
Пріоритет Кількість Критичний 2 Високий 8 Середній 15 Низький 5 Всього відкритих: 30 проблем Прострочених: 4 проблеми
Основні відповідальні:
- John Smith: 12 проблем
- Jane Doe: 10 проблем
- Bob Wilson: 8 проблем
Пошук конкретних проблем
User: "Show me all critical issues that are overdue"
Відповідь AI:
Прострочені критичні проблеми:
ID Назва Термін Відповідальний ISS-42 Зіткнення конструктивних балок 10 лют John Smith ISS-87 Відсутній клас вогнестійкості 12 лют Jane Doe Обидві проблеми прострочені. Чи бажаєте відправити нагадування?
Статус RFI
User: "What's the status of our RFIs?"
Відповідь AI:
Зведення статусу RFI:
- Відкриті: 8 RFI
- Отримано відповідь: 23 RFI
- Закриті: 45 RFI
Очікують відповіді (м’яч на боці):
RFI Тема Очікує від Днів RFI-034 Глибина фундаменту Інженер-конструктор 5 RFI-041 Маршрутизація HVAC Консультант MEP 3
Розширені запити
Проблеми за відповідальними
cat issues.json | jq '
group_by(.assignee) |
map({assignee: .[0].assignee, count: length, open: [.[] | select(.status == "open")] | length}) |
sort_by(-.open)'
Хронологія проблем
# Issues created per week
cat issues.json | jq '
group_by(.createdAt[:10]) |
map({date: .[0].createdAt[:10], count: length})'
Розподіл за пріоритетом
cat issues.json | jq '
group_by(.priority) |
map({priority: .[0].priority, count: length, open: [.[] | select(.status == "open")] | length})'