You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

reward_operate_record.go 6.5 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. package models
  2. import (
  3. "code.gitea.io/gitea/modules/timeutil"
  4. "strings"
  5. "xorm.io/builder"
  6. )
  7. type SourceType string
  8. const (
  9. SourceTypeAccomplishTask SourceType = "ACCOMPLISH_TASK"
  10. SourceTypeAdminOperate SourceType = "ADMIN_OPERATE"
  11. SourceTypeRunCloudbrainTask SourceType = "RUN_CLOUDBRAIN_TASK"
  12. )
  13. func (r SourceType) Name() string {
  14. switch r {
  15. case SourceTypeAccomplishTask:
  16. return "ACCOMPLISH_TASK"
  17. case SourceTypeAdminOperate:
  18. return "ADMIN_OPERATE"
  19. case SourceTypeRunCloudbrainTask:
  20. return "RUN_CLOUDBRAIN_TASK"
  21. default:
  22. return ""
  23. }
  24. }
  25. type RewardType string
  26. const (
  27. RewardTypePoint RewardType = "POINT"
  28. )
  29. func (r RewardType) Name() string {
  30. switch r {
  31. case RewardTypePoint:
  32. return "POINT"
  33. default:
  34. return ""
  35. }
  36. }
  37. func (r RewardType) Show() string {
  38. switch r {
  39. case RewardTypePoint:
  40. return "积分"
  41. default:
  42. return ""
  43. }
  44. }
  45. func GetRewardTypeInstance(s string) RewardType {
  46. switch s {
  47. case RewardTypePoint.Name():
  48. return RewardTypePoint
  49. default:
  50. return ""
  51. }
  52. }
  53. type RewardOperateType string
  54. func (r RewardOperateType) Name() string {
  55. switch r {
  56. case OperateTypeIncrease:
  57. return "INCREASE"
  58. case OperateTypeDecrease:
  59. return "DECREASE"
  60. default:
  61. return ""
  62. }
  63. }
  64. func (r RewardOperateType) Show() string {
  65. switch r {
  66. case OperateTypeIncrease:
  67. return "奖励"
  68. case OperateTypeDecrease:
  69. return "扣减"
  70. default:
  71. return ""
  72. }
  73. }
  74. func GetRewardOperateTypeInstance(s string) RewardOperateType {
  75. switch s {
  76. case OperateTypeIncrease.Name():
  77. return OperateTypeIncrease
  78. case OperateTypeDecrease.Name():
  79. return OperateTypeDecrease
  80. default:
  81. return ""
  82. }
  83. }
  84. const (
  85. OperateTypeIncrease RewardOperateType = "INCREASE"
  86. OperateTypeDecrease RewardOperateType = "DECREASE"
  87. OperateTypeNull RewardOperateType = "NIL"
  88. )
  89. const (
  90. OperateStatusOperating = "OPERATING"
  91. OperateStatusSucceeded = "SUCCEEDED"
  92. OperateStatusFailed = "FAILED"
  93. )
  94. const Semicolon = ";"
  95. type RewardOperateOrderBy string
  96. const (
  97. RewardOrderByID RewardOperateOrderBy = "id"
  98. )
  99. type RewardOperateRecord struct {
  100. ID int64 `xorm:"pk autoincr"`
  101. SerialNo string `xorm:"INDEX NOT NULL"`
  102. UserId int64 `xorm:"INDEX NOT NULL"`
  103. Amount int64 `xorm:"NOT NULL"`
  104. Tittle string
  105. RewardType string `xorm:"NOT NULL"`
  106. SourceType string `xorm:"NOT NULL"`
  107. SourceId string `xorm:"INDEX NOT NULL"`
  108. RequestId string `xorm:"INDEX NOT NULL"`
  109. OperateType string `xorm:"NOT NULL"`
  110. Status string `xorm:"NOT NULL"`
  111. Remark string
  112. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  113. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  114. }
  115. type AdminRewardOperateReq struct {
  116. TargetUserId int64 `binding:"Required"`
  117. OperateType RewardOperateType `binding:"Required"`
  118. Amount int64 `binding:"Required;Range(1,100000)"`
  119. Remark string
  120. RewardType RewardType
  121. }
  122. func (r RewardOperateRecord) ToShow() RewardOperateRecordShow {
  123. return RewardOperateRecordShow{
  124. SerialNo: r.SerialNo,
  125. Date: r.CreatedUnix,
  126. Tittle: r.Tittle,
  127. OperateType: r.OperateType,
  128. Amount: r.Amount,
  129. }
  130. }
  131. type RewardOperateRecordShow struct {
  132. SerialNo string
  133. Date timeutil.TimeStamp
  134. Tittle string
  135. OperateType string
  136. Amount int64
  137. }
  138. func getPointOperateRecord(tl *RewardOperateRecord) (*RewardOperateRecord, error) {
  139. has, err := x.Get(tl)
  140. if err != nil {
  141. return nil, err
  142. } else if !has {
  143. return nil, ErrRecordNotExist{}
  144. }
  145. return tl, nil
  146. }
  147. func GetPointOperateRecordBySourceTypeAndRequestId(sourceType, requestId, operateType string) (*RewardOperateRecord, error) {
  148. t := &RewardOperateRecord{
  149. SourceType: sourceType,
  150. RequestId: requestId,
  151. OperateType: operateType,
  152. }
  153. return getPointOperateRecord(t)
  154. }
  155. func GetPointOperateRecordBySerialNo(serialNo string) (*RewardOperateRecord, error) {
  156. t := &RewardOperateRecord{
  157. SerialNo: serialNo,
  158. }
  159. return getPointOperateRecord(t)
  160. }
  161. func InsertRewardOperateRecord(tl *RewardOperateRecord) (int64, error) {
  162. return x.Insert(tl)
  163. }
  164. func UpdateAwardOperateRecordStatus(sourceType, requestId, oldStatus, newStatus string) (int64, error) {
  165. r := &RewardOperateRecord{
  166. Status: newStatus,
  167. }
  168. return x.Cols("status").Where("source_type=? and request_id=? and status=?", sourceType, requestId, oldStatus).Update(r)
  169. }
  170. func SumRewardAmountInTaskPeriod(rewardType string, sourceType string, userId int64, period *PeriodResult) (int64, error) {
  171. var cond = builder.NewCond()
  172. if period != nil {
  173. cond = cond.And(builder.Gte{"created_unix": period.StartTime.Unix()})
  174. cond = cond.And(builder.Lt{"created_unix": period.EndTime.Unix()})
  175. }
  176. if sourceType != "" {
  177. cond = cond.And(builder.Eq{"source_type": sourceType})
  178. }
  179. cond = cond.And(builder.Eq{"reward_type": rewardType})
  180. cond = cond.And(builder.Eq{"user_id": userId})
  181. return x.Where(cond).SumInt(&RewardOperateRecord{}, "amount")
  182. }
  183. type RewardOperateContext struct {
  184. SourceType SourceType
  185. SourceId string
  186. Tittle string
  187. Remark string
  188. Reward Reward
  189. TargetUserId int64
  190. RequestId string
  191. OperateType RewardOperateType
  192. RejectPolicy LimiterRejectPolicy
  193. }
  194. type Reward struct {
  195. Amount int64
  196. Type RewardType
  197. }
  198. type UserRewardOperationRedis struct {
  199. UserId int64
  200. Amount int64
  201. RewardType RewardType
  202. OperateType RewardOperateType
  203. }
  204. type UserRewardOperation struct {
  205. UserId int64
  206. Msg string
  207. }
  208. func AppendRemark(remark, appendStr string) string {
  209. return strings.TrimPrefix(remark+Semicolon+appendStr, Semicolon)
  210. }
  211. type RewardRecordListOpts struct {
  212. ListOptions
  213. UserId int64
  214. OperateType RewardOperateType
  215. RewardType RewardType
  216. OrderBy RewardOperateOrderBy
  217. }
  218. func GetRewardRecordList(opts RewardRecordListOpts) ([]RewardOperateRecord, int64, error) {
  219. if opts.Page <= 0 {
  220. opts.Page = 1
  221. }
  222. if len(opts.OrderBy) == 0 {
  223. opts.OrderBy = RewardOrderByID
  224. }
  225. r := make([]RewardOperateRecord, 0)
  226. cond := builder.NewCond()
  227. if opts.UserId > 0 {
  228. cond = cond.And(builder.Eq{"user_id": opts.UserId})
  229. }
  230. if opts.OperateType != OperateTypeNull {
  231. cond = cond.And(builder.Eq{"operate_type": opts.OperateType.Name()})
  232. }
  233. cond = cond.And(builder.Eq{"reward_type": opts.RewardType.Name()})
  234. cond = cond.And(builder.Gt{"amount": 0})
  235. count, err := x.Where(cond).Count(&RewardOperateRecord{})
  236. if err != nil {
  237. return nil, 0, err
  238. }
  239. err = x.Where(cond).Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(string(opts.OrderBy)).Find(&r)
  240. if err != nil {
  241. return nil, 0, err
  242. }
  243. return r, count, nil
  244. }