bug fix alur

This commit is contained in:
2026-07-27 12:26:42 +07:00
parent 7d1a3ec976
commit 26774f3e0f
5 changed files with 377 additions and 98 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
PORT=8080
PORT=8088
SATUDATA_HOST=10.10.123.165
SATUDATA_USERNAME=stim
+3 -1
View File
@@ -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
+2 -2
View File
@@ -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)
+369 -94
View File
@@ -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)
}
@@ -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 {