123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- package services
- import (
- "encoding/json"
- "errors"
- "eta/eta_api/models/data_manage"
- excelModel "eta/eta_api/models/data_manage/excel"
- "eta/eta_api/models/data_manage/excel/request"
- "eta/eta_api/services/alarm_msg"
- "eta/eta_api/services/sandbox"
- "eta/eta_api/utils"
- "fmt"
- "time"
- )
- // 全局的指标替换
- func DealReplaceEdbCache() {
- var err error
- for {
- utils.Rc.Brpop(utils.CACHE_KEY_REPLACE_EDB, func(b []byte) {
- defer func() {
- if err != nil {
- utils.FileLog.Info("DealReplaceEdbCache err:" + err.Error())
- go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errmsg:"+err.Error(), 3)
- }
- }()
- record := new(data_manage.ReplaceEdbInfoItem)
- if err = json.Unmarshal(b, &record); err != nil {
- fmt.Println("json unmarshal wrong!")
- return
- }
- oldEdbInfo := record.OldEdbInfo
- newEdbInfo := record.NewEdbInfo
- deleteCache := true
- setNxKey := fmt.Sprintf("EDB_INFO_REPLACE:%d-%d", oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId)
- defer func() {
- if deleteCache {
- utils.Rc.Delete(setNxKey)
- }
- }()
- if !utils.Rc.SetNX(setNxKey, 1, 30*time.Minute) {
- deleteCache = false
- err = fmt.Errorf("替换表格中的指标失败旧指标:%d为新指标%d:正在处理中", oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId)
- return
- }
- // 替换相关性图表配置
- _, err = data_manage.ReplaceMultipleGraphConfigChartEdb(oldEdbInfo, newEdbInfo)
- if err != nil {
- err = fmt.Errorf("替换相关性图表配置失败,errmsg:%s", err.Error())
- return
- }
- // 替换拟合方程指标
- _, err = data_manage.ReplaceEdbInfoInLineEquationMultipleGraphConfig(oldEdbInfo, newEdbInfo)
- if err != nil {
- err = fmt.Errorf("替换拟合方程指标失败,errmsg:%s", err.Error())
- return
- }
- // 替换表格中的指标
- err = ReplaceEdbInExcel(oldEdbInfo, newEdbInfo)
- if err != nil {
- err = fmt.Errorf("替换表格中的指标失败,errmsg:%s", err.Error())
- return
- }
- //替换逻辑图中的指标
- err = sandbox.ReplaceEdbInSandbox(oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId)
- if err != nil {
- err = fmt.Errorf("替换逻辑图中的指标失败,errmsg:%s", err.Error())
- return
- }
- })
- }
- }
- // ReplaceEdbInExcel 替换表格中的指标
- func ReplaceEdbInExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo) (err error) {
- defer func() {
- if err != nil {
- go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errmsg:"+err.Error(), 3)
- }
- }()
- //查询和指标相关的时间序列表格和混合表格
- mappingList, err := excelModel.GetExcelEdbMappingByEdbInfoIdAndSource(oldEdbInfo.EdbInfoId, []int{utils.TIME_TABLE, utils.MIXED_TABLE})
- if err != nil {
- err = fmt.Errorf("查询和指标相关的表格失败,错误:%s", err.Error())
- return
- }
- updateList := make([]*excelModel.ExcelInfo, 0)
- // 循环列表,根据表格类型单独处理
- for _, excelMapping := range mappingList {
- //查询和指标相关的混合表格
- excelInfo, tmpErr := excelModel.GetExcelInfoById(excelMapping.ExcelInfoId)
- if tmpErr != nil {
- err = fmt.Errorf("查询和指标相关的混合表格失败,错误:%s", tmpErr.Error())
- return
- }
- // 清除缓存
- key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + excelInfo.UniqueCode
- if utils.Re == nil {
- _ = utils.Rc.Delete(key)
- }
- // 根据表格类型,调用不同的处理函数
- switch excelMapping.Source {
- case utils.TIME_TABLE: // 时间序列表格
- // 替换余额表格中的指标
- newExcelInfo, e := replaceEdbInTimeExcel(oldEdbInfo, newEdbInfo, excelInfo)
- if e != nil {
- err = fmt.Errorf("替换余额表格中的指标失败,错误:%s", e.Error())
- return
- }
- updateList = append(updateList, newExcelInfo)
- case utils.MIXED_TABLE, utils.BALANCE_TABLE:
- // 替换余额表格中的指标
- newExcelInfo, e := replaceEdbInBalanceExcel(oldEdbInfo, newEdbInfo, excelInfo)
- if e != nil {
- err = fmt.Errorf("替换余额表格中的指标失败,错误:%s", e.Error())
- return
- }
- updateList = append(updateList, newExcelInfo)
- default:
- // 其他表格类型的处理逻辑
- }
- }
- err = excelModel.ReplaceEdbInExcel(oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId, updateList)
- if err != nil {
- err = fmt.Errorf("替换表格中的指标失败,错误:%s", err.Error())
- return
- }
- //todo 是否需要刷新表格中的指标数据
- return
- }
- func replaceEdbInBalanceExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, excelInfo *excelModel.ExcelInfo) (newExcelInfo *excelModel.ExcelInfo, err error) {
- newExcelInfo = excelInfo
- var mixedTableReq request.MixedTableReq
- err = json.Unmarshal([]byte(excelInfo.Content), &mixedTableReq)
- if err != nil {
- err = fmt.Errorf("表格json转结构体失败,Err:" + err.Error())
- return
- }
- // 处理data
- configList := mixedTableReq.Data
- for ck, rowList := range configList {
- for rk, cell := range rowList {
- switch cell.DataType {
- case request.EdbDT: // 指标信息
- if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
- //更换成新指标ID
- configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
- }
- case request.InsertDataDT, request.PopInsertDataDT: // 插值、弹框插值
- if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
- //更换成新指标ID
- configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
- }
- case request.InsertEdbCalculateDataDT: // 插入指标计算公式生成的值
- var config request.CalculateConf
- err = json.Unmarshal([]byte(cell.Value), &config)
- if err != nil {
- return
- }
- if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
- //更换成新指标ID
- configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
- }
- if config.EdbInfoId == oldEdbInfo.EdbInfoId {
- config.EdbInfoId = newEdbInfo.EdbInfoId
- var configStr []byte
- configStr, err = json.Marshal(config)
- if err != nil {
- return
- }
- configList[ck][rk].Value = string(configStr)
- }
- case request.DateDT: // 日期类型
- // 指标日期类型的单元格需要额外将指标id取出来
- if cell.DataTimeType == request.EdbDateDT {
- var config request.EdbDateConf
- err = json.Unmarshal([]byte(cell.Value), &config)
- if err != nil {
- return
- }
- if config.EdbInfoId == oldEdbInfo.EdbInfoId {
- config.EdbInfoId = newEdbInfo.EdbInfoId
- var configStr []byte
- configStr, err = json.Marshal(config)
- if err != nil {
- return
- }
- configList[ck][rk].Value = string(configStr)
- }
- }
- }
- }
- }
- mixedTableReq.Data = configList
- var newContentByte []byte
- newContentByte, err = json.Marshal(mixedTableReq)
- if err != nil {
- return
- }
- // 生成的新内容替换原先的旧内容
- excelInfo.Content = string(newContentByte)
- newExcelInfo = excelInfo
- return
- }
- func replaceEdbInTimeExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, excelInfo *excelModel.ExcelInfo) (newExcelInfo *excelModel.ExcelInfo, err error) {
- newExcelInfo = excelInfo
- var tableDataConfig request.TimeTableDataConfig
- err = json.Unmarshal([]byte(excelInfo.Content), &tableDataConfig)
- if err != nil {
- err = errors.New("表格json转结构体失败,Err:" + err.Error())
- return
- }
- if len(tableDataConfig.EdbInfoIdList) <= 0 {
- return
- }
- // 实际期数没有的情况下,直接返回吧
- if tableDataConfig.Num <= 0 {
- return
- }
- // 先处理edbInfoList
- for k, id := range tableDataConfig.EdbInfoIdList {
- if id == oldEdbInfo.EdbInfoId {
- tableDataConfig.EdbInfoIdList[k] = newEdbInfo.EdbInfoId
- }
- }
- // 先处理tableEdbInfoList
- for k, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
- if tableEdbInfo.EdbInfoId == oldEdbInfo.EdbInfoId {
- tableDataConfig.TableEdbInfoList[k].EdbInfoId = newEdbInfo.EdbInfoId
- }
- }
- var newContentByte []byte
- newContentByte, err = json.Marshal(tableDataConfig)
- if err != nil {
- return
- }
- // 生成的新内容替换原先的旧内容
- excelInfo.Content = string(newContentByte)
- newExcelInfo = excelInfo
- return
- }
|