feat/things-munaja: device and mcu order

This commit is contained in:
2025-11-20 13:39:51 +07:00
parent 279636682d
commit 7c600dce5f
7 changed files with 85 additions and 3 deletions
@@ -15,6 +15,7 @@ type CreateDto struct {
type ReadListDto struct { type ReadListDto struct {
FilterDto FilterDto
Includes string `json:"includes"` Includes string `json:"includes"`
Sort string `json:"sort"`
Pagination ecore.Pagination Pagination ecore.Pagination
} }
@@ -17,6 +17,7 @@ import (
// internal - domain - main-entities // internal - domain - main-entities
ed "simrs-vx/internal/domain/main-entities/doctor" ed "simrs-vx/internal/domain/main-entities/doctor"
ee "simrs-vx/internal/domain/main-entities/encounter" ee "simrs-vx/internal/domain/main-entities/encounter"
emoib "simrs-vx/internal/domain/main-entities/mcu-order-item/base"
) )
type CreateDto struct { type CreateDto struct {
@@ -85,7 +86,8 @@ type ResponseDto struct {
ExaminationDate *time.Time `json:"examinationDate"` ExaminationDate *time.Time `json:"examinationDate"`
Number uint8 `json:"number"` Number uint8 `json:"number"`
Temperature float64 `json:"temperature"` Temperature float64 `json:"temperature"`
UrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"urgencyLevel_code""` UrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"urgencyLevel_code"`
Items []*emoib.McuOrderItem `json:"items"`
} }
func (d McuOrder) ToResponse() ResponseDto { func (d McuOrder) ToResponse() ResponseDto {
@@ -100,6 +102,7 @@ func (d McuOrder) ToResponse() ResponseDto {
Number: d.Number, Number: d.Number,
Temperature: d.Temperature, Temperature: d.Temperature,
UrgencyLevel_Code: d.UrgencyLevel_Code, UrgencyLevel_Code: d.UrgencyLevel_Code,
Items: d.Items,
} }
resp.Main = d.Main resp.Main = d.Main
return resp return resp
@@ -4,6 +4,7 @@ import (
ecore "simrs-vx/internal/domain/base-entities/core" ecore "simrs-vx/internal/domain/base-entities/core"
ed "simrs-vx/internal/domain/main-entities/doctor" ed "simrs-vx/internal/domain/main-entities/doctor"
ee "simrs-vx/internal/domain/main-entities/encounter" ee "simrs-vx/internal/domain/main-entities/encounter"
emoib "simrs-vx/internal/domain/main-entities/mcu-order-item/base"
"time" "time"
ercl "simrs-vx/internal/domain/references/clinical" ercl "simrs-vx/internal/domain/references/clinical"
@@ -23,6 +24,11 @@ type McuOrder struct {
Temperature float64 `json:"temperature"` Temperature float64 `json:"temperature"`
UrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"urgencyLevel_code" gorm:"not null;size:15"` UrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"urgencyLevel_code" gorm:"not null;size:15"`
Scope_Code ercl.McuScopeCode `json:"scope_code" gorm:"index;size:10"` Scope_Code ercl.McuScopeCode `json:"scope_code" gorm:"index;size:10"`
Items []*emoib.McuOrderItem `json:"items" gorm:"foreignKey:McuOrder_Id;references:Id"`
}
func (d McuOrder) IsNotNew() bool {
return d.Status_Code != erc.DSCNew
} }
func (d McuOrder) IsCompleted() bool { func (d McuOrder) IsCompleted() bool {
@@ -173,6 +173,7 @@ func SetRoutes() http.Handler {
"POST /": mcuorder.O.Create, "POST /": mcuorder.O.Create,
"PATCH /{id}": mcuorder.O.Update, "PATCH /{id}": mcuorder.O.Update,
"DELETE /{id}": mcuorder.O.Delete, "DELETE /{id}": mcuorder.O.Delete,
"PATCH /{id}/submit": mcuorder.O.Submit,
"PATCH /{id}/complete": mcuorder.O.Complete, "PATCH /{id}/complete": mcuorder.O.Complete,
"PATCH /{id}/set-schedule": mcuorder.O.SetSchedule, "PATCH /{id}/set-schedule": mcuorder.O.SetSchedule,
}) })
@@ -85,6 +85,18 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
rw.DataResponse(w, res, err) rw.DataResponse(w, res, err)
} }
func (obj myBase) Submit(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint(id)
res, err := u.Submit(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) { func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id")) id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 { if id <= 0 {
@@ -52,8 +52,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De
Scopes(gh.Preload(input.Includes)). Scopes(gh.Preload(input.Includes)).
Scopes(gh.Filter(input.FilterDto)). Scopes(gh.Filter(input.FilterDto)).
Count(&count). Count(&count).
Scopes(gh.Paginate(input, &pagination)). Scopes(gh.Sort(input.Sort)).
Order("\"CreatedAt\" DESC") Scopes(gh.Paginate(input, &pagination))
if err := tx.Find(&data).Error; err != nil { if err := tx.Find(&data).Error; err != nil {
if err == gorm.ErrRecordNotFound { if err == gorm.ErrRecordNotFound {
@@ -324,6 +324,65 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
} }
func Submit(input e.ReadDetailDto) (*d.Data, error) {
var data *e.McuOrder
var err error
event := pl.Event{
Feature: "Process",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "process")
err = dg.I.Transaction(func(tx *gorm.DB) error {
data, err = ReadDetailData(input, &event, tx)
if err != nil {
return err
}
if data.IsNotNew() {
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: "data-state-mismatch",
Detail: "prescription is not in new state",
Raw: errors.New("prescription is not in new state"),
}
return pl.SetLogError(&event, input)
}
data.Status_Code = erc.DSCSubmited
if err := tx.Save(&data).Error; err != nil {
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: "data-update-fail",
Detail: "Database update failed",
Raw: err,
}
return pl.SetLogError(&event, input)
}
pl.SetLogInfo(&event, nil, "complete")
return nil
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "single-data",
"status": "submited",
},
Data: data.ToResponse(),
}, nil
}
func Complete(input e.ReadDetailDto) (*d.Data, error) { func Complete(input e.ReadDetailDto) (*d.Data, error) {
var data *e.McuOrder var data *e.McuOrder
var err error var err error