balance_table.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. excelModel "eta/eta_api/models/data_manage/excel"
  7. "eta/eta_api/models/data_manage/excel/request"
  8. "eta/eta_api/utils"
  9. "fmt"
  10. "github.com/xuri/excelize/v2"
  11. "strconv"
  12. "time"
  13. )
  14. // 将表格信息转化成指标数据
  15. func GetBalanceExcelData(excelDetail *excelModel.ExcelInfo, lang string) (newDataMap map[int]map[int]request.MixedTableCellDataReq, allRows, allCols int, err error, errMsg string) {
  16. var result request.MixedTableReq
  17. err = json.Unmarshal([]byte(excelDetail.Content), &result)
  18. if err != nil {
  19. err = errors.New("表格json转结构体失败,Err:" + err.Error())
  20. return
  21. }
  22. newData, tmpErr, tmpErrMsg := GetMixedTableCellData(result)
  23. if tmpErr != nil {
  24. errMsg = "获取失败"
  25. if tmpErrMsg != `` {
  26. errMsg = tmpErrMsg
  27. }
  28. err = errors.New("获取最新的数据失败,Err:" + tmpErr.Error())
  29. return
  30. }
  31. allRows = len(newData)
  32. allCols = 0
  33. newDataMap = make(map[int]map[int]request.MixedTableCellDataReq)
  34. for r, row := range newData {
  35. tmp := len(row)
  36. if tmp > allCols {
  37. allCols = tmp
  38. }
  39. colMap := make(map[int]request.MixedTableCellDataReq)
  40. for c, col := range row {
  41. colMap[c] = col
  42. }
  43. newDataMap[r] = colMap
  44. }
  45. return
  46. }
  47. func GetBalanceExcelChartList(excelInfo *excelModel.ExcelInfo, lang string) (list []*data_manage.ChartInfoView, mappingListMap map[int][]*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  48. newExcelDataMap, excelAllRows, excelAllCols, err, errMsg := GetBalanceExcelData(excelInfo, lang)
  49. if err != nil {
  50. return
  51. }
  52. dataListMap = make(map[int][]*data_manage.EdbDataList)
  53. // 相关联指标
  54. mappingListTmp, err := excelModel.GetExcelChartEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  55. if err != nil {
  56. errMsg = "获取失败"
  57. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  58. return
  59. }
  60. mappingListMap = make(map[int][]*excelModel.ExcelChartEdb, 0)
  61. charInfoIds := make([]int, 0)
  62. for _, mapping := range mappingListTmp {
  63. mappingListMap[mapping.ChartInfoId] = append(mappingListMap[mapping.ChartInfoId], mapping)
  64. err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
  65. if err != nil {
  66. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  67. return
  68. }
  69. }
  70. for k, _ := range mappingListMap {
  71. charInfoIds = append(charInfoIds, k)
  72. }
  73. list = make([]*data_manage.ChartInfoView, 0)
  74. if len(charInfoIds) > 0 {
  75. chartInfoList, e := data_manage.GetChartInfoViewByIdList(charInfoIds)
  76. if e != nil {
  77. errMsg = "获取失败"
  78. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
  79. return
  80. }
  81. list = chartInfoList
  82. /*for _, chartInfo := range chartInfoList {
  83. mappingList, ok := mappingListMap[chartInfo.ChartInfoId]
  84. if !ok {
  85. err = fmt.Errorf("未找到图表关联的指标信息")
  86. return
  87. }
  88. var chartInfoResp *data_manage.ChartInfoDetailResp
  89. chartInfoResp, err, errMsg = GetBalanceExcelChartDetail(chartInfo, mappingList, sysUser, dataListMap)
  90. if err != nil {
  91. return
  92. }
  93. list = append(list, chartInfoResp)
  94. }*/
  95. }
  96. return
  97. }
  98. // 将表格信息转化成指标数据
  99. func GetBalanceExcelEdbData(excelEdbMappingItem *excelModel.ExcelChartEdb, newMixedTableCellDataListMap map[int]map[int]request.MixedTableCellDataReq, dataListMap map[int][]*data_manage.EdbDataList, allRows, allCols int) (err error, errMsg string) {
  100. var dateList, dataList []string
  101. // 日期序列
  102. {
  103. _, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DateSequence)
  104. if tmpErr != nil {
  105. err = tmpErr
  106. return
  107. }
  108. startNum = startNum - 1
  109. endNum = endNum - 1
  110. // 选择行的数据
  111. if isRow {
  112. // 因为是选择一行的数据,所以开始行和结束行时一样的
  113. //endNum = startNum - 1
  114. // 开始列名、结束列
  115. var startColumn, endColumn int
  116. if isAll {
  117. // 结束列(其实也就是整列的个数)
  118. endColumn = allCols - 1
  119. } else {
  120. tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  121. if tmpErr != nil {
  122. errMsg = "列名异常:" + startColumnName
  123. err = errors.New(errMsg)
  124. return
  125. }
  126. tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
  127. if tmpErr != nil {
  128. errMsg = "列名异常:" + endColumnName
  129. err = errors.New(errMsg)
  130. return
  131. }
  132. startColumn = tmpStartColumn - 1
  133. endColumn = tmpEndColumn - 1
  134. }
  135. // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
  136. maxCol := allCols
  137. if endColumn > maxCol {
  138. endColumn = maxCol - 1
  139. }
  140. // 长度固定,避免一直申请内存空间
  141. dateList = make([]string, endColumn-startColumn+1)
  142. i := 0
  143. for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
  144. currCell, ok := newMixedTableCellDataListMap[startNum][currColumn]
  145. if !ok {
  146. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currColumn, startNum)
  147. err = errors.New(errMsg)
  148. return
  149. }
  150. dateList[i] = currCell.ShowValue
  151. i++
  152. }
  153. } else if isColumn { // 选择列的数据
  154. if isAll {
  155. // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
  156. endNum = allRows - 1
  157. }
  158. startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  159. if tmpErr != nil {
  160. errMsg = "列名异常:" + startColumnName
  161. err = errors.New(errMsg)
  162. return
  163. }
  164. startColumn = startColumn - 1
  165. // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
  166. maxRow := allRows
  167. if endNum > maxRow {
  168. endNum = maxRow - 1
  169. }
  170. // 长度固定,避免一直申请内存空间
  171. dateList = make([]string, endNum-startNum+1)
  172. i := 0
  173. for currRow := startNum; currRow <= endNum; currRow++ {
  174. currCell, ok := newMixedTableCellDataListMap[currRow][startColumn]
  175. if !ok {
  176. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currRow, startColumn)
  177. err = errors.New(errMsg)
  178. return
  179. }
  180. //dateList = append(dateList, currCell.Value)
  181. dateList[i] = currCell.ShowValue
  182. i++
  183. }
  184. }
  185. }
  186. // 数据序列
  187. {
  188. _, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DataSequence)
  189. if tmpErr != nil {
  190. err = tmpErr
  191. return
  192. }
  193. startNum = startNum - 1
  194. endNum = endNum - 1
  195. // 选择行的数据
  196. if isRow {
  197. // 开始列名、结束列
  198. var startColumn, endColumn int
  199. if isAll {
  200. // 结束列(其实也就是整列的个数)
  201. endColumn = allCols - 1
  202. } else {
  203. tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  204. if tmpErr != nil {
  205. errMsg = "列名异常:" + startColumnName
  206. err = errors.New(errMsg)
  207. return
  208. }
  209. tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
  210. if tmpErr != nil {
  211. errMsg = "列名异常:" + endColumnName
  212. err = errors.New(errMsg)
  213. return
  214. }
  215. startColumn = tmpStartColumn - 1
  216. endColumn = tmpEndColumn - 1
  217. }
  218. // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
  219. maxCol := allCols
  220. if endColumn > maxCol {
  221. endColumn = maxCol - 1
  222. }
  223. // 长度固定,避免一直申请内存空间
  224. dataList = make([]string, endColumn-startColumn+1)
  225. i := 0
  226. for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
  227. currCell, ok := newMixedTableCellDataListMap[startNum][currColumn]
  228. if !ok {
  229. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, currColumn)
  230. err = errors.New(errMsg)
  231. return
  232. }
  233. //dataList = append(dataList, currCell.Value)
  234. dataList[i] = currCell.ShowValue
  235. i++
  236. }
  237. } else if isColumn { // 选择列的数据
  238. if isAll {
  239. // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
  240. endNum = allRows - 1
  241. }
  242. startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  243. if tmpErr != nil {
  244. errMsg = "列名异常:" + startColumnName
  245. err = errors.New(errMsg)
  246. return
  247. }
  248. startColumn = startColumn - 1
  249. // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
  250. maxRow := allRows
  251. if endNum > maxRow {
  252. endNum = maxRow - 1
  253. }
  254. // 长度固定,避免一直申请内存空间
  255. dataList = make([]string, endNum-startNum+1)
  256. i := 0
  257. for currRow := startNum; currRow <= endNum; currRow++ {
  258. currCell, ok := newMixedTableCellDataListMap[currRow][startColumn]
  259. if !ok {
  260. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currRow, startColumn)
  261. err = errors.New(errMsg)
  262. return
  263. }
  264. //dataList = append(dataList, currCell.Value)
  265. dataList[i] = currCell.ShowValue
  266. i++
  267. }
  268. }
  269. }
  270. //fmt.Println(dateList, dataList)
  271. //fmt.Println("日期序列结束")
  272. // 将excel中的日期、数据系列处理
  273. //newDateList, newDataList, err, errMsg := excel2.HandleEdbSequenceVal(dateList, dataList)
  274. newDateList, newDataList := dateList, dataList
  275. if err != nil {
  276. err = fmt.Errorf(" 处理日期和数据系列失败 %s", err.Error())
  277. return
  278. }
  279. newDataMap := make(map[int]float64, len(newDataList))
  280. for i, v := range newDataList {
  281. val, e := strconv.ParseFloat(v, 64)
  282. if e != nil {
  283. err = fmt.Errorf(" 处理日期和数据系列失败 %s", e.Error())
  284. return
  285. }
  286. newDataMap[i] = val
  287. }
  288. //组装成excelEdbData
  289. list := make([]*data_manage.EdbDataList, 0)
  290. for i, v := range newDateList {
  291. // todo 处理DataTimestamp
  292. dataTime, e := time.ParseInLocation(utils.FormatDate, v, time.Local)
  293. if e != nil {
  294. err = errors.New("time.Parse Err:" + err.Error())
  295. return
  296. }
  297. timestamp := dataTime.UnixNano() / 1e6
  298. tmp := &data_manage.EdbDataList{
  299. EdbDataId: i,
  300. EdbInfoId: excelEdbMappingItem.ExcelChartEdbId,
  301. DataTime: v,
  302. DataTimestamp: timestamp,
  303. Value: newDataMap[i],
  304. }
  305. list = append(list, tmp)
  306. }
  307. dataListMap[excelEdbMappingItem.ExcelChartEdbId] = list
  308. return
  309. }