package handler import ( "net/http" "time" "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序列号 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). 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) materialCode := r.URL.Query().Get("materialCode") name := r.URL.Query().Get("name") spec := r.URL.Query().Get("spec") manageMode := atoi(r.URL.Query().Get("manageMode"), 0) startDate := r.URL.Query().Get("startDate") endDate := r.URL.Query().Get("endDate") keyword := r.URL.Query().Get("keyword") // 兼容旧版,作为物料编码/名称兜底 q := ctx.EntClient.Material.Query() if materialCode != "" { q = q.Where(material.CodeContains(materialCode)) } if name != "" { q = q.Where(material.NameContains(name)) } if spec != "" { q = q.Where(material.SpecContains(spec)) } if manageMode != 0 { q = q.Where(material.ManageModeEQ(manageMode)) } if keyword != "" { q = q.Where( material.Or( material.CodeContains(keyword), material.NameContains(keyword), ), ) } if startDate != "" { if t, err := time.ParseInLocation("2006-01-02", startDate, time.Local); err == nil { q = q.Where(material.CreatedAtGTE(t.Unix())) } } if endDate != "" { if t, err := time.ParseInLocation("2006-01-02", endDate, time.Local); err == nil { q = q.Where(material.CreatedAtLTE(t.Add(24 * time.Hour).Unix())) } } total, err := q.Count(ctx0()) if err != nil { fail(w, http.StatusInternalServerError, err.Error()) return } list, err := q.Order(ent.Desc("created_at")). 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("created_at")).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) } }