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.7 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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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. CloudbrainMap, err := l.GetRewardRecordCloudbrainTask()
  106. if err != nil {
  107. return nil, err
  108. }
  109. result := make([]*RewardOperateRecordShow, 0)
  110. for _, v := range *l {
  111. temp := v.ToShow()
  112. switch v.SourceType {
  113. case SourceTypeAccomplishTask.Name():
  114. temp.Action = actionMap[v.SourceId].ToShow()
  115. case SourceTypeRunCloudbrainTask.Name():
  116. temp.Cloudbrain = CloudbrainMap[v.SourceId].ToShow()
  117. }
  118. result = append(result, &temp)
  119. }
  120. return result, nil
  121. }
  122. func (l *RewardRecordList) GetRewardRecordAction() (map[string]*Action, error) {
  123. if len(*l) == 0 {
  124. return nil, nil
  125. }
  126. actionIds := make([]int64, 0)
  127. for _, r := range *l {
  128. if r.SourceType != SourceTypeAccomplishTask.Name() {
  129. continue
  130. }
  131. i, _ := strconv.ParseInt(r.SourceId, 10, 64)
  132. actionIds = append(actionIds, i)
  133. }
  134. actions, err := GetActionByIds(actionIds)
  135. if err != nil {
  136. return nil, err
  137. }
  138. result := make(map[string]*Action, 0)
  139. for _, v := range actions {
  140. result[fmt.Sprint(v.ID)] = v
  141. }
  142. return result, nil
  143. }
  144. func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]*RewardAdminLog, error) {
  145. if len(*l) == 0 {
  146. return nil, nil
  147. }
  148. logIds := make([]string, 0)
  149. for _, r := range *l {
  150. if r.SourceType != SourceTypeAdminOperate.Name() {
  151. continue
  152. }
  153. logIds = append(logIds, r.SourceId)
  154. }
  155. logs, err := GetRewardAdminLogByLogIds(logIds)
  156. if err != nil {
  157. return nil, err
  158. }
  159. result := make(map[string]*RewardAdminLog, 0)
  160. for _, v := range logs {
  161. result[fmt.Sprint(v.LogId)] = v
  162. }
  163. return result, nil
  164. }
  165. func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]*Cloudbrain, error) {
  166. if len(*l) == 0 {
  167. return nil, nil
  168. }
  169. cloudbrainIds := make([]int64, 0)
  170. for _, r := range *l {
  171. if r.SourceType != SourceTypeRunCloudbrainTask.Name() {
  172. continue
  173. }
  174. i, _ := strconv.ParseInt(r.SourceId, 10, 64)
  175. cloudbrainIds = append(cloudbrainIds, i)
  176. }
  177. cloudbrains, err := GetCloudbrainByIds(cloudbrainIds)
  178. if err != nil {
  179. return nil, err
  180. }
  181. var ids []int64
  182. for _, task := range cloudbrains {
  183. ids = append(ids, task.RepoID)
  184. }
  185. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  186. result := make(map[string]*Cloudbrain, 0)
  187. if err == nil {
  188. for _, v := range cloudbrains {
  189. v.Repo = repositoryMap[v.RepoID]
  190. result[fmt.Sprint(v.ID)] = v
  191. }
  192. }
  193. return result, nil
  194. }
  195. type RewardOperateRecord struct {
  196. ID int64 `xorm:"pk autoincr"`
  197. SerialNo string `xorm:"INDEX NOT NULL"`
  198. UserId int64 `xorm:"INDEX NOT NULL"`
  199. Amount int64 `xorm:"NOT NULL"`
  200. LossAmount int64
  201. Tittle string
  202. RewardType string `xorm:"NOT NULL"`
  203. SourceType string `xorm:"NOT NULL"`
  204. SourceId string `xorm:"INDEX NOT NULL"`
  205. RequestId string `xorm:"INDEX NOT NULL"`
  206. OperateType string `xorm:"NOT NULL"`
  207. Status string `xorm:"NOT NULL"`
  208. Remark string
  209. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  210. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  211. LastOperateUnix timeutil.TimeStamp `xorm:"INDEX"`
  212. }
  213. type AdminRewardOperateReq struct {
  214. TargetUserId int64 `binding:"Required"`
  215. OperateType RewardOperateType `binding:"Required"`
  216. Amount int64 `binding:"Required;Range(1,100000)"`
  217. Remark string
  218. RewardType RewardType
  219. }
  220. func (r RewardOperateRecord) ToShow() RewardOperateRecordShow {
  221. return RewardOperateRecordShow{
  222. SerialNo: r.SerialNo,
  223. OperateType: r.OperateType,
  224. Amount: r.Amount,
  225. Remark: r.Remark,
  226. Status: r.Status,
  227. SourceType: r.SourceType,
  228. LastOperateDate: r.LastOperateUnix,
  229. LossAmount: r.LossAmount,
  230. }
  231. }
  232. type RewardOperateRecordShow struct {
  233. SerialNo string
  234. Status string
  235. OperateType string
  236. Amount int64
  237. LossAmount int64
  238. Remark string
  239. SourceType string
  240. LastOperateDate timeutil.TimeStamp
  241. Action *ActionShow
  242. Cloudbrain *CloudbrainShow
  243. AdminLog *RewardAdminLog
  244. }
  245. func getPointOperateRecord(tl *RewardOperateRecord) (*RewardOperateRecord, error) {
  246. has, err := x.Get(tl)
  247. if err != nil {
  248. return nil, err
  249. } else if !has {
  250. return nil, ErrRecordNotExist{}
  251. }
  252. return tl, nil
  253. }
  254. func GetPointOperateRecordBySourceTypeAndRequestId(sourceType, requestId, operateType string) (*RewardOperateRecord, error) {
  255. t := &RewardOperateRecord{
  256. SourceType: sourceType,
  257. RequestId: requestId,
  258. OperateType: operateType,
  259. }
  260. return getPointOperateRecord(t)
  261. }
  262. func GetPointOperateRecordBySerialNo(serialNo string) (*RewardOperateRecord, error) {
  263. t := &RewardOperateRecord{
  264. SerialNo: serialNo,
  265. }
  266. return getPointOperateRecord(t)
  267. }
  268. func InsertRewardOperateRecord(tl *RewardOperateRecord) (int64, error) {
  269. return x.Insert(tl)
  270. }
  271. func UpdateRewardRecordToFinalStatus(sourceType, requestId, newStatus string) (int64, error) {
  272. r := &RewardOperateRecord{
  273. Status: newStatus,
  274. LastOperateUnix: timeutil.TimeStampNow(),
  275. }
  276. return x.Cols("status", "last_operate_unix").Where("source_type=? and request_id=? and status=?", sourceType, requestId, OperateStatusOperating).Update(r)
  277. }
  278. func SumRewardAmountInTaskPeriod(rewardType string, sourceType string, userId int64, period *PeriodResult) (int64, error) {
  279. var cond = builder.NewCond()
  280. if period != nil {
  281. cond = cond.And(builder.Gte{"created_unix": period.StartTime.Unix()})
  282. cond = cond.And(builder.Lt{"created_unix": period.EndTime.Unix()})
  283. }
  284. if sourceType != "" {
  285. cond = cond.And(builder.Eq{"source_type": sourceType})
  286. }
  287. cond = cond.And(builder.Eq{"reward_type": rewardType})
  288. cond = cond.And(builder.Eq{"user_id": userId})
  289. return x.Where(cond).SumInt(&RewardOperateRecord{}, "amount")
  290. }
  291. type RewardOperateContext struct {
  292. SourceType SourceType
  293. SourceId string
  294. Tittle string
  295. Remark string
  296. Reward Reward
  297. TargetUserId int64
  298. RequestId string
  299. OperateType RewardOperateType
  300. RejectPolicy LimiterRejectPolicy
  301. PermittedNegative bool
  302. LossAmount int64
  303. }
  304. type Reward struct {
  305. Amount int64
  306. Type RewardType
  307. }
  308. type UserRewardOperationRedis struct {
  309. UserId int64
  310. Amount int64
  311. RewardType RewardType
  312. OperateType RewardOperateType
  313. }
  314. type UserRewardOperation struct {
  315. UserId int64
  316. Msg string
  317. }
  318. func AppendRemark(remark, appendStr string) string {
  319. return strings.TrimPrefix(remark+Semicolon+appendStr, Semicolon)
  320. }
  321. type RewardRecordListOpts struct {
  322. ListOptions
  323. UserId int64
  324. OperateType RewardOperateType
  325. RewardType RewardType
  326. OrderBy RewardOperateOrderBy
  327. }
  328. func GetRewardRecordList(opts RewardRecordListOpts) (RewardRecordList, int64, error) {
  329. if opts.Page <= 0 {
  330. opts.Page = 1
  331. }
  332. if len(opts.OrderBy) == 0 {
  333. opts.OrderBy = RewardOrderByIDDesc
  334. }
  335. r := make([]*RewardOperateRecord, 0)
  336. cond := builder.NewCond()
  337. if opts.UserId > 0 {
  338. cond = cond.And(builder.Eq{"user_id": opts.UserId})
  339. }
  340. if opts.OperateType != OperateTypeNull {
  341. cond = cond.And(builder.Eq{"operate_type": opts.OperateType.Name()})
  342. }
  343. cond = cond.And(builder.Eq{"reward_type": opts.RewardType.Name()})
  344. cond = cond.And(builder.Gt{"amount": 0})
  345. count, err := x.Where(cond).Count(&RewardOperateRecord{})
  346. if err != nil {
  347. return nil, 0, err
  348. }
  349. err = x.Where(cond).Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(string(opts.OrderBy)).Find(&r)
  350. if err != nil {
  351. return nil, 0, err
  352. }
  353. return r, count, nil
  354. }