add chart tab kepesertaan

This commit is contained in:
2024-06-27 15:56:43 +07:00
parent 2a25c60cc2
commit 1c7e223195
3 changed files with 286 additions and 73 deletions

View File

@@ -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)

View File

@@ -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"`
}

View File

@@ -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
}