123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- package data
- import (
- "encoding/json"
- "errors"
- "eta/eta_chart_lib/models"
- "eta/eta_chart_lib/models/data_manage"
- "eta/eta_chart_lib/models/data_manage/excel"
- "eta/eta_chart_lib/utils"
- "fmt"
- "math"
- "sort"
- "strings"
- "time"
- )
- func GetBalanceExcelChartDetail(chartInfo *models.ChartInfo, mappingListTmp []*excel.ExcelChartEdb, dataListMap map[int][]*models.EdbDataList) (resp *models.ChartInfoDetailResp, err error, errMsg string) {
- chartInfoId := chartInfo.ChartInfoId
- resp = new(models.ChartInfoDetailResp)
- // 获取主题样式
- chartTheme, err := GetChartThemeConfig(chartInfo.ChartThemeId, 1, chartInfo.ChartType)
- if err != nil {
- errMsg = "获取失败"
- err = fmt.Errorf(" 获取主题信息失败 Err:%s", err.Error())
- return
- }
- chartInfo.ChartThemeStyle = chartTheme.Config
- chartInfo.ChartThemeId = chartTheme.ChartThemeId
- dateType := chartInfo.DateType
- fmt.Println("dateType:", dateType)
- chartType := chartInfo.ChartType
- startDate := chartInfo.StartDate
- endDate := chartInfo.EndDate
- seasonStartDate := chartInfo.SeasonStartDate
- seasonEndDate := chartInfo.SeasonEndDate
- startYear := chartInfo.StartYear
- calendar := chartInfo.Calendar
- if calendar == "" {
- calendar = "公历"
- }
- mappingList, err := TransferChartEdbToEdbMappingFormat(chartInfoId, chartType, mappingListTmp, dataListMap)
- if err != nil {
- return
- }
- if chartType == 2 {
- startDate = seasonStartDate
- endDate = seasonEndDate
- if dateType <= 0 {
- if startDate != "" {
- dateType = 5
- } else {
- dateType = utils.DateTypeNYears
- }
- }
- } else {
- if dateType <= 0 {
- dateType = 3
- }
- }
- var dateMax time.Time
- if dateType == utils.DateTypeNYears {
- for _, v := range mappingList {
- if v.LatestDate != "" {
- lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
- if tErr != nil {
- errMsg = "获取失败"
- err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
- return
- }
- if lastDateT.After(dateMax) {
- dateMax = lastDateT
- }
- }
- }
- }
- if chartType == utils.CHART_TYPE_SEASON && dateType == utils.DateTypeNYears {
- dateMax = time.Date(dateMax.Year()+1, 1, 1, 0, 0, 0, 0, time.Local)
- }
- startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, dateMax)
- if chartInfo.ChartType == 2 {
- chartInfo.StartDate = startDate
- chartInfo.EndDate = endDate
- }
- // 图表额外数据参数
- extraConfigStr := chartInfo.ExtraConfig
- // 柱方图的一些配置
- var barConfig data_manage.BarChartInfoReq
- if chartInfo != nil && chartInfo.ChartType == 7 {
- if chartInfo.BarConfig == `` {
- err = fmt.Errorf("柱方图未配置")
- errMsg = "柱方图未配置"
- return
- }
- err = json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
- if err != nil {
- err = fmt.Errorf("柱方图配置异常 json.Unmarshal Err:%s", err.Error())
- errMsg = "柱方图配置异常"
- return
- }
- extraConfigStr = chartInfo.BarConfig
- }
- // 获取表格数据
- excelChartInfoDataShow := new(ExcelChartInfoDataShow)
- excelChartInfoDataShow.DataListMap = dataListMap
- // 获取图表中的指标数据
- edbList, xEdbIdValue, yDataList, dataResp, e, msg := GetChartEdbDataV2(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig, excelChartInfoDataShow)
- if e != nil {
- err = fmt.Errorf("获取图表,指标数据失败,Err:%s", e.Error())
- errMsg = msg
- return
- }
- for _, v := range edbList {
- // 指标别名
- if barConfig.EdbInfoIdList != nil && len(barConfig.EdbInfoIdList) > 0 {
- for _, reqEdb := range barConfig.EdbInfoIdList {
- if v.EdbInfoId == reqEdb.EdbInfoId {
- v.EdbAliasName = reqEdb.Name
- }
- }
- }
- }
- // 图表的指标来源
- sourceNameList, sourceNameEnList := GetEdbSourceByEdbInfoIdList(edbList)
- chartInfo.ChartSource = strings.Join(sourceNameList, ",")
- chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
- resp.EdbInfoList = edbList
- resp.XEdbIdValue = xEdbIdValue
- resp.YDataList = yDataList
- resp.DataResp = dataResp
- resp.ChartInfo = chartInfo
- return
- }
- // GetBalanceExcelEdbDataMapList 获取指标最后的基础数据
- func GetBalanceExcelEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, seasonExtraConfig string, dataListMap map[int][]*models.EdbDataList) (edbDataListMap map[int][]*models.EdbDataList, edbList []*models.ChartEdbInfoMapping, err error) {
- // 指标对应的所有数据
- edbDataListMap = make(map[int][]*models.EdbDataList)
- for _, v := range mappingList {
- //fmt.Println("v:", v.EdbInfoId)
- item := new(models.ChartEdbInfoMapping)
- item.EdbInfoId = v.EdbInfoId
- item.SourceName = v.SourceName
- item.Source = v.Source
- item.EdbCode = v.EdbCode
- item.EdbName = v.EdbName
- item.EdbNameEn = v.EdbNameEn
- item.Frequency = v.Frequency
- item.EdbType = v.EdbType
- item.FrequencyEn = GetFrequencyEn(v.Frequency)
- if v.Unit != `无` {
- item.Unit = v.Unit
- }
- item.UnitEn = v.UnitEn
- item.StartDate = v.StartDate
- item.EndDate = v.EndDate
- item.ModifyTime = v.ModifyTime
- item.EdbInfoCategoryType = v.EdbInfoCategoryType
- item.PredictChartColor = v.PredictChartColor
- if chartInfoId <= 0 {
- item.IsAxis = 1
- item.LeadValue = 0
- item.LeadUnit = ""
- item.ChartEdbMappingId = 0
- item.ChartInfoId = 0
- item.IsOrder = false
- item.EdbInfoType = 1
- item.ChartStyle = ""
- item.ChartColor = ""
- item.ChartWidth = 1
- item.MaxData = v.MaxValue
- item.MinData = v.MinValue
- } else {
- item.IsAxis = v.IsAxis
- item.EdbInfoType = v.EdbInfoType
- item.LeadValue = v.LeadValue
- item.LeadUnit = v.LeadUnit
- item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
- item.ChartEdbMappingId = v.ChartEdbMappingId
- item.ChartInfoId = v.ChartInfoId
- item.ChartStyle = v.ChartStyle
- item.ChartColor = v.ChartColor
- item.ChartWidth = v.ChartWidth
- item.IsOrder = v.IsOrder
- item.MaxData = v.MaxData
- item.MinData = v.MinData
- }
- item.LatestValue = v.LatestValue
- item.LatestDate = v.LatestDate
- item.UniqueCode = v.UniqueCode
- item.MoveLatestDate = v.LatestDate
- item.EdbAliasName = v.EdbAliasName
- item.IsConvert = v.IsConvert
- item.ConvertType = v.ConvertType
- item.ConvertValue = v.ConvertValue
- item.ConvertUnit = v.ConvertUnit
- item.ConvertEnUnit = v.ConvertEnUnit
- var startDateReal string
- var diffSeconds int64
- if chartType == 2 { //季节性图
- startDateReal = startDate
- } else {
- if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
- var startTimeRealTemp time.Time
- startDateParse, _ := time.Parse(utils.FormatDate, startDate)
- switch v.LeadUnit {
- case "天":
- startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
- case "月":
- startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
- case "季":
- startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
- case "周":
- startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
- case "年":
- startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
- }
- if startTimeRealTemp.Before(startDateParse) {
- startDateReal = startTimeRealTemp.Format(utils.FormatDate)
- diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
- } else {
- startDateReal = startDate
- diffSeconds = 0
- }
- // 预测指标的开始日期也要偏移
- {
- day, tmpErr := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- moveLatestDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, item.MoveLatestDate, time.Local)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- item.MoveLatestDate = moveLatestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
- }
- } else {
- startDateReal = startDate
- }
- }
- //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
- calendarPreYear := 0
- if calendar == "农历" {
- newStartDateReal, e := time.Parse(utils.FormatDate, startDateReal)
- if e != nil {
- err = fmt.Errorf("时间解析 time.Parse(%s, %s) error: %v", utils.FormatDate, startDateReal, e)
- return
- }
- calendarPreYear = newStartDateReal.Year() - 1
- newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
- startDateReal = newStartDateReal.Format(utils.FormatDate)
- }
- dataList := make([]*models.EdbDataList, 0)
- dataListTmp, ok := dataListMap[v.EdbInfoId]
- if ok {
- dataList = dataListTmp
- // 对dataList 根据dataTimestamp 进行排序
- sort.Slice(dataList, func(i, j int) bool {
- return dataList[i].DataTimestamp < dataList[j].DataTimestamp
- })
- } else {
- //err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoId))
- utils.FileLog.Info(fmt.Sprintf("获取失败,指标数据异常 %d", v.EdbInfoId))
- }
- if v.IsConvert == 1 {
- switch v.ConvertType {
- case 1:
- for i, data := range dataList {
- dataList[i].Value = data.Value * v.ConvertValue
- }
- //item.MaxData = item.MaxData * v.ConvertValue
- //item.MinData = item.MinData * v.ConvertValue
- case 2:
- for i, data := range dataList {
- dataList[i].Value = data.Value / v.ConvertValue
- }
- //item.MaxData = item.MaxData / v.ConvertValue
- //item.MinData = item.MinData / v.ConvertValue
- case 3:
- for i, data := range dataList {
- if data.Value <= 0 {
- err = errors.New("数据中含有负数或0,无法对数运算")
- return
- }
- dataList[i].Value = math.Log(data.Value) / math.Log(v.ConvertValue)
- }
- //item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
- //item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
- }
- }
- edbDataListMap[v.EdbInfoId] = dataList
- if diffSeconds != 0 && v.EdbInfoType == 0 {
- dataListLen := len(dataList)
- for i := 0; i < dataListLen; i++ {
- dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
- }
- }
- if chartType == 2 {
- latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
- if tmpErr != nil {
- //item.DataList = dataList
- item.IsNullData = true
- edbList = append(edbList, item)
- continue
- }
- if calendar == "农历" {
- if len(dataList) <= 0 {
- result := new(models.EdbDataResult)
- item.DataList = result
- } else {
- result, tmpErr := models.AddCalculateQuarterV6(dataList)
- if tmpErr != nil {
- err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
- return
- }
- quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
- if tErr != nil {
- err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
- return
- }
- item.DataList = quarterDataList
- }
- } else {
- quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
- if tErr != nil {
- err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
- return
- }
- item.DataList = quarterDataList
- }
- } else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
- //item.DataList = dataList
- } else {
- item.DataList = dataList
- }
- edbList = append(edbList, item)
- }
- return
- }
- func getBalanceDataListStartDateAndValue(dataList []*models.EdbDataList) (startDate, endDate string, startVal, endVal, maxVal, minVal float64) {
- if len(dataList) == 0 {
- return
- }
- startDate = dataList[0].DataTime
- startVal = dataList[0].Value
- maxVal = dataList[0].Value
- minVal = dataList[0].Value
- endDate = dataList[len(dataList)-1].DataTime
- endVal = dataList[len(dataList)-1].Value
- for _, v := range dataList {
- if v.DataTime < startDate {
- startDate = v.DataTime
- startVal = v.Value
- }
- if v.DataTime > endDate {
- endDate = v.DataTime
- endVal = v.Value
- }
- if v.Value > maxVal {
- maxVal = v.Value
- }
- if v.Value < minVal {
- minVal = v.Value
- }
- }
- return
- }
- func TransferChartEdbToEdbMappingFormat(chartInfoId, chartType int, mappingListTmp []*excel.ExcelChartEdb, dataListMap map[int][]*models.EdbDataList) (mappingList []*models.ChartEdbInfoMapping, err error) {
- mappingList = make([]*models.ChartEdbInfoMapping, 0)
- //循环组装映射关系
- for _, v := range mappingListTmp {
- dataList := make([]*models.EdbDataList, 0)
- dataListTmp, ok := dataListMap[v.ExcelChartEdbId]
- if ok {
- dataList = dataListTmp
- } else {
- //err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.ExcelChartEdbId))
- utils.FileLog.Info(fmt.Sprintf("获取失败,指标数据异常 %d", v.ExcelChartEdbId))
- }
- startDateStr, endDateStr, _, endVal, maxValue, minValue := getBalanceDataListStartDateAndValue(dataList)
- mapping := &models.ChartEdbInfoMapping{
- EdbInfoId: v.ExcelChartEdbId,
- SourceName: "平衡表",
- Source: 0,
- SubSource: 0,
- EdbCode: v.EdbCode,
- EdbName: v.EdbName,
- EdbAliasName: v.EdbName,
- EdbNameEn: v.EdbNameEn,
- EdbAliasNameEn: "",
- EdbType: 0,
- Frequency: "",
- FrequencyEn: "",
- Unit: v.Unit,
- UnitEn: v.UnitEn,
- StartDate: startDateStr,
- EndDate: endDateStr,
- ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
- ChartEdbMappingId: v.ExcelChartEdbId,
- ChartInfoId: chartInfoId,
- MaxData: v.MaxData,
- MinData: v.MinData,
- IsOrder: v.IsOrder,
- IsAxis: v.IsAxis,
- EdbInfoType: v.EdbInfoType,
- //EdbInfoCategoryType: 0,
- LeadValue: v.LeadValue,
- LeadUnit: v.LeadUnit,
- LeadUnitEn: "",
- ChartStyle: "",
- ChartColor: "",
- PredictChartColor: "",
- ChartWidth: v.ChartWidth,
- ChartType: chartType,
- LatestDate: endDateStr,
- LatestValue: endVal,
- MoveLatestDate: "",
- UniqueCode: "",
- MinValue: minValue,
- MaxValue: maxValue,
- DataList: nil,
- IsNullData: false,
- MappingSource: 0,
- IsConvert: 0,
- ConvertType: 0,
- ConvertValue: 0,
- ConvertUnit: "",
- ConvertEnUnit: "",
- }
- mappingList = append(mappingList, mapping)
- }
- return
- }
|