Ця сторінка ще не перекладена українською. Показано англійську версію. Переглянути англійською

Процеси контролю якості

Автоматизуйте відстеження та звітність інспекцій контролю якості.

Огляд робочого процесу

Інспекція якості
Створення чек-листа
Призначення інспектора
Проведення інспекції
Фіксація результатів
Результати
Пройдено
Не пройдено
Н/З
Подальші дії
Прикріплення фото
Створення проблеми
Планування повторної інспекції
Звітність
Звіт якості
Журнал дефектів
Дашборд метрик
Інспекція → Результати → Подальші дії → Звітність

Підхід через CLI

Створення запису інспекції

PROJECT_ID="b.project-id"
CHECKLIST_ID="checklist-123"

# Get checklist items
raps acc checklist items "$PROJECT_ID" "$CHECKLIST_ID" --output json > items.json

# View items to inspect
jq -r '.[] | "\(.id): \(.title)"' items.json

Оновлення статусу інспекції

ITEM_ID="item-456"

# Mark item as passed
raps acc checklist update-item "$PROJECT_ID" "$CHECKLIST_ID" "$ITEM_ID" --status "passed"

# Mark item as failed with note
raps acc checklist update-item "$PROJECT_ID" "$CHECKLIST_ID" "$ITEM_ID" \
  --status "failed" \
  --note "Missing fire caulking at penetration"

# Attach photo evidence
raps acc checklist attach "$PROJECT_ID" "$CHECKLIST_ID" "$ITEM_ID" ./photos/deficiency.jpg

Генерація звіту якості

# Get all items with status
raps acc checklist items "$PROJECT_ID" "$CHECKLIST_ID" --output json > inspection.json

# Generate summary
cat inspection.json | jq '
  {
    total: length,
    passed: [.[] | select(.status == "passed")] | length,
    failed: [.[] | select(.status == "failed")] | length,
    pending: [.[] | select(.status == "pending")] | length,
    na: [.[] | select(.status == "na")] | length
  } |
  . + {
    passRate: (if .total > 0 then ((.passed / (.total - .na)) * 100 | floor) else 0 end)
  }'

Створення проблем для непройдених пунктів

# Find failed items and create issues
jq -r '.[] | select(.status == "failed") | "\(.id)|\(.title)|\(.response)"' inspection.json | \
  while IFS='|' read id title response; do
    raps acc issue create "$PROJECT_ID" \
      --title "QC Deficiency: $title" \
      --description "$response" \
      --priority "high" \
      --type "quality"

    echo "Created issue for: $title"
  done

CI/CD-конвеєр

# .github/workflows/qc-automation.yml
name: QC Automation Pipeline

on:
  schedule:
    - cron: '0 18 * * 1-5'  # End of day, weekdays
  workflow_dispatch:
    inputs:
      checklist_id:
        description: 'Specific checklist ID (optional)'
        required: false

env:
  PROJECT_ID: ${{ secrets.ACC_PROJECT_ID }}

jobs:
  qc-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 QC data
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          mkdir -p ./qc-data

          # Get all QC checklists
          raps acc checklist list "$PROJECT_ID" --output json | \
            jq '[.[] | select(.type | test("quality|inspection"; "i"))]' > ./qc-data/checklists.json

          # Export each checklist's items
          jq -r '.[].id' ./qc-data/checklists.json | while read id; do
            raps acc checklist items "$PROJECT_ID" "$id" --output json > "./qc-data/items-${id}.json"
          done

      - name: Generate QC report
        run: |
          echo "# Daily QC Report" > ./qc-data/report.md
          echo "Generated: $(date)" >> ./qc-data/report.md
          echo "" >> ./qc-data/report.md

          # Aggregate all items
          cat ./qc-data/items-*.json | jq -s 'flatten' > ./qc-data/all-items.json

          # Summary
          TOTAL=$(jq 'length' ./qc-data/all-items.json)
          PASSED=$(jq '[.[] | select(.status == "passed")] | length' ./qc-data/all-items.json)
          FAILED=$(jq '[.[] | select(.status == "failed")] | length' ./qc-data/all-items.json)
          PENDING=$(jq '[.[] | select(.status == "pending")] | length' ./qc-data/all-items.json)

          echo "## Summary" >> ./qc-data/report.md
          echo "| Metric | Value |" >> ./qc-data/report.md
          echo "|--------|-------|" >> ./qc-data/report.md
          echo "| Total Items | $TOTAL |" >> ./qc-data/report.md
          echo "| Passed | $PASSED |" >> ./qc-data/report.md
          echo "| Failed | $FAILED |" >> ./qc-data/report.md
          echo "| Pending | $PENDING |" >> ./qc-data/report.md

          INSPECTED=$((TOTAL - PENDING))
          if [ $INSPECTED -gt 0 ]; then
            RATE=$((PASSED * 100 / INSPECTED))
            echo "| **Pass Rate** | **${RATE}%** |" >> ./qc-data/report.md
          fi

          # Failed items detail
          if [ "$FAILED" -gt 0 ]; then
            echo "" >> ./qc-data/report.md
            echo "## Deficiencies" >> ./qc-data/report.md
            jq -r '.[] | select(.status == "failed") | "- \(.title): \(.response // "No details")"' ./qc-data/all-items.json >> ./qc-data/report.md
          fi

      - name: Create issues for new failures
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          # Find failed items without linked issues
          jq -r '.[] | select(.status == "failed" and .linkedIssue == null) | "\(.title)|\(.response // "")"' ./qc-data/all-items.json | \
            while IFS='|' read title response; do
              echo "Would create issue for: $title"
              # Uncomment to actually create:
              # raps acc issue create "$PROJECT_ID" --title "QC: $title" --description "$response"
            done

      - name: Upload report
        uses: actions/upload-artifact@v4
        with:
          name: qc-report
          path: ./qc-data/

Потік конвеєра

Кінець дня
17:00 будні
Експорт
Отримання чек-листів якості
Отримання всіх пунктів
Аналіз
Розрахунок відсотка проходження
Виявлення дефектів
Дії
Генерація звіту
Створення проблем

Інтеграція з MCP

Отримання статусу якості

User: "What's our quality status for the current inspections?"
КористувачAI-асистентRAPS MCPACC Cloud
Корист.Статус якості поточних інспекційAI
AIaps_acc_checklist_list(project_id)MCP
Цикл: Для кожного чек-листа якості
AIaps_acc_checklist_items(…)ACC
AI: Розрахунок метрик
AIЗведення якостіКорист.

Відповідь AI:

Статус контролю якості:

Зона інспекціїВідсоток проходженняПунктів
MEP рівня 395%42/44
Конструктив рівня 2100%28/28
Оздоблення рівня 182%37/45
Зовнішня оболонка88%22/25

Загальний відсоток проходження: 91%

Активні дефекти: 12

  • 5 очікують повторної інспекції
  • 4 в ремонті
  • 3 нещодавно виявлені

Фіксація результату інспекції

User: "Mark the fire damper inspection as failed - damper not installed at level 2 shaft"

Відповідь AI:

Зафіксовано невдачу інспекції:

Пункт: Установка протипожежного клапана Статус: Не пройдено Розташування: Рівень 2, Шахта A Примітка: Клапан не встановлено в шахті рівня 2

Виконані дії:

  • Оновлено статус пункту чек-листа
  • Створено проблему #ISS-234 для відстеження
  • Призначено підряднику MEP для усунення

Бажаєте прикріпити фото?


Метрики та дашборди

Відсоток проходження за зонами

cat all-items.json | jq '
  group_by(.area) |
  map({
    area: .[0].area,
    total: length,
    passed: [.[] | select(.status == "passed")] | length,
    passRate: ([.[] | select(.status == "passed")] | length) * 100 / length | floor
  }) |
  sort_by(-.passRate)'

Тренд дефектів

cat all-items.json | jq '
  [.[] | select(.status == "failed")] |
  group_by(.failedAt[:10]) |
  map({date: .[0].failedAt[:10], count: length})'

Ефективність інспекторів

cat all-items.json | jq '
  group_by(.inspector) |
  map({
    inspector: .[0].inspector,
    inspected: length,
    passed: [.[] | select(.status == "passed")] | length
  })'

Пов’язане