diff --git a/handlers/corporate/mcudetail/tabkelainanlab.handlers.go b/handlers/corporate/mcudetail/tabkelainanlab.handlers.go index 85703ad..25d8f60 100644 --- a/handlers/corporate/mcudetail/tabkelainanlab.handlers.go +++ b/handlers/corporate/mcudetail/tabkelainanlab.handlers.go @@ -12,11 +12,11 @@ import ( type TabKelainanLabServices interface { GetDataPresentaseKelainanLab(mcuID string) (models.Barchart, error) - GetHematologi(mcuID string) (models.Barchart, error) - GetUrinalisa(mcuID string) (models.Barchart, error) - GetGangguanFungsiHati(mcuID string) (models.Barchart, error) - GetGangguanMetabolismeLemak(mcuID string) (models.Barchart, error) - GetPeningkatanGlukosa(mcuID string) (models.Barchart, error) + GetHematologi(mcuID string) (models.BarchartV2, error) + GetUrinalisa(mcuID string) (models.BarchartV2, error) + GetGangguanFungsiHati(mcuID string) (models.BarchartV2, error) + GetGangguanMetabolismeLemak(mcuID string) (models.BarchartV2, error) + GetPeningkatanGlukosa(mcuID string) (models.BarchartV2, error) } type TabKelainanLabHandler struct { diff --git a/handlers/corporate/mcudetail/tabkelainannonlab.handlers.go b/handlers/corporate/mcudetail/tabkelainannonlab.handlers.go new file mode 100644 index 0000000..8998e27 --- /dev/null +++ b/handlers/corporate/mcudetail/tabkelainannonlab.handlers.go @@ -0,0 +1,57 @@ +package mcu_corporate_handlers + +import ( + "cpone/component/chart" + "cpone/models" + "cpone/utils" + corporate_mcudetail "cpone/views/corporate/mcu/mcutab" + "encoding/json" + + "github.com/labstack/echo/v4" +) + +type TabKelainanNonLabServices interface { + GetDataKelNonLab(mcuID string) (models.Barchart, error) + GetThoraxPA(mcuID string) (models.BarchartV2, error) +} + +type TabKelainanNonLabHandler struct { + TabKelainanNonLabServices TabKelainanNonLabServices +} + +func NewTabKelainanNonLabHandler(tknl TabKelainanNonLabServices) *TabKelainanNonLabHandler { + return &TabKelainanNonLabHandler{ + TabKelainanNonLabServices: tknl, + } +} + +func (tknl *TabKelainanNonLabHandler) HandleShowTabKelainanNonLab(c echo.Context) error { + id := c.Param("id") + + datapre, err := tknl.TabKelainanNonLabServices.GetDataKelNonLab(id) + if err != nil { + return err + } + + thorax, err := tknl.TabKelainanNonLabServices.GetThoraxPA(id) + if err != nil { + return err + } + + dataprejson, err := json.MarshalIndent(datapre, "", " ") + if err != nil { + return err + } + + thrxjson, err := json.MarshalIndent(thorax, "", " ") + if err != nil { + return err + } + + content := corporate_mcudetail.TabKelainanNonLab( + chart.ShowChartFixed("datanonlg", string(dataprejson), "1000px", "450px"), + chart.ShowChartFixed("thoraxlg", string(thrxjson), "600px", "450px"), + ) + + return utils.View(c, content) +} diff --git a/handlers/routes.go b/handlers/routes.go index 03ccbd5..14be0bc 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -131,10 +131,16 @@ func SetupRoutesCorporate(app *echo.Echo, appStore db.AppStore) { kelainanglobalHdlr := mcu_corporate_handlers.NewTabKelainanGlobalHandler(kelainanglobalSrvs) corp.GET("/dashboard_pic/detail/:id/tabkelainanglobal", kelainanglobalHdlr.HandleShowTabKelainanGlobal) + // tab kelainan lab kelainanlabSrvs := mcu_corporate_services.NewTabKelainanLabServices(appStore) kelainanlabHdlr := mcu_corporate_handlers.NewTabKelainanLabHandler(kelainanlabSrvs) corp.GET("/dashboard_pic/detail/:id/tabkelainanlab", kelainanlabHdlr.HandleShowTabKelainanLab) + // tab kelainan non lab + kelnonlabSrvs := mcu_corporate_services.NewTabKelainanNonLabServices(appStore) + kelnonlabHdlr := mcu_corporate_handlers.NewTabKelainanNonLabHandler(kelnonlabSrvs) + corp.GET("/dashboard_pic/detail/:id/tabkelainannonlab", kelnonlabHdlr.HandleShowTabKelainanNonLab) + // tab kelainan fisik kelainanfisikSrvs := mcu_corporate_services.NewTabKelainanFisikServices(appStore) kelainanfisikHdlr := mcu_corporate_handlers.NewTabKelainanFisikHandler(kelainanfisikSrvs) diff --git a/models/chart.models.go b/models/chart.models.go index b20059c..8c7cc87 100644 --- a/models/chart.models.go +++ b/models/chart.models.go @@ -97,9 +97,59 @@ type BarDataset struct { Source [][]interface{} `json:"source"` } -type BarDataPoint struct { - Score int `json:"score"` - Amount int `json:"amount"` - Product string `json:"product"` - Percentage string `json:"percentage"` +type BarchartV2 struct { + Title struct { + Text string `json:"text"` + } `json:"title"` + Dataset struct { + Source [][]interface{} `json:"source"` + } `json:"dataset"` + Grid struct { + ContainLabel bool `json:"containLabel"` + } `json:"grid"` + XAxis struct { + Name string `json:"name"` + Type string `json:"type"` + AxisLabel struct { + Interval int `json:"interval"` + Rotate int `json:"rotate"` + } `json:"axisLabel"` + } `json:"xAxis"` + YAxis struct { + Type string `json:"type"` + Name string `json:"name"` + NameTextStyle struct { + Align string `json:"align"` + } `json:"nameTextStyle"` + NameGap int `json:"nameGap"` + } `json:"yAxis"` + VisualMap struct { + Orient string `json:"orient"` + Left string `json:"left"` + Min int `json:"min"` + Max int `json:"max"` + Dimension int `json:"dimension"` + Show bool `json:"show"` + InRange struct { + Color []string `json:"color"` + } `json:"inRange"` + } `json:"visualMap"` + Series []struct { + Label struct { + Position string `json:"position"` + Show bool `json:"show"` + Formatter string `json:"formatter"` + } `json:"label"` + Type string `json:"type"` + Encode struct { + X string `json:"x"` + Y string `json:"y"` + } `json:"encode"` + } `json:"series"` + Tooltip struct { + Trigger string `json:"trigger"` + AxisPointer struct { + Type string `json:"type"` + } `json:"axisPointer"` + } `json:"tooltip"` } diff --git a/models/tabkelainannonlab.models.go b/models/tabkelainannonlab.models.go new file mode 100644 index 0000000..7760884 --- /dev/null +++ b/models/tabkelainannonlab.models.go @@ -0,0 +1,6 @@ +package models + +type KelNonLabModel struct { + Kelainan string `db:"kelainan"` + Total int `db:"total"` +} diff --git a/services/corporate/mcudetail/tabkelainanglobal.services.go b/services/corporate/mcudetail/tabkelainanglobal.services.go index 38831ab..d64135c 100644 --- a/services/corporate/mcudetail/tabkelainanglobal.services.go +++ b/services/corporate/mcudetail/tabkelainanglobal.services.go @@ -5,6 +5,8 @@ import ( "cpone/models" dbx "cpone/package/database" "fmt" + "math" + "strconv" "go.uber.org/zap" ) @@ -102,6 +104,8 @@ func (tkg *TabKelainanGlobalServices) GetKelainanGlobalMCU(mcuID string) (models AND Mgm_HeaderIsNormal = 'N' GROUP BY Mcu_KelainanGroupID ORDER BY COUNT(Mgm_HeaderT_OrderHeaderID) DESC ` + // Mgm_DetailMcu_KelainanID ->> versi php + // Mcu_KelainanGroupID ->> versi excel if err := dbx.Handlex.Select(&data, q, mcuID); err != nil { return option, fmt.Errorf("error get data kelainan global mcu %v", err) } @@ -115,9 +119,19 @@ func (tkg *TabKelainanGlobalServices) GetKelainanGlobalMCU(mcuID string) (models }, } + max := 1 for _, d := range data { + if d.Total >= max { + max = d.Total + } + } + + for _, d := range data { + percentage := float64(d.Total) / float64(max) * 100 + roundedPercentage := math.Round(percentage*100) / 100 + percentStr := strconv.FormatFloat(roundedPercentage, 'f', -1, 64) chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Test, + d.Total, d.Total, d.Test, percentStr, }) } @@ -162,9 +176,19 @@ func (tkg *TabKelainanGlobalServices) GetKelainanFisik(mcuID string) (models.Bar }, } + max := 1 for _, d := range data { + if d.Total >= max { + max = d.Total + } + } + + for _, d := range data { + percentage := float64(d.Total) / float64(max) * 100 + roundedPercentage := math.Round(percentage*100) / 100 + percentStr := strconv.FormatFloat(roundedPercentage, 'f', -1, 64) chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, + d.Total, d.Total, d.Mcu_KelainanName, percentStr, }) } diff --git a/services/corporate/mcudetail/tabkelainanlab.services.go b/services/corporate/mcudetail/tabkelainanlab.services.go index edeabf4..b571bff 100644 --- a/services/corporate/mcudetail/tabkelainanlab.services.go +++ b/services/corporate/mcudetail/tabkelainanlab.services.go @@ -5,6 +5,8 @@ import ( "cpone/models" dbx "cpone/package/database" "fmt" + "math" + "strconv" "go.uber.org/zap" ) @@ -19,7 +21,7 @@ func NewTabKelainanLabServices(store db.AppStore) *TabKelainanLabServices { } } -func (tkl *TabKelainanLabServices) GetBarChartConf(title string, data models.BarDataset) (models.Barchart, error) { +func (tkl *TabKelainanLabServices) ConfBarchart(title string, data models.BarDataset) (models.Barchart, error) { option := models.Barchart{} option.Title = struct { @@ -85,6 +87,139 @@ func (tkl *TabKelainanLabServices) GetBarChartConf(title string, data models.Bar return option, nil } +func (tkl *TabKelainanLabServices) ConfBarchartVertical(title string, data []models.KelainanLabModel) (models.BarchartV2, error) { + + chartData := models.BarDataset{ + Source: [][]interface{}{ + {"score", "amount", "product"}, + }, + } + + cnt := len(data) + for idx, d := range data { + chartData.Source = append(chartData.Source, []interface{}{ + idx, d.Total, d.Mcu_KelainanName, + }) + } + + option := models.BarchartV2{ + Title: struct { + Text string "json:\"text\"" + }{title}, + Dataset: struct { + Source [][]interface{} "json:\"source\"" + }{chartData.Source}, + Grid: struct { + ContainLabel bool "json:\"containLabel\"" + }{true}, + XAxis: struct { + Name string "json:\"name\"" + Type string "json:\"type\"" + AxisLabel struct { + Interval int "json:\"interval\"" + Rotate int "json:\"rotate\"" + } "json:\"axisLabel\"" + }{ + Name: "", + Type: "category", + AxisLabel: struct { + Interval int "json:\"interval\"" + Rotate int "json:\"rotate\"" + }{ + Interval: 0, + Rotate: 0, + }, + }, + YAxis: struct { + Type string "json:\"type\"" + Name string "json:\"name\"" + NameTextStyle struct { + Align string "json:\"align\"" + } "json:\"nameTextStyle\"" + NameGap int "json:\"nameGap\"" + }{ + Type: "value", + Name: "", + NameTextStyle: struct { + Align string "json:\"align\"" + }{ + Align: "right", + }, + NameGap: 20, + }, + VisualMap: struct { + Orient string "json:\"orient\"" + Left string "json:\"left\"" + Min int "json:\"min\"" + Max int "json:\"max\"" + Dimension int "json:\"dimension\"" + Show bool "json:\"show\"" + InRange struct { + Color []string "json:\"color\"" + } "json:\"inRange\"" + }{ + Orient: "horizontal", + Left: "center", + Min: 0, + Max: cnt, + Dimension: 0, + Show: false, + InRange: struct { + Color []string "json:\"color\"" + }{ + Color: []string{"#42aaf5", "#00eaf2", "#035bff"}, + }, + }, + Series: []struct { + Label struct { + Position string "json:\"position\"" + Show bool "json:\"show\"" + Formatter string "json:\"formatter\"" + } "json:\"label\"" + Type string "json:\"type\"" + Encode struct { + X string "json:\"x\"" + Y string "json:\"y\"" + } "json:\"encode\"" + }{ + { + Label: struct { + Position string "json:\"position\"" + Show bool "json:\"show\"" + Formatter string "json:\"formatter\"" + }{ + Position: "inside", + Show: true, + Formatter: "{@[1]}", + }, + Type: "bar", + Encode: struct { + X string "json:\"x\"" + Y string "json:\"y\"" + }{ + X: "product", + Y: "amount", + }, + }, + }, + Tooltip: struct { + Trigger string "json:\"trigger\"" + AxisPointer struct { + Type string "json:\"type\"" + } "json:\"axisPointer\"" + }{ + Trigger: "axis", + AxisPointer: struct { + Type string "json:\"type\"" + }{ + Type: "shadow", + }, + }, + } + + return option, nil +} + func (tkl *TabKelainanLabServices) GetDataPresentaseKelainanLab(mcuID string) (models.Barchart, error) { logger, _ := zap.NewProduction() var option models.Barchart @@ -118,13 +253,23 @@ func (tkl *TabKelainanLabServices) GetDataPresentaseKelainanLab(mcuID string) (m }, } + max := 1 for _, d := range data { + if d.Total >= max { + max = d.Total + } + } + + for _, d := range data { + percentage := float64(d.Total) / float64(max) * 100 + roundedPercentage := math.Round(percentage*100) / 100 + percentStr := strconv.FormatFloat(roundedPercentage, 'f', -1, 64) chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, + d.Total, d.Total, d.Mcu_KelainanName, percentStr, }) } - option, err := tkl.GetBarChartConf(title, chartData) + option, err := tkl.ConfBarchart(title, chartData) if err != nil { return option, fmt.Errorf("error insert data to chart %v", err) } @@ -132,9 +277,9 @@ func (tkl *TabKelainanLabServices) GetDataPresentaseKelainanLab(mcuID string) (m return option, nil } -func (tkl *TabKelainanLabServices) GetHematologi(mcuID string) (models.Barchart, error) { +func (tkl *TabKelainanLabServices) GetHematologi(mcuID string) (models.BarchartV2, error) { logger, _ := zap.NewProduction() - var option models.Barchart + var option models.BarchartV2 var data []models.KelainanLabModel q := ` @@ -158,19 +303,7 @@ func (tkl *TabKelainanLabServices) GetHematologi(mcuID string) (models.Barchart, logger.Info("resp data", zap.Any("data", data)) title := "Hematologi" - chartData := models.BarDataset{ - Source: [][]interface{}{ - {"score", "amount", "product", "percentage"}, - }, - } - - for _, d := range data { - chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, - }) - } - - option, err := tkl.GetBarChartConf(title, chartData) + option, err := tkl.ConfBarchartVertical(title, data) if err != nil { return option, fmt.Errorf("error insert data to chart %v", err) } @@ -178,9 +311,9 @@ func (tkl *TabKelainanLabServices) GetHematologi(mcuID string) (models.Barchart, return option, nil } -func (tkl *TabKelainanLabServices) GetUrinalisa(mcuID string) (models.Barchart, error) { +func (tkl *TabKelainanLabServices) GetUrinalisa(mcuID string) (models.BarchartV2, error) { logger, _ := zap.NewProduction() - var option models.Barchart + var option models.BarchartV2 var data []models.KelainanLabModel q := ` @@ -206,19 +339,7 @@ func (tkl *TabKelainanLabServices) GetUrinalisa(mcuID string) (models.Barchart, logger.Info("resp data", zap.Any("data", data)) title := "Urinalisa" - chartData := models.BarDataset{ - Source: [][]interface{}{ - {"score", "amount", "product", "percentage"}, - }, - } - - for _, d := range data { - chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, - }) - } - - option, err := tkl.GetBarChartConf(title, chartData) + option, err := tkl.ConfBarchartVertical(title, data) if err != nil { return option, fmt.Errorf("error insert data to chart %v", err) } @@ -226,9 +347,9 @@ func (tkl *TabKelainanLabServices) GetUrinalisa(mcuID string) (models.Barchart, return option, nil } -func (tkl *TabKelainanLabServices) GetGangguanFungsiHati(mcuID string) (models.Barchart, error) { +func (tkl *TabKelainanLabServices) GetGangguanFungsiHati(mcuID string) (models.BarchartV2, error) { logger, _ := zap.NewProduction() - var option models.Barchart + var option models.BarchartV2 var data []models.KelainanLabModel q := ` @@ -253,19 +374,7 @@ func (tkl *TabKelainanLabServices) GetGangguanFungsiHati(mcuID string) (models.B logger.Info("resp data", zap.Any("data", data)) title := "Gangguan Fungsi Hati" - chartData := models.BarDataset{ - Source: [][]interface{}{ - {"score", "amount", "product", "percentage"}, - }, - } - - for _, d := range data { - chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, - }) - } - - option, err := tkl.GetBarChartConf(title, chartData) + option, err := tkl.ConfBarchartVertical(title, data) if err != nil { return option, fmt.Errorf("error insert data to chart %v", err) } @@ -273,9 +382,9 @@ func (tkl *TabKelainanLabServices) GetGangguanFungsiHati(mcuID string) (models.B return option, nil } -func (tkl *TabKelainanLabServices) GetGangguanMetabolismeLemak(mcuID string) (models.Barchart, error) { +func (tkl *TabKelainanLabServices) GetGangguanMetabolismeLemak(mcuID string) (models.BarchartV2, error) { logger, _ := zap.NewProduction() - var option models.Barchart + var option models.BarchartV2 var data []models.KelainanLabModel q := ` @@ -298,19 +407,7 @@ func (tkl *TabKelainanLabServices) GetGangguanMetabolismeLemak(mcuID string) (mo logger.Info("resp data", zap.Any("data", data)) title := "Gangguan Metabolisme Lemak" - chartData := models.BarDataset{ - Source: [][]interface{}{ - {"score", "amount", "product", "percentage"}, - }, - } - - for _, d := range data { - chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, - }) - } - - option, err := tkl.GetBarChartConf(title, chartData) + option, err := tkl.ConfBarchartVertical(title, data) if err != nil { return option, fmt.Errorf("error insert data to chart %v", err) } @@ -318,9 +415,9 @@ func (tkl *TabKelainanLabServices) GetGangguanMetabolismeLemak(mcuID string) (mo return option, nil } -func (tkl *TabKelainanLabServices) GetPeningkatanGlukosa(mcuID string) (models.Barchart, error) { +func (tkl *TabKelainanLabServices) GetPeningkatanGlukosa(mcuID string) (models.BarchartV2, error) { logger, _ := zap.NewProduction() - var option models.Barchart + var option models.BarchartV2 var data []models.KelainanLabModel q := ` @@ -342,19 +439,7 @@ func (tkl *TabKelainanLabServices) GetPeningkatanGlukosa(mcuID string) (models.B logger.Info("resp data", zap.Any("data", data)) title := "Peningkatan Glukosa" - chartData := models.BarDataset{ - Source: [][]interface{}{ - {"score", "amount", "product", "percentage"}, - }, - } - - for _, d := range data { - chartData.Source = append(chartData.Source, []interface{}{ - d.Total, d.Total, d.Mcu_KelainanName, - }) - } - - option, err := tkl.GetBarChartConf(title, chartData) + option, err := tkl.ConfBarchartVertical(title, data) if err != nil { return option, fmt.Errorf("error insert data to chart %v", err) } diff --git a/services/corporate/mcudetail/tabkelainannonlab.services.go b/services/corporate/mcudetail/tabkelainannonlab.services.go new file mode 100644 index 0000000..80cb9ff --- /dev/null +++ b/services/corporate/mcudetail/tabkelainannonlab.services.go @@ -0,0 +1,309 @@ +package mcu_corporate_services + +import ( + "cpone/db" + "cpone/models" + dbx "cpone/package/database" + "fmt" + "math" + "strconv" + + "go.uber.org/zap" +) + +type TabKelainanNonLabServices struct { + TabKelainanNonLabStore db.AppStore +} + +func NewTabKelainanNonLabServices(store db.AppStore) *TabKelainanNonLabServices { + return &TabKelainanNonLabServices{ + TabKelainanNonLabStore: store, + } +} + +func (tknl *TabKelainanNonLabServices) GetBarChartConf(title string, data models.BarDataset) (models.Barchart, error) { + option := models.Barchart{} + option.Title = struct { + Text string "json:\"text\"" + }{title} + option.Dataset = data + option.Grid.ContainLabel = true + option.XAxis.Name = "amount" + option.YAxis.Type = "category" + option.VisualMap.Orient = "horizontal" + option.VisualMap.Left = "center" + option.VisualMap.Min = 10 + option.VisualMap.Max = 100 + option.VisualMap.Show = false + option.VisualMap.Dimension = 0 + option.VisualMap.InRange.Color = []string{"#42aaf5", "#00eaf2", "#035bff"} + option.Series = []struct { + Label struct { + Position string "json:\"position\"" + Show bool "json:\"show\"" + Formatter string "json:\"formatter\"" + } "json:\"label\"" + Type string "json:\"type\"" + Encode struct { + X string "json:\"x\"" + Y string "json:\"y\"" + } "json:\"encode\"" + }{ + { + Label: struct { + Position string "json:\"position\"" + Show bool "json:\"show\"" + Formatter string "json:\"formatter\"" + }{ + Position: "right", + Show: true, + Formatter: "{@[3]} %", + }, + Type: "bar", + Encode: struct { + X string "json:\"x\"" + Y string "json:\"y\"" + }{ + X: "score", + Y: "product", + }, + }, + } + option.Tooltip = struct { + Trigger string "json:\"trigger\"" + AxisPointer struct { + Type string "json:\"type\"" + } "json:\"axisPointer\"" + }{ + Trigger: "axis", + AxisPointer: struct { + Type string "json:\"type\"" + }{ + Type: "shadow", + }, + } + + return option, nil +} + +func (tknl *TabKelainanNonLabServices) ConfBarchartVertical(title string, data []models.KelNonLabModel) (models.BarchartV2, error) { + chartData := models.BarDataset{ + Source: [][]interface{}{ + {"score", "amount", "product"}, + }, + } + + cnt := len(data) + for idx, d := range data { + chartData.Source = append(chartData.Source, []interface{}{ + idx, d.Total, d.Kelainan, + }) + } + + option := models.BarchartV2{ + Title: struct { + Text string "json:\"text\"" + }{title}, + Dataset: struct { + Source [][]interface{} "json:\"source\"" + }{chartData.Source}, + Grid: struct { + ContainLabel bool "json:\"containLabel\"" + }{true}, + XAxis: struct { + Name string "json:\"name\"" + Type string "json:\"type\"" + AxisLabel struct { + Interval int "json:\"interval\"" + Rotate int "json:\"rotate\"" + } "json:\"axisLabel\"" + }{ + Name: "", + Type: "category", + AxisLabel: struct { + Interval int "json:\"interval\"" + Rotate int "json:\"rotate\"" + }{ + Interval: 0, + Rotate: 0, + }, + }, + YAxis: struct { + Type string "json:\"type\"" + Name string "json:\"name\"" + NameTextStyle struct { + Align string "json:\"align\"" + } "json:\"nameTextStyle\"" + NameGap int "json:\"nameGap\"" + }{ + Type: "value", + Name: "", + NameTextStyle: struct { + Align string "json:\"align\"" + }{ + Align: "right", + }, + NameGap: 20, + }, + VisualMap: struct { + Orient string "json:\"orient\"" + Left string "json:\"left\"" + Min int "json:\"min\"" + Max int "json:\"max\"" + Dimension int "json:\"dimension\"" + Show bool "json:\"show\"" + InRange struct { + Color []string "json:\"color\"" + } "json:\"inRange\"" + }{ + Orient: "horizontal", + Left: "center", + Min: 0, + Max: cnt, + Dimension: 0, + Show: false, + InRange: struct { + Color []string "json:\"color\"" + }{ + Color: []string{"#42aaf5", "#00eaf2", "#035bff"}, + }, + }, + Series: []struct { + Label struct { + Position string "json:\"position\"" + Show bool "json:\"show\"" + Formatter string "json:\"formatter\"" + } "json:\"label\"" + Type string "json:\"type\"" + Encode struct { + X string "json:\"x\"" + Y string "json:\"y\"" + } "json:\"encode\"" + }{ + { + Label: struct { + Position string "json:\"position\"" + Show bool "json:\"show\"" + Formatter string "json:\"formatter\"" + }{ + Position: "inside", + Show: true, + Formatter: "{@[1]}", + }, + Type: "bar", + Encode: struct { + X string "json:\"x\"" + Y string "json:\"y\"" + }{ + X: "product", + Y: "amount", + }, + }, + }, + Tooltip: struct { + Trigger string "json:\"trigger\"" + AxisPointer struct { + Type string "json:\"type\"" + } "json:\"axisPointer\"" + }{ + Trigger: "axis", + AxisPointer: struct { + Type string "json:\"type\"" + }{ + Type: "shadow", + }, + }, + } + + return option, nil +} + +func (tknl *TabKelainanNonLabServices) GetDataKelNonLab(mcuID string) (models.Barchart, error) { + logger, _ := zap.NewProduction() + var option models.Barchart + var data []models.KelNonLabModel + + q := ` + SELECT concat(Nat_TestName,"/",Mcu_KelainanName) AS kelainan, + COUNT(Mgm_HeaderT_OrderHeaderID) AS total + FROM mgm_header + LEFT JOIN mgm_detail ON Mgm_DetailMgm_HeaderID = Mgm_HeaderID AND Mgm_DetailIsActive = 'Y' + LEFT JOIN mcu_kelainan ON Mgm_DetailMcu_KelainanID = Mcu_KelainanID + LEFT JOIN mcu_kelainangroup ON Mgm_DetailMcu_KelainanGroupID = Mcu_KelainanGroupID + LEFT JOIN nat_test ON Nat_TestCode = Mgm_HeaderNat_TestCode + WHERE Mgm_HeaderIsActive = 'Y' AND Mgm_HeaderMgm_McuID = ? + AND Mgm_HeaderType = 'NL' + AND Mgm_HeaderIsNormal = 'N' + GROUP BY Mcu_KelainanID + ORDER BY COUNT(Mgm_HeaderT_OrderHeaderID) DESC + ` + if err := dbx.Handlex.Select(&data, q, mcuID); err != nil { + return option, fmt.Errorf("error get data kelainan global mcu %v", err) + } + defer logger.Sync() + logger.Info("resp data", zap.Any("data", data)) + + title := "" + chartData := models.BarDataset{ + Source: [][]interface{}{ + {"score", "amount", "product", "percentage"}, + }, + } + + max := 1 + for _, d := range data { + if d.Total >= max { + max = d.Total + } + } + + for _, d := range data { + percentage := float64(d.Total) / float64(max) * 100 + roundedPercentage := math.Round(percentage*100) / 100 + percentStr := strconv.FormatFloat(roundedPercentage, 'f', -1, 64) + chartData.Source = append(chartData.Source, []interface{}{ + d.Total, d.Total, d.Kelainan, percentStr, + }) + } + + option, err := tknl.GetBarChartConf(title, chartData) + if err != nil { + return option, fmt.Errorf("error insert data to barchart %v", err) + } + + return option, nil +} + +func (tknl *TabKelainanNonLabServices) GetThoraxPA(mcuID string) (models.BarchartV2, error) { + logger, _ := zap.NewProduction() + var option models.BarchartV2 + var data []models.KelNonLabModel + + q := ` + SELECT + IFNULL(Mcu_KelainanName,'Normal') AS kelainan, + COUNT(Mgm_HeaderT_OrderHeaderID) AS total + FROM mgm_header + LEFT JOIN mgm_detail ON Mgm_DetailMgm_HeaderID = Mgm_HeaderID AND Mgm_DetailIsActive = 'Y' + LEFT JOIN mcu_kelainan ON Mgm_DetailMcu_KelainanID = Mcu_KelainanID + LEFT JOIN mcu_kelainangroup ON Mgm_DetailMcu_KelainanGroupID = Mcu_KelainanGroupID + WHERE Mgm_HeaderIsActive = 'Y' AND Mgm_HeaderNat_TestCode = 30150100 + AND Mgm_HeaderIsNormal = 'N' AND Mgm_HeaderMgm_McuID = ? + GROUP BY Mcu_KelainanID + ORDER BY total DESC + ` + + if err := dbx.Handlex.Select(&data, q, mcuID); err != nil { + return option, fmt.Errorf("error get data kelainan global mcu %v", err) + } + defer logger.Sync() + logger.Info("resp data", zap.Any("data", data)) + + title := "Thorax PA" + option, err := tknl.ConfBarchartVertical(title, data) + if err != nil { + return option, fmt.Errorf("error insert data into chart %v", err) + } + + return option, nil +} diff --git a/utils/chartcolor.utils.go b/utils/chartcolor.utils.go new file mode 100644 index 0000000..c1f064e --- /dev/null +++ b/utils/chartcolor.utils.go @@ -0,0 +1,28 @@ +package utils + +import ( + "fmt" + "math" +) + +// InterpolateColor calculates a color between two given colors based on progress (0 to 1) +func InterpolateColor(start, end string, progress float64) string { + r1, g1, b1 := HexToRGB(start) + r2, g2, b2 := HexToRGB(end) + + r := int(math.Round(float64(r1)*(1-progress) + float64(r2)*progress)) + g := int(math.Round(float64(g1)*(1-progress) + float64(g2)*progress)) + b := int(math.Round(float64(b1)*(1-progress) + float64(b2)*progress)) + + return fmt.Sprintf("#%02x%02x%02x", r, g, b) +} + +// Helper function to convert hex to RGB +func HexToRGB(hex string) (int, int, int) { + var r, g, b int + _, err := fmt.Sscanf(hex, "#%02x%02x%02x", &r, &g, &b) + if err != nil { + return 0, 0, 0 + } + return r, g, b +} diff --git a/views/corporate/mcu/mcutab/tabkelainannonlab.templ b/views/corporate/mcu/mcutab/tabkelainannonlab.templ new file mode 100644 index 0000000..146981e --- /dev/null +++ b/views/corporate/mcu/mcutab/tabkelainannonlab.templ @@ -0,0 +1,32 @@ +package corporate_mcudetail + +templ TabKelainanNonLab( + chartpresentase templ.Component, + chartthorax templ.Component, +) { +
+
+

Data Kelainan Non Lab

+
+ + // xs +
+ +
+ + // md +
+ +
+ + // lg +
+
+ @chartpresentase +
+
+ @chartthorax +
+
+
+} \ No newline at end of file diff --git a/views/corporate/mcu/mcutab/tabkelainannonlab_templ.go b/views/corporate/mcu/mcutab/tabkelainannonlab_templ.go new file mode 100644 index 0000000..7c1a9de --- /dev/null +++ b/views/corporate/mcu/mcutab/tabkelainannonlab_templ.go @@ -0,0 +1,54 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.663 +package corporate_mcudetail + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +func TabKelainanNonLab( + chartpresentase templ.Component, + chartthorax templ.Component, +) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

Data Kelainan Non Lab

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = chartpresentase.Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = chartthorax.Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/views/corporate/mcu/mcutabview.templ b/views/corporate/mcu/mcutabview.templ index e0b1eff..813edaf 100644 --- a/views/corporate/mcu/mcutabview.templ +++ b/views/corporate/mcu/mcutabview.templ @@ -15,7 +15,7 @@ templ TabViewMcuDetail( Kelainan Lab
  • kelainan Non Lab
  • Kelainan Lab
  • kelainan Non Lab
  • Keuangan
  • Keuangan