package data_manage import ( "errors" "fmt" "github.com/beego/beego/v2/client/orm" "hongze/hz_crm_api/utils" "time" ) // EdbDataInsertConfig 指标数据插入配置表 type EdbDataInsertConfig struct { EdbInfoId int `orm:"column(edb_info_id);pk" description:"指标id"` Date time.Time `description:"插入的日期"` Value string `description:"插入的值"` RealDate time.Time `description:"实际数据的值日期"` ModifyTime time.Time `description:"数据更新时间"` CreateTime time.Time `description:"数据插入的时间"` } // GetEdbDataInsertConfigByEdbId 根据指标id 获取数据插入配置详情 func GetEdbDataInsertConfigByEdbId(edbInfoId int) (item *EdbDataInsertConfig, err error) { o := orm.NewOrmUsingDB("data") sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id=? ` err = o.Raw(sql, edbInfoId).QueryRow(&item) return } // CreateEdbDataInsertConfigAndData 创建数据插入配置规则,及插入数据 func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value float64) (err error, errMsg string, isSendEmail bool) { isSendEmail = true tableName := GetEdbDataTableName(edbInfo.Source) if tableName == `` { err = errors.New("找不到该指标的数据表") return } dateStr := date.Format(utils.FormatDate) timestamp := date.UnixNano() / 1e6 timeStr := fmt.Sprintf("%d", timestamp) saveValue := utils.SubFloatToString(value, 30) to, err := orm.NewOrmUsingDB("data").Begin() if err != nil { return } defer func() { if err != nil { _ = to.Rollback() } else { _ = to.Commit() } }() var oldConfigDate time.Time //之前配置的日期 // 添加/变更配置 { var item *EdbDataInsertConfig sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id=? ` err = to.Raw(sql, edbInfo.EdbInfoId).QueryRow(&item) if err != nil && err.Error() != utils.ErrNoRow() { return } err = nil // 如果是没有配置,那么就需要添加配置 if item == nil { var currLatestDate time.Time currLatestDateStr := edbInfo.LatestDate // 实际日期 if currLatestDateStr != `` && currLatestDateStr != `0000-00-00` { currLatestDate, _ = time.ParseInLocation(utils.FormatDate, currLatestDateStr, time.Local) } if !currLatestDate.IsZero() && (currLatestDate.After(date) || currLatestDate.Equal(date)) { errMsg = `选择日期不能早于/等于数据最新日期` err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr) isSendEmail = false return } realDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local) item = &EdbDataInsertConfig{ EdbInfoId: edbInfo.EdbInfoId, Date: date, Value: saveValue, RealDate: realDate, ModifyTime: time.Now(), CreateTime: time.Now(), } _, err = to.Insert(item) } else { if date.Equal(item.RealDate) || date.Before(item.RealDate) { errMsg = `选择日期不能早于/等于数据最新日期` err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr) isSendEmail = false return } oldConfigDate = item.Date // 之前配置的日期 item.Date = date item.Value = saveValue item.ModifyTime = time.Now() _, err = to.Update(item, "Date", "Value", "ModifyTime") } if err != nil { return } } // 更改数据 { var edbDateData *EdbDataList if !oldConfigDate.IsZero() { sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? AND data_time = ?` sql = fmt.Sprintf(sql, tableName) err = to.Raw(sql, edbInfo.EdbInfoId, oldConfigDate.Format(utils.FormatDate)).QueryRow(&edbDateData) if err != nil && err.Error() != utils.ErrNoRow() { return } err = nil } // 如果是没有历史数据,那么就需要增加数据 if edbDateData == nil { addSql := ` INSERT INTO %s (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) VALUES ( %d, "%s", "%s", "%s", now(), now(), %s) ` addSql = fmt.Sprintf(addSql, tableName, edbInfo.EdbInfoId, edbInfo.EdbCode, dateStr, saveValue, timeStr) _, err = to.Raw(addSql).Exec() } else { updateSql := `UPDATE %s SET data_time = "%s", value = "%s", modify_time= now(), data_timestamp= %s WHERE edb_data_id = %d;` updateSql = fmt.Sprintf(updateSql, tableName, dateStr, saveValue, timeStr, edbDateData.EdbDataId) _, err = to.Raw(updateSql).Exec() } if err != nil { return } } // 更改指标的数据结束日期 edbInfo.EndDate = dateStr _, err = to.Update(edbInfo, "EndDate") return }