From 1c7e223195e05411fd1ff2095083b83650d604df Mon Sep 17 00:00:00 2001 From: adibwp Date: Thu, 27 Jun 2024 15:56:43 +0700 Subject: [PATCH] add chart tab kepesertaan --- .../mcudetail/tabkepesertaan.handlers.go | 106 +++----- models/tabkepesertaan.models.go | 16 ++ .../mcudetail/tabkepesertaan.services.go | 237 +++++++++++++++++- 3 files changed, 286 insertions(+), 73 deletions(-) create mode 100644 models/tabkepesertaan.models.go diff --git a/handlers/corporate/mcudetail/tabkepesertaan.handlers.go b/handlers/corporate/mcudetail/tabkepesertaan.handlers.go index 42b777b..a9a94b4 100644 --- a/handlers/corporate/mcudetail/tabkepesertaan.handlers.go +++ b/handlers/corporate/mcudetail/tabkepesertaan.handlers.go @@ -12,6 +12,9 @@ import ( ) type TabKepersertaanServices interface { + GetTotalKepesertaanMCU(mcuID string) (models.Piechart, error) + GetKepesertaanByGender(mcuID string) (models.Piechart, error) + GetKepesertaanByUmur(mcuID string) (models.Piechart, error) } type TabKepersertaanHandler struct { @@ -28,88 +31,47 @@ func (tkh *TabKepersertaanHandler) HandleShowTabKepesertaan(c echo.Context) erro logger, _ := zap.NewProduction() logger.Info("Tab Kepesertaan") + chTotalPesertaID := utils.GenerateRandomID("totalPesertaID") + chGenderPesertaID := utils.GenerateRandomID("genderPesertaID") + chUmurPesertaID := utils.GenerateRandomID("umurPesertaID") + id := c.Param("id") logger.Info("Params", zap.Any("id", id)) - option := models.Piechart{ - Title: struct { - Text string `json:"text"` - SubText string `json:"subtext"` - Left string `json:"left"` - }{ - Text: "Testing", - SubText: "Total Peserta 560", - Left: "center", - }, - Tooltip: struct { - Trigger string `json:"trigger"` - }{ - Trigger: "item", - }, - Legend: struct { - Top string `json:"top"` - Left string `json:"left"` - Orient string `json:"orient"` - }{ - Top: "bottom", - Left: "center", - Orient: "horizontal", - }, - Series: []models.Series{ - { - Label: struct { - Position string `json:"position"` - Formatter string `json:"formatter"` - }{ - Position: "inner", - Formatter: "{d}%", - }, - Name: "Access From", - Type: "pie", - Radius: []string{"20%", "50%"}, - ItemStyle: struct { - BorderRadius int `json:"borderRadius"` - BorderColor string `json:"borderColor"` - BorderWidth int `json:"borderWidth"` - }{ - BorderRadius: 10, - BorderColor: "#fff", - BorderWidth: 2, - }, - Data: []models.SeriesData{ - {Value: 506, Name: "Sudah MCU : 506 Peserta"}, - {Value: 54, Name: "Belum MCU : 54 Peserta"}, - }, - Emphasis: struct { - ItemStyle struct { - ShadowBlur int `json:"shadowBlur"` - ShadowOffsetX int `json:"shadowOffsetX"` - ShadowColor string `json:"shadowColor"` - } `json:"itemStyle"` - }{ - ItemStyle: struct { - ShadowBlur int `json:"shadowBlur"` - ShadowOffsetX int `json:"shadowOffsetX"` - ShadowColor string `json:"shadowColor"` - }{ - ShadowBlur: 10, - ShadowOffsetX: 0, - ShadowColor: "rgba(0, 0, 0, 0.5)", - }, - }, - }, - }, + peserta, err := tkh.TabKepersertaanServices.GetTotalKepesertaanMCU(id) + if err != nil { + return err } - json, err := json.MarshalIndent(option, "", " ") + gender, err := tkh.TabKepersertaanServices.GetKepesertaanByGender(id) + if err != nil { + return err + } + + umur, err := tkh.TabKepersertaanServices.GetKepesertaanByUmur(id) + if err != nil { + return err + } + + totaljson, err := json.MarshalIndent(peserta, "", " ") + if err != nil { + return err + } + + genderjson, err := json.MarshalIndent(gender, "", " ") + if err != nil { + return err + } + + umurjson, err := json.MarshalIndent(umur, "", " ") if err != nil { return err } content := corporate_mcudetail.TabKepesertaan( - chart.ShowChart("alpha", string(json)), - chart.ShowChart("beta", string(json)), - chart.ShowChart("delta", string(json)), + chart.ShowChart(chTotalPesertaID, string(totaljson)), + chart.ShowChart(chGenderPesertaID, string(genderjson)), + chart.ShowChart(chUmurPesertaID, string(umurjson)), ) return utils.View(c, content) diff --git a/models/tabkepesertaan.models.go b/models/tabkepesertaan.models.go new file mode 100644 index 0000000..3a2047b --- /dev/null +++ b/models/tabkepesertaan.models.go @@ -0,0 +1,16 @@ +package models + +type TotalPesertaModel struct { + Peserta int `db:"peserta"` + Mgm_McuTotalParticipant int `db:"Mgm_McuTotalParticipant"` +} + +type GenderPesertaModel struct { + M_PatientGender string `db:"M_PatientGender"` + Jumlah int `db:"Jumlah"` +} + +type UmurPesertaModel struct { + Umur string `db:"umur"` + Total int `db:"total"` +} diff --git a/services/corporate/mcudetail/tabkepesertaan.services.go b/services/corporate/mcudetail/tabkepesertaan.services.go index d647d15..0ec84a5 100644 --- a/services/corporate/mcudetail/tabkepesertaan.services.go +++ b/services/corporate/mcudetail/tabkepesertaan.services.go @@ -1,6 +1,14 @@ package mcu_corporate_services -import "cpone/db" +import ( + "cpone/db" + "cpone/models" + dbx "cpone/package/database" + "fmt" + "strconv" + + "go.uber.org/zap" +) type TabKepersertaanServices struct { TabKepersertaanServiceStore db.AppStore @@ -11,3 +19,230 @@ func NewTabKepersertaanService(store db.AppStore) *TabKepersertaanServices { TabKepersertaanServiceStore: store, } } + +func (tkp *TabKepersertaanServices) GetPieChartConf(title string, subtext string, data []models.SeriesData) (models.Piechart, error) { + + option := models.Piechart{ + Title: struct { + Text string `json:"text"` + SubText string `json:"subtext"` + Left string `json:"left"` + }{ + Text: title, + SubText: subtext, + Left: "center", + }, + Tooltip: struct { + Trigger string `json:"trigger"` + }{ + Trigger: "item", + }, + Legend: struct { + Top string `json:"top"` + Left string `json:"left"` + Orient string `json:"orient"` + }{ + Top: "bottom", + Left: "center", + Orient: "vertical", + }, + Series: []models.Series{ + { + Label: struct { + Position string `json:"position"` + Formatter string `json:"formatter"` + }{ + Position: "inner", + Formatter: "{d}%", + }, + Name: "Access From", + Type: "pie", + Radius: []string{"20%", "50%"}, + ItemStyle: struct { + BorderRadius int `json:"borderRadius"` + BorderColor string `json:"borderColor"` + BorderWidth int `json:"borderWidth"` + }{ + BorderRadius: 10, + BorderColor: "#fff", + BorderWidth: 2, + }, + Data: data, + Emphasis: struct { + ItemStyle struct { + ShadowBlur int `json:"shadowBlur"` + ShadowOffsetX int `json:"shadowOffsetX"` + ShadowColor string `json:"shadowColor"` + } `json:"itemStyle"` + }{ + ItemStyle: struct { + ShadowBlur int `json:"shadowBlur"` + ShadowOffsetX int `json:"shadowOffsetX"` + ShadowColor string `json:"shadowColor"` + }{ + ShadowBlur: 10, + ShadowOffsetX: 0, + ShadowColor: "rgba(0, 0, 0, 0.5)", + }, + }, + }, + }, + } + + return option, nil +} + +func (tkp *TabKepersertaanServices) GetTotalKepesertaanMCU(mcuID string) (models.Piechart, error) { + logger, _ := zap.NewProduction() + var option models.Piechart + var data models.TotalPesertaModel + + q := ` + SELECT + COUNT(mo.Mcu_OrderID) AS peserta, + mm.Mgm_McuTotalParticipant + FROM mgm_mcu mm + LEFT JOIN t_orderheader toh ON toh.T_OrderHeaderMgm_McuID = mm.Mgm_McuID + AND T_OrderHeaderIsActive = 'Y' + LEFT JOIN mcu_order mo ON mo.Mcu_OrderT_OrderHeaderID = toh.T_OrderHeaderID + WHERE mm.Mgm_McuID = ? AND mm.Mgm_McuIsActive = 'Y' + ` + if err := dbx.Handlex.Get(&data, q, mcuID); err != nil { + return option, fmt.Errorf("error get total participant %v", err) + } + defer logger.Sync() + logger.Info("resp data", zap.Any("data", data)) + + title := "Peserta MCU" + subtext := "Total Peserta " + strconv.Itoa(data.Mgm_McuTotalParticipant) + chartData := []models.SeriesData{} + + if data.Mgm_McuTotalParticipant == 0 { + chartData = append(chartData, models.SeriesData{Value: 0, Name: "No Data"}) + } else { + chartData = []models.SeriesData{ + { + Value: data.Peserta, + Name: "Sudah MCU: " + strconv.Itoa(data.Peserta) + " peserta", + }, + { + Value: data.Mgm_McuTotalParticipant - data.Peserta, + Name: "Belum MCU: " + strconv.Itoa(data.Mgm_McuTotalParticipant-data.Peserta) + " peserta", + }, + } + } + + option, err := tkp.GetPieChartConf(title, subtext, chartData) + if err != nil { + return option, fmt.Errorf("error get piechart total peserta: %v", err) + } + + return option, nil +} + +func (tkp *TabKepersertaanServices) GetKepesertaanByGender(mcuID string) (models.Piechart, error) { + logger, _ := zap.NewProduction() + var option models.Piechart + var data []models.GenderPesertaModel + + title := "Peserta MCU" + subtext := "Berdasarkan jenis kelamin" + chartData := []models.SeriesData{} + + q := ` + SELECT + CASE + WHEN M_PatientGender = 'male' THEN 'Laki-laki' + WHEN M_PatientGender = 'female' THEN 'Perempuan' + ELSE M_PatientGender + END AS M_PatientGender, + COUNT(*) AS Jumlah + FROM mcu_order + JOIN t_orderheader ON Mcu_OrderT_OrderHeaderID = T_OrderHeaderID + AND T_OrderHeaderIsActive = 'Y' + LEFT JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID + AND M_PatientIsActive = 'Y' + WHERE Mcu_OrderMgm_McuID = ? + GROUP BY M_PatientGender + ` + if err := dbx.Handlex.Select(&data, q, mcuID); err != nil { + return option, fmt.Errorf("error get total gender %v", err) + } + defer logger.Sync() + logger.Info("resp data", zap.Any("data", data)) + + if data != nil { + for _, d := range data { + chartData = append(chartData, models.SeriesData{ + Value: d.Jumlah, + Name: d.M_PatientGender + ": " + strconv.Itoa(d.Jumlah) + " Peserta", + }) + } + } else { + chartData = append(chartData, models.SeriesData{Value: 0, Name: "No Data"}) + } + + option, err := tkp.GetPieChartConf(title, subtext, chartData) + if err != nil { + return option, fmt.Errorf("error get piechart total gender: %v", err) + } + + return option, nil +} + +func (tkp *TabKepersertaanServices) GetKepesertaanByUmur(mcuID string) (models.Piechart, error) { + logger, _ := zap.NewProduction() + var option models.Piechart + var data []models.UmurPesertaModel + + title := "Peserta MCU" + subtext := "Berdasarkan umur" + chartData := []models.SeriesData{} + + q := ` + SELECT + CASE + WHEN LEFT(T_OrderHeaderM_PatientAge,2) < '30' then "1. < 30 tahun" + WHEN LEFT(T_OrderHeaderM_PatientAge,2) >= '30' AND LEFT(T_OrderHeaderM_PatientAge,2) < '40' then "2. 30 -< 40 tahun" + WHEN LEFT(T_OrderHeaderM_PatientAge,2) >= '40' AND LEFT(T_OrderHeaderM_PatientAge,2) < '50' then "3. 40 - < 50 tahun" + WHEN LEFT(T_OrderHeaderM_PatientAge,2) >= '50' then "4. > 50 tahun" else "" + END AS umur, + COUNT(Mcu_OrderT_OrderHeaderID) AS total + FROM mcu_order + JOIN t_orderheader ON Mcu_OrderT_OrderHeaderID = T_OrderHeaderID AND T_OrderHeaderIsActive = 'Y' + LEFT JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y' + WHERE Mcu_OrderMgm_McuID = ? + GROUP BY + CASE + WHEN LEFT(T_OrderHeaderM_PatientAge,2) < '30' then "1. < 30 tahun" + WHEN LEFT(T_OrderHeaderM_PatientAge,2) >= '30' AND LEFT(T_OrderHeaderM_PatientAge,2) < '40' then "2. 30 -< 40 tahun" + WHEN LEFT(T_OrderHeaderM_PatientAge,2) >= '40' AND LEFT(T_OrderHeaderM_PatientAge,2) < '50' then "3. 40 - < 50 tahun" + WHEN LEFT(T_OrderHeaderM_PatientAge,2) >= '50' then "4. > 50 tahun" else "" + END + ORDER BY umur + ` + + if err := dbx.Handlex.Select(&data, q, mcuID); err != nil { + return option, fmt.Errorf("error get data jumlah umur: %v", err) + } + defer logger.Sync() + logger.Info("response data", zap.Any("data", data)) + + if data != nil { + for _, d := range data { + chartData = append(chartData, models.SeriesData{ + Value: d.Total, + Name: d.Umur + ": " + strconv.Itoa(d.Total) + " Peserta", + }) + } + } else { + chartData = append(chartData, models.SeriesData{Value: 0, Name: "No Data"}) + } + + option, err := tkp.GetPieChartConf(title, subtext, chartData) + if err != nil { + return option, fmt.Errorf("error get piechart jumlah umur: %v", err) + } + + return option, nil +}