main.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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. log.Println("init mgo 加载完毕...")
  29. }
  30. func init() {
  31. //加载配置文件
  32. qu.ReadConfig(&sysconfig)
  33. initMgo()
  34. }
  35. func main() {
  36. //定时任务
  37. log.Println("部署...定时任务...")
  38. c := cron.New()
  39. c.AddFunc("0 30 7 ? * *", func() {
  40. exportSpecSiteDataDay() //日邮件-每天
  41. exportSpecSiteDataWeek() //周邮件-每周一
  42. exportSpecSiteDataMonth() //月邮件-每月1号
  43. })
  44. c.Start()
  45. time.Sleep(99999*time.Hour)
  46. }
  47. //处理数据-周邮件
  48. func exportSpecSiteDataDay() {
  49. log.Println("每天:准备邮件数据...")
  50. now:=time.Now()
  51. durdays:=1
  52. start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
  53. end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
  54. log.Println(start,end)
  55. q := map[string]interface{}{
  56. "comeintime": map[string]interface{}{
  57. "$gte": start,
  58. "$lt": end,
  59. },
  60. }
  61. sess := save_mgo.GetMgoConn()
  62. defer save_mgo.DestoryMongoConn(sess)
  63. log.Println("bidding 查询条件:",q)
  64. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  65. it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
  66. "area":1,
  67. "title":1,
  68. "toptype":1,
  69. "publishtime":1,
  70. "href":1,
  71. "projectname":1,
  72. "site":1,
  73. }).Iter()
  74. timeLayout := "2006-01-02"
  75. total,isok,dataArr:= 0,0,make([]map[string]string,0)
  76. for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
  77. if total%10000 == 0 {
  78. log.Println("cur index :", total,isok)
  79. }
  80. toptype:=qu.ObjToString(tmp["toptype"])
  81. if toptype=="拟建"||toptype=="预告"||toptype=="招标"||toptype=="采购意向" {
  82. site:=qu.ObjToString(tmp["site"])
  83. area:=qu.ObjToString(tmp["area"])
  84. projectname:=qu.ObjToString(tmp["projectname"])
  85. publishtime:=qu.Int64All(tmp["publishtime"])
  86. new_publishtime := ""//转日期
  87. if publishtime>0 {
  88. new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
  89. }
  90. href:=qu.ObjToString(tmp["href"])
  91. title:=qu.ObjToString(tmp["title"])
  92. if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
  93. isok++
  94. dataArr = append(dataArr, map[string]string{
  95. "area":area,
  96. "toptype":toptype,
  97. "title":title,
  98. "projectname":projectname,
  99. "site":site,
  100. "publishtime":new_publishtime,
  101. "href":href,
  102. "jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
  103. })
  104. }
  105. }
  106. tmp = make(map[string]interface{})
  107. }
  108. log.Println("is site over :",total,isok)
  109. end_str := time.Unix(end-1, 0).Format(timeLayout)
  110. xlsxName := "上海通服:"+end_str+".xlsx"
  111. log.Println("邮件名:",xlsxName)
  112. os.Remove(xlsxName)
  113. f :=xlsx.NewFile()
  114. sheet, _ := f.AddSheet("上海数据")
  115. row := sheet.AddRow()
  116. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  117. row.AddCell().Value = "省份"
  118. row.AddCell().Value = "公告类别"
  119. row.AddCell().Value = "公告标题"
  120. row.AddCell().Value = "项目名称"
  121. row.AddCell().Value = "发布时间"
  122. row.AddCell().Value = "来源网站"
  123. row.AddCell().Value = "公告地址"
  124. row.AddCell().Value = "剑鱼地址"
  125. for _,tmp:=range dataArr {
  126. row = sheet.AddRow()
  127. row.AddCell().SetString(tmp["area"])
  128. row.AddCell().SetString(tmp["toptype"])
  129. row.AddCell().SetString(tmp["title"])
  130. row.AddCell().SetString(tmp["projectname"])
  131. row.AddCell().SetString(tmp["publishtime"])
  132. row.AddCell().SetString(tmp["site"])
  133. row.AddCell().SetString(tmp["href"])
  134. row.AddCell().SetString(tmp["jyhref"])
  135. }
  136. err := f.Save(xlsxName)
  137. if err != nil {
  138. log.Println("保存xlsx失败:", err)
  139. sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
  140. }else {
  141. log.Println("保存xlsx成功:", err)
  142. body_str := fmt.Sprintf("日期:%s\t\t总计:%d条",end_str,isok)
  143. sendErrMailSmtp("上海通服数据~天",body_str,xlsxName)
  144. }
  145. }
  146. //处理数据-周邮件
  147. func exportSpecSiteDataWeek() {
  148. cur_time := time.Now().Unix()
  149. today := GetOneWeekDay(TimeStampToString(cur_time))
  150. if today!=1 {
  151. return
  152. }
  153. log.Println("每周一:准备邮件数据...")
  154. now:=time.Now()
  155. durdays:=7
  156. start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
  157. end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
  158. log.Println(start,end)
  159. q := map[string]interface{}{
  160. "comeintime": map[string]interface{}{
  161. "$gte": start,
  162. "$lt": end,
  163. },
  164. }
  165. sess := save_mgo.GetMgoConn()
  166. defer save_mgo.DestoryMongoConn(sess)
  167. log.Println("bidding 查询条件:",q)
  168. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  169. it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
  170. "area":1,
  171. "title":1,
  172. "subtype":1,
  173. "publishtime":1,
  174. "href":1,
  175. "projectname":1,
  176. "site":1,
  177. }).Iter()
  178. timeLayout := "2006-01-02"
  179. total,isok,dataArr:= 0,0,make([]map[string]string,0)
  180. for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
  181. if total%10000 == 0 {
  182. log.Println("cur index :", total,isok)
  183. }
  184. site:=qu.ObjToString(tmp["site"])
  185. area:=qu.ObjToString(tmp["area"])
  186. subtype:=qu.ObjToString(tmp["subtype"])
  187. projectname:=qu.ObjToString(tmp["projectname"])
  188. publishtime:=qu.Int64All(tmp["publishtime"])
  189. new_publishtime := ""//转日期
  190. if publishtime>0 {
  191. new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
  192. }
  193. href:=qu.ObjToString(tmp["href"])
  194. title:=qu.ObjToString(tmp["title"])
  195. if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
  196. isok++
  197. dataArr = append(dataArr, map[string]string{
  198. "area":area,
  199. "subtype":subtype,
  200. "title":title,
  201. "projectname":projectname,
  202. "site":site,
  203. "publishtime":new_publishtime,
  204. "href":href,
  205. "jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
  206. })
  207. }
  208. tmp = make(map[string]interface{})
  209. }
  210. log.Println("is site over :",total,isok)
  211. start_str := time.Unix(start, 0).Format(timeLayout)
  212. end_str := time.Unix(end-1, 0).Format(timeLayout)
  213. xlsxName := "上海通服:"+start_str+"~"+end_str+".xlsx"
  214. log.Println("邮件名:",xlsxName)
  215. os.Remove(xlsxName)
  216. f :=xlsx.NewFile()
  217. sheet, _ := f.AddSheet("上海数据")
  218. row := sheet.AddRow()
  219. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  220. row.AddCell().Value = "省份"
  221. row.AddCell().Value = "公告类别"
  222. row.AddCell().Value = "公告标题"
  223. row.AddCell().Value = "项目名称"
  224. row.AddCell().Value = "发布时间"
  225. row.AddCell().Value = "来源网站"
  226. row.AddCell().Value = "公告地址"
  227. row.AddCell().Value = "剑鱼地址"
  228. for _,tmp:=range dataArr {
  229. row = sheet.AddRow()
  230. row.AddCell().SetString(tmp["area"])
  231. row.AddCell().SetString(tmp["subtype"])
  232. row.AddCell().SetString(tmp["title"])
  233. row.AddCell().SetString(tmp["projectname"])
  234. row.AddCell().SetString(tmp["publishtime"])
  235. row.AddCell().SetString(tmp["site"])
  236. row.AddCell().SetString(tmp["href"])
  237. row.AddCell().SetString(tmp["jyhref"])
  238. }
  239. err := f.Save(xlsxName)
  240. if err != nil {
  241. log.Println("保存xlsx失败:", err)
  242. sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
  243. }else {
  244. log.Println("保存xlsx成功:", err)
  245. body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条",start_str,end_str,isok)
  246. sendErrMailSmtp("上海通服数据~周",body_str,xlsxName)
  247. }
  248. }
  249. //处理数据-月邮件
  250. func exportSpecSiteDataMonth() {
  251. cur_day := time.Now().Day()
  252. if cur_day!=1 {
  253. return
  254. }
  255. //cur_time := time.Now().Unix()
  256. //today := GetOneWeekDay(TimeStampToString(cur_time))
  257. //durdays:=int64(7)+today-int64(1)
  258. log.Println("每月1号:准备邮件数据...")
  259. now:=time.Now()
  260. start:= time.Date(now.Year(), now.Month()-1, now.Day(), 0, 0, 0, 0, time.Local).Unix()
  261. end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
  262. log.Println(start,end)
  263. q := map[string]interface{}{
  264. "comeintime": map[string]interface{}{
  265. "$gte": start,
  266. "$lt": end,
  267. },
  268. }
  269. sess := save_mgo.GetMgoConn()
  270. defer save_mgo.DestoryMongoConn(sess)
  271. log.Println("bidding 查询条件:",q)
  272. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  273. it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
  274. "area":1,
  275. "title":1,
  276. "subtype":1,
  277. "publishtime":1,
  278. "href":1,
  279. "projectname":1,
  280. "site":1,
  281. }).Iter()
  282. timeLayout := "2006-01-02"
  283. total,isok,dataArr:= 0,0,make([]map[string]string,0)
  284. for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
  285. if total%10000 == 0 {
  286. log.Println("cur index :", total,isok)
  287. }
  288. site:=qu.ObjToString(tmp["site"])
  289. area:=qu.ObjToString(tmp["area"])
  290. subtype:=qu.ObjToString(tmp["subtype"])
  291. projectname:=qu.ObjToString(tmp["projectname"])
  292. publishtime:=qu.Int64All(tmp["publishtime"])
  293. new_publishtime := ""//转日期
  294. if publishtime>0 {
  295. new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
  296. }
  297. href:=qu.ObjToString(tmp["href"])
  298. title:=qu.ObjToString(tmp["title"])
  299. if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
  300. isok++
  301. dataArr = append(dataArr, map[string]string{
  302. "area":area,
  303. "subtype":subtype,
  304. "title":title,
  305. "projectname":projectname,
  306. "site":site,
  307. "publishtime":new_publishtime,
  308. "href":href,
  309. "jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
  310. })
  311. }
  312. tmp = make(map[string]interface{})
  313. }
  314. log.Println("is site over :",total,isok)
  315. start_str := time.Unix(start, 0).Format(timeLayout)
  316. end_str := time.Unix(end-1, 0).Format(timeLayout)
  317. xlsxName := "上海通服:"+start_str+"~"+end_str+".xlsx"
  318. log.Println("邮件名:",xlsxName)
  319. os.Remove(xlsxName)
  320. f :=xlsx.NewFile()
  321. sheet, _ := f.AddSheet("上海数据")
  322. row := sheet.AddRow()
  323. //省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
  324. row.AddCell().Value = "省份"
  325. row.AddCell().Value = "公告类别"
  326. row.AddCell().Value = "公告标题"
  327. row.AddCell().Value = "项目名称"
  328. row.AddCell().Value = "发布时间"
  329. row.AddCell().Value = "来源网站"
  330. row.AddCell().Value = "公告地址"
  331. row.AddCell().Value = "剑鱼地址"
  332. for _,tmp:=range dataArr {
  333. row = sheet.AddRow()
  334. row.AddCell().SetString(tmp["area"])
  335. row.AddCell().SetString(tmp["subtype"])
  336. row.AddCell().SetString(tmp["title"])
  337. row.AddCell().SetString(tmp["projectname"])
  338. row.AddCell().SetString(tmp["publishtime"])
  339. row.AddCell().SetString(tmp["site"])
  340. row.AddCell().SetString(tmp["href"])
  341. row.AddCell().SetString(tmp["jyhref"])
  342. }
  343. err := f.Save(xlsxName)
  344. if err != nil {
  345. log.Println("保存xlsx失败:", err)
  346. sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
  347. }else {
  348. log.Println("保存xlsx成功:", err)
  349. body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条",start_str,end_str,isok)
  350. sendErrMailSmtp("上海通服数据~月)",body_str,xlsxName)
  351. }
  352. }