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.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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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. result := make(map[string]*Cloudbrain, 0)
  182. for _, v := range cloudbrains {
  183. result[fmt.Sprint(v.ID)] = v
  184. }
  185. return result, nil
  186. }
  187. type RewardOperateRecord struct {
  188. ID int64 `xorm:"pk autoincr"`
  189. SerialNo string `xorm:"INDEX NOT NULL"`
  190. UserId int64 `xorm:"INDEX NOT NULL"`
  191. Amount int64 `xorm:"NOT NULL"`
  192. LossAmount int64
  193. Tittle string
  194. RewardType string `xorm:"NOT NULL"`
  195. SourceType string `xorm:"NOT NULL"`
  196. SourceId string `xorm:"INDEX NOT NULL"`
  197. RequestId string `xorm:"INDEX NOT NULL"`
  198. OperateType string `xorm:"NOT NULL"`
  199. Status string `xorm:"NOT NULL"`
  200. Remark string
  201. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  202. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  203. LastOperateUnix timeutil.TimeStamp `xorm:"INDEX"`
  204. }
  205. type AdminRewardOperateReq struct {
  206. TargetUserId int64 `binding:"Required"`
  207. OperateType RewardOperateType `binding:"Required"`
  208. Amount int64 `binding:"Required;Range(1,100000)"`
  209. Remark string
  210. RewardType RewardType
  211. }
  212. func (r RewardOperateRecord) ToShow() RewardOperateRecordShow {
  213. return RewardOperateRecordShow{
  214. SerialNo: r.SerialNo,
  215. OperateType: r.OperateType,
  216. Amount: r.Amount,
  217. Remark: r.Remark,
  218. Status: r.Status,
  219. SourceType: r.SourceType,
  220. LastOperateDate: r.LastOperateUnix,
  221. LossAmount: r.LossAmount,
  222. }
  223. }
  224. type RewardOperateRecordShow struct {
  225. SerialNo string
  226. Status string
  227. OperateType string
  228. Amount int64
  229. LossAmount int64
  230. Remark string
  231. SourceType string
  232. LastOperateDate timeutil.TimeStamp
  233. Action *ActionShow
  234. Cloudbrain *CloudbrainShow
  235. AdminLog *RewardAdminLog
  236. }
  237. func getPointOperateRecord(tl *RewardOperateRecord) (*RewardOperateRecord, error) {
  238. has, err := x.Get(tl)
  239. if err != nil {
  240. return nil, err
  241. } else if !has {
  242. return nil, ErrRecordNotExist{}
  243. }
  244. return tl, nil
  245. }
  246. func GetPointOperateRecordBySourceTypeAndRequestId(sourceType, requestId, operateType string) (*RewardOperateRecord, error) {
  247. t := &RewardOperateRecord{
  248. SourceType: sourceType,
  249. RequestId: requestId,
  250. OperateType: operateType,
  251. }
  252. return getPointOperateRecord(t)
  253. }
  254. func GetPointOperateRecordBySerialNo(serialNo string) (*RewardOperateRecord, error) {
  255. t := &RewardOperateRecord{
  256. SerialNo: serialNo,
  257. }
  258. return getPointOperateRecord(t)
  259. }
  260. func InsertRewardOperateRecord(tl *RewardOperateRecord) (int64, error) {
  261. return x.Insert(tl)
  262. }
  263. func UpdateRewardRecordToFinalStatus(sourceType, requestId, newStatus string) (int64, error) {
  264. r := &RewardOperateRecord{
  265. Status: newStatus,
  266. LastOperateUnix: timeutil.TimeStampNow(),
  267. }
  268. return x.Cols("status", "last_operate_unix").Where("source_type=? and request_id=? and status=?", sourceType, requestId, OperateStatusOperating).Update(r)
  269. }
  270. func SumRewardAmountInTaskPeriod(rewardType string, sourceType string, userId int64, period *PeriodResult) (int64, error) {
  271. var cond = builder.NewCond()
  272. if period != nil {
  273. cond = cond.And(builder.Gte{"created_unix": period.StartTime.Unix()})
  274. cond = cond.And(builder.Lt{"created_unix": period.EndTime.Unix()})
  275. }
  276. if sourceType != "" {
  277. cond = cond.And(builder.Eq{"source_type": sourceType})
  278. }
  279. cond = cond.And(builder.Eq{"reward_type": rewardType})
  280. cond = cond.And(builder.Eq{"user_id": userId})
  281. return x.Where(cond).SumInt(&RewardOperateRecord{}, "amount")
  282. }
  283. type RewardOperateContext struct {
  284. SourceType SourceType
  285. SourceId string
  286. Tittle string
  287. Remark string
  288. Reward Reward
  289. TargetUserId int64
  290. RequestId string
  291. OperateType RewardOperateType
  292. RejectPolicy LimiterRejectPolicy
  293. PermittedNegative bool
  294. LossAmount int64
  295. }
  296. type Reward struct {
  297. Amount int64
  298. Type RewardType
  299. }
  300. type UserRewardOperationRedis struct {
  301. UserId int64
  302. Amount int64
  303. RewardType RewardType
  304. OperateType RewardOperateType
  305. }
  306. type UserRewardOperation struct {
  307. UserId int64
  308. Msg string
  309. }
  310. func AppendRemark(remark, appendStr string) string {
  311. return strings.TrimPrefix(remark+Semicolon+appendStr, Semicolon)
  312. }
  313. type RewardRecordListOpts struct {
  314. ListOptions
  315. UserId int64
  316. OperateType RewardOperateType
  317. RewardType RewardType
  318. OrderBy RewardOperateOrderBy
  319. }
  320. func GetRewardRecordList(opts RewardRecordListOpts) (RewardRecordList, int64, error) {
  321. if opts.Page <= 0 {
  322. opts.Page = 1
  323. }
  324. if len(opts.OrderBy) == 0 {
  325. opts.OrderBy = RewardOrderByIDDesc
  326. }
  327. r := make([]*RewardOperateRecord, 0)
  328. cond := builder.NewCond()
  329. if opts.UserId > 0 {
  330. cond = cond.And(builder.Eq{"user_id": opts.UserId})
  331. }
  332. if opts.OperateType != OperateTypeNull {
  333. cond = cond.And(builder.Eq{"operate_type": opts.OperateType.Name()})
  334. }
  335. cond = cond.And(builder.Eq{"reward_type": opts.RewardType.Name()})
  336. cond = cond.And(builder.Gt{"amount": 0})
  337. count, err := x.Where(cond).Count(&RewardOperateRecord{})
  338. if err != nil {
  339. return nil, 0, err
  340. }
  341. err = x.Where(cond).Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).OrderBy(string(opts.OrderBy)).Find(&r)
  342. if err != nil {
  343. return nil, 0, err
  344. }
  345. return r, count, nil
  346. }