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.

user_analysis_for_activity.go 16 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. package models
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "time"
  6. "code.gitea.io/gitea/modules/log"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. "xorm.io/builder"
  9. )
  10. type UserBusinessAnalysisForActivity struct {
  11. ID int64 `xorm:"pk"`
  12. CountDate int64 `xorm:"pk"`
  13. //action :ActionMergePullRequest // 11
  14. CodeMergeCount int `xorm:"NOT NULL DEFAULT 0"`
  15. //action :ActionCommitRepo
  16. CommitCount int `xorm:"NOT NULL DEFAULT 0"`
  17. //issue // 10
  18. IssueCount int `xorm:"NOT NULL DEFAULT 0"`
  19. //comment table current date
  20. CommentCount int `xorm:"NOT NULL DEFAULT 0"`
  21. //follow table
  22. WatchedCount int `xorm:"NOT NULL DEFAULT 0"`
  23. CommitCodeSize int `xorm:"NOT NULL DEFAULT 0"`
  24. //issue, issueassigees
  25. SolveIssueCount int `xorm:"NOT NULL DEFAULT 0"`
  26. //use
  27. RegistDate timeutil.TimeStamp `xorm:"NOT NULL"`
  28. //user
  29. Email string `xorm:"NOT NULL"`
  30. Phone string `xorm:"NULL"`
  31. //user
  32. Name string `xorm:"NOT NULL"`
  33. DataDate string `xorm:"NULL"`
  34. CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"`
  35. CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"`
  36. //0
  37. CommitModelCount int `xorm:"NOT NULL DEFAULT 0"`
  38. }
  39. func QueryDataForActivity(startTime time.Time, endTime time.Time) []*UserBusinessAnalysisForActivity {
  40. sess := x.NewSession()
  41. defer sess.Close()
  42. result := make([]*UserBusinessAnalysisForActivity, 0)
  43. publicRepo := queryPublicRepo()
  44. start_unix := startTime.Unix()
  45. end_unix := endTime.Unix()
  46. CodeMergeCountMap := queryPullRequestPublic(start_unix, end_unix, publicRepo)
  47. CommitCodeSizeMap, err := GetAllUserPublicRepoKPIStats(startTime, endTime)
  48. if err != nil {
  49. log.Info("error,info=" + err.Error())
  50. }
  51. CommitCountMap := queryCommitActionPublic(start_unix, end_unix, 5, publicRepo)
  52. IssueCountMap, publicRepoIssueIdMap := queryCreateIssuePublic(start_unix, end_unix, publicRepo)
  53. SolveIssueCountMap := querySolveIssuePublic(start_unix, end_unix, publicRepoIssueIdMap)
  54. WatchedCountMap, _ := queryFollow(start_unix, end_unix)
  55. CommentCountMap := queryCommentPublic(start_unix, end_unix, publicRepoIssueIdMap)
  56. PublicDataSet := queryAllPublicDataSet(publicRepo)
  57. DatasetFileNums := queryPublicDatasetFileNums(start_unix, end_unix, PublicDataSet)
  58. AiModelManageMap := queryUserModelPublic(start_unix, end_unix, publicRepo)
  59. cond := "type != 1 and is_active=true"
  60. count, err := sess.Where(cond).Count(new(User))
  61. var indexTotal int64
  62. indexTotal = 0
  63. for {
  64. sess.Select("`user`.*").Table("user").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  65. userList := make([]*User, 0)
  66. sess.Find(&userList)
  67. for i, userRecord := range userList {
  68. var dateRecord UserBusinessAnalysisForActivity
  69. dateRecord.ID = userRecord.ID
  70. log.Info("i=" + fmt.Sprint(i) + " userName=" + userRecord.Name)
  71. dateRecord.Email = userRecord.Email
  72. dateRecord.Phone = userRecord.PhoneNumber
  73. dateRecord.RegistDate = userRecord.CreatedUnix
  74. dateRecord.Name = userRecord.Name
  75. dateRecord.CodeMergeCount = getMapValue(dateRecord.ID, CodeMergeCountMap)
  76. dateRecord.CommitCount = getMapValue(dateRecord.ID, CommitCountMap)
  77. dateRecord.WatchedCount = getMapValue(dateRecord.ID, WatchedCountMap)
  78. dateRecord.CommitDatasetNum = getMapValue(dateRecord.ID, DatasetFileNums)
  79. dateRecord.IssueCount = getMapValue(dateRecord.ID, IssueCountMap)
  80. dateRecord.CommentCount = getMapValue(dateRecord.ID, CommentCountMap)
  81. if _, ok := CommitCodeSizeMap[dateRecord.Email]; !ok {
  82. dateRecord.CommitCodeSize = 0
  83. } else {
  84. dateRecord.CommitCodeSize = int(CommitCodeSizeMap[dateRecord.Email].CommitLines)
  85. }
  86. dateRecord.SolveIssueCount = getMapValue(dateRecord.ID, SolveIssueCountMap)
  87. dateRecord.CommitModelCount = getMapValue(dateRecord.ID, AiModelManageMap)
  88. result = append(result, &dateRecord)
  89. }
  90. indexTotal += PAGE_SIZE
  91. if indexTotal >= count {
  92. break
  93. }
  94. }
  95. return result
  96. }
  97. func querySolveIssuePublic(start_unix int64, end_unix int64, publicRepoIssueIdMap map[int64]int) map[int64]int {
  98. sess := x.NewSession()
  99. defer sess.Close()
  100. resultMap := make(map[int64]int)
  101. cond := "issue.is_closed=true and issue.closed_unix>=" + fmt.Sprint(start_unix) + " and issue.closed_unix<=" + fmt.Sprint(end_unix)
  102. count, err := sess.Table("issue_assignees").Join("inner", "issue", "issue.id=issue_assignees.issue_id").Where(cond).Count(new(IssueAssignees))
  103. if err != nil {
  104. log.Info("query issue error. return.")
  105. return resultMap
  106. }
  107. var indexTotal int64
  108. indexTotal = 0
  109. for {
  110. issueAssigneesList := make([]*IssueAssignees, 0)
  111. sess.Select("issue_assignees.*").Table("issue_assignees").
  112. Join("inner", "issue", "issue.id=issue_assignees.issue_id").
  113. Where(cond).OrderBy("issue_assignees.id asc").Limit(PAGE_SIZE, int(indexTotal))
  114. sess.Find(&issueAssigneesList)
  115. log.Info("query IssueAssignees size=" + fmt.Sprint(len(issueAssigneesList)))
  116. for _, issueAssigneesRecord := range issueAssigneesList {
  117. if isPublicRepo(issueAssigneesRecord.IssueID, publicRepoIssueIdMap) {
  118. if _, ok := resultMap[issueAssigneesRecord.AssigneeID]; !ok {
  119. resultMap[issueAssigneesRecord.AssigneeID] = 1
  120. } else {
  121. resultMap[issueAssigneesRecord.AssigneeID] += 1
  122. }
  123. }
  124. }
  125. indexTotal += PAGE_SIZE
  126. if indexTotal >= count {
  127. break
  128. }
  129. }
  130. return resultMap
  131. }
  132. func queryPublicRepo() map[int64]int {
  133. sess := x.NewSession()
  134. defer sess.Close()
  135. resultMap := make(map[int64]int)
  136. count, err := sess.Table("repository").Count(new(Repository))
  137. if err != nil {
  138. log.Info("query Repository error. return.")
  139. return resultMap
  140. }
  141. var indexTotal int64
  142. indexTotal = 0
  143. for {
  144. repositoryList := make([]*Repository, 0)
  145. sess.Select("*").Table("repository").OrderBy("id desc").Limit(PAGE_SIZE, int(indexTotal))
  146. sess.Find(&repositoryList)
  147. log.Info("query repo size=" + fmt.Sprint(len(repositoryList)))
  148. for _, repositoryRecord := range repositoryList {
  149. if repositoryRecord.IsPrivate {
  150. continue
  151. }
  152. if _, ok := resultMap[repositoryRecord.ID]; !ok {
  153. resultMap[repositoryRecord.ID] = 1
  154. }
  155. }
  156. indexTotal += PAGE_SIZE
  157. if indexTotal >= count {
  158. break
  159. }
  160. }
  161. return resultMap
  162. }
  163. func isPublicRepo(repoId int64, publicAllRepo map[int64]int) bool {
  164. if _, ok := publicAllRepo[repoId]; !ok {
  165. return false
  166. }
  167. return true
  168. }
  169. func queryPullRequestPublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) map[int64]int {
  170. sess := x.NewSession()
  171. defer sess.Close()
  172. resultMap := make(map[int64]int)
  173. cond := "issue.created_unix>=" + fmt.Sprint(start_unix) + " and issue.created_unix<=" + fmt.Sprint(end_unix)
  174. count, err := sess.Table("issue").Join("inner", "pull_request", "issue.id=pull_request.issue_id").Where(cond).Count(new(Issue))
  175. if err != nil {
  176. log.Info("query issue error. return.")
  177. return resultMap
  178. }
  179. var indexTotal int64
  180. indexTotal = 0
  181. for {
  182. issueList := make([]*Issue, 0)
  183. sess.Select("issue.*").Table("issue").Join("inner", "pull_request", "issue.id=pull_request.issue_id").Where(cond).OrderBy("issue.id asc").Limit(PAGE_SIZE, int(indexTotal))
  184. sess.Find(&issueList)
  185. log.Info("query issue(PR) size=" + fmt.Sprint(len(issueList)))
  186. for _, issueRecord := range issueList {
  187. if isPublicRepo(issueRecord.RepoID, publicAllRepo) {
  188. if _, ok := resultMap[issueRecord.PosterID]; !ok {
  189. resultMap[issueRecord.PosterID] = 1
  190. } else {
  191. resultMap[issueRecord.PosterID] += 1
  192. }
  193. }
  194. }
  195. indexTotal += PAGE_SIZE
  196. if indexTotal >= count {
  197. break
  198. }
  199. }
  200. return resultMap
  201. }
  202. func queryCommitActionPublic(start_unix int64, end_unix int64, actionType int64, publicAllRepo map[int64]int) map[int64]int {
  203. sess := x.NewSession()
  204. defer sess.Close()
  205. resultMap := make(map[int64]int)
  206. cond := "user_id=act_user_id and op_type=" + fmt.Sprint(actionType) + " and created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  207. count, err := sess.Where(cond).Count(new(Action))
  208. if err != nil {
  209. log.Info("query action error. return.")
  210. return resultMap
  211. }
  212. var indexTotal int64
  213. indexTotal = 0
  214. for {
  215. sess.Select("id,user_id,op_type,act_user_id,repo_id").Table("action").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  216. actionList := make([]*Action, 0)
  217. sess.Find(&actionList)
  218. log.Info("query action size=" + fmt.Sprint(len(actionList)))
  219. for _, actionRecord := range actionList {
  220. if isPublicRepo(actionRecord.RepoID, publicAllRepo) {
  221. if _, ok := resultMap[actionRecord.UserID]; !ok {
  222. resultMap[actionRecord.UserID] = 1
  223. } else {
  224. resultMap[actionRecord.UserID] += 1
  225. }
  226. }
  227. }
  228. indexTotal += PAGE_SIZE
  229. if indexTotal >= count {
  230. break
  231. }
  232. }
  233. return resultMap
  234. }
  235. func queryCreateIssuePublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) (map[int64]int, map[int64]int) {
  236. sess := x.NewSession()
  237. defer sess.Close()
  238. resultMap := make(map[int64]int)
  239. publicRepoIssueIdMap := make(map[int64]int)
  240. cond := "is_pull=false and created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  241. count, err := sess.Where(cond).Count(new(Issue))
  242. if err != nil {
  243. log.Info("query Issue error. return.")
  244. return resultMap, publicRepoIssueIdMap
  245. }
  246. var indexTotal int64
  247. indexTotal = 0
  248. for {
  249. sess.Select("id,poster_id,repo_id").Table("issue").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  250. issueList := make([]*Issue, 0)
  251. sess.Find(&issueList)
  252. log.Info("query issue size=" + fmt.Sprint(len(issueList)))
  253. for _, issueRecord := range issueList {
  254. if isPublicRepo(issueRecord.RepoID, publicAllRepo) {
  255. if _, ok := resultMap[issueRecord.PosterID]; !ok {
  256. resultMap[issueRecord.PosterID] = 1
  257. } else {
  258. resultMap[issueRecord.PosterID] += 1
  259. }
  260. publicRepoIssueIdMap[issueRecord.ID] = 1
  261. }
  262. }
  263. indexTotal += PAGE_SIZE
  264. if indexTotal >= count {
  265. break
  266. }
  267. }
  268. return resultMap, publicRepoIssueIdMap
  269. }
  270. func queryCommentPublic(start_unix int64, end_unix int64, publicRepoIssueIdMap map[int64]int) map[int64]int {
  271. sess := x.NewSession()
  272. defer sess.Close()
  273. cond := "created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  274. resultMap := make(map[int64]int)
  275. count, err := sess.Where(cond).Count(new(Comment))
  276. if err != nil {
  277. log.Info("query Comment error. return.")
  278. return resultMap
  279. }
  280. var indexTotal int64
  281. indexTotal = 0
  282. for {
  283. sess.Select("id,type,poster_id,issue_id").Table("comment").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  284. commentList := make([]*Comment, 0)
  285. sess.Find(&commentList)
  286. log.Info("query Comment size=" + fmt.Sprint(len(commentList)))
  287. for _, commentRecord := range commentList {
  288. if isPublicRepo(commentRecord.IssueID, publicRepoIssueIdMap) {
  289. if _, ok := resultMap[commentRecord.PosterID]; !ok {
  290. resultMap[commentRecord.PosterID] = 1
  291. } else {
  292. resultMap[commentRecord.PosterID] += 1
  293. }
  294. }
  295. }
  296. indexTotal += PAGE_SIZE
  297. if indexTotal >= count {
  298. break
  299. }
  300. }
  301. return resultMap
  302. }
  303. func queryAllPublicDataSet(publicAllRepo map[int64]int) map[int64]int {
  304. sess := x.NewSession()
  305. defer sess.Close()
  306. publicDataSetIdMap := make(map[int64]int)
  307. count, err := sess.Count(new(Dataset))
  308. if err != nil {
  309. log.Info("query dataset error. return.")
  310. return publicDataSetIdMap
  311. }
  312. var indexTotal int64
  313. indexTotal = 0
  314. for {
  315. sess.Select("id,user_id,repo_id").Table(new(Dataset)).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  316. datasetList := make([]*Dataset, 0)
  317. sess.Find(&datasetList)
  318. log.Info("query datasetList size=" + fmt.Sprint(len(datasetList)))
  319. for _, datasetRecord := range datasetList {
  320. if isPublicRepo(datasetRecord.RepoID, publicAllRepo) {
  321. publicDataSetIdMap[datasetRecord.ID] = 1
  322. }
  323. }
  324. indexTotal += PAGE_SIZE
  325. if indexTotal >= count {
  326. break
  327. }
  328. }
  329. return publicDataSetIdMap
  330. }
  331. func queryPublicDatasetFileNums(start_unix int64, end_unix int64, publicDataSetIdMap map[int64]int) map[int64]int {
  332. sess := x.NewSession()
  333. defer sess.Close()
  334. resultNumMap := make(map[int64]int)
  335. cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  336. count, err := sess.Where(cond).Count(new(Attachment))
  337. if err != nil {
  338. log.Info("query attachment error. return.")
  339. return resultNumMap
  340. }
  341. var indexTotal int64
  342. indexTotal = 0
  343. for {
  344. sess.Select("id,uploader_id,size,dataset_id").Table("attachment").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  345. attachmentList := make([]*Attachment, 0)
  346. sess.Find(&attachmentList)
  347. log.Info("query Attachment size=" + fmt.Sprint(len(attachmentList)))
  348. for _, attachRecord := range attachmentList {
  349. if isPublicRepo(attachRecord.DatasetID, publicDataSetIdMap) {
  350. if _, ok := resultNumMap[attachRecord.UploaderID]; !ok {
  351. resultNumMap[attachRecord.UploaderID] = 1
  352. } else {
  353. resultNumMap[attachRecord.UploaderID] += 1
  354. }
  355. }
  356. }
  357. indexTotal += PAGE_SIZE
  358. if indexTotal >= count {
  359. break
  360. }
  361. }
  362. return resultNumMap
  363. }
  364. func queryUserModelPublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) map[int64]int {
  365. sess := x.NewSession()
  366. defer sess.Close()
  367. resultMap := make(map[int64]int)
  368. cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  369. count, err := sess.Where(cond).Count(new(AiModelManage))
  370. if err != nil {
  371. log.Info("query AiModelManage error. return.")
  372. return resultMap
  373. }
  374. var indexTotal int64
  375. indexTotal = 0
  376. for {
  377. sess.Select("id,user_id,repo_id").Table("ai_model_manage").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  378. aiModelList := make([]*AiModelManage, 0)
  379. sess.Find(&aiModelList)
  380. log.Info("query AiModelManage size=" + fmt.Sprint(len(aiModelList)))
  381. for _, aiModelRecord := range aiModelList {
  382. if isPublicRepo(aiModelRecord.RepoId, publicAllRepo) {
  383. if _, ok := resultMap[aiModelRecord.UserId]; !ok {
  384. resultMap[aiModelRecord.UserId] = 1
  385. } else {
  386. resultMap[aiModelRecord.UserId] += 1
  387. }
  388. }
  389. }
  390. indexTotal += PAGE_SIZE
  391. if indexTotal >= count {
  392. break
  393. }
  394. }
  395. return resultMap
  396. }
  397. func QueryUserLoginInfo(userIds []int64) []*UserLoginLog {
  398. statictisSess := xStatistic.NewSession()
  399. defer statictisSess.Close()
  400. var cond = builder.NewCond()
  401. cond = cond.And(builder.In("u_id", userIds))
  402. statictisSess.Select("*").Table(new(UserLoginLog)).Where(cond)
  403. loginList := make([]*UserLoginLog, 0)
  404. statictisSess.Find(&loginList)
  405. return loginList
  406. }
  407. var WeekBonusData = make(map[int64][]int)
  408. func QueryUserAnnualReport(userId int64) *UserSummaryCurrentYear {
  409. statictisSess := xStatistic.NewSession()
  410. defer statictisSess.Close()
  411. log.Info("userId=" + fmt.Sprint(userId))
  412. if len(WeekBonusData) == 0 {
  413. WeekBonusData = getBonusWeekDataMap()
  414. }
  415. reList := make([]*UserSummaryCurrentYear, 0)
  416. err := statictisSess.Select("*").Table(new(UserSummaryCurrentYear)).Where("id=" + fmt.Sprint(userId)).Find(&reList)
  417. if err == nil {
  418. if len(reList) > 0 {
  419. record, ok := WeekBonusData[userId]
  420. if ok {
  421. bonusInfo := make(map[string]int)
  422. bonusInfo["order"] = record[0]
  423. bonusInfo["money"] = record[1]
  424. bonusInfo["week"] = record[2]
  425. bonusInfo["num"] = record[3]
  426. bonusInfoJson, _ := json.Marshal(bonusInfo)
  427. reList[0].WeekBonusData = string(bonusInfoJson)
  428. }
  429. return reList[0]
  430. }
  431. } else {
  432. log.Info("error:=" + err.Error())
  433. }
  434. dbuser, err := GetUserByID(userId)
  435. if err == nil {
  436. return &UserSummaryCurrentYear{
  437. ID: dbuser.ID,
  438. Name: dbuser.Name,
  439. RegistDate: dbuser.CreatedUnix,
  440. }
  441. }
  442. return nil
  443. }