update service fare
This commit is contained in:
@ -1,14 +1,84 @@
|
|||||||
|
// import config from 'config';
|
||||||
|
// import { DataSource } from "typeorm";
|
||||||
|
// import { ILogObj, Logger } from 'tslog';
|
||||||
|
// import { 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'
|
||||||
|
|
||||||
|
// export class OrmHelper {
|
||||||
|
// static DB: DataSource = null
|
||||||
|
|
||||||
|
// static setup() {
|
||||||
|
// const log: Logger<ILogObj> = new Logger({ name: '[OrmHelper]', type: 'pretty' });
|
||||||
|
|
||||||
|
// const engine: 'mysql' | 'postgres' = config.get("database.engine")
|
||||||
|
|
||||||
|
// OrmHelper.DB = new DataSource({
|
||||||
|
// type: engine,
|
||||||
|
// host: config.get("database.host"),
|
||||||
|
// port: Number(config.get("database.port")),
|
||||||
|
// username: String(config.get("database.username")),
|
||||||
|
// password: String(config.get("database.password")),
|
||||||
|
// database: String(config.get("database.database")),
|
||||||
|
// synchronize: true,
|
||||||
|
// 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,
|
||||||
|
// ItemOrigin,
|
||||||
|
// ItemType,
|
||||||
|
// ItemTypeDetail,
|
||||||
|
// Unit,
|
||||||
|
// 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
|
||||||
|
// ],
|
||||||
|
// subscribers: [],
|
||||||
|
// migrations: [],
|
||||||
|
// })
|
||||||
|
|
||||||
|
// OrmHelper.DB.initialize()
|
||||||
|
// .then(() => {
|
||||||
|
// // here you can start to work with your database
|
||||||
|
// })
|
||||||
|
// .catch((error: any) => log.error(error))
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
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 { 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 { 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'
|
||||||
|
|
||||||
|
const log: Logger<ILogObj> = new Logger({ name: '[OrmHelper]', type: 'pretty' });
|
||||||
|
|
||||||
export class OrmHelper {
|
export class OrmHelper {
|
||||||
static DB: DataSource = null
|
static DB: DataSource = null
|
||||||
|
private static retryDelay = 5000 // 5 detik
|
||||||
|
private static maxRetries = 10
|
||||||
|
|
||||||
static setup() {
|
static setup() {
|
||||||
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({
|
||||||
@ -20,48 +90,65 @@ export class OrmHelper {
|
|||||||
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'),
|
||||||
|
// Tambahan config pool
|
||||||
|
extra: {
|
||||||
|
max: 20,
|
||||||
|
min: 2,
|
||||||
|
idleTimeoutMillis: 30000,
|
||||||
|
connectionTimeoutMillis: 5000,
|
||||||
|
},
|
||||||
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: [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,
|
||||||
ItemOrigin,
|
ItemOrigin, ItemType, ItemTypeDetail, Unit, 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
|
||||||
ItemType,
|
|
||||||
ItemTypeDetail,
|
|
||||||
Unit,
|
|
||||||
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
|
|
||||||
],
|
],
|
||||||
subscribers: [],
|
subscribers: [],
|
||||||
migrations: [],
|
migrations: [],
|
||||||
})
|
})
|
||||||
|
|
||||||
OrmHelper.DB.initialize()
|
OrmHelper.initialize()
|
||||||
.then(() => {
|
}
|
||||||
// here you can start to work with your database
|
|
||||||
})
|
static async initialize(retryCount = 0) {
|
||||||
.catch((error: any) => log.error(error))
|
try {
|
||||||
|
// Kalau sebelumnya sudah connect, destroy dulu
|
||||||
|
if (OrmHelper.DB.isInitialized) {
|
||||||
|
await OrmHelper.DB.destroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
await OrmHelper.DB.initialize()
|
||||||
|
log.info("Database connected successfully")
|
||||||
|
|
||||||
|
// Monitor koneksi — reconnect kalau terputus
|
||||||
|
OrmHelper.monitorConnection()
|
||||||
|
|
||||||
|
} catch (error: any) {
|
||||||
|
log.error(`Database connection failed (attempt ${retryCount + 1}):`, error.message)
|
||||||
|
|
||||||
|
if (retryCount < OrmHelper.maxRetries) {
|
||||||
|
log.info(`Retrying in ${OrmHelper.retryDelay / 1000}s...`)
|
||||||
|
setTimeout(() => OrmHelper.initialize(retryCount + 1), OrmHelper.retryDelay)
|
||||||
|
} else {
|
||||||
|
log.error("Max retries reached. Could not connect to database.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static monitorConnection() {
|
||||||
|
// Cek koneksi setiap 30 detik
|
||||||
|
setInterval(async () => {
|
||||||
|
try {
|
||||||
|
if (!OrmHelper.DB.isInitialized) {
|
||||||
|
log.warn("Database connection lost, reconnecting...")
|
||||||
|
await OrmHelper.initialize()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ping DB untuk validasi koneksi masih hidup
|
||||||
|
await OrmHelper.DB.query("SELECT 1")
|
||||||
|
|
||||||
|
} catch (error: any) {
|
||||||
|
log.warn("Database ping failed, reconnecting...", error.message)
|
||||||
|
await OrmHelper.initialize()
|
||||||
|
}
|
||||||
|
}, 30000) // setiap 30 detik
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user