package handler import ( "net/http" "bj_power_wms/ent" "bj_power_wms/ent/material" "bj_power_wms/internal/svc" "github.com/zeromicro/go-zero/core/logx" ) // createMaterialHandler 创建物料档案 func createMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req struct { Code string `json:"code"` Name string `json:"name"` ShortName string `json:"shortName"` Spec string `json:"spec"` Unit string `json:"unit"` Description string `json:"description"` ManageMode int `json:"manageMode"` // 1批次/2序列号 MaterialType string `json:"materialType"` TemplateCode string `json:"templateCode"` } if err := parseJSON(r, &req); err != nil { fail(w, http.StatusBadRequest, "参数错误") return } if req.Code == "" || req.Name == "" { fail(w, http.StatusBadRequest, "code 和 name 必填") return } // 校验编码唯一 exists, err := ctx.EntClient.Material.Query(). Where(material.CodeEQ(req.Code)). Exist(ctx0()) if err != nil { fail(w, http.StatusInternalServerError, err.Error()) return } if exists { fail(w, http.StatusConflict, "物料编码已存在: "+req.Code) return } manageMode := req.ManageMode if manageMode == 0 { manageMode = 1 } m, err := ctx.EntClient.Material.Create(). SetCode(req.Code). SetName(req.Name). SetNillableShortName(strPtr(req.ShortName)). SetNillableSpec(strPtr(req.Spec)). SetNillableUnit(strPtr(req.Unit)). SetNillableDescription(strPtr(req.Description)). SetManageMode(manageMode). SetIsBatchManaged(manageMode == 1). SetIsSerialManaged(manageMode == 2). SetNillableMaterialType(strPtr(req.MaterialType)). SetNillableTemplateCode(strPtr(req.TemplateCode)). Save(ctx0()) if err != nil { logx.Errorf("create material failed: %v", err) fail(w, http.StatusInternalServerError, "创建物料失败: "+err.Error()) return } ok(w, m) } } // updateMaterialHandler 更新物料档案 func updateMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req struct { ID int `json:"id"` Name string `json:"name"` ShortName string `json:"shortName"` Spec string `json:"spec"` Unit string `json:"unit"` Description string `json:"description"` ManageMode int `json:"manageMode"` } if err := parseJSON(r, &req); err != nil || req.ID <= 0 { fail(w, http.StatusBadRequest, "参数错误") return } upd := ctx.EntClient.Material.UpdateOneID(req.ID) if req.Name != "" { upd.SetName(req.Name) } upd.SetShortName(req.ShortName) upd.SetSpec(req.Spec) upd.SetUnit(req.Unit) upd.SetDescription(req.Description) if req.ManageMode > 0 { upd.SetManageMode(req.ManageMode). SetIsBatchManaged(req.ManageMode == 1). SetIsSerialManaged(req.ManageMode == 2) } m, err := upd.Save(ctx0()) if err != nil { fail(w, http.StatusInternalServerError, "更新物料失败: "+err.Error()) return } ok(w, m) } } // queryMaterialsHandler 分页查询物料 func queryMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { page := atoi(r.URL.Query().Get("page"), 1) pageSize := atoi(r.URL.Query().Get("pageSize"), 20) keyword := r.URL.Query().Get("keyword") materialType := r.URL.Query().Get("materialType") templateCode := r.URL.Query().Get("templateCode") q := ctx.EntClient.Material.Query() if keyword != "" { q = q.Where( material.Or( material.CodeContains(keyword), material.NameContains(keyword), ), ) } if materialType != "" { q = q.Where(material.MaterialTypeEQ(materialType)) } if templateCode != "" { q = q.Where(material.TemplateCodeEQ(templateCode)) } total, err := q.Count(ctx0()) if err != nil { fail(w, http.StatusInternalServerError, err.Error()) return } list, err := q.Order(ent.Desc("id")). Offset((page - 1) * pageSize). Limit(pageSize). All(ctx0()) if err != nil { fail(w, http.StatusInternalServerError, err.Error()) return } ok(w, map[string]any{ "total": total, "list": list, "page": page, "pageSize": pageSize, }) } } // listMaterialsHandler 下拉框全量列表(不翻页) func listMaterialsHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { list, err := ctx.EntClient.Material.Query().Order(ent.Desc("id")).All(ctx0()) if err != nil { fail(w, http.StatusInternalServerError, err.Error()) return } ok(w, list) } } // getMaterialHandler 物料详情 func getMaterialHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id := atoi(r.URL.Query().Get("id"), 0) if id <= 0 { fail(w, http.StatusBadRequest, "id 必填") return } m, err := ctx.EntClient.Material.Get(ctx0(), id) if err != nil { fail(w, http.StatusNotFound, "物料不存在") return } ok(w, m) } }