main.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/viper"
  5. "github.com/wcc4869/common_utils"
  6. "github.com/xuri/excelize/v2"
  7. "go.uber.org/zap"
  8. "jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
  9. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  10. "os"
  11. "path/filepath"
  12. "strconv"
  13. "sync"
  14. "time"
  15. )
  16. var (
  17. MgoS *mongodb.MongodbSim
  18. GF GlobalConf
  19. )
  20. func Init() {
  21. InitLog()
  22. err := InitConfig()
  23. if err != nil {
  24. }
  25. MgoS = &mongodb.MongodbSim{
  26. MongodbAddr: GF.MongoS.Host,
  27. DbName: GF.MongoS.DB,
  28. Size: GF.MongoS.Size,
  29. UserName: GF.MongoS.Username,
  30. Password: GF.MongoS.Password,
  31. }
  32. MgoS.InitPool()
  33. }
  34. func InitConfig() (err error) {
  35. viper.SetConfigFile("config.toml") // 指定配置文件路径
  36. viper.SetConfigName("config") // 配置文件名称(无扩展名)
  37. viper.SetConfigType("toml") // 如果配置文件的名称中没有扩展名,则需要配置此项
  38. viper.AddConfigPath("./")
  39. viper.AddConfigPath("./conf/") // 还可以在工作目录中查找配置
  40. viper.AddConfigPath("../conf/") // 还可以在工作目录中查找配置
  41. err = viper.ReadInConfig() // 查找并读取配置文件
  42. if err != nil { // 处理读取配置文件的错误
  43. return
  44. }
  45. err = viper.Unmarshal(&GF)
  46. return err
  47. }
  48. func InitLog() {
  49. err := log.InitLog(
  50. //log.Path("./logs/log.out"),
  51. log.Path(""),
  52. log.Level("info"),
  53. log.Compress(true),
  54. log.MaxSize(10),
  55. log.MaxBackups(10),
  56. log.MaxAge(7),
  57. log.Format("json"),
  58. )
  59. if err != nil {
  60. fmt.Printf("InitLog failed: %v\n", err)
  61. os.Exit(1)
  62. }
  63. }
  64. func main() {
  65. Init()
  66. export()
  67. }
  68. func export() {
  69. var xlsx *excelize.File
  70. currentPwd, _ := os.Getwd()
  71. path := filepath.Join(currentPwd, "导出数据")
  72. ex, _ := common_utils.FileExist(path)
  73. if !ex {
  74. os.MkdirAll(path, 0777)
  75. }
  76. exportFile := filepath.Join(path, fmt.Sprintf("%v-%v.xlsx", "惠普数据", time.Now().Format("2006.01.02 15.04.05")))
  77. exists, _ := common_utils.FileExist(exportFile)
  78. // 设置文件
  79. if exists {
  80. xlsx, _ = excelize.OpenFile(exportFile)
  81. } else {
  82. xlsx = excelize.NewFile()
  83. }
  84. styleOne, _ := xlsx.NewStyle(
  85. &excelize.Style{
  86. Alignment: &excelize.Alignment{
  87. Horizontal: "left",
  88. Vertical: "left",
  89. },
  90. },
  91. )
  92. if GF.Env.Buyer > 0 {
  93. xlsx.NewSheet("采购单位")
  94. xlsx.SetSheetRow("采购单位", fmt.Sprintf("%s%d", "A", 1), &[]interface{}{"采购单位", "联系人", "联系电话", "发布时间"})
  95. }
  96. if GF.Env.Winner > 0 {
  97. xlsx.NewSheet("中标单位")
  98. xlsx.SetSheetRow("中标单位", fmt.Sprintf("%s%d", "A", 1), &[]interface{}{"中标单位", "联系人", "联系电话", "发布时间"})
  99. }
  100. if GF.Env.Agency > 0 {
  101. xlsx.NewSheet("代理机关")
  102. xlsx.SetSheetRow("代理机关", fmt.Sprintf("%s%d", "A", 1), &[]interface{}{"代理机关", "联系人", "联系电话", "发布时间"})
  103. }
  104. sess := MgoS.GetMgoConn()
  105. defer MgoS.DestoryMongoConn(sess)
  106. count := 0
  107. line := 1
  108. winnerLine := 1
  109. agencyLine := 1
  110. ch := make(chan bool, 18)
  111. wg := &sync.WaitGroup{}
  112. query := sess.DB(MgoS.DbName).C(GF.MongoS.Coll).Find(nil).Select(nil).Iter()
  113. for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
  114. if count%100 == 0 {
  115. fmt.Println(fmt.Sprintf("dealTmp current --- %d", count))
  116. }
  117. var winner interface{}
  118. if tmp["company_name"] != nil {
  119. winner = tmp["company_name"]
  120. }
  121. //1.采购单位数据
  122. if GF.Env.Buyer > 0 {
  123. if tmp["buyer_contacts"] != nil {
  124. if contacts, ok := tmp["buyer_contacts"].([]interface{}); ok {
  125. log.Info("export", zap.Any("开始导采购单位", winner))
  126. for _, v := range contacts {
  127. line++
  128. ch <- true
  129. wg.Add(1)
  130. go writeToExcel(xlsx, "采购单位", winner, line, v, styleOne, wg, ch)
  131. //if data, ok := v.(map[string]interface{}); ok {
  132. // datas := make([]interface{}, 0)
  133. // datas = append(datas, winner, data["contact_person"], data["phone"], data["publishtime"])
  134. // xlsx.SetSheetRow("采购单位", fmt.Sprintf("%s%d", "A", line), &datas)
  135. // _ = xlsx.SetCellStyle("采购单位", fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), styleOne)
  136. // _ = xlsx.SetColWidth("采购单位", "A", "E", 25)
  137. //}
  138. }
  139. log.Info("export", zap.String("结束 ---", "采购单位数据导出"))
  140. }
  141. }
  142. }
  143. //2.中标单位
  144. if GF.Env.Winner > 0 {
  145. if tmp["winner_contacts"] != nil {
  146. if contacts, ok := tmp["winner_contacts"].([]interface{}); ok {
  147. log.Info("export", zap.Any("开始导出中标单位", winner))
  148. for _, v := range contacts {
  149. winnerLine++
  150. ch <- true
  151. wg.Add(1)
  152. go writeToExcel(xlsx, "中标单位", winner, winnerLine, v, styleOne, wg, ch)
  153. //if data, ok := v.(map[string]interface{}); ok {
  154. // datas := make([]interface{}, 0)
  155. // datas = append(datas, winner, data["contact_person"], data["phone"], data["publishtime"])
  156. // xlsx.SetSheetRow("中标单位", fmt.Sprintf("%s%d", "A", line), &datas)
  157. // _ = xlsx.SetCellStyle("中标单位", fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), styleOne)
  158. // _ = xlsx.SetColWidth("中标单位", "A", "E", 25)
  159. //}
  160. }
  161. log.Info("export", zap.String("结束 ---", "中标单位数据导出"))
  162. }
  163. }
  164. }
  165. //3.代理机关
  166. if GF.Env.Agency > 0 {
  167. if tmp["agency_contacts"] != nil {
  168. if contacts, ok := tmp["agency_contacts"].([]interface{}); ok {
  169. log.Info("export", zap.Any("开始导出代理机关", winner))
  170. for _, v := range contacts {
  171. agencyLine++
  172. ch <- true
  173. wg.Add(1)
  174. writeToExcel(xlsx, "代理机关", winner, agencyLine, v, styleOne, wg, ch)
  175. //if data, ok := v.(map[string]interface{}); ok {
  176. // datas := make([]interface{}, 0)
  177. // datas = append(datas, winner, data["contact_person"], data["phone"], data["publishtime"])
  178. // xlsx.SetSheetRow("代理机关", fmt.Sprintf("%s%d", "A", line), &datas)
  179. // _ = xlsx.SetCellStyle("代理机关", fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), styleOne)
  180. // _ = xlsx.SetColWidth("代理机关", "A", "E", 25)
  181. //}
  182. }
  183. log.Info("export", zap.String("结束 ---", "代理机关数据导出"))
  184. }
  185. }
  186. }
  187. }
  188. wg.Wait()
  189. xlsx.Path = exportFile
  190. xlsx.DeleteSheet("Sheet1")
  191. xlsx.Save()
  192. log.Info("export", zap.String("所有数据导出", "结束 !!!"))
  193. }
  194. // writeToExcel 写入Excel
  195. func writeToExcel(xlsx *excelize.File, sheetName string, winner interface{}, line int, data interface{}, style int, wg *sync.WaitGroup, ch chan bool) {
  196. defer func() {
  197. <-ch
  198. wg.Done()
  199. }()
  200. if dataMap, ok := data.(map[string]interface{}); ok {
  201. datas := make([]interface{}, 0)
  202. datas = append(datas, winner, dataMap["contact_person"], dataMap["phone"], dataMap["publishtime"])
  203. xlsx.SetSheetRow(sheetName, fmt.Sprintf("%s%d", "A", line), &datas)
  204. _ = xlsx.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), style)
  205. _ = xlsx.SetColWidth(sheetName, "A", "E", 25)
  206. }
  207. }