package balance_model import ( "fmt" "fohow.com/cache" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" "time" ) const ( silvers_tablename = "silvers" ) type Silver struct { Id int64 `orm:"column(id);pk" json:"id"` // int(11) UserId int64 `orm:"column(user_id);null" json:"user_id"` // int(11) WxUserId int64 `orm:"column(wx_user_id);null" json:"wx_user_id"` // int(11) Count int64 `orm:"column(count);null" json:"count"` // int(11) Source string `orm:"column(source);null" json:"source"` // varchar(20) SourceName string `orm:"-" json:"source_name"` // varchar(20) RelateId string `orm:"column(relate_id);null" json:"relate_id"` // varchar(255) Remark string `orm:"column(remark);null" json:"remark"` // varchar(255) CreatedAt time.Time `orm:"column(created_at);auto_now_add;type(datetime)" json:"-"` // datetime CTime int64 `orm:"-" json:"ctime"` // datetime UpdatedAt time.Time `orm:"column(updated_at);auto_now;type(datetime)" json:"-"` // datetime } func (self *Silver) TableName() string { return silvers_tablename } func (self *Silver) Create(wxUId, uId, c int64, s, rId, remark string) (item *Silver) { item = &Silver{ Count: c, WxUserId: wxUId, UserId: uId, Source: s, RelateId: rId, Remark: remark, } id, err := orm.NewOrm().Insert(item) if err != nil { beego.BeeLogger.Error("Create Silver err=[%s]", err) return nil } item.Id = id return item } func GetSilverById(id int64) *Silver { item := &Silver{} if err := orm.NewOrm().QueryTable(item). Filter("id", id).Limit(1). One(item); err != nil { beego.BeeLogger.Debug("GetSilverById(%s), err=%s", id, err) return nil } return item } //获取某人的银豆流列表 func GetSilverListByWxUId(wxUId, page, perPage int64, useCache bool) (list []*Silver) { k := fmt.Sprintf("silver_model.GetSilverList.wxUId(%d).page(%d).perPage(%d)", wxUId, page, perPage) if useCache { if s, ok := cache.Cache.Get(k).([]*Silver); ok { return s } } silver := new(Silver) qs := orm.NewOrm().QueryTable(silver) qs = qs.Filter("wx_user_id", wxUId) if _, err := qs.OrderBy("-created_at", "-id"). Limit(perPage, (page-1)*perPage).All(&list); err != nil { beego.BeeLogger.Debug("get silver with wxUId=%d, err=[%s]", wxUId, err) return nil } cache.Cache.Put(k, list, 10*time.Minute) return list } //获取某人的银豆流列表总条数 func GetSilverCountByWxUId(wxUId int64) int64 { item := new(Silver) o := orm.NewOrm() count, _ := o.QueryTable(item).Filter("wx_user_id", wxUId).Count() return count } //获取某个用户的余额 func GetUserTotalSilver(wxUId int64) int64 { type Ret struct { Count int64 } ret := &Ret{} o := orm.NewOrm() tbn := new(Silver).TableName() sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_user_id=?;", tbn) err := o.Raw(sql, wxUId).QueryRow(ret) if err != nil { beego.BeeLogger.Error("get user=[%d] total silver err=[%s]", wxUId, err) return 0 } if ret.Count < 0 { return 0 } return ret.Count } //获取某个source累计余额 func GetSilverCountBySource(wxUId int64, source string) int64 { type Ret struct { Count int64 } ret := &Ret{} o := orm.NewOrm() tbn := new(Silver).TableName() sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_user_id=? and source=?", tbn) err := o.Raw(sql, wxUId, source).QueryRow(ret) if err != nil { beego.BeeLogger.Error("get user=[%d] total silver err=[%s]", wxUId, err) return 0 } if ret.Count < 0 { return 0 } return ret.Count } func GetSilverBySourceAndRId(source, rId string) *Silver { item := &Silver{} if err := orm.NewOrm().QueryTable(item). Filter("source", source). Filter("relate_id", rId).Limit(1). One(item); err != nil { beego.BeeLogger.Info("GetSilverBySourceAndRId(%s,%s), err=%s", source, rId, err) return nil } return item } func GetSilverByUIdAndRIdAndSource(uId int64, rId, source string) *Silver { item := &Silver{} if err := orm.NewOrm().QueryTable(item). Filter("user_id", uId). Filter("source", source). Filter("relate_id", rId).OrderBy("-created_at").Limit(1). One(item); err != nil { beego.BeeLogger.Info("GetSilverByUIdAndRIdAndSource(%d,%s,%s), err=%s", uId, rId, source, err) return nil } return item } func GetBuySilverByRelateId(rId string, useCache bool) *Silver { k := fmt.Sprintf("silver_model.GetBuySilverByRelateId[%s]", rId) if useCache { if order, ok := cache.Cache.Get(k).(*Silver); ok { return order } } //lt < 0 item := &Silver{} if err := orm.NewOrm().QueryTable(item).Filter("relate_id", rId).Filter("count__lt", 0).Limit(1). One(item); err != nil { beego.BeeLogger.Info("GetBuySilverByRelateId(%s), err=%s", rId, err) return nil } cache.Cache.Put(k, item, 5*time.Minute) return item } func GetRefundSilverByRelateId(rId string, useCache bool) *Silver { k := fmt.Sprintf("silver_model.GetRefundSilverByRelateId[%s]", rId) if useCache { if order, ok := cache.Cache.Get(k).(*Silver); ok { return order } } //gt > 0 item := &Silver{} if err := orm.NewOrm().QueryTable(item).Filter("relate_id", rId).Filter("count__gt", 0).Limit(1). One(item); err != nil { beego.BeeLogger.Info("GetRefundSilverByRelateId(%s), err=%s", rId, err) return nil } cache.Cache.Put(k, item, 5*time.Minute) return item } //返回source名称 func (self *Silver) GetSourceName() string { sourceName := "" switch self.Source { case CASH_SOURCE_SHOP_BENEFIT: sourceName = CASH_SOURCE_SHOP_BENEFIT_NAME case CASH_SOURCE_PRODUCT_BENEFIT: sourceName = CASH_SOURCE_PRODUCT_BENEFIT_NAME case CASH_SOURCE_PROJECT_BENEFIT: sourceName = CASH_SOURCE_PROJECT_BENEFIT_NAME case CASH_SOURCE_TAKE_CASH: sourceName = CASH_SOURCE_TAKE_CASH_NAME case CASH_TO_BALANCE: sourceName = CASH_TO_BALANCE_NAME case CASH_SOURCE_PRODUCT_SALE: sourceName = CASH_SOURCE_PRODUCT_SALE_NAME case CASH_SOURCE_SALE_REWARD: sourceName = CASH_SOURCE_SALE_REWARD_NAME case CASH_SOURCE_PROJECT_INVEST: sourceName = CASH_SOURCE_PROJECT_INVEST_NAME case CASH_SOURCE_RESERVE_ACT_RETURN: sourceName = CASH_SOURCE_RESERVE_ACT_RETURN_NAME case CASH_SOURCE_EXTRACT_REJECT: sourceName = CASH_SOURCE_EXTRACT_REJECT_NAME case CASH_SOURCE_RECHARGE_CASH: sourceName = CASH_SOURCE_RECHARGE_CASH_NAME case CASH_SOURCE_RECEIVE_BUYBACK: sourceName = CASH_SOURCE_RECEIVE_BUYBACK_NAME case CASH_SOURCE_DEDUCT: sourceName = CASH_SOURCE_DEDUCT_NAME case CASH_SOURCE_LOAN: sourceName = CASH_SOURCE_LOAN_NAME case CASH_SOURCE_PROJECT_REFUND: sourceName = CASH_SOURCE_PROJECT_REFUND case CASH_SOURCE_PRODUCT_REFUND: sourceName = CASH_SOURCE_PRODUCT_REFUND_NAME case CASH_SOURCE_PRODUCT_PART_REFUND: sourceName = CASH_SOURCE_PRODUCT_PART_REFUND_NAME case CASH_SOURCE_CORRECT: sourceName = CASH_SOURCE_CORRECT_NAME case CASH_SOURCE_PROJECT_LOAN: sourceName = CASH_SOURCE_PROJECT_LOAN_NAME case CASH_SOURCE_GOOD_PAYMENT: sourceName = CASH_SOURCE_GOOD_PAYMENT_NAME case CASH_SOURCE_DOLLAR_WIN: sourceName = CASH_SOURCE_DOLLAR_WIN_NAME case CASH_SOURCE_DOLLAR_WIN_RETURN: sourceName = CASH_SOURCE_DOLLAR_WIN_RETURN_NAME case FX_CASH_SOURCE_PRODUCT_BENEFIT: sourceName = FX_CASH_SOURCE_PRODUCT_BENEFIT_NAME // case BALANCE_SOURCE_PART_REFUNDED: // sourceName = BALANCE_SOURCE_PART_REFUNDED_NAME } return sourceName }