cry-vetzdravila 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +17 -0
- package/CLAUDE.md +82 -0
- package/LICENSE.md +16 -0
- package/README.md +376 -0
- package/a.txt +1643 -0
- package/bun.lock +197 -0
- package/dist/atcvet/opisATCvetKode.d.ts +23 -0
- package/dist/atcvet/podatkiATCvetKode.d.ts +20 -0
- package/dist/atcvet/pomeniNivojevATCvet.d.ts +1 -0
- package/dist/atcvet/types/AtcvetFile.d.ts +19 -0
- package/dist/generated/AtcVet.d.ts +9 -0
- package/dist/generated/RegisterZdravil.d.ts +8 -0
- package/dist/generated/seznamZdravil.d.ts +8 -0
- package/dist/index.d.ts +244 -0
- package/dist/index.js +141786 -0
- package/dist/register/MIN_OCENA_PODOBNOSTI.d.ts +2 -0
- package/dist/register/helper/normalizirajNaziv.d.ts +176 -0
- package/dist/register/helper/oblikujRezultatIskanja.d.ts +8 -0
- package/dist/register/helper/oceniPodobnost.d.ts +37 -0
- package/dist/register/helper/poisciZivalskoVrsto.d.ts +33 -0
- package/dist/register/helper/razcleniNaziv.d.ts +2 -0
- package/dist/register/podobnaZdravilaPoATC.d.ts +16 -0
- package/dist/register/podobnaZdravilaPoUcinkovinah.d.ts +18 -0
- package/dist/register/registerZdravil.d.ts +9 -0
- package/dist/register/types/KarencaZdravila.d.ts +24 -0
- package/dist/register/types/PotUporabeZdravila.d.ts +21 -0
- package/dist/register/types/RazclembaZdravila.d.ts +9 -0
- package/dist/register/types/RegisterZdravil.d.ts +2 -0
- package/dist/register/types/UcinkovinaZdravila.d.ts +20 -0
- package/dist/register/types/Zdravilo.d.ts +65 -0
- package/dist/register/types/ZdraviloZUtemeljitvijo.d.ts +9 -0
- package/dist/register/types/ZivalskeVrste.d.ts +158 -0
- package/dist/register/uganiZdravilo.d.ts +43 -0
- package/dist/register/zdravilaZaAtcVetKodo.d.ts +8 -0
- package/dist/register/zdraviloJeVakcinaZa.d.ts +18 -0
- package/docs/vakcine.md +195 -0
- package/package.json +39 -0
- package/src/atcvet/CLAUDE.md +18 -0
- package/src/atcvet/downloadLatestAtcvetPdf.ts +107 -0
- package/src/atcvet/opisATCvetKode.ts +116 -0
- package/src/atcvet/parseAtcvetPdf.ts +215 -0
- package/src/atcvet/podatkiATCvetKode.ts +34 -0
- package/src/atcvet/pomeniNivojevATCvet.ts +8 -0
- package/src/atcvet/types/AtcvetFile.ts +22 -0
- package/src/generate.ts +111 -0
- package/src/generated/AtcVet.ts +56704 -0
- package/src/generated/seznamZdravil.ts +44833 -0
- package/src/importParseAndBuildAll.ts +97 -0
- package/src/index.ts +289 -0
- package/src/interactive.ts +428 -0
- package/src/register/CLAUDE.md +230 -0
- package/src/register/MIN_OCENA_PODOBNOSTI.ts +3 -0
- package/src/register/downloadRegister.ts +148 -0
- package/src/register/helper/analizaVakcin.ts +90 -0
- package/src/register/helper/checkVrste.ts +72 -0
- package/src/register/helper/hashString.ts +27 -0
- package/src/register/helper/normalizirajNaziv.ts +493 -0
- package/src/register/helper/oblikujRezultatIskanja.ts +15 -0
- package/src/register/helper/oceniPodobnost.ts +194 -0
- package/src/register/helper/poisciZivalskoVrsto.ts +100 -0
- package/src/register/helper/razcleniNaziv.ts +105 -0
- package/src/register/helper/testNormalizacije.ts +89 -0
- package/src/register/helper/testPodobnosti.ts +238 -0
- package/src/register/helper/testVakcin.ts +103 -0
- package/src/register/parseRegister.ts +464 -0
- package/src/register/podobnaZdravilaPoATC.ts +71 -0
- package/src/register/podobnaZdravilaPoUcinkovinah.ts +136 -0
- package/src/register/registerZdravil.ts +22 -0
- package/src/register/stats.ts +114 -0
- package/src/register/types/KarencaZdravila.ts +26 -0
- package/src/register/types/PotUporabeZdravila.ts +21 -0
- package/src/register/types/RazclembaZdravila.ts +10 -0
- package/src/register/types/RegisterRaw.ts +23 -0
- package/src/register/types/RegisterZdravil.ts +3 -0
- package/src/register/types/UcinkovinaZdravila.ts +21 -0
- package/src/register/types/Zdravilo.ts +84 -0
- package/src/register/types/ZdraviloZUtemeljitvijo.ts +11 -0
- package/src/register/types/ZivalskeVrste.ts +7 -0
- package/src/register/uganiZdravilo.ts +142 -0
- package/src/register/zdravilaZaAtcVetKodo.ts +28 -0
- package/src/register/zdraviloJeVakcinaZa.ts +202 -0
- package/src/test/testPodobnosti.test.ts +126 -0
- package/src/test/zdravila.json +38693 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statistika učinkovitosti uganiZdravilo
|
|
3
|
+
*
|
|
4
|
+
* Izvede teste na zdravilih iz zdravila.json in izpiše statistiko po številu najdenih zadetkov.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import testData from "../test/zdravila.json";
|
|
8
|
+
import { uganiZdraviloInUtemelji } from "./uganiZdravilo";
|
|
9
|
+
|
|
10
|
+
interface ZdraviloTest {
|
|
11
|
+
naziv: string;
|
|
12
|
+
skupine: string[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface TestResult {
|
|
16
|
+
naziv: string;
|
|
17
|
+
resultCount: number;
|
|
18
|
+
topMatches: { ime: string; ocena: number }[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function runTest(zdravilo: ZdraviloTest): TestResult {
|
|
22
|
+
const results = uganiZdraviloInUtemelji(zdravilo.naziv, { limit: 5 });
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
naziv: zdravilo.naziv,
|
|
26
|
+
resultCount: results.length,
|
|
27
|
+
topMatches: results.slice(0, 3).map((r) => ({
|
|
28
|
+
ime: r.zdravilo.ime,
|
|
29
|
+
ocena: r.utemeljitev.ocena,
|
|
30
|
+
})),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function main() {
|
|
35
|
+
console.log("═══════════════════════════════════════════════════════════════");
|
|
36
|
+
console.log(" STATISTIKA UČINKOVITOSTI uganiZdravilo");
|
|
37
|
+
console.log("═══════════════════════════════════════════════════════════════\n");
|
|
38
|
+
|
|
39
|
+
const zdravila = testData as ZdraviloTest[];
|
|
40
|
+
const results: TestResult[] = [];
|
|
41
|
+
|
|
42
|
+
console.log(`Testiram ${zdravila.length} zdravil iz zdravila.json...\n`);
|
|
43
|
+
|
|
44
|
+
for (const zdravilo of zdravila) {
|
|
45
|
+
const result = runTest(zdravilo);
|
|
46
|
+
results.push(result);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Razvrsti rezultate po številu zadetkov
|
|
50
|
+
const poSteviluZadetkov: Record<number, TestResult[]> = {};
|
|
51
|
+
|
|
52
|
+
for (const result of results) {
|
|
53
|
+
const count = result.resultCount;
|
|
54
|
+
if (!poSteviluZadetkov[count]) {
|
|
55
|
+
poSteviluZadetkov[count] = [];
|
|
56
|
+
}
|
|
57
|
+
poSteviluZadetkov[count].push(result);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Izpis statistike
|
|
61
|
+
console.log("═══════════════════════════════════════════════════════════════");
|
|
62
|
+
console.log(" STATISTIKA PO ŠTEVILU ZADETKOV");
|
|
63
|
+
console.log("═══════════════════════════════════════════════════════════════\n");
|
|
64
|
+
|
|
65
|
+
const skupaj = results.length;
|
|
66
|
+
const stevilke = Object.keys(poSteviluZadetkov)
|
|
67
|
+
.map(Number)
|
|
68
|
+
.sort((a, b) => a - b);
|
|
69
|
+
|
|
70
|
+
for (const stevilo of stevilke) {
|
|
71
|
+
const seznam = poSteviluZadetkov[stevilo];
|
|
72
|
+
const procent = ((seznam.length / skupaj) * 100).toFixed(1);
|
|
73
|
+
console.log(` ${stevilo} zadetkov: ${seznam.length} (${procent}%)`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
console.log(`\n SKUPAJ: ${skupaj} zdravil`);
|
|
77
|
+
|
|
78
|
+
// Izpis zdravil brez zadetka
|
|
79
|
+
const brezZadetka = poSteviluZadetkov[0] || [];
|
|
80
|
+
if (brezZadetka.length > 0) {
|
|
81
|
+
console.log("\n───────────────────────────────────────────────────────────────");
|
|
82
|
+
console.log("ZDRAVILA BREZ ZADETKA:");
|
|
83
|
+
console.log("───────────────────────────────────────────────────────────────\n");
|
|
84
|
+
|
|
85
|
+
for (const z of brezZadetka) {
|
|
86
|
+
console.log(` • ${z.naziv}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Izpis vzorca zdravil z zadetki
|
|
91
|
+
const zZadetki = results.filter((r) => r.resultCount > 0).slice(0, 10);
|
|
92
|
+
if (zZadetki.length > 0) {
|
|
93
|
+
console.log("\n───────────────────────────────────────────────────────────────");
|
|
94
|
+
console.log("VZOREC ZDRAVIL Z ZADETKI (prvih 10):");
|
|
95
|
+
console.log("───────────────────────────────────────────────────────────────\n");
|
|
96
|
+
|
|
97
|
+
for (const z of zZadetki) {
|
|
98
|
+
console.log(` • ${z.naziv}`);
|
|
99
|
+
for (let i = 0; i < z.topMatches.length; i++) {
|
|
100
|
+
const match = z.topMatches[i];
|
|
101
|
+
console.log(` ${i + 1}. ${match.ime} (ocena: ${match.ocena})`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
console.log("\n═══════════════════════════════════════════════════════════════\n");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (import.meta.main) {
|
|
110
|
+
main().catch((e) => {
|
|
111
|
+
console.error("Napaka:", e);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ZivalskeVrste } from "./ZivalskeVrste"
|
|
2
|
+
|
|
3
|
+
import { MozneKarenceZa, PotiAplikacijeZdravila } from "cry-klikvet-logic";
|
|
4
|
+
/**
|
|
5
|
+
* Karance po živalskih vrsta in morebiti po poteh aplikacije
|
|
6
|
+
*
|
|
7
|
+
* primer 1:
|
|
8
|
+
* {
|
|
9
|
+
* 'prašiči': { meso: 20, 'not. organi': 20 },
|
|
10
|
+
* konji: { meso: 10, 'not. organi': 10 },
|
|
11
|
+
* govedo: {
|
|
12
|
+
* meso: 31,
|
|
13
|
+
* 'not. organi': 31,
|
|
14
|
+
* mleko: 2,
|
|
15
|
+
* pot: { IV: { meso: 10, 'not. organi': 10, mleko: 1 } }
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
type KarencaVrste = {
|
|
21
|
+
vrsta: keyof typeof ZivalskeVrste;
|
|
22
|
+
pot?: keyof typeof PotiAplikacijeZdravila;
|
|
23
|
+
karence: Partial<Record<MozneKarenceZa, number>>;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type KarencaZdravila = KarencaVrste;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pot uporabe zdravila
|
|
3
|
+
* Na primer, za podatek v stolpcu xslx "-1081\Subkutana uporaba"
|
|
4
|
+
* const potUpora : PotUporabeZdravila = {
|
|
5
|
+
* sifra: 1081,
|
|
6
|
+
* opis: "Subkutana uporaba",
|
|
7
|
+
* koda: "SC"
|
|
8
|
+
* }
|
|
9
|
+
*/
|
|
10
|
+
export interface PotUporabeZdravila {
|
|
11
|
+
/** numerična šifra poti uprabe
|
|
12
|
+
* primer: 1081
|
|
13
|
+
*/
|
|
14
|
+
sifra: number
|
|
15
|
+
/**
|
|
16
|
+
* opis uporabe
|
|
17
|
+
* primer: Subkutana uporaba
|
|
18
|
+
*/
|
|
19
|
+
opis: string
|
|
20
|
+
koda: string[]
|
|
21
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RazclenjeniNaziv } from "../helper/normalizirajNaziv";
|
|
2
|
+
import type { Zdravilo } from "./Zdravilo";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Predpripravljena razčlemba zdravila
|
|
6
|
+
*/
|
|
7
|
+
export interface RazclembaZdravila {
|
|
8
|
+
zdravilo: Zdravilo;
|
|
9
|
+
razclemba: RazclenjeniNaziv;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Zdravilo } from "./Zdravilo";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Register veterinarskih zdravil
|
|
5
|
+
*
|
|
6
|
+
* Vsebuje seznam vseh zdravil in metapodatke o registru.
|
|
7
|
+
*/
|
|
8
|
+
export interface RegisterRaw {
|
|
9
|
+
/** Datum datoteke iz katere je bil register ustvarjen */
|
|
10
|
+
datumDatoteke: Date;
|
|
11
|
+
|
|
12
|
+
/** Datum in čas parsanja */
|
|
13
|
+
datumParsanja: Date;
|
|
14
|
+
|
|
15
|
+
/** Pot do izvorne xlsx datoteke */
|
|
16
|
+
izvornaDateteka: string;
|
|
17
|
+
|
|
18
|
+
/** Seznam vseh zdravil v registru */
|
|
19
|
+
zdravila: Zdravilo[];
|
|
20
|
+
|
|
21
|
+
/** Število zdravil v registru */
|
|
22
|
+
steviloZdravil: number;
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* Opisuje učinkovino zdravila in njeno količino v pakiranju.
|
|
4
|
+
* Primer: za stolpca v xslx
|
|
5
|
+
* - " -1\prokainijev benzilpenicilinat monohidrat -2\dihidrostreptomicinijev sulfat -3\vitamin A palmitat -4\kalcijev pantotenat"
|
|
6
|
+
* - " -1\ 1000000,0 IU -2\ 1000000,0 IU -3\ 10000,0 IU -4\ 100,0 mg"
|
|
7
|
+
* so ucinkovine
|
|
8
|
+
* const ucinkovine : UcinkovinaZdravila[] = [
|
|
9
|
+
* { ucinkovina: "prokainijev benzilpenicilinat monohidrat", kolicina: 1000000.0, enota: "IU" },
|
|
10
|
+
* { ucinkovina: "dihidrostreptomicinijev sulfat", kolicina: 1000000.0, enota: "IU" },
|
|
11
|
+
* { ucinkovina: "dihidrostreptomicinijev sulfat", kolicina: 1000000.0, enota: "IU" },
|
|
12
|
+
* { ucinkovina: "vitamin A palmitat", kolicina: 10000.0, enota: "IU" },
|
|
13
|
+
* { ucinkovina: "kalcijev pantotenat", kolicina: 100.0, enota: "mg" },
|
|
14
|
+
* ]
|
|
15
|
+
*/
|
|
16
|
+
export interface UcinkovinaZdravila {
|
|
17
|
+
ucinkovina: string
|
|
18
|
+
kolicina?: number
|
|
19
|
+
enota: string
|
|
20
|
+
dodatneInformacije?: string
|
|
21
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { UcinkovinaZdravila } from "./UcinkovinaZdravila";
|
|
2
|
+
import { PotUporabeZdravila } from "./PotUporabeZdravila";
|
|
3
|
+
import { KarencaZdravila } from "./KarencaZdravila";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Podatki o veterinarskem zdravilu iz registra JAZMP
|
|
7
|
+
*/
|
|
8
|
+
export interface Zdravilo {
|
|
9
|
+
|
|
10
|
+
/** id zdravila, izračunan kot hash */
|
|
11
|
+
id: number
|
|
12
|
+
|
|
13
|
+
/** Ime zdravila */
|
|
14
|
+
ime: string;
|
|
15
|
+
|
|
16
|
+
/** Imetnik dovoljenja za promet z zdravilom */
|
|
17
|
+
imetnikDovoljenja: string;
|
|
18
|
+
|
|
19
|
+
/** Podatki o sproščanju zdravila */
|
|
20
|
+
sproscanjeZdravila: string;
|
|
21
|
+
|
|
22
|
+
/** Številka dovoljenja za promet */
|
|
23
|
+
stevilkaDovoljenja: string;
|
|
24
|
+
|
|
25
|
+
/** Datum veljavnosti dovoljenja */
|
|
26
|
+
datumVeljavnosti: string | null;
|
|
27
|
+
|
|
28
|
+
/** Režim izdaje (npr. Rp - na recept) */
|
|
29
|
+
rezimIzdaje: string;
|
|
30
|
+
|
|
31
|
+
/** ATC koda zdravila */
|
|
32
|
+
atcKoda: string;
|
|
33
|
+
|
|
34
|
+
/** Poti uporabe zdravila */
|
|
35
|
+
potiUporabe: PotUporabeZdravila[];
|
|
36
|
+
|
|
37
|
+
/** Farmacevtska oblika zdravila */
|
|
38
|
+
farmacevtskaOblika: string;
|
|
39
|
+
|
|
40
|
+
/** Opis pakiranj */
|
|
41
|
+
pakiranja: string;
|
|
42
|
+
|
|
43
|
+
/** Enota količine za sestavo */
|
|
44
|
+
enotaKolicine: string;
|
|
45
|
+
|
|
46
|
+
/** Seznam učinkovin in njihovih količin */
|
|
47
|
+
ucinkovine: UcinkovinaZdravila[];
|
|
48
|
+
|
|
49
|
+
/** Pomožne snovi v zdravilu */
|
|
50
|
+
pomocneSnovi: string[];
|
|
51
|
+
|
|
52
|
+
/** Ciljne živalske vrste */
|
|
53
|
+
ciljneVrste: string[];
|
|
54
|
+
|
|
55
|
+
/** Karenca zdravila po vrstah */
|
|
56
|
+
karence: KarencaZdravila[];
|
|
57
|
+
|
|
58
|
+
/** Če je zdravilo vakcina, proti čemu varuje */
|
|
59
|
+
vakcinaZa?: string[]
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Stolpci v xlsx datoteki JAZMP registra
|
|
64
|
+
*/
|
|
65
|
+
export const XLSX_COLUMNS = {
|
|
66
|
+
IME_ZDRAVILA: 0,
|
|
67
|
+
IMETNIK_DOVOLJENJA: 1,
|
|
68
|
+
SPROSCANJE_ZDRAVILA: 2,
|
|
69
|
+
STEVILKA_DZP: 3,
|
|
70
|
+
DATUM_VELJAVNOSTI: 4,
|
|
71
|
+
REZIM_IZDAJE: 5,
|
|
72
|
+
ATC: 6,
|
|
73
|
+
POTI_UPORABE: 7,
|
|
74
|
+
FARMACEVTSKA_OBLIKA: 8,
|
|
75
|
+
PAKIRANJA: 9,
|
|
76
|
+
ENOTA_KOLICINE: 10,
|
|
77
|
+
UCINKOVINE: 11,
|
|
78
|
+
KOLICINE_UCINKOVIN: 12,
|
|
79
|
+
UCINKOVINE_DODATNE_INFO: 13,
|
|
80
|
+
POMOCNE_SNOVI: 14,
|
|
81
|
+
CILJNE_VRSTE: 15,
|
|
82
|
+
KARENCA_START: 16,
|
|
83
|
+
KARENCA_END: 54,
|
|
84
|
+
} as const;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UtemeljitevOcene } from "../helper/oceniPodobnost";
|
|
2
|
+
import type { Zdravilo } from "./Zdravilo";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Rezultat iskanja zdravila z utemeljitvijo
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface ZdraviloZUtemeljitvijo {
|
|
9
|
+
zdravilo: Zdravilo;
|
|
10
|
+
utemeljitev: UtemeljitevOcene;
|
|
11
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iskanje zdravil po imenu
|
|
3
|
+
*
|
|
4
|
+
* Omogoča iskanje zdravil iz registra po podobnosti imena.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Zdravilo } from "./types/Zdravilo";
|
|
8
|
+
import { razcleniNaziv } from "./helper/razcleniNaziv";
|
|
9
|
+
import { oceniPodobnost } from "./helper/oceniPodobnost";
|
|
10
|
+
import { RazclembaZdravila } from "./types/RazclembaZdravila";
|
|
11
|
+
import { ZdraviloZUtemeljitvijo } from "./types/ZdraviloZUtemeljitvijo";
|
|
12
|
+
import { oblikujRezultatIskanja } from "./helper/oblikujRezultatIskanja";
|
|
13
|
+
import { MIN_OCENA_PODOBNOSTI } from "./MIN_OCENA_PODOBNOSTI";
|
|
14
|
+
import { seznamZdravil } from "../generated/seznamZdravil";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Opcije za iskanje zdravil
|
|
18
|
+
*/
|
|
19
|
+
export interface UganiZdraviloOpts {
|
|
20
|
+
/** Maksimalno število rezultatov (privzeto 10) */
|
|
21
|
+
limit?: number;
|
|
22
|
+
/** Minimalna ocena podobnosti (privzeto MIN_OCENA_PODOBNOSTI) */
|
|
23
|
+
minOcena?: number;
|
|
24
|
+
/** Išči samo med zdravili s temi ID-ji */
|
|
25
|
+
isciMed?: number[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Cache razčlemb registra (module scope)
|
|
30
|
+
*/
|
|
31
|
+
let razclembeRegistra: RazclembaZdravila[] | null = null;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Cache razčlemb registra po ID-ju
|
|
35
|
+
*/
|
|
36
|
+
let razclembeRegistraPoId: Map<number, RazclembaZdravila> | null = null;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Pripravi razčlembe vseh zdravil iz registra
|
|
40
|
+
*/
|
|
41
|
+
function pripraviRazclembeRegistra(): RazclembaZdravila[] {
|
|
42
|
+
if (razclembeRegistra !== null) {
|
|
43
|
+
return razclembeRegistra;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
razclembeRegistra = seznamZdravil.map((zdravilo) => ({
|
|
47
|
+
zdravilo,
|
|
48
|
+
razclemba: razcleniNaziv(zdravilo.ime),
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
// Pripravi tudi mapo po ID-ju
|
|
52
|
+
razclembeRegistraPoId = new Map();
|
|
53
|
+
for (const r of razclembeRegistra) {
|
|
54
|
+
razclembeRegistraPoId.set(r.zdravilo.id, r);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return razclembeRegistra;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Vrne razčlembe za dane ID-je zdravil
|
|
62
|
+
*/
|
|
63
|
+
function razclembeZaIdje(idji: number[]): RazclembaZdravila[] {
|
|
64
|
+
// Zagotovi, da je cache pripravljen
|
|
65
|
+
pripraviRazclembeRegistra();
|
|
66
|
+
|
|
67
|
+
const rezultat: RazclembaZdravila[] = [];
|
|
68
|
+
for (const id of idji) {
|
|
69
|
+
const razclemba = razclembeRegistraPoId!.get(id);
|
|
70
|
+
if (razclemba) {
|
|
71
|
+
rezultat.push(razclemba);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return rezultat;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Poišči zdravila po podobnosti imena in vrni z utemeljitvami
|
|
79
|
+
*
|
|
80
|
+
* @param vhodniNaziv - Iskalni niz (ime zdravila)
|
|
81
|
+
* @param opts - Opcije iskanja (limit, minOcena, isciMed)
|
|
82
|
+
* @returns Seznam zdravil z utemeljitvami, sortirano po oceni padajoče
|
|
83
|
+
*/
|
|
84
|
+
export function uganiZdraviloInUtemelji(
|
|
85
|
+
vhodniNaziv: string,
|
|
86
|
+
opts: UganiZdraviloOpts = {}
|
|
87
|
+
): ZdraviloZUtemeljitvijo[] {
|
|
88
|
+
const { limit = 10, minOcena = MIN_OCENA_PODOBNOSTI, isciMed } = opts;
|
|
89
|
+
|
|
90
|
+
// Pripravi razčlembe - če je isciMed podan, išči samo med njimi
|
|
91
|
+
const razclembe = isciMed
|
|
92
|
+
? razclembeZaIdje(isciMed)
|
|
93
|
+
: pripraviRazclembeRegistra();
|
|
94
|
+
|
|
95
|
+
// Razčleni vhodni naziv
|
|
96
|
+
const razclembaVhoda = razcleniNaziv(vhodniNaziv);
|
|
97
|
+
|
|
98
|
+
// Izračunaj podobnosti
|
|
99
|
+
const rezultati: ZdraviloZUtemeljitvijo[] = [];
|
|
100
|
+
|
|
101
|
+
for (const { zdravilo, razclemba } of razclembe) {
|
|
102
|
+
const utemeljitev = oceniPodobnost(razclembaVhoda, razclemba);
|
|
103
|
+
// Dodaj samo zadetke z oceno >= minOcena
|
|
104
|
+
if (utemeljitev.ocena >= minOcena) {
|
|
105
|
+
rezultati.push({ zdravilo, utemeljitev });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Sortiraj po oceni padajoče
|
|
110
|
+
rezultati.sort((a, b) => b.utemeljitev.ocena - a.utemeljitev.ocena);
|
|
111
|
+
|
|
112
|
+
// Vrni prvih "limit" rezultatov
|
|
113
|
+
return rezultati.slice(0, limit);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Poišče zdravila v registru zdravil po podobnosti imena.
|
|
118
|
+
* Vrne seznam `limit` najboljših zadetkov in, če obstaja, najboljši zadetek.
|
|
119
|
+
*
|
|
120
|
+
* Zadetek je najboljši, če je edini ali če ima edini najvišjo oceno.
|
|
121
|
+
*
|
|
122
|
+
* @param vhodniNaziv - Iskalni niz (ime zdravila)
|
|
123
|
+
* @param opts - Opcije iskanja (limit, minOcena, isciMed)
|
|
124
|
+
* @returns { zadetki, najboljsi }
|
|
125
|
+
*/
|
|
126
|
+
export function uganiZdravilo(
|
|
127
|
+
vhodniNaziv: string,
|
|
128
|
+
opts: UganiZdraviloOpts = {}
|
|
129
|
+
): {
|
|
130
|
+
zadetki: { zdravilo: Zdravilo, ocena: number }[],
|
|
131
|
+
najboljsi: Zdravilo | undefined
|
|
132
|
+
}
|
|
133
|
+
{
|
|
134
|
+
const rezultati = uganiZdraviloInUtemelji(vhodniNaziv, opts);
|
|
135
|
+
const { zadetki, najboljsi } = oblikujRezultatIskanja(rezultati);
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
zadetki,
|
|
139
|
+
najboljsi,
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { seznamZdravil } from "../generated/seznamZdravil";
|
|
2
|
+
import type { Zdravilo } from "./types/Zdravilo";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Vrne seznam zdravil, ki se začnejo z dano atcVet kodo.
|
|
6
|
+
* Seznam je urejen po ATCvet kodah.
|
|
7
|
+
* @param atcVetKoda ATCvet koda ali njen prefiks (npr. "QJ01", "QJ01CA04")
|
|
8
|
+
* @returns Seznam zdravil z ustrezno ATCvet kodo, urejen po kodah
|
|
9
|
+
*/
|
|
10
|
+
export function zdravilaZaAtcVetKodo(atcVetKoda: string): Zdravilo[] {
|
|
11
|
+
|
|
12
|
+
if (!atcVetKoda) return [];
|
|
13
|
+
if (!atcVetKoda.toUpperCase().startsWith("Q")) return [];
|
|
14
|
+
|
|
15
|
+
const koda = atcVetKoda.toUpperCase();
|
|
16
|
+
const zdravila = seznamZdravil.filter(z =>
|
|
17
|
+
z.atcKoda && z.atcKoda.toUpperCase().startsWith(koda)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
// Uredi po ATCvet kodi
|
|
21
|
+
zdravila.sort((a, b) => {
|
|
22
|
+
const kodaA = a.atcKoda || "";
|
|
23
|
+
const kodaB = b.atcKoda || "";
|
|
24
|
+
return kodaA.localeCompare(kodaB);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return zdravila;
|
|
28
|
+
}
|