antrian per hari

This commit is contained in:
renaldybrada
2026-02-12 10:43:41 +07:00
parent 99733127d2
commit 1401946ec3
7 changed files with 257 additions and 0 deletions
+61
View File
@@ -206,6 +206,47 @@ const docTemplate = `{
}
}
},
"/dashboard/antrian-per-hari/": {
"get": {
"tags": [
"Dashboard"
],
"summary": "Get Antrian per Hari",
"parameters": [
{
"type": "integer",
"description": "tahun dalam int",
"name": "year",
"in": "query",
"required": true
},
{
"type": "integer",
"description": "bulan dalam int",
"name": "month",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/dashboard.AntrianPerHari"
}
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/shared.BaseErrorResponse"
}
}
}
}
},
"/dashboard/antrian-per-kategori/": {
"get": {
"tags": [
@@ -960,6 +1001,26 @@ const docTemplate = `{
}
}
},
"dashboard.AntrianPerHari": {
"type": "object",
"properties": {
"batal": {
"type": "integer"
},
"belum": {
"type": "integer"
},
"selesai": {
"type": "integer"
},
"tanggalDaftar": {
"type": "string"
},
"tunda": {
"type": "integer"
}
}
},
"dashboard.AntrianPerKategori": {
"type": "object",
"properties": {
+61
View File
@@ -200,6 +200,47 @@
}
}
},
"/dashboard/antrian-per-hari/": {
"get": {
"tags": [
"Dashboard"
],
"summary": "Get Antrian per Hari",
"parameters": [
{
"type": "integer",
"description": "tahun dalam int",
"name": "year",
"in": "query",
"required": true
},
{
"type": "integer",
"description": "bulan dalam int",
"name": "month",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/dashboard.AntrianPerHari"
}
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/shared.BaseErrorResponse"
}
}
}
}
},
"/dashboard/antrian-per-kategori/": {
"get": {
"tags": [
@@ -954,6 +995,26 @@
}
}
},
"dashboard.AntrianPerHari": {
"type": "object",
"properties": {
"batal": {
"type": "integer"
},
"belum": {
"type": "integer"
},
"selesai": {
"type": "integer"
},
"tanggalDaftar": {
"type": "string"
},
"tunda": {
"type": "integer"
}
}
},
"dashboard.AntrianPerKategori": {
"type": "object",
"properties": {
+40
View File
@@ -195,6 +195,19 @@ definitions:
- tindakan
- tindakanTambahan
type: object
dashboard.AntrianPerHari:
properties:
batal:
type: integer
belum:
type: integer
selesai:
type: integer
tanggalDaftar:
type: string
tunda:
type: integer
type: object
dashboard.AntrianPerKategori:
properties:
id_kategori:
@@ -538,6 +551,33 @@ paths:
summary: Update Status Antrian Operasi
tags:
- Antrian Operasi
/dashboard/antrian-per-hari/:
get:
parameters:
- description: tahun dalam int
in: query
name: year
required: true
type: integer
- description: bulan dalam int
in: query
name: month
required: true
type: integer
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/dashboard.AntrianPerHari'
type: array
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/shared.BaseErrorResponse'
summary: Get Antrian per Hari
tags:
- Dashboard
/dashboard/antrian-per-kategori/:
get:
responses:
+41
View File
@@ -146,6 +146,47 @@ func (h DashboardHandler) GetPerbandinganKategoriAntrean(c *gin.Context) {
c.JSON(http.StatusOK, response)
}
// GetAntrianPerHari godoc
// @Summary Get Antrian per Hari
// @Tags Dashboard
// @Param year query int true "tahun dalam int"
// @Param month query int true "bulan dalam int"
// @Success 200 {object} []AntrianPerHari
// @Failure 500 {object} shared.BaseErrorResponse
// @Router /dashboard/antrian-per-hari/ [get]
func (h DashboardHandler) GetAntrianPerHari(c *gin.Context) {
var req PeriodeDashboardRequest
if err := c.ShouldBindQuery(&req); err != nil {
c.JSON(400, shared.BaseErrorResponse{
Success: false,
Code: 400,
Message: "error bind json",
Errors: shared.ValidationError(err),
})
return
}
data, err := h.repo.GetAntrianPerHari(c, req)
if err != nil {
errorResponse := baseResponse.BaseErrorResponse{
Success: false,
Code: 500,
Message: err.Error(),
}
c.JSON(http.StatusInternalServerError, errorResponse)
return
}
response := baseResponse.ToBaseResponse(
data,
true,
200,
"success get antrean per hari")
c.JSON(http.StatusOK, response)
}
// GetTableAntrianPerSpesialis godoc
// @Summary Get Table Antrian per Spesialis
// @Tags Dashboard
+10
View File
@@ -1,5 +1,7 @@
package dashboard
import "time"
type AntrianPerKategori struct {
IdKategori int `db:"Kategori_operasi" json:"id_kategori"`
Kategori string `db:"Kategori" json:"kategori"`
@@ -44,6 +46,14 @@ type PerbandinganKategoriAntrean struct {
Jumlah int `db:"jumlah" json:"jumlah"`
}
type AntrianPerHari struct {
TanggalDaftar time.Time `db:"tanggal_daftar"`
Belum int `db:"belum"`
Selesai int `db:"selesai"`
Tunda int `db:"tunda"`
Batal int `db:"batal"`
}
type TableAntreanPerSpesialis struct {
Spesialis string `db:"spesialis"`
Total int `db:"total"`
+43
View File
@@ -17,6 +17,7 @@ type IDashboardRepository interface {
GetAntrianPerSpesialis(c *gin.Context) (ListModelAntrianPerSpesialis, error)
GetPerbandinganStatusAntrean(c *gin.Context, req PeriodeDashboardRequest) (ListPerbandinganStatusAntrean, error)
GetPerbandinganKategoriAntrean(c *gin.Context, req PeriodeDashboardRequest) ([]PerbandinganKategoriAntrean, error)
GetAntrianPerHari(c *gin.Context, req PeriodeDashboardRequest) ([]AntrianPerHari, error)
GetTableAntrianPerSpesialis(c *gin.Context, req PeriodeDashboardRequest) ([]TableAntreanPerSpesialis, error)
GetTableAntrianPerSubSpesialis(c *gin.Context, req PeriodeDashboardRequest) ([]TableAntreanPerSubSpesialis, error)
}
@@ -238,6 +239,48 @@ func (r dashboardRepo) GetPerbandinganKategoriAntrean(c *gin.Context, req Period
return result, nil
}
func (r dashboardRepo) GetAntrianPerHari(c *gin.Context, req PeriodeDashboardRequest) ([]AntrianPerHari, error) {
var result []AntrianPerHari
startDate, endDate := GenerateStartEndDate(req)
query := queryUtils.DynamicQuery{
From: TBL_NAME,
Aliases: "dpo",
Fields: []queryUtils.SelectField{
{Expression: "DATE(dpo.\"Tanggal_daftar\")", Alias: "tanggal_daftar"},
{Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('1')) as belum"},
{Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('2')) as selesai"},
{Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('3')) as tunda"},
{Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('4')) as batal"},
},
Filters: []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "dpo.Tanggal_daftar", Operator: queryUtils.OpBetween, Value: []string{startDate, endDate}},
},
},
},
GroupBy: []string{"DATE(dpo.\"Tanggal_daftar\")"},
Sort: []queryUtils.SortField{
{Column: "DATE(dpo.\"Tanggal_daftar\")", Order: "ASC"},
},
}
dbconn, err := r.db.GetSQLXDB(DB_NAME)
if err != nil {
return result, err
}
err = r.queryBuilder.ExecuteQuery(
c, dbconn, query, &result)
if err != nil {
return result, err
}
return result, nil
}
func (r dashboardRepo) GetTableAntrianPerSpesialis(c *gin.Context, req PeriodeDashboardRequest) ([]TableAntreanPerSpesialis, error) {
var result []TableAntreanPerSpesialis
+1
View File
@@ -14,6 +14,7 @@ func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) {
r.GET("/antrian-per-spesialis", dashboardHandler.GetAntrianPerSpesialis)
r.GET("/perbandingan-status-antrian", dashboardHandler.GetPerbandinganStatusAntrean)
r.GET("/perbandingan-kategori-antrian", dashboardHandler.GetPerbandinganKategoriAntrean)
r.GET("/antrian-per-hari", dashboardHandler.GetAntrianPerHari)
r.GET("/table-antrian-per-spesialis", dashboardHandler.GetTableAntrianPerSpesialis)
r.GET("/table-antrian-per-subspesialis", dashboardHandler.GetTableAntrianPerSubSpesialis)
}