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.

cloudbrain_static.go 18 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
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 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
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. package models
  2. import (
  3. "strconv"
  4. "time"
  5. "code.gitea.io/gitea/modules/log"
  6. "code.gitea.io/gitea/modules/timeutil"
  7. "code.gitea.io/gitea/modules/util"
  8. "xorm.io/builder"
  9. )
  10. type TaskDetail struct {
  11. ID int64 `json:"ID"`
  12. JobID string `json:"JobID"`
  13. JobName string `json:"JobName"`
  14. DisplayJobName string `json:"DisplayJobName"`
  15. Status string `json:"Status"`
  16. JobType string `json:"JobType"`
  17. CreatedUnix timeutil.TimeStamp `json:"CreatedUnix"`
  18. WaitTime string `json:"WaitTime"`
  19. RunTime string `json:"RunTime"`
  20. StartTime timeutil.TimeStamp `json:"StartTime"`
  21. EndTime timeutil.TimeStamp `json:"EndTime"`
  22. ComputeResource string `json:"ComputeResource"`
  23. Type int `json:"Type"`
  24. UserName string `json:"UserName"`
  25. RepoName string `json:"RepoName"`
  26. RepoAlias string `json:"RepoAlias"`
  27. RepoID int64 `json:"RepoID"`
  28. IsDelete bool `json:"IsDelete"`
  29. CardNum int `json:"CardNum"`
  30. CardType string `json:"CardType"`
  31. CardDuration string `json:"CardDuration"`
  32. AiCenter string `json:"AiCenter"`
  33. FlavorName string `json:"FlavorName"`
  34. WorkServerNum int64 `json:"WorkServerNum"`
  35. Spec *Specification `json:"Spec"`
  36. }
  37. type CloudbrainDurationStatistic struct {
  38. ID int64 `xorm:"pk autoincr"`
  39. Cluster string
  40. AiCenterCode string `xorm:"INDEX"`
  41. AiCenterName string
  42. ComputeResource string
  43. AccCardType string `xorm:"INDEX"`
  44. DateTime timeutil.TimeStamp `xorm:"INDEX DEFAULT 0"`
  45. DateTimeUnix timeutil.TimeStamp `xorm:"INDEX DEFAULT 0"`
  46. DayTime string `xorm:"INDEX"`
  47. HourTime int `xorm:"INDEX"`
  48. CardsUseDuration int
  49. CardsTotalDuration int
  50. CardsTotalNum int
  51. DeletedUnix timeutil.TimeStamp `xorm:"deleted"`
  52. CreatedUnix timeutil.TimeStamp `xorm:"created"`
  53. UpdatedUnix timeutil.TimeStamp `xorm:"updated"`
  54. }
  55. type DurationStatisticOptions struct {
  56. BeginTime time.Time
  57. EndTime time.Time
  58. AiCenterCode string
  59. }
  60. type DurationRateStatistic struct {
  61. AiCenterTotalDurationStat map[string]int `json:"aiCenterTotalDurationStat"`
  62. AiCenterUsageDurationStat map[string]int `json:"aiCenterUsageDurationStat"`
  63. UsageRate map[string]float64 `json:"UsageRate"`
  64. }
  65. type ResourceDetail struct {
  66. QueueCode string
  67. Cluster string `xorm:"notnull"`
  68. AiCenterCode string
  69. AiCenterName string
  70. ComputeResource string
  71. AccCardType string
  72. CardsTotalNum int
  73. IsAutomaticSync bool
  74. }
  75. type DateUsageStatistic struct {
  76. Date string `json:"date"`
  77. UsageDuration int `json:"usageDuration"`
  78. TotalDuration int `json:"totalDuration"`
  79. UsageRate float64 `json:"usageRate"`
  80. }
  81. type HourTimeStatistic struct {
  82. HourTimeUsageDuration map[string]int `json:"hourTimeUsageDuration"`
  83. HourTimeTotalDuration map[string]int `json:"hourTimeTotalDuration"`
  84. HourTimeUsageRate map[string]float64 `json:"hourTimeUsageRate"`
  85. }
  86. type CloudbrainTypeDuration []struct {
  87. Type int `xorm:"type"`
  88. DurationSum int `xorm:"durationSum"`
  89. CardDurationSum int `xorm:"cardDurationSum"`
  90. Count int `xorm:"count"`
  91. }
  92. type CloudbrainAllDuration struct {
  93. DurationSum int `xorm:"durationSum"`
  94. CardDurationSum int `xorm:"cardDurationSum"`
  95. Count int `xorm:"count"`
  96. }
  97. func GetTodayCreatorCount(beginTime time.Time, endTime time.Time) (int64, error) {
  98. countSql := "SELECT count(distinct user_id) FROM " +
  99. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  100. " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10)
  101. return x.SQL(countSql).Count()
  102. }
  103. func GetTodayCloudbrainCount(beginTime time.Time, endTime time.Time) (int64, error) {
  104. countSql := "SELECT count(*) FROM " +
  105. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  106. " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10)
  107. return x.SQL(countSql).Count()
  108. }
  109. func GetTodayRunningCount(beginTime time.Time, endTime time.Time) (int64, error) {
  110. countSql := "SELECT count(*) FROM " +
  111. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  112. " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10) + " and (status='" + string(JobRunning) + "'" +
  113. " or status='" + string(ModelArtsTrainJobInit) + "')"
  114. return x.SQL(countSql).Count()
  115. }
  116. func GetTodayWaitingCount(beginTime time.Time, endTime time.Time) (int64, error) {
  117. countSql := "SELECT count(*) FROM " +
  118. "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
  119. " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10) + " and status='" + string(JobWaiting) + "'"
  120. return x.SQL(countSql).Count()
  121. }
  122. func GetCreatorCount() (int64, error) {
  123. countSql := "SELECT count(distinct user_id) FROM public.cloudbrain"
  124. return x.SQL(countSql).Count()
  125. }
  126. func GetCloudbrainTypeCount() ([]map[string]string, error) {
  127. countSql := "SELECT type,count(*) num FROM public.cloudbrain group by type order by num desc"
  128. return x.QueryString(countSql)
  129. }
  130. func GetCloudbrainStatusCount() ([]map[string]string, error) {
  131. countSql := "SELECT status,count(*) num FROM public.cloudbrain group by status order by num desc"
  132. return x.QueryString(countSql)
  133. }
  134. func GetCloudbrainTpyeDurationSum() ([]map[string]string, error) {
  135. countSql := "SELECT type,sum(duration) FROM public.cloudbrain group by type order by sum(duration) desc"
  136. return x.QueryString(countSql)
  137. }
  138. func GetRecordBeginTime() ([]*CloudbrainInfo, error) {
  139. sess := x.NewSession()
  140. defer sess.Close()
  141. sess.OrderBy("cloudbrain.id ASC limit 1")
  142. cloudbrains := make([]*CloudbrainInfo, 0)
  143. if err := sess.Table(&Cloudbrain{}).Unscoped().
  144. Find(&cloudbrains); err != nil {
  145. log.Info("find error.")
  146. }
  147. return cloudbrains, nil
  148. }
  149. func GetAllStatusCloudBrain() map[string]int {
  150. sess := x.NewSession()
  151. defer sess.Close()
  152. cloudbrains := make([]*CloudbrainInfo, 0)
  153. if err := sess.Table(&Cloudbrain{}).Unscoped().
  154. Find(&cloudbrains); err != nil {
  155. log.Info("find error.")
  156. }
  157. cloudBrainStatusResult := make(map[string]int)
  158. for _, cloudbrain := range cloudbrains {
  159. if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok {
  160. cloudBrainStatusResult[cloudbrain.Status] = 1
  161. } else {
  162. cloudBrainStatusResult[cloudbrain.Status] += 1
  163. }
  164. }
  165. return cloudBrainStatusResult
  166. }
  167. func GetWaittingTop() ([]*CloudbrainInfo, error) {
  168. sess := x.NewSession()
  169. defer sess.Close()
  170. var cond = builder.NewCond()
  171. cond = cond.And(
  172. builder.Eq{"cloudbrain.status": string(JobWaiting)},
  173. )
  174. sess.OrderBy("cloudbrain.created_unix ASC limit 10")
  175. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  176. if err := sess.Table(&Cloudbrain{}).Where(cond).
  177. Find(&cloudbrains); err != nil {
  178. log.Info("find error.")
  179. }
  180. var ids []int64
  181. for _, task := range cloudbrains {
  182. ids = append(ids, task.RepoID)
  183. }
  184. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  185. if err == nil {
  186. for _, task := range cloudbrains {
  187. task.Repo = repositoryMap[task.RepoID]
  188. }
  189. }
  190. return cloudbrains, nil
  191. }
  192. func GetRunningTop() ([]*CloudbrainInfo, error) {
  193. sess := x.NewSession()
  194. defer sess.Close()
  195. var cond = builder.NewCond()
  196. cond = cond.And(
  197. builder.Eq{"cloudbrain.status": string(JobRunning)},
  198. )
  199. sess.OrderBy("cloudbrain.duration DESC limit 10")
  200. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  201. if err := sess.Table(&Cloudbrain{}).Where(cond).
  202. Find(&cloudbrains); err != nil {
  203. log.Info("find error.")
  204. }
  205. var ids []int64
  206. for _, task := range cloudbrains {
  207. ids = append(ids, task.RepoID)
  208. }
  209. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  210. if err == nil {
  211. for _, task := range cloudbrains {
  212. task.Repo = repositoryMap[task.RepoID]
  213. }
  214. }
  215. return cloudbrains, nil
  216. }
  217. func getCreatePeriodCount(dateBeginTime string, dateEndTime string, hourBeginTime string, hourEndTime string) (int64, error) {
  218. countSql := "SET TIME ZONE 'PRC'; SELECT count(*) FROM " +
  219. "public.cloudbrain where to_char(to_timestamp(created_unix), 'YYYY-MM-DD') >= '" + dateBeginTime +
  220. "' and to_char(to_timestamp(created_unix), 'YYYY-MM-DD') < '" + dateEndTime +
  221. "' and to_char(to_timestamp(created_unix), 'HH24:MI:SS') >= '" + hourBeginTime +
  222. "' and to_char(to_timestamp(created_unix), 'HH24:MI:SS') < '" + hourEndTime + "'"
  223. return x.SQL(countSql).Count()
  224. }
  225. func getRunPeriodCount(dateBeginTime string, dateEndTime string, hourBeginTime string, hourEndTime string) (int64, error) {
  226. countSql := "SET TIME ZONE 'PRC'; SELECT count(*) FROM " +
  227. "public.cloudbrain where ((to_char(to_timestamp(start_time), ' HH24:MI:SS') < '" + hourEndTime +
  228. "') and (to_char(to_timestamp(CASE WHEN start_time is not null AND end_time isnull THEN COALESCE(end_time,EXTRACT(epoch FROM now())) ELSE end_time END), 'HH24:MI:SS') >= '" + hourBeginTime + "'))" +
  229. " and (to_char(to_timestamp(start_time), 'YYYY-MM-DD') < '" + dateEndTime +
  230. "' and to_char(to_timestamp(end_time), 'YYYY-MM-DD') >= '" + dateBeginTime + "')"
  231. return x.SQL(countSql).Count()
  232. }
  233. func getRunPeriodCountTest(hourBeginTime string, hourEndTime string) (int64, error) {
  234. countSql := " SELECT count(*) FROM " + "public.cloudbrain where start_time <" + hourEndTime + " and end_time >= " + hourBeginTime
  235. return x.SQL(countSql).Count()
  236. }
  237. func GetCreateHourPeriodCount(dateBeginTime string, dateEndTime string) (map[string]interface{}, error) {
  238. //0 to 23 for each hour,
  239. dateHourMap := make(map[string]interface{})
  240. var slice = []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
  241. for key, value := range slice {
  242. hourBeginHour := util.AddZero(value) + ":00:00"
  243. hourEndHour := util.AddZero(value+1) + ":00:00"
  244. cout, err := getCreatePeriodCount(dateBeginTime, dateEndTime, hourBeginHour, hourEndHour)
  245. if err != nil {
  246. log.Error("Can not query getCreatePeriodCount.", err)
  247. return nil, nil
  248. }
  249. dateHourMap[strconv.Itoa(key)] = cout
  250. }
  251. return dateHourMap, nil
  252. }
  253. func GetRunHourPeriodCount(dateBeginTime string, dateEndTime string) (map[string]int64, error) {
  254. dateHourMap := make(map[string]int64)
  255. var slice = []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
  256. for key, value := range slice {
  257. hourBeginHour := util.AddZero(value) + ":00:00"
  258. hourEndHour := util.AddZero(value+1) + ":00:00"
  259. cout, err := getRunPeriodCount(dateBeginTime, dateEndTime, hourBeginHour, hourEndHour)
  260. if err != nil {
  261. log.Error("Can not query getRunPeriodCount.", err)
  262. return nil, nil
  263. }
  264. dateHourMap[strconv.Itoa(key)] = cout
  265. }
  266. return dateHourMap, nil
  267. }
  268. func GetRunHourPeriodCountTest(cloudbrain Cloudbrain, dateBeginTime time.Time, dateEndTime time.Time) (map[string]int64, error) {
  269. var runHourPeriodCount = make(map[string]int64)
  270. if dateBeginTime.Before(dateEndTime) {
  271. var slice = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
  272. for _, hour := range slice {
  273. hourBeginTime := dateBeginTime
  274. hourEndTime := dateBeginTime.Unix() + int64(3600*(hour+1))
  275. if cloudbrain.StartTime.AsTime().Unix() < hourEndTime && cloudbrain.EndTime.AsTime().Unix() > hourBeginTime.Unix() {
  276. runHourPeriodCount[strconv.Itoa(hour)] = runHourPeriodCount[strconv.Itoa(hour)] + 1
  277. }
  278. }
  279. }
  280. return runHourPeriodCount, nil
  281. }
  282. func GetCloudbrainRunning() ([]*CloudbrainInfo, error) {
  283. sess := x.NewSession()
  284. defer sess.Close()
  285. var cond = builder.NewCond()
  286. cond = cond.And(
  287. builder.Eq{"cloudbrain.status": string(JobRunning)},
  288. )
  289. sess.OrderBy("cloudbrain.created_unix ASC")
  290. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  291. if err := sess.Table(&Cloudbrain{}).Where(cond).
  292. Find(&cloudbrains); err != nil {
  293. log.Info("find error.")
  294. }
  295. return cloudbrains, nil
  296. }
  297. func GetCloudbrainByTime(beginTime int64, endTime int64) ([]*CloudbrainInfo, error) {
  298. sess := x.NewSession()
  299. defer sess.Close()
  300. var cond = builder.NewCond()
  301. cond = cond.Or(
  302. builder.And(builder.Gte{"cloudbrain.end_time": beginTime}, builder.Lte{"cloudbrain.start_time": beginTime}, builder.Gt{"cloudbrain.start_time": 0}),
  303. )
  304. cond = cond.Or(
  305. builder.And(builder.Gte{"cloudbrain.start_time": beginTime}, builder.Lte{"cloudbrain.start_time": endTime}, builder.Gt{"cloudbrain.start_time": 0}),
  306. )
  307. cond = cond.Or(
  308. builder.And(builder.Eq{"cloudbrain.status": string(JobRunning)}, builder.Lte{"cloudbrain.start_time": beginTime}),
  309. )
  310. sess.OrderBy("cloudbrain.id ASC")
  311. cloudbrains := make([]*CloudbrainInfo, 0, 10)
  312. if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  313. Find(&cloudbrains); err != nil {
  314. log.Error("find error.")
  315. return nil, err
  316. }
  317. return cloudbrains, nil
  318. }
  319. func GetSpecByAiCenterCodeAndType(aiCenterCode string, accCardType string) ([]*CloudbrainSpec, error) {
  320. sess := x.NewSession()
  321. defer sess.Close()
  322. var cond = builder.NewCond()
  323. cond = cond.And(
  324. builder.And(builder.Eq{"cloudbrain_spec.ai_center_code": aiCenterCode}, builder.Eq{"cloudbrain_spec.acc_card_type": accCardType}),
  325. )
  326. cloudbrainSpecs := make([]*CloudbrainSpec, 0, 10)
  327. if err := sess.Table(&CloudbrainSpec{}).Where(cond).
  328. Find(&cloudbrainSpecs); err != nil {
  329. log.Error("find error.")
  330. return nil, err
  331. }
  332. return cloudbrainSpecs, nil
  333. }
  334. func InsertCloudbrainDurationStatistic(cloudbrainDurationStatistic *CloudbrainDurationStatistic) (int64, error) {
  335. return xStatistic.Insert(cloudbrainDurationStatistic)
  336. }
  337. func getDurationStatistic(cb *CloudbrainDurationStatistic) (*CloudbrainDurationStatistic, error) {
  338. has, err := x.Get(cb)
  339. if err != nil {
  340. return nil, err
  341. } else if !has {
  342. return nil, ErrJobNotExist{}
  343. }
  344. return cb, nil
  345. }
  346. func GetCanUseCardInfo() ([]*ResourceQueue, error) {
  347. sess := x.NewSession()
  348. defer sess.Close()
  349. sess.OrderBy("resource_queue.cluster DESC, resource_queue.ai_center_code ASC")
  350. ResourceQueues := make([]*ResourceQueue, 0, 10)
  351. if err := sess.Table(&ResourceQueue{}).Find(&ResourceQueues); err != nil {
  352. log.Error("find error.")
  353. return nil, err
  354. }
  355. return ResourceQueues, nil
  356. }
  357. func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDurationStatistic, error) {
  358. sess := xStatistic.NewSession()
  359. defer sess.Close()
  360. var cond = builder.NewCond()
  361. if opts.BeginTime.Unix() > 0 && opts.EndTime.Unix() > 0 {
  362. cond = cond.And(
  363. builder.And(builder.Gte{"cloudbrain_duration_statistic.date_time_unix": opts.BeginTime.Unix()}, builder.Lt{"cloudbrain_duration_statistic.date_time_unix": opts.EndTime.Unix()}),
  364. )
  365. }
  366. if opts.AiCenterCode != "" {
  367. cond = cond.And(
  368. builder.Eq{"cloudbrain_duration_statistic.ai_center_code": opts.AiCenterCode},
  369. )
  370. }
  371. CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0, 10)
  372. if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).
  373. Find(&CloudbrainDurationStatistics); err != nil {
  374. log.Error("find error.")
  375. return nil, err
  376. }
  377. return CloudbrainDurationStatistics, nil
  378. }
  379. func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) {
  380. sess := xStatistic.NewSession()
  381. defer sess.Close()
  382. var cond = builder.NewCond()
  383. cond = cond.And(
  384. builder.Gt{"cloudbrain_duration_statistic.date_time_unix": 0},
  385. )
  386. sess.OrderBy("cloudbrain_duration_statistic.date_time_unix ASC limit 1")
  387. CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0)
  388. if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).Find(&CloudbrainDurationStatistics); err != nil {
  389. log.Error("find error.")
  390. return nil, err
  391. }
  392. return CloudbrainDurationStatistics, nil
  393. }
  394. func GetDurationRecordUpdateTime() ([]*CloudbrainDurationStatistic, error) {
  395. sess := xStatistic.NewSession()
  396. defer sess.Close()
  397. var cond = builder.NewCond()
  398. cond = cond.And(
  399. builder.Gt{"cloudbrain_duration_statistic.date_time_unix": 1577808000},
  400. )
  401. sess.OrderBy("cloudbrain_duration_statistic.date_time_unix DESC limit 1")
  402. CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0)
  403. if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).Find(&CloudbrainDurationStatistics); err != nil {
  404. log.Error("find error.")
  405. return nil, err
  406. }
  407. return CloudbrainDurationStatistics, nil
  408. }
  409. func DeleteCloudbrainDurationStatistic(beginTime timeutil.TimeStamp, endTime timeutil.TimeStamp) error {
  410. sess := xStatistic.NewSession()
  411. defer sess.Close()
  412. if _, err := sess.Exec("DELETE FROM cloudbrain_duration_statistic WHERE cloudbrain_duration_statistic.date_time_unix BETWEEN ? AND ?", beginTime, endTime); err != nil {
  413. log.Error("DELETE cloudbrain_duration_statistic data error.")
  414. return err
  415. }
  416. return nil
  417. }
  418. func GetCloudbrainTypeCardDuration() (CloudbrainTypeDuration, error) {
  419. query := `
  420. SELECT
  421. cloudbrain.type,
  422. SUM(cloudbrain.duration) as durationSum,
  423. SUM(
  424. COALESCE(cloudbrain.duration *
  425. CASE
  426. WHEN cloudbrain.work_server_number = 0 THEN 1
  427. ELSE COALESCE(cloudbrain.work_server_number, 1)
  428. END *
  429. COALESCE(cloudbrain_spec.acc_cards_num, 1), 0)
  430. ) as cardDurationSum,
  431. COUNT(*) as count
  432. FROM cloudbrain
  433. LEFT JOIN cloudbrain_spec
  434. ON cloudbrain.id = cloudbrain_spec.cloudbrain_id
  435. GROUP BY cloudbrain.type
  436. `
  437. // 执行查询
  438. var results CloudbrainTypeDuration
  439. if err := x.SQL(query).Find(&results); err != nil {
  440. panic(err)
  441. }
  442. return results, nil
  443. }
  444. func GetCloudbrainAllCardDuration() (CloudbrainAllDuration, error) {
  445. query := `
  446. SELECT
  447. SUM(cloudbrain.duration) as durationSum,
  448. SUM(
  449. COALESCE(cloudbrain.duration *
  450. CASE
  451. WHEN cloudbrain.work_server_number = 0 THEN 1
  452. ELSE COALESCE(cloudbrain.work_server_number, 1)
  453. END *
  454. COALESCE(cloudbrain_spec.acc_cards_num, 1), 0)
  455. ) as cardDurationSum,
  456. COUNT(*) as count
  457. FROM cloudbrain
  458. LEFT JOIN cloudbrain_spec
  459. ON cloudbrain.id = cloudbrain_spec.cloudbrain_id
  460. `
  461. // 执行查询
  462. var result CloudbrainAllDuration
  463. if _, err := x.SQL(query).Get(&result); err != nil {
  464. panic(err)
  465. }
  466. return result, nil
  467. }