chart_theme.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. package data
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/chart_theme"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "github.com/shopspring/decimal"
  10. "math"
  11. "time"
  12. )
  13. // GetThemePreviewChartEdbData 获取图表的指标数据
  14. func GetThemePreviewChartEdbData(chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, extraConfigStr string, seasonExtraConfig string) (edbList []*data_manage.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []data_manage.YData, dataResp interface{}, err error, errMsg string) {
  15. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  16. xEdbIdValue = make([]int, 0)
  17. yDataList = make([]data_manage.YData, 0)
  18. var extraConfig interface{}
  19. switch chartType {
  20. case 7: // 柱形图
  21. var barConfig data_manage.BarChartInfoReq
  22. if extraConfigStr == `` {
  23. errMsg = "柱方图未配置"
  24. err = errors.New(errMsg)
  25. return
  26. }
  27. err = json.Unmarshal([]byte(extraConfigStr), &barConfig)
  28. if err != nil {
  29. errMsg = "柱方图配置异常"
  30. err = errors.New(errMsg)
  31. return
  32. }
  33. extraConfig = barConfig
  34. case 10: // 截面散点图
  35. var tmpExtraConfig data_manage.SectionScatterReq
  36. if extraConfigStr == `` {
  37. errMsg = "截面散点图未配置"
  38. err = errors.New(errMsg)
  39. return
  40. }
  41. err = json.Unmarshal([]byte(extraConfigStr), &tmpExtraConfig)
  42. if err != nil {
  43. errMsg = "截面散点配置异常"
  44. err = errors.New(errMsg)
  45. return
  46. }
  47. extraConfig = tmpExtraConfig
  48. default:
  49. xEdbIdValue = make([]int, 0)
  50. yDataList = make([]data_manage.YData, 0)
  51. }
  52. // 指标对应的所有数据
  53. edbDataListMap, edbList, err := getThemePreviewEdbDataMapList(chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig)
  54. if err != nil {
  55. return
  56. }
  57. // 特殊图形数据处理
  58. switch chartType {
  59. case 7: // 柱形图
  60. barChartConf := extraConfig.(data_manage.BarChartInfoReq)
  61. xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
  62. for k := range yDataList {
  63. yDataList[k].Unit = barChartConf.Unit
  64. yDataList[k].UnitEn = barChartConf.UnitEn
  65. }
  66. for _, v := range edbList {
  67. // 指标别名
  68. if barChartConf.EdbInfoIdList != nil && len(barChartConf.EdbInfoIdList) > 0 {
  69. for _, reqEdb := range barChartConf.EdbInfoIdList {
  70. if v.EdbInfoId == reqEdb.EdbInfoId {
  71. v.EdbAliasName = reqEdb.Name
  72. }
  73. }
  74. }
  75. }
  76. case 10: // 截面散点图
  77. sectionScatterConf := extraConfig.(data_manage.SectionScatterReq)
  78. xEdbIdValue, dataResp, err = getThemePreviewSectionScatterChartData(mappingList, edbDataListMap, sectionScatterConf)
  79. var tmpExtraConfig data_manage.SectionScatterReq
  80. if extraConfigStr == `` {
  81. errMsg = "截面散点图未配置"
  82. err = errors.New(errMsg)
  83. return
  84. }
  85. err = json.Unmarshal([]byte(extraConfigStr), &tmpExtraConfig)
  86. if err != nil {
  87. errMsg = "截面散点配置异常"
  88. err = errors.New(errMsg)
  89. return
  90. }
  91. // 这个数据没有必要返回给前端
  92. for _, v := range edbList {
  93. v.DataList = nil
  94. }
  95. }
  96. return
  97. }
  98. func getThemePreviewEdbDataMapList(chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
  99. // 指标对应的所有数据
  100. edbDataListMap = make(map[int][]*data_manage.EdbDataList)
  101. for _, v := range mappingList {
  102. //fmt.Println("v:", v.EdbInfoId)
  103. item := new(data_manage.ChartEdbInfoMapping)
  104. item.EdbInfoId = v.EdbInfoId
  105. item.SourceName = v.SourceName
  106. item.Source = v.Source
  107. item.EdbCode = v.EdbCode
  108. item.EdbName = v.EdbName
  109. item.EdbNameEn = v.EdbNameEn
  110. item.Frequency = v.Frequency
  111. item.EdbType = v.EdbType
  112. item.FrequencyEn = GetFrequencyEn(v.Frequency)
  113. if v.Unit != `无` {
  114. item.Unit = v.Unit
  115. }
  116. item.UnitEn = v.UnitEn
  117. item.StartDate = v.StartDate
  118. item.EndDate = v.EndDate
  119. item.ModifyTime = v.ModifyTime
  120. item.EdbInfoCategoryType = v.EdbInfoCategoryType
  121. item.PredictChartColor = v.PredictChartColor
  122. item.ClassifyId = v.ClassifyId
  123. item.IsAxis = 1
  124. item.EdbInfoType = 1
  125. item.LeadValue = v.LeadValue
  126. item.LeadUnit = v.LeadUnit
  127. item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
  128. item.ChartEdbMappingId = v.ChartEdbMappingId
  129. item.ChartInfoId = v.ChartInfoId
  130. item.ChartStyle = v.ChartStyle
  131. item.ChartColor = v.ChartColor
  132. item.ChartWidth = 0
  133. item.IsOrder = false
  134. item.MaxData = v.MaxValue
  135. item.MinData = v.MinValue
  136. item.LatestValue = v.LatestValue
  137. item.LatestDate = v.LatestDate
  138. item.UniqueCode = v.UniqueCode
  139. item.MoveLatestDate = v.LatestDate
  140. var startDateReal string
  141. var diffSeconds int64
  142. if chartType == 2 { //季节性图
  143. startDateReal = startDate
  144. } else {
  145. if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
  146. var startTimeRealTemp time.Time
  147. startDateParse, _ := time.Parse(utils.FormatDate, startDate)
  148. switch v.LeadUnit {
  149. case "天":
  150. startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
  151. case "月":
  152. startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
  153. case "季":
  154. startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
  155. case "周":
  156. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
  157. case "年":
  158. startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
  159. }
  160. if startTimeRealTemp.Before(startDateParse) {
  161. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  162. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  163. } else {
  164. startDateReal = startDate
  165. diffSeconds = 0
  166. }
  167. // 预测指标的开始日期也要偏移
  168. {
  169. day, tmpErr := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
  170. if tmpErr != nil {
  171. err = tmpErr
  172. return
  173. }
  174. moveLatestDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, item.MoveLatestDate, time.Local)
  175. if tmpErr != nil {
  176. err = tmpErr
  177. return
  178. }
  179. item.MoveLatestDate = moveLatestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
  180. }
  181. } else {
  182. startDateReal = startDate
  183. }
  184. }
  185. dataList := make([]*data_manage.EdbDataList, 0)
  186. dataList, err = chart_theme.GetChartThemeDefaultDataItemList(v.EdbInfoId, startDateReal)
  187. if err != nil {
  188. return
  189. }
  190. edbDataListMap[v.EdbInfoId] = dataList
  191. if diffSeconds != 0 && v.EdbInfoType == 0 {
  192. dataListLen := len(dataList)
  193. for i := 0; i < dataListLen; i++ {
  194. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  195. }
  196. }
  197. if chartType == 2 {
  198. latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
  199. if tmpErr != nil {
  200. //item.DataList = dataList
  201. item.IsNullData = true
  202. edbList = append(edbList, item)
  203. continue
  204. }
  205. quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
  206. if tErr != nil {
  207. err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
  208. return
  209. }
  210. item.DataList = quarterDataList
  211. } else if chartType == 7 { //柱方图
  212. //item.DataList = dataList
  213. } else {
  214. item.DataList = dataList
  215. }
  216. edbList = append(edbList, item)
  217. }
  218. return
  219. }
  220. func getThemePreviewSectionScatterChartData(mappingList []*data_manage.ChartEdbInfoMapping, edbDataListMap map[int][]*data_manage.EdbDataList, extraConfig data_manage.SectionScatterReq) (edbIdList []int, chartDataResp data_manage.SectionScatterInfoResp, err error) {
  221. // 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
  222. edbDataMap := make(map[int]map[string]float64)
  223. for edbInfoId, edbDataList := range edbDataListMap {
  224. edbDateData := make(map[string]float64)
  225. for _, edbData := range edbDataList {
  226. edbDateData[edbData.DataTime] = edbData.Value
  227. }
  228. edbDataMap[edbInfoId] = edbDateData
  229. }
  230. // edbIdList 指标展示顺序;x轴的指标顺序
  231. edbIdList = make([]int, 0)
  232. edbMappingMap := make(map[int]*data_manage.ChartEdbInfoMapping)
  233. for _, v := range mappingList {
  234. edbIdList = append(edbIdList, v.EdbInfoId)
  235. edbMappingMap[v.EdbInfoId] = v
  236. }
  237. //SectionScatterSeriesInfoResp
  238. dataListResp := make([]data_manage.SectionScatterSeriesItemResp, 0) //y轴的数据列表
  239. for _, seriesItem := range extraConfig.SeriesList {
  240. var maxDate time.Time
  241. // 系列中的指标数据
  242. tmpSeriesEdbInfoList := make([]data_manage.SectionScatterEdbItemResp, 0)
  243. var minXVal, maxXVal, minYVal, maxYVal float64
  244. for _, edbConf := range seriesItem.EdbInfoList {
  245. tmpItem := data_manage.SectionScatterEdbItemResp{
  246. IsShow: edbConf.IsShow,
  247. Name: edbConf.Name,
  248. NameEn: edbConf.NameEn,
  249. } //单个坐标点的数据
  250. //X轴的数据
  251. {
  252. edbInfoId := edbConf.XEdbInfoId //X轴的指标
  253. edbMappingInfo, ok := edbMappingMap[edbInfoId]
  254. if !ok {
  255. continue
  256. }
  257. findDate := edbConf.XDate //需要的日期值
  258. dataList := edbDataListMap[edbInfoId] //指标的所有数据值
  259. if len(dataList) <= 0 {
  260. // 没有数据的指标id
  261. //findDataList = append(findDataList, 0)
  262. continue
  263. }
  264. tmpItem.XEdbInfoId = edbInfoId
  265. tmpItem.XName = edbMappingInfo.EdbName
  266. tmpItem.XNameEn = edbMappingInfo.EdbNameEn
  267. switch edbConf.XDateType {
  268. case 1: //最新值
  269. findDate = dataList[len(dataList)-1].DataTime
  270. case 2: //近期几天
  271. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
  272. if tmpErr != nil {
  273. err = tmpErr
  274. return
  275. }
  276. findDateTime = findDateTime.AddDate(0, 0, -edbConf.XDateValue)
  277. lenData := len(dataList) - 1
  278. for i := lenData; i >= 0; i-- {
  279. currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
  280. if tmpErr != nil {
  281. err = tmpErr
  282. return
  283. }
  284. if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
  285. findDate = dataList[i].DataTime
  286. break
  287. }
  288. }
  289. case 3: // 固定日期
  290. //最早的日期
  291. minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  292. if tmpErr != nil {
  293. err = tmpErr
  294. return
  295. }
  296. //寻找固定日期的数据
  297. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, edbConf.XDate, time.Local)
  298. if tmpErr != nil {
  299. err = tmpErr
  300. return
  301. }
  302. for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  303. tmpDate := tmpDateTime.Format(utils.FormatDate)
  304. if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
  305. findDate = tmpDate
  306. break
  307. }
  308. }
  309. default:
  310. err = errors.New(fmt.Sprint("日期类型异常,Type:", edbConf.XDate))
  311. return
  312. }
  313. findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
  314. if maxDate.IsZero() {
  315. maxDate = findDateTime
  316. } else {
  317. if findDateTime.After(maxDate) {
  318. maxDate = findDateTime
  319. }
  320. }
  321. if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
  322. tmpItem.XDate = findDate
  323. tmpItem.XValue = tmpValue
  324. } else {
  325. continue
  326. }
  327. }
  328. //Y轴的数据
  329. {
  330. edbInfoId := edbConf.YEdbInfoId //Y轴的指标
  331. edbMappingInfo, ok := edbMappingMap[edbInfoId]
  332. if !ok {
  333. continue
  334. }
  335. findDate := edbConf.YDate //需要的日期值
  336. dataList := edbDataListMap[edbInfoId] //指标的所有数据值
  337. if len(dataList) <= 0 {
  338. // 没有数据的指标id
  339. //findDataList = append(findDataList, 0)
  340. continue
  341. }
  342. tmpItem.YEdbInfoId = edbInfoId
  343. tmpItem.YName = edbMappingInfo.EdbName
  344. tmpItem.YNameEn = edbMappingInfo.EdbNameEn
  345. switch edbConf.YDateType {
  346. case 1: //最新值
  347. findDate = dataList[len(dataList)-1].DataTime
  348. case 2: //近期几天
  349. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
  350. if tmpErr != nil {
  351. err = tmpErr
  352. return
  353. }
  354. findDateTime = findDateTime.AddDate(0, 0, -edbConf.YDateValue)
  355. lenData := len(dataList) - 1
  356. for i := lenData; i >= 0; i-- {
  357. currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
  358. if tmpErr != nil {
  359. err = tmpErr
  360. return
  361. }
  362. if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
  363. findDate = dataList[i].DataTime
  364. break
  365. }
  366. }
  367. case 3: // 固定日期
  368. //最早的日期
  369. minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
  370. if tmpErr != nil {
  371. err = tmpErr
  372. return
  373. }
  374. //寻找固定日期的数据
  375. findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, edbConf.YDate, time.Local)
  376. if tmpErr != nil {
  377. err = tmpErr
  378. return
  379. }
  380. for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
  381. tmpDate := tmpDateTime.Format(utils.FormatDate)
  382. if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
  383. findDate = tmpDate
  384. break
  385. }
  386. }
  387. default:
  388. err = errors.New(fmt.Sprint("日期类型异常,Type:", edbConf.YDate))
  389. return
  390. }
  391. findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
  392. if maxDate.IsZero() {
  393. maxDate = findDateTime
  394. } else {
  395. if findDateTime.After(maxDate) {
  396. maxDate = findDateTime
  397. }
  398. }
  399. if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
  400. tmpItem.YDate = findDate
  401. tmpItem.YValue = tmpValue
  402. } else {
  403. continue
  404. }
  405. }
  406. // 获取当前系列的X轴的最大最小值
  407. {
  408. if tmpItem.XValue < minXVal {
  409. minXVal = tmpItem.XValue
  410. }
  411. if tmpItem.XValue > maxXVal {
  412. maxXVal = tmpItem.XValue
  413. }
  414. if tmpItem.YValue < minYVal {
  415. minYVal = tmpItem.YValue
  416. }
  417. if tmpItem.YValue > maxYVal {
  418. maxYVal = tmpItem.YValue
  419. }
  420. }
  421. tmpSeriesEdbInfoList = append(tmpSeriesEdbInfoList, tmpItem)
  422. }
  423. trendLimitData := make([]data_manage.CoordinatePoint, 0) //趋势线的前后坐标点
  424. var trendLine, rSquare string
  425. // 生成线性方程式
  426. var a, b float64
  427. {
  428. coordinateData := make([]utils.Coordinate, 0)
  429. for _, tmpSeriesEdbInfo := range tmpSeriesEdbInfoList {
  430. tmpCoordinate1 := utils.Coordinate{
  431. X: tmpSeriesEdbInfo.XValue,
  432. Y: tmpSeriesEdbInfo.YValue,
  433. }
  434. coordinateData = append(coordinateData, tmpCoordinate1)
  435. }
  436. // 只有存在两个坐标点的时候,才能去计算线性方程和R平方
  437. if len(coordinateData) >= 2 {
  438. a, b = utils.GetLinearResult(coordinateData)
  439. if !math.IsNaN(a) && !math.IsNaN(b) {
  440. if b > 0 {
  441. trendLine = fmt.Sprintf("y=%sx+%s", utils.SubFloatToString(a, 4), utils.SubFloatToString(b, 4))
  442. } else {
  443. trendLine = fmt.Sprintf("y=%sx%s", utils.SubFloatToString(a, 4), utils.SubFloatToString(b, 4))
  444. }
  445. minYVal, _ = decimal.NewFromFloat(a).Mul(decimal.NewFromFloat(minXVal)).Add(decimal.NewFromFloat(b)).Round(4).Float64()
  446. maxYVal, _ = decimal.NewFromFloat(a).Mul(decimal.NewFromFloat(maxXVal)).Add(decimal.NewFromFloat(b)).Round(4).Float64()
  447. }
  448. // 计算R平方
  449. rSquare = fmt.Sprint(utils.CalculationDecisive(coordinateData))
  450. }
  451. trendLimitData = append(trendLimitData, data_manage.CoordinatePoint{
  452. X: minXVal,
  453. Y: minYVal,
  454. }, data_manage.CoordinatePoint{
  455. X: maxXVal,
  456. Y: maxYVal,
  457. })
  458. }
  459. dataListResp = append(dataListResp, data_manage.SectionScatterSeriesItemResp{
  460. Name: seriesItem.Name,
  461. NameEn: seriesItem.NameEn,
  462. IsNameDefault: seriesItem.IsNameDefault,
  463. Color: seriesItem.Color,
  464. EdbInfoList: tmpSeriesEdbInfoList,
  465. ShowTrendLine: seriesItem.ShowTrendLine,
  466. ShowFitEquation: seriesItem.ShowFitEquation,
  467. ShowRSquare: seriesItem.ShowRSquare,
  468. TrendLine: trendLine,
  469. RSquare: rSquare,
  470. TrendLimitData: trendLimitData,
  471. })
  472. }
  473. // 截面散点图点击详情时自动更新系列名
  474. if len(extraConfig.SeriesList) > 0 {
  475. // 默认名字的时候才自动更新
  476. if extraConfig.SeriesList[0].IsNameDefault {
  477. firstXEdbInfoId := extraConfig.SeriesList[0].EdbInfoList[0].XEdbInfoId
  478. if v, ok := edbMappingMap[firstXEdbInfoId]; ok {
  479. extraConfig.SeriesList[0].Name = v.LatestDate
  480. extraConfig.SeriesList[0].NameEn = v.LatestDate
  481. dataListResp[0].Name = v.LatestDate
  482. dataListResp[0].NameEn = v.LatestDate
  483. }
  484. }
  485. }
  486. chartDataResp = data_manage.SectionScatterInfoResp{
  487. XName: extraConfig.XName,
  488. XNameEn: extraConfig.XNameEn,
  489. XUnitName: extraConfig.XUnitName,
  490. XUnitNameEn: extraConfig.XUnitNameEn,
  491. YName: extraConfig.YName,
  492. YNameEn: extraConfig.YNameEn,
  493. YUnitName: extraConfig.YUnitName,
  494. YUnitNameEn: extraConfig.YUnitNameEn,
  495. XMinValue: extraConfig.XMinValue,
  496. XMaxValue: extraConfig.XMaxValue,
  497. YMinValue: extraConfig.YMinValue,
  498. YMaxValue: extraConfig.YMaxValue,
  499. DataList: dataListResp,
  500. }
  501. return
  502. }
  503. // GetChartThemeConfig
  504. // @Description: 根据主题id获取主题信息,如果获取不到的话,那么就获取默认的主题
  505. // @author: Roc
  506. // @datetime 2023-12-19 14:31:17
  507. // @param chartThemeId int
  508. // @param chartType int
  509. // @param source int
  510. // @return chartTheme *chart_theme.ChartTheme
  511. // @return err error
  512. func GetChartThemeConfig(chartThemeId, source, chartType int) (chartTheme *chart_theme.ChartTheme, err error) {
  513. chartTheme, err = chart_theme.GetChartThemeId(chartThemeId)
  514. if err != nil && err.Error() != utils.ErrNoRow() {
  515. return
  516. }
  517. err = nil
  518. // 如果找到了,那么就返回
  519. if chartTheme != nil {
  520. return
  521. }
  522. // 没有找到的话,那么就找默认的主题
  523. // 查找主题类型id
  524. chartThemeType, err := chart_theme.GetChartThemeTypeByChartTypeAndSource(chartType, source)
  525. if err != nil {
  526. return
  527. }
  528. // 寻找默认的主题id
  529. chartTheme, err = chart_theme.GetChartThemeId(chartThemeType.DefaultChartThemeId)
  530. if err != nil && err.Error() != utils.ErrNoRow() {
  531. return
  532. }
  533. err = nil
  534. // 如果找到了,那么就返回
  535. if chartTheme != nil {
  536. return
  537. }
  538. // 如果还是没找到,那就系统的主题id
  539. chartTheme, err = chart_theme.GetSystemChartTheme(chartThemeType.ChartThemeTypeId)
  540. return
  541. }