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 9.6 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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. package models
  2. import (
  3. "code.gitea.io/gitea/modules/timeutil"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "xorm.io/builder"
  8. )
  9. type SourceType string
  10. const (
  11. SourceTypeAccomplishTask SourceType = "ACCOMPLISH_TASK"
  12. SourceTypeAdminOperate SourceType = "ADMIN_OPERATE"
  13. SourceTypeRunCloudbrainTask SourceType = "RUN_CLOUDBRAIN_TASK"
  14. )
  15. func (r SourceType) Name() string {
  16. switch r {
  17. case SourceTypeAccomplishTask:
  18. return "ACCOMPLISH_TASK"
  19. case SourceTypeAdminOperate:
  20. return "ADMIN_OPERATE"
  21. case SourceTypeRunCloudbrainTask:
  22. return "RUN_CLOUDBRAIN_TASK"
  23. default:
  24. return ""
  25. }
  26. }
  27. type RewardType string
  28. const (
  29. RewardTypePoint RewardType = "POINT"
  30. )
  31. func (r RewardType) Name() string {
  32. switch r {
  33. case RewardTypePoint:
  34. return "POINT"
  35. default:
  36. return ""
  37. }
  38. }
  39. func (r RewardType) Show() string {
  40. switch r {
  41. case RewardTypePoint:
  42. return "积分"
  43. default:
  44. return ""
  45. }
  46. }
  47. func GetRewardTypeInstance(s string) RewardType {
  48. switch s {
  49. case RewardTypePoint.Name():
  50. return RewardTypePoint
  51. default:
  52. return ""
  53. }
  54. }
  55. type RewardOperateType string
  56. func (r RewardOperateType) Name() string {
  57. switch r {
  58. case OperateTypeIncrease:
  59. return "INCREASE"
  60. case OperateTypeDecrease:
  61. return "DECREASE"
  62. default:
  63. return ""
  64. }
  65. }
  66. func (r RewardOperateType) Show() string {
  67. switch r {
  68. case OperateTypeIncrease:
  69. return "奖励"
  70. case OperateTypeDecrease:
  71. return "扣减"
  72. default:
  73. return ""
  74. }
  75. }
  76. func GetRewardOperateTypeInstance(s string) RewardOperateType {
  77. switch s {
  78. case OperateTypeIncrease.Name():
  79. return OperateTypeIncrease
  80. case OperateTypeDecrease.Name():
  81. return OperateTypeDecrease
  82. default:
  83. return ""
  84. }
  85. }
  86. const (
  87. OperateTypeIncrease RewardOperateType = "INCREASE"
  88. OperateTypeDecrease RewardOperateType = "DECREASE"
  89. OperateTypeNull RewardOperateType = "NIL"
  90. )
  91. const (
  92. OperateStatusOperating = "OPERATING"
  93. OperateStatusSucceeded = "SUCCEEDED"
  94. OperateStatusFailed = "FAILED"
  95. )
  96. const Semicolon = ";"
  97. type RewardOperateOrderBy string
  98. const (
  99. RewardOrderByIDDesc RewardOperateOrderBy = "id desc"
  100. )
  101. type RewardRecordList []*RewardOperateRecord
  102. type RewardRecordShowList []*RewardOperateRecordShow
  103. func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) {
  104. actionMap, err := l.GetRewardRecordAction()
  105. adminLogMap, err := l.GetRewardRecordAdminLog()
  106. CloudbrainMap, err := l.GetRewardRecordCloudbrainTask()
  107. if err != nil {
  108. return nil, err
  109. }
  110. result := make([]*RewardOperateRecordShow, 0)
  111. for _, v := range *l {
  112. temp := v.ToShow()
  113. switch v.SourceType {
  114. case SourceTypeAccomplishTask.Name():
  115. temp.Action = actionMap[v.SourceId]
  116. case SourceTypeAdminOperate.Name():
  117. temp.AdminLog = adminLogMap[v.SourceId]
  118. case SourceTypeRunCloudbrainTask.Name():
  119. temp.Cloudbrain = CloudbrainMap[v.SourceId]
  120. }
  121. result = append(result, &temp)
  122. }
  123. return result, nil
  124. }
  125. func (l *RewardRecordList) GetRewardRecordAction() (map[string]Action, error) {
  126. if len(*l) == 0 {
  127. return nil, nil
  128. }
  129. actionIds := make([]int64, 0)
  130. for _, r := range *l {
  131. if r.SourceType != SourceTypeAccomplishTask.Name() {
  132. continue
  133. }
  134. i, _ := strconv.ParseInt(r.SourceId, 10, 64)
  135. actionIds = append(actionIds, i)
  136. }
  137. actions, err := GetActionByIds(actionIds)
  138. if err != nil {
  139. return nil, err
  140. }
  141. result := make(map[string]Action, 0)
  142. for _, v := range actions {
  143. result[fmt.Sprint(v.ID)] = *v
  144. }
  145. return result, nil
  146. }
  147. func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, error) {
  148. if len(*l) == 0 {
  149. return nil, nil
  150. }
  151. logIds := make([]string, 0)
  152. for _, r := range *l {
  153. if r.SourceType != SourceTypeAdminOperate.Name() {
  154. continue
  155. }
  156. logIds = append(logIds, r.SourceId)
  157. }
  158. logs, err := GetRewardAdminLogByLogIds(logIds)
  159. if err != nil {
  160. return nil, err
  161. }
  162. result := make(map[string]RewardAdminLog, 0)
  163. for _, v := range logs {
  164. result[fmt.Sprint(v.LogId)] = v
  165. }
  166. return result, nil
  167. }
  168. func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]Cloudbrain, error) {
  169. if len(*l) == 0 {
  170. return nil, nil
  171. }
  172. cloudbrainIds := make([]int64, 0)
  173. for _, r := range *l {
  174. if r.SourceType != SourceTypeRunCloudbrainTask.Name() {
  175. continue
  176. }
  177. i, _ := strconv.ParseInt(r.SourceId, 10, 64)
  178. cloudbrainIds = append(cloudbrainIds, i)
  179. }
  180. cloudbrains, err := GetCloudbrainByIds(cloudbrainIds)
  181. if err != nil {
  182. return nil, err
  183. }
  184. result := make(map[string]Cloudbrain, 0)
  185. for _, v := range cloudbrains {
  186. result[fmt.Sprint(v.ID)] = v
  187. }
  188. return result, nil
  189. }
  190. type RewardOperateRecord struct {
  191. ID int64 `xorm:"pk autoincr"`
  192. SerialNo string `xorm:"INDEX NOT NULL"`
  193. UserId int64 `xorm:"INDEX NOT NULL"`
  194. Amount int64 `xorm:"NOT NULL"`
  195. LossAmount int64
  196. Tittle string
  197. RewardType string `xorm:"NOT NULL"`
  198. SourceType string `xorm:"NOT NULL"`
  199. SourceId string `xorm:"INDEX NOT NULL"`
  200. RequestId string `xorm:"INDEX NOT NULL"`
  201. OperateType string `xorm:"NOT NULL"`
  202. Status string `xorm:"NOT NULL"`
  203. Remark string
  204. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  205. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  206. LastOperateUnix timeutil.TimeStamp `xorm:"INDEX"`
  207. }
  208. type AdminRewardOperateReq struct {
  209. TargetUserId int64 `binding:"Required"`
  210. OperateType RewardOperateType `binding:"Required"`
  211. Amount int64 `binding:"Required;Range(1,100000)"`
  212. Remark string
  213. RewardType RewardType
  214. }
  215. func (r RewardOperateRecord) ToShow() RewardOperateRecordShow {
  216. return RewardOperateRecordShow{
  217. SerialNo: r.SerialNo,
  218. CreateDate: r.CreatedUnix,
  219. OperateType: r.OperateType,
  220. Amount: r.Amount,
  221. Remark: r.Remark,
  222. Status: r.Status,
  223. SourceType: r.SourceType,
  224. LastOperateDate: r.LastOperateUnix,
  225. LossAmount: r.LossAmount,
  226. }
  227. }
  228. type RewardOperateRecordShow struct {
  229. SerialNo string
  230. CreateDate timeutil.TimeStamp
  231. Status string
  232. OperateType string
  233. Amount int64
  234. LossAmount int64
  235. Remark string
  236. SourceType string
  237. LastOperateDate timeutil.TimeStamp
  238. Action Action
  239. Cloudbrain Cloudbrain
  240. AdminLog RewardAdminLog
  241. }
  242. func getPointOperateRecord(tl *RewardOperateRecord) (*RewardOperateRecord, error) {
  243. has, err := x.Get(tl)
  244. if err != nil {
  245. return nil, err
  246. } else if !has {
  247. return nil, ErrRecordNotExist{}
  248. }
  249. return tl, nil
  250. }
  251. func GetPointOperateRecordBySourceTypeAndRequestId(sourceType, requestId, operateType string) (*RewardOperateRecord, error) {
  252. t := &RewardOperateRecord{
  253. SourceType: sourceType,
  254. RequestId: requestId,
  255. OperateType: operateType,
  256. }
  257. return getPointOperateRecord(t)
  258. }
  259. func GetPointOperateRecordBySerialNo(serialNo string) (*RewardOperateRecord, error) {
  260. t := &RewardOperateRecord{
  261. SerialNo: serialNo,
  262. }
  263. return getPointOperateRecord(t)
  264. }
  265. func InsertRewardOperateRecord(tl *RewardOperateRecord) (int64, error) {
  266. return x.Insert(tl)
  267. }
  268. func UpdateRewardRecordToFinalStatus(sourceType, requestId, newStatus string) (int64, error) {
  269. r := &RewardOperateRecord{
  270. Status: newStatus,
  271. LastOperateUnix: timeutil.TimeStampNow(),
  272. }
  273. return x.Cols("status", "last_operate_unix").Where("source_type=? and request_id=? and status=?", sourceType, requestId, OperateStatusOperating).Update(r)
  274. }
  275. func SumRewardAmountInTaskPeriod(rewardType string, sourceType string, userId int64, period *PeriodResult) (int64, error) {
  276. var cond = builder.NewCond()
  277. if period != nil {
  278. cond = cond.And(builder.Gte{"created_unix": period.StartTime.Unix()})
  279. cond = cond.And(builder.Lt{"created_unix": period.EndTime.Unix()})
  280. }
  281. if sourceType != "" {
  282. cond = cond.And(builder.Eq{"source_type": sourceType})
  283. }
  284. cond = cond.And(builder.Eq{"reward_type": rewardType})
  285. cond = cond.And(builder.Eq{"user_id": userId})
  286. return x.Where(cond).SumInt(&RewardOperateRecord{}, "amount")
  287. }
  288. type RewardOperateContext struct {
  289. SourceType SourceType
  290. SourceId string
  291. Tittle string
  292. Remark string
  293. Reward Reward
  294. TargetUserId int64
  295. RequestId string
  296. OperateType RewardOperateType
  297. RejectPolicy LimiterRejectPolicy
  298. PermittedNegative bool
  299. LossAmount int64
  300. }
  301. type Reward struct {
  302. Amount int64
  303. Type RewardType
  304. }
  305. type UserRewardOperationRedis struct {
  306. UserId int64
  307. Amount int64
  308. RewardType RewardType
  309. OperateType RewardOperateType
  310. }
  311. type UserRewardOperation struct {
  312. UserId int64
  313. Msg string
  314. }
  315. func AppendRemark(remark, appendStr string) string {
  316. return strings.TrimPrefix(remark+Semicolon+appendStr, Semicolon)
  317. }
  318. type RewardRecordListOpts struct {
  319. ListOptions
  320. UserId int64
  321. OperateType RewardOperateType
  322. RewardType RewardType
  323. OrderBy RewardOperateOrderBy
  324. }
  325. func GetRewardRecordList(opts RewardRecordListOpts) (RewardRecordList, int64, error) {
  326. if opts.Page <= 0 {
  327. opts.Page = 1
  328. }
  329. if len(opts.OrderBy) == 0 {
  330. opts.OrderBy = RewardOrderByIDDesc
  331. }
  332. r := make([]*RewardOperateRecord, 0)
  333. cond := builder.NewCond()
  334. if opts.UserId > 0 {
  335. cond = cond.And(builder.Eq{"user_id": opts.UserId})
  336. }
  337. if opts.OperateType != OperateTypeNull {
  338. cond = cond.And(builder.Eq{"operate_type": opts.OperateType.Name()})
  339. }
  340. cond = cond.And(builder.Eq{"reward_type": opts.RewardType.Name()})
  341. cond = cond.And(builder.Gt{"amount": 0})
  342. count, err := x.Where(cond).Count(&RewardOperateRecord{})
  343. if err != nil {
  344. return nil, 0, err
  345. }
  346. err = x.Where(cond).Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(string(opts.OrderBy)).Find(&r)
  347. if err != nil {
  348. return nil, 0, err
  349. }
  350. return r, count, nil
  351. }