fix ui
All checks were successful
Deploy on Master Change / deploy (push) Successful in 1m30s

This commit is contained in:
2026-07-14 07:39:18 +07:00
parent 7d3fdefa3f
commit 487e9eb8ea
9 changed files with 145 additions and 17 deletions

View File

@@ -73,6 +73,7 @@ func AutoMigrate(db *gorm.DB) error {
&models.GuideLink{},
&models.AppDownload{},
&models.AppGuide{},
&models.LocalLeaveRequest{},
); err != nil {
return err
}

View File

@@ -565,11 +565,40 @@ func GetLeaveRequestsHandler(db *gorm.DB, qldtClient *qldt.Client) fiber.Handler
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
}
var data any
var data []map[string]interface{}
if err := json.Unmarshal(body, &data); err != nil {
var fallback any
if errFallback := json.Unmarshal(body, &fallback); errFallback == nil {
return c.JSON(fallback)
}
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to parse QLDT response"})
}
// Ghi đè trạng thái duyệt local nếu có
var localReqs []models.LocalLeaveRequest
if err := db.Find(&localReqs).Error; err == nil && len(localReqs) > 0 {
localMap := make(map[int64]string)
for _, lr := range localReqs {
localMap[lr.LeaveID] = lr.Status
}
for i, item := range data {
if idVal, ok := item["id"]; ok {
var idInt int64
switch v := idVal.(type) {
case float64:
idInt = int64(v)
case int64:
idInt = v
case int:
idInt = int64(v)
}
if localStatus, found := localMap[idInt]; found {
data[i]["status"] = localStatus
}
}
}
}
return c.JSON(data)
}
}
@@ -594,15 +623,24 @@ func UpdateLeaveStatusHandler(db *gorm.DB, qldtClient *qldt.Client) fiber.Handle
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Trạng thái phê duyệt không hợp lệ"})
}
token := GetQldtToken(db)
if token == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "QLDT_TOKEN chưa cấu hình"})
}
// 1. Gửi lệnh cập nhật status qua QLDT Portal API
body, err := qldtClient.UpdateLeaveStatus(context.Background(), token, leaveID, req.Status)
if err != nil {
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error(), "body": string(body)})
// 1. Lưu trạng thái đơn phép vào database local thay vì gọi QLDT Portal API
var localLeave models.LocalLeaveRequest
errLocal := db.Where("leave_id = ?", leaveID).First(&localLeave).Error
if errLocal == gorm.ErrRecordNotFound {
localLeave = models.LocalLeaveRequest{
LeaveID: leaveID,
Status: req.Status,
}
if err := db.Create(&localLeave).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Lỗi lưu đơn phép local: " + err.Error()})
}
} else if errLocal == nil {
localLeave.Status = req.Status
if err := db.Save(&localLeave).Error; err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Lỗi cập nhật đơn phép local: " + err.Error()})
}
} else {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": errLocal.Error()})
}
// 2. Nếu status là "Phê duyệt", tự động cập nhật điểm danh trong hệ thống của chúng ta thành "Nghỉ có phép"

View File

@@ -255,4 +255,16 @@ type AppGuide struct {
func (AppGuide) TableName() string { return "app_guides" }
// LocalLeaveRequest lưu trạng thái phê duyệt đơn xin nghỉ phép trên hệ thống nội bộ thay vì call QLĐT
type LocalLeaveRequest struct {
ID uint `gorm:"primaryKey" json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
LeaveID int64 `gorm:"column:leave_id;uniqueIndex;not null" json:"leaveId"`
Status string `gorm:"column:status;size:32;not null" json:"status"` // "Phê duyệt" hoặc "Từ chối"
}
func (LocalLeaveRequest) TableName() string { return "local_leave_requests" }

BIN
server/server_test.exe Normal file

Binary file not shown.