|
@@ -1,6 +1,7 @@
|
|
|
package models
|
|
|
|
|
|
import (
|
|
|
+ "errors"
|
|
|
"fmt"
|
|
|
"github.com/beego/beego/v2/client/orm"
|
|
|
"github.com/shopspring/decimal"
|
|
@@ -12,7 +13,6 @@ import (
|
|
|
|
|
|
// AddCalculateTbz 同比值
|
|
|
func AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
|
|
|
- fmt.Println("AddCalculateTbz")
|
|
|
o := orm.NewOrm()
|
|
|
to, err := o.Begin()
|
|
|
if err != nil {
|
|
@@ -20,6 +20,7 @@ func AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
|
|
|
}
|
|
|
defer func() {
|
|
|
if err != nil {
|
|
|
+ fmt.Println("AddCalculateTbz,Err:" + err.Error())
|
|
|
_ = to.Rollback()
|
|
|
} else {
|
|
|
_ = to.Commit()
|
|
@@ -225,11 +226,511 @@ func AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// EditCalculateTbz 同比值
|
|
|
+func EditCalculateTbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
|
|
|
+ edbInfoId = req.EdbInfoId
|
|
|
+ o := orm.NewOrm()
|
|
|
+ to, err := o.Begin()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("EditCalculateTbz,Err:" + err.Error())
|
|
|
+ _ = to.Rollback()
|
|
|
+ } else {
|
|
|
+ _ = to.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ //修改指标信息
|
|
|
+ sql := ` UPDATE edb_info
|
|
|
+ SET
|
|
|
+ edb_name =?,
|
|
|
+ edb_name_source=?,
|
|
|
+ frequency = ?,
|
|
|
+ unit = ?,
|
|
|
+ classify_id = ?,
|
|
|
+ modify_time = NOW()
|
|
|
+ WHERE edb_info_id = ? `
|
|
|
+ _, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var existCondition string
|
|
|
+ var existPars []interface{}
|
|
|
+ existCondition += " AND edb_info_id=? "
|
|
|
+ existPars = append(existPars, edbInfoId)
|
|
|
+
|
|
|
+ existCondition += " AND from_edb_info_id=? "
|
|
|
+ existPars = append(existPars, req.FromEdbInfoId)
|
|
|
+
|
|
|
+ //判断计算指标是否被更换
|
|
|
+ count, err := GetEdbInfoCalculateCountByCondition(existCondition, existPars)
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("判断指标是否改变失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if count <= 0 {
|
|
|
+ //删除指标关联计算指标
|
|
|
+ //sql := ` DELETE FROM edb_info_calculate_tbz WHERE edb_info_id = ? `
|
|
|
+ //_, err = o.Raw(sql, edbInfoId).Exec()
|
|
|
+ //if err != nil {
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //calculateItem := new(EdbInfoCalculateTbz)
|
|
|
+ //calculateItem.CreateTime = time.Now()
|
|
|
+ //calculateItem.ModifyTime = time.Now()
|
|
|
+ //calculateItem.Sort = 1
|
|
|
+ //calculateItem.EdbCode = edbCode
|
|
|
+ //calculateItem.EdbInfoId = edbInfoId
|
|
|
+ //calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
|
|
|
+ //calculateItem.FromEdbCode = fromEdbInfo.EdbCode
|
|
|
+ //calculateItem.FromEdbName = fromEdbInfo.EdbName
|
|
|
+ //calculateItem.FromSource = fromEdbInfo.Source
|
|
|
+ //calculateItem.FromSourceName = fromEdbInfo.SourceName
|
|
|
+ //
|
|
|
+ //_, err = o.Insert(calculateItem)
|
|
|
+ //if err != nil {
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+
|
|
|
+ //删除,计算指标关联的,基础指标的关联关系
|
|
|
+ sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
|
|
|
+ _, err = o.Raw(sql, edbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return edbInfoId, err
|
|
|
+ }
|
|
|
+ //清空原有数据
|
|
|
+ sql = ` DELETE FROM edb_data_calculate_tbz WHERE edb_info_id = ? `
|
|
|
+ _, err = o.Raw(sql, edbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return edbInfoId, err
|
|
|
+ }
|
|
|
+ //关联关系
|
|
|
+ {
|
|
|
+ calculateMappingItem := new(EdbInfoCalculateMapping)
|
|
|
+ calculateMappingItem.CreateTime = time.Now()
|
|
|
+ calculateMappingItem.ModifyTime = time.Now()
|
|
|
+ calculateMappingItem.Sort = 1
|
|
|
+ calculateMappingItem.EdbCode = edbCode
|
|
|
+ calculateMappingItem.EdbInfoId = edbInfoId
|
|
|
+ calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
|
|
|
+ calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
|
|
|
+ calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
|
|
|
+ calculateMappingItem.FromSource = fromEdbInfo.Source
|
|
|
+ calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
|
|
|
+ calculateMappingItem.FromTag = ""
|
|
|
+ calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_TBZ
|
|
|
+ calculateMappingItem.SourceName = "同比值"
|
|
|
+ _, err = o.Insert(calculateMappingItem)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, req.FromEdbInfoId)
|
|
|
+ fmt.Println("EdbInfoId:", req.FromEdbInfoId)
|
|
|
+ dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return edbInfoId, err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ for _, av := range dateArr {
|
|
|
+ currentItem := dataMap[av]
|
|
|
+ if currentItem != nil {
|
|
|
+ //当前日期
|
|
|
+ currentDate, err := time.Parse(utils.FormatDate, av)
|
|
|
+ if err != nil {
|
|
|
+ return edbInfoId, err
|
|
|
+ }
|
|
|
+ //上一年的日期
|
|
|
+ preDate := currentDate.AddDate(-1, 0, 0)
|
|
|
+ preDateStr := preDate.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
|
|
|
+ //dataTime, _ := time.Parse(utils.FormatDate, date)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
|
|
|
+ continue
|
|
|
+ } else {
|
|
|
+ if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
|
|
|
+ nextDateDay := preDate.AddDate(0, 1, 0)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ preDateDay := preDate.AddDate(0, -1, 0)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ for i := 0; i <= 6; i++ {
|
|
|
+ if i >= 1 {
|
|
|
+ nextDateDay = nextDateDay.AddDate(0, 0, i)
|
|
|
+ nextDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ if i >= 1 {
|
|
|
+ preDateDay = preDate.AddDate(0, 0, -i)
|
|
|
+ preDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, 1)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -1)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ for i := 0; i < 35; i++ {
|
|
|
+ if i >= 1 {
|
|
|
+ nextDateDay = nextDateDay.AddDate(0, 0, i)
|
|
|
+ nextDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ if i >= 1 {
|
|
|
+ preDateDay = preDate.AddDate(0, 0, -i)
|
|
|
+ preDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ _, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return edbInfoId, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RefreshAllCalculateTbz 刷新所有同比值数据
|
|
|
+func RefreshAllCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
|
|
|
+ o := orm.NewOrm()
|
|
|
+ to, err := o.Begin()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ fmt.Println("RefreshAllCalculateTbz,Err:" + err.Error())
|
|
|
+ if err != nil {
|
|
|
+ _ = to.Rollback()
|
|
|
+ } else {
|
|
|
+ _ = to.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIdStr := strconv.Itoa(edbInfoId)
|
|
|
+ //计算数据
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND edb_info_id=? "
|
|
|
+ pars = append(pars, fromEdbInfo.EdbInfoId)
|
|
|
+
|
|
|
+ if startDate != "" {
|
|
|
+ condition += " AND data_time>=? "
|
|
|
+ pars = append(pars, startDate)
|
|
|
+ }
|
|
|
+ if endDate != "" {
|
|
|
+ condition += " AND data_time<=? "
|
|
|
+ pars = append(pars, endDate)
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ var dateArr []string
|
|
|
+ dataMap := make(map[string]*EdbInfoSearchData)
|
|
|
+ for _, v := range dataList {
|
|
|
+ dateArr = append(dateArr, v.DataTime)
|
|
|
+ dataMap[v.DataTime] = v
|
|
|
+ }
|
|
|
+ fmt.Println("source:", source)
|
|
|
+ //获取指标所有数据
|
|
|
+ existDataList := make([]*EdbData, 0)
|
|
|
+ dataTableName := GetEdbDataTableName(source)
|
|
|
+ fmt.Println("dataTableName:", dataTableName)
|
|
|
+ sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ for _, v := range existDataList {
|
|
|
+ existDataMap[v.DataTime] = v.Value
|
|
|
+ }
|
|
|
+ fmt.Println("existDataMap:", existDataMap)
|
|
|
+ addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
|
|
|
+ var isAdd bool
|
|
|
+ existAddDataMap := make(map[string]string)
|
|
|
+ for _, av := range dateArr {
|
|
|
+ currentItem := dataMap[av]
|
|
|
+ if currentItem != nil {
|
|
|
+ //当前日期
|
|
|
+ currentDate, err := time.Parse(utils.FormatDate, av)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ //上一年的日期
|
|
|
+ preDate := currentDate.AddDate(-1, 0, 0)
|
|
|
+ preDateStr := preDate.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
|
|
|
+ //dataTime, _ := time.Parse(utils.FormatDate, date)
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ continue
|
|
|
+ } else {
|
|
|
+ if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
|
|
|
+ for i := 0; i <= 35; i++ {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, i)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -i)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
|
|
|
+ if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ nextDateDay := preDate.AddDate(0, 0, 1)
|
|
|
+ nextDateDayStr := nextDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ preDateDay := preDate.AddDate(0, 0, -1)
|
|
|
+ preDateDayStr := preDateDay.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ for i := 0; i < 35; i++ {
|
|
|
+ if i >= 1 {
|
|
|
+ nextDateDay = nextDateDay.AddDate(0, 0, i)
|
|
|
+ nextDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ if i >= 1 {
|
|
|
+ preDateDay = preDate.AddDate(0, 0, -i)
|
|
|
+ preDateDayStr = nextDateDay.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
|
|
|
+ timestamp := currentDate.UnixNano() / 1e6
|
|
|
+ timestampStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ val := TbzDiv(currentItem.Value, findItem.Value)
|
|
|
+
|
|
|
+ if existVal, ok := existDataMap[av]; !ok {
|
|
|
+ if _, existOk := existAddDataMap[av]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
|
|
|
+ isAdd = true
|
|
|
+ }
|
|
|
+ existAddDataMap[av] = av
|
|
|
+ } else {
|
|
|
+ if existVal != val {
|
|
|
+ sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
+ sql = fmt.Sprintf(sql, dataTableName)
|
|
|
+ _, err = o.Raw(sql, val, edbInfoId, av).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if isAdd {
|
|
|
+ addSql = strings.TrimRight(addSql, ",")
|
|
|
+ _, err = o.Raw(addSql).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
func TbzDiv(a, b float64) string {
|
|
|
var valStr string
|
|
|
if b != 0 {
|
|
|
- af := decimal.NewFromFloat(float64(a))
|
|
|
- bf := decimal.NewFromFloat(float64(b))
|
|
|
+ af := decimal.NewFromFloat(a)
|
|
|
+ bf := decimal.NewFromFloat(b)
|
|
|
val, _ := af.Div(bf).Float64()
|
|
|
val = val - 1
|
|
|
valStr = utils.SubFloatToString(val, 4)
|