This commit is contained in:
2022-10-02 15:08:14 +02:00
parent 4258755f0a
commit ab68e303a3
11 changed files with 711 additions and 750 deletions

805
Node/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,24 +6,24 @@
"scripts": { "scripts": {
"build": "rimraf ./build && tsc", "build": "rimraf ./build && tsc",
"start": "npm run build && node build/index.js", "start": "npm run build && node build/index.js",
"start:dev": "nodemon" "dev": "nodemon"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/node": "^18.7.18", "@types/node": "^18.7.18",
"@types/uuid": "^8.3.4",
"nodemon": "^2.0.19", "nodemon": "^2.0.19",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
"typescript": "^4.8.3" "typescript": "^4.8.3"
}, },
"dependencies": { "dependencies": {
"dotenv": "^16.0.3",
"excel-date-to-js": "^1.1.5", "excel-date-to-js": "^1.1.5",
"kuzzle-sdk": "^7.10.1", "neo4j-driver": "^5.0.1",
"pocketbase": "^0.7.0", "uuid": "^9.0.0",
"read-excel-file": "^5.5.0",
"surrealdb.js": "^0.3.1",
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
} }
} }

View File

@@ -1,25 +1,7 @@
import reader from "xlsx";
import { getJsDateFromExcel } from "excel-date-to-js"; import { getJsDateFromExcel } from "excel-date-to-js";
import { writeFileSync } from "fs";
import { readdirSync, writeFileSync } from "fs";
import { join } from "path"; import { join } from "path";
import excelData from "./excelToJson";
const excelPath = join(__dirname, "..", "..", "Excel");
const excelFiles = readdirSync(excelPath);
const readExcel = (filePath: string) => {
let data: unknown[] = [];
const file = reader.readFile(filePath);
const sheets = file.SheetNames;
for (let i = 0; i < sheets.length; i++) {
const temp = reader.utils.sheet_to_json(file.Sheets[file.SheetNames[i]]);
temp.forEach((res) => {
data.push(res);
});
}
return data;
};
const recordsToJson = () => { const recordsToJson = () => {
let pacientiNr = 0; let pacientiNr = 0;
@@ -31,11 +13,8 @@ const recordsToJson = () => {
let bariNr = 0; let bariNr = 0;
let records: any[] = []; let records: any[] = [];
excelFiles.every((file) => { const data = excelData();
if (!file.includes("raw_") && !file.includes("lock")) { const klinika_emer = 'file.split("_")[0];'
const excelFile = join(excelPath, file);
const data = readExcel(excelFile);
const klinika_emer = file.split("_")[0];
klinikaNr++; klinikaNr++;
const klinika: any = { const klinika: any = {
nr: klinikaNr, nr: klinikaNr,
@@ -131,11 +110,8 @@ const recordsToJson = () => {
}); });
records.push(klinika); records.push(klinika);
console.log(`Mbaroi ${klinika_emer}`); console.log(`Mbaroi ${klinika_emer}`);
}
return true;
});
const jsonFile = join(__dirname, "..", "..", "JSON", "records.json"); const jsonFile = join(__dirname, "..", "..", "JSON", "records.json");
writeFileSync(jsonFile, JSON.stringify(records)); writeFileSync(jsonFile, JSON.stringify(records));
}; };
export default recordsToJson; export { recordsToJson, excelData };

29
Node/src/excelToJson.ts Normal file
View File

@@ -0,0 +1,29 @@
import { join } from "path";
import reader, { WorkBook, WorkSheet } from "xlsx";
import { readdirSync } from "fs";
let excelPath = join(__dirname, "..", "..", "Excel");
let excelFiles = readdirSync(excelPath);
const excelData = () => {
return excelFiles.flatMap((fileName) => {
const filePath = join(excelPath, fileName);
if (!fileName.includes("raw_") && !fileName.includes("lock")) {
const klinika_emer = fileName.split("_")[0];
const wb: WorkBook = reader.readFile(filePath);
const sheets: string[] = wb.SheetNames;
return sheets.flatMap((sheet: string) => {
const ws: WorkSheet = wb.Sheets[sheet];
const data = reader.utils.sheet_to_json(ws);
return data.map((record: any) => {
record.klinika = klinika_emer;
return record;
});
});
} else {
return;
}
});
};
export default excelData;

View File

@@ -1,23 +1,10 @@
// import { run } from "./kuzzle"; // import { initDriver } from "./neo4j.driver";
import createObjects from "./structureData";
require("dotenv").config();
import recordsToJson from "./convertToJson"; // const { NEO4J_URL, NEO4J_USER, NEO4J_PASS } = process.env;
recordsToJson();
// (async () => {
// const kuzzle = await run();
// if (kuzzle) {
// const credentials = {
// username: "julian.cuni",
// password: "MatraPaPuPa..11",
// };
// try {
// const jwt = await kuzzle.auth.login("local", credentials);
// // const apiKey = await kuzzle.auth.createApiKey("Sigfox API key");
// } catch (error: any) {
// console.error(error.message);
// }
// }
// })();
// (async () => { // (async () => {
// await login(); // await initDriver(NEO4J_URL!, NEO4J_USER!, NEO4J_PASS!);
// })(); // })();
createObjects();

42
Node/src/interfaces.ts Normal file
View File

@@ -0,0 +1,42 @@
export interface Klinika {
id: string;
emer: string;
pacientet: Pacienti[],
diagnozat: Diagnoza[]
}
export interface Diagnoza {
id: string;
emer: string;
kodi_dg_icd_9: string[];
pacientet: Pacienti[]
}
export interface Pacienti {
id: string;
emer: string;
mbiemer: string;
datelindja: Date;
mosha: number;
gjinia: string;
}
export interface Shtrimi {
id: string;
date: Date;
dite_qendrimi: number;
}
export interface Trajtimi {
id: string;
urgjence: boolean;
salle_lindje: boolean;
barnat: Bari[];
}
export interface Bari {
id: string;
emer: string;
njesia: string | null;
sasia: string | null;
}

View File

@@ -1,27 +0,0 @@
import { Kuzzle, WebSocket, Http } from "kuzzle-sdk";
const kuzzle = new Kuzzle(new Http("localhost"));
kuzzle.on("networkError", (error: any) => {
console.error("Network Error: ", error);
});
const run = async () => {
try {
// Connects to the Kuzzle server
await kuzzle.connect();
// Creates an index
// await kuzzle.index.create("nyc-open-data");
// // Creates a collection
// await kuzzle.collection.create("nyc-open-data", "yellow-taxi", {});
// console.log("nyc-open-data/yellow-taxi ready!");
return kuzzle;
} catch (error: any) {
console.error(error.message);
}
// finally {
// kuzzle.disconnect();
// }
return null;
};
export { run };

13
Node/src/neo4j.driver.ts Normal file
View File

@@ -0,0 +1,13 @@
import neo4j, { Driver } from "neo4j-driver";
let driver: Driver;
export const initDriver = async (uri: string, username: string, password: string) => {
driver = neo4j.driver(uri, neo4j.auth.basic(username, password));
await driver.getServerInfo();
return driver;
};
export const getDriver = () => {
return driver;
}

81
Node/src/saveToNeo4j.ts Normal file
View File

@@ -0,0 +1,81 @@
import { ManagedTransaction, QueryResult } from "neo4j-driver";
import { Klinika, Pacienti } from "./interfaces";
import { getDriver } from "./neo4j.driver";
export const findPacient = async (pacienti: Pacienti) => {
const driver = getDriver();
const session = driver.session();
try {
const result: QueryResult = await session.executeRead(
(tx: ManagedTransaction) => {
return tx.run(
`MATCH (p:Pacienti) WHERE p.emer = $emer AND p.mbiemer = $mbiemer AND p.mosha = $mosha
RETURN p
`,
{
emer: pacienti.emer,
mbiemer: pacienti.mbiemer,
mosha: pacienti.mosha,
}
);
}
);
await session.close();
return result;
} catch (error) {
console.error(error);
await session.close();
return null;
}
};
export const findKlinika = async (klinika: Klinika) => {
const driver = getDriver();
const session = driver.session();
try {
const result: QueryResult = await session.executeRead(
(tx: ManagedTransaction) => {
return tx.run(
`OPTIONAL MATCH (k:Klinika) WHERE k.emer = $emer RETURN k IS NOT NULL AS Predicate
`,
{
emer: klinika.emer,
}
);
}
);
await session.close();
return result;
} catch (error) {
console.error(error);
await session.close();
return null;
}
};
export const upsertKlinika = async (klinika: Klinika) => {
const klinikaFromDb = await findKlinika(klinika);
if (!klinikaFromDb?.records[0].get('Predicate')) {
const driver = getDriver();
const session = driver.session();
try {
const result: QueryResult = await session.run(
`MERGE (k:Klinika {emer: $emer}) RETURN k
`,
{
emer: klinika.emer,
}
);
await session.close();
return result;
} catch (error) {
console.error(error);
await session.close();
return null;
}
}
return klinikaFromDb;
};

View File

@@ -1,37 +0,0 @@
const Surreal = require("surrealdb.js");
const db = new Surreal("https://baas.microservices.al/rpc");
async function main() {
try {
await db.use("fluxem", "fluxem");
const token = await db.signin({
NS: "fluxem",
DB: "fluxem",
SC: "allusers",
email: "test@acme.com",
pass: "some password",
marketing: true,
tags: ["rust", "golang", "javascript"],
});
let created = await db.create("person", {
title: "Founder & CEO",
name: {
first: "Tobie",
last: "Morgan Hitchcock",
},
marketing: true,
identifier: Math.random().toString(36).substr(2, 10),
});
// await db.invalidate();
// const res = await db.authenticate(token)
console.log("token", created);
} catch (e) {
console.error("ERROR", e);
}
}
main();

172
Node/src/structureData.ts Normal file
View File

@@ -0,0 +1,172 @@
import excelData from "./excelToJson";
import { v4 as uuidv4 } from "uuid";
import { getJsDateFromExcel } from "excel-date-to-js";
import {
Klinika,
Pacienti,
Shtrimi,
Diagnoza,
Trajtimi,
Bari,
} from "./interfaces";
// import { findPacient, upsertKlinika } from "./saveToNeo4j";
let klinikat: Klinika[] = [];
let pacientet: Pacienti[] = [];
let shtrimet: Shtrimi[] = [];
let diagnozat: Diagnoza[] = [];
let trajtimet: Trajtimi[] = [];
let barnat: Bari[] = [];
const createObjects = () => {
let errorNr = 0;
let pacientiNr = 0;
const data = excelData();
data.every(async (record: any) => {
if (record && record["EMER"] && record["MBIEMER"]) {
let emerPacienti = record.EMER;
let mbiemerPacienti = record.MBIEMER;
let moshaPacienti = record.MOSHA;
let gjiniaPacienti = record.GJINIA;
let datelindjaPacienti = record.DATELINDJA_KORIGJ;
let klinikaEmer = record.klinika;
let dataEShtrimit = record.DT_SHTRIMI_KORIGJ;
let dite_qendrimi = record["DITE QENDRIMI NE SPITAL"];
let diagnozaRaw = record.DIAGNOZA;
let kodi_dg_icd_9Raw = record["Kodi DG ICD-9"];
let trajtimiUrgjence = record["TRAJTIMI SPITALOR Urgjence"];
let trajtimiPavion = record["TRAJTIMI SPITALOR Pavion"];
let trajtimiSalleLindje = record["TRAJTIMI SALLE LINDJE"];
try {
datelindjaPacienti = getJsDateFromExcel(datelindjaPacienti);
dataEShtrimit = getJsDateFromExcel(dataEShtrimit);
} catch (error: any) {
datelindjaPacienti = null;
}
let klinika: Klinika = {
id: uuidv4(),
emer: klinikaEmer.trim(),
pacientet: [],
diagnozat: [],
};
insertKlinikaArr(klinika);
let pacienti: Pacienti = {
id: uuidv4(),
emer: emerPacienti.trim(),
mbiemer: mbiemerPacienti.trim(),
datelindja: datelindjaPacienti,
mosha: moshaPacienti,
gjinia: klinika.emer === "OBS-GYN" ? "F" : gjiniaPacienti.trim(),
};
const newPacient = insertPacientiArr(pacienti);
klinika.pacientet.push(newPacient);
let diagnoza: Diagnoza = {
id: uuidv4(),
emer: diagnozaRaw.trim(),
kodi_dg_icd_9: kodi_dg_icd_9Raw ? kodi_dg_icd_9Raw.split("\n") : [],
pacientet: [],
};
diagnoza.pacientet.push(newPacient);
const newDiagnoze = insertDiagnozaArr(diagnoza);
klinika.diagnozat.push(newDiagnoze);
let shtrimi: Shtrimi = {
id: uuidv4(),
date: dataEShtrimit,
dite_qendrimi: dite_qendrimi ? dite_qendrimi : null,
};
shtrimet.push(shtrimi);
if (trajtimiPavion) rregulloBarnat(trajtimiPavion);
if (trajtimiSalleLindje) rregulloBarnat(trajtimiSalleLindje);
if (trajtimiUrgjence) rregulloBarnat(trajtimiUrgjence);
let trajtimi: Trajtimi = {
id: uuidv4(),
salle_lindje: trajtimiSalleLindje ? true : false,
urgjence: trajtimiUrgjence ? true : false,
barnat: barnat,
};
// return false;
} else {
// console.log(errorNr++, record);
}
return true;
});
console.log(barnat.length);
};
const rregulloBarnat = (trajtimiRaw: any): Bari[] => {
let barnatRawArr = trajtimiRaw.split("\n");
return barnatRawArr.map((bar: any) => {
bar = bar.trim();
let bariRaw = bar.split(",");
if (
bariRaw[0] === "" ||
bariRaw[0] === "??" ||
bariRaw[0] === "???" ||
bariRaw[0] === "????" ||
bariRaw[0] === "---" ||
bariRaw[0] === "----" ||
bariRaw[0] === "-----"
) {
return null;
} else {
let newBar: Bari = {
id: uuidv4(),
emer: bariRaw[0],
njesia: null,
sasia: null,
};
const isFoundBari = barnat.some((bar) => {
if (newBar.emer === bar.emer) {
return true;
}
return false;
});
if (!isFoundBari) {
barnat.push(newBar);
}
return newBar;
}
});
};
const insertKlinikaArr = (klinika: Klinika) => {
const isFoundKlinika = klinikat.some((klinike) => {
if (klinika.emer === klinike.emer) {
return true;
}
return false;
});
if (!isFoundKlinika) klinikat.push(klinika);
return klinika;
};
const insertPacientiArr = (pacienti: Pacienti) => {
const isFoundPacienti = pacientet.some((pacient) => {
if (
pacienti.emer === pacient.emer &&
pacienti.mbiemer === pacient.mbiemer
) {
return true;
}
return false;
});
if (!isFoundPacienti) pacientet.push(pacienti);
return pacienti;
};
const insertDiagnozaArr = (diagnoza: Diagnoza) => {
const isFoundDiagnoza = diagnozat.some((diagnoze) => {
if (diagnoza.emer === diagnoze.emer) {
return true;
}
return false;
});
if (!isFoundDiagnoza) diagnozat.push(diagnoza);
return diagnoza;
};
export default createObjects;