feat: product.
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"hr_receiver/config"
|
||||
"hr_receiver/models"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type ProjectProductTemplateAdminController struct {
|
||||
DB *gorm.DB
|
||||
}
|
||||
|
||||
type projectProductTemplateItem struct {
|
||||
ID uint `json:"id"`
|
||||
ProjectTypeCode string `json:"projectTypeCode"`
|
||||
ProjectTypeName string `json:"projectTypeName"`
|
||||
ProductCode string `json:"productCode"`
|
||||
ProductName string `json:"productName"`
|
||||
Quantity *int `json:"quantity"`
|
||||
QuantityRule string `json:"quantityRule"`
|
||||
IsOptional bool `json:"isOptional"`
|
||||
Notes string `json:"notes"`
|
||||
Sort int `json:"sort"`
|
||||
}
|
||||
|
||||
func NewProjectProductTemplateAdminController() *ProjectProductTemplateAdminController {
|
||||
return &ProjectProductTemplateAdminController{DB: config.DB}
|
||||
}
|
||||
|
||||
func (pc *ProjectProductTemplateAdminController) List(c *gin.Context) {
|
||||
var items []models.ProjectProductTemplate
|
||||
query := pc.DB.Model(&models.ProjectProductTemplate{}).Order("project_type_code ASC, sort ASC, id ASC")
|
||||
|
||||
if projectTypeCode := strings.TrimSpace(c.Query("projectTypeCode")); projectTypeCode != "" {
|
||||
query = query.Where("project_type_code = ?", strings.ToLower(projectTypeCode))
|
||||
}
|
||||
|
||||
if err := query.Find(&items).Error; err != nil {
|
||||
writeError(c, http.StatusInternalServerError, "failed to query project product templates")
|
||||
return
|
||||
}
|
||||
|
||||
projectTypeCodes := make([]string, 0)
|
||||
projectTypeSet := make(map[string]struct{})
|
||||
productCodes := make([]string, 0)
|
||||
productSet := make(map[string]struct{})
|
||||
for _, item := range items {
|
||||
if _, ok := projectTypeSet[item.ProjectTypeCode]; !ok {
|
||||
projectTypeSet[item.ProjectTypeCode] = struct{}{}
|
||||
projectTypeCodes = append(projectTypeCodes, item.ProjectTypeCode)
|
||||
}
|
||||
if _, ok := productSet[item.ProductCode]; !ok {
|
||||
productSet[item.ProductCode] = struct{}{}
|
||||
productCodes = append(productCodes, item.ProductCode)
|
||||
}
|
||||
}
|
||||
|
||||
projectTypeNameMap := make(map[string]string)
|
||||
if len(projectTypeCodes) > 0 {
|
||||
var projectTypes []models.ProjectType
|
||||
if err := pc.DB.Where("code IN ?", projectTypeCodes).Find(&projectTypes).Error; err != nil {
|
||||
writeError(c, http.StatusInternalServerError, "failed to query project types")
|
||||
return
|
||||
}
|
||||
for _, item := range projectTypes {
|
||||
projectTypeNameMap[item.Code] = item.Name
|
||||
}
|
||||
}
|
||||
|
||||
productNameMap := make(map[string]string)
|
||||
if len(productCodes) > 0 {
|
||||
var productDefinitions []models.ProductDefinition
|
||||
if err := pc.DB.Where("code IN ?", productCodes).Find(&productDefinitions).Error; err != nil {
|
||||
writeError(c, http.StatusInternalServerError, "failed to query product definitions")
|
||||
return
|
||||
}
|
||||
for _, item := range productDefinitions {
|
||||
productNameMap[item.Code] = item.Name
|
||||
}
|
||||
}
|
||||
|
||||
result := make([]projectProductTemplateItem, 0, len(items))
|
||||
for _, item := range items {
|
||||
result = append(result, projectProductTemplateItem{
|
||||
ID: item.ID,
|
||||
ProjectTypeCode: item.ProjectTypeCode,
|
||||
ProjectTypeName: projectTypeNameMap[item.ProjectTypeCode],
|
||||
ProductCode: item.ProductCode,
|
||||
ProductName: productNameMap[item.ProductCode],
|
||||
Quantity: item.Quantity,
|
||||
QuantityRule: item.QuantityRule,
|
||||
IsOptional: item.IsOptional,
|
||||
Notes: item.Notes,
|
||||
Sort: item.Sort,
|
||||
})
|
||||
}
|
||||
|
||||
writeSuccess(c, http.StatusOK, "query success", result)
|
||||
}
|
||||
Reference in New Issue
Block a user