|
@@ -8,6 +8,7 @@ import (
|
|
|
"eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
"math"
|
|
|
+ "strconv"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
@@ -55,13 +56,13 @@ func ResidualAnalysisPreview(req residual_analysis_model.ResidualAnalysisReq) (r
|
|
|
resp := residual_analysis_model.ResidualAnalysisResp{}
|
|
|
|
|
|
// 图表基础信息
|
|
|
- baseChartInfo := new(residual_analysis_model.ResidualAnalysisChartInfo)
|
|
|
+ /*baseChartInfo := new(residual_analysis_model.ResidualAnalysisChartInfo)
|
|
|
baseChartInfo.Calendar = `公历`
|
|
|
baseChartInfo.Source = utils.CHART_SOURCE_DEFAULT
|
|
|
baseChartInfo.DateType = req.DateType
|
|
|
baseChartInfo.StartDate = startDate
|
|
|
baseChartInfo.EndDate = endDate
|
|
|
- baseChartInfo.ChartType = utils.CHART_TYPE_CURVE
|
|
|
+ baseChartInfo.ChartType = utils.CHART_TYPE_CURVE*/
|
|
|
|
|
|
// 原始图表信息
|
|
|
originalEdbList := make([]residual_analysis_model.ResidualAnalysisChartEdbInfoMapping, 0)
|
|
@@ -70,10 +71,11 @@ func ResidualAnalysisPreview(req residual_analysis_model.ResidualAnalysisReq) (r
|
|
|
if err != nil {
|
|
|
return residual_analysis_model.ResidualAnalysisResp{}, err
|
|
|
}
|
|
|
- baseChartInfo.ChartName = edbInfoMappingA.EdbName + "与" + edbInfoMappingB.EdbName
|
|
|
+
|
|
|
+ originalChartInfo := createChartInfoResp(req, startDate, endDate, edbInfoMappingA.EdbName+"与"+edbInfoMappingB.EdbName)
|
|
|
|
|
|
resp.OriginalChartData = residual_analysis_model.ChartResp{
|
|
|
- ChartInfo: baseChartInfo,
|
|
|
+ ChartInfo: originalChartInfo,
|
|
|
EdbInfoList: originalEdbList,
|
|
|
}
|
|
|
|
|
@@ -91,33 +93,49 @@ func ResidualAnalysisPreview(req residual_analysis_model.ResidualAnalysisReq) (r
|
|
|
if err != nil {
|
|
|
return residual_analysis_model.ResidualAnalysisResp{}, err
|
|
|
}
|
|
|
- baseChartInfo.ChartName = edbInfoMappingA.EdbName + "与" + edbInfoMappingB.EdbName + "映射" + edbInfoMappingA.EdbName
|
|
|
+
|
|
|
+ mappingChartInfo := createChartInfoResp(req, startDate, endDate, edbInfoMappingA.EdbName+"与"+edbInfoMappingB.EdbName+"映射"+edbInfoMappingA.EdbName)
|
|
|
|
|
|
resp.MappingChartData = residual_analysis_model.ChartResp{
|
|
|
- ChartInfo: baseChartInfo,
|
|
|
+ ChartInfo: mappingChartInfo,
|
|
|
EdbInfoList: mappingEdbList,
|
|
|
}
|
|
|
|
|
|
// 残差图表信息
|
|
|
- ResidualEdbList, R2, err := fillResidualChartInfo(edbInfoMappingA, edbInfoMappingB, mappingEdbList)
|
|
|
+ residualEdbList, R2, err := fillResidualChartInfo(edbInfoMappingA, edbInfoMappingB, mappingEdbList)
|
|
|
if err != nil {
|
|
|
return residual_analysis_model.ResidualAnalysisResp{}, err
|
|
|
}
|
|
|
|
|
|
- baseChartInfo.ChartName = edbInfoMappingA.EdbName + "与" + edbInfoMappingA.EdbName + "映射残差/" + edbInfoMappingB.EdbName
|
|
|
+ residualChartInfo := createChartInfoResp(req, startDate, endDate, edbInfoMappingA.EdbName+"与"+edbInfoMappingA.EdbName+"映射残差/"+edbInfoMappingB.EdbName)
|
|
|
|
|
|
- resp.MappingChartData = residual_analysis_model.ChartResp{
|
|
|
- ChartInfo: baseChartInfo,
|
|
|
- EdbInfoList: ResidualEdbList,
|
|
|
- A: a,
|
|
|
- B: b,
|
|
|
- R: r,
|
|
|
- R2: R2,
|
|
|
+ resp.ResidualChartData = residual_analysis_model.ChartResp{
|
|
|
+ ChartInfo: residualChartInfo,
|
|
|
+ EdbInfoList: residualEdbList,
|
|
|
+ }
|
|
|
+
|
|
|
+ if req.ResidualType == 2 {
|
|
|
+ resp.A = a
|
|
|
+ resp.B = b
|
|
|
+ resp.R = r
|
|
|
+ resp.R2 = R2
|
|
|
}
|
|
|
|
|
|
return resp, nil
|
|
|
}
|
|
|
|
|
|
+func createChartInfoResp(req residual_analysis_model.ResidualAnalysisReq, startDate, endDate, chartName string) residual_analysis_model.ResidualAnalysisChartInfo {
|
|
|
+ return residual_analysis_model.ResidualAnalysisChartInfo{
|
|
|
+ Calendar: `公历`,
|
|
|
+ Source: utils.CHART_SOURCE_DEFAULT,
|
|
|
+ DateType: req.DateType,
|
|
|
+ StartDate: startDate,
|
|
|
+ EndDate: endDate,
|
|
|
+ ChartType: utils.CHART_TYPE_CURVE,
|
|
|
+ ChartName: chartName,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func fillResidualChartInfo(edbInfoMappingA *data_manage.ChartEdbInfoMapping, edbInfoMappingB *data_manage.ChartEdbInfoMapping, mappingEdbList []residual_analysis_model.ResidualAnalysisChartEdbInfoMapping) ([]residual_analysis_model.ResidualAnalysisChartEdbInfoMapping, float64, error) {
|
|
|
// 计算公式 映射残差 = 因变量指标 - 映射指标
|
|
|
var edbInfoA, edbInfoB residual_analysis_model.ResidualAnalysisChartEdbInfoMapping
|
|
@@ -268,25 +286,27 @@ func fillMappingChartInfo(req residual_analysis_model.ResidualAnalysisReq, edbIn
|
|
|
for _, indexData := range dataList {
|
|
|
if _, ok := indexADataMap[indexData.DataTime]; ok {
|
|
|
// 计算指标B映射值
|
|
|
- indexData.Value = a*indexData.Value + b
|
|
|
+ indexData.Value = math.Round(a*indexData.Value+b) / 10000
|
|
|
|
|
|
dataBList = append(dataBList, indexData)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- mappingEdbList := originalEdbList
|
|
|
- for _, mapping := range mappingEdbList {
|
|
|
- if mapping.EdbInfoId == req.EdbInfoIdB {
|
|
|
- mapping.EdbInfoId = 0
|
|
|
- mapping.EdbCode = ""
|
|
|
- mapping.EdbName = edbInfoMappingB.EdbName + "映射" + edbInfoMappingA.EdbName
|
|
|
- mapping.DataList = dataBList
|
|
|
+ mappingEdbList := make([]residual_analysis_model.ResidualAnalysisChartEdbInfoMapping, len(originalEdbList))
|
|
|
+ copy(mappingEdbList, originalEdbList)
|
|
|
+
|
|
|
+ for i, mapping := range mappingEdbList {
|
|
|
+ if mapping.EdbInfoId != req.EdbInfoIdA {
|
|
|
+ mappingEdbList[i].EdbInfoId = 0
|
|
|
+ mappingEdbList[i].EdbCode = ""
|
|
|
+ mappingEdbList[i].EdbName = edbInfoMappingB.EdbName + "映射" + edbInfoMappingA.EdbName
|
|
|
+ mappingEdbList[i].DataList = dataBList
|
|
|
}
|
|
|
}
|
|
|
return mappingEdbList, a, b, r, nil
|
|
|
}
|
|
|
|
|
|
-func fillOriginalChart(req residual_analysis_model.ResidualAnalysisReq, mappingList []*data_manage.ChartEdbInfoMapping, startDate string, endDate string, edbInfoMappingA *data_manage.ChartEdbInfoMapping, edbInfoMappingB *data_manage.ChartEdbInfoMapping, OriginalEdbList []residual_analysis_model.ResidualAnalysisChartEdbInfoMapping) ([]residual_analysis_model.ResidualAnalysisChartEdbInfoMapping, error) {
|
|
|
+func fillOriginalChart(req residual_analysis_model.ResidualAnalysisReq, mappingList []*data_manage.ChartEdbInfoMapping, startDate string, endDate string, edbInfoMappingA *data_manage.ChartEdbInfoMapping, edbInfoMappingB *data_manage.ChartEdbInfoMapping, originalEdbList []residual_analysis_model.ResidualAnalysisChartEdbInfoMapping) ([]residual_analysis_model.ResidualAnalysisChartEdbInfoMapping, error) {
|
|
|
for _, v := range mappingList {
|
|
|
var edbInfoMapping residual_analysis_model.ResidualAnalysisChartEdbInfoMapping
|
|
|
edbInfoMapping.EdbInfoType = 1
|
|
@@ -321,11 +341,15 @@ func fillOriginalChart(req residual_analysis_model.ResidualAnalysisReq, mappingL
|
|
|
edbInfoMapping.Frequency = v.Frequency
|
|
|
edbInfoMapping.Source = v.Source
|
|
|
edbInfoMapping.SourceName = v.SourceName
|
|
|
+ edbInfoMapping.MinValue = v.MinData
|
|
|
+ edbInfoMapping.MaxValue = v.MaxData
|
|
|
+ edbInfoMapping.LatestDate = v.LatestDate
|
|
|
+ edbInfoMapping.LatestValue = v.LatestValue
|
|
|
|
|
|
edbInfoMapping.DataList = dataList
|
|
|
- OriginalEdbList = append(OriginalEdbList, edbInfoMapping)
|
|
|
+ originalEdbList = append(originalEdbList, edbInfoMapping)
|
|
|
}
|
|
|
- return OriginalEdbList, nil
|
|
|
+ return originalEdbList, nil
|
|
|
}
|
|
|
|
|
|
func ContrastPreview(indexCode string) (residual_analysis_model.ResidualAnalysisChartEdbInfoMapping, error) {
|
|
@@ -349,6 +373,7 @@ func ContrastPreview(indexCode string) (residual_analysis_model.ResidualAnalysis
|
|
|
|
|
|
var resp residual_analysis_model.ResidualAnalysisChartEdbInfoMapping
|
|
|
resp.EdbInfoId = edbInfo.EdbInfoId
|
|
|
+ resp.EdbCode = edbInfo.EdbCode
|
|
|
resp.SourceName = edbInfo.SourceName
|
|
|
resp.EdbName = edbInfo.EdbName
|
|
|
resp.Unit = edbInfo.Unit
|
|
@@ -368,6 +393,38 @@ func SaveResidualAnalysis(req residual_analysis_model.ResidualAnalysisIndexSaveR
|
|
|
return fmt.Errorf("分类不存在", nil)
|
|
|
}
|
|
|
|
|
|
+ // 获取指标数据最大值 最小值 最后更新时间 最后更新时间对应的值
|
|
|
+ var indexMax, indexMin, indexLatestValue float64
|
|
|
+ var indexLatestDate string
|
|
|
+ latestTime, _ := time.Parse(utils.YearMonthDay, req.DataList[0].DataTime)
|
|
|
+ for _, data := range req.DataList {
|
|
|
+ // 比较最大值
|
|
|
+ if data.Value > indexMax {
|
|
|
+ indexMax = data.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ // 比较最小值
|
|
|
+ if data.Value < indexMin {
|
|
|
+ indexMin = data.Value
|
|
|
+ }
|
|
|
+
|
|
|
+ // 比较最新时间和对应值
|
|
|
+ currentTime, err := time.Parse(utils.YearMonthDay, data.DataTime)
|
|
|
+ if err != nil {
|
|
|
+ // 时间解析失败,跳过此项
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果当前时间更晚
|
|
|
+ if currentTime.After(latestTime) {
|
|
|
+ latestTime = currentTime
|
|
|
+ indexLatestDate = data.DataTime
|
|
|
+ indexLatestValue = data.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var edbInfoId int64
|
|
|
+ var edbCode string
|
|
|
// 更新or新增
|
|
|
if req.EdbCode != "" {
|
|
|
// 查询指标库指标
|
|
@@ -378,7 +435,14 @@ func SaveResidualAnalysis(req residual_analysis_model.ResidualAnalysisIndexSaveR
|
|
|
if edbInfo == nil {
|
|
|
return fmt.Errorf("指标不存在", nil)
|
|
|
}
|
|
|
- // todo 须补充更新指标最大值,最小值,数据最新时间,
|
|
|
+ edbInfoId = int64(edbInfo.EdbInfoId)
|
|
|
+ edbCode = edbInfo.EdbCode
|
|
|
+
|
|
|
+ // 须补充更新指标最大值,最小值,数据最新时间,数据最新值
|
|
|
+ edbInfo.MaxValue = indexMax
|
|
|
+ edbInfo.MinValue = indexMin
|
|
|
+ edbInfo.LatestDate = indexLatestDate
|
|
|
+ edbInfo.LatestValue = indexLatestValue
|
|
|
err = edbInfo.Update([]string{"min_value", "max_value", "latest_date", "latest_value"})
|
|
|
if err != nil {
|
|
|
return err
|
|
@@ -389,30 +453,40 @@ func SaveResidualAnalysis(req residual_analysis_model.ResidualAnalysisIndexSaveR
|
|
|
if err != nil {
|
|
|
return fmt.Errorf("删除指标数据失败", nil)
|
|
|
}
|
|
|
- }
|
|
|
- // 新增指标
|
|
|
- edbCode, err := utils.GenerateEdbCode(1, "")
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ // 新增指标
|
|
|
+ edbCode, err = utils.GenerateEdbCode(1, "")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- _, err = data_manage.AddEdbInfo(&data_manage.EdbInfo{
|
|
|
- EdbCode: edbCode,
|
|
|
- EdbName: req.EdbName,
|
|
|
- EdbNameEn: req.EdbNameEn,
|
|
|
- EdbType: req.EdbType,
|
|
|
- Unit: req.Unit,
|
|
|
- UnitEn: req.UnitEn,
|
|
|
- Frequency: req.Frequency,
|
|
|
- Source: req.Source,
|
|
|
- SourceName: "残差分析",
|
|
|
- })
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
|
|
|
+
|
|
|
+ edbInfoId, err = data_manage.AddEdbInfo(&data_manage.EdbInfo{
|
|
|
+ EdbCode: edbCode,
|
|
|
+ UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + timestamp),
|
|
|
+ EdbName: req.EdbName,
|
|
|
+ EdbNameEn: req.EdbNameEn,
|
|
|
+ ClassifyId: req.ClassifyId,
|
|
|
+ EdbType: req.EdbType,
|
|
|
+ Unit: req.Unit,
|
|
|
+ UnitEn: req.UnitEn,
|
|
|
+ Frequency: req.Frequency,
|
|
|
+ Source: req.Source,
|
|
|
+ SourceName: "残差分析",
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 新增数据
|
|
|
- edbInfoId, err := residual_analysis_model.AddResidualAnalysisData(req.DataList)
|
|
|
+ for i := range req.DataList {
|
|
|
+ req.DataList[i].EdbDataId = 0
|
|
|
+ req.DataList[i].EdbInfoId = int(edbInfoId)
|
|
|
+ req.DataList[i].EdbCode = edbCode
|
|
|
+ }
|
|
|
+ _, err = residual_analysis_model.AddResidualAnalysisData(req.DataList)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -424,8 +498,9 @@ func SaveResidualAnalysis(req residual_analysis_model.ResidualAnalysisIndexSaveR
|
|
|
}
|
|
|
flag := true
|
|
|
for _, mapping := range mappingList {
|
|
|
- if mapping.CalculateResidualAnalysisConfigId == req.ConfigId {
|
|
|
+ if mapping.EdbInfoId == edbInfoId {
|
|
|
flag = false
|
|
|
+ break
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -434,6 +509,8 @@ func SaveResidualAnalysis(req residual_analysis_model.ResidualAnalysisIndexSaveR
|
|
|
CalculateResidualAnalysisConfigId: req.ConfigId,
|
|
|
EdbInfoId: edbInfoId,
|
|
|
ResidualType: req.ResidualType,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
})
|
|
|
if err != nil {
|
|
|
return err
|
|
@@ -550,8 +627,10 @@ func SaveResidualAnalysisConfig(req residual_analysis_model.ResidualAnalysisReq,
|
|
|
}
|
|
|
|
|
|
analysisConfig := residual_analysis_model.CalculateResidualAnalysisConfig{
|
|
|
- Config: string(configJson),
|
|
|
- SysUserId: sysUser.AdminId,
|
|
|
+ Config: string(configJson),
|
|
|
+ SysUserId: sysUser.AdminId,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
}
|
|
|
|
|
|
_, err = residual_analysis_model.SaveResidualAnalysisConfig(analysisConfig)
|