load_data.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. "medical_project/config"
  6. "time"
  7. )
  8. func loadData(starttime int64) {
  9. log.Println("load project start..", starttime)
  10. findLock.Lock()
  11. defer findLock.Unlock()
  12. AllIdsMapLock.Lock()
  13. defer AllIdsMapLock.Unlock()
  14. sess := MongoPro.GetMgoConn()
  15. defer MongoPro.DestoryMongoConn(sess)
  16. loadOver := make(chan bool)
  17. q := map[string]interface{}{
  18. "lasttime": map[string]interface{}{"$gte": starttime},
  19. }
  20. //field := map[string]interface{}{"list": 0}
  21. it := sess.DB(config.Conf.DB.MongoP.Dbname).C(config.Conf.DB.MongoP.Coll).Find(&q).Select(nil).Iter()
  22. n := 0
  23. pool := make(chan *Project, 1000)
  24. go func() {
  25. for {
  26. select {
  27. case tmp := <-pool:
  28. n++
  29. if n%10000 == 0 {
  30. log.Println("current", n, "\n", tmp.Id, len(mapPn), len(mapPc), len(mapPb)) //, tmp.ProjectName, tmp.MPN, tmp.ProjectCode, tmp.MPC, tmp.Buyer)
  31. }
  32. if tmp != nil {
  33. id := tmp.Id.Hex()
  34. for _, v := range append([]string{tmp.ProjectName}, tmp.MPN...) {
  35. if v != "" {
  36. //v = pcReplace.ReplaceAllString(v, "")
  37. if v != "" {
  38. k := mapPn[v]
  39. if k == nil {
  40. k = &Key{Arr: []string{id}}
  41. mapPn[v] = k
  42. } else {
  43. k.Arr = append(k.Arr, id)
  44. }
  45. }
  46. }
  47. }
  48. for _, v := range append([]string{tmp.ProjectCode}, tmp.MPC...) {
  49. if v != "" {
  50. //v = pcReplace.ReplaceAllString(v, "")
  51. if v != "" {
  52. k := mapPc[v]
  53. if k == nil {
  54. k = &Key{Arr: []string{id}}
  55. mapPc[v] = k
  56. } else {
  57. k.Arr = append(k.Arr, id)
  58. }
  59. }
  60. }
  61. }
  62. if tmp.Buyer != "" && len([]rune(tmp.Buyer)) > 2 {
  63. k := mapPb[tmp.Buyer]
  64. if k == nil {
  65. k = &Key{Arr: []string{id}}
  66. mapPb[tmp.Buyer] = k
  67. } else {
  68. k.Arr = append(k.Arr, id)
  69. }
  70. }
  71. AllIdsMap[id] = &ID{Id: id, P: tmp}
  72. }
  73. case <-loadOver:
  74. return
  75. }
  76. }
  77. }()
  78. for {
  79. result := make(map[string]interface{})
  80. if it.Next(&result) {
  81. go func(res map[string]interface{}) {
  82. bys, _ := json.Marshal(result)
  83. var tmp *Project
  84. _ = json.Unmarshal(bys, &tmp)
  85. saveFiled(result, tmp)
  86. pool <- tmp
  87. }(result)
  88. } else {
  89. break
  90. }
  91. }
  92. time.Sleep(2 * time.Second)
  93. loadOver <- true
  94. log.Println("load project over..", n)
  95. }
  96. func saveFiled(res map[string]interface{}, tmp *Project) {
  97. tmpMap := make(map[string]InfoField)
  98. infoMap := res["infofield"].(map[string]interface{})
  99. for _, v := range infoMap {
  100. var field InfoField
  101. b, _ := json.Marshal(v)
  102. _ = json.Unmarshal(b, &field)
  103. tmpMap[tmp.Id.Hex()] = field
  104. }
  105. tmp.InfoFiled = tmpMap
  106. }