|
@@ -0,0 +1,254 @@
|
|
|
|
+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
|
|
|
|
+}
|