Kendi Raporlarınız ve JSON

İşlem bağlam grafiği varsayılandır: içine ne konacağına biz karar verdik, bu yüzden onu almak için sizin bir şey yapmanız gerekmez. Bunun ötesinde kalan her şey sizin. Bir proje, istediğiniz sayıda rapor içerebilir; her biri, istediğiniz isim ve biçimde istediğiniz sayıda JSON dosyası taşıyabilir - ve ajanınız onlara, varsayılan grafiğe ulaştığı şekilde ulaşır.

Bir tane yapmak için iki yol vardır:

  • Bir betik ile. Siz veya kendi ajanınız, projedeki logu okuyup bir rapor yazan kısa bir Python betiği yazarsınız. Yapay zeka kullanılmaz.
  • Düz metinle. Raporu kendi kelimelerinizle tanımlarsınız, istediğiniz JSON dosyalarının adlarını söylersiniz ve yapay zeka raporu ve dosyaları yazar.

Her iki yolun sonucu aynıdır: Raporlar ekranında yayınlanan bir rapor, varsayılan grafiğin yanında ve içinde değil, kendi adlandırdığınız JSON dosyalarını taşır. Aşağıdaki her iki örnek de 1,6 milyon olay içeren gerçek bir satın alma süreçten ödemeye projesinde çalıştırıldı ve gösterilen dosyalar onların ürettikleridir. Ajanınızın aracını ve anahtarını nasıl aldığı Kendi Ajanınızı Bağlama bölümünde anlatılmaktadır.

Tek kural: JSON dosyanıza kendi adınızı verin

Bir JSON dosyasında "schema": "mindzie.process-context-graph" varsa, raporu yayınlandığında bizim tanımımıza uyduğu kabul edilir; ve şekle uymayan bir dosya raporun yayınlanmasını engeller. Ancak başka herhangi bir şema adı taşıyan ya da şema belirtmeyen dosyalar bizimle kontrol edilmez - şekilleri tamamen sizin tercihinizdir.

Bu nedenle bir uzantı bizim adımızı kullanmaz ve varsayılan grafiğe alan eklemez. Eklediklerinizi kendi dosyasında, kendi adınız altında tutun — aşağıdaki örnekte partner.invoice-timing kullanılmıştır — ve gerektiğinde iki dosyanın bağlanması için varsayılan grafikteki kimliklere (act:clear-invoice, bir kenarın kimliği, bir kararın kimliği) referans verin.

Bir betikle

Soru: "3-way match, invoice before GR" madde kategorisinde fatura gerçekten mal kabulden önce mi geliyor? Bu betik logu sorgular ve kendi adlandırdığı iki JSON dosyası taşıyan bir rapor yazar. mzreport.json_download_link(name, document) bir JSON dosyasının yolunu yazar - istediğiniz isim, JSON, raporun ihtiyaç duyduğu kadar dosya.

"""Fatura zamanlaması mal kabul karşısında - kendi raporumuz, kendi JSON dosyalarımızı taşıyor."""
import sys
from pathlib import Path

import mindzie_engine as me
import mzreport
from mzlog import open_project
from mzreport import write_report

# Bir iş çalıştırması istediği yolu sys.argv[1] olarak geçirir; mz run hiçbir şey geçirmez.
OUT = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("preview.html")
print("rapor %s olarak yazılıyor" % OUT)

SQL = """
WITH per_case AS (
    SELECT case_id,
           min(CASE WHEN activity = 'Record Goods Receipt' THEN timestamp END) AS goods_receipt,
           min(CASE WHEN activity = 'Record Invoice Receipt' THEN timestamp END) AS invoice,
           max("Item Category") AS category
    FROM events GROUP BY case_id)
SELECT category,
       CASE WHEN goods_receipt IS NULL OR invoice IS NULL THEN 'not both recorded'
            WHEN invoice < goods_receipt THEN 'invoice before goods receipt'
            ELSE 'invoice after goods receipt' END AS timing,
       count(*) AS cases,
       round(median(date_diff('day', goods_receipt, invoice)), 1) AS median_days_receipt_to_invoice
FROM per_case GROUP BY 1, 2 ORDER BY 1, 2
"""

project = open_project()
with project.log.session() as log:
    frame = log.query(SQL)

rows = []
for record in frame.to_dict("records"):
    days = record["median_days_receipt_to_invoice"]
    rows.append({"category": record["category"], "timing": record["timing"],
                 "cases": int(record["cases"]),
                 "median_days_receipt_to_invoice": None if days != days else float(days)})

before_gr = [row for row in rows if row["category"] == "3-way match, invoice before GR"]
both = [row for row in before_gr if row["timing"] != "not both recorded"]
after_anyway = sum(row["cases"] for row in both if row["timing"] == "invoice after goods receipt")
total_both = sum(row["cases"] for row in both)
kpis = {
    "schema": "partner.invoice-timing-kpis",
    "schema_version": "1",
    "category": "3-way match, invoice before GR",
    "cases_with_both_recorded": total_both,
    "invoice_after_goods_receipt_anyway": after_anyway,
    "share_after_anyway": round(after_anyway / total_both, 4) if total_both else None,
}

sections = [
    me.heading("Fatura zamanlaması mal kabul karşısında"),
    me.kpis([
        me.kpi("İkisi de kayıtlı olan vakalar", "{:,}".format(total_both),
               sub="kategori: 3-way match, invoice before GR"),
        me.kpi("Fatura yine de sonra geldi", "{:,}".format(after_anyway),
               sub="{:.0%} oranında".format(kpis["share_after_anyway"] or 0)),
    ]),
    me.chart_bar(frame, x="timing", y="cases",
                 title="Faturaların mal kabul karşısındaki gerçek zamanlaması"),
    me.prose("Bu rapor bizim kendi analizimizdir, gönderilen kartlardan biri değildir. "
             "İstenilen programın alabilmesi için kendi adlandırdığımız iki JSON dosyası taşır: "
             + mzreport.json_download_link("invoice-timing.json",
                                           {"schema": "partner.invoice-timing",
                                            "schema_version": "1", "rows": rows})
             + " ve "
             + mzreport.json_download_link("invoice-timing-kpis.json", kpis)
             + "."),
]
write_report(OUT, meta={"title": "Fatura zamanlaması mal kabul karşısında"}, sections=sections)
print("%s yazıldı" % OUT.name)

Sorgudaki sütun adları bu loga özeldir; mz log schema logunuzun sütun isimlerini, mz log activities adımlarını söyler. Sonra:

mz run invoice_timing.py
mz jobs create --name "Fatura zamanlaması mal kabul karşısında"
mz jobs put-file --slug invoice-timing-against-the-goods-receipt --name invoice_timing.py --file invoice_timing.py
mz jobs run --slug invoice-timing-against-the-goods-receipt
mz jobs status --slug invoice-timing-against-the-goods-receipt
mz jobs outputs --slug invoice-timing-against-the-goods-receipt
mz jobs publish --slug invoice-timing-against-the-goods-receipt --run-id r0001 --output invoice_timing.html --name "Fatura zamanlaması mal kabul karşısında"
  • mz run betiği projede bir kere çalıştırır ve tüm hataları gösterir - önce orada sorunsuz çalışmasını sağlayın. Önizleme oluşturur; iş çalıştırması geçerlidir.
  • mz jobs create işin slug adını yanıtlar, diğer komutlar bunu kullanır.
  • mz jobs run bir işi çalıştırır. 10 saniyenin altında sürdü.
  • mz jobs outputs çalıştırmayı ve yazdığı raporu listeler, mz jobs publish raporu Raporlar ekranına koyar.

Betiğin yazdığı rapor, Raporlar ekranında

Rapor iki dosya taşır. mz reports attachments --slug invoice-timing-against-the-goods-receipt onları listeler:

Adı Bayt Şema
invoice-timing.json 1,254 partner.invoice-timing 1
invoice-timing-kpis.json 236 partner.invoice-timing-kpis 1

mz reports attachment --slug invoice-timing-against-the-goods-receipt --name invoice-timing-kpis.json ikinci dosyayı getirir - ve sorunun cevabı hayırdır: bu kalemlerin yüzde 92'sinde fatura mal kabul sonrası kaydedilmiştir.

{
  "schema": "partner.invoice-timing-kpis",
  "schema_version": "1",
  "category": "3-way match, invoice before GR",
  "cases_with_both_recorded": 199242,
  "invoice_after_goods_receipt_anyway": 182886,
  "share_after_anyway": 0.9179
}

Düz metinle

Betiğe gerek yok: ajanın raporu kendi kelimeleriyle tanımlar ve istediği dosyaları adlandırır. Gönderilen metin aynen şöyledir:

mz jobs create-agent --name "Ödeme engelleri - nerede ayarlanıyor ve kaldırılıyor" --brief "Bu satın alma-süreçten-ödeme akışında ödeme engellerinin nerede ayarlandığını ve kaldırıldığını bulun: kaç vaka ödeme engeli alıyor, hangi adımda ayarlanıyor, kaldırılmadan önce ne kadar kalıyor, en çok hangi madde kategorileri ve tedarikçiler etkileniyor. Kısa tutun. Rapor sonunda, bir programın okuyabilmesi için iki JSON dosyası ekleyin, mzreport.json_download_link'i bir anlatım bölümü içinde kullanarak: 'payment-blocks-summary.json' başlık sayıları (engellenen vakalar, toplam vakalar oranı, engellendiği median gün sayısı) ve 'payment-blocks-by-category.json' madde kategorisi başına bir satır ile engellenen vakalar ve engellendiği median gün sayısını içersin."
mz jobs run --slug payment-blocks-where-they-are-set-and-removed
mz jobs status --slug payment-blocks-where-they-are-set-and-removed

Bu bir AI işi: projenizin AI kredilerini kullanır. 8 dakika sürdü, çalışma bittiğinde rapor yayınlandı ve istenen iki dosyayı tam olarak içeriyordu. Bir kişi aynı raporu projenin Raporlar ekranında kartların altındaki kutudan da isteyebilir (Raporlar bakınız).

Özet metinden yazılmış rapor, Raporlar ekranında

payment-blocks-summary.json, mz reports attachment ile alınmış hali:

{
  "basis": "En az bir Set Payment Block veya Remove Payment Block olayı içeren vakalar; bir vaka bir satın alma siparişi kalemi sayılır. Günler takvim günüdür.",
  "cases_total": 251734,
  "cases_blocked": 55934,
  "share_of_all_cases_percent": 22.22,
  "median_days_blocked": 5.92,
  "median_days_blocked_basis": "engelleme başı, kaydedilmiş Set Payment Block ya da kaldırmadan önce en son kaydedilen Record Invoice Receipt'tir",
  "cases_with_recorded_set": 122,
  "median_days_blocked_recorded_set_only": 15.01,
  "cases_with_recorded_set_and_removal": 13
}

AI bu dosyaların şeklini seçti ve şema adlandırmadı. Eğer programınız sabit biçim isterse, alanları, adlarını ve kendi "schema" adınızı brifingde belirtin - veya şeklinizin tam olarak ne olduğunu yazdığınız bir betik kullanın.

Raporlarınıza ve JSON dosyalarınıza ulaşmak

Aynı dört komut, varsayılan grafik, kendi raporlarınız ve proje içindeki başkalarının yayınladığı her şeyi getirir:

Komut Ne döner
mz reports list Yayınlanmış tüm raporlar, en yeni ilk: adı, sürümü, ne zaman ve kim yayınladı, taşıdığı JSON dosyaları
mz reports read --slug <slug> Bir raporun tamamı HTML ve kaydı
mz reports attachments --slug <slug> Bir raporun taşıdığı JSON dosyaları, her biri boyutu ve şeması ile
mz reports attachment --slug <slug> --name <file> Bir JSON dosyası, raporun etrafı olmadan ham veri şeklinde

Bir raporun <slug> değeri mz reports list komutunda görünür. mz reports read, mz reports attachments ve mz reports attachment erken sürüm okumak için --version alır; her sürüm kendi dosyalarını saklar. Bir dosyayı kaydetmek için cevabı şuna yönlendirin: mz reports attachment --slug <slug> --name <file> > <file> (Windows'ta Komut İstemi'nde).

Raporda olmayan bir isim reddedilir ve var olanlar söylenir. Geçerli bir JSON olmayan dosya düz metin olarak verilmek yerine reddedilir ve raporun geçerli dosyayla tekrar yayınlanması gerekir uyarısı verir.

mz <group> --help her komutun tam seçeneklerini verir.

İşler aynı anda birer tane çalışır

Bir proje aynı anda sadece bir iş çalıştırır. Process Context Graph kartı çalışırken başlatılan bir betik işi kart bitene kadar bekler - büyük bir logda bu neredeyse bir saate varabilir - ve ancak sonrasında birkaç saniyesini alır.

Sonraki