This commit is contained in:
2024-06-03 08:45:50 +07:00
parent aff369b6fe
commit 08ba796c41
12 changed files with 1208 additions and 87 deletions

View File

@@ -6,6 +6,7 @@ import (
dbx "cpone/package/database"
"fmt"
"math"
"strconv"
"strings"
"go.uber.org/zap"
@@ -13,11 +14,34 @@ import (
type MDNonLabTemplateServices struct {
MDNonLabTemplateStore db.AppStore
DetailStore []models.MDNonLabTemplateDetail
addChan chan models.MDNonLabTemplateDetail
delChan chan models.MDNonLabTemplateDetail
}
func NewMDNonLabTemplateServices(uStore db.AppStore) *MDNonLabTemplateServices {
return &MDNonLabTemplateServices{
aChan := make(chan models.MDNonLabTemplateDetail)
dChan := make(chan models.MDNonLabTemplateDetail)
serv := MDNonLabTemplateServices{
MDNonLabTemplateStore: uStore,
DetailStore: []models.MDNonLabTemplateDetail{},
addChan: aChan,
delChan: dChan,
}
go serv.runner()
return &serv
}
func (mdnlt *MDNonLabTemplateServices) runner() {
for {
select {
case x := <-mdnlt.addChan:
mdnlt.DetailStore = append(mdnlt.DetailStore, x)
case y := <-mdnlt.delChan:
mdnlt.DetailStore = append(mdnlt.DetailStore, y)
}
}
}
@@ -112,6 +136,109 @@ func (mdnlt *MDNonLabTemplateServices) GetMDNonLabTemplateByID(id string) (model
return ret, nil
}
func (mdnlt *MDNonLabTemplateServices) GetListingDetailByID(id string) ([]models.MDNonLabTemplateDetail, error) {
logger, _ := zap.NewProduction()
var ret []models.MDNonLabTemplateDetail
q := `
SELECT
NonlabTemplateDetailID,
NonlabTemplateDetailNonlabTemplateID,
NonlabTemplateDetailCode,
NonlabTemplateDetailName,
NonlabTemplateDetailIsActive
FROM nonlab_template_detail
WHERE NonlabTemplateDetailIsActive = 'Y'
AND NonlabTemplateDetailNonlabTemplateID = ?
`
if err := dbx.Handlex.Select(&ret, q, id); err != nil {
defer logger.Sync()
logger.Error("Error get detail",
zap.String("ID", id),
zap.Error(err),
)
return nil, fmt.Errorf("error get list detail: %v", err)
}
return ret, nil
}
func (mdnlt *MDNonLabTemplateServices) AddDataMDNLT(input models.InputDetailNonLabTemplate) (models.MDNonLabTemplate, error) {
logger, _ := zap.NewProduction()
var ret models.MDNonLabTemplate
// cek duplicate non lab template name
var count int
prm := "%" + input.NonLabTemplateName + "%"
q := `SELECT COUNT(*) FROM nonlab_template WHERE NonlabTemplateIsActive = 'Y' AND NonlabTemplateName LIKE ?`
err := dbx.Handlex.Get(&count, q, prm)
if err != nil {
defer logger.Sync()
logger.Error("cek duplicate", zap.Any("name", input.NonLabTemplateName))
return ret, fmt.Errorf("query failed to cek duplicate")
}
if count > 0 {
defer logger.Sync()
logger.Error("duplicate data", zap.Any("name", input.NonLabTemplateName))
return ret, fmt.Errorf("duplicate code or name")
}
// insert data
tx, err := dbx.Handlex.Beginx()
if err != nil {
return ret, err
}
defer tx.Rollback()
qnlt := `
INSERT INTO nonlab_template (
NonlabTemplateName,
NonlabTemplateFlagFisik,
NonlabTemplateCreated
) VALUES (?,?,NOW());
`
rsp := tx.MustExec(qnlt, input.NonLabTemplateName, input.NonLabTemplateFlagFisik)
insertedID, err := rsp.LastInsertId()
if err != nil {
defer logger.Sync()
logger.Error("failed insert data template", zap.Any("name", input.NonLabTemplateName), zap.Any("flag fisik", input.NonLabTemplateFlagFisik))
return ret, fmt.Errorf("query failed insert data template")
}
qry, err := tx.Preparex(`
INSERT INTO nonlab_template_detail (
NonlabTemplateDetailNonlabTemplateID,
NonlabTemplateDetailCode,
NonlabTemplateDetailName,
NonlabTemplateDetailFlagActive
) VALUES (?,?,?,?)
`)
if err != nil {
return ret, fmt.Errorf("query failed: %v", err)
}
defer qry.Close()
for _, detail := range input.NonLabTemplatDetail {
_, err := qry.Exec(
insertedID,
detail.NonlabTemplateDetailCode,
detail.NonlabTemplateDetailName,
detail.NonlabTemplateDetailFlagActive,
)
if err != nil {
return ret, fmt.Errorf("query insert detail failed: %v", err)
}
}
if err := tx.Commit(); err != nil {
return ret, fmt.Errorf("commit query failed: %v", err)
}
s := strconv.Itoa(int(insertedID))
return mdnlt.GetMDNonLabTemplateByID(s)
}
func (mdnlt *MDNonLabTemplateServices) DeleteDataMDNLT(id string) (models.MDNonLabTemplate, error) {
logger, _ := zap.NewProduction()
var ret models.MDNonLabTemplate
@@ -133,3 +260,18 @@ func (mdnlt *MDNonLabTemplateServices) DeleteDataMDNLT(id string) (models.MDNonL
return mdnlt.GetMDNonLabTemplateByID(id)
}
func (mdnlt *MDNonLabTemplateServices) SaveInMemoryDetail(kode string, name string) (models.MDNonLabTemplateDetail, error) {
data := models.MDNonLabTemplateDetail{
NonlabTemplateDetailCode: kode,
NonlabTemplateDetailName: name,
}
mdnlt.addChan <- data
return data, nil
}
func (mdnlt *MDNonLabTemplateServices) ListMemoryDetail() ([]models.MDNonLabTemplateDetail, error) {
return mdnlt.DetailStore, nil
}