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

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