This commit is contained in:
wayanrivan
2026-04-15 10:17:15 +07:00
3 changed files with 136 additions and 98 deletions

View File

@ -22,7 +22,7 @@
"database": { "database": {
"engine": "postgres", "engine": "postgres",
"host": "127.0.0.1", "host": "127.0.0.1",
"port": "15432", "port": "1520",
"username": "saude_stag", "username": "saude_stag",
"password": "gM*#o>3W4&5X", "password": "gM*#o>3W4&5X",
"database": "saude_stag", "database": "saude_stag",

View File

@ -1,4 +1,4 @@
import { QueueMonitoring, Paging } from "entity"; import { QueueMonitoring, Paging, QueueMonitoringRooms, Status } from "entity";
import { NextFunction, Response } from "express"; import { NextFunction, Response } from "express";
import { Request } from "express-jwt"; import { Request } from "express-jwt";
import Joi from "joi"; import Joi from "joi";
@ -86,22 +86,19 @@ export class QueueMonitoringController {
const param: any = await schema.validateAsync(req.params); const param: any = await schema.validateAsync(req.params);
const queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.slug": param.slug }).then((q) => const queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.slug": param.slug }).then((q) => q.leftJoinAndSelect("QueueMonitoring.rooms", "rooms").leftJoinAndSelect("rooms.department", "department").getOne());
q.leftJoinAndSelect("QueueMonitoring.rooms", "rooms").leftJoinAndSelect("rooms.department", "department").getOne()
);
if (!queueMonitoring) throw { message: "Queue Monitoring Not Found" }; if (!queueMonitoring) throw { message: "Queue Monitoring Not Found" };
if (queueMonitoring.rooms && queueMonitoring.rooms.length > 0) { if (queueMonitoring.rooms && queueMonitoring.rooms.length > 0) {
try { try {
const roomIds = queueMonitoring.rooms.map((room: any) => room.id); const roomIds = queueMonitoring.rooms.map((room: any) => room.id);
const today = moment().format("YYYY-MM-DD"); const today = moment().format("YYYY-MM-DD");
const placeholders = roomIds.map((_: any, index: number) => `$${index + 1}`).join(", "); const placeholders = roomIds.map((_: any, index: number) => `$${index + 1}`).join(", ");
const dateParamIndex = roomIds.length + 1; const dateParamIndex = roomIds.length + 1;
const queryParams = [...roomIds, today]; const queryParams = [...roomIds, today];
const queueQuery = ` const queueQuery = `
SELECT SELECT
ro.id, ro.id,
@ -122,9 +119,9 @@ export class QueueMonitoringController {
ELSE 2 END, ELSE 2 END,
ro.qeue_number ASC ro.qeue_number ASC
`; `;
const allQueues = await OrmHelper.DB.manager.query(queueQuery, queryParams); const allQueues = await OrmHelper.DB.manager.query(queueQuery, queryParams);
const queuesByRoom: { [key: string]: any[] } = {}; const queuesByRoom: { [key: string]: any[] } = {};
allQueues.forEach((queue: any) => { allQueues.forEach((queue: any) => {
const roomId = queue.roomId; const roomId = queue.roomId;
@ -136,7 +133,7 @@ export class QueueMonitoringController {
id: queue.id, id: queue.id,
qeue_number: queue.qeue_number, qeue_number: queue.qeue_number,
registration_status: queue.registration_status, registration_status: queue.registration_status,
fullname_patient: queue.fullname_patient fullname_patient: queue.fullname_patient,
}); });
} }
}); });
@ -146,14 +143,14 @@ export class QueueMonitoringController {
queueMonitoring.rooms.forEach((room: any) => { queueMonitoring.rooms.forEach((room: any) => {
roomIdToRoomObj[room.id] = room; roomIdToRoomObj[room.id] = room;
}); });
queueMonitoring.rooms = queueMonitoring.rooms.map((room: any) => ({ queueMonitoring.rooms = queueMonitoring.rooms.map((room: any) => ({
...room, ...room,
queues: queuesByRoom[room.id] || [] queues: queuesByRoom[room.id] || [],
})); }));
const latestOnGoing = allQueues const latestOnGoing = allQueues
.filter((q: any) => q.registration_status === 'ON GOING') .filter((q: any) => q.registration_status === "ON GOING")
.reduce((latest: any, current: any) => { .reduce((latest: any, current: any) => {
const latestDate = new Date(latest?.updated_at || latest?.updatedAt || 0); const latestDate = new Date(latest?.updated_at || latest?.updatedAt || 0);
const currentDate = new Date(current?.updated_at || current?.updatedAt || 0); const currentDate = new Date(current?.updated_at || current?.updatedAt || 0);
@ -162,25 +159,25 @@ export class QueueMonitoringController {
(queueMonitoring as any).currentQueue = latestOnGoing (queueMonitoring as any).currentQueue = latestOnGoing
? { ? {
room: roomIdToRoomObj[latestOnGoing.roomId]?.room || null, room: roomIdToRoomObj[latestOnGoing.roomId]?.room || null,
id: latestOnGoing.id, id: latestOnGoing.id,
qeue_number: latestOnGoing.qeue_number, qeue_number: latestOnGoing.qeue_number,
registration_status: latestOnGoing.registration_status, registration_status: latestOnGoing.registration_status,
fullname_patient: latestOnGoing.fullname_patient, fullname_patient: latestOnGoing.fullname_patient,
} }
: null; : null;
} catch (queryError: any) { } catch (queryError: any) {
log.warn(`Failed to fetch queue data from emr.emr_registration_outpatient: ${queryError.message}`); log.warn(`Failed to fetch queue data from emr.emr_registration_outpatient: ${queryError.message}`);
queueMonitoring.rooms = queueMonitoring.rooms.map((room: any) => ({ queueMonitoring.rooms = queueMonitoring.rooms.map((room: any) => ({
...room, ...room,
queues: [] queues: [],
})); }));
(queueMonitoring as any).currentQueue = null; (queueMonitoring as any).currentQueue = null;
} }
} }
const responseData = { const responseData = {
...queueMonitoring ...queueMonitoring,
}; };
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, responseData); return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, responseData);
@ -209,24 +206,29 @@ export class QueueMonitoringController {
let param: any = await schema.validateAsync(req.body); let param: any = await schema.validateAsync(req.body);
let rooms: any[] = [];
if (param.room_ids && param.room_ids.length > 0) {
for (const roomId of param.room_ids) {
const room = await RoomModel.list({ id: roomId }).then((q) => q.getOne());
if (!room) throw { message: `Room with id ${roomId} not found` };
rooms.push(room);
}
}
let queueMonitoring = new QueueMonitoring(); let queueMonitoring = new QueueMonitoring();
queueMonitoring.slug = param.slug; queueMonitoring.slug = param.slug;
queueMonitoring.name = param.name; queueMonitoring.name = param.name;
queueMonitoring.rooms = rooms;
queueMonitoring.status = param.status; queueMonitoring.status = param.status;
queueMonitoring.created_by = req.auth.data.name; queueMonitoring.created_by = req.auth.data.name;
queueMonitoring.updated_by = req.auth.data.name; queueMonitoring.updated_by = req.auth.data.name;
await queryRunner.manager.save(queueMonitoring); await queryRunner.manager.save(queueMonitoring);
if (param.room_ids && param.room_ids.length > 0) {
for (const roomId of param.room_ids) {
const room = await RoomModel.list({ id: roomId }).then((q) => q.getOne());
if (!room) throw { message: `Room with id ${roomId} not found` };
let queueMonitoringRooms = new QueueMonitoringRooms();
queueMonitoringRooms.queue_monitoring = queueMonitoring;
queueMonitoringRooms.room = room;
queueMonitoringRooms.status = param.status;
queueMonitoringRooms.created_by = req.auth.data.name;
queueMonitoringRooms.updated_by = req.auth.data.name;
await queryRunner.manager.save(queueMonitoringRooms);
}
}
await queryRunner.commitTransaction(); await queryRunner.commitTransaction();
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, queueMonitoring); return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, queueMonitoring);
@ -253,8 +255,7 @@ export class QueueMonitoringController {
let param: any = await schema.validateAsync(req.params); let param: any = await schema.validateAsync(req.params);
let queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.id": param.id }) let queueMonitoring = await QueueMonitoringModel.list({ "QueueMonitoring.id": param.id }).then((q) => q.leftJoinAndSelect("QueueMonitoring.rooms", "rooms").leftJoinAndSelect("rooms.department", "department").getOne());
.then((q) => q.leftJoinAndSelect("QueueMonitoring.rooms", "rooms").leftJoinAndSelect("rooms.department", "department").getOne());
if (!queueMonitoring) throw { message: "Queue Monitoring Not Found" }; if (!queueMonitoring) throw { message: "Queue Monitoring Not Found" };

View File

@ -1,70 +1,107 @@
import config from 'config'; import config from "config";
import { DataSource } from "typeorm"; import { DataSource } from "typeorm";
import { ILogObj, Logger } from 'tslog'; import { ILogObj, Logger } from "tslog";
import { ResponsiblePartyConsent,Province,City,Subdistrict,Ward, RefferalHospital,RegistrationFee,FareType, RoomStock, Administrativu, Aldeia, District, Menu, Munisipo, Suco, Application, Nationality, Diagnosis, DiagnosticProcedure, Room, ServiceType, ServiceClass, Service, ServiceFare, ServicePackage, Department, DoctorSchedule, MeasurementUnit, ReferenceRange, QueueMonitoring, ExaminationDetail, ExaminationType, User, UserRole, HrmsEmployee, HrmsDepartment, HrmsPosition, HrmsShift, HospitalInformation, ItemOrigin, ItemType, ItemTypeDetail, Unit, ItemCategory, ItemStatus, UsageInstructions, UsageTime, ItemClass, ItemClassDetail, GenericName, Factory, Supplier, FactoryToSupplier, ItemMaster, ItemGroup, PharmacyInfo, ItemPrice, SellingPricePercentage, PatientGroup, PatientGuarantor, InitialStock, DoctorItem, DoctorItemPackage, UserToRoom, RoomToPharmacy, PlanningVerificator, ScheduleSeries, ScheduleException, CardType, PaymentMethod } from 'entity' import { ResponsiblePartyConsent, Province, City, Subdistrict, Ward, RefferalHospital, RegistrationFee, FareType, RoomStock, Administrativu, Aldeia, District, Menu, Munisipo, Suco, Application, Nationality, Diagnosis, DiagnosticProcedure, Room, ServiceType, ServiceClass, Service, ServiceFare, ServicePackage, Department, DoctorSchedule, MeasurementUnit, ReferenceRange, QueueMonitoring, QueueMonitoringRooms, ExaminationDetail, ExaminationType, User, UserRole, HrmsEmployee, HrmsDepartment, HrmsPosition, HrmsShift, HospitalInformation, ItemOrigin, ItemType, ItemTypeDetail, Unit, ItemCategory, ItemStatus, UsageInstructions, UsageTime, ItemClass, ItemClassDetail, GenericName, Factory, Supplier, FactoryToSupplier, ItemMaster, ItemGroup, PharmacyInfo, ItemPrice, SellingPricePercentage, PatientGroup, PatientGuarantor, InitialStock, DoctorItem, DoctorItemPackage, UserToRoom, RoomToPharmacy, PlanningVerificator, ScheduleSeries, ScheduleException, CardType, PaymentMethod } from "entity";
export class OrmHelper { export class OrmHelper {
static DB: DataSource = null static DB: DataSource = null;
static setup() { static setup() {
const log: Logger<ILogObj> = new Logger({ name: '[OrmHelper]', type: 'pretty' }); const log: Logger<ILogObj> = new Logger({ name: "[OrmHelper]", type: "pretty" });
const engine: 'mysql' | 'postgres' = config.get("database.engine") const engine: "mysql" | "postgres" = config.get("database.engine");
OrmHelper.DB = new DataSource({ OrmHelper.DB = new DataSource({
type: engine, type: engine,
host: config.get("database.host"), host: config.get("database.host"),
port: Number(config.get("database.port")), port: Number(config.get("database.port")),
username: String(config.get("database.username")), username: String(config.get("database.username")),
password: String(config.get("database.password")), password: String(config.get("database.password")),
database: String(config.get("database.database")), database: String(config.get("database.database")),
synchronize: true, synchronize: true,
logging: config.get('database.logging'), logging: config.get("database.logging"),
entities: [Menu, Administrativu, Aldeia, District, Munisipo, Suco, Application, Nationality, Diagnosis, DiagnosticProcedure, Room, ServiceType, ServiceClass, Service, ServiceFare, ServicePackage, Department, DoctorSchedule, MeasurementUnit, ReferenceRange, QueueMonitoring, ExaminationDetail, ExaminationType, User, UserRole, HrmsEmployee, HrmsDepartment, HrmsPosition, HrmsShift, HospitalInformation, ItemGroup, entities: [
ItemOrigin, //
ItemType, Menu,
ItemTypeDetail, Administrativu,
Unit, Aldeia,
ItemCategory, District,
ItemStatus, Munisipo,
UsageInstructions, Suco,
UsageTime, Application,
ItemClass, Nationality,
ItemClassDetail, Diagnosis,
GenericName, DiagnosticProcedure,
Factory, Room,
Supplier, ServiceType,
FactoryToSupplier, ServiceClass,
ItemMaster, Service,
PharmacyInfo, ServiceFare,
ItemPrice, ServicePackage,
SellingPricePercentage, Department,
PatientGroup, DoctorSchedule,
PatientGuarantor, MeasurementUnit,
InitialStock, ReferenceRange,
DoctorItem, QueueMonitoring,
DoctorItemPackage, QueueMonitoringRooms,
UserToRoom, ExaminationDetail,
RoomToPharmacy, ExaminationType,
PlanningVerificator, User,
RoomStock, UserRole,
ScheduleSeries, HrmsEmployee,
ScheduleException, HrmsDepartment,
FareType, HrmsPosition,
CardType, HrmsShift,
PaymentMethod, HospitalInformation,
RegistrationFee, ItemGroup,
RefferalHospital,Province,City,Subdistrict,Ward, ItemOrigin,
ResponsiblePartyConsent ItemType,
], ItemTypeDetail,
subscribers: [], Unit,
migrations: [], ItemCategory,
}) ItemStatus,
UsageInstructions,
UsageTime,
ItemClass,
ItemClassDetail,
GenericName,
Factory,
Supplier,
FactoryToSupplier,
ItemMaster,
PharmacyInfo,
ItemPrice,
SellingPricePercentage,
PatientGroup,
PatientGuarantor,
InitialStock,
DoctorItem,
DoctorItemPackage,
UserToRoom,
RoomToPharmacy,
PlanningVerificator,
RoomStock,
ScheduleSeries,
ScheduleException,
FareType,
CardType,
PaymentMethod,
RegistrationFee,
RefferalHospital,
Province,
City,
Subdistrict,
Ward,
ResponsiblePartyConsent,
],
subscribers: [],
migrations: [],
});
OrmHelper.DB.initialize() OrmHelper.DB.initialize()
.then(() => { .then(() => {
// here you can start to work with your database // here you can start to work with your database
}) })
.catch((error: any) => log.error(error)) .catch((error: any) => log.error(error));
} }
} }