main.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/tealeg/xlsx"
  6. "go.mongodb.org/mongo-driver/bson"
  7. mgo "mongodb"
  8. "os"
  9. qu "qfw/util"
  10. "sync"
  11. "time"
  12. "util"
  13. )
  14. var (
  15. Mgo *mgo.MongodbSim
  16. )
  17. func init() {
  18. Mgo = &mgo.MongodbSim{
  19. MongodbAddr: "127.0.0.1:27086", // 127.0.0.1:27084
  20. Size: 5,
  21. DbName: "jyqykhfw",
  22. }
  23. Mgo.InitPool()
  24. }
  25. func ShowTable() {
  26. fmt.Println("================================")
  27. fmt.Println("小工具-数据处理")
  28. fmt.Println("1、导入清洗数据")
  29. fmt.Println("2、推送数据")
  30. fmt.Println("3、数据判重")
  31. fmt.Println("0、EXIT")
  32. fmt.Println("================================")
  33. }
  34. func main() {
  35. for {
  36. ShowTable()
  37. var flag int
  38. fmt.Print("请输入你的操作:")
  39. fmt.Scan(&flag)
  40. if flag == 0 {
  41. fmt.Println("退出成功")
  42. os.Exit(0)
  43. } else if flag == 1 {
  44. fmt.Println("请输入文档地址.")
  45. var p string
  46. fmt.Scan(&p)
  47. if p != "" {
  48. task1(p)
  49. }
  50. } else if flag == 2 {
  51. fmt.Println("导入推送表数据.")
  52. task2()
  53. } else if flag == 3 {
  54. fmt.Println("请输入文档地址,进行数据判重.")
  55. var p string
  56. fmt.Scan(&p)
  57. if p != "" {
  58. task3()
  59. }
  60. }
  61. }
  62. }
  63. var FieldsMap = map[string]string{
  64. "是否优选": "is_push",
  65. "运营商中标标签": "tagname",
  66. "主体公司": "tagname2",
  67. "中标人": "s_winner",
  68. "招标人": "buyer",
  69. "中标金额": "bidamount",
  70. "是否为多标多包数据": "multipackage",
  71. }
  72. func task1(path string) {
  73. if path != "" {
  74. file, err := xlsx.OpenFile(path)
  75. if err != nil {
  76. panic(err)
  77. }
  78. sheet := file.Sheets[0]
  79. count := 0
  80. idcolnum := -1
  81. cellFieldName := map[int]string{}
  82. lastid := ""
  83. c1 := 0 // 多包第n条数据
  84. for rn, row := range sheet.Rows {
  85. update := make(map[string]interface{})
  86. if rn == 0 {
  87. for index, cell := range row.Cells {
  88. if cell.Value == "唯一标识" || cell.Value == "标讯编码(infoID)" { //id所在列
  89. idcolnum = index
  90. }
  91. if v := FieldsMap[cell.Value]; v != "" {
  92. cellFieldName[index] = v
  93. }
  94. }
  95. if idcolnum == -1 {
  96. break
  97. }
  98. continue
  99. } else {
  100. id := row.Cells[idcolnum].String()
  101. id = util.SE.DecodeString(id)
  102. for i, f := range cellFieldName {
  103. if val := row.Cells[i].Value; val != "" {
  104. if f == "is_push" {
  105. update[f] = qu.IntAll(val)
  106. } else if f == "multipackage" {
  107. update[fmt.Sprintf("v_baseinfo.%s", f)] = qu.IntAll(val)
  108. } else if f == "bidamount" {
  109. update[fmt.Sprintf("v_baseinfo.%s", f)] = qu.Float64All(val)
  110. } else {
  111. update[fmt.Sprintf("v_baseinfo.%s", f)] = val
  112. }
  113. }
  114. }
  115. if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 {
  116. if c1 == 0 {
  117. count++
  118. }
  119. if c1 > 0 && lastid == id {
  120. info, _ := Mgo.FindById("f_sourceinfo_chinaunicom_zb_data", id, bson.M{"v_baseinfo.tagname": 1, "v_baseinfo.tagname2": 1, "v_baseinfo.s_winner": 1,
  121. "v_baseinfo.bidamount": 1, "v_baseinfo.package": 1})
  122. if len(*info) > 0 {
  123. baseinfo := (*info)["v_baseinfo"].(map[string]interface{})
  124. if baseinfo["package"] != nil {
  125. packageM := baseinfo["package"].(map[string]interface{})
  126. m := make(map[string]interface{})
  127. if update["v_baseinfo.bidamount"] != nil {
  128. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  129. }
  130. if update["v_baseinfo.s_winner"] != nil {
  131. m["s_winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  132. }
  133. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  134. update["v_baseinfo.package"] = packageM
  135. }
  136. if s := qu.ObjToString(baseinfo["tagname"]); s != "" {
  137. update["v_baseinfo.tagname"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname"])
  138. }
  139. if s := qu.ObjToString(baseinfo["tagname2"]); s != "" {
  140. update["v_baseinfo.tagname2"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname2"])
  141. }
  142. if s := qu.ObjToString(baseinfo["s_winner"]); s != "" {
  143. update["v_baseinfo.s_winner"] = s + "," + qu.ObjToString(update["v_baseinfo.s_winner"])
  144. }
  145. update["v_baseinfo.bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"]) + qu.Float64All(baseinfo["bidamount"])
  146. c1++
  147. }
  148. } else {
  149. c1 = 0
  150. packageM := make(map[string]interface{})
  151. m := make(map[string]interface{})
  152. if update["v_baseinfo.bidamount"] != nil {
  153. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  154. }
  155. if update["v_baseinfo.s_winner"] != nil {
  156. m["s_winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  157. }
  158. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  159. update["v_baseinfo.package"] = packageM
  160. c1++
  161. }
  162. } else {
  163. count++
  164. c1 = 0
  165. }
  166. // 临时
  167. update["tag"] = "临时"
  168. lastid = id
  169. qu.Debug(update)
  170. Mgo.UpdateById("f_sourceinfo_chinaunicom_zb_data", id, bson.M{"$set": update})
  171. }
  172. }
  173. qu.Debug(fmt.Sprintf("更新数据成功,更新: %d条", count))
  174. os.Exit(0)
  175. }
  176. }
  177. func task2() {
  178. sess := Mgo.GetMgoConn()
  179. defer Mgo.DestoryMongoConn(sess)
  180. ch := make(chan bool, 5)
  181. wg := &sync.WaitGroup{}
  182. q := bson.M{"tag": "临时"}
  183. query := sess.DB(Mgo.DbName).C("f_sourceinfo_chinaunicom_zb_data").Find(q).Select(nil).Iter()
  184. count := 0
  185. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  186. ch <- true
  187. wg.Add(1)
  188. go func(tmp map[string]interface{}) {
  189. defer func() {
  190. <-ch
  191. wg.Done()
  192. }()
  193. info := tmp["v_baseinfo"].(map[string]interface{})
  194. info["createtime"] = time.Now().Unix()
  195. if qu.ObjToString(info["id"]) == "" {
  196. info["id"] = tmp["id"]
  197. }
  198. info["isOptimization"] = 1
  199. delete(info, "field_source")
  200. delete(info, "regions_log")
  201. Mgo.Save("tmp_usermail", info)
  202. }(tmp)
  203. tmp = make(map[string]interface{})
  204. }
  205. wg.Wait()
  206. qu.Debug(fmt.Sprintf("推送数据成功,推送成功: %d条", count))
  207. os.Exit(0)
  208. }
  209. func task3() {
  210. var path string
  211. flag.StringVar(&path, "f", "", "文件路径")
  212. flag.Parse()
  213. if path != "" {
  214. file, err := xlsx.OpenFile(path)
  215. if err != nil {
  216. panic(err)
  217. }
  218. sheet := file.Sheets[0]
  219. cellFieldName := map[int]string{}
  220. for rn, row := range sheet.Rows {
  221. if rn == 0 {
  222. for index, cell := range row.Cells {
  223. //if cell.Value == "招标人" || cell.Value == "中标人" || cell.Value == "中标金额" {
  224. // qu.Debug(cell.Value, index)
  225. //}
  226. if v := FieldsMap[cell.Value]; v != "" {
  227. cellFieldName[index] = v
  228. }
  229. }
  230. } else {
  231. q := bson.M{}
  232. for i, f := range cellFieldName {
  233. if val := row.Cells[i].Value; val != "" && (f == "s_winner" || f == "buyer") {
  234. q[f] = val
  235. }
  236. if val := row.Cells[i].Value; val != "" && f == "bidamount" {
  237. if qu.Float64All(val) != 0 {
  238. q[f] = qu.Float64All(val)
  239. }
  240. }
  241. }
  242. info, _ := Mgo.FindOne("zglt_history", q)
  243. if len(*info) > 0 {
  244. row.Cells[12].SetValue(-1)
  245. } else {
  246. row.Cells[12].SetValue(1)
  247. }
  248. }
  249. }
  250. err = file.Save(path)
  251. } else {
  252. flag.PrintDefaults()
  253. }
  254. }