first commit

This commit is contained in:
Sas Andy
2024-11-08 08:42:16 +07:00
commit 230a779732
12 changed files with 1696 additions and 0 deletions

25
source/config/config.ts Normal file
View File

@@ -0,0 +1,25 @@
import { readFileSync } from "fs";
interface IConfig {
base_url: string;
schedule: string[];
delay: number;
row_per_batch: number;
mcuID: string;
startDate: string;
endDate: string;
}
const j_config = JSON.parse(
readFileSync("./config-point-member.json").toString()
);
const config: IConfig = {
base_url: j_config["base_url"],
schedule: j_config["schedule"],
delay: j_config["delay"],
row_per_batch: j_config["row_per_batch"],
mcuID: j_config["mcuID"],
startDate: j_config["startDate"],
endDate: j_config["endDate"],
};
export default config;

48
source/config/logging.ts Normal file
View File

@@ -0,0 +1,48 @@
import moment from "moment";
const getTimeStamp = (): string => {
const dt = moment().format("yyyy-MM-DD HH:mm:ss");
return dt;
};
const info = (namespace: string, message: string, object?: any) => {
if (object) {
console.log(
`[${getTimeStamp()}] [INFO] [${namespace}] [${message}]`,
object
);
} else {
console.log(`[${getTimeStamp()}] [INFO] [${namespace}] [${message}]`);
}
};
const warning = (namespace: string, message: string, object?: any) => {
if (object) {
console.log(
`[${getTimeStamp()}] [WARNING] [${namespace}] [${message}]`,
object
);
} else {
console.log(`[${getTimeStamp()}] [WARNING] [${namespace}] [${message}]`);
}
};
const error = (namespace: string, message: string, object?: any) => {
if (object) {
console.log(
`[${getTimeStamp()}] [ERROR] [${namespace}] [${message}]`,
object
);
} else {
console.log(`[${getTimeStamp()}] [ERROR] [${namespace}] [${message}]`);
}
};
const delay = (time: number) => new Promise((res) => setTimeout(res, time));
export default {
info,
warning,
error,
delay,
};

10
source/interfaces.ts Normal file
View File

@@ -0,0 +1,10 @@
export interface IOrder {
T_OrderHeaderID: string;
T_OrderHeaderDate: string;
T_OrderHeaderLabNumber: string;
T_OrderHeaderLabNumberExt: string;
M_PatientNoreg: string;
M_PatientIDNumber: string;
orderYear: string;
branchCode: string;
}

92
source/lib-inject.ts Normal file
View File

@@ -0,0 +1,92 @@
import axios from "axios";
import config from "./config/config";
import logging from "./config/logging";
import { NAME_SPACE } from "./server";
export const getOrder = async (
setupID: string,
startDate: string,
endDate: string
) => {
const url =
config.base_url +
"mockup/mcuoffline/injectdetail/getpatient/" +
setupID +
"/" +
startDate +
"/" +
endDate +
"/Y";
logging.info(NAME_SPACE, "\t INFO : " + url);
logging.info(NAME_SPACE, "\t INFO Setup id: " + setupID);
logging.info(NAME_SPACE, "\t INFO start Date: " + startDate);
logging.info(NAME_SPACE, "\t INFO end Date: " + endDate);
// logging.info(NAME_SPACE, "PRM : ", prm);
try {
const resp = await axios.post(
url,
{},
{
headers: { "Content-Type": "application/json; charset=UTF-8" },
responseType: "arraybuffer",
}
);
const jresp = JSON.parse(resp.data.toString());
return jresp;
} catch (e) {
if (axios.isAxiosError(e)) {
logging.error(NAME_SPACE, e.response?.data.toString());
} else if (e instanceof Error) {
logging.error(NAME_SPACE, e.message);
}
}
};
export const getDetail = async (orderid: string) => {
const url =
config.base_url +
"mockup/mcuoffline/injectdetail/getDetail/" +
orderid +
"/Y";
logging.info(NAME_SPACE, "\t INFO : " + url);
// logging.info(NAME_SPACE, "PRM : ", prm);
try {
const resp = await axios.post(
url,
{},
{
headers: { "Content-Type": "application/json; charset=UTF-8" },
responseType: "arraybuffer",
}
);
const jresp = JSON.parse(resp.data.toString());
return jresp;
} catch (e) {
if (axios.isAxiosError(e)) {
logging.error(NAME_SPACE, e.response?.data.toString());
} else if (e instanceof Error) {
logging.error(NAME_SPACE, e.message);
}
}
};
export const inject = async (prm: any) => {
const url = config.base_url + "mockup/mcuoffline/injectdetail/injectV2/";
logging.info(NAME_SPACE, "\t\t\t INFO : " + url);
// logging.info(NAME_SPACE, "PRM : ", prm);
try {
const resp = await axios.post(
url,
{ data: prm },
{
headers: { "Content-Type": "application/json; charset=UTF-8" },
responseType: "arraybuffer",
}
);
const jresp = JSON.parse(resp.data.toString());
return jresp;
} catch (e) {
if (axios.isAxiosError(e)) {
logging.error(NAME_SPACE, e.response?.data.toString());
} else if (e instanceof Error) {
logging.error(NAME_SPACE, e.message);
}
}
};

160
source/server.ts Normal file
View File

@@ -0,0 +1,160 @@
import config from "./config/config";
import logging from "./config/logging";
import * as Xcron from "node-cron";
import { getDetail, getOrder, inject } from "./lib-inject";
export const NAME_SPACE = "INJECT DTL RESUME INDIVIDU";
const VERSION = "1.0";
let isRunning: boolean = false;
logging.info(NAME_SPACE, "Starting " + VERSION);
const on_init = async () => {
logging.info(
NAME_SPACE,
"-------------------- ON INT START --------------------"
);
await Inject();
logging.info(
NAME_SPACE,
"-------------------- ON INIT END --------------------"
);
};
on_init();
async function Inject() {
if (isRunning) {
logging.info(NAME_SPACE, "Still Running");
return;
}
isRunning = true;
try {
logging.info(NAME_SPACE, "Starting Job Inject" + VERSION);
// UPLOAD
logging.info(NAME_SPACE, "Start GET ORDER");
var respOrder = await getOrder(
config.mcuID,
config.startDate,
config.endDate
);
if (respOrder["status"] != "OK") {
logging.error(NAME_SPACE, "\t Error", respOrder);
} else {
logging.info(
NAME_SPACE,
"\t Success get order data found ",
respOrder.data.length
);
}
let orders = respOrder.data;
logging.info(NAME_SPACE, "\t\t wait 1s");
await delay(1000);
logging.info(NAME_SPACE, "End Job Get Order");
for (let index = 0; index < orders.length; index++) {
const element = orders[index];
logging.info(NAME_SPACE, "START GET DETAIL");
let count = index + 1;
logging.info(
NAME_SPACE,
"GET DETAIL :" + count + "/" + respOrder.data.length.toString()
);
var respDetail = await getDetail(element.orderID);
if (respDetail["status"] != "OK") {
logging.error(NAME_SPACE, "\t Error", respDetail);
} else {
let detail = respDetail.data;
logging.info(
NAME_SPACE,
"\t Success get order data found ",
respDetail.data.length
);
if (detail == 0) {
logging.info(NAME_SPACE, "\t Not Inject ");
} else {
logging.info(NAME_SPACE, "\t\t START INJECT DATA ");
logging.info(
NAME_SPACE,
"\t\t START INJECT DATA NO REG",
element.labNumber
);
logging.info(
NAME_SPACE,
"\t\t START INJECT DATA NAME",
element.patientName
);
logging.info(
NAME_SPACE,
"\t\t START CORPORATE",
element.corporateName
);
for (let j = 0; j < detail.length; j++) {
const e = detail[j];
logging.info(
NAME_SPACE,
"\t\t\t INJECT GROUP RESULT :",
e.groupResultName
);
logging.info(NAME_SPACE, "\t\t\t INJECT TESTNAME :", e.testName);
logging.info(NAME_SPACE, "\t\t\t INJECT CATEGORY :", e.category);
logging.info(
NAME_SPACE,
"\t\t\t INJECT RST :",
e.resumeEntryResult
);
var respInsert = await inject(e);
if (respInsert["status"] != "OK") {
logging.error(NAME_SPACE, "\t\t\t Error", respInsert);
} else {
logging.info(NAME_SPACE, "\t\t\t Success Insert", respInsert);
}
logging.info(NAME_SPACE, "\t\t\t wait 1s");
await delay(1000);
}
logging.info(NAME_SPACE, "\t\t END INJECT DATA ");
}
}
logging.info(NAME_SPACE, "\t wait 1s");
await delay(1000);
logging.info(NAME_SPACE, "END GET DETAIL");
}
isRunning = false;
} catch (e) {
isRunning = false;
if (e instanceof Error) {
logging.error(NAME_SPACE, e.message);
} else {
logging.error(NAME_SPACE, "Unknown");
}
}
}
// console.log(config);
for (const sched of config.schedule) {
Xcron.schedule(
sched,
async () => {
logging.info(
NAME_SPACE,
" -------------------- ON INIT SCHEDULE --------------------"
);
logging.info(
NAME_SPACE,
"-------------------- END SCHEDULE--------------------"
);
},
{
timezone: "Asia/Jakarta",
}
);
}
// ------------- function
async function delay(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}