commodity_coal_firm.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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. "os"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. func FileCoalFirm() (err error) {
  14. defer func() {
  15. if err != nil {
  16. fmt.Println("RefreshDataFromDalian Err:" + err.Error())
  17. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromDalian ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  18. }
  19. }()
  20. var xlFile *xlsx.File
  21. syear := time.Now().Year()
  22. var smonth string
  23. dateMonth := int(time.Now().Month())
  24. smonth = strconv.Itoa(dateMonth)
  25. //path := "static/file/firm.xlsx"
  26. path := "/home/code/python/coal_mail/emailFile/全国分企业煤炭产量旬度数据(%s年%s月).xlsx"
  27. path = fmt.Sprintf(path,syear,smonth)
  28. exist,err := PathExists(path)
  29. if err != nil {
  30. fmt.Println(err)
  31. return
  32. }
  33. if exist == false {
  34. path = "/home/code/python/coal_mail/emailFile/全国分企业煤炭产量旬度数据(%s年%s月中旬).xlsx"
  35. path = fmt.Sprintf(path,syear,smonth)
  36. exist,err = PathExists(path)
  37. if err != nil {
  38. fmt.Println(err)
  39. return
  40. }
  41. }else if exist == false {
  42. path = "/home/code/python/coal_mail/emailFile/全国分企业煤炭产量旬度数据(%s年%s月上旬).xlsx"
  43. path = fmt.Sprintf(path,syear,smonth)
  44. exist,err = PathExists(path)
  45. if err != nil {
  46. fmt.Println(err)
  47. return
  48. }
  49. }else if exist == false {
  50. //本月三个文件都没有,去取上一个月的
  51. dateMonth = dateMonth - 1
  52. smonth = strconv.Itoa(dateMonth)
  53. path = "/home/code/python/coal_mail/emailFile/全国分企业煤炭产量旬度数据(%s年%s月).xlsx"
  54. path = fmt.Sprintf(path,syear,smonth)
  55. exist,err = PathExists(path)
  56. if err != nil {
  57. fmt.Println(err)
  58. return
  59. }
  60. }
  61. path = fmt.Sprintf(path,syear,smonth)
  62. xlFile, err = xlsx.OpenFile(path)
  63. if err != nil {
  64. fmt.Println(err)
  65. return
  66. }
  67. var year, month, day string
  68. var yearMap = make(map[int]string)
  69. var monthMap = make(map[int]string)
  70. var dateMap = make(map[int]string)
  71. var mappingItems []*models.BaseFromCoalmineMapping
  72. var indexItems []*models.BaseFromCoalmineFirmIndex
  73. var codeMap = make(map[string]string)
  74. var indexMap = make(map[string]string)
  75. var groupName string
  76. codeList, err := models.GetBaseFromCoalmineMapping()
  77. if err != nil && err.Error() != utils.ErrNoRow() {
  78. utils.FileLog.Info("获取煤炭指标失败:", err)
  79. return err
  80. }
  81. if len(codeList) > 0 {
  82. for _, v := range codeList {
  83. codeMap[v.IndexName] = v.IndexCode
  84. }
  85. }
  86. indexCompanyList, err := models.GetBaseFromCoalmineFirmIndex()
  87. if err != nil && err.Error() != utils.ErrNoRow() {
  88. utils.FileLog.Info("获取煤炭公司指标失败:", err)
  89. return err
  90. }
  91. if len(indexCompanyList) > 0 {
  92. for _, v := range indexCompanyList {
  93. indexMap[v.IndexName+v.DataTime] = v.DealValue
  94. }
  95. }
  96. for _, sheet := range xlFile.Sheets {
  97. //遍历行读取
  98. maxRow := sheet.MaxRow
  99. for i := 0; i < maxRow; i++ {
  100. //获取年份
  101. if i == 2 {
  102. row := sheet.Row(i)
  103. cells := row.Cells
  104. for k, cell := range cells {
  105. text := cell.String()
  106. if k > 0 && text != "" {
  107. year = text
  108. yearMap[k] = year
  109. }
  110. }
  111. }
  112. //获取月份
  113. if i == 3 {
  114. row := sheet.Row(i)
  115. cells := row.Cells
  116. for k, cell := range cells {
  117. text := cell.String()
  118. if k > 0 && text != "" {
  119. month = text
  120. monthMap[k] = month
  121. }
  122. }
  123. }
  124. //获取旬度
  125. if i == 4 {
  126. row := sheet.Row(i)
  127. cells := row.Cells
  128. for k, cell := range cells {
  129. text := cell.String()
  130. if k > 0 && text != "" {
  131. if yearMap[k] != "" {
  132. year = yearMap[k]
  133. }
  134. if monthMap[k] != "" {
  135. month = monthMap[k]
  136. }
  137. day = text
  138. dateMap[k] = year + month + day
  139. }
  140. }
  141. }
  142. //获取企业或地区名及信息
  143. if i > 4 {
  144. row := sheet.Row(i)
  145. cells := row.Cells
  146. var companyName string
  147. for k, cell := range cells {
  148. if k == 0 {
  149. companyName = cell.String()
  150. //省名
  151. if !strings.Contains(companyName, " ") {
  152. groupName = companyName
  153. }
  154. if groupName == "全国合计" {
  155. groupName = "全国"
  156. }
  157. //若有下面四个名称要拼上省名不然会重复
  158. if companyName == " 地方合计" || companyName == " 地方国有" ||
  159. companyName == " 地方乡镇" || companyName == " 国有重点" {
  160. companyName = groupName + companyName
  161. }
  162. companyName = strings.Replace(companyName, " ", "", -1)
  163. var item models.BaseFromCoalmineMapping
  164. //生成code
  165. exists := ContainsSpecialName(companyName)
  166. var code string
  167. if exists {
  168. abbr := trimProvinceName(companyName)
  169. //取处理后公司名首字母缩写
  170. a := pinyin.NewArgs()
  171. rows := pinyin.Pinyin(companyName[9:], a)
  172. for i := 0; i < len(rows); i++ {
  173. if len(rows[i]) != 0 {
  174. str := rows[i][0]
  175. pi := str[0:1]
  176. code += pi
  177. }
  178. }
  179. item.IndexCode = abbr[:2] + code + "firm"
  180. } else {
  181. a := pinyin.NewArgs()
  182. rows := pinyin.Pinyin(companyName, a)
  183. for i := 0; i < len(rows); i++ {
  184. if len(rows[i]) != 0 {
  185. str := rows[i][0]
  186. pi := str[0:1]
  187. code += pi
  188. }
  189. }
  190. item.IndexCode = code + "firm"
  191. }
  192. item.IndexName = companyName
  193. item.CreateTime = time.Now()
  194. mappingItems = append(mappingItems, &item)
  195. } else {
  196. dealValue := cell.String()
  197. item := models.BaseFromCoalmineFirmIndex{
  198. IndexName: companyName,
  199. IndexCode: codeMap[companyName],
  200. DataTime: dateMap[k],
  201. DealValue: dealValue,
  202. GroupName: groupName,
  203. Source: "全国分企业",
  204. Unit: "万吨",
  205. Frequency: "旬度",
  206. CreateTime: time.Now(),
  207. ModifyTime: time.Now(),
  208. }
  209. indexItems = append(indexItems, &item)
  210. }
  211. }
  212. }
  213. }
  214. }
  215. //添加数据到数据库
  216. for _, v := range mappingItems {
  217. if codeMap[v.IndexName] == "" {
  218. codeMap[v.IndexName] = v.IndexCode
  219. newId, err := models.AddBaseFromCoalmineMapping(v)
  220. if err != nil {
  221. for i := 0; i<10; i++ {
  222. v.IndexCode = v.IndexCode + strconv.Itoa(i)
  223. codeMap[v.IndexName] = v.IndexCode
  224. newId, err := models.AddBaseFromCoalmineMapping(v)
  225. if err != nil {
  226. fmt.Println("再次添加公司指标名称错误", err)
  227. continue
  228. } else {
  229. fmt.Println("新增公司成功", newId)
  230. break
  231. }
  232. }
  233. } else {
  234. fmt.Println("新增公司成功", newId)
  235. }
  236. }
  237. }
  238. fmt.Println("指标操作完成")
  239. //给indexItem中的code赋值并插入index表
  240. for _, v := range indexItems {
  241. v.IndexCode = codeMap[v.IndexName]
  242. if indexMap[v.IndexName+v.DataTime] == "" && v.DealValue != "" {
  243. newId, err := models.AddBaseFromCoalFirmIndex(v)
  244. if err != nil {
  245. fmt.Println("添加数据错误", err)
  246. } else {
  247. fmt.Println("新增成功", newId)
  248. }
  249. } else {
  250. if indexMap[v.IndexName+v.DataTime] != v.DealValue && v.DealValue != "" {
  251. err = models.UpdateBaseFromCoalFirmIndex(v)
  252. if err != nil {
  253. fmt.Println("修改数据错误错误", err)
  254. return
  255. }
  256. }
  257. }
  258. }
  259. return
  260. }
  261. func trimProvinceName(name string) string {
  262. name = strings.Replace(name, "陕西省", "sn", -1)
  263. name = strings.Replace(name, "陕西", "sn", -1)
  264. name = strings.Replace(name, "海南市", "hi", -1)
  265. name = strings.Replace(name, "海南", "hi", -1)
  266. name = strings.Replace(name, "河南省", "ha", -1)
  267. name = strings.Replace(name, "河南", "ha", -1)
  268. name = strings.Replace(name, "河北省", "he", -1)
  269. name = strings.Replace(name, "河北", "he", -1)
  270. name = strings.Replace(name, "澳门", "mo", -1)
  271. name = strings.Replace(name, "内蒙古自治区", "nm", -1)
  272. name = strings.Replace(name, "内蒙古", "nm", -1)
  273. name = strings.Replace(name, "黑龙江", "hl", -1)
  274. name = strings.Replace(name, "(", "", -1)
  275. name = strings.Replace(name, ")", "", -1)
  276. name = strings.Replace(name, "+", "", -1)
  277. return name
  278. }
  279. func PathExists(path string)(bool, error) {
  280. _, err := os.Stat(path)
  281. if err == nil { //文件或者目录存在
  282. return true, nil
  283. }
  284. if os.IsNotExist(err) {
  285. return false, nil
  286. }
  287. return false, err
  288. }