|
|
@@ -0,0 +1,251 @@
|
|
|
+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
|
|
|
+}
|