package goods import ( "errors" "spaceofcheng/services/models" "spaceofcheng/services/models/model" "spaceofcheng/services/utils" "strconv" "strings" "time" "github.com/yl10/kit/guid" "github.com/go-xorm/xorm" ) // GoodsDAO 当前数据库操作对象 type GoodsDAO struct { ctx *utils.Context db *xorm.Session } // NewGoodsDAO New Inst func NewGoodsDAO(ctx *utils.Context) *GoodsDAO { return &GoodsDAO{ ctx: ctx, db: ctx.DB, } } // GetGoodsListPageNavi 获取商品列表 // 管理端接口 func (m *GoodsDAO) GetGoodsListPageNavi(name, typeID, caseID string, limit []int) ([]GoodsWithSpec, int64, error) { sql := ` SELECT * FROM ta_goods WHERE case_id in ('` + strings.Replace(caseID, ",", "','", -1) + `') ` if name != "" { sql += ` AND goods_name LIKE '%` + name + `%' ` } if typeID != "" { sql += ` AND type_id = '` + typeID + `' ` } sql += ` AND status > ` + strconv.Itoa(models.STATUS_DEL) + ` ORDER BY create_date desc ` // sql += ` limit ` + strconv.Itoa(limit[0]) + ` OFFSET ` + strconv.Itoa(limit[1]) var goodsList []GoodsWithSpec cnt, err := utils.NewPageNaviEngine(m.ctx).GetPageList(&goodsList, sql, limit) if err != nil { return nil, 0, err } for inx, goods := range goodsList { specs, err := m.GetSpecWithPrice(goods.GoodsId) if err != nil { return nil, 0, err } goodsList[inx].Specs = specs imgs, err := m.GetGoodsImgByGoodsID(goods.GoodsId) if err != nil { return nil, 0, err } goodsList[inx].Images = imgs } return goodsList, cnt, nil } // GetGoodsListOfCase 获取案场商品列表 // 微信端 暂时没涉及分页 func (m *GoodsDAO) GetGoodsListOfCase(caseID string) ([]GoodsWithSpec, error) { var goodsList []GoodsWithSpec sql := "select * from ta_goods where case_id = ? and status = ? order by type_id, create_date" if err := m.db.SQL(sql, caseID, models.STATUS_NORMAL).Find(&goodsList); err != nil { return nil, err } for inx, goods := range goodsList { imgs, err := m.GetGoodsImgByGoodsID(goods.GoodsId) if err != nil { return nil, err } goodsList[inx].Images = imgs specs, err := m.GetSpecWithPrice(goods.GoodsId) if err != nil { return nil, err } goodsList[inx].Specs = specs } return goodsList, nil } // GetSpecWithPrice 获取商品规格 含 金额 func (m *GoodsDAO) GetSpecWithPrice(goodsID string) ([]SpecWithPrice, error) { sql := `SELECT t.*,s.goods_price FROM td_spec t JOIN ta_goods_spec s ON t.spec_id = s.spec_id WHERE t.status > ? AND s.goods_id = ? ` var specs []SpecWithPrice err := m.db.SQL(sql, models.STATUS_DEL, goodsID).Find(&specs) return specs, err } // GetGoodsByID 依据ID 获取商品 func (m *GoodsDAO) GetGoodsByID(id string) (*model.TaGoods, error) { goods := new(model.TaGoods) if _, err := m.db.Where("goods_id=?", id).Get(goods); err != nil { return nil, err } return goods, nil } // GetGoodsWithPriceByID 依据ID 获取商品 func (m *GoodsDAO) GetGoodsWithPriceByID(id, spec, caseID string) (*GoodsWithPrice, error) { goods := new(GoodsWithPrice) query := ` SELECT * FROM ta_goods t JOIN ta_goods_spec s ON t.goods_id = s.goods_id WHERE t.goods_id = ? AND t.case_id = ? AND s.spec_id = ? AND t.status = ? ` if _, err := m.db.SQL(query, id, caseID, spec, models.STATUS_NORMAL).Get(goods); err != nil { return nil, err } return goods, nil } // GetGoodsWithSpecByID 依据ID 获取商品(含规格) func (m *GoodsDAO) GetGoodsWithSpecByID(id string) (*GoodsWithSpec, error) { goods := new(model.TaGoods) if _, err := m.db.Where("goods_id=?", id).Get(goods); err != nil { return nil, err } var specs []SpecWithPrice query := ` SELECT t.*, s.goods_price FROM td_spec t JOIN ta_goods_spec s ON t.spec_id = s.spec_id WHERE s.goods_id = ? ` if err := m.db.SQL(query, id).Find(&specs); err != nil { return nil, err } imgs, err := m.GetGoodsImgByGoodsID(id) if err != nil { return nil, err } return &GoodsWithSpec{ TaGoods: *goods, Specs: specs, Images: imgs, }, nil } // SaveGoods 保存商品 func (m *GoodsDAO) SaveGoods(goods *model.TaGoods, images []string, specs []SpecWithPrice) error { userRaw := m.ctx.Get("user") if userRaw == nil { return errors.New("登录异常, 请登出重试") } user := userRaw.(model.SysUser) goods.GoodsId = guid.NewGUIDString() goods.Status = models.STATUS_NORMAL goods.CreateDate = time.Now().Local() goods.CreateUser = user.UserId goods.OrgId = user.OrgId // 商品图片 if images != nil && len(images) > 0 { goodsImages := make([]model.TaGoodsImg, 0) for _, img := range images { goodsImages = append(goodsImages, model.TaGoodsImg{ ImgId: guid.NewGUIDString(), GoodsId: goods.GoodsId, ImgUrl: img, Status: models.STATUS_NORMAL, }) } if _, err := m.db.Insert(&goodsImages); err != nil { return err } } // 规格 if specs != nil && len(specs) > 0 { goodsSpecs := make([]model.TaGoodsSpec, 0) for _, spec := range specs { goodsSpecs = append(goodsSpecs, model.TaGoodsSpec{ SpecId: spec.SpecId, GoodsId: goods.GoodsId, GoodsPrice: spec.GoodsPrice, }) } if _, err := m.db.Insert(&goodsSpecs); err != nil { return err } } if _, err := m.db.Insert(goods); err != nil { return err } return nil } // UpdateGoods 更新商品 func (m *GoodsDAO) UpdateGoods(goods *model.TaGoods, images []string, specs []SpecWithPrice) error { cols := []string{ "goods_name", "type_id", "status", "price", "case_id", } // 先清除旧数据 if _, err := m.db.Delete(&model.TaGoodsImg{GoodsId: goods.GoodsId}); err != nil { return err } // 商品图片 if images != nil && len(images) > 0 { goodsImages := make([]model.TaGoodsImg, 0) for _, img := range images { goodsImages = append(goodsImages, model.TaGoodsImg{ ImgId: guid.NewGUIDString(), GoodsId: goods.GoodsId, ImgUrl: img, Status: models.STATUS_NORMAL, }) } if _, err := m.db.Insert(&goodsImages); err != nil { return err } } // 先清除旧数据 if _, err := m.db.Delete(&model.TaGoodsSpec{GoodsId: goods.GoodsId}); err != nil { return err } // 规格 if specs != nil && len(specs) > 0 { goodsSpecs := make([]model.TaGoodsSpec, 0) for _, spec := range specs { goodsSpecs = append(goodsSpecs, model.TaGoodsSpec{ SpecId: spec.SpecId, GoodsId: goods.GoodsId, GoodsPrice: spec.GoodsPrice, }) } if _, err := m.db.Insert(&goodsSpecs); err != nil { return err } } if _, err := m.db.Where("goods_id=?", goods.GoodsId).Cols(cols...).Update(goods); err != nil { return err } return nil } // DeleteGoods 删除商品 func (m *GoodsDAO) DeleteGoods(id string) error { goods := new(model.TaGoods) goods.Status = models.STATUS_DEL if _, err := m.db.Where("goods_id=?", id).Cols("status").Update(goods); err != nil { return err } return nil } // GetGoodsImgByGoodsID 根据商品ID获取商品图片信息 func (m *GoodsDAO) GetGoodsImgByGoodsID(goodsid string) ([]model.TaGoodsImg, error) { var goodsimg []model.TaGoodsImg err := m.db.Where("goods_id=?", goodsid).Find(&goodsimg) return goodsimg, err } // GetGoodsBySpec 根据商品规格获取商品信息 func (m *GoodsDAO) GetGoodsBySpec(specid string) ([]model.TaGoods, error) { var goods []model.TaGoods sql := `select a.* from ta_goods a inner join ta_goods_spec b on a.goods_id=b.goods_id where a.status>` + strconv.Itoa(models.STATUS_DEL) + ` and b.spec_id='` + specid + `'` err := m.db.Sql(sql).Find(&goods) return goods, err } // GetGoodsByType 根据商品类型获取商品信息 func (m *GoodsDAO) GetGoodsByType(typeid string) ([]model.TaGoods, error) { var goods []model.TaGoods err := m.db.Where("status>"+strconv.Itoa(models.STATUS_DEL)).And("type_id=?", typeid).Find(&goods) return goods, err }