main.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. 抽取结果对比
  3. */
  4. package main
  5. import (
  6. "flag"
  7. "fmt"
  8. "jy/mongodbutil"
  9. "log"
  10. qu "qfw/util"
  11. "github.com/tealeg/xlsx"
  12. "gopkg.in/mgo.v2/bson"
  13. )
  14. var (
  15. SysConfig map[string]interface{}
  16. Premgo *mongodbutil.Pool //上个版本库
  17. Newmgo *mongodbutil.Pool //当前版本库
  18. FieldData map[string]map[string]*Data
  19. Compares map[string]*Compare
  20. Sid, Eid string
  21. Fields []string
  22. FieldsQuery string
  23. )
  24. type Compare struct {
  25. Field string //属性
  26. PreExtNum, NewExtNum int //上个版、当前版有值数量
  27. PreNilnum, NewNilnum int //上个版、当前版无值数量
  28. EqNum, NEqNum int //相等、不等数据量
  29. }
  30. type Data struct {
  31. Id string
  32. PreVal, NewVal string
  33. }
  34. func init() {
  35. flag.StringVar(&Sid, "sid", "5d348c0ca5cb26b9b76a4bb8", "开始id")
  36. flag.StringVar(&Eid, "eid", "5d34ae22a5cb26b9b7850b43", "结束id")
  37. flag.Parse()
  38. qu.ReadConfig(&SysConfig)
  39. Premgo = mongodbutil.MgoFactory(1, 3, 120, qu.ObjToString(SysConfig["premgo"]), qu.ObjToString(SysConfig["predb"]))
  40. Newmgo = mongodbutil.MgoFactory(1, 3, 120, qu.ObjToString(SysConfig["newmgo"]), qu.ObjToString(SysConfig["newdb"]))
  41. tmp, _ := SysConfig["fields"].([]interface{})
  42. for k, v := range tmp {
  43. Fields = append(Fields, qu.ObjToString(v))
  44. if k < (len(tmp) - 1) {
  45. FieldsQuery += `"` + qu.ObjToString(v) + `":1,`
  46. } else {
  47. FieldsQuery += `"` + qu.ObjToString(v) + `":1`
  48. }
  49. }
  50. FieldData = map[string]map[string]*Data{}
  51. Compares = map[string]*Compare{}
  52. }
  53. func main() {
  54. getVersionData()
  55. createXlsx()
  56. }
  57. func createXlsx() {
  58. xf, err := xlsx.OpenFile("template.xlsx")
  59. if err != nil {
  60. log.Println(err)
  61. return
  62. }
  63. //生成第一个sheet信息
  64. sh := xf.Sheets[0]
  65. for i, field := range Fields {
  66. for k, row := range sh.Rows {
  67. if k > 2+i {
  68. style := (*row).Cells[1].GetStyle()
  69. style.Font.Color = "000000"
  70. (*row).Cells[0].SetString(field)
  71. (*row).Cells[1].SetInt(Compares[field].PreExtNum)
  72. (*row).Cells[1].SetStyle(style)
  73. (*row).Cells[2].SetInt(Compares[field].NewExtNum)
  74. (*row).Cells[2].SetStyle(style)
  75. (*row).Cells[3].SetInt(Compares[field].EqNum)
  76. (*row).Cells[3].SetStyle(style)
  77. (*row).Cells[4].SetInt(Compares[field].NEqNum)
  78. (*row).Cells[4].SetStyle(style)
  79. }
  80. sh.Rows[k] = row
  81. }
  82. }
  83. //生成信息sheet
  84. url := "https://www.jianyu360.com/article/content/%s.html"
  85. for _, field := range Fields {
  86. sh, _ := xf.AddSheet(field)
  87. rowh := sh.AddRow()
  88. rowh.AddCell().SetString("id")
  89. rowh.AddCell().SetString("preval")
  90. rowh.AddCell().SetString("newval")
  91. rowh.AddCell().SetString("url")
  92. tmp := FieldData[field]
  93. for k, v := range tmp {
  94. if v.NewVal != v.PreVal {
  95. row := sh.AddRow()
  96. row.AddCell().SetString(k)
  97. row.AddCell().SetString(v.PreVal)
  98. row.AddCell().SetString(v.NewVal)
  99. row.AddCell().SetString(fmt.Sprintf(url, qu.CommonEncodeArticle("content", v.Id)))
  100. }
  101. }
  102. }
  103. err = xf.Save("result.xlsx")
  104. if err != nil {
  105. log.Println("保存xlsx失败:", err)
  106. return
  107. }
  108. log.Println("xlsx保存成功")
  109. }
  110. func getVersionData() {
  111. query := bson.M{"_id": bson.M{"$gte": bson.ObjectIdHex(Sid), "$lte": bson.ObjectIdHex(Eid)}}
  112. log.Println(qu.ObjToString(SysConfig["prec"]), query)
  113. list1, _ := Premgo.Find(qu.ObjToString(SysConfig["prec"]), query, nil, `{`+FieldsQuery+`}`, false, -1, -1)
  114. for _, v := range *list1 {
  115. for _, key := range Fields {
  116. rd := FieldData[key]
  117. if rd == nil {
  118. rd = map[string]*Data{}
  119. }
  120. rd[qu.BsonIdToSId(v["_id"])] = &Data{
  121. Id: qu.BsonIdToSId(v["_id"]),
  122. PreVal: fmt.Sprint(v[key]),
  123. }
  124. FieldData[key] = rd
  125. }
  126. }
  127. log.Println("pre version 加载完成")
  128. list2, _ := Newmgo.Find(qu.ObjToString(SysConfig["newc"]), query, nil, `{`+FieldsQuery+`}`, false, -1, -1)
  129. for _, v := range *list2 {
  130. for _, field := range Fields {
  131. rd := FieldData[field]
  132. if rd == nil {
  133. rd = map[string]*Data{}
  134. }
  135. _id := qu.BsonIdToSId(v["_id"])
  136. tmp := rd[_id]
  137. if tmp != nil {
  138. tmp.NewVal = fmt.Sprint(v[field])
  139. rd[_id] = tmp
  140. } else {
  141. rd[_id] = &Data{
  142. NewVal: fmt.Sprint(v[field]),
  143. }
  144. }
  145. FieldData[field] = rd
  146. }
  147. }
  148. log.Println("new version 加载完成")
  149. for k, v := range FieldData {
  150. cp := &Compare{Field: k}
  151. for _, d := range v {
  152. if d.NewVal != "" && d.PreVal != "" {
  153. if d.NewVal == d.PreVal {
  154. cp.EqNum++
  155. } else {
  156. cp.NEqNum++
  157. }
  158. cp.PreExtNum++
  159. cp.NewExtNum++
  160. } else {
  161. if d.NewVal == "" {
  162. cp.NewNilnum++
  163. if d.PreVal != "" {
  164. cp.NEqNum++
  165. cp.PreExtNum++
  166. }
  167. }
  168. if d.PreVal == "" {
  169. cp.PreNilnum++
  170. if d.NewVal != "" {
  171. cp.NewExtNum++
  172. cp.NEqNum++
  173. }
  174. }
  175. }
  176. }
  177. Compares[k] = cp
  178. }
  179. }