balance_table.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_mobile/models/data_manage"
  6. excelModel "eta/eta_mobile/models/data_manage/excel"
  7. "eta/eta_mobile/models/data_manage/excel/request"
  8. "eta/eta_mobile/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, lang)
  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. // 将表格信息转化成指标数据
  48. 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) {
  49. var dateList, dataList []string
  50. // 日期序列
  51. {
  52. _, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DateSequence)
  53. if tmpErr != nil {
  54. err = tmpErr
  55. return
  56. }
  57. startNum = startNum - 1
  58. endNum = endNum - 1
  59. // 选择行的数据
  60. if isRow {
  61. // 因为是选择一行的数据,所以开始行和结束行时一样的
  62. //endNum = startNum - 1
  63. // 开始列名、结束列
  64. var startColumn, endColumn int
  65. if isAll {
  66. // 结束列(其实也就是整列的个数)
  67. endColumn = allCols - 1
  68. } else {
  69. tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  70. if tmpErr != nil {
  71. errMsg = "列名异常:" + startColumnName
  72. err = errors.New(errMsg)
  73. return
  74. }
  75. tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
  76. if tmpErr != nil {
  77. errMsg = "列名异常:" + endColumnName
  78. err = errors.New(errMsg)
  79. return
  80. }
  81. startColumn = tmpStartColumn - 1
  82. endColumn = tmpEndColumn - 1
  83. }
  84. // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
  85. maxCol := allCols
  86. if endColumn > maxCol {
  87. endColumn = maxCol - 1
  88. }
  89. // 长度固定,避免一直申请内存空间
  90. dateList = make([]string, endColumn-startColumn+1)
  91. i := 0
  92. for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
  93. currCell, ok := newMixedTableCellDataListMap[startNum][currColumn]
  94. if !ok {
  95. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currColumn, startNum)
  96. err = errors.New(errMsg)
  97. return
  98. }
  99. dateList[i] = currCell.ShowValue
  100. i++
  101. }
  102. } else if isColumn { // 选择列的数据
  103. if isAll {
  104. // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
  105. endNum = allRows - 1
  106. }
  107. startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  108. if tmpErr != nil {
  109. errMsg = "列名异常:" + startColumnName
  110. err = errors.New(errMsg)
  111. return
  112. }
  113. startColumn = startColumn - 1
  114. // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
  115. maxRow := allRows
  116. if endNum > maxRow {
  117. endNum = maxRow - 1
  118. }
  119. // 长度固定,避免一直申请内存空间
  120. dateList = make([]string, endNum-startNum+1)
  121. i := 0
  122. for currRow := startNum; currRow <= endNum; currRow++ {
  123. currCell, ok := newMixedTableCellDataListMap[currRow][startColumn]
  124. if !ok {
  125. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currRow, startColumn)
  126. err = errors.New(errMsg)
  127. return
  128. }
  129. //dateList = append(dateList, currCell.Value)
  130. dateList[i] = currCell.ShowValue
  131. i++
  132. }
  133. }
  134. }
  135. // 数据序列
  136. {
  137. _, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DataSequence)
  138. if tmpErr != nil {
  139. err = tmpErr
  140. return
  141. }
  142. startNum = startNum - 1
  143. endNum = endNum - 1
  144. // 选择行的数据
  145. if isRow {
  146. // 开始列名、结束列
  147. var startColumn, endColumn int
  148. if isAll {
  149. // 结束列(其实也就是整列的个数)
  150. endColumn = allCols - 1
  151. } else {
  152. tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  153. if tmpErr != nil {
  154. errMsg = "列名异常:" + startColumnName
  155. err = errors.New(errMsg)
  156. return
  157. }
  158. tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
  159. if tmpErr != nil {
  160. errMsg = "列名异常:" + endColumnName
  161. err = errors.New(errMsg)
  162. return
  163. }
  164. startColumn = tmpStartColumn - 1
  165. endColumn = tmpEndColumn - 1
  166. }
  167. // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
  168. maxCol := allCols
  169. if endColumn > maxCol {
  170. endColumn = maxCol - 1
  171. }
  172. // 长度固定,避免一直申请内存空间
  173. dataList = make([]string, endColumn-startColumn+1)
  174. i := 0
  175. for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
  176. currCell, ok := newMixedTableCellDataListMap[startNum][currColumn]
  177. if !ok {
  178. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, currColumn)
  179. err = errors.New(errMsg)
  180. return
  181. }
  182. //dataList = append(dataList, currCell.Value)
  183. dataList[i] = currCell.ShowValue
  184. i++
  185. }
  186. } else if isColumn { // 选择列的数据
  187. if isAll {
  188. // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
  189. endNum = allRows - 1
  190. }
  191. startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  192. if tmpErr != nil {
  193. errMsg = "列名异常:" + startColumnName
  194. err = errors.New(errMsg)
  195. return
  196. }
  197. startColumn = startColumn - 1
  198. // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
  199. maxRow := allRows
  200. if endNum > maxRow {
  201. endNum = maxRow - 1
  202. }
  203. // 长度固定,避免一直申请内存空间
  204. dataList = make([]string, endNum-startNum+1)
  205. i := 0
  206. for currRow := startNum; currRow <= endNum; currRow++ {
  207. currCell, ok := newMixedTableCellDataListMap[currRow][startColumn]
  208. if !ok {
  209. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currRow, startColumn)
  210. err = errors.New(errMsg)
  211. return
  212. }
  213. //dataList = append(dataList, currCell.Value)
  214. dataList[i] = currCell.ShowValue
  215. i++
  216. }
  217. }
  218. }
  219. //fmt.Println(dateList, dataList)
  220. //fmt.Println("日期序列结束")
  221. // 将excel中的日期、数据系列处理
  222. //newDateList, newDataList, err, errMsg := excel2.HandleEdbSequenceVal(dateList, dataList)
  223. newDateList, newDataList := dateList, dataList
  224. if err != nil {
  225. err = fmt.Errorf(" 处理日期和数据系列失败 %s", err.Error())
  226. return
  227. }
  228. newDataMap := make(map[int]float64, len(newDataList))
  229. for i, v := range newDataList {
  230. val, e := strconv.ParseFloat(v, 64)
  231. if e != nil {
  232. err = fmt.Errorf(" 处理日期和数据系列失败 %s", e.Error())
  233. return
  234. }
  235. newDataMap[i] = val
  236. }
  237. //组装成excelEdbData
  238. list := make([]*data_manage.EdbDataList, 0)
  239. for i, v := range newDateList {
  240. // todo 处理DataTimestamp
  241. dataTime, e := time.ParseInLocation(utils.FormatDate, v, time.Local)
  242. if e != nil {
  243. err = errors.New("time.Parse Err:" + err.Error())
  244. return
  245. }
  246. timestamp := dataTime.UnixNano() / 1e6
  247. tmp := &data_manage.EdbDataList{
  248. EdbDataId: i,
  249. EdbInfoId: excelEdbMappingItem.ExcelChartEdbId,
  250. DataTime: v,
  251. DataTimestamp: timestamp,
  252. Value: newDataMap[i],
  253. }
  254. list = append(list, tmp)
  255. }
  256. dataListMap[excelEdbMappingItem.ExcelChartEdbId] = list
  257. return
  258. }
  259. // 获取平衡表指标绑定详情
  260. func GetBalanceExcelChartSimple(excelInfo *excelModel.ExcelInfo, chartInfoId int, lang string) (list []*data_manage.ChartInfoView, mappingListMap map[int][]*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  261. mappingListTmp, err := excelModel.GetExcelChartEdbMappingByChartInfoId(chartInfoId)
  262. if err != nil {
  263. errMsg = "获取失败"
  264. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  265. return
  266. }
  267. mappingList := make([]*excelModel.ExcelChartEdbView, 0)
  268. for _, v := range mappingListTmp {
  269. tmp :=
  270. &excelModel.ExcelChartEdbView{
  271. ExcelChartEdbId: v.ExcelChartEdbId,
  272. ExcelInfoId: v.ExcelInfoId,
  273. ChartInfoId: v.ChartInfoId,
  274. EdbCode: v.EdbCode,
  275. EdbName: v.EdbName,
  276. DateSequenceStr: v.DateSequence,
  277. DataSequenceStr: v.DataSequence,
  278. /*MaxData: v.MaxData,
  279. MinData: v.MinData,
  280. IsOrder: v.IsOrder,
  281. IsAxis: v.IsAxis,
  282. EdbInfoType: v.EdbInfoType,
  283. LeadValue: v.LeadValue,
  284. LeadUnit: v.LeadUnit,*/
  285. FromTag: v.FromTag,
  286. }
  287. mappingList = append(mappingList, tmp)
  288. }
  289. return
  290. }
  291. // 获取单个图表信息
  292. func GetBalanceExcelChartSingle(chartInfo *data_manage.ChartInfoView, lang string) (mappingListTmp []*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  293. // 相关联指标
  294. mappingListTmp, err = excelModel.GetExcelChartEdbMappingByChartInfoId(chartInfo.ChartInfoId)
  295. if err != nil {
  296. errMsg = "获取失败"
  297. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  298. return
  299. }
  300. if len(mappingListTmp) <= 0 {
  301. errMsg = "获取失败"
  302. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  303. return
  304. }
  305. excelInfoId := mappingListTmp[0].ExcelInfoId
  306. // 查询所有子表
  307. excelInfo, err := excelModel.GetExcelInfoById(excelInfoId)
  308. if err != nil {
  309. if err.Error() == utils.ErrNoRow() {
  310. errMsg = "表格不存在"
  311. err = fmt.Errorf(errMsg)
  312. return
  313. }
  314. errMsg = "查询子表失败"
  315. err = fmt.Errorf(" 查询子表失败图表,指标信息失败 Err:%s", err.Error())
  316. return
  317. }
  318. // 获取图表详情
  319. newExcelDataMap, excelAllRows, excelAllCols, err, errMsg := GetBalanceExcelData(excelInfo, lang)
  320. if err != nil {
  321. return
  322. }
  323. dataListMap = make(map[int][]*data_manage.EdbDataList)
  324. for _, mapping := range mappingListTmp {
  325. err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
  326. if err != nil {
  327. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  328. return
  329. }
  330. }
  331. return
  332. }