main.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/cron"
  5. "github.com/tealeg/xlsx"
  6. "log"
  7. "os"
  8. qu "qfw/util"
  9. "time"
  10. )
  11. var (
  12. sysconfig map[string]interface{} //配置文件
  13. save_mgo *MongodbSim //mongodb操作对象
  14. save_c_name string
  15. )
  16. var Url = "https://www.jianyu360.com/article/content/%s.html"
  17. func initMgo() {
  18. saveconf := sysconfig["save_mgodb"].(map[string]interface{})
  19. save_c_name = qu.ObjToString(saveconf["coll"])
  20. save_mgo = &MongodbSim{
  21. MongodbAddr: saveconf["addr"].(string),
  22. DbName: saveconf["db"].(string),
  23. Size: qu.IntAllDef(saveconf["pool"], 5),
  24. Password: "zk@123123",
  25. UserName: "zhengkun",
  26. }
  27. save_mgo.InitPool()
  28. }
  29. func init() {
  30. //加载配置文件
  31. qu.ReadConfig(&sysconfig)
  32. initMgo()
  33. }
  34. func main() {
  35. //定时任务
  36. c := cron.New()
  37. c.AddFunc("0 30 7 ? * *", func() {
  38. exportSpecSiteDataWeek() //周邮件-每周1点 8点
  39. exportSpecSiteDataMonth() //月邮件-每月1号 8点
  40. })
  41. c.Start()
  42. //立即处理一次
  43. exportSpecSiteDataWeek()
  44. exportSpecSiteDataMonth()
  45. time.Sleep(99999*time.Hour)
  46. }
  47. //处理数据-周邮件
  48. func exportSpecSiteDataWeek() {
  49. cur_time := time.Now().Unix()
  50. today := GetOneWeekDay(TimeStampToString(cur_time))
  51. if today!=1 {
  52. return
  53. }
  54. log.Println("每周一:准备邮件数据...")
  55. now:=time.Now()
  56. durdays:=7*2
  57. start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
  58. end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
  59. log.Println(start,end)
  60. q := map[string]interface{}{
  61. "comeintime": map[string]interface{}{
  62. "$gte": start,
  63. "$lt": end,
  64. },
  65. }
  66. sess := save_mgo.GetMgoConn()
  67. defer save_mgo.DestoryMongoConn(sess)
  68. log.Println("bidding 查询条件:",q)
  69. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  70. it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
  71. "area":1,
  72. "title":1,
  73. "subtype":1,
  74. "publishtime":1,
  75. "href":1,
  76. "projectname":1,
  77. "site":1,
  78. }).Iter()
  79. timeLayout := "2006-01-02"
  80. total,isok,dataArr:= 0,0,make([]map[string]string,0)
  81. for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
  82. if total%10000 == 0 {
  83. log.Println("cur index :", total,isok)
  84. }
  85. site:=qu.ObjToString(tmp["site"])
  86. area:=qu.ObjToString(tmp["area"])
  87. subtype:=qu.ObjToString(tmp["subtype"])
  88. projectname:=qu.ObjToString(tmp["projectname"])
  89. publishtime:=qu.Int64All(tmp["publishtime"])
  90. new_publishtime := ""//转日期
  91. if publishtime>0 {
  92. new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
  93. }
  94. href:=qu.ObjToString(tmp["href"])
  95. title:=qu.ObjToString(tmp["title"])
  96. if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
  97. isok++
  98. dataArr = append(dataArr, map[string]string{
  99. "area":area,
  100. "subtype":subtype,
  101. "title":title,
  102. "projectname":projectname,
  103. "site":site,
  104. "publishtime":new_publishtime,
  105. "href":href,
  106. "jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
  107. })
  108. }
  109. tmp = make(map[string]interface{})
  110. }
  111. log.Println("is site over :",total,isok)
  112. start_str := time.Unix(start, 0).Format(timeLayout)
  113. end_str := time.Unix(end-1, 0).Format(timeLayout)
  114. xlsxName := "上海通服:"+start_str+"~"+end_str+".xlsx"
  115. log.Println("邮件名:",xlsxName)
  116. os.Remove(xlsxName)
  117. f :=xlsx.NewFile()
  118. sheet, _ := f.AddSheet("上海数据")
  119. row := sheet.AddRow()
  120. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  121. row.AddCell().Value = "省份"
  122. row.AddCell().Value = "公告类别"
  123. row.AddCell().Value = "公告标题"
  124. row.AddCell().Value = "项目名称"
  125. row.AddCell().Value = "发布时间"
  126. row.AddCell().Value = "来源网站"
  127. row.AddCell().Value = "公告地址"
  128. row.AddCell().Value = "剑鱼地址"
  129. for _,tmp:=range dataArr {
  130. row = sheet.AddRow()
  131. row.AddCell().SetString(tmp["area"])
  132. row.AddCell().SetString(tmp["subtype"])
  133. row.AddCell().SetString(tmp["title"])
  134. row.AddCell().SetString(tmp["projectname"])
  135. row.AddCell().SetString(tmp["publishtime"])
  136. row.AddCell().SetString(tmp["site"])
  137. row.AddCell().SetString(tmp["href"])
  138. row.AddCell().SetString(tmp["jyhref"])
  139. }
  140. err := f.Save(xlsxName)
  141. if err != nil {
  142. log.Println("保存xlsx失败:", err)
  143. sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
  144. }else {
  145. log.Println("保存xlsx成功:", err)
  146. body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条",start_str,end_str,isok)
  147. sendErrMailSmtp("上海通服数据~周",body_str,xlsxName)
  148. }
  149. }
  150. //处理数据-月邮件
  151. func exportSpecSiteDataMonth() {
  152. cur_time := time.Now().Unix()
  153. cur_day := time.Now().Day()
  154. if cur_day!=1 {
  155. return
  156. }
  157. today := GetOneWeekDay(TimeStampToString(cur_time))
  158. log.Println("每月1号:准备邮件数据...")
  159. now:=time.Now()
  160. durdays:=int64(7)+today-int64(1)
  161. start:= time.Date(now.Year(), now.Month(), now.Day()-int(durdays), 0, 0, 0, 0, time.Local).Unix()
  162. end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
  163. log.Println(start,end)
  164. q := map[string]interface{}{
  165. "comeintime": map[string]interface{}{
  166. "$gte": start,
  167. "$lt": end,
  168. },
  169. }
  170. sess := save_mgo.GetMgoConn()
  171. defer save_mgo.DestoryMongoConn(sess)
  172. log.Println("bidding 查询条件:",q)
  173. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  174. it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
  175. "area":1,
  176. "title":1,
  177. "subtype":1,
  178. "publishtime":1,
  179. "href":1,
  180. "projectname":1,
  181. "site":1,
  182. }).Iter()
  183. timeLayout := "2006-01-02"
  184. total,isok,dataArr:= 0,0,make([]map[string]string,0)
  185. for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
  186. if total%10000 == 0 {
  187. log.Println("cur index :", total,isok)
  188. }
  189. site:=qu.ObjToString(tmp["site"])
  190. area:=qu.ObjToString(tmp["area"])
  191. subtype:=qu.ObjToString(tmp["subtype"])
  192. projectname:=qu.ObjToString(tmp["projectname"])
  193. publishtime:=qu.Int64All(tmp["publishtime"])
  194. new_publishtime := ""//转日期
  195. if publishtime>0 {
  196. new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
  197. }
  198. href:=qu.ObjToString(tmp["href"])
  199. title:=qu.ObjToString(tmp["title"])
  200. if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
  201. isok++
  202. dataArr = append(dataArr, map[string]string{
  203. "area":area,
  204. "subtype":subtype,
  205. "title":title,
  206. "projectname":projectname,
  207. "site":site,
  208. "publishtime":new_publishtime,
  209. "href":href,
  210. "jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
  211. })
  212. }
  213. tmp = make(map[string]interface{})
  214. }
  215. log.Println("is site over :",total,isok)
  216. start_str := time.Unix(start, 0).Format(timeLayout)
  217. end_str := time.Unix(end-1, 0).Format(timeLayout)
  218. xlsxName := "上海通服:"+start_str+"~"+end_str+".xlsx"
  219. log.Println("邮件名:",xlsxName)
  220. os.Remove(xlsxName)
  221. f :=xlsx.NewFile()
  222. sheet, _ := f.AddSheet("上海数据")
  223. row := sheet.AddRow()
  224. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  225. row.AddCell().Value = "省份"
  226. row.AddCell().Value = "公告类别"
  227. row.AddCell().Value = "公告标题"
  228. row.AddCell().Value = "项目名称"
  229. row.AddCell().Value = "发布时间"
  230. row.AddCell().Value = "来源网站"
  231. row.AddCell().Value = "公告地址"
  232. row.AddCell().Value = "剑鱼地址"
  233. for _,tmp:=range dataArr {
  234. row = sheet.AddRow()
  235. row.AddCell().SetString(tmp["area"])
  236. row.AddCell().SetString(tmp["subtype"])
  237. row.AddCell().SetString(tmp["title"])
  238. row.AddCell().SetString(tmp["projectname"])
  239. row.AddCell().SetString(tmp["publishtime"])
  240. row.AddCell().SetString(tmp["site"])
  241. row.AddCell().SetString(tmp["href"])
  242. row.AddCell().SetString(tmp["jyhref"])
  243. }
  244. err := f.Save(xlsxName)
  245. if err != nil {
  246. log.Println("保存xlsx失败:", err)
  247. sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
  248. }else {
  249. log.Println("保存xlsx成功:", err)
  250. body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条",start_str,end_str,isok)
  251. sendErrMailSmtp("上海通服数据~月)",body_str,xlsxName)
  252. }
  253. }