From 26774f3e0f41d169aa1878fc7c493d0e4073d49e Mon Sep 17 00:00:00 2001 From: ahdan15 Date: Mon, 27 Jul 2026 12:26:42 +0700 Subject: [PATCH] bug fix alur --- .env | 2 +- internal/server/routes.go | 4 +- pkg/database/simrs/mikrobiologi.go | 4 +- pkg/handlers/mikrobiologi/mikrobiologi.go | 463 ++++++++++++++---- pkg/models/simrs/mikrobiologi/mikrobiologi.go | 2 + 5 files changed, 377 insertions(+), 98 deletions(-) diff --git a/.env b/.env index 92a80e5..80c6bb9 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -PORT=8080 +PORT=8088 SATUDATA_HOST=10.10.123.165 SATUDATA_USERNAME=stim diff --git a/internal/server/routes.go b/internal/server/routes.go index d3e3941..b069ca4 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -1,9 +1,10 @@ package server import ( + "net/http" + swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "net/http" "github.com/gin-gonic/gin" @@ -24,6 +25,7 @@ func (s *Server) RegisterRoutes() http.Handler { mikrobiologi := v1.Group("/mikrobiologi") { mikrobiologi.POST("/sendmikro", mikrobiologiHandler.SendDataLISMikro) + mikrobiologi.POST("/previewmikro", mikrobiologiHandler.PreviewDataLISMikro) mikrobiologi.POST("/ekstrakhasil", mikrobiologiHandler.EkstrakHasil) } return r diff --git a/pkg/database/simrs/mikrobiologi.go b/pkg/database/simrs/mikrobiologi.go index b5d5a72..eb06a96 100644 --- a/pkg/database/simrs/mikrobiologi.go +++ b/pkg/database/simrs/mikrobiologi.go @@ -79,10 +79,10 @@ func (s *DatabaseService) GetKetPengirim(idxDaftar string) string { func (s *DatabaseService) GetDataLabMikro(noLab string) ([]*mikrobiologi.OrderLabMikro, bool, error) { var dataMikro []*mikrobiologi.OrderLabMikro - querySelect := `select olm."idxordermikro", olm."jenis_pemeriksaan", fl."nama_field" , fl."jenis_kelompok",fl."kode_tarif",olm."tglorder" + querySelect := `select olm."idxordermikro", olm."jenis_pemeriksaan", fl."nama_field" , fl."jenis_kelompok", fl."sub_kelompok", fl."kode_tarif", olm."tglorder", olm."keterangan" from t_orderlabmikro olm left join "m_form_lab" fl on olm."idxform" = fl."form_id" - where olm."nolab" = ? and fl."sub_kelompok" = 'Jenis Pemeriksaan'` + where olm."nolab" = ?` errSelect := s.DB.Debug().Raw(querySelect, noLab).Scan(&dataMikro).Error if errSelect != nil { log.Println(errSelect) diff --git a/pkg/handlers/mikrobiologi/mikrobiologi.go b/pkg/handlers/mikrobiologi/mikrobiologi.go index 2abfb02..bd76f7b 100644 --- a/pkg/handlers/mikrobiologi/mikrobiologi.go +++ b/pkg/handlers/mikrobiologi/mikrobiologi.go @@ -7,11 +7,83 @@ import ( "api-lis/pkg/models/simrs/pasien" "log" "net/http" + "strings" "time" "github.com/gin-gonic/gin" ) +type DetailPemeriksaan struct { + IdxOrderMikro string + NamaPemeriksaan string + TanggalOrderLab string +} + +type KelompokPemeriksaan struct { + JenisKelompok string + Spesimen string + CaraPengambilan string + ListPemeriksaan []DetailPemeriksaan +} + +// CheckKeterangan digunakan untuk mengecek apakah keterangan terisi dan perlu digunakan +func CheckKeterangan(item *mikrobiologi.OrderLabMikro) string { + namaField := strings.TrimSpace(item.NamaField) + keterangan := strings.TrimSpace(item.Keterangan) + + // Jika keterangan terisi + if keterangan != "" { + if namaField != "" { + // Gabungkan nama_field dan keterangan dengan spasi + return namaField + " " + keterangan + } + // Jika namaField kosong, gunakan keterangan saja + return keterangan + } + + // Jika tidak ada keterangan, kembalikan namaField saja + return namaField +} + +// GroupDataLabMikro mengelompokkan data gelondongan berdasarkan jenis_kelompok +func GroupDataLabMikro(data []*mikrobiologi.OrderLabMikro) map[string]*KelompokPemeriksaan { + grouped := make(map[string]*KelompokPemeriksaan) + + for _, item := range data { + jk := item.JenisKelompok + if jk == "" { + jk = "Tanpa Kelompok" // fallback + } + + if grouped[jk] == nil { + grouped[jk] = &KelompokPemeriksaan{ + JenisKelompok: jk, + Spesimen: "-", // default + CaraPengambilan: "lain-lain", // default + } + } + + // Ambil nilai yang sebenarnya sesuai pengecekan Keterangan + nilai := CheckKeterangan(item) + + // Masukkan ke struct sesuai sub_kelompok + switch item.SubKelompok { + case "Jenis Pemeriksaan": + grouped[jk].ListPemeriksaan = append(grouped[jk].ListPemeriksaan, DetailPemeriksaan{ + IdxOrderMikro: item.IdxOrderMikro, + NamaPemeriksaan: nilai, + TanggalOrderLab: item.TangggalOrderLab, + }) + case "Jenis Spesimen": + grouped[jk].Spesimen = nilai + case "Cara Pengambilan Sampel": + grouped[jk].CaraPengambilan = nilai + } + } + + return grouped +} + // SendDataLISMikro godoc // @Summary Send Data LIS Mikro // @Description Send Data LIS Mikro @@ -88,20 +160,6 @@ func SendDataLISMikro(c *gin.Context) { }) continue } - var specimenData *mikrobiologi.OrderLabMikroSpecimen - var errSpecimen error - specimenData, _, errSpecimen = simrsDB.GetDataLabMikroSpecimen(dataMikroMain.NoLab) - if errSpecimen != nil { - log.Println("Warning: error get Specimen:", errSpecimen) - } - - var caraPengambilanData *mikrobiologi.OrderLabMikroJenisPemeriksaan - var errPengambilan error - caraPengambilanData, _, errPengambilan = simrsDB.GetDataLabMikroJenisPemeriksaan(dataMikroMain.NoLab) - if errPengambilan != nil { - log.Println("Warning: error get CaraPengambilan:", errPengambilan) - } - if !exist { log.Println("Data bukan pemeriksaan") continue @@ -192,98 +250,92 @@ func SendDataLISMikro(c *gin.Context) { return } log.Println("Akan masuk loop dataLabMikro...") - for _, value := range dataLabMikro { - t, err := time.Parse(time.RFC3339, value.TangggalOrderLab) - if err != nil { - log.Printf("Error parsing date: %v", err) + groupedData := GroupDataLabMikro(dataLabMikro) + + for jk, group := range groupedData { + if len(group.ListPemeriksaan) == 0 { continue } - tglString := t.Format("2006-01-02") + for _, value := range group.ListPemeriksaan { + t, err := time.Parse(time.RFC3339, value.TanggalOrderLab) + if err != nil { + log.Printf("Error parsing date: %v", err) + continue + } - var namaSpecimen string - if specimenData != nil && specimenData.NamaField != "" { - namaSpecimen = specimenData.NamaField - } else { - namaSpecimen = "-" - } + tglString := t.Format("2006-01-02") - var pengambilan string - if caraPengambilanData != nil && caraPengambilanData.NamaField != "" { - pengambilan = caraPengambilanData.NamaField - } else { - pengambilan = "lain-lain" - } + log.Println("Masuk loop pemeriksaan:", value) + dataLisMikro = &mikrobiologi.RequestLISMikro{ + TanggalReg: tglReg, + TanggalSampel: tglString, + NomorLab: dataMikroMain.NoLab, + NoRM: dataMikroMain.NoMR, + Nama: dataPasien.Nama, + Alamat: dataPasien.Alamat, + Kota: dataPasien.Tempat, + TanggalLahir: tglLahirString, + NoHP: dataPasien.NoTelpon, + Kelamin: dataPasien.JenisKelamin, + NIK: dataPasien.NoKTP, + NoBPJS: dataPasien.NoKartu, + DokterPeminta: dokterPengirim, + AsalPasien: poli.NamaPoli, + StatusBayar: "", + JenisPembayaran: caraBayar, + JenisKunjungan: jenisKunjungan, + Diagnosa: diagnosa, + Rujukan: rujukan, + KodeSpesimen: jk, + NamaSpesimen: group.Spesimen, + Pengambilan: group.CaraPengambilan, + JenisPemeriksaan: value.NamaPemeriksaan, + AsalPengirim: KeteranganPengirim, + } - log.Println("Masuk loop, value:", value) - dataLisMikro = &mikrobiologi.RequestLISMikro{ - TanggalReg: tglReg, - TanggalSampel: tglString, - NomorLab: dataMikroMain.NoLab, - NoRM: dataMikroMain.NoMR, - Nama: dataPasien.Nama, - Alamat: dataPasien.Alamat, - Kota: dataPasien.Tempat, - TanggalLahir: tglLahirString, - NoHP: dataPasien.NoTelpon, - Kelamin: dataPasien.JenisKelamin, - NIK: dataPasien.NoKTP, - NoBPJS: dataPasien.NoKartu, - DokterPeminta: dokterPengirim, - AsalPasien: poli.NamaPoli, - StatusBayar: "", - JenisPembayaran: caraBayar, - JenisKunjungan: jenisKunjungan, - Diagnosa: diagnosa, - Rujukan: rujukan, - KodeSpesimen: value.JenisKelompok, - NamaSpesimen: namaSpecimen, - Pengambilan: pengambilan, - JenisPemeriksaan: value.NamaField, - AsalPengirim: KeteranganPengirim, - } + log.Println("Sebelum masuk LIS", dataLisMikro) - log.Println("Sebelum masuk LIS", dataLisMikro) + resMikro, errMikro := SendLisMikro(dataLisMikro) + if errMikro != nil { + log.Println(errMikro) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errMikro.Error(), + }) + return + } + if resMikro.Status == "203" { + log.Println(resMikro) + c.JSON(http.StatusBadRequest, gin.H{ + "message": resMikro.Message, + }) + return + } - resMikro, errMikro := SendLisMikro(dataLisMikro) - if errMikro != nil { - log.Println(errMikro) - c.JSON(http.StatusBadRequest, gin.H{ - "message": errMikro.Error(), - }) - return - } - if resMikro.Status == "203" { log.Println(resMikro) - c.JSON(http.StatusBadRequest, gin.H{ - "message": resMikro.Message, + + reqUpdate := &mikrobiologi.ReqUpdateLisMikro{ + IdxOrderMikro: value.IdxOrderMikro, + NoLokal: resMikro.Message, + Kode: value.NamaPemeriksaan, + Spesimen: group.Spesimen, + } + errUpdate := simrsDB.UpdateLabMikro(reqUpdate) + if errUpdate != nil { + log.Println(errUpdate) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errUpdate, + }) + return + } + + responseMikro = append(responseMikro, &mikrobiologi.ResponseLISMikro{ + NoLab: dataMikroMain.NoLab, + Status: resMikro.Status, + Message: resMikro.Message, }) - return } - - log.Println(resMikro) - - reqUpdate := &mikrobiologi.ReqUpdateLisMikro{ - IdxOrderMikro: value.IdxOrderMikro, - NoLokal: resMikro.Message, - Kode: value.NamaField, - Spesimen: namaSpecimen, - } - errUpdate := simrsDB.UpdateLabMikro(reqUpdate) - if errUpdate != nil { - log.Println(errUpdate) - c.JSON(http.StatusBadRequest, gin.H{ - "message": errUpdate, - }) - return - } - - responseMikro = append(responseMikro, &mikrobiologi.ResponseLISMikro{ - NoLab: dataMikroMain.NoLab, - Status: resMikro.Status, - Message: resMikro.Message, - }) } } @@ -324,3 +376,226 @@ func EkstrakHasil(c *gin.Context) { //log.Println(resEkstrakHasil) c.JSON(http.StatusOK, resEkstrakHasil) } + +// PreviewDataLISMikro godoc +// @Summary Preview Data LIS Mikro +// @Description Preview Data LIS Mikro tanpa dikirim +// @Tags LIS Mikro +// @Accept json +// @Produce json +// @Param request body mikrobiologi.RequestPasienMikrobiologi true "Pasien Mikrobiologi request" +// @Success 200 {array} mikrobiologi.RequestLISMikro +// @Failure 400 "Bad request" +// @Router /mikrobiologi/previewmikro [post] +func PreviewDataLISMikro(c *gin.Context) { + db := database.New().GetDB("simrs") + if db == nil { + log.Println("DB nil") + c.JSON(500, gin.H{"message": "DB nil"}) + return + } + simrsDB := simrs.NewDatabaseService(db) + var req *mikrobiologi.RequestPasienMikrobiologi + + err := c.Bind(&req) + if err != nil { + log.Println(err) + c.JSON(http.StatusBadRequest, gin.H{ + "message": err, + }) + return + } + + log.Println("REQUEST dari frontend (preview):", req) + + dataMikro, errData := simrsDB.GetDataMikroBiologiByNoMR(req) + if errData != nil { + log.Println(errData) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errData, + }) + return + } + + var dataPasien *pasien.MPasien + dataPasien, err = simrsDB.GetMPasien(req) + if err != nil { + log.Println() + dataPasien, err = simrsDB.GetPasienAPS(req) + if err != nil { + c.JSON(500, gin.H{ + "code": 500, + "message": err, + }) + return + } + } + + tglLahir, errParse := time.Parse(time.RFC3339, dataPasien.TanggalLahir) + if errParse != nil { + log.Println(errParse) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errParse, + }) + return + } + + var responseMikro []*mikrobiologi.RequestLISMikro + var dataLisMikro *mikrobiologi.RequestLISMikro + + tglLahirString := tglLahir.Format("2006-01-02") + for _, dataMikroMain := range dataMikro { + dataLabMikro, exist, errDiagnosa := simrsDB.GetDataLabMikro(dataMikroMain.NoLab) + if errDiagnosa != nil { + log.Println(errDiagnosa) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errDiagnosa, + }) + continue + } + if !exist { + log.Println("Data bukan pemeriksaan") + continue + } + + poli, errDokter := simrsDB.GetNamaRuang(dataMikroMain.KodePoli) + if errDokter != nil { + log.Println(errDokter) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errDokter, + }) + return + } + + KeteranganPengirim := simrsDB.GetKetPengirim(dataMikroMain.IdxDaftar) + + caraBayar, errCaraBayar := simrsDB.GetCaraBayar(dataMikroMain) + if errCaraBayar != nil { + log.Println(errCaraBayar) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errCaraBayar, + }) + return + } + + diagnosa, errDiagnosa := simrsDB.GetDiagnosa(dataMikroMain.IdxDaftar) + if errDiagnosa != nil { + log.Println(errDiagnosa) + c.JSON(http.StatusBadRequest, gin.H{ + "message": errDiagnosa, + }) + } + + var dokterPengirim string + + if dataMikroMain.DrOrder != "0" && dataMikroMain.DrOrder != "" { + dokterPengirim, errDokter = simrsDB.GetNamaDokter(dataMikroMain.DrOrder) + if errDokter != nil { + log.Println("Failed to get dokter from DrOrder:", errDokter) + dokterPengirim = "" + } + } + if dokterPengirim == "" && dataMikroMain.DokterPengirim != "" && dataMikroMain.DokterPengirim != "0" { + dokterPengirim, errDokter = simrsDB.GetNamaDokter(dataMikroMain.DokterPengirim) + if errDokter != nil { + log.Println("Failed to get dokter from DokterPengirim:", errDokter) + dokterPengirim = "" + } + } + + if dokterPengirim == "" && dataMikroMain.DokterLab1 != "0" && dataMikroMain.DokterLab1 != "" { + dokterPengirim, errDokter = simrsDB.GetNamaDokter(dataMikroMain.DokterLab1) + if errDokter != nil { + log.Println("Failed to get dokter from DokterLab1:", errDokter) + dokterPengirim = "" + } + } + + if dokterPengirim == "" && dataMikroMain.Pengirim != "" && dataMikroMain.Pengirim != "0" { + dokterPengirim = dataMikroMain.Pengirim + } + + var tglReg string + + if dataMikroMain.StatusRajal == "1" { + tglReg, err = simrsDB.GetTglRegPendaftaran(dataMikroMain.IdxDaftar) + if err != nil { + log.Println(err) + c.JSON(http.StatusBadRequest, gin.H{"message": err}) + return + } + } else if dataMikroMain.StatusRajal == "0" { + tglReg, err = simrsDB.GetTglMasukRS(dataMikroMain.IdxDaftar) + if err != nil { + log.Println(err) + c.JSON(http.StatusBadRequest, gin.H{"message": err}) + return + } + } + + rujukan, jenisKunjungan, errRujukan := simrsDB.GetKetRujukan(dataMikroMain.NoMR) + if errRujukan != nil { + log.Println(errRujukan) + c.JSON(http.StatusBadRequest, gin.H{"message": errRujukan}) + return + } + + groupedData := GroupDataLabMikro(dataLabMikro) + + for jk, group := range groupedData { + if len(group.ListPemeriksaan) == 0 { + continue + } + + for _, value := range group.ListPemeriksaan { + t, err := time.Parse(time.RFC3339, value.TanggalOrderLab) + if err != nil { + log.Printf("Error parsing date: %v", err) + continue + } + + tglString := t.Format("2006-01-02") + + dataLisMikro = &mikrobiologi.RequestLISMikro{ + TanggalReg: tglReg, + TanggalSampel: tglString, + NomorLab: dataMikroMain.NoLab, + NoRM: dataMikroMain.NoMR, + Nama: dataPasien.Nama, + Alamat: dataPasien.Alamat, + Kota: dataPasien.Tempat, + TanggalLahir: tglLahirString, + NoHP: dataPasien.NoTelpon, + Kelamin: dataPasien.JenisKelamin, + NIK: dataPasien.NoKTP, + NoBPJS: dataPasien.NoKartu, + DokterPeminta: dokterPengirim, + AsalPasien: poli.NamaPoli, + StatusBayar: "", + JenisPembayaran: caraBayar, + JenisKunjungan: jenisKunjungan, + Diagnosa: diagnosa, + Rujukan: rujukan, + KodeSpesimen: jk, + NamaSpesimen: group.Spesimen, + Pengambilan: group.CaraPengambilan, + JenisPemeriksaan: value.NamaPemeriksaan, + AsalPengirim: KeteranganPengirim, + } + + responseMikro = append(responseMikro, dataLisMikro) + } + } + } + + if len(responseMikro) == 0 { + log.Println("Tidak ada data lab mikro yang diproses") + c.JSON(http.StatusCreated, gin.H{ + "message": "Tidak ada data pemeriksaan mikrobiologi ditemukan", + "data": []interface{}{}, + }) + return + } + log.Println("RESPONSE (preview)", responseMikro) + c.JSON(http.StatusOK, responseMikro) +} diff --git a/pkg/models/simrs/mikrobiologi/mikrobiologi.go b/pkg/models/simrs/mikrobiologi/mikrobiologi.go index 968598d..5cb2c7d 100644 --- a/pkg/models/simrs/mikrobiologi/mikrobiologi.go +++ b/pkg/models/simrs/mikrobiologi/mikrobiologi.go @@ -140,8 +140,10 @@ type OrderLabMikro struct { NamaPemeriksaan string `gorm:"column:nama_pemeriksaan" json:"nama_pemeriksaan"` NamaField string `gorm:"column:nama_field" json:"nama_field"` JenisKelompok string `gorm:"column:jenis_kelompok" json:"jenis_kelompok"` + SubKelompok string `gorm:"column:sub_kelompok" json:"sub_kelompok"` KodeTarif string `gorm:"column:kode_tarif" json:"kode_tarif"` TangggalOrderLab string `gorm:"column:tglorder" json:"tglorder"` + Keterangan string `gorm:"column:keterangan" json:"keterangan"` } type OrderLabMikroSpecimen struct {