Po Temoje 3 išmokote, kaip ištraukti ir transformuoti duomenis (RQL, JSON, failai). Temoje 4 sutariame, kaip tas pats darbas atrodo ERP sąsajoje: kur kuriate automatizavimą, kokį tipą pasirenkate, kaip vartotojas įveda pradinius duomenis ir kaip grąžinate rezultatą. Techninį kodą (scriptContent, forma, initial, output) detaliau — Tema 6.
Testavimo aplinka. Tai jūsų bandomoji organizacija. Parašytų automatizacijų testavimui naudokite vartotoją, kurio teisės atitinka galutinį vykdytoją.
Naują automatizavimą paprastai rasite ERP-> Nustatymai -> Bendrieji -> Automatizacijos. Tipinė eiga: Naujas → užpildote metaduomenis → pasirenkate tipą ir vietas → įrašote scenarijų → išsaugote.
CLIENT-TYPE-REPORT, C-001). Patogus paieškai ir palaikymui (aptarnavimui).placeId)Vietos priskyrimas nurodo, kur ERP sąsajoje vartotojas matys rankinio paleidimo veiksmą (mygtuką, meniu eilutę, „Papildomi veiksmai“).
| Elementas | Ką reiškia | Pavyzdys |
|---|---|---|
| Vieta | Kur rodomas veiksmas konkrečiai sąsajoje | Klientų sąrašas, atsargų koregavimai, dokumento forma |
Vienas automatizavimas gali turėti kelias vietas arba būti susietas su viena pagrindine vieta — priklauso nuo produkto konfigūracijos. Prieš publikuojant patikrinkite, ar veiksmas matomas ten, kur tikitės.
Programėlė ir Sprendimas — tai automatizavimų grupavimas organizacijoje. Pagal nutylėjimą dažnai renkama parinktis „Organizacijai pritaikytos automatizacijos“ ir sukuriamas (ar pasirenkamas) savo sprendimo pavadinimas (pvz. „Integracijos“, „Ataskaitos“, „Mokymai“).
Automatizavimo tipas nulemia, kaip jis paleidžiamas, ką gauna į initial ir kaip elgiasi vartotojo sąsajoje. Konkretūs triggerTypeId reikšmės priklauso nuo versijos — žemiau — logika, kurią sutapatinsite su savo TEST aplinka ir eksportuotais JSON failais (triggerTypeId: 0 dažnai reiškia rankinį / kontekstinį).
| Tipas | Kada naudoti | Elgsena vartotojui | Įėjimas (initial) |
|---|---|---|---|
| a) Rankinis / kontekstinis | Vartotojas pats pasirenka įrašus sąraše ar dokumente ir paleidžia veiksmą | Matomas duomenų įvedimo dialogas (jei apibrėžta forma) ir atsakymas pranešime po vykdymo | IDs iš sąrašo (initial.ids), kontekstas dokumento (initial.id), forma (paramsFormSchema), filtras (initial.filterString) |
| b) Vidinis įvykis (asinchroninis) | Procesas stebi sistemos veiksmus ir vykdo darbą fone | Nėra blokuojančio dialogo; rezultatas — žurnale / foninėje užduotyje | Įvykio objektas + bendras kontekstas (įmonė, naudotojas) |
| c) Vidinis įvykis (sinchroninis) | Papildoma validacija ar skaičiavimas prieš tęsiant ERP veiksmą | Vartotojas laukia; gali sustabdyti pradėtą ERP veiksmą | Tas pats įvykio kontekstas kaip (b), vykdymas sinchroninis |
| d) Laikmatis (CRON) | Periodinės užduotys (kas valandą, dieną, savaitę) | Dažnai be dialogo; rezultatas — istorijoje / žurnale | Minimalus kontekstas; parametrai — parameterValues DB |
Išsamesnė trigerių logika — Tema 8 · Konceptas ir trigeriai. Sinchroninio / asinchroninio skirtumai — Tema 9.
Kiekvienas paleidimas perduoda scenarijui objektą initial. Turinys priklauso nuo tipo:
| Tipas | Kas dažniausiai ateina į initial |
Kur naudoti scenarijuje |
|---|---|---|
| Rankinis iš sąrašo | initial.ids, kartais initial.id, initial.filterString, initial.sortString |
if (!initial.ids?.length) throw new UserError(...) |
| Rankinis su forma | Laukai iš paramsFormSchema, pvz. initial.clientKind, initial.rangeFrom |
Validacija prieš rql |
| Vidinis įvykis | Įvykio payload (dokumentas, eilutės), initial.companyId, inicijuotojas |
Logika pagal įvykio tipą, ne sąrašo ID |
| CRON / scheduler | Įmonė, organizacija, parametrai iš DB | Ciklas per įmones; dažnai be dialogo |
Ataskaitoje rezultatą grąžinate per
output = { data: ... }(žr. Tema 3). Automatizavimo scenarijuje rezultatą ir vartotojo žinutę formuojate peroutputsumessageirexecutionStatus(žr. §6).
paramsFormSchema)Kai paramsFormEnabled: true, ERP rodo formą pagal paramsFormSchema — JSON masyvas su blokais. Kiekvienas blokas turi blockType ir meta (lauko vardas, antraštė, dydis, privalomumas).
{
"blockType": "SELECT",
"meta": {
"fieldName": "dateType",
"submitFieldName": ":id",
"title": "Datos tipas",
"size": 3,
"defaultValue": 0,
"meta": {
"detectPrimitive": true,
"getItems": [
{ "id": 0, "name": "Operacijos data" },
{ "id": 1, "name": "Mokėjimo data" }
]
}
}
}
[
{
"blockType": "SELECT",
"meta": {
"fieldName": "client",
"title": "Klientas",
"size": 12,
"meta": {
"getItems": "rql:@MDPAGE SELECT * FROM clients"
}
}
}
]
{
"blockType": "FIELD",
"meta": {
"fieldName": "rangeFrom",
"title": "Data nuo",
"fieldType": "date",
"size": 3,
"required": true,
"meta": { "defaultIsCurrentDate": true }
}
},
{
"blockType": "FIELD",
"meta": {
"fieldName": "rangeTo",
"title": "Data iki",
"fieldType": "date",
"size": 3,
"required": true,
"meta": { "defaultIsCurrentDate": true }
}
}
Scenarijuje reikšmės skaitomos kaip initial.rangeFrom, initial.rangeTo, initial.client ir t. t. Pilnesni pavyzdžiai —
scripts/readme
.
Automatizavimo istorija / veiksmų žurnalas / vykdymo detalė — ten matote, kas vyko vykdymo metu. Kode naudokite log.info, log.warn, log.error (geriau await log.info(...), kad įrašai spėtų užsirašyti prieš sesijos pabaigą).
log.error su kontekstu (eilutės numeris, dokumento ID).output.message.await log.info("Pradedama. Pažymėtų klientų: " + (initial.ids?.length ?? 0));
const page = await rql(`SELECT id, name FROM clients WHERE ...`);
await log.info("Rasta klientų: " + (page?.content?.length ?? 0));
await log.error(JSON.stringify({ step: "processRow", rowNo, error: error?.message }));
output)Scenarijaus pabaigoje formuojate objektą output. Platforma pagal jį parodo vartotojui pranešimą ir (priklausomai nuo konfigūracijos) struktūrizuotus duomenis.
executionStatusSUCCESS — viskas atlikta pagal planą (numatytasis).WARNING — dalinai atlikta arba su įspėjimais (pvz. nieko nerasta pagal filtrą).FAILED — kritinė klaida.message ir HTMLmessage — tekstas, kurį mato vartotojas. Galite naudoti paprastą tekstą arba HTML (nuorodos, paryškinimai):
output = {
executionStatus: "SUCCESS",
message:
"Failas sukurtas: " +
`<a href="${uploadedFile.publicLink}" target="_blank" style="color: green;">Peržiūrėti</a>`,
data: {
file: {
id: uploadedFile.id,
fileName: "purchase-invoices.csv",
publicLink: uploadedFile.publicLink,
internalLink: uploadedFile.internalLink,
},
},
};
Lauką data naudokite papildomiems duomenims. Pilna API — Tema 7 · output.
// SUCCESS
output = {
executionStatus: "SUCCESS",
message: "Apdorota klientų: <strong>12</strong>",
data: { count: 12 },
};
// WARNING — pvz. nieko nerasta pagal filtrą
output = {
executionStatus: "WARNING",
message:
"Pagal pasirinktą tipą klientų nerasta. Patikrinkite filtrą arba sukurkite duomenis TEST aplinkoje.",
data: { count: 0 },
};
Užduotis: sukurkite Manual tipo automatizavimą, kuris kviečiamas iš Klientų sąrašo, su dialogu ir rezultatu ekrane bei žurnale.
Prieš vykdymą vartotojas pasirenka Kliento tipą: Juridinis arba Fizinis.
{
"blockType": "SELECT",
"meta": {
"fieldName": "clientKind",
"title": "Kliento tipas",
"size": 6,
"required": true,
"meta": {
"detectPrimitive": true,
"getItems": [
{ "id": "JURIDINIS", "name": "Juridinis asmuo" },
{ "id": "FIZINIS", "name": "Fizinis asmuo" }
]
}
}
}
Scenarijuje reikšmė bus initial.clientKind. Svarbu: tikrą lauką klientų lentelėje patikrinkite Lentelių tipuose / GraphQL (pvz. isCompany, clientType) — pavyzdžiuose naudojame loginį pavadinimą clientKind.
const selectedKind = initial.clientKind;
if (!selectedKind) {
throw new UserError("Pasirinkite kliento tipą.");
}
const companyId = initial.companyId;
const page = await rql(`
SELECT id, code, name, isCompany
FROM clients
WITH companyId = ${companyId} size = 500
`);
let rows = page?.content ?? [];
if (selectedKind === "JURIDINIS") {
rows = rows.filter((c) => c.isCompany === true);
} else if (selectedKind === "FIZINIS") {
rows = rows.filter((c) => c.isCompany === false);
}
await log.info(`Rasta klientų (${selectedKind}): ${rows.length}`);
if (rows.length === 0) {
output = {
executionStatus: "WARNING",
message: `Pagal tipą „${selectedKind}“ klientų nerasta.`,
data: { clientKind: selectedKind, count: 0 },
};
} else {
output = {
executionStatus: "SUCCESS",
message: `Rasta klientų (${selectedKind}): <strong>${rows.length}</strong>`,
data: { clientKind: selectedKind, count: rows.length, preview: rows.slice(0, 20) },
};
}
| Laukas | Rekomenduojama reikšmė |
|---|---|
name |
Klientų tipų ataskaita (sąraše) |
code |
CLIENT-TYPE-FILTER |
placeId |
clients-list |
triggerTypeId |
0 (rankinis / kontekstinis) |
paramsFormEnabled |
true |
Repo pavyzdžiai su clients-list ir forma —
c-001
(failo įkėlimas) ir Tema 8.
output; įvykis — savo įvykio struktūrą; CRON — be vartotojo dialogo.initial ir paramsFormSchema apibrėžia įėjimą; log.* — auditą; output.message ir executionStatus — vartotojo atsakymą.placeId: clients-list ir dialogu „Kliento tipas“ (§7).executionStatus ir žurnalo eilutėmis.initial, kur output.