silver.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package balance_model
  2. import (
  3. "fmt"
  4. "fohow.com/cache"
  5. "github.com/astaxie/beego"
  6. "github.com/astaxie/beego/orm"
  7. "time"
  8. )
  9. const (
  10. silvers_tablename = "silvers"
  11. )
  12. type Silver struct {
  13. Id int64 `orm:"column(id);pk" json:"id"` // int(11)
  14. UserId int64 `orm:"column(user_id);null" json:"user_id"` // int(11)
  15. WxUserId int64 `orm:"column(wx_user_id);null" json:"wx_user_id"` // int(11)
  16. Count int64 `orm:"column(count);null" json:"count"` // int(11)
  17. Source string `orm:"column(source);null" json:"source"` // varchar(20)
  18. SourceName string `orm:"-" json:"source_name"` // varchar(20)
  19. RelateId string `orm:"column(relate_id);null" json:"relate_id"` // varchar(255)
  20. Remark string `orm:"column(remark);null" json:"remark"` // varchar(255)
  21. CreatedAt time.Time `orm:"column(created_at);auto_now_add;type(datetime)" json:"-"` // datetime
  22. CTime int64 `orm:"-" json:"ctime"` // datetime
  23. UpdatedAt time.Time `orm:"column(updated_at);auto_now;type(datetime)" json:"-"` // datetime
  24. }
  25. func (self *Silver) TableName() string {
  26. return silvers_tablename
  27. }
  28. func (self *Silver) Create(wxUId, uId, c int64, s, rId, remark string) (item *Silver) {
  29. item = &Silver{
  30. Count: c,
  31. WxUserId: wxUId,
  32. UserId: uId,
  33. Source: s,
  34. RelateId: rId,
  35. Remark: remark,
  36. }
  37. id, err := orm.NewOrm().Insert(item)
  38. if err != nil {
  39. beego.BeeLogger.Error("Create Silver err=[%s]", err)
  40. return nil
  41. }
  42. item.Id = id
  43. return item
  44. }
  45. func GetSilverById(id int64) *Silver {
  46. item := &Silver{}
  47. if err := orm.NewOrm().QueryTable(item).
  48. Filter("id", id).Limit(1).
  49. One(item); err != nil {
  50. beego.BeeLogger.Debug("GetSilverById(%s), err=%s",
  51. id, err)
  52. return nil
  53. }
  54. return item
  55. }
  56. //获取某人的银豆流列表
  57. func GetSilverListByWxUId(wxUId, page, perPage int64, useCache bool) (list []*Silver) {
  58. k := fmt.Sprintf("silver_model.GetSilverList.wxUId(%d).page(%d).perPage(%d)", wxUId, page, perPage)
  59. if useCache {
  60. if s, ok := cache.Cache.Get(k).([]*Silver); ok {
  61. return s
  62. }
  63. }
  64. silver := new(Silver)
  65. qs := orm.NewOrm().QueryTable(silver)
  66. qs = qs.Filter("wx_user_id", wxUId)
  67. if _, err := qs.OrderBy("-created_at", "-id").
  68. Limit(perPage, (page-1)*perPage).All(&list); err != nil {
  69. beego.BeeLogger.Debug("get silver with wxUId=%d, err=[%s]", wxUId, err)
  70. return nil
  71. }
  72. cache.Cache.Put(k, list, 10*time.Minute)
  73. return list
  74. }
  75. //获取某人的银豆流列表总条数
  76. func GetSilverCountByWxUId(wxUId int64) int64 {
  77. item := new(Silver)
  78. o := orm.NewOrm()
  79. count, _ := o.QueryTable(item).Filter("wx_user_id", wxUId).Count()
  80. return count
  81. }
  82. //获取某个用户的余额
  83. func GetUserTotalSilver(wxUId int64) int64 {
  84. type Ret struct {
  85. Count int64
  86. }
  87. ret := &Ret{}
  88. o := orm.NewOrm()
  89. tbn := new(Silver).TableName()
  90. sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_user_id=?;", tbn)
  91. err := o.Raw(sql, wxUId).QueryRow(ret)
  92. if err != nil {
  93. beego.BeeLogger.Error("get user=[%d] total silver err=[%s]", wxUId, err)
  94. return 0
  95. }
  96. if ret.Count < 0 {
  97. return 0
  98. }
  99. return ret.Count
  100. }
  101. //获取某个source累计余额
  102. func GetSilverCountBySource(wxUId int64, source string) int64 {
  103. type Ret struct {
  104. Count int64
  105. }
  106. ret := &Ret{}
  107. o := orm.NewOrm()
  108. tbn := new(Silver).TableName()
  109. sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_user_id=? and source=?", tbn)
  110. err := o.Raw(sql, wxUId, source).QueryRow(ret)
  111. if err != nil {
  112. beego.BeeLogger.Error("get user=[%d] total silver err=[%s]", wxUId, err)
  113. return 0
  114. }
  115. if ret.Count < 0 {
  116. return 0
  117. }
  118. return ret.Count
  119. }
  120. func GetSilverBySourceAndRId(source, rId string) *Silver {
  121. item := &Silver{}
  122. if err := orm.NewOrm().QueryTable(item).
  123. Filter("source", source).
  124. Filter("relate_id", rId).Limit(1).
  125. One(item); err != nil {
  126. beego.BeeLogger.Info("GetSilverBySourceAndRId(%s,%s), err=%s",
  127. source, rId, err)
  128. return nil
  129. }
  130. return item
  131. }
  132. func GetSilverByUIdAndRIdAndSource(uId int64, rId, source string) *Silver {
  133. item := &Silver{}
  134. if err := orm.NewOrm().QueryTable(item).
  135. Filter("user_id", uId).
  136. Filter("source", source).
  137. Filter("relate_id", rId).OrderBy("-created_at").Limit(1).
  138. One(item); err != nil {
  139. beego.BeeLogger.Info("GetSilverByUIdAndRIdAndSource(%d,%s,%s), err=%s",
  140. uId, rId, source, err)
  141. return nil
  142. }
  143. return item
  144. }
  145. func GetBuySilverByRelateId(rId string, useCache bool) *Silver {
  146. k := fmt.Sprintf("silver_model.GetBuySilverByRelateId[%s]", rId)
  147. if useCache {
  148. if order, ok := cache.Cache.Get(k).(*Silver); ok {
  149. return order
  150. }
  151. }
  152. //lt < 0
  153. item := &Silver{}
  154. if err := orm.NewOrm().QueryTable(item).Filter("relate_id", rId).Filter("count__lt", 0).Limit(1).
  155. One(item); err != nil {
  156. beego.BeeLogger.Info("GetBuySilverByRelateId(%s), err=%s", rId, err)
  157. return nil
  158. }
  159. cache.Cache.Put(k, item, 5*time.Minute)
  160. return item
  161. }
  162. func GetRefundSilverByRelateId(rId string, useCache bool) *Silver {
  163. k := fmt.Sprintf("silver_model.GetRefundSilverByRelateId[%s]", rId)
  164. if useCache {
  165. if order, ok := cache.Cache.Get(k).(*Silver); ok {
  166. return order
  167. }
  168. }
  169. //gt > 0
  170. item := &Silver{}
  171. if err := orm.NewOrm().QueryTable(item).Filter("relate_id", rId).Filter("count__gt", 0).Limit(1).
  172. One(item); err != nil {
  173. beego.BeeLogger.Info("GetRefundSilverByRelateId(%s), err=%s", rId, err)
  174. return nil
  175. }
  176. cache.Cache.Put(k, item, 5*time.Minute)
  177. return item
  178. }
  179. //返回source名称
  180. func (self *Silver) GetSourceName() string {
  181. sourceName := ""
  182. switch self.Source {
  183. case CASH_SOURCE_SHOP_BENEFIT:
  184. sourceName = CASH_SOURCE_SHOP_BENEFIT_NAME
  185. case CASH_SOURCE_PRODUCT_BENEFIT:
  186. sourceName = CASH_SOURCE_PRODUCT_BENEFIT_NAME
  187. case CASH_SOURCE_PROJECT_BENEFIT:
  188. sourceName = CASH_SOURCE_PROJECT_BENEFIT_NAME
  189. case CASH_SOURCE_TAKE_CASH:
  190. sourceName = CASH_SOURCE_TAKE_CASH_NAME
  191. case CASH_TO_BALANCE:
  192. sourceName = CASH_TO_BALANCE_NAME
  193. case CASH_SOURCE_PRODUCT_SALE:
  194. sourceName = CASH_SOURCE_PRODUCT_SALE_NAME
  195. case CASH_SOURCE_SALE_REWARD:
  196. sourceName = CASH_SOURCE_SALE_REWARD_NAME
  197. case CASH_SOURCE_PROJECT_INVEST:
  198. sourceName = CASH_SOURCE_PROJECT_INVEST_NAME
  199. case CASH_SOURCE_RESERVE_ACT_RETURN:
  200. sourceName = CASH_SOURCE_RESERVE_ACT_RETURN_NAME
  201. case CASH_SOURCE_EXTRACT_REJECT:
  202. sourceName = CASH_SOURCE_EXTRACT_REJECT_NAME
  203. case CASH_SOURCE_RECHARGE_CASH:
  204. sourceName = CASH_SOURCE_RECHARGE_CASH_NAME
  205. case CASH_SOURCE_RECEIVE_BUYBACK:
  206. sourceName = CASH_SOURCE_RECEIVE_BUYBACK_NAME
  207. case CASH_SOURCE_DEDUCT:
  208. sourceName = CASH_SOURCE_DEDUCT_NAME
  209. case CASH_SOURCE_LOAN:
  210. sourceName = CASH_SOURCE_LOAN_NAME
  211. case CASH_SOURCE_PROJECT_REFUND:
  212. sourceName = CASH_SOURCE_PROJECT_REFUND
  213. case CASH_SOURCE_PRODUCT_REFUND:
  214. sourceName = CASH_SOURCE_PRODUCT_REFUND_NAME
  215. case CASH_SOURCE_PRODUCT_PART_REFUND:
  216. sourceName = CASH_SOURCE_PRODUCT_PART_REFUND_NAME
  217. case CASH_SOURCE_CORRECT:
  218. sourceName = CASH_SOURCE_CORRECT_NAME
  219. case CASH_SOURCE_PROJECT_LOAN:
  220. sourceName = CASH_SOURCE_PROJECT_LOAN_NAME
  221. case CASH_SOURCE_GOOD_PAYMENT:
  222. sourceName = CASH_SOURCE_GOOD_PAYMENT_NAME
  223. case CASH_SOURCE_DOLLAR_WIN:
  224. sourceName = CASH_SOURCE_DOLLAR_WIN_NAME
  225. case CASH_SOURCE_DOLLAR_WIN_RETURN:
  226. sourceName = CASH_SOURCE_DOLLAR_WIN_RETURN_NAME
  227. case FX_CASH_SOURCE_PRODUCT_BENEFIT:
  228. sourceName = FX_CASH_SOURCE_PRODUCT_BENEFIT_NAME
  229. // case BALANCE_SOURCE_PART_REFUNDED:
  230. // sourceName = BALANCE_SOURCE_PART_REFUNDED_NAME
  231. }
  232. return sourceName
  233. }