base.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package base_from_yongyi_v2
  2. import (
  3. "eta/eta_data_analysis/models"
  4. "eta/eta_data_analysis/utils"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "github.com/xuri/excelize/v2"
  10. )
  11. func getClassifySortMap() map[string]int {
  12. classifyMap := map[string]int{
  13. "日度-商品猪出栏价": 1,
  14. "日度-商品猪标肥价差": 2,
  15. "日度-商品猪全国均价和宰量": 3,
  16. "日度-屠宰企业屠宰量": 4,
  17. "历史猪价": 5,
  18. "周度-商品猪出栏价": 6,
  19. "周度-体重": 7,
  20. "周度-屠宰厂宰前活猪重": 8,
  21. "周度-各体重段价差": 9,
  22. "二育成本": 10,
  23. "二育销量": 11,
  24. "育肥栏舍利用率": 12,
  25. "周度-养殖利润最新": 13,
  26. "周度-当期、预期成本": 14,
  27. "周度-育肥全价料出厂价": 15,
  28. "周度-成本计算附件": 16,
  29. "周度-毛白价差": 17,
  30. "周度-50公斤二元母猪价格": 18,
  31. "周度-规模场15公斤仔猪出栏价": 19,
  32. "仔猪、母猪": 20,
  33. "周度-河南屠宰白条成本": 21,
  34. "周度-淘汰母猪价格": 22,
  35. "周度-宰后结算价": 23,
  36. "周度-冻品库存": 24,
  37. "周度-冻品库存多样本": 25,
  38. "周度-鲜销率": 26,
  39. "周度-猪肉价(前三等级白条均价)": 27,
  40. "周度-猪肉产品价格": 28,
  41. "周度-屠宰企业日度屠宰量": 29,
  42. "周度-屠宰新2022.10.28": 30,
  43. "月度出栏完成率": 31,
  44. "月度计划出栏量": 32,
  45. "月度-淘汰母猪屠宰厂宰杀量": 33,
  46. "月度-猪料销量": 34,
  47. "月度-屠宰企业开工率": 35,
  48. "月度-屠宰厂公母比例": 36,
  49. "月度-生产指标(2021.5.7新增)": 37,
  50. "月度-生产指标2": 38,
  51. "月度-二元三元能繁比例": 39,
  52. "月度-能繁母猪存栏(2020年2月新增)": 40,
  53. "月度-小猪存栏(2020年5月新增)": 41,
  54. "月度-中猪存栏(2020年5月新增)": 42,
  55. "月度-大猪存栏(2020年5月新增)": 43,
  56. "月度-商品猪出栏量": 44,
  57. "月度-能繁母猪存栏量": 45,
  58. "月度-原种场二元后备母猪销量及出栏日龄": 46,
  59. "涌益样本测算": 47,
  60. "周度-养殖利润": 48,
  61. "周度-华东冻品价格": 49,
  62. "运费": 50,
  63. }
  64. return classifyMap
  65. }
  66. var YongyiWeeklySheetMap5 map[string]*models.YongyiSheet
  67. var YongyiWeeklySheetMap6 map[string]*models.YongyiSheet
  68. var YongyiWeeklySheetMap9 map[string]*models.YongyiSheet
  69. var YongyiBaseInfoMap map[string]*models.YongyiSheet
  70. func init() {
  71. YongyiWeeklySheetMap5 = map[string]*models.YongyiSheet{
  72. "周度-50公斤二元母猪价格": {"50公斤二元母猪价格", "周度-50公斤二元母猪价格", "周度", "元/头"},
  73. "周度-规模场15公斤仔猪出栏价": {"规模场15公斤仔猪出栏价", "周度-规模场15公斤仔猪出栏价", "周度", "元/头"},
  74. "周度-宰后结算价": {"宰后结算价", "周度-宰后结算价", "周度", "元/公斤"},
  75. "周度-冻品库存": {"冻品库存", "周度-冻品库存", "周度", "%"},
  76. "周度-猪肉价(前三等级白条均价)": {"前三等级白条均价", "周度-猪肉价(前三等级白条均价)", "周度", "元/公斤"},
  77. }
  78. YongyiWeeklySheetMap6 = map[string]*models.YongyiSheet{
  79. "周度-冻品库存多样本": {"冻品库存多样本", "周度-冻品库存多样本", "周度", "%"},
  80. "月度出栏完成率": {"出栏完成率", "月度出栏完成率", "旬度", "%"},
  81. }
  82. YongyiWeeklySheetMap9 = map[string]*models.YongyiSheet{
  83. "月度-小猪存栏(2020年5月新增)": {"50kg以下小猪存栏量", "月度-小猪存栏(2020年5月新增)", "月度", "头"},
  84. "月度-中猪存栏(2020年5月新增)": {"中猪存栏量", "月度-中猪存栏(2020年5月新增)", "月度", "头"},
  85. "月度-大猪存栏(2020年5月新增)": {"大猪存栏量", "月度-大猪存栏(2020年5月新增)", "月度", "头"},
  86. }
  87. YongyiBaseInfoMap = map[string]*models.YongyiSheet{
  88. "出栏价": {"商品猪出栏价", "日度-商品猪出栏价", "日度", "元/公斤"},
  89. "标肥价差": {"", "日度-商品猪标肥价差", "日度", "元/公斤"},
  90. "价格+宰量": {"", "日度-商品猪全国均价和宰量", "日度", "元/公斤"},
  91. "屠宰企业日度屠宰量": {"商品猪日屠宰量", "日度-屠宰企业屠宰量", "日度", "头"},
  92. "周度-商品猪出栏价": {"商品猪出栏价", "周度-商品猪出栏价", "周度", "元/公斤"},
  93. "周度-体重": {"商品猪出栏体重", "周度-体重", "周度", "公斤"},
  94. "周度-屠宰厂宰前活猪重": {"商品猪宰前活猪重", "周度-屠宰厂宰前活猪重", "周度", "公斤"},
  95. "周度-各体重段价差": {"", "周度-各体重段价差", "周度", "元/斤"},
  96. "周度-50公斤二元母猪价格": {"50公斤二元母猪价格", "周度-50公斤二元母猪价格", "周度", "元/头"},
  97. "周度-规模场15公斤仔猪出栏价": {"规模场15公斤仔猪出栏价", "周度-规模场15公斤仔猪出栏价", "周度", "元/头"},
  98. "周度-宰后结算价": {"宰后结算价", "周度-宰后结算价", "周度", "元/公斤"},
  99. "周度-冻品库存": {"冻品库存", "周度-冻品库存", "周度", "%"},
  100. "周度-冻品库存多样本": {"冻品库存多样本", "周度-冻品库存多样本", "周度", "%"},
  101. "周度-猪肉价(前三等级白条均价)": {"前三等级白条均价", "周度-猪肉价(前三等级白条均价)", "周度", "元/公斤"},
  102. "月度出栏完成率": {"出栏完成率", "月度出栏完成率", "旬度", "%"},
  103. "月度计划出栏量": {"月度计划出栏量环比", "月度计划出栏量", "月度", "%"},
  104. "月度-能繁母猪存栏(2020年2月新增)": {"能繁母猪存栏量", "月度-能繁母猪存栏(2020年2月新增)", "月度", "头"},
  105. "月度-小猪存栏(2020年5月新增)": {"50kg以下小猪存栏量", "月度-小猪存栏(2020年5月新增)", "月度", "头"},
  106. "月度-中猪存栏(2020年5月新增)": {"中猪存栏量", "月度-中猪存栏(2020年5月新增)", "月度", "头"},
  107. "月度-大猪存栏(2020年5月新增)": {"大猪存栏量", "月度-大猪存栏(2020年5月新增)", "月度", "头"},
  108. "月度-商品猪出栏量": {"商品猪出栏量", "月度-商品猪出栏量", "月度", "头"},
  109. "历史猪价": {"历史猪价", "历史猪价", "月度", "元/公斤"},
  110. "二育成本": {"", "二育成本", "周度", "kg"}, //单位有四种kg、无, 元/kg, 元
  111. "二育销量": {"二育销量", "二育销量", "周度", "%"},
  112. "育肥栏舍利用率": {"育肥栏舍利用率", "育肥栏舍利用率", "旬度", "%"},
  113. "周度-养殖利润最新": {"出栏肥猪利润", "周度-养殖利润最新", "周度", "元/头"},
  114. "周度-当期、预期成本": {"", "周度-当期、预期成本", "周度", "元/kg"},
  115. "育肥全价料出厂价": {"育肥全价料出厂均价参考", "周度-育肥全价料出厂价", "周度", "元/吨"},
  116. "周度-成本计算附件": {"", "周度-成本计算附件", "周度", "元/头"}, //多个单位:元/头,%,kg,元
  117. "周度-毛白价差": {"毛白价差", "周度-毛白价差", "周度", "元/公斤"},
  118. "仔猪、母猪": {"", "仔猪、母猪", "周度", "元/头"}, //多个前缀,仔猪价,二元母猪价
  119. "周度-河南屠宰白条成本": {"河南屠宰白条成本", "周度-河南屠宰白条成本", "周度", "元/kg"}, //多个单位:kg,元/kg,元/头
  120. "周度-淘汰母猪价格": {"淘汰母猪价格", "周度-淘汰母猪价格", "周度", "元/斤"},
  121. "鲜销率": {"鲜销率", "周度-鲜销率", "周度", "%"},
  122. "周度-猪肉产品价格": {"猪肉产品价格", "周度-猪肉产品价格", "周度", "元/公斤"},
  123. "周度-屠宰企业日度屠宰量": {"屠宰企业日度屠宰量", "周度-屠宰企业日度屠宰量", "周度", "头"},
  124. "周度-屠宰新2022.10.28": {"不同规模屠宰厂宰杀量", "周度-屠宰新2022.10.28", "周度", "头"},
  125. "月度-淘汰母猪屠宰厂宰杀量": {"淘汰母猪屠宰厂宰杀量", "月度-淘汰母猪屠宰厂宰杀量", "月度", "头"},
  126. "月度-猪料销量": {"饲料销量(环比)", "月度-猪料销量", "月度", "头"}, //todo 单位有问题
  127. "月度-屠宰企业开工率": {"", "月度-屠宰企业开工率", "月度", "%"},
  128. "月度-屠宰厂公母比例": {"屠宰厂", "月度-屠宰厂公母比例", "月度", "头"}, //多个单位:头,%
  129. "月度-生产指标(2021.5.7新增)": {"生产指标", "月度-生产指标(2021.5.7新增)", "月度", "头"}, //多个单位:头,%
  130. "月度-生产指标2": {"生产指标", "月度-生产指标2", "月度", "头"}, //多个单位:头,%
  131. "月度-二元三元能繁比例": {"能繁母猪存栏量", "月度-二元三元能繁比例", "月度", "%"}, //多个单位:头,%
  132. "月度-能繁母猪存栏量": {"月度能繁母猪存栏量", "月度-能繁母猪存栏量", "月度", "头"},
  133. "月度-原种场二元后备母猪销量及出栏日龄": {"原种场二元后备母猪销量及出栏日龄", "月度-原种场二元后备母猪销量及出栏日龄", "月度", "头"},
  134. "涌益样本测算": {"涌益样本测算", "涌益样本测算", "月度", "窝"}, //多个单位:头,%,窝,公斤,元/公斤
  135. "周度-养殖利润": {"外购育肥", "周度-养殖利润", "周度", "元/头"},
  136. "华东冻品价格": {"华东冻品价格", "周度-华东冻品价格", "周度", "元/公斤"},
  137. "运费": {"9.6米拉猪车主流运费", "运费", "周度", "元/公里"},
  138. }
  139. }
  140. func GetBaseInfo(sheetName string) (classifyName string, classifySort int, frequency string, unit string, namePrefix string, namePrefixPingin string) {
  141. // 获取指标分类
  142. info, ok := YongyiBaseInfoMap[sheetName]
  143. if !ok {
  144. return
  145. }
  146. classifyName = info.ClassifyName
  147. classifyMap := getClassifySortMap()
  148. classifySort, _ = classifyMap[classifyName]
  149. frequency = info.Frequency
  150. unit = info.Unit
  151. namePrefix = info.NamePrefix
  152. namePrefixPingin = "yyzx" + utils.GetFirstPingYin(namePrefix)
  153. return
  154. }
  155. func GetMergeCells(f *excelize.File, sheet string) (mergeCellMap map[int]map[int]string, err error) {
  156. mergedCells, err := f.GetMergeCells(sheet)
  157. if err != nil {
  158. fmt.Println(err)
  159. return
  160. }
  161. mergeCellMap = make(map[int]map[int]string)
  162. // 遍历所有合并单元格范围
  163. for _, cellRange := range mergedCells {
  164. fmt.Println("Merged Cell Range:", cellRange)
  165. cellVal := cellRange.GetCellValue()
  166. // 解析合并单元格范围,例如 "A1:B2"
  167. startCell, endCell := cellRange.GetStartAxis(), cellRange.GetEndAxis()
  168. if err != nil {
  169. fmt.Println(err)
  170. continue
  171. }
  172. // 解析起始单元格的下标
  173. startCol, startRow, err := excelize.CellNameToCoordinates(startCell)
  174. if err != nil {
  175. fmt.Println(err)
  176. continue
  177. }
  178. // 解析结束单元格的下标
  179. endCol, endRow, err := excelize.CellNameToCoordinates(endCell)
  180. if err != nil {
  181. fmt.Println(err)
  182. continue
  183. }
  184. // 打印合并单元格的起始和结束下标
  185. fmt.Printf("Start: Row %d, Col %d\n", startRow, startCol)
  186. fmt.Printf("End: Row %d, Col %d\n", endRow, endCol)
  187. //把合并的单元格整理成单个单元格,用于计算
  188. for i := startRow; i <= endRow; i++ {
  189. cellMap, ok := mergeCellMap[i-1]
  190. if !ok {
  191. cellMap = make(map[int]string)
  192. }
  193. for j := startCol; j <= endCol; j++ {
  194. cellMap[j-1] = strings.TrimSpace(cellVal)
  195. }
  196. mergeCellMap[i-1] = cellMap
  197. }
  198. }
  199. return
  200. }
  201. // GetWeekly13IndexName 二育成本指标名称处理
  202. func GetWeekly13IndexName(name, level string) string {
  203. switch {
  204. case strings.Contains(name, "二育主流采购体重段"):
  205. return fmt.Sprintf("二育主流%s采购体重段", level)
  206. case strings.Contains(name, "计划出栏体重"):
  207. return fmt.Sprintf("计划%s出栏体重", level)
  208. case strings.Contains(name, "料肉比"):
  209. return fmt.Sprintf("%s料肉比", level)
  210. case strings.Contains(name, "采购成本"):
  211. return fmt.Sprintf("%s采购成本", level)
  212. case strings.Contains(name, "运费+损耗"):
  213. return fmt.Sprintf("%s运费+损耗", level)
  214. case strings.Contains(name, "增重饲料成本"):
  215. return fmt.Sprintf("%s增重饲料成本", level)
  216. case strings.Contains(name, "二育成本"):
  217. return fmt.Sprintf("%s二育成本", level)
  218. }
  219. return name
  220. }
  221. // GetWeekly13IndexUnit 二育成本指标名称处理
  222. func GetWeekly13IndexUnit(name string) string {
  223. switch {
  224. case strings.Contains(name, "二育主流采购体重段") || strings.Contains(name, "计划出栏体重"):
  225. return "kg"
  226. case strings.Contains(name, "料肉比"):
  227. return "无"
  228. case strings.Contains(name, "采购成本") || strings.Contains(name, "运费+损耗") || strings.Contains(name, "二育成本"):
  229. return "元/kg"
  230. case strings.Contains(name, "增重饲料成本"):
  231. return "元"
  232. }
  233. return name
  234. }
  235. func getSundayOfWeek(year int, week int) string {
  236. t := time.Date(year, 1, 1, 0, 0, 0, 0, time.Local)
  237. weekday := int(t.Weekday())
  238. daysToFirstSunday := (7 - weekday) % 7
  239. firstSunday := t.AddDate(0, 0, daysToFirstSunday)
  240. daysToDesiredSunday := (week - 1) * 7
  241. return firstSunday.AddDate(0, 0, daysToDesiredSunday).Format(utils.FormatDate)
  242. }
  243. func isValueValid(value string) bool {
  244. if value == "" {
  245. return false
  246. }
  247. _, err := strconv.ParseFloat(value, 64)
  248. return err == nil
  249. }
  250. func excelDateToTimeDateStr(excelDate int) string {
  251. baseDate := time.Date(1899, 12, 30, 0, 0, 0, 0, time.UTC)
  252. return baseDate.AddDate(0, 0, excelDate).Format(utils.FormatDate)
  253. }
  254. func getMergeCellValMap(f *excelize.File, sheetName string) (mergeIndexDataMap map[string]string, e error) {
  255. mergeIndexDataMap = make(map[string]string)
  256. merges, e := f.GetMergeCells(sheetName)
  257. if e != nil {
  258. return
  259. }
  260. for _, merge := range merges {
  261. xmin, ymin, e := excelize.CellNameToCoordinates(merge.GetStartAxis())
  262. if e != nil {
  263. continue
  264. }
  265. xmax, ymax, e := excelize.CellNameToCoordinates(merge.GetEndAxis())
  266. if e != nil {
  267. continue
  268. }
  269. for i := xmin; i <= xmax; i++ {
  270. for j := ymin; j <= ymax; j++ {
  271. mergeIndexDataMap[fmt.Sprintf("%d:%d", i, j)] = merge.GetCellValue()
  272. }
  273. }
  274. }
  275. return
  276. }
  277. func getCellValue(cell string) (val string, ok bool) {
  278. valueArr := strings.Split(cell, "-")
  279. switch len(valueArr) {
  280. case 1:
  281. if !isValueValid(valueArr[0]) {
  282. return
  283. }
  284. return valueArr[0], true
  285. case 2:
  286. val1, err := strconv.ParseFloat(valueArr[0], 64)
  287. if err != nil {
  288. return
  289. }
  290. val2, err := strconv.ParseFloat(valueArr[1], 64)
  291. if err != nil {
  292. return
  293. }
  294. mean := (val1 + val2) / 2
  295. return fmt.Sprintf("%.2f", mean), true
  296. }
  297. return "", false
  298. }