Browse Source

Merge branch 'feature/eta1.8.5_excel_balance' into debug

# Conflicts:
#	controllers/data_manage/chart_info.go
xyxie 11 months ago
parent
commit
661f491e94

+ 1 - 1
controllers/data_manage/chart_common.go

@@ -182,7 +182,7 @@ func getBalanceChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoVie
 	}
 	msg = `获取失败`
 	// 相关联指标
-	mappingListTmp, dataListMap, err, errMsg := excel.GetBalanceExcelChartSingle(chartInfo, "")
+	mappingListTmp, dataListMap, err, errMsg := excel.GetBalanceExcelChartSingle(chartInfo.ChartInfoId, 0, "")
 	if err != nil {
 		errMsg = "获取失败"
 		err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())

+ 23 - 2
controllers/data_manage/chart_info.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/eta_forum"
+	"eta/eta_api/services/data/excel"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -1276,7 +1277,27 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 		edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
 		edbInfoIdMapping[v.EdbInfoId] = v
 	}
-	mappingList, err := data_manage.GetChartEdbMappingListByEdbInfoIdList(edbInfoIdList)
+
+	// 区分是否是来自平衡表图表的数据
+	var chartInfoDataShow data.ChartInfoDataShow
+
+	if req.ChartSource == 11 { //来自平衡表图表的数据
+		excelChartInfoDataShow := new(data.ExcelChartInfoDataShow)
+		// 相关联指标
+		mappingListTmp, dataListMap, err, errMsg := excel.GetBalanceExcelChartSingle(chartInfo.ChartInfoId, req.ChartEdbInfoList[0].EdbInfoId, "")
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
+		excelChartInfoDataShow.DataListMap = dataListMap
+		excelChartInfoDataShow.MappingListTmp = mappingListTmp
+		chartInfoDataShow = excelChartInfoDataShow
+	} else {
+		chartInfoDataShow = &data.BaseChartInfoDataShow{}
+	}
+
+	mappingList, err := chartInfoDataShow.GetChartEdbMappingListByEdbInfoIdList(edbInfoIdList)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
@@ -1360,7 +1381,7 @@ func (this *ChartInfoController) PreviewChartInfoDetail() {
 	}
 
 	// 获取图表中的指标数据
-	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbData(0, req.ChartType, calendar, startDate, endDate, mappingList, extraConfigStr, seasonExtraConfig)
+	edbList, xEdbIdValue, yDataList, dataResp, err, errMsg := data.GetChartEdbDataV2(0, req.ChartType, calendar, startDate, endDate, mappingList, extraConfigStr, seasonExtraConfig, chartInfoDataShow)
 	if err != nil {
 		br.Msg = "获取失败"
 		if errMsg != `` {

+ 150 - 10
controllers/data_manage/excel/balance_table.go

@@ -3,6 +3,7 @@ package excel
 import (
 	"archive/zip"
 	"encoding/json"
+	"errors"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/excel"
@@ -442,7 +443,33 @@ func (c *ExcelInfoController) BalanceChartInfoAdd() {
 			return
 		}
 	}
-	chartInfo, err, errMsg, isSendEmail := data.AddBalanceExcelChart(excelInfo, req, sysUser)
+	// 判断如果是静态表,则查询表数据,落库
+	dataListMap := make(map[int][]*data_manage.EdbDataList)
+	if excelInfo.BalanceType == 1 {
+		newExcelDataMap, excelAllRows, excelAllCols, e, errMsg := excelService.GetBalanceExcelData(excelInfo, "")
+		if e != nil {
+			br.Msg = "获取表格数据失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = "获取表格数据失败,Err:" + e.Error()
+			return
+		}
+
+		for k, mapping := range req.ChartEdbInfoList {
+			tmpMapping := &excel.ExcelChartEdb{
+				ExcelChartEdbId: k,
+				DateSequence:    mapping.DateSequenceStr,
+				DataSequence:    mapping.DataSequenceStr,
+			}
+			err, errMsg = excelService.GetBalanceExcelEdbData(tmpMapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
+			if err != nil {
+				err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+				return
+			}
+		}
+	}
+	chartInfo, err, errMsg, isSendEmail := data.AddBalanceExcelChart(excelInfo, req, sysUser, dataListMap)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -591,7 +618,33 @@ func (c *ExcelInfoController) BalanceChartInfoEdit() {
 			return
 		}
 	}
-	chartItem, err, errMsg, isSendEmail := data.EditBalanceExcelChart(excelInfo, req, sysUser)
+	// 判断如果是静态表,则查询表数据,落库
+	dataListMap := make(map[int][]*data_manage.EdbDataList)
+	if excelInfo.BalanceType == 1 {
+		newExcelDataMap, excelAllRows, excelAllCols, e, errMsg := excelService.GetBalanceExcelData(excelInfo, "")
+		if e != nil {
+			br.Msg = "获取表格数据失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = "获取表格数据失败,Err:" + e.Error()
+			return
+		}
+
+		for _, mapping := range req.ChartEdbInfoList {
+			tmpMapping := &excel.ExcelChartEdb{
+				ExcelChartEdbId: mapping.ExcelChartEdbId,
+				DateSequence:    mapping.DateSequenceStr,
+				DataSequence:    mapping.DataSequenceStr,
+			}
+			err, errMsg = excelService.GetBalanceExcelEdbData(tmpMapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
+			if err != nil {
+				err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+				return
+			}
+		}
+	}
+	chartItem, err, errMsg, isSendEmail := data.EditBalanceExcelChart(excelInfo, req, sysUser, dataListMap)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -1031,6 +1084,7 @@ func (c *ExcelInfoController) AddStaticExcel() {
 		}
 	}
 	// 查询出每个子表的内容,并将内容转为静态版本
+	excelDataMap := make(map[int]map[int][]*data_manage.EdbDataList)
 	//查询动态表所有的子表,并复制为静态表
 	condition := " AND parent_id = ? AND balance_type = 0 "
 	var pars []interface{}
@@ -1042,6 +1096,37 @@ func (c *ExcelInfoController) AddStaticExcel() {
 		return
 	}
 	for k, childExcelInfo := range childExcelList {
+		//得到表格数据并落库
+
+		newExcelDataMap, excelAllRows, excelAllCols, e, errMsg := excelService.GetBalanceExcelData(childExcelInfo, "")
+		if e != nil {
+			br.Msg = "获取表格数据失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = "获取表格数据失败,Err:" + e.Error()
+			return
+		}
+		tmpMappingList, e := excel.GetExcelChartEdbMappingByExcelInfoId(childExcelInfo.ExcelInfoId)
+		if e != nil {
+			err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+			return
+		}
+		if len(tmpMappingList) > 0 {
+			for _, mapping := range tmpMappingList {
+				child, ok := excelDataMap[mapping.ChartInfoId]
+				if !ok {
+					child = make(map[int][]*data_manage.EdbDataList)
+				}
+				err, errMsg = excelService.GetBalanceExcelEdbData(mapping, newExcelDataMap, child, excelAllRows, excelAllCols)
+				if err != nil {
+					err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+					return
+				}
+				excelDataMap[mapping.ChartInfoId] = child
+			}
+		}
+
 		content, e := excelService.TransferBalanceExcelContentToStatic(childExcelInfo, "")
 		if e != nil {
 			br.Msg = "动态内容转成静态失败"
@@ -1051,7 +1136,7 @@ func (c *ExcelInfoController) AddStaticExcel() {
 		childExcelList[k].Content = content
 	}
 
-	excelInfo, err, errMsg, isSendEmail := data.AddBalanceStaticExcel(oldExcelInfo, req.VersionName, sysUser, 0, req.ExcelInfoId, 1, childExcelList, true)
+	excelInfo, err, errMsg, isSendEmail := data.AddBalanceStaticExcel(oldExcelInfo, req.VersionName, sysUser, 0, req.ExcelInfoId, 1, childExcelList, true, excelDataMap)
 	if err != nil {
 		br.Msg = "复制失败"
 		if errMsg != `` {
@@ -1281,10 +1366,10 @@ func (c *ExcelInfoController) ModifyBalanceExcelVersion() {
 	br.IsAddLog = true
 }
 
-func DownloadBalanceTable(excelInfo *excel.ExcelInfo) (savePath, zipName string, err error, errMsg string) {
+func downloadBalanceTable(excelInfo *excel.ExcelInfo) (savePath, zipName string, uploadDir string, err error, errMsg string) {
 	dateDir := time.Now().Format("20060102")
 	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
-	uploadDir := "static/xls/" + dateDir + "/" + randStr + "/" + utils.GetRandString(6)
+	uploadDir = "static/xls/" + dateDir + "/" + randStr
 	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
 	if err != nil {
 		return
@@ -1352,13 +1437,14 @@ func DownloadBalanceTable(excelInfo *excel.ExcelInfo) (savePath, zipName string,
 		if err != nil {
 			return
 		}
-		fileList = append(fileList, fpath)
+		fileList = append(fileList, fileName)
 	}
 	// 创建zip
 	zipName = excelInfo.ExcelName + ".zip"
 
 	savePath = uploadDir + "/" + zipName
-	zipFile, err := os.Create(zipName)
+	fmt.Println(savePath)
+	zipFile, err := os.Create(savePath)
 	if err != nil {
 		return
 	}
@@ -1369,9 +1455,9 @@ func DownloadBalanceTable(excelInfo *excel.ExcelInfo) (savePath, zipName string,
 			zipWriter.Close()
 			zipFile.Close()
 		}
-		os.Remove(savePath)
+		//os.Remove(savePath)
 	}()
-	// 获取音频,写入zip
+	//写入zip
 	for i := 0; i < len(fileList); i++ {
 		ioWriter, e := zipWriter.Create(fileList[i])
 		if e != nil {
@@ -1382,7 +1468,8 @@ func DownloadBalanceTable(excelInfo *excel.ExcelInfo) (savePath, zipName string,
 			}
 			return
 		}
-		content, e := ioutil.ReadFile(fileList[i])
+		fullPath := uploadDir + "/" + fileList[i]
+		content, e := ioutil.ReadFile(fullPath)
 		if e != nil {
 			err = fmt.Errorf("读取文件失败,Err:" + e.Error())
 			return
@@ -1395,3 +1482,56 @@ func DownloadBalanceTable(excelInfo *excel.ExcelInfo) (savePath, zipName string,
 	//this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
 	return
 }
+
+func refreshBalanceTable(excelDetail response.ExcelInfoDetail) (err error) {
+	//查询所有子表
+	cCondition := " AND parent_id = ? AND balance_type=0"
+	var cPars []interface{}
+	cPars = append(cPars, excelDetail.ExcelInfoId)
+	childList, e := excel.GetExcelInfoListByCondition(cCondition, cPars)
+	if e != nil {
+		err = fmt.Errorf("获取子表失败 %s", err.Error())
+		return
+	}
+	edbInfoIds := make([]int, 0)
+	edbInfoIdExist := make(map[int]bool)
+	// 遍历
+	for _, child := range childList {
+		var result request.MixedTableReq
+		err = json.Unmarshal([]byte(child.Content), &result)
+		if err != nil {
+			err = errors.New("表格json转结构体失败,Err:" + err.Error())
+			return
+		}
+		newData, tmpErr, _ := excelService.GetMixedTableCellData(result)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		if len(newData) > 0 {
+			for _, t := range newData {
+				for _, v := range t {
+					if v.EdbInfoId > 0 && !edbInfoIdExist[v.EdbInfoId] {
+						edbInfoIdExist[v.EdbInfoId] = true
+						edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+					}
+				}
+			}
+		}
+
+		// 清除缓存
+		key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + child.UniqueCode
+		if utils.Re == nil {
+			_ = utils.Rc.Delete(key)
+		}
+	}
+
+	if len(edbInfoIds) > 0 {
+		e, _ = data.EdbInfoRefreshAllFromBaseV3(edbInfoIds, false, true, false)
+		if e != nil {
+			err = fmt.Errorf("刷新混合表格数据失败, Err: " + err.Error())
+			return
+		}
+	}
+	return
+}

+ 44 - 3
controllers/data_manage/excel/excel_info.go

@@ -772,6 +772,11 @@ func (c *ExcelInfoController) Edit() {
 	// 引用的指标id
 	edbInfoIdList := make([]int, 0)
 	content := req.Content
+	contentFlag := false
+	if req.Content != excelInfo.Content {
+		contentFlag = true
+	}
+	balanceTableData := make([][]request.MixedTableCellDataReq, 0)
 	switch excelInfo.Source {
 	case utils.TIME_TABLE: // 自定义表格
 		jsonStrByte, err := json.Marshal(req.TableData)
@@ -826,6 +831,7 @@ func (c *ExcelInfoController) Edit() {
 			br.ErrMsg = "获取最新的数据失败,Err:" + err.Error()
 			return
 		}
+		balanceTableData = newResult
 		edbInfoIdMap := make(map[int]int)
 		for _, tmpV := range newResult {
 			for _, v := range tmpV {
@@ -874,11 +880,33 @@ func (c *ExcelInfoController) Edit() {
 		return
 	}
 
+	if excelInfo.Source == utils.BALANCE_TABLE && req.IsAuto == false {
+		// 更新人变更
+		parentExcelInfoId := excelInfo.ParentId
+		if excelInfo.BalanceType == 1 {
+			parentExcelInfoId = excelInfo.RelExcelInfoId
+		}
+		err = excel3.ModifyExcelInfoUpdateUserId(parentExcelInfoId, sysUser.AdminId, sysUser.RealName)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+
+	}
 	// 更新excel下载地址(默认的EXCEL需要更新,自定义表格不需要更新)
 	if excelInfo.Source == 1 {
 		go excel2.UpdateExcelInfoFileUrl(excelInfo)
 	}
-
+	// 更新平衡表图表指标
+	if excelInfo.Source == utils.BALANCE_TABLE && excelInfo.BalanceType == 1 && contentFlag == true { //静态表更新表数据
+		err = excel2.SyncBalanceEdbData(excelInfo, balanceTableData)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = err.Error()
+			return
+		}
+	}
 	// 加入草稿
 	{
 		excelDraftInfo := &excel3.ExcelDraft{
@@ -2093,7 +2121,7 @@ func (c *ExcelInfoController) Refresh() {
 	}
 
 	// 数据刷新-混合表格
-	if excelDetail.Source == utils.MIXED_TABLE || excelDetail.Source == utils.BALANCE_TABLE {
+	if excelDetail.Source == utils.MIXED_TABLE {
 		// todo 刷新动态表的所有子表中关联的指标数据
 		jsonByte, e := json.Marshal(excelDetail.TableData)
 		if e != nil {
@@ -2129,6 +2157,15 @@ func (c *ExcelInfoController) Refresh() {
 		}
 	}
 
+	if excelDetail.Source == utils.BALANCE_TABLE {
+		err = refreshBalanceTable(excelDetail)
+		if err != nil {
+			br.Msg = "刷新失败"
+			br.ErrMsg = "刷新失败,Err:" + err.Error()
+			return
+		}
+	}
+
 	// 清除缓存
 	key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + excelDetail.UniqueCode
 	if utils.Re == nil {
@@ -2242,7 +2279,7 @@ func (c *ExcelInfoController) Download() {
 			return
 		}
 	case utils.BALANCE_TABLE: // 混合表格
-		savePath, fileName, err, errMsg := DownloadBalanceTable(excelInfo)
+		savePath, fileName, uploadDir, err, errMsg := downloadBalanceTable(excelInfo)
 		if err != nil {
 			br.Msg = "下载失败"
 			if errMsg != `` {
@@ -2251,6 +2288,10 @@ func (c *ExcelInfoController) Download() {
 			br.ErrMsg = "获取最新的数据失败,Err:" + err.Error()
 			return
 		}
+		defer func() {
+			_ = os.Remove(uploadDir)
+		}()
+		// todo 删除文件
 		c.Ctx.Output.Download(savePath, fileName)
 		br.Ret = 200
 		br.Success = true

+ 1 - 0
models/data_manage/chart_info.go

@@ -1504,6 +1504,7 @@ type PreviewChartInfoReq struct {
 	Calendar          string           `description:"公历/农历"`
 	SeasonExtraConfig SeasonExtraItem  `description:"季节性图表中的配置,json数据"`
 	StartYear         int              `description:"当选择的日期类型为最近N年类型时,即date_type=20, 用start_year表示N"`
+	ChartSource       int
 }
 
 type SeasonExtraItem struct {

+ 82 - 0
models/data_manage/excel/excel_chart_data.go

@@ -1,6 +1,8 @@
 package excel
 
 import (
+	"eta/eta_api/models/data_manage"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -9,6 +11,7 @@ type ExcelChartData struct {
 	ExcelChartDataId int `orm:"column(excel_chart_data_id);pk"`
 	ExcelInfoId      int `description:"表格id"`
 	ExcelChartEdbId  int `description:"指标ID"`
+	ChartInfoId      int `description:"图表id"`
 	DataTime         string
 	Value            float64
 	ModifyTime       time.Time `description:"修改时间"`
@@ -42,3 +45,82 @@ func (e *ExcelChartData) Delete() (err error) {
 }
 
 // 查询
+func GetExcelChartDataByExcelInfoId(excelInfoId int) (list []*ExcelChartData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *
+             FROM excel_chart_data
+			 WHERE excel_info_id=? 
+             ORDER BY excel_chart_edb_id ASC, excel_chart_data_id ASC `
+	_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
+	return
+}
+
+func BatchUpdateChartEdbData(excelInfoId int, excelEdbMap map[int]*ExcelChartEdb, excelDataMap map[int][]*data_manage.EdbDataList) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+	//如果有数据则删除所有的数据
+	sql := `delete from excel_chart_data where excel_info_id = ?`
+	_, err = o.Raw(sql, excelInfoId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 图表指标数据入库
+	addList := make([]*ExcelChartData, 0)
+	for chartEdbId, dataList := range excelDataMap {
+		chartEdb, ok := excelEdbMap[chartEdbId]
+		if !ok {
+			err = fmt.Errorf("chartEdbId:%d not exist", chartEdbId)
+			return
+		}
+		for _, v := range dataList {
+			chartData := &ExcelChartData{
+				ExcelInfoId:     chartEdb.ExcelInfoId,
+				ExcelChartEdbId: chartEdb.ExcelChartEdbId,
+				ChartInfoId:     chartEdb.ChartInfoId,
+				DataTime:        v.DataTime,
+				Value:           v.Value,
+				DataTimestamp:   v.DataTimestamp,
+				ModifyTime:      time.Now(),
+				CreateTime:      time.Now(),
+			}
+			addList = append(addList, chartData)
+			// data信息入库
+			if len(addList) > 1000 {
+				_, err = o.InsertMulti(len(addList), addList)
+				if err != nil {
+					return
+				}
+				addList = addList[:0]
+			}
+		}
+	}
+
+	// data信息入库
+	if len(addList) > 0 {
+		_, err = o.InsertMulti(len(addList), addList)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+func GetExcelChartDataByChartInfoId(chartInfoId int) (list []*ExcelChartData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *
+             FROM excel_chart_Data
+			 WHERE chart_info_id=? 
+             ORDER BY excel_chart_edb_id ASC `
+	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	return
+}

+ 12 - 19
models/data_manage/excel/excel_chart_edb.go

@@ -97,8 +97,7 @@ func (e *ExcelChartEdb) Delete() (err error) {
 
 type AddChartEdbAndDataItem struct {
 	ChartEdb *ExcelChartEdb
-	DateList []string  `description:"日期列表"`
-	ValList  []float64 `description:"数据列表"`
+	DataList []*ExcelChartData `description:"数据列表"`
 }
 
 // 同时添加指标和指标数据
@@ -128,7 +127,7 @@ func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chart
 	updateIds := make([]int, 0)
 	var edbInfoIdArrStr []string
 	for _, item := range list {
-		err = addChartEdbAndData(o, item.ChartEdb, item.DateList, item.ValList)
+		err = addChartEdbAndData(o, item.ChartEdb, item.DataList)
 		if err != nil {
 			return
 		}
@@ -170,7 +169,7 @@ func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chart
 	return
 }
 
-func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dateList []string, valList []float64) (err error) {
+func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dataList []*ExcelChartData) (err error) {
 	// 图表指标信息入库
 	excelChartEdbId := chartEdb.ExcelChartEdbId
 	if chartEdb.ExcelChartEdbId <= 0 {
@@ -198,28 +197,22 @@ func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dateList []strin
 
 	// 图表指标数据入库
 	addList := make([]*ExcelChartData, 0)
-	if len(dateList) > 0 && len(valList) > 0 {
-		for k, v := range dateList {
+	if len(dataList) > 0 {
+		for _, v := range dataList {
 			chartData := &ExcelChartData{
 				ExcelInfoId:     chartEdb.ExcelInfoId,
 				ExcelChartEdbId: chartEdb.ExcelChartEdbId,
-				DataTime:        v,
-				Value:           valList[k],
+				ChartInfoId:     chartEdb.ChartInfoId,
+				DataTime:        v.DataTime,
+				Value:           v.Value,
+				DataTimestamp:   v.DataTimestamp,
 				ModifyTime:      time.Now(),
 				CreateTime:      time.Now(),
 			}
-			//时间戳
-			currentDate, er := time.Parse(utils.FormatDate, v)
-			if er != nil {
-				err = fmt.Errorf("时间格式化失败 err:%v", er)
-				return
-			}
-			timestamp := currentDate.UnixNano() / 1e6
-			chartData.DataTimestamp = timestamp
 			addList = append(addList, chartData)
 			// data信息入库
 			if len(addList) > 1000 {
-				_, err = o.InsertMulti(len(addList), len(addList))
+				_, err = o.InsertMulti(len(addList), addList)
 				if err != nil {
 					return
 				}
@@ -230,7 +223,7 @@ func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dateList []strin
 
 	// data信息入库
 	if len(addList) > 0 {
-		_, err = o.InsertMulti(len(addList), len(addList))
+		_, err = o.InsertMulti(len(addList), addList)
 		if err != nil {
 			return
 		}
@@ -243,7 +236,7 @@ func GetExcelChartEdbMappingByExcelInfoId(excelInfoId int) (list []*ExcelChartEd
 	sql := ` SELECT *
              FROM excel_chart_edb 
 			 WHERE excel_info_id=? 
-             ORDER BY excel_chart_edb_id ASC `
+             ORDER BY chart_info_id asc, excel_chart_edb_id ASC `
 	_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
 	return
 }

+ 7 - 0
models/data_manage/excel/excel_info.go

@@ -698,3 +698,10 @@ type ExcelInfoDetailButton struct {
 	RefreshEdbButton bool `description:"是否可刷新指标"`
 	OpWorkerButton   bool `description:"是否修改协作人"`
 }
+
+func ModifyExcelInfoUpdateUserId(excelInfoId, userId int, userName string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE excel_info SET update_user_id=?,update_user_real_name=? WHERE excel_info_id =? `
+	_, err = o.Raw(sql, userId, userName, excelInfoId).Exec()
+	return
+}

+ 1 - 0
models/data_manage/excel/request/excel_info.go

@@ -35,6 +35,7 @@ type EditExcelInfoReq struct {
 	ExcelClassifyId int         `description:"分类id"`
 	Content         string      `description:"Excel表格内容"`
 	TableData       interface{} `description:"自定义表格的数据内容"`
+	IsAuto          bool        `description:"是否自动保存,1:是,2:否,默认:1"`
 }
 
 // SetExcelInfoImageReq 设置excel表格图片请求

+ 162 - 41
services/data/chart_info_excel_balance.go

@@ -18,7 +18,7 @@ import (
 )
 
 // AddBalanceExcelChart 添加平衡表图表
-func AddBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanceTableChartReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func AddBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanceTableChartReq, sysUser *system.Admin, dataListMap map[int][]*data_manage.EdbDataList) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 
 	/*// 操作权限校验, 增加协作人判断
 	{
@@ -61,7 +61,7 @@ func AddBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanc
 		return
 	}
 	chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
-	for _, chartEdb := range req.ChartEdbInfoList {
+	for k, chartEdb := range req.ChartEdbInfoList {
 		excelEdb := new(excelModel.ExcelChartEdb)
 		excelEdb.EdbName = chartEdb.EdbName
 		randStr := utils.GetRandDigit(4)
@@ -82,23 +82,28 @@ func AddBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanc
 		excelEdb.CreateTime = time.Now()
 		excelEdb.ModifyTime = time.Now()
 		excelEdb.ChartWidth = 1
-		var dateList []string
-		var dataList []float64
+		var dataList []*excelModel.ExcelChartData
 		if excelInfo.BalanceType == 1 {
-			// 如果是静态表,则直接使用前端传输的数据落到数据库里
-			/*dateList, dataList, err, errMsg = utils.HandleEdbSequenceVal(chartEdb.DateSequenceVal, chartEdb.DataSequenceVal)
-			if err != nil {
-				errMsg = "时间序列或数据序列异常!"
-				err = fmt.Errorf("时间序列或数据序列异常!%s", err.Error())
+			tmpList, ok := dataListMap[k]
+			if !ok {
+				errMsg = "查询图表数据失败!"
+				err = fmt.Errorf("查询图表数据失败!%s", err.Error())
 				return
-			}*/
+			}
+			for _, l := range tmpList {
+				tmp := &excelModel.ExcelChartData{
+					DataTime:      l.DataTime,
+					Value:         l.Value,
+					DataTimestamp: l.DataTimestamp,
+				}
+				dataList = append(dataList, tmp)
+			}
 		}
 
 		// 处理日期列表和值列表
 		addItem := &excelModel.AddChartEdbAndDataItem{
 			ChartEdb: excelEdb,
-			DateList: dateList,
-			ValList:  dataList,
+			DataList: dataList,
 		}
 		chartEdbList = append(chartEdbList, addItem)
 	}
@@ -267,7 +272,7 @@ func addBalanceExcelChart(req request.AddBalanceTableChartReq, sysUserId int, sy
 }
 
 // EditBalanceExcelChart 添加平衡表图表
-func EditBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanceTableChartReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func EditBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanceTableChartReq, sysUser *system.Admin, dataListMap map[int][]*data_manage.EdbDataList) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	if len(req.ChartEdbInfoList) == 0 {
 		errMsg = "图表数据不能为空!"
 		err = fmt.Errorf("图表数据不能为空!%s", err.Error())
@@ -322,7 +327,7 @@ func EditBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalan
 
 	// 查询edbIds
 	chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
-	for _, chartEdb := range req.ChartEdbInfoList {
+	for k, chartEdb := range req.ChartEdbInfoList {
 		if _, ok := deleteMap[chartEdb.ExcelChartEdbId]; ok {
 			delete(deleteMap, chartEdb.ExcelChartEdbId)
 		}
@@ -363,23 +368,29 @@ func EditBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalan
 		excelEdb.LeadValue = chartEdb.LeadValue
 		excelEdb.LeadUnit = chartEdb.LeadUnit
 		excelEdb.ModifyTime = time.Now()
-		var dateList []string
-		var dataList []float64
+		var dataList []*excelModel.ExcelChartData
 		if excelInfo.BalanceType == 1 {
 			// 如果是静态表,则直接使用前端传输的数据落到数据库里
-			/*dateList, dataList, err, errMsg = utils.HandleEdbSequenceVal(chartEdb.DateSequenceVal, chartEdb.DataSequenceVal)
-			if err != nil {
-				errMsg = "时间序列或数据序列异常!"
-				err = fmt.Errorf("时间序列或数据序列异常!%s", err.Error())
+			tmpList, ok := dataListMap[k]
+			if !ok {
+				errMsg = "查询图表数据失败!"
+				err = fmt.Errorf("查询图表数据失败!%s", err.Error())
 				return
-			}*/
+			}
+			for _, l := range tmpList {
+				tmp := &excelModel.ExcelChartData{
+					DataTime:      l.DataTime,
+					Value:         l.Value,
+					DataTimestamp: l.DataTimestamp,
+				}
+				dataList = append(dataList, tmp)
+			}
 		}
 
 		// 处理日期列表和值列表
 		addItem := &excelModel.AddChartEdbAndDataItem{
 			ChartEdb: excelEdb,
-			DateList: dateList,
-			ValList:  dataList,
+			DataList: dataList,
 		}
 		chartEdbList = append(chartEdbList, addItem)
 	}
@@ -421,8 +432,6 @@ func editBalanceExcelChart(req request.AddBalanceTableChartReq) (chartInfo *data
 		err = errors.New("获取图表信息失败,Err:" + err.Error())
 		return
 	}
-	// todo 查找默认主题设置
-	// todo 查找默认主题设置
 	// 查找主题类型id
 	chartThemeType, err := chart_theme.GetChartThemeTypeByChartType(chartType)
 	if err != nil {
@@ -597,9 +606,12 @@ func GetBalanceExcelChartDetail(chartInfo *data_manage.ChartInfoView, mappingLis
 		calendar = "公历"
 	}
 
-	mappingList := make([]*data_manage.ChartEdbInfoMapping, 0)
+	mappingList, err := TransferChartEdbToEdbMappingFormat(chartInfoId, chartType, mappingListTmp, dataListMap)
+	if err != nil {
+		return
+	}
 	//循环组装映射关系
-	for _, v := range mappingListTmp {
+	/*for _, v := range mappingListTmp {
 		dataList := make([]*data_manage.EdbDataList, 0)
 		dataListTmp, ok := dataListMap[v.ExcelChartEdbId]
 		if ok {
@@ -663,7 +675,7 @@ func GetBalanceExcelChartDetail(chartInfo *data_manage.ChartInfoView, mappingLis
 			HaveOperaAuth:     true,
 		}
 		mappingList = append(mappingList, mapping)
-	}
+	}*/
 	if chartType == 2 {
 		startDate = seasonStartDate
 		endDate = seasonEndDate
@@ -846,7 +858,7 @@ func GetBalanceExcelEdbDataMapList(chartInfoId, chartType int, calendar, startDa
 			item.EdbInfoType = 1
 			item.ChartStyle = ""
 			item.ChartColor = ""
-			item.ChartWidth = 0
+			item.ChartWidth = 1
 			item.MaxData = v.MaxValue
 			item.MinData = v.MinValue
 		} else {
@@ -1254,7 +1266,7 @@ func getBalanceDataListStartDateAndValue(dataList []*data_manage.EdbDataList) (s
 }
 
 // AddBalanceStaticExcel 另存为和存为静态表以及子表的复制都调用该接口
-func AddBalanceStaticExcel(oldExcelInfo *excelModel.ExcelInfo, versionName string, sysUser *system.Admin, parentId, relExcelInfoId, balanceType int, childExcelList []*excelModel.ExcelInfo, pingNameFlag bool) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
+func AddBalanceStaticExcel(oldExcelInfo *excelModel.ExcelInfo, versionName string, sysUser *system.Admin, parentId, relExcelInfoId, balanceType int, childExcelList []*excelModel.ExcelInfo, pingNameFlag bool, excelDataMap map[int]map[int][]*data_manage.EdbDataList) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	versionName = utils.TrimLRStr(versionName)
@@ -1339,7 +1351,7 @@ func AddBalanceStaticExcel(oldExcelInfo *excelModel.ExcelInfo, versionName strin
 	}
 	if parentId == 0 && len(childExcelList) > 0 {
 		for _, childExcelInfo := range childExcelList {
-			_, err, errMsg, isSendEmail = AddBalanceStaticExcel(childExcelInfo, versionName, sysUser, excelInfo.ExcelInfoId, relExcelInfoId, balanceType, []*excelModel.ExcelInfo{}, false)
+			_, err, errMsg, isSendEmail = AddBalanceStaticExcel(childExcelInfo, versionName, sysUser, excelInfo.ExcelInfoId, relExcelInfoId, balanceType, []*excelModel.ExcelInfo{}, false, excelDataMap)
 			if err != nil {
 				return
 			}
@@ -1376,7 +1388,12 @@ func AddBalanceStaticExcel(oldExcelInfo *excelModel.ExcelInfo, versionName strin
 					err = fmt.Errorf("未找到图表关联的指标信息")
 					return
 				}
-				err, errMsg, isSendEmail = CopyBalanceExcelChart(chartInfo, mappingList, versionName, sysUser, pingNameFlag)
+				chartEdbDataMap, ok := excelDataMap[chartInfo.ChartInfoId]
+				if !ok && oldExcelInfo.BalanceType == 1 { //
+					err = fmt.Errorf("未找到图表关联的指标信息")
+					return
+				}
+				err, errMsg, isSendEmail = CopyBalanceExcelChart(chartInfo, mappingList, versionName, sysUser, pingNameFlag, chartEdbDataMap)
 				if err != nil {
 					err = fmt.Errorf("复制图表失败 Err:%s", err.Error())
 					return
@@ -1388,7 +1405,7 @@ func AddBalanceStaticExcel(oldExcelInfo *excelModel.ExcelInfo, versionName strin
 }
 
 // CopyBalanceExcelChart 复制平衡表图表
-func CopyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, oldChartEdbList []*excelModel.ExcelChartEdb, versionName string, sysUser *system.Admin, pingNameFlag bool) (err error, errMsg string, isSendEmail bool) {
+func CopyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, oldChartEdbList []*excelModel.ExcelChartEdb, versionName string, sysUser *system.Admin, pingNameFlag bool, dataListMap map[int][]*data_manage.EdbDataList) (err error, errMsg string, isSendEmail bool) {
 	chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
 	if pingNameFlag && versionName != "" {
 		oldChartInfo.ChartName += "(" + versionName + ")"
@@ -1416,15 +1433,23 @@ func CopyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, oldChartEdbL
 		excelEdb.LeadUnit = chartEdb.LeadUnit
 		excelEdb.CreateTime = time.Now()
 		excelEdb.ModifyTime = time.Now()
-		var dateList []string
-		var dataList []float64
-		// todo 是否需要存储静态表的数据
+		var dataList []*excelModel.ExcelChartData
+		tmpList, ok := dataListMap[chartEdb.ExcelChartEdbId]
+		if ok {
+			for _, l := range tmpList {
+				tmp := &excelModel.ExcelChartData{
+					DataTime:      l.DataTime,
+					Value:         l.Value,
+					DataTimestamp: l.DataTimestamp,
+				}
+				dataList = append(dataList, tmp)
+			}
+		}
 
 		// 处理日期列表和值列表
 		addItem := &excelModel.AddChartEdbAndDataItem{
 			ChartEdb: excelEdb,
-			DateList: dateList,
-			ValList:  dataList,
+			DataList: dataList,
 		}
 		chartEdbList = append(chartEdbList, addItem)
 	}
@@ -1568,7 +1593,6 @@ func CopyBalanceExcel(oldExcelInfo *excelModel.ExcelInfo, excelClassifyId int, e
 	oldExcelInfo.ExcelName = excelName
 
 	// 先复制动态表,再复制动态子表,复制静态表,再复制静态子表
-	//查询动态表所有的子表,并复制为静态表
 	condition := " AND parent_id = ? AND balance_type = 0 "
 	var pars []interface{}
 	pars = append(pars, oldExcelInfo.ExcelInfoId)
@@ -1578,7 +1602,9 @@ func CopyBalanceExcel(oldExcelInfo *excelModel.ExcelInfo, excelClassifyId int, e
 		err = fmt.Errorf("获取子表失败 %s", err.Error())
 		return
 	}
-	excelInfo, err, errMsg, isSendEmail = AddBalanceStaticExcel(oldExcelInfo, "", sysUser, 0, 0, 0, childExcelList, false)
+	// 查询出每个子表的内容,并将内容转为静态版本
+	excelDataMap := make(map[int]map[int][]*data_manage.EdbDataList)
+	excelInfo, err, errMsg, isSendEmail = AddBalanceStaticExcel(oldExcelInfo, "", sysUser, 0, 0, 0, childExcelList, false, excelDataMap)
 	if err != nil {
 		errMsg = "复制动态表失败"
 		err = fmt.Errorf("复制动态表失败 %s", err.Error())
@@ -1605,7 +1631,31 @@ func CopyBalanceExcel(oldExcelInfo *excelModel.ExcelInfo, excelClassifyId int, e
 			err = fmt.Errorf("获取子表失败 %s", err.Error())
 			return
 		}
-		_, err, errMsg, isSendEmail = AddBalanceStaticExcel(staticExcelInfo, staticExcelInfo.VersionName, sysUser, 0, excelInfo.ExcelInfoId, 1, childList, false)
+		excelDataMap = make(map[int]map[int][]*data_manage.EdbDataList)
+		for _, childExcelInfo := range childList {
+			//得到表格数据并落库
+			tmpDataList, e := excelModel.GetExcelChartDataByExcelInfoId(childExcelInfo.ExcelInfoId)
+			if e != nil {
+				err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+				return
+			}
+			if len(tmpDataList) > 0 {
+				for _, v := range tmpDataList {
+					child, ok := excelDataMap[v.ChartInfoId]
+					if !ok {
+						child = make(map[int][]*data_manage.EdbDataList)
+					}
+					tmp := &data_manage.EdbDataList{
+						DataTime:      v.DataTime,
+						DataTimestamp: v.DataTimestamp,
+						Value:         v.Value,
+					}
+					child[v.ExcelChartEdbId] = append(child[v.ExcelChartEdbId], tmp)
+					excelDataMap[v.ChartInfoId] = child
+				}
+			}
+		}
+		_, err, errMsg, isSendEmail = AddBalanceStaticExcel(staticExcelInfo, staticExcelInfo.VersionName, sysUser, 0, excelInfo.ExcelInfoId, 1, childList, false, excelDataMap)
 		if err != nil {
 			errMsg = "复制动态表失败"
 			err = fmt.Errorf("复制动态表失败 %s", err.Error())
@@ -1614,3 +1664,74 @@ func CopyBalanceExcel(oldExcelInfo *excelModel.ExcelInfo, excelClassifyId int, e
 	}
 	return
 }
+
+func TransferChartEdbToEdbMappingFormat(chartInfoId, chartType int, mappingListTmp []*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList) (mappingList []*data_manage.ChartEdbInfoMapping, err error) {
+	mappingList = make([]*data_manage.ChartEdbInfoMapping, 0)
+	//循环组装映射关系
+	for _, v := range mappingListTmp {
+		dataList := make([]*data_manage.EdbDataList, 0)
+		dataListTmp, ok := dataListMap[v.ExcelChartEdbId]
+		if ok {
+			dataList = dataListTmp
+		} else {
+			err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.ExcelChartEdbId))
+			return
+		}
+		startDateStr, endDateStr, _, endVal, maxValue, minValue := getBalanceDataListStartDateAndValue(dataList)
+		mapping := &data_manage.ChartEdbInfoMapping{
+			EdbInfoId:         v.ExcelChartEdbId,
+			SourceName:        "",
+			Source:            0,
+			SubSource:         0,
+			EdbCode:           v.EdbCode,
+			EdbName:           v.EdbName,
+			EdbAliasName:      v.EdbName,
+			EdbNameEn:         "",
+			EdbAliasNameEn:    "",
+			EdbType:           0,
+			Frequency:         "",
+			FrequencyEn:       "",
+			Unit:              "",
+			UnitEn:            "",
+			StartDate:         startDateStr,
+			EndDate:           endDateStr,
+			ModifyTime:        v.ModifyTime.Format(utils.FormatDateTime),
+			ChartEdbMappingId: v.ExcelChartEdbId,
+			ChartInfoId:       chartInfoId,
+			MaxData:           v.MaxData,
+			MinData:           v.MinData,
+			IsOrder:           v.IsOrder,
+			IsAxis:            v.IsAxis,
+			EdbInfoType:       v.EdbInfoType,
+			//EdbInfoCategoryType: 0,
+			LeadValue:         v.LeadValue,
+			LeadUnit:          v.LeadUnit,
+			LeadUnitEn:        "",
+			ChartStyle:        "",
+			ChartColor:        "",
+			PredictChartColor: "",
+			ChartWidth:        v.ChartWidth,
+			ChartType:         chartType,
+			LatestDate:        endDateStr,
+			LatestValue:       endVal,
+			MoveLatestDate:    "",
+			UniqueCode:        "",
+			MinValue:          minValue,
+			MaxValue:          maxValue,
+			DataList:          nil,
+			IsNullData:        false,
+			MappingSource:     0,
+			RegionType:        "",
+			ClassifyId:        0,
+			IsConvert:         0,
+			ConvertType:       0,
+			ConvertValue:      0,
+			ConvertUnit:       "",
+			ConvertEnUnit:     "",
+			IsJoinPermission:  0,
+			HaveOperaAuth:     true,
+		}
+		mappingList = append(mappingList, mapping)
+	}
+	return
+}

+ 17 - 1
services/data/chart_info_interface.go

@@ -2,10 +2,12 @@ package data
 
 import (
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel"
 )
 
 type ChartInfoDataShow interface {
 	GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error)
+	GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (mappingList []*data_manage.ChartEdbInfoMapping, err error)
 }
 
 type BaseChartInfoDataShow struct {
@@ -18,8 +20,15 @@ func (e *BaseChartInfoDataShow) GetEdbDataMapList(chartInfoId, chartType int, ca
 	return
 }
 
+// GetChartEdbMappingListByEdbInfoIdList 获取指标最后的基础数据
+func (e *BaseChartInfoDataShow) GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (mappingList []*data_manage.ChartEdbInfoMapping, err error) {
+	mappingList, err = data_manage.GetChartEdbMappingListByEdbInfoIdList(edbIdList)
+	return
+}
+
 type ExcelChartInfoDataShow struct {
-	DataListMap map[int][]*data_manage.EdbDataList
+	DataListMap    map[int][]*data_manage.EdbDataList
+	MappingListTmp []*excel.ExcelChartEdb
 }
 
 // GetEdbDataMapList 获取指标最后的基础数据
@@ -28,3 +37,10 @@ func (e *ExcelChartInfoDataShow) GetEdbDataMapList(chartInfoId, chartType int, c
 	edbDataListMap, edbList, err = GetBalanceExcelEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, seasonExtraConfig, e.DataListMap)
 	return
 }
+
+// GetChartEdbMappingListByEdbInfoIdList 获取指标最后的基础数据
+func (e *ExcelChartInfoDataShow) GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (mappingList []*data_manage.ChartEdbInfoMapping, err error) {
+	// 指标对应的所有数据
+	mappingList, err = TransferChartEdbToEdbMappingFormat(0, 0, e.MappingListTmp, e.DataListMap)
+	return
+}

+ 115 - 27
services/data/excel/balance_table.go

@@ -50,10 +50,6 @@ func GetBalanceExcelData(excelDetail *excelModel.ExcelInfo, lang string) (newDat
 }
 
 func GetBalanceExcelChartList(excelInfo *excelModel.ExcelInfo, lang string) (list []*data_manage.ChartInfoView, mappingListMap map[int][]*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
-	newExcelDataMap, excelAllRows, excelAllCols, err, errMsg := GetBalanceExcelData(excelInfo, lang)
-	if err != nil {
-		return
-	}
 	dataListMap = make(map[int][]*data_manage.EdbDataList)
 	// 相关联指标
 	mappingListTmp, err := excelModel.GetExcelChartEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
@@ -62,16 +58,47 @@ func GetBalanceExcelChartList(excelInfo *excelModel.ExcelInfo, lang string) (lis
 		err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
 		return
 	}
-	mappingListMap = make(map[int][]*excelModel.ExcelChartEdb, 0)
 	charInfoIds := make([]int, 0)
-	for _, mapping := range mappingListTmp {
-		mappingListMap[mapping.ChartInfoId] = append(mappingListMap[mapping.ChartInfoId], mapping)
-		err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
-		if err != nil {
-			err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+	mappingListMap = make(map[int][]*excelModel.ExcelChartEdb, 0)
+	if excelInfo.BalanceType == 1 {
+		for _, mapping := range mappingListTmp {
+			mappingListMap[mapping.ChartInfoId] = append(mappingListMap[mapping.ChartInfoId], mapping)
+		}
+		//查询库里是否有值
+		chartDataList, e := excelModel.GetExcelChartDataByExcelInfoId(excelInfo.ExcelInfoId)
+		if e != nil {
+			err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
+			return
+		}
+		if len(chartDataList) > 0 {
+			for _, v := range chartDataList {
+				tmp := &data_manage.EdbDataList{
+					EdbDataId:     v.ExcelChartDataId,
+					EdbInfoId:     v.ExcelChartEdbId,
+					DataTime:      v.DataTime,
+					DataTimestamp: v.DataTimestamp,
+					Value:         v.Value,
+				}
+				dataListMap[v.ExcelChartEdbId] = append(dataListMap[v.ExcelChartEdbId], tmp)
+			}
+		}
+	} else {
+		newExcelDataMap, excelAllRows, excelAllCols, e, msg := GetBalanceExcelData(excelInfo, lang)
+		if e != nil {
+			err = e
+			errMsg = msg
 			return
 		}
+		for _, mapping := range mappingListTmp {
+			mappingListMap[mapping.ChartInfoId] = append(mappingListMap[mapping.ChartInfoId], mapping)
+			err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
+			if err != nil {
+				err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+				return
+			}
+		}
 	}
+
 	for k, _ := range mappingListMap {
 		charInfoIds = append(charInfoIds, k)
 	}
@@ -84,19 +111,6 @@ func GetBalanceExcelChartList(excelInfo *excelModel.ExcelInfo, lang string) (lis
 			return
 		}
 		list = chartInfoList
-		/*for _, chartInfo := range chartInfoList {
-			mappingList, ok := mappingListMap[chartInfo.ChartInfoId]
-			if !ok {
-				err = fmt.Errorf("未找到图表关联的指标信息")
-				return
-			}
-			var chartInfoResp *data_manage.ChartInfoDetailResp
-			chartInfoResp, err, errMsg = GetBalanceExcelChartDetail(chartInfo, mappingList, sysUser, dataListMap)
-			if err != nil {
-				return
-			}
-			list = append(list, chartInfoResp)
-		}*/
 	}
 	return
 }
@@ -336,10 +350,22 @@ func GetBalanceExcelEdbData(excelEdbMappingItem *excelModel.ExcelChartEdb, newMi
 	return
 }
 
-// 获取单个图表信息
-func GetBalanceExcelChartSingle(chartInfo *data_manage.ChartInfoView, lang string) (mappingListTmp []*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
+// 根据chartInfoId获取单个图表信息
+func GetBalanceExcelChartSingle(chartInfoId, ChartEdbId int, lang string) (mappingListTmp []*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
 	// 相关联指标
-	mappingListTmp, err = excelModel.GetExcelChartEdbMappingByChartInfoId(chartInfo.ChartInfoId)
+	if chartInfoId == 0 && ChartEdbId == 0 {
+		err = fmt.Errorf(" 获取图表,指标信息失败 Err:chartInfoId和ChartEdbId不能同时为空")
+		return
+	}
+	if chartInfoId == 0 {
+		chartEdb, e := excelModel.GetExcelChartEdbById(ChartEdbId)
+		if e != nil {
+			err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
+			return
+		}
+		chartInfoId = chartEdb.ChartInfoId
+	}
+	mappingListTmp, err = excelModel.GetExcelChartEdbMappingByChartInfoId(chartInfoId)
 	if err != nil {
 		errMsg = "获取失败"
 		err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
@@ -350,6 +376,26 @@ func GetBalanceExcelChartSingle(chartInfo *data_manage.ChartInfoView, lang strin
 		err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
 		return
 	}
+	dataListMap = make(map[int][]*data_manage.EdbDataList)
+	//查询库里是否有值
+	chartDataList, e := excelModel.GetExcelChartDataByChartInfoId(chartInfoId)
+	if e != nil {
+		err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
+		return
+	}
+	if len(chartDataList) > 0 {
+		for _, v := range chartDataList {
+			tmp := &data_manage.EdbDataList{
+				EdbDataId:     v.ExcelChartDataId,
+				EdbInfoId:     v.ExcelChartEdbId,
+				DataTime:      v.DataTime,
+				DataTimestamp: v.DataTimestamp,
+				Value:         v.Value,
+			}
+			dataListMap[v.ExcelChartEdbId] = append(dataListMap[v.ExcelChartEdbId], tmp)
+		}
+		return
+	}
 	excelInfoId := mappingListTmp[0].ExcelInfoId
 	// 查询所有子表
 	excelInfo, err := excelModel.GetExcelInfoById(excelInfoId)
@@ -368,7 +414,6 @@ func GetBalanceExcelChartSingle(chartInfo *data_manage.ChartInfoView, lang strin
 	if err != nil {
 		return
 	}
-	dataListMap = make(map[int][]*data_manage.EdbDataList)
 
 	for _, mapping := range mappingListTmp {
 		err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
@@ -450,3 +495,46 @@ func TransferBalanceExcelContentToStatic(excelDetail *excelModel.ExcelInfo, lang
 	newContent = string(newMixedTableByte)
 	return
 }
+
+func SyncBalanceEdbData(excelInfo *excelModel.ExcelInfo, balanceTableData [][]request.MixedTableCellDataReq) (err error) {
+	tmpMappingList, e := excelModel.GetExcelChartEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
+	if e != nil {
+		err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+		return
+	}
+	if len(tmpMappingList) == 0 {
+		return
+	}
+	excelDataMap := make(map[int][]*data_manage.EdbDataList)
+	excelEdbMap := make(map[int]*excelModel.ExcelChartEdb)
+	excelAllRows := len(balanceTableData)
+	excelAllCols := 0
+	newExcelDataMap := make(map[int]map[int]request.MixedTableCellDataReq)
+	for r, row := range balanceTableData {
+		tmp := len(row)
+		if tmp > excelAllCols {
+			excelAllCols = tmp
+		}
+		colMap := make(map[int]request.MixedTableCellDataReq)
+		for c, col := range row {
+			colMap[c] = col
+		}
+		newExcelDataMap[r] = colMap
+	}
+
+	for _, mapping := range tmpMappingList {
+		excelEdbMap[mapping.ExcelChartEdbId] = mapping
+		err, _ = GetBalanceExcelEdbData(mapping, newExcelDataMap, excelDataMap, excelAllRows, excelAllCols)
+		if err != nil {
+			err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
+			return
+		}
+	}
+	// 批量更新图表数据
+	err = excelModel.BatchUpdateChartEdbData(excelInfo.ExcelInfoId, excelEdbMap, excelDataMap)
+	if err != nil {
+		err = fmt.Errorf(" 批量更新图表数据失败 Err:%s", err.Error())
+		return
+	}
+	return
+}