package data_manage import ( "encoding/json" "eta/eta_mobile/utils" "fmt" "github.com/beego/beego/v2/client/orm" "sort" "strconv" "strings" "time" "github.com/nosixtools/solarlunar" ) func GetEdbDataQuarterCount(edbInfoId int) (count int, err error) { o := orm.NewOrmUsingDB("data") hsql := `SELECT COUNT(1) AS count FROM edb_data_quarter WHERE edb_info_id=? ` err = o.Raw(hsql, edbInfoId).QueryRow(&count) return } // 指标季度数据计算(公历转农历) func AddCalculateQuarterV2(edbInfoId, source int, edbCode string) (err error) { o := orm.NewOrmUsingDB("data") to, err := o.Begin() if err != nil { return } defer func() { if err != nil { fmt.Println("Err:", err) _ = to.Rollback() } else { _ = to.Commit() } }() edbInfoIdStr := strconv.Itoa(edbInfoId) fmt.Println(edbInfoIdStr) //计算数据 var condition string var pars []interface{} condition += " AND edb_info_id=? " pars = append(pars, edbInfoId) dataList, err := GetEdbDataListAll(condition, pars, source, 0) if err != nil { return err } var yearArr []int yearMap := make(map[int]int) dataMap := make(map[string]*EdbInfoSearchData) for _, v := range dataList { //日其中获取年 itemDate, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { return err } year := itemDate.Year() if _, ok := yearMap[year]; !ok { yearArr = append(yearArr, year) yearMap[year] = year } dataMap[v.DataTime] = v } sort.Sort(sort.Reverse(sort.IntSlice(yearArr))) addSql := ` INSERT INTO edb_data_quarter(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values ` var isAdd bool //yearLen := len(yearArr) fmt.Println(yearArr) for _, yv := range yearArr { fmt.Println(yv) } fmt.Println("isAdd", isAdd) if isAdd { addSql = strings.TrimRight(addSql, ",") utils.FileLog.Info(addSql) _, err = to.Raw(addSql).Exec() fmt.Println("err:", err) if err != nil { return err } } return } // 指标季度数据计算(公历转农历) func AddCalculateQuarterV3(edbInfoId, source int, edbCode string, list []*EdbDataList) (err error) { var errMsg string defer func() { if errMsg != "" { fmt.Println("errMsg:", errMsg) } }() lunarDate := "2017-01-01" //农历 fmt.Println(solarlunar.LunarToSolar(lunarDate, false)) dataList, err := GetHzTestEdbdata() var yearArr []int yearMap := make(map[int]int) var cureentDate time.Time for k, v := range dataList { if k == 0 { cureentDate = v.Dt } year := v.Dt.Year() if _, ok := yearMap[year]; !ok { yearArr = append(yearArr, year) } yearMap[year] = year } //排序 fmt.Println(yearArr) thisYear := cureentDate.Year() thisMonth := int(cureentDate.Month()) sort.Ints(yearArr) fmt.Println("thisYear:", thisYear) result := new(HzTestEdbdataResult) for ky, vy := range yearArr { if thisMonth < 11 { currentYearCjnl := strconv.Itoa(thisYear) + "-01-01" //当前年份春节农历 currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历 currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return err } fmt.Println(ky, vy) preYear := vy preYearCjnl := strconv.Itoa(preYear) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return err } day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) fmt.Println("day:", day) items := new(HzTestEdbdataItems) dataLen := len(dataList) for i := dataLen - 1; i >= 0; i-- { v := dataList[i] newDate := v.Dt.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(thisYear) + "-11" + "-30" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) { item := new(HzTestEdbdata) item.TtradeCode = v.TtradeCode item.Dt = newDate item.Close = v.Close timestamp := item.Dt.UnixNano() / 1e6 item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } result.List = append(result.List, items) } else { fmt.Println(ky, vy) nextYear := thisYear + 1 nextYearCjnl := strconv.Itoa(nextYear) + "-01-01" //当前年份春节农历 nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历 nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return err } preYear := vy preYearCjnl := strconv.Itoa(preYear) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return err } day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) fmt.Println("day:", day) items := new(HzTestEdbdataItems) dataLen := len(dataList) for i := dataLen - 1; i >= 0; i-- { v := dataList[i] newDate := v.Dt.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) { item := new(HzTestEdbdata) item.TtradeCode = v.TtradeCode item.Dt = newDate item.Close = v.Close timestamp := item.Dt.UnixNano() / 1e6 item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } result.List = append(result.List, items) } } resultJson, err := json.Marshal(result) utils.FileLog.Info(string(resultJson)) return } // 指标季度数据计算(公历转农历) func AddCalculateQuarterV4(dataList []*EdbDataList) (result *EdbDataResult, err error) { var errMsg string defer func() { if errMsg != "" { fmt.Println("errMsg:", errMsg) } }() endDate := dataList[len(dataList)-1].DataTime endDateForm, err := time.Parse(utils.FormatDate, endDate) if err != nil { return result, err } thisMonth := int(endDateForm.Month()) result = new(EdbDataResult) var yearArr []int yearMap := make(map[int]int) var cureentDate time.Time if thisMonth < 11 { for k, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } if k == len(dataList)-1 { cureentDate = dateTime } year := dateTime.Year() if _, ok := yearMap[year]; !ok { yearArr = append(yearArr, year) } yearMap[year] = year } } else { for k, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } if k == len(dataList)-1 { cureentDate = dateTime } year := dateTime.Year() + 1 if _, ok := yearMap[year]; !ok { yearArr = append(yearArr, year) } yearMap[year] = year } } //排序 fmt.Println("yearArr:", yearArr) thisYear := cureentDate.Year() //thisMonth := int(cureentDate.Month()) fmt.Println("thisMonth:", thisMonth) for ky, vy := range yearArr { fmt.Println("line 432:", ky, vy, thisYear, thisMonth) if thisMonth < 11 { currentYearCjnl := strconv.Itoa(thisYear) + "-01-01" //当前年份春节农历 currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历 currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return result, err } preYear := vy preYearCjnl := strconv.Itoa(preYear) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return result, err } day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) items := new(EdbDataItems) items.BetweenDay = int(day) //公历日期换算成农历,需要减除的天数 items.Year = preYear for _, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } newDate := dateTime.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(thisYear) + "-11" + "-30" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) || newDate == selectDate { timestamp := newDate.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = newDate.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } result.List = append(result.List, items) } else { nextYear := thisYear + 1 nextYearCjnl := strconv.Itoa(nextYear) + "-01-01" //当前年份春节农历 nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历 nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return result, err } preYear := vy preYearCjnl := strconv.Itoa(preYear) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return result, err } day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) fmt.Println("day:", day, nextYearCjglDate, preYearCjglDate) items := new(EdbDataItems) items.BetweenDay = int(day) //公历日期换算成农历,需要减除的天数 items.Year = preYear - 1 fmt.Println("preYear:", preYear, "ky:", ky, "yearArrLen:", len(yearArr)) if ky+1 < len(yearArr) { for _, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } newDate := dateTime.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) || newDate == selectDate { timestamp := newDate.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = newDate.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } result.List = append(result.List, items) } else { for _, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } timestamp := dateTime.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = dateTime.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } result.List = append(result.List, items) } } } return } // AddCalculateQuarterV4ByUniqueCode 指标季度数据计算(公历转农历) func AddCalculateQuarterV4ByUniqueCode(dataList []*EdbDataListByUniqueCode) (result *EdbDataResult, err error) { var errMsg string defer func() { if errMsg != "" { fmt.Println("errMsg:", errMsg) } }() endDate := dataList[len(dataList)-1].DataTime endDateForm, err := time.Parse(utils.FormatDate, endDate) if err != nil { return result, err } thisMonth := int(endDateForm.Month()) result = new(EdbDataResult) var yearArr []int yearMap := make(map[int]int) var cureentDate time.Time if thisMonth < 11 { for k, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } if k == len(dataList)-1 { cureentDate = dateTime } year := dateTime.Year() if _, ok := yearMap[year]; !ok { yearArr = append(yearArr, year) } yearMap[year] = year } } else { for k, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } if k == len(dataList)-1 { cureentDate = dateTime } year := dateTime.Year() + 1 if _, ok := yearMap[year]; !ok { yearArr = append(yearArr, year) } yearMap[year] = year } } //排序 fmt.Println("yearArr:", yearArr) thisYear := cureentDate.Year() //thisMonth := int(cureentDate.Month()) fmt.Println("thisMonth:", thisMonth) for ky, vy := range yearArr { fmt.Println("line 432:", ky, vy, thisYear, thisMonth) if thisMonth < 11 { currentYearCjnl := strconv.Itoa(thisYear) + "-01-01" //当前年份春节农历 currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历 currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return result, err } preYear := vy preYearCjnl := strconv.Itoa(preYear) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return result, err } day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) items := new(EdbDataItems) items.Year = preYear for _, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } newDate := dateTime.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(thisYear) + "-11" + "-30" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) || newDate == selectDate { timestamp := newDate.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = newDate.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } result.List = append(result.List, items) } else { nextYear := thisYear + 1 nextYearCjnl := strconv.Itoa(nextYear) + "-01-01" //当前年份春节农历 nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历 nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return result, err } preYear := vy preYearCjnl := strconv.Itoa(preYear) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return result, err } day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) fmt.Println("day:", day, nextYearCjglDate, preYearCjglDate) items := new(EdbDataItems) items.Year = preYear - 1 fmt.Println("preYear:", preYear, "ky:", ky, "yearArrLen:", len(yearArr)) if ky+1 < len(yearArr) { for _, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } newDate := dateTime.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) || newDate == selectDate { timestamp := newDate.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = newDate.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } result.List = append(result.List, items) } else { for _, v := range dataList { dateTime, err := time.Parse(utils.FormatDate, v.DataTime) if err != nil { errMsg = "time.Parse Err:" + err.Error() + ";DataTime:" + v.DataTime return result, err } timestamp := dateTime.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = dateTime.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } result.List = append(result.List, items) } } } return } type HzTestEdbdataResult struct { List []*HzTestEdbdataItems } type HzTestEdbdataItems struct { Items []*HzTestEdbdata } type HzTestEdbdata struct { TtradeCode string `orm:"column(TRADE_CODE)"` Dt time.Time `orm:"column(DT)"` Close float64 `orm:"column(CLOSE)"` ModifyTime time.Time `orm:"column(modify_time)"` DataTimestamp int64 } func GetHzTestEdbdata() (list []*HzTestEdbdata, err error) { o := orm.NewOrm() sql := ` SELECT * FROM hz_test_edbdata WHERE TRADE_CODE=? ORDER BY DT DESC ` _, err = o.Raw(sql, "ST_0000577845").QueryRows(&list) return } type EdbDataItems struct { Items []*EdbDataList Year int BetweenDay int `json:"-" description:"公历与农历之间相差的天数"` CuttingDataTimestamp int64 `description:"切割的时间戳"` } type EdbDataResult struct { List []*EdbDataItems } func AddCalculateQuarterV5(dataList []*EdbDataList) (result *EdbDataResult, err error) { var errMsg string defer func() { if errMsg != "" { fmt.Println("errMsg:", errMsg) } }() result = new(EdbDataResult) thisYear := time.Now().Year() endDate := dataList[len(dataList)-1].DataTime endDateForm, err := time.Parse(utils.FormatDate, endDate) if err != nil { return result, err } thisMonth := int(endDateForm.Month()) fmt.Println(thisMonth) for i := 4; i > 0; i-- { if thisMonth < 11 { nextYear := thisYear nextYearCjnl := strconv.Itoa(nextYear) + "-01-01" //当前年份春节农历 nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历 nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return result, err } preYearCjnl := strconv.Itoa(nextYear-i) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return result, err } day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) items := new(EdbDataItems) for _, v := range dataList { dataDate := v.DataTime dataDateForm, err := time.Parse(utils.FormatDate, dataDate) if err != nil { return result, err } newDate := dataDateForm.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(nextYear) + "-11" + "-30" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) { timestamp := newDate.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = newDate.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } fmt.Println(nextYear, "年春节阳历", nextYearCjgl) fmt.Println(i, "年前春节", preYearCjnl) fmt.Println(i, "年前春节阳历", preYearCjgl) fmt.Println("与", nextYear, "年春节相差天数", day, "____________") result.List = append(result.List, items) } else { nextYear := thisYear + 1 nextYearCjnl := strconv.Itoa(nextYear) + "-01-01" //当前年份春节农历 nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历 nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl) if err != nil { errMsg = "生成当前春节失败,Err:" + err.Error() return result, err } preYearCjnl := strconv.Itoa(nextYear-i) + "-01-01" //之前年份春节农历 preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历 preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl) if err != nil { errMsg = "生成历史年份春节失败,Err:" + err.Error() return result, err } day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24) items := new(EdbDataItems) for _, v := range dataList { dataDate := v.DataTime dataDateForm, err := time.Parse(utils.FormatDate, dataDate) if err != nil { return result, err } newDate := dataDateForm.AddDate(0, 0, int(day)) selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31" selectDate, _ := time.Parse(utils.FormatDate, selectDateStr) if newDate.Before(selectDate) { timestamp := newDate.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = newDate.Format(utils.FormatDate) item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } } fmt.Println(nextYear, "年春节阳历", nextYearCjgl) fmt.Println(i, "年前春节", preYearCjnl) fmt.Println(i, "年前春节阳历", preYearCjgl) fmt.Println("与", nextYear, "年春节相差天数", day, "____________") result.List = append(result.List, items) } } //合并第五组数据 items := new(EdbDataItems) for _, v := range dataList { dataDate := v.DataTime dataDateForm, err := time.Parse(utils.FormatDate, dataDate) if err != nil { return result, err } timestamp := dataDateForm.UnixNano() / 1e6 item := new(EdbDataList) item.DataTime = v.DataTime item.EdbInfoId = v.EdbInfoId item.Value = v.Value item.EdbDataId = v.EdbDataId item.DataTimestamp = timestamp items.Items = append(items.Items, item) } result.List = append(result.List, items) return }