custom_analysis_edb.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage/excel"
  6. excelServices "eta/eta_api/services/excel"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "github.com/araddon/dateparse"
  10. "github.com/shopspring/decimal"
  11. )
  12. // GetCustomAnalysisExcelData 获取自定义分析的表格data数据
  13. func GetCustomAnalysisExcelData(excelInfo *excel.ExcelInfo) (luckySheet excelServices.LuckySheet, err error, errMsg string) {
  14. // 查找当前excel的sheet列表
  15. sheetList, err := excel.GetAllSheetList(excelInfo.ExcelInfoId)
  16. if err != nil {
  17. errMsg = "保存失败"
  18. err = errors.New("查找当前excel的sheet列表失败,Err:" + err.Error())
  19. return
  20. }
  21. currSheetMap := make(map[string]string)
  22. for _, sheet := range sheetList {
  23. currSheetMap[sheet.SheetName] = sheet.SheetName
  24. }
  25. sheetCellDataMapList := make(map[int][]excelServices.LuckySheetCellData)
  26. // 通过excel的id获取各个sheet的单元格数据map
  27. {
  28. dataList, tmpErr := excel.GetAllSheetDataListByExcelInfoId(excelInfo.ExcelInfoId)
  29. if tmpErr != nil {
  30. err = tmpErr
  31. return
  32. }
  33. for _, cellData := range dataList {
  34. sheetDataList, ok := sheetCellDataMapList[cellData.ExcelSheetId]
  35. if !ok {
  36. sheetDataList = make([]excelServices.LuckySheetCellData, 0)
  37. }
  38. tmpSheetDataList := make([]excelServices.LuckySheetCellData, 0)
  39. err = json.Unmarshal([]byte(cellData.Data), &tmpSheetDataList)
  40. if err != nil {
  41. return
  42. }
  43. sheetCellDataMapList[cellData.ExcelSheetId] = append(sheetDataList, tmpSheetDataList...)
  44. }
  45. }
  46. // 转成luckySheet的数据格式
  47. luckySheet = excelServices.LuckySheet{
  48. SheetList: make([]excelServices.LuckySheetData, 0),
  49. }
  50. for _, sheet := range sheetList {
  51. var luckySheetDataConfig excelServices.LuckySheetDataConfig
  52. err = json.Unmarshal([]byte(sheet.Config), &luckySheetDataConfig)
  53. if err != nil {
  54. return
  55. }
  56. tmpLuckySheetDataInfo := excelServices.LuckySheetData{
  57. Name: sheet.SheetName,
  58. Index: sheet.Sort,
  59. CellData: sheetCellDataMapList[sheet.ExcelSheetId],
  60. Config: luckySheetDataConfig,
  61. }
  62. luckySheet.SheetList = append(luckySheet.SheetList, tmpLuckySheetDataInfo)
  63. }
  64. return
  65. }
  66. // GenerateExcelCustomAnalysisExcel 根据自定义分析的表格data数据生成excel
  67. func GenerateExcelCustomAnalysisExcel(excelInfo *excel.ExcelInfo) (downloadFilePath string, err error, errMsg string) {
  68. luckySheet, err, errMsg := GetCustomAnalysisExcelData(excelInfo)
  69. if err != nil {
  70. return
  71. }
  72. downloadFilePath, err = luckySheet.ToExcel()
  73. fmt.Println("生成的文件地址:", downloadFilePath)
  74. return
  75. }
  76. // HandleEdbSequenceVal 处理日期集和数据集(获取可用的日期、数据集)
  77. func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateList []string, newDataList []float64, err error, errMsg string) {
  78. newDateList = make([]string, 0)
  79. newDataList = make([]float64, 0)
  80. // 数据集
  81. type dataStruct struct {
  82. Value float64
  83. Ok bool
  84. }
  85. dataList := make([]dataStruct, 0)
  86. {
  87. var startData bool
  88. for _, v := range dataSequenceVal {
  89. // 如果没有数据集,那么就过滤
  90. if v == `` {
  91. // 如果开始插入数据了,那么就需要插入不存在值
  92. if startData {
  93. dataList = append(dataList, dataStruct{
  94. Value: 0,
  95. Ok: false,
  96. })
  97. }
  98. continue
  99. }
  100. startData = true
  101. tmpValDec, tmpErr := decimal.NewFromString(v)
  102. if tmpErr != nil {
  103. dataList = append(dataList, dataStruct{
  104. Value: 0,
  105. Ok: false,
  106. })
  107. continue
  108. }
  109. tmpVal, _ := tmpValDec.Float64()
  110. dataList = append(dataList, dataStruct{
  111. Value: tmpVal,
  112. Ok: true,
  113. })
  114. }
  115. }
  116. // 日期集
  117. dateList := make([]string, 0)
  118. {
  119. var startData bool
  120. for _, v := range dateSequenceVal {
  121. // 如果没有数据集,那么就过滤
  122. if v == `` {
  123. // 如果开始插入数据了,那么就需要插入不存在值
  124. if startData {
  125. dateList = append(dateList, "")
  126. }
  127. continue
  128. }
  129. startData = true
  130. t1, tmpErr := dateparse.ParseAny(v)
  131. if tmpErr != nil {
  132. dateList = append(dateList, "")
  133. continue
  134. }
  135. dateList = append(dateList, t1.Format(utils.FormatDate))
  136. }
  137. }
  138. lenData := len(dataList)
  139. lenDate := len(dateList)
  140. // 最小个数
  141. num := lenDate
  142. if num > lenData {
  143. num = lenData
  144. }
  145. for i := 0; i < num; i++ {
  146. date := dateList[i]
  147. data := dataList[i]
  148. // 日期为空、数据为空
  149. if !data.Ok || date == `` {
  150. continue
  151. }
  152. newDateList = append(newDateList, date)
  153. newDataList = append(newDataList, data.Value)
  154. }
  155. return
  156. }