change nomor urutan method. adjustment create and update status functions

This commit is contained in:
renaldybrada
2026-03-05 13:32:19 +07:00
parent 7185a9381f
commit bf18bf8b68
+260 -4
View File
@@ -97,13 +97,13 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c context.Context, req CreatePa
req.RencanaOperasiData.KategoriOperasi,
req.RencanaOperasiData.RencanaOperasi,
"1",
1, // nomor
0, // nomor
req.RencanaOperasiData.Spesialis,
req.RencanaOperasiData.SubSpesialis,
req.RencanaOperasiData.Keterangan,
req.StatusPasienData.KeteranganStatus,
req.RencanaOperasiData.Spesialis,
req.RencanaOperasiData.SubSpesialis,
0,
0,
},
}
returningCols := []string{
@@ -141,7 +141,8 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c context.Context, q An
return result, err
}
result, err = r.getNumberedListAntrian(c, dbconn, q)
// result, err = r.getNumberedListAntrian(c, dbconn, q)
result, err = r.getNumberedListAntrianV2(c, dbconn, q)
if err != nil {
return result, nil
}
@@ -838,6 +839,7 @@ func (r antrianOperasiRepo) deleteAntrianChildTables(c context.Context, tx *sql.
return nil
}
// this function is unused, soon should be deleted. Change to getNumberedListAntrianV2
func (r antrianOperasiRepo) getNumberedListAntrian(c context.Context, dbconn *sqlx.DB, q AntrianQuery) (ListPasienOperasiPaginate, error) {
var result ListPasienOperasiPaginate
@@ -1052,3 +1054,257 @@ func (r antrianOperasiRepo) getNumberedListAntrian(c context.Context, dbconn *sq
return result, nil
}
func (r antrianOperasiRepo) getNumberedListAntrianV2(c context.Context, dbconn *sqlx.DB, q AntrianQuery) (ListPasienOperasiPaginate, error) {
var result ListPasienOperasiPaginate
// Base Query
baseQuery := queryUtils.DynamicQuery{
From: TBL_NAME,
Aliases: "dpo",
Fields: []queryUtils.SelectField{
{Expression: "dpo.id", Alias: "id"},
{Expression: "dpo.Tanggal_daftar", Alias: "tanggal_daftar"},
{Expression: "dpo.No_KTP", Alias: "no_ktp"},
{Expression: "dpo.No_rekam_medis", Alias: "no_rekam_medis"},
{Expression: "dpo.Nama_pasien", Alias: "nama_pasien"},
{Expression: "dpo.Status_operasi", Alias: "status_operasi"},
{Expression: "dpo.Jenis_kelamin", Alias: "jenis_kelamin"},
{Expression: "ds.Spesialis", Alias: "spesialis"},
{Expression: "dss.Subspesialis", Alias: "subspesialis"},
{Expression: "dko.Kategori", Alias: "kategori"},
{Expression: "dpo.Nomor", Alias: "no_urut_kategori"},
{Expression: "dpo.Nomor_spesialis", Alias: "no_urut_spesialis"},
{Expression: "dpo.Nomor_sub_spesialis", Alias: "no_urut_sub_spesialis"},
},
Joins: []queryUtils.Join{
{
Type: "LEFT",
Table: "daftar_spesialis",
Alias: "ds",
OnConditions: queryUtils.FilterGroup{
Filters: []queryUtils.DynamicFilter{
{
Column: "ds.id", Operator: queryUtils.OpEqual, Value: "dpo.Spesialis",
},
},
},
},
{
Type: "LEFT",
Table: "daftar_subspesialis",
Alias: "dss",
OnConditions: queryUtils.FilterGroup{
Filters: []queryUtils.DynamicFilter{
{
Column: "dpo.Sub_spesialis", Operator: queryUtils.OpEqual, Value: "dss.id",
},
},
},
},
{
Type: "LEFT",
Table: "daftar_kategori_operasi",
Alias: "dko",
OnConditions: queryUtils.FilterGroup{
Filters: []queryUtils.DynamicFilter{
{
Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id",
},
},
},
},
},
}
// Set Condition based on request query
if q.Search != "" {
// search filter
searchFilters := []queryUtils.DynamicFilter{
{Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
{Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
{Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"},
}
baseQuery.Filters = append(baseQuery.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"})
}
var selectFilter []queryUtils.DynamicFilter
typeIdColumn := ""
switch q.Type {
case "kategori":
typeIdColumn = "dpo.Kategori_operasi"
case "spesialis":
typeIdColumn = "dpo.Spesialis"
case "sub-spesialis":
typeIdColumn = "dpo.Sub_spesialis"
}
if q.TypeID != 0 && q.Type != "all" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID})
}
if q.Status != "" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status})
}
if q.Id != "" {
selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.id", Operator: queryUtils.OpEqual, Value: q.Id})
}
// wiring all select filter
baseQuery.Filters = append(baseQuery.Filters, queryUtils.FilterGroup{Filters: selectFilter, LogicOp: "AND"})
// SET SORTING BASE QUERY
if q.SortBy != "" && q.SortOrder != "" {
baseQuery.Sort = append(baseQuery.Sort, queryUtils.SortField{Column: q.SortBy, Order: q.SortOrder})
} else {
baseQuery.Sort = append(baseQuery.Sort, queryUtils.SortField{Column: "dpo.Tanggal_daftar", Order: "ASC"})
}
// execute base query count
if q.Id == "" {
countData, err := r.queryBuilder.ExecuteCount(c, dbconn, baseQuery)
if err != nil {
log.Printf("Unable to execute query count : %s ", err)
return result, err
}
result.Paging.Limit = q.Limit
result.Paging.Offset = q.Offset
result.Paging.Total = int(countData)
result.Paging.CalculatePagingInfo()
}
// execute base query data
queryData := baseQuery
queryData.Limit = q.Limit
queryData.Offset = q.Offset
err := r.queryBuilder.ExecuteQuery(
c, dbconn, queryData, &result.Data)
if err != nil {
log.Printf("Unable to execute query data : %s", err)
return result, err
}
// Map Result Base Query ID, Status = Belum
statusBelumIds := []string{}
for _, row := range result.Data {
if *row.StatusOperasi == "1" {
statusBelumIds = append(statusBelumIds, row.ID)
}
}
// fetch numbered list status = 'Belum'
numberedListBelum, err := r.getNumberedListBelumByIds(c, dbconn, statusBelumIds)
if err != nil {
return result, err
}
// parse numbered list belum into map
numberedListBelumMap := make(map[string]PasienOperasi)
for _, row := range numberedListBelum {
numberedListBelumMap[row.ID] = row
}
// Map no antrian result (status = belum)
for idx := range result.Data {
statusBelum := "1"
statusTunda := "3"
statusBatal := "4"
currentRow := result.Data[idx]
if *currentRow.StatusOperasi == statusBelum {
result.Data[idx].NoUrutKategori = numberedListBelumMap[result.Data[idx].ID].NoUrutKategori
result.Data[idx].NoUrutSpesialis = numberedListBelumMap[result.Data[idx].ID].NoUrutSpesialis
result.Data[idx].NoUrutSubSpesialis = numberedListBelumMap[result.Data[idx].ID].NoUrutSubSpesialis
}
if *currentRow.StatusOperasi == statusTunda || *currentRow.StatusOperasi == statusBatal {
result.Data[idx].NoUrutKategori = 0
result.Data[idx].NoUrutSpesialis = 0
result.Data[idx].NoUrutSubSpesialis = 0
}
}
return result, nil
}
func (r antrianOperasiRepo) getNumberedListBelumByIds(c context.Context, dbconn *sqlx.DB, ids []string) ([]PasienOperasi, error) {
var result []PasienOperasi
if len(ids) == 0 {
return result, nil
}
query := `
WITH numberedStatusBelum AS (
SELECT
dpo.id AS id,
dko.id AS id_kategori,
ds.id AS id_spesialis,
dss.id AS id_subspesialis,
dpo."Tanggal_daftar" AS tanggal_daftar,
dpo."No_KTP" AS no_ktp,
dpo."No_rekam_medis" AS no_rekam_medis,
dpo."Nama_pasien" AS nama_pasien,
dpo."Status_operasi" AS status_operasi,
dpo."Jenis_kelamin" AS jenis_kelamin,
ds."Spesialis" AS spesialis,
dss."Subspesialis" AS subspesialis,
dko."Kategori" AS kategori,
ROW_NUMBER() OVER (
PARTITION BY dpo."Kategori_operasi"
ORDER BY dpo."Tanggal_daftar"
) AS no_urut_kategori,
ROW_NUMBER() OVER (
PARTITION BY dpo."Spesialis"
ORDER BY dpo."Tanggal_daftar", dpo.date_created, dpo.date_updated
) AS no_urut_spesialis,
ROW_NUMBER() OVER (
PARTITION BY dpo."Sub_spesialis"
ORDER BY dpo."Tanggal_daftar", dpo.date_created, dpo.date_updated
) AS no_urut_sub_spesialis
FROM data_pasien_operasi dpo
LEFT JOIN daftar_spesialis ds ON ds.id = dpo."Spesialis"
LEFT JOIN daftar_subspesialis dss ON dpo."Sub_spesialis" = dss.id
LEFT JOIN daftar_kategori_operasi dko ON dpo."Kategori_operasi" = dko.id
WHERE dpo."Status_operasi" = ?
)
SELECT
id,
tanggal_daftar,
no_ktp,
no_rekam_medis,
nama_pasien,
status_operasi,
jenis_kelamin,
spesialis,
subspesialis,
kategori,
no_urut_kategori,
no_urut_spesialis,
no_urut_sub_spesialis
FROM numberedStatusBelum
WHERE id IN (?)
`
query, args, err := sqlx.In(query, "1", ids)
if err != nil {
return nil, err
}
query = dbconn.Rebind(query)
err = dbconn.SelectContext(c, &result, query, args...)
if err != nil {
return nil, err
}
return result, nil
}