|
@@ -20,7 +20,7 @@ type edbDataResidualAnalysis struct {
|
|
|
Value float64 `gorm:"column:value;type:double;comment:数据值;default:NULL;"` // 数据值
|
|
|
CreateTime time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;default:NULL;" ` // 创建时间
|
|
|
ModifyTime time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;default:NULL;"` // 修改时间
|
|
|
- DataTimestamp int64 `gorm:"column:data_timestamp;type:bigint(20);comment:数据日期时间戳;default:0;"` // 数据日期时间戳
|
|
|
+ DataTimeStamp int64 `gorm:"column:data_timestamp;type:bigint(20);comment:数据日期时间戳;default:0;"` // 数据日期时间戳
|
|
|
}
|
|
|
|
|
|
// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
|
|
@@ -64,19 +64,31 @@ func RefreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
|
|
|
_ = to.Commit()
|
|
|
}
|
|
|
}()*/
|
|
|
+ //只清空残差分析数据自身指标的数据
|
|
|
configMapping, err := GetConfigMappingListByConditionNotBase(edbInfoId)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- var edbInfoIdList []int64
|
|
|
- for _, v := range configMapping {
|
|
|
- edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
|
|
|
- }
|
|
|
+ //if err != nil {
|
|
|
+ // return err
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //var edbInfoIdList []int64
|
|
|
+ //for _, v := range configMapping {
|
|
|
+ // edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
|
|
|
+ //}
|
|
|
|
|
|
//清空原有数据
|
|
|
- sql := ` DELETE FROM edb_data_residual_analysis WHERE edb_info_id in (` + utils.GetOrmInReplace(len(edbInfoIdList)) + `) `
|
|
|
- err = to.Exec(sql, edbInfoIdList).Error
|
|
|
+ //sql := ` DELETE FROM edb_data_residual_analysis WHERE edb_info_id in (` + utils.GetOrmInReplace(len(edbInfoIdList)) + `) `
|
|
|
+ //var params []interface{}
|
|
|
+ //for _, i := range edbInfoIdList {
|
|
|
+ // params = append(params, i)
|
|
|
+ //}
|
|
|
+ var params []interface{}
|
|
|
+ sql := ` DELETE FROM edb_data_residual_analysis WHERE edb_info_id = ?`
|
|
|
+ params = append(params, edbInfoId)
|
|
|
+ //var params []interface{}
|
|
|
+ //for _, i := range edbInfoIdList {
|
|
|
+ // params = append(params, i)
|
|
|
+ //}
|
|
|
+ err = to.Exec(sql, params...).Error
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
@@ -90,13 +102,23 @@ func RefreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
|
|
|
// refreshAllCalculateResidualAnalysis 刷新所有残差分析
|
|
|
func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaInt, moveType int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate, moveFrequency string, configMapping []CalculateResidualAnalysisConfigMapping) (err error) {
|
|
|
fmt.Println("refreshAllCalculateResidualAnalysis startDate:", startDate)
|
|
|
-
|
|
|
+ configMap := make(map[int64]CalculateResidualAnalysisConfigMapping, len(configMapping))
|
|
|
+ for _, v := range configMapping {
|
|
|
+ configMap[v.EdbInfoId] = v
|
|
|
+ }
|
|
|
calculateMappingList, err := GetCalculateMappingListByEdbInfoId(edbInfoId)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- edbInfoIdA := calculateMappingList[0].FromEdbInfoId
|
|
|
- edbInfoIdB := calculateMappingList[1].FromEdbInfoId
|
|
|
+ //这里顺序和之前的不一致导致的计算错误
|
|
|
+ var edbInfoIdA, edbInfoIdB int
|
|
|
+ if configMap[int64(calculateMappingList[0].FromEdbInfoId)].IndexType == 3 {
|
|
|
+ edbInfoIdA = calculateMappingList[0].FromEdbInfoId
|
|
|
+ edbInfoIdB = calculateMappingList[1].FromEdbInfoId
|
|
|
+ } else {
|
|
|
+ edbInfoIdA = calculateMappingList[1].FromEdbInfoId
|
|
|
+ edbInfoIdB = calculateMappingList[0].FromEdbInfoId
|
|
|
+ }
|
|
|
|
|
|
mappingList, err := GetEdbInfoListByIds([]int{edbInfoIdA, edbInfoIdB})
|
|
|
if err != nil {
|
|
@@ -134,10 +156,10 @@ func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
|
|
|
|
|
|
// 时间处理
|
|
|
switch config.DateType {
|
|
|
- case 0:
|
|
|
+ case -1:
|
|
|
startDate = config.StartDate
|
|
|
endDate = config.EndDate
|
|
|
- case 1:
|
|
|
+ case 0:
|
|
|
startDate = config.StartDate
|
|
|
endDate = ""
|
|
|
default:
|
|
@@ -168,54 +190,54 @@ func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
|
|
|
residualEdbList, _, err := fillResidualChartInfo(config, fromEdbInfo, edbInfoMappingA, edbInfoMappingB, mappingEdbList)
|
|
|
|
|
|
// 映射指标 与 残差指标 同步刷新
|
|
|
- for _, mapping := range configMapping {
|
|
|
- var edbDataResidualAnalysisList []edbDataResidualAnalysis
|
|
|
- if mapping.IndexType == 1 {
|
|
|
- edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
+ //for _, mapping := range configMapping {
|
|
|
+ mapping := configMap[int64(edbInfoId)]
|
|
|
+ var edbDataResidualAnalysisList []edbDataResidualAnalysis
|
|
|
+ if mapping.IndexType == 1 {
|
|
|
+ edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- for _, edbData := range mappingEdbList[1].DataList {
|
|
|
- value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
- edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
- EdbInfoId: int(mapping.EdbInfoId),
|
|
|
- EdbCode: edbInfo.EdbCode,
|
|
|
- DataTime: edbData.DataTime,
|
|
|
- Value: value,
|
|
|
- CreateTime: time.Now(),
|
|
|
- ModifyTime: time.Now(),
|
|
|
- DataTimestamp: edbData.DataTimestamp,
|
|
|
- })
|
|
|
- }
|
|
|
+ for _, edbData := range mappingEdbList[0].DataList {
|
|
|
+ value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
+ edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
+ EdbInfoId: int(mapping.EdbInfoId),
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: edbData.DataTime,
|
|
|
+ Value: value,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimeStamp: edbData.DataTimestamp,
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
- err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- } else if mapping.IndexType == 2 {
|
|
|
- edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
+ err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ } else if mapping.IndexType == 2 {
|
|
|
+ edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- for _, edbData := range residualEdbList[1].DataList {
|
|
|
- value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
- edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
- EdbInfoId: int(mapping.EdbInfoId),
|
|
|
- EdbCode: edbInfo.EdbCode,
|
|
|
- DataTime: edbData.DataTime,
|
|
|
- Value: value,
|
|
|
- CreateTime: time.Now(),
|
|
|
- ModifyTime: time.Now(),
|
|
|
- DataTimestamp: edbData.DataTimestamp,
|
|
|
- })
|
|
|
- }
|
|
|
+ for _, edbData := range residualEdbList[0].DataList {
|
|
|
+ value, _ := strconv.ParseFloat(edbData.Value, 64)
|
|
|
+ edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
|
|
|
+ EdbInfoId: int(mapping.EdbInfoId),
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ DataTime: edbData.DataTime,
|
|
|
+ Value: value,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimeStamp: edbData.DataTimestamp,
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
- err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
+ err = AddResidualAnalysisData(edbDataResidualAnalysisList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -325,10 +347,20 @@ func fillResidualChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoM
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ //reverse(mappingEdb)
|
|
|
return mappingEdb, R2, nil
|
|
|
}
|
|
|
|
|
|
+// 双指针法
|
|
|
+func reverse(slice []EdbInfoList) {
|
|
|
+ left, right := 0, len(slice)-1
|
|
|
+ for left < right {
|
|
|
+ // 交换元素
|
|
|
+ slice[left], slice[right] = slice[right], slice[left]
|
|
|
+ left++
|
|
|
+ right--
|
|
|
+ }
|
|
|
+}
|
|
|
func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMappingA *EdbInfoList, edbInfoMappingB *EdbInfoList, originalEdbList []EdbInfoList, indexADataMap map[string]*EdbData, startDate string, endDate string, fullADataList []*EdbDataList, fullBDataList []*EdbDataList) ([]EdbInfoList, float64, float64, float64, error) {
|
|
|
// 计算公式:Y=aX+b,Y为映射后的指标,X为自变量指标
|
|
|
// 正序:a=(L2-L1)/(R2-R1) b=L2-R2*a
|
|
@@ -587,7 +619,7 @@ func fillOriginalChart(config ResidualAnalysisConfig, req *EdbInfo, mappingList
|
|
|
|
|
|
if v.EdbInfoId == edbInfoMappingB.EdbInfoId {
|
|
|
// 领先指标 dataList进行数据处理
|
|
|
- if config.IndexType == 1 {
|
|
|
+ if config.IndexType == 2 {
|
|
|
if config.LeadValue < 0 {
|
|
|
return nil, nil, nil, fmt.Errorf("领先值不能小于0")
|
|
|
} else if config.LeadValue > 0 {
|