package api import ( "box-cost/db/model" "box-cost/db/repo" "box-cost/log" "errors" "fmt" "time" "github.com/gin-gonic/gin" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" ) // 供应商管理 func Supplier(r *GinRouter) { // 创建供应商 r.POST("/supplier/create", CreateSupplier) // 获取供应商详情 r.GET("/supplier/detail/:id", GetSupplier) // 获取供应商列表 r.GET("/supplier/list", GetSuppliers) // 更新供应商 r.POST("/supplier/update", UpdateSupplier) // 删除供应商 r.POST("/supplier/delete/:id", DelSupplier) // 获取供应商列表 r.GET("/plan/supplier/list", GetPlanSuppliers) } // 创建供应商 func CreateSupplier(c *gin.Context, apictx *ApiSession) (interface{}, error) { var supplier model.Supplier err := c.ShouldBindJSON(&supplier) if err != nil { fmt.Println(err) return nil, errors.New("参数错误!") } ctx := apictx.CreateRepoCtx() if supplier.Name == "" { return nil, errors.New("供应商名为空") } if supplier.Address == "" { return nil, errors.New("供应商地址为空") } if supplier.Phone == "" { return nil, errors.New("供应商联系电话为空") } supplier.CreateTime = time.Now() supplier.UpdateTime = time.Now() result, err := repo.RepoAddDoc(ctx, repo.CollectionSupplier, &supplier) return result, err } // 获取供应商信息 func GetSupplier(c *gin.Context, apictx *ApiSession) (interface{}, error) { supplierId := c.Param("id") id, err := primitive.ObjectIDFromHex(supplierId) if err != nil { return nil, errors.New("非法id") } var supplier model.Supplier option := &repo.DocSearchOptions{ CollectName: repo.CollectionSupplier, Query: repo.Map{"_id": id}, } found, err := repo.RepoSeachDoc(apictx.CreateRepoCtx(), option, &supplier) if !found || err != nil { log.Info(err) return nil, errors.New("数据未找到") } return supplier, nil } // 获取供应商列表 func GetSuppliers(c *gin.Context, apictx *ApiSession) (interface{}, error) { page, size, query := UtilQueryPageSize(c) if cate, ok := query["category"]; ok { delete(query, "category") query["categorys"] = bson.M{"$in": []string{cate.(string)}} } option := &repo.PageSearchOptions{ CollectName: repo.CollectionSupplier, Query: query, Page: page, Size: size, Sort: bson.M{"createTime": -1}, } return repo.RepoPageSearch(apictx.CreateRepoCtx(), option) } func GetPlanSuppliers(c *gin.Context, apictx *ApiSession) (interface{}, error) { page, size, query := UtilQueryPageSize(c) //category =>根据内容查询 供应对应内容的供应商 emtyPage := &repo.PageResult{ Total: 0, Size: size, Page: page, List: []map[string]interface{}{}, } listOut := []map[string]interface{}{} if len(query) == 0 { option := &repo.PageSearchOptions{ CollectName: repo.CollectionSupplier, Query: query, Page: page, Size: size, Sort: bson.M{"createTime": -1}, } return repo.RepoPageSearch(apictx.CreateRepoCtx(), option) } if cate, ok := query["category"]; ok { delete(query, "category") option := &repo.PageSearchOptions{ CollectName: repo.CollectionSupplier, Query: repo.Map{"categorys": bson.M{"$in": []string{cate.(string)}}}, Page: page, Size: size, Sort: bson.M{"createTime": -1}, } return repo.RepoPageSearch(apictx.CreateRepoCtx(), option) } if query["matId"] != nil { matId := query["matId"].(string) if len(matId) < 1 { return nil, fmt.Errorf("matId(string)为空") } id, _ := primitive.ObjectIDFromHex(matId) ok, list := repo.RepoSeachDocsMap(apictx.CreateRepoCtx(), &repo.DocsSearchOptions{ CollectName: repo.CollectionSupplierMatprice, Query: repo.Map{"productId": id}, Project: []string{"supplierId"}, }) if !ok { return emtyPage, nil } listOut = list } if query["craftId"] != nil { // if query["craftId"] == nil { // return nil, fmt.Errorf("参数错误 craftId 或matId不能为空") // } cratf := &model.Craft{} ok, _ := repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{ Query: repo.Map{"_id": query["craftId"].(string)}, CollectName: repo.CollectionCraft, }, cratf) if !ok { return nil, fmt.Errorf("没有对应的工艺信息") } //查询工艺分类 pipleLine := []bson.M{ { "$lookup": bson.M{ "from": repo.CollectionCraft, "localField": "productId", "foreignField": "_id", "as": "craft_docs", }, }, { "$match": bson.M{ "craft_docs.0.category": cratf.Category, }, }, { "$project": bson.M{ "craft_docs": 0, "createTime": 0, "price": 0, "productId": 0, "updateTime": 0, }, }, } ctx := apictx.CreateRepoCtx() colls := ctx.Client.GetCollection(repo.CollectionSupplierCraftprice) findoptions := &options.AggregateOptions{} cur, err := colls.Aggregate(ctx.Ctx, pipleLine, findoptions) if err != nil { return nil, err } defer cur.Close(ctx.Ctx) err = cur.All(ctx.Ctx, &listOut) if err != nil { return nil, err } if len(listOut) < 1 { return emtyPage, nil } } if query["productId"] != nil { productId := query["productId"].(string) if len(productId) < 1 { return nil, fmt.Errorf("productId(string)为空") } id, _ := primitive.ObjectIDFromHex(productId) ok, list := repo.RepoSeachDocsMap(apictx.CreateRepoCtx(), &repo.DocsSearchOptions{ CollectName: repo.CollectionSupplierProductprice, Query: repo.Map{"productId": id}, Project: []string{"supplierId"}, }) if !ok { return emtyPage, nil } listOut = list } //获取供应商列表 suppliers := []primitive.ObjectID{} suppliersMap := map[string]bool{} for _, item := range listOut { if item["supplierId"] != nil { id, ok := item["supplierId"].(primitive.ObjectID) if !ok { continue } if !suppliersMap[id.Hex()] { suppliers = append(suppliers, id) suppliersMap[id.Hex()] = true } } } if len(suppliers) < 1 { return emtyPage, nil } option := &repo.PageSearchOptions{ CollectName: repo.CollectionSupplier, Query: repo.Map{"_id": bson.M{"$in": suppliers}}, Page: page, Size: size, Sort: bson.M{"createTime": -1}, } return repo.RepoPageSearch(apictx.CreateRepoCtx(), option) } // 更新供应商 func UpdateSupplier(c *gin.Context, apictx *ApiSession) (interface{}, error) { var supplier model.Supplier err := c.ShouldBindJSON(&supplier) if err != nil { return nil, errors.New("参数错误") } if supplier.Id.Hex() == "" { return nil, errors.New("id的为空") } supplier.UpdateTime = time.Now() return repo.RepoUpdateSetDoc(apictx.CreateRepoCtx(), repo.CollectionSupplier, supplier.Id.Hex(), &supplier) } // 删除供应商 func DelSupplier(c *gin.Context, apictx *ApiSession) (interface{}, error) { supplierId := c.Param("id") if supplierId == "" { return nil, errors.New("id为空") } return repo.RepoDeleteDoc(apictx.CreateRepoCtx(), repo.CollectionSupplier, supplierId) }