commodity_coal_coastal.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package services
  2. import (
  3. "fmt"
  4. "github.com/mozillazg/go-pinyin"
  5. "github.com/tealeg/xlsx"
  6. "hongze/hongze_data_crawler/models"
  7. "hongze/hongze_data_crawler/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. func FileCoalCoastal() (err error) {
  13. defer func() {
  14. if err != nil {
  15. fmt.Println("RefreshDataFromDalian Err:" + err.Error())
  16. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromDalian ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  17. }
  18. }()
  19. var month string
  20. dateMonth := int(time.Now().Month())
  21. if dateMonth < 10 {
  22. month = strconv.Itoa(dateMonth)
  23. month = "0"+month
  24. }
  25. day := time.Now().Day()
  26. path := "/home/code/python/coal_mail/emailFile/沿海八省动力煤终端用户供耗存数据更新%s.%s.xlsx"
  27. path = fmt.Sprintf(path, month, day)
  28. xlFile, err := xlsx.OpenFile(path)
  29. if err != nil {
  30. fmt.Println(err)
  31. return
  32. }
  33. var mappingItems []*models.BaseFromCoalmineMapping
  34. var indexItems []*models.BaseFromCoalmineCoastalIndex
  35. var codeMap = make(map[string]string)
  36. var indexMap = make(map[string]string)
  37. var nameMap = make(map[int]string)
  38. var groupMap = make(map[int]string)
  39. var dataTime string
  40. var sheetName, unit string
  41. codeList, err := models.GetBaseFromCoalmineMapping()
  42. if err != nil && err.Error() != utils.ErrNoRow() {
  43. utils.FileLog.Info("获取煤炭指标失败:", err)
  44. return err
  45. }
  46. if len(codeList) > 0 {
  47. for _, v := range codeList {
  48. codeMap[v.IndexName] = v.IndexCode
  49. }
  50. }
  51. indexCompanyList, err := models.GetBaseFromCoalmineCoastalIndex()
  52. if err != nil && err.Error() != utils.ErrNoRow() {
  53. utils.FileLog.Info("获取煤炭公司指标失败:", err)
  54. return err
  55. }
  56. if len(indexCompanyList) > 0 {
  57. for _, v := range indexCompanyList {
  58. indexMap[v.IndexName+v.DataTime] = v.DealValue
  59. }
  60. }
  61. for _, sheet := range xlFile.Sheets {
  62. sheetName = sheet.Name
  63. //遍历行读取
  64. maxCol := sheet.MaxCol
  65. for i := 0; i < maxCol; i++ {
  66. if i == 0 {
  67. row := sheet.Row(i)
  68. cells := row.Cells
  69. for k, cell := range cells {
  70. if k > 0 && k < 9 {
  71. text := cell.String()
  72. groupMap[k] = text
  73. var item models.BaseFromCoalmineMapping
  74. //合计命名
  75. if k == 9 {
  76. item.IndexName = sheetName
  77. }
  78. item.IndexName = text + sheetName
  79. nameMap[k] = item.IndexName
  80. //code
  81. exists := ContainsSpecialName(text)
  82. var code string
  83. if exists {
  84. abbr := trimProvinceName(text)
  85. //取处理后公司名首字母缩写
  86. a := pinyin.NewArgs()
  87. rows := pinyin.Pinyin(sheetName, a)
  88. for i := 0; i < len(rows); i++ {
  89. if len(rows[i]) != 0 {
  90. str := rows[i][0]
  91. pi := str[0:1]
  92. code += pi
  93. }
  94. }
  95. item.IndexCode = abbr + code + "coastal"
  96. } else {
  97. a := pinyin.NewArgs()
  98. rows := pinyin.Pinyin(text+sheetName, a)
  99. for i := 0; i < len(rows); i++ {
  100. if len(rows[i]) != 0 {
  101. str := rows[i][0]
  102. pi := str[0:1]
  103. code += pi
  104. }
  105. }
  106. item.IndexCode = code + "coastal"
  107. }
  108. item.CreateTime = time.Now()
  109. mappingItems = append(mappingItems, &item)
  110. }
  111. if k == 10 {
  112. unit = strings.Replace(cell.String(),"单位:","",-1)
  113. }
  114. }
  115. }
  116. if i > 0 {
  117. row := sheet.Row(i)
  118. cells := row.Cells
  119. for k, cell := range cells {
  120. if k < 9 {
  121. var item models.BaseFromCoalmineCoastalIndex
  122. if k == 0 {
  123. text := cell.String()
  124. dataTime = ExcelDateToDate(text).Format(utils.FormatDate)
  125. }
  126. if k > 0 {
  127. text := cell.String()
  128. item.IndexName = nameMap[k]
  129. item.IndexCode = codeMap[nameMap[k]]
  130. item.DealValue = text
  131. item.GroupName = groupMap[k]
  132. item.Source = "沿海八省"
  133. item.DataTime = dataTime
  134. item.Frequency = "日度"
  135. item.ModifyTime = time.Now()
  136. item.CreateTime = time.Now()
  137. }
  138. item.Unit = unit
  139. indexItems = append(indexItems, &item)
  140. }
  141. }
  142. }
  143. }
  144. }
  145. //添加数据到数据库
  146. for _, v := range mappingItems {
  147. if codeMap[v.IndexName] == "" {
  148. codeMap[v.IndexName] = v.IndexCode
  149. newId, err := models.AddBaseFromCoalmineMapping(v)
  150. if err != nil {
  151. for i := 0; i<10; i++ {
  152. v.IndexCode = v.IndexCode + strconv.Itoa(i)
  153. codeMap[v.IndexName] = v.IndexCode
  154. newId, err := models.AddBaseFromCoalmineMapping(v)
  155. if err != nil {
  156. fmt.Println("再次添加公司指标名称错误", err)
  157. continue
  158. } else {
  159. fmt.Println("新增公司成功", newId)
  160. break
  161. }
  162. }
  163. } else {
  164. fmt.Println("新增公司成功", newId)
  165. }
  166. }
  167. }
  168. fmt.Println("指标操作完成")
  169. //给indexItem中的code赋值并插入index表
  170. for _, v := range indexItems {
  171. v.IndexCode = codeMap[v.IndexName]
  172. if indexMap[v.IndexName+v.DataTime] == "" && v.DealValue != "" {
  173. newId, err := models.AddBaseFromCoalCoastalIndex(v)
  174. if err != nil {
  175. fmt.Println("添加数据错误", err)
  176. } else {
  177. fmt.Println("新增成功", newId)
  178. }
  179. } else {
  180. if indexMap[v.IndexName+v.DataTime] != v.DealValue && v.DealValue != "" {
  181. err = models.UpdateBaseFromCoalCoastalIndex(v)
  182. if err != nil {
  183. fmt.Println("修改数据错误错误", err)
  184. return
  185. }
  186. }
  187. }
  188. }
  189. return
  190. }
  191. func ttrimProvinceName(name string) string {
  192. name = strings.Replace(name, "陕西省", "sn", -1)
  193. name = strings.Replace(name, "陕西", "sn", -1)
  194. name = strings.Replace(name, "海南市", "hi", -1)
  195. name = strings.Replace(name, "海南", "hi", -1)
  196. name = strings.Replace(name, "河南省", "ha", -1)
  197. name = strings.Replace(name, "河南", "ha", -1)
  198. name = strings.Replace(name, "河北省", "he", -1)
  199. name = strings.Replace(name, "河北", "he", -1)
  200. name = strings.Replace(name, "澳门", "mo", -1)
  201. name = strings.Replace(name, "内蒙古自治区", "nm", -1)
  202. name = strings.Replace(name, "内蒙古", "nm", -1)
  203. name = strings.Replace(name, "黑龙江", "hl", -1)
  204. name = strings.Replace(name, "(", "", -1)
  205. name = strings.Replace(name, ")", "", -1)
  206. name = strings.Replace(name, "+", "", -1)
  207. return name
  208. }
  209. func ExcelDateToDate(excelDate string) time.Time {
  210. excelTime := time.Date(1899, time.December, 30, 0, 0, 0, 0, time.UTC)
  211. var days, _ = strconv.Atoi(excelDate)
  212. return excelTime.Add(time.Second * time.Duration(days*86400))
  213. }