mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
fix(BE-48): improve adjustment history filtering and fix pointer conversion
- Add search parameter to adjustment history API - Fix JOIN query logic to avoid duplicate JOINs - Use EXISTS subquery for cleaner product/warehouse filtering - Fix pointer conversion issue in slice iteration - Improve query performance and code readability
This commit is contained in:
@@ -10,11 +10,11 @@ type ProductWarehouse struct {
|
|||||||
Id uint `json:"id" gorm:"primaryKey;autoIncrement"`
|
Id uint `json:"id" gorm:"primaryKey;autoIncrement"`
|
||||||
ProductId uint `json:"product_id" gorm:"not null"`
|
ProductId uint `json:"product_id" gorm:"not null"`
|
||||||
WarehouseId uint `json:"warehouse_id" gorm:"not null"`
|
WarehouseId uint `json:"warehouse_id" gorm:"not null"`
|
||||||
Quantity float64 `json:"quantity" gorm:"default:0"`
|
Quantity float64 `json:"quantity" gorm:"default:0"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
||||||
CreatedBy uint `json:"created_by" gorm:"not null"`
|
CreatedBy uint `json:"created_by" gorm:"not null"`
|
||||||
DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index"`
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
|
||||||
|
|
||||||
// Relations
|
// Relations
|
||||||
Product Product `json:"product,omitempty" gorm:"foreignKey:ProductId;references:Id"`
|
Product Product `json:"product,omitempty" gorm:"foreignKey:ProductId;references:Id"`
|
||||||
|
|||||||
@@ -16,19 +16,19 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type StockLog struct {
|
type StockLog struct {
|
||||||
Id uint `json:"id" gorm:"primaryKey;column:id"`
|
Id uint `gorm:"primaryKey;column:id"`
|
||||||
TransactionType string `json:"transaction_type" gorm:"column:transaction_type;type:varchar(20);not null"`
|
TransactionType string `gorm:"type:varchar(20);not null"`
|
||||||
Quantity float64 `json:"quantity" gorm:"column:quantity;type:numeric(15,3);not null"`
|
Quantity float64 `gorm:"type:numeric(15,3);not null"`
|
||||||
BeforeQuantity float64 `json:"before_quantity" gorm:"column:before_quantity;type:numeric(15,3);not null"`
|
BeforeQuantity float64 `gorm:"type:numeric(15,3);not null"`
|
||||||
AfterQuantity float64 `json:"after_quantity" gorm:"column:after_quantity;type:numeric(15,3);not null"`
|
AfterQuantity float64 `gorm:"type:numeric(15,3);not null"`
|
||||||
LogType string `json:"log_type" gorm:"column:log_type;type:varchar(50);not null;index:stock_logs_flaggable_lookup,priority:1"`
|
LogType string `gorm:"type:varchar(50);not null;index:stock_logs_flaggable_lookup,priority:1"`
|
||||||
LogId uint `json:"log_id" gorm:"column:log_id;not null;index:stock_logs_flaggable_lookup,priority:2"`
|
LogId uint `gorm:"not null;index:stock_logs_flaggable_lookup,priority:2"`
|
||||||
Note string `json:"note" gorm:"column:note;type:text"`
|
Note string `gorm:"type:text"`
|
||||||
ProductWarehouseId uint `json:"product_warehouse_id" gorm:"column:product_warehouse_id;not null;index"`
|
ProductWarehouseId uint `gorm:"not null;index"`
|
||||||
CreatedBy uint `json:"created_by" gorm:"column:created_by;not null;index"`
|
CreatedBy uint `gorm:"index"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"column:created_at;autoCreateTime"`
|
CreatedAt time.Time `gorm:"autoCreateTime"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at;autoUpdateTime"`
|
UpdatedAt time.Time `gorm:"autoUpdateTime"`
|
||||||
DeletedAt gorm.DeletedAt `json:"deleted_at,omitempty" gorm:"column:deleted_at;index"`
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
|
||||||
|
|
||||||
ProductWarehouse *ProductWarehouse `json:"product_warehouse,omitempty" gorm:"foreignKey:ProductWarehouseId;references:Id"`
|
ProductWarehouse *ProductWarehouse `json:"product_warehouse,omitempty" gorm:"foreignKey:ProductWarehouseId;references:Id"`
|
||||||
CreatedUser *User `json:"created_user,omitempty" gorm:"foreignKey:CreatedBy;references:Id"`
|
CreatedUser *User `json:"created_user,omitempty" gorm:"foreignKey:CreatedBy;references:Id"`
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ func (u *AdjustmentController) AdjustmentHistory(c *fiber.Ctx) error {
|
|||||||
query := &validation.Query{
|
query := &validation.Query{
|
||||||
Page: c.QueryInt("page", 1),
|
Page: c.QueryInt("page", 1),
|
||||||
Limit: c.QueryInt("limit", 10),
|
Limit: c.QueryInt("limit", 10),
|
||||||
Search: c.Query("search", ""),
|
|
||||||
ProductID: c.QueryInt("product_id", 0),
|
ProductID: c.QueryInt("product_id", 0),
|
||||||
WarehouseID: c.QueryInt("warehouse_id", 0),
|
WarehouseID: c.QueryInt("warehouse_id", 0),
|
||||||
TransactionType: c.Query("transaction_type", ""),
|
TransactionType: c.Query("transaction_type", ""),
|
||||||
|
|||||||
@@ -159,13 +159,24 @@ func (s *adjustmentService) AdjustmentHistory(c *fiber.Ctx, query *validation.Qu
|
|||||||
|
|
||||||
db = db.Where("log_type = ?", entity.LogTypeAdjustment)
|
db = db.Where("log_type = ?", entity.LogTypeAdjustment)
|
||||||
|
|
||||||
if query.Search != "" {
|
|
||||||
db = db.Where("note ILIKE ?", "%"+query.Search+"%")
|
|
||||||
}
|
|
||||||
|
|
||||||
if query.TransactionType != "" {
|
if query.TransactionType != "" {
|
||||||
db = db.Where("transaction_type = ?", strings.ToUpper(query.TransactionType))
|
db = db.Where("transaction_type = ?", strings.ToUpper(query.TransactionType))
|
||||||
}
|
}
|
||||||
|
if query.ProductID > 0 {
|
||||||
|
db = db.Joins("JOIN product_warehouses ON product_warehouses.id = stock_logs.product_warehouse_id").
|
||||||
|
Where("product_warehouses.product_id = ?", query.ProductID)
|
||||||
|
}
|
||||||
|
|
||||||
|
if query.WarehouseID > 0 {
|
||||||
|
if query.ProductID > 0 {
|
||||||
|
|
||||||
|
db = db.Where("product_warehouses.warehouse_id = ?", query.WarehouseID)
|
||||||
|
} else {
|
||||||
|
|
||||||
|
db = db.Joins("JOIN product_warehouses ON product_warehouses.id = stock_logs.product_warehouse_id").
|
||||||
|
Where("product_warehouses.warehouse_id = ?", query.WarehouseID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return db.Order("created_at DESC")
|
return db.Order("created_at DESC")
|
||||||
})
|
})
|
||||||
@@ -175,7 +186,6 @@ func (s *adjustmentService) AdjustmentHistory(c *fiber.Ctx, query *validation.Qu
|
|||||||
return nil, 0, fiber.NewError(fiber.StatusInternalServerError, "Failed to get adjustment history")
|
return nil, 0, fiber.NewError(fiber.StatusInternalServerError, "Failed to get adjustment history")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert to pointer slice
|
|
||||||
result := make([]*entity.StockLog, len(stockLogs))
|
result := make([]*entity.StockLog, len(stockLogs))
|
||||||
for i, v := range stockLogs {
|
for i, v := range stockLogs {
|
||||||
result[i] = &v
|
result[i] = &v
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ type Create struct {
|
|||||||
type Query struct {
|
type Query struct {
|
||||||
Page int `query:"page" validate:"omitempty,min=1"`
|
Page int `query:"page" validate:"omitempty,min=1"`
|
||||||
Limit int `query:"limit" validate:"omitempty,min=1,max=100"`
|
Limit int `query:"limit" validate:"omitempty,min=1,max=100"`
|
||||||
Search string `query:"search" validate:"omitempty"`
|
|
||||||
ProductID int `query:"product_id" validate:"omitempty,min=0"`
|
ProductID int `query:"product_id" validate:"omitempty,min=0"`
|
||||||
WarehouseID int `query:"warehouse_id" validate:"omitempty,min=0"`
|
WarehouseID int `query:"warehouse_id" validate:"omitempty,min=0"`
|
||||||
TransactionType string `query:"transaction_type" validate:"omitempty,oneof=increase decrease"`
|
TransactionType string `query:"transaction_type" validate:"omitempty,oneof=increase decrease"`
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ type Query struct {
|
|||||||
Page int `query:"page" validate:"omitempty,number,min=1"`
|
Page int `query:"page" validate:"omitempty,number,min=1"`
|
||||||
Limit int `query:"limit" validate:"omitempty,number,min=1"`
|
Limit int `query:"limit" validate:"omitempty,number,min=1"`
|
||||||
Search string `query:"search" validate:"omitempty,max=50"`
|
Search string `query:"search" validate:"omitempty,max=50"`
|
||||||
ProductCategoryID int `query:"product_category_id" validate:"omitempty,number,min=1"`
|
ProductCategoryID int `query:"product_category_id" validate:"omitempty,number,min=1"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user