add echart barchart

This commit is contained in:
2024-07-05 10:55:47 +07:00
parent eb7343117b
commit f2d8207f25
13 changed files with 770 additions and 118 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,6 @@
package models
type KelNonLabModel struct {
Kelainan string `db:"kelainan"`
Total int `db:"total"`
}

View File

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

View File

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

View File

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

28
utils/chartcolor.utils.go Normal file
View File

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

View File

@@ -0,0 +1,32 @@
package corporate_mcudetail
templ TabKelainanNonLab(
chartpresentase templ.Component,
chartthorax templ.Component,
) {
<div class="container-fluid">
<div class="d-flex justify-content-center py-10">
<h2 class="title text-black" style="margin-bottom: 0;">Data Kelainan Non Lab</h2>
</div>
// xs
<div class="d-xs-block d-sm-block d-md-none">
</div>
// md
<div class="d-none d-md-block d-lg-none">
</div>
// lg
<div class="d-none d-lg-block">
<div class="mb-8">
@chartpresentase
</div>
<div class="mb-8">
@chartthorax
</div>
</div>
</div>
}

View File

@@ -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("<div class=\"container-fluid\"><div class=\"d-flex justify-content-center py-10\"><h2 class=\"title text-black\" style=\"margin-bottom: 0;\">Data Kelainan Non Lab</h2></div><div class=\"d-xs-block d-sm-block d-md-none\"></div><div class=\"d-none d-md-block d-lg-none\"></div><div class=\"d-none d-lg-block\"><div class=\"mb-8\">")
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("</div><div class=\"mb-8\">")
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("</div></div></div>")
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
})
}

View File

@@ -15,7 +15,7 @@ templ TabViewMcuDetail(
<a class="nav-link" data-toggle="tab" href="#kt_tab_pane_3" hx-get={"/corp/dashboard_pic/detail/" + id +"/tabkelainanlab"} hx-target="#tabkelainanlab" hx-trigger="click">Kelainan Lab</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#kt_tab_pane_4">kelainan Non Lab</a>
<a class="nav-link" data-toggle="tab" href="#kt_tab_pane_4" hx-get={"/corp/dashboard_pic/detail/" + id +"/tabkelainannonlab"} hx-target="#tabkelainannonlab" hx-trigger="click">kelainan Non Lab</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#kt_tab_pane_5" hx-get={"/corp/dashboard_pic/detail/" + id +"/tabkelainanfisik"} hx-target="#tabkelainanfisik" hx-trigger="click">kelainan Fisik</a>
@@ -48,7 +48,8 @@ templ TabViewMcuDetail(
<div id="tabkelainanlab"></div>
</div>
<div class="tab-pane fade" id="kt_tab_pane_4" role="tabpanel" aria-labelledby="kt_tab_pane_4" style="height: 800px;">
<object data={"https://devcpone.aplikasi.web.id/birt/run?__report=report/one/mcu/rpt_mcu_graph_004.rptdesign&__format=pdf&PID="+id+"&username=adhi&tm=1717726294764"} type="application/pdf" width="100%" height="100%"></object>
// <object data={"https://devcpone.aplikasi.web.id/birt/run?__report=report/one/mcu/rpt_mcu_graph_004.rptdesign&__format=pdf&PID="+id+"&username=adhi&tm=1717726294764"} type="application/pdf" width="100%" height="100%"></object>
<div id="tabkelainannonlab"></div>
</div>
<div class="tab-pane fade" id="kt_tab_pane_5" role="tabpanel" aria-labelledby="kt_tab_pane_5">
// <object data={"https://devcpone.aplikasi.web.id/birt/run?__report=report/one/mcu/rpt_mcu_graph_005.rptdesign&__format=pdf&PID="+id+"&username=adhi&tm=1717726294764"} type="application/pdf" width="100%" height="100%"></object>

View File

@@ -64,16 +64,29 @@ func TabViewMcuDetail(
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" hx-target=\"#tabkelainanlab\" hx-trigger=\"click\">Kelainan Lab</a></li><li class=\"nav-item\"><a class=\"nav-link\" data-toggle=\"tab\" href=\"#kt_tab_pane_4\">kelainan Non Lab</a></li><li class=\"nav-item\"><a class=\"nav-link\" data-toggle=\"tab\" href=\"#kt_tab_pane_5\" hx-get=\"")
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" hx-target=\"#tabkelainanlab\" hx-trigger=\"click\">Kelainan Lab</a></li><li class=\"nav-item\"><a class=\"nav-link\" data-toggle=\"tab\" href=\"#kt_tab_pane_4\" hx-get=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var5 string
templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkelainanfisik")
templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkelainannonlab")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 18, Col: 128}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" hx-target=\"#tabkelainannonlab\" hx-trigger=\"click\">kelainan Non Lab</a></li><li class=\"nav-item\"><a class=\"nav-link\" data-toggle=\"tab\" href=\"#kt_tab_pane_5\" hx-get=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var6 string
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkelainanfisik")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 21, Col: 127}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -81,12 +94,12 @@ func TabViewMcuDetail(
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var6 string
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkesimpulan")
var templ_7745c5c3_Var7 string
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkesimpulan")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 24, Col: 124}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -94,12 +107,12 @@ func TabViewMcuDetail(
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var7 string
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabdaftarpeserta")
var templ_7745c5c3_Var8 string
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabdaftarpeserta")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 27, Col: 127}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -107,36 +120,23 @@ func TabViewMcuDetail(
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var8 string
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkeuangan")
var templ_7745c5c3_Var9 string
templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs("/corp/dashboard_pic/detail/" + id + "/tabkeuangan")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 33, Col: 122}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" hx-target=\"#tabkeuangan\">Keuangan</a></li></ul></div><div class=\"tab-content mt-5\" id=\"myTabContent\"><div class=\"tab-pane fade show active\" id=\"kt_tab_pane_1\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_1\"><div id=\"tabkepesertaan\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_2\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_2\"><div id=\"tabkelainanglobal\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_3\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_3\"><div id=\"tabkelainanlab\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_4\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_4\" style=\"height: 800px;\"><object data=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var9 string
templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs("https://devcpone.aplikasi.web.id/birt/run?__report=report/one/mcu/rpt_mcu_graph_004.rptdesign&__format=pdf&PID=" + id + "&username=adhi&tm=1717726294764")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 51, Col: 167}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" type=\"application/pdf\" width=\"100%\" height=\"100%\"></object></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_5\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_5\"><div id=\"tabkelainanfisik\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_6\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_6\"><div id=\"tabkesimpulan\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_7\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_7\"><div id=\"tabdaftarpeserta\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_8\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_8\" style=\"height: 800px;\"><object data=\"")
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\" hx-target=\"#tabkeuangan\">Keuangan</a></li></ul></div><div class=\"tab-content mt-5\" id=\"myTabContent\"><div class=\"tab-pane fade show active\" id=\"kt_tab_pane_1\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_1\"><div id=\"tabkepesertaan\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_2\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_2\"><div id=\"tabkelainanglobal\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_3\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_3\"><div id=\"tabkelainanlab\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_4\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_4\" style=\"height: 800px;\"><div id=\"tabkelainannonlab\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_5\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_5\"><div id=\"tabkelainanfisik\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_6\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_6\"><div id=\"tabkesimpulan\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_7\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_7\"><div id=\"tabdaftarpeserta\"></div></div><div class=\"tab-pane fade\" id=\"kt_tab_pane_8\" role=\"tabpanel\" aria-labelledby=\"kt_tab_pane_8\" style=\"height: 800px;\"><object data=\"")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var10 string
templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs("https://devcpone.aplikasi.web.id/birt/run?__report=report/one/mcu/rpt_summary_executive.rptdesign&__format=pdf&PID=" + id + "&username=adhi&tm=1717726294764")
if templ_7745c5c3_Err != nil {
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 64, Col: 171}
return templ.Error{Err: templ_7745c5c3_Err, FileName: `views\corporate\mcu\mcutabview.templ`, Line: 65, Col: 171}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
if templ_7745c5c3_Err != nil {