浏览代码

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

xyxie 10 月之前
父节点
当前提交
fa559bb596

+ 187 - 2
controllers/data_manage/excel/balance_table.go

@@ -13,6 +13,7 @@ import (
 	excelService "eta/eta_api/services/data/excel"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
+	"fmt"
 	"strconv"
 	"strings"
 	"time"
@@ -877,8 +878,27 @@ func (c *ExcelInfoController) AddStaticExcel() {
 		br.IsSendEmail = false
 		return
 	}
-
-	excelInfo, err, errMsg, isSendEmail := excelService.AddBalanceStaticExcel(req.ExcelInfoId, req.VersionName, sysUser, 0)
+	// 查询出每个子表的内容,并将内容转为静态版本
+	//查询动态表所有的子表,并复制为静态表
+	condition := " AND parent_id = ? AND balance_type = 0 "
+	var pars []interface{}
+	pars = append(pars, req.ExcelInfoId)
+	childExcelList, err := excel.GetExcelInfoListByCondition(condition, pars)
+	if err != nil {
+		br.Msg = "获取子表失败"
+		br.ErrMsg = fmt.Sprintf("获取子表失败 %s", err.Error())
+		return
+	}
+	for k, childExcelInfo := range childExcelList {
+		content, e := excelService.TransferBalanceExcelContentToStatic(childExcelInfo, "")
+		if e != nil {
+			br.Msg = "动态内容转成静态失败"
+			br.ErrMsg = fmt.Sprintf("动态内容转成静态失败 %s", e.Error())
+			return
+		}
+		childExcelList[k].Content = content
+	}
+	excelInfo, err, errMsg, isSendEmail := data.AddBalanceStaticExcel(req.ExcelInfoId, req.VersionName, sysUser, 0, req.ExcelInfoId, 1, childExcelList)
 	if err != nil {
 		br.Msg = "复制失败"
 		if errMsg != `` {
@@ -899,3 +919,168 @@ func (c *ExcelInfoController) AddStaticExcel() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// BalanceVersionList
+// @Title 查询平衡表版本号列表
+// @Description 查询平衡表版本号列表
+// @Param	request	body request.EditExcelInfoReq true "type json string"
+// @Success 200 {object} response.AddExcelInfoResp
+// @router /excel_info/balance/version [get]
+func (c *ExcelInfoController) BalanceVersionList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	excelInfoId, _ := c.GetInt("ExcelInfoId")
+	if excelInfoId <= 0 {
+		br.Msg = "请选择表格"
+		br.ErrMsg = "ExcelInfoId未传"
+		br.IsSendEmail = false
+		return
+	}
+	excelInfo, err := excel.GetExcelInfoById(excelInfoId)
+	if err != nil {
+		br.Msg = "获取ETA表格失败"
+		br.ErrMsg = "获取ETA表格失败,Err:" + err.Error()
+		return
+	}
+	if excelInfo.Source != utils.BALANCE_TABLE {
+		br.Msg = "请选择平衡表"
+		return
+	}
+	if excelInfo.BalanceType != 0 && excelInfo.ParentId != 0 {
+		br.Msg = "请选择动态平衡表"
+		return
+	}
+	list := make([]*response.BalanceTableVersionListItem, 0)
+	list = append(list, &response.BalanceTableVersionListItem{
+		ExcelInfoId:    excelInfo.ExcelInfoId,
+		UniqueCode:     excelInfo.UniqueCode,
+		BalanceType:    excelInfo.BalanceType,
+		RelExcelInfoId: excelInfo.RelExcelInfoId,
+		VersionName:    "动态表", //todo 有个默认的版本名称
+	})
+	//查询动态表所有的子表,并复制为静态表
+	condition := " AND rel_excel_info_id=? AND parent_id = 0 AND balance_type = 1 "
+	var pars []interface{}
+	pars = append(pars, excelInfoId)
+
+	staticList, err := excel.GetNoContentExcelInfoListByConditionNoPage(condition, pars)
+	if err != nil {
+		br.Msg = "获取子表失败"
+		br.ErrMsg = fmt.Sprintf("获取子表失败 %s", err.Error())
+		return
+	}
+
+	for _, staticInfo := range staticList {
+		tmp := &response.BalanceTableVersionListItem{
+			ExcelInfoId:    staticInfo.ExcelInfoId,
+			UniqueCode:     staticInfo.UniqueCode,
+			BalanceType:    staticInfo.BalanceType,
+			RelExcelInfoId: staticInfo.RelExcelInfoId,
+			VersionName:    staticInfo.VersionName,
+		}
+		list = append(list, tmp)
+	}
+	ret := &response.BalanceTableVersionListResp{List: list}
+	br.Data = ret
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// ModifyBalanceExcelVersion
+// @Title 版本号重命名
+// @Description 版本号重命名
+// @Param	request	body request.AddBalanceStaticExcelInfoReq true "type json string"
+// @Success 200 {object} response.AddExcelInfoResp
+// @router /excel_info/balance/version/modify [post]
+func (c *ExcelInfoController) ModifyBalanceExcelVersion() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req request.AddBalanceStaticExcelInfoReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ExcelInfoId <= 0 {
+		br.Msg = "请传入ETA表格标识!"
+		return
+	}
+
+	req.VersionName = strings.Trim(req.VersionName, " ")
+	if req.VersionName == "" {
+		br.Msg = "请填写版本名称!"
+		br.IsSendEmail = false
+		return
+	}
+	excelInfo, err := excel.GetExcelInfoById(req.ExcelInfoId)
+	if err != nil {
+		br.Msg = "获取ETA表格失败"
+		br.ErrMsg = "获取ETA表格失败,Err:" + err.Error()
+		return
+	}
+	if excelInfo.Source != utils.BALANCE_TABLE {
+		br.Msg = "请选择平衡表"
+		return
+	}
+	if excelInfo.BalanceType != 1 && excelInfo.ParentId != 0 {
+		br.Msg = "请选择静态表"
+		return
+	}
+	// 检验分类下是否存在该版本号
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND rel_excel_info_id=? "
+		pars = append(pars, req.ExcelInfoId)
+
+		condition += " AND version_name=? "
+		pars = append(pars, req.VersionName)
+
+		count, tmpErr := excel.GetExcelInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			br.Msg = "查询版本号失败"
+			br.ErrMsg = tmpErr.Error()
+			return
+		}
+		if count > 0 {
+			br.Msg = "表格版本号已存在,请重新填写表格名称"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
+	excelInfo.ModifyTime = time.Now()
+	excelInfo.VersionName = req.VersionName
+	updateExcelInfoParams := []string{"ModifyTime", "VersionName"}
+	// 同步修改静态表中的图表和指标名称
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true
+}

+ 59 - 2
models/data_manage/excel/excel_info.go

@@ -230,13 +230,26 @@ func GetNoContentExcelInfoListByCondition(condition string, pars []interface{},
 	return
 }
 
-func GetExcelInfoByCondition(condition string, pars []interface{}) (item *ExcelInfo, err error) {
+func GetNoContentExcelInfoListByConditionNoPage(condition string, pars []interface{}) (items []*ExcelInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT excel_info_id,excel_classify_id,excel_name,
+             unique_code,sys_user_id,sys_user_real_name,sort,is_join_permission, parent_id, balance_type, update_user_id,update_user_real_name,rel_excel_info_id,version_name FROM excel_info WHERE is_delete=0 `
+	if condition != "" {
+		sql += condition
+	}
+
+	sql += ` ORDER BY excel_info_id DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetExcelInfoListByCondition(condition string, pars []interface{}) (items []*ExcelInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&item)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
@@ -669,3 +682,47 @@ func GetChildExcelInfoByParentId(parentId int) (items []*ExcelInfo, err error) {
 	_, err = o.Raw(sql, parentId).QueryRows(&items)
 	return
 }
+
+// ExcelInfoVersionRename 平衡表版本号重命名
+func ExcelInfoVersionRename(excelInfo *ExcelInfo, updateExcelInfoParams []string, excelEdbMappingList []*ExcelEdbMapping) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+		} else {
+			_ = o.Commit()
+		}
+	}()
+
+	// ETA表格信息变更
+	_, err = o.Update(excelInfo, updateExcelInfoParams...)
+	if err != nil {
+		return
+	}
+
+	// 同步更新图表数据
+	//更新父级分类时,同时更新子集分类
+	if excelInfo.Source == utils.BALANCE_TABLE && excelInfo.ParentId == 0 {
+		// 同步更新子表分类
+		sql := `UPDATE FROM excel_info set excel_classify_id = ? WHERE parent_id=? `
+		_, err = o.Raw(sql, excelInfo.ExcelClassifyId, excelInfo.ExcelInfoId).Exec()
+	}
+	// 删除关系表
+	sql := `DELETE FROM excel_edb_mapping WHERE excel_info_id=? `
+	_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+
+	// excel与指标的关联关系
+	dataNum := len(excelEdbMappingList)
+	if dataNum > 0 {
+		for k, v := range excelEdbMappingList {
+			v.ExcelInfoId = excelInfo.ExcelInfoId
+			excelEdbMappingList[k] = v
+		}
+		_, err = o.InsertMulti(dataNum, excelEdbMappingList)
+	}
+
+	return
+}

+ 12 - 0
models/data_manage/excel/response/excel_info.go

@@ -101,3 +101,15 @@ type BalanceChildTableResp struct {
 type BalanceTableWorkerResp struct {
 	List []*excel2.ExcelWorker
 }
+
+type BalanceTableVersionListItem struct {
+	ExcelInfoId    int    `description:"表格id"`
+	UniqueCode     string `description:"表格唯一编码"`
+	BalanceType    int    `description:"平衡表类型:0 动态表,1静态表"`
+	RelExcelInfoId int    `description:"平衡表里静态表关联的动态表excel id"`
+	VersionName    string `description:"静态表版本名称"`
+}
+
+type BalanceTableVersionListResp struct {
+	List []*BalanceTableVersionListItem
+}

+ 18 - 0
routers/commentsRouter.go

@@ -862,6 +862,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"],
+        beego.ControllerComments{
+            Method: "AddStaticExcel",
+            Router: `/excel_info/balance/static/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"],
+        beego.ControllerComments{
+            Method: "BalanceVersionList",
+            Router: `/excel_info/balance/version`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"],
         beego.ControllerComments{
             Method: "GetBaseEdbInfo",

+ 311 - 0
services/data/chart_info_excel_balance.go

@@ -1198,3 +1198,314 @@ func getBalanceDataListStartDateAndValue(dataList []*data_manage.EdbDataList) (s
 	}
 	return
 }
+
+// AddBalanceStaticExcel 另存为和存为静态表以及子表的复制都调用该接口
+func AddBalanceStaticExcel(oldExcelInfoId int, versionName string, sysUser *system.Admin, parentId, relExcelInfoId, balanceType int, childExcelList []*excelModel.ExcelInfo) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	versionName = utils.TrimLRStr(versionName)
+
+	// 获取原ETA表格信息
+	oldExcelInfo, err := excelModel.GetExcelInfoById(oldExcelInfoId)
+	if err != nil {
+		errMsg = "获取ETA表格失败"
+		return
+	}
+
+	// todo 操作权限校验
+	{
+		// 数据权限
+		/*haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(oldExcelInfo.ExcelInfoId, oldExcelInfo.ExcelClassifyId, oldExcelInfo.IsJoinPermission, sysUser.AdminId)
+		if err != nil {
+			errMsg = "获取ETA表格权限失败"
+			err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		button := GetExcelInfoOpButton(sysUser, oldExcelInfo.SysUserId, oldExcelInfo.Source, haveOperaAuth)
+		if !button.CopyButton {
+			errMsg = "无操作权限"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}*/
+	}
+
+	// 检验分类下是否存在该表格名称
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND rel_excel_info_id=? "
+		pars = append(pars, oldExcelInfoId)
+
+		condition += " AND version_name=? "
+		pars = append(pars, versionName)
+
+		count, tmpErr := excelModel.GetExcelInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "查询版本号失败"
+			err = tmpErr
+			return
+		}
+		if count > 0 {
+			errMsg = "表格版本号已存在,请重新填写表格名称"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+	}
+
+	// 表格信息
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	excelName := oldExcelInfo.ExcelName
+	if parentId == 0 {
+		excelName += "(" + versionName + ")"
+	}
+
+	// 处理表格内容, 静态表去除动态指标关联
+	content := oldExcelInfo.Content
+	excelInfo = &excelModel.ExcelInfo{
+		//ExcelInfoId:     0,
+		ExcelName:          excelName,
+		Source:             oldExcelInfo.Source,
+		ExcelType:          oldExcelInfo.ExcelType,
+		UniqueCode:         utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
+		ExcelClassifyId:    oldExcelInfo.ExcelClassifyId,
+		SysUserId:          sysUser.AdminId,
+		SysUserRealName:    sysUser.RealName,
+		Content:            content,
+		ExcelImage:         oldExcelInfo.ExcelImage,
+		FileUrl:            oldExcelInfo.FileUrl,
+		ParentId:           parentId,
+		RelExcelInfoId:     relExcelInfoId,
+		VersionName:        versionName,
+		UpdateUserId:       sysUser.AdminId,
+		UpdateUserRealName: sysUser.AdminName,
+		BalanceType:        balanceType,
+		Sort:               0,
+		IsDelete:           0,
+		ModifyTime:         time.Now(),
+		CreateTime:         time.Now(),
+	}
+
+	excelEdbMappingList := make([]*excelModel.ExcelEdbMapping, 0)
+	if balanceType == 1 {
+		// 获取excel与指标的关系表
+		excelEdbMappingList, err = excelModel.GetAllExcelEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
+		if err != nil {
+			errMsg = "获取失败"
+			return
+		}
+		for k, v := range excelEdbMappingList {
+			v.ExcelEdbMappingId = 0
+			v.ExcelInfoId = 0
+			excelEdbMappingList[k] = v
+		}
+	}
+
+	var childExcel *excelModel.ExcelInfo
+	err = excelModel.AddExcelInfo(excelInfo, excelEdbMappingList, childExcel)
+	if err != nil {
+		errMsg = "保存失败"
+		return
+	}
+	if parentId == 0 && len(childExcelList) > 0 {
+		for _, childExcelInfo := range childExcelList {
+			_, err, errMsg, isSendEmail = AddBalanceStaticExcel(childExcelInfo.ExcelInfoId, "", sysUser, excelInfo.ExcelInfoId, relExcelInfoId, balanceType, []*excelModel.ExcelInfo{})
+			if err != nil {
+				return
+			}
+		}
+	} else if parentId > 0 {
+		// 如果复制的是动态表的子表,则同步复制关联的图表
+		// 查出所有的chart_list, 同步复制图表和图表指标
+		// 相关联指标
+		mappingListTmp, e := excelModel.GetExcelChartEdbMappingByExcelInfoId(oldExcelInfo.ExcelInfoId)
+		if e != nil {
+			errMsg = "获取图表指标失败"
+			err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
+			return
+		}
+		mappingListMap := make(map[int][]*excelModel.ExcelChartEdb, 0)
+		charInfoIds := make([]int, 0)
+		for k, _ := range mappingListTmp {
+			mappingListTmp[k].ExcelInfoId = excelInfo.ExcelInfoId
+			mappingListMap[mappingListTmp[k].ChartInfoId] = append(mappingListMap[mappingListTmp[k].ChartInfoId], mappingListTmp[k])
+		}
+		for k, _ := range mappingListMap {
+			charInfoIds = append(charInfoIds, k)
+		}
+		if len(charInfoIds) > 0 {
+			chartInfoList, e := data_manage.GetChartInfoViewByIdList(charInfoIds)
+			if e != nil {
+				errMsg = "获取失败"
+				err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
+				return
+			}
+			for _, chartInfo := range chartInfoList {
+				mappingList, ok := mappingListMap[chartInfo.ChartInfoId]
+				if !ok {
+					err = fmt.Errorf("未找到图表关联的指标信息")
+					return
+				}
+				err, errMsg, isSendEmail = CopyBalanceExcelChart(chartInfo, mappingList, versionName, sysUser)
+				if err != nil {
+					err = fmt.Errorf("复制图表失败 Err:%s", err.Error())
+					return
+				}
+			}
+		}
+	}
+	return
+}
+
+// CopyBalanceExcelChart 复制平衡表图表
+func CopyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, oldChartEdbList []*excelModel.ExcelChartEdb, versionName string, sysUser *system.Admin) (err error, errMsg string, isSendEmail bool) {
+	chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
+	if versionName != "" {
+		oldChartInfo.ChartName += "(" + versionName + ")"
+	}
+	for _, chartEdb := range oldChartEdbList {
+		excelEdb := new(excelModel.ExcelChartEdb)
+		excelEdb.EdbName = chartEdb.EdbName
+		if versionName != "" {
+			excelEdb.EdbName += "(" + versionName + ")"
+		}
+		randStr := utils.GetRandDigit(4)
+		excelEdb.EdbCode = `T` + time.Now().Format("060102150405") + "_" + randStr
+		excelEdb.ExcelInfoId = chartEdb.ExcelInfoId
+		excelEdb.DateSequence = chartEdb.DateSequence
+		excelEdb.DataSequence = chartEdb.DataSequence
+		excelEdb.SysUserId = sysUser.AdminId
+		excelEdb.SysUserRealName = sysUser.RealName
+		excelEdb.MaxData = chartEdb.MaxData
+		excelEdb.MinData = chartEdb.MinData
+		excelEdb.IsOrder = chartEdb.IsOrder
+		excelEdb.IsAxis = chartEdb.IsAxis
+		excelEdb.FromTag = chartEdb.FromTag
+		excelEdb.EdbInfoType = chartEdb.EdbInfoType
+		excelEdb.LeadValue = chartEdb.LeadValue
+		excelEdb.LeadUnit = chartEdb.LeadUnit
+		excelEdb.CreateTime = time.Now()
+		excelEdb.ModifyTime = time.Now()
+		var dateList []string
+		var dataList []float64
+		// todo 是否需要存储静态表的数据
+
+		// 处理日期列表和值列表
+		addItem := &excelModel.AddChartEdbAndDataItem{
+			ChartEdb: excelEdb,
+			DateList: dateList,
+			ValList:  dataList,
+		}
+		chartEdbList = append(chartEdbList, addItem)
+	}
+	chartInfo, err, errMsg, isSendEmail := copyBalanceExcelChart(oldChartInfo, sysUser.AdminId, sysUser.RealName)
+	if err != nil {
+		errMsg = "新增图表失败!"
+		err = fmt.Errorf("新增图表失败!%s, %s", errMsg, err.Error())
+		return
+	}
+	obj := new(excelModel.ExcelChartEdb)
+	err = obj.AddChartEdbAndData(chartEdbList, chartInfo, []int{})
+	if err != nil {
+		errMsg = "新增图表失败!"
+		err = fmt.Errorf("新增图表数据失败!%s", err.Error())
+		return
+	}
+	return
+}
+
+func copyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, sysUserId int, sysUserRealName string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true // 默认错误的时候要发送邮件
+
+	oldChartInfo.ChartName = strings.Trim(oldChartInfo.ChartName, " ")
+	if oldChartInfo.ChartName == "" {
+		errMsg = "请填写图表名称!"
+		err = fmt.Errorf(errMsg)
+		isSendEmail = false
+		return
+	}
+	//判断图表是否存在
+	var condition string
+	var pars []interface{}
+
+	// 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
+	condition += " AND chart_classify_id=0 "
+
+	condition += " AND chart_name=? AND source = ? "
+	pars = append(pars, oldChartInfo.ChartName, utils.CHART_SOURCE_BALANCE_EXCEL)
+
+	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断图表名称是否存在失败"
+		err = fmt.Errorf("判断图表名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "图表已存在,请重新填写"
+		err = fmt.Errorf("判断图表名称是否存在失败")
+		isSendEmail = false
+		return
+	}
+
+	chartInfo = new(data_manage.ChartInfo)
+	chartInfo.ChartName = oldChartInfo.ChartName
+	//chartInfo.EdbInfoIds = edbInfoIdStr
+	//chartInfo.ChartClassifyId = req.ChartClassifyId
+	chartInfo.SysUserId = sysUserId
+	chartInfo.SysUserRealName = sysUserRealName
+	chartInfo.CreateTime = time.Now()
+	chartInfo.ModifyTime = time.Now()
+	chartInfo.IsSetName = 0
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
+
+	// todo 判断是否需要重新计算用户的start_date
+	chartInfo.DateType = oldChartInfo.DateType
+	chartInfo.ChartType = oldChartInfo.ChartType
+	chartInfo.Calendar = oldChartInfo.Calendar
+	/*	chartInfo.StartDate = req.StartDate
+		chartInfo.EndDate = req.EndDate
+		chartInfo.SeasonStartDate = req.StartDate
+		chartInfo.SeasonEndDate = req.EndDate*/
+	chartInfo.LeftMin = oldChartInfo.LeftMin
+	chartInfo.LeftMax = oldChartInfo.LeftMax
+	chartInfo.RightMin = oldChartInfo.RightMin
+	chartInfo.RightMax = oldChartInfo.RightMax
+	chartInfo.Right2Min = oldChartInfo.Right2Min
+	chartInfo.Right2Max = oldChartInfo.Right2Max
+	chartInfo.MinMaxSave = oldChartInfo.MinMaxSave
+	//chartInfo.Disabled = disableVal
+	//chartInfo.BarConfig = barChartConf
+	chartInfo.ExtraConfig = oldChartInfo.ExtraConfig
+	chartInfo.SeasonExtraConfig = oldChartInfo.SeasonExtraConfig
+	//chartInfo.StartYear = req.StartYear
+	chartInfo.Source = utils.CHART_SOURCE_BALANCE_EXCEL
+	chartInfo.ChartThemeId = oldChartInfo.ChartThemeId
+	chartInfo.SourcesFrom = oldChartInfo.SourcesFrom
+	/*	chartInfo.Instructions = req.Instructions
+		chartInfo.MarkersLines = req.MarkersLines
+		chartInfo.MarkersAreas = req.MarkersAreas
+		chartInfo.Unit = req.Unit
+		chartInfo.UnitEn = req.UnitEn*/
+	/*newId, err := data_manage.AddChartInfo(chartInfo)
+	if err != nil {
+		errMsg = `保存失败`
+		err = fmt.Errorf("保存失败,Err:" + err.Error())
+		return
+	}
+	chartInfo.ChartInfoId = int(newId)*/
+
+	//添加es数据
+	//go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
+
+	return
+}
+
+// HandleBalanceExcelContentToStatic 将动态表的内容转化为静态表
+func HandleBalanceExcelContentToStatic(oldContent string) (content string, err error) {
+
+	return
+}

+ 47 - 87
services/data/excel/balance_table.go

@@ -6,7 +6,6 @@ import (
 	"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/models/system"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/xuri/excelize/v2"
@@ -467,111 +466,72 @@ func GetBalanceExcelChartSingle(chartInfo *data_manage.ChartInfoView, lang strin
 	return
 }
 
-// AddBalanceStaticExcel 另存为静态表
-func AddBalanceStaticExcel(oldExcelInfoId int, versionName string, sysUser *system.Admin, parentId int) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
-	isSendEmail = true
-
-	versionName = utils.TrimLRStr(versionName)
-
-	// 获取原ETA表格信息
-	oldExcelInfo, err := excelModel.GetExcelInfoById(oldExcelInfoId)
+// TransferBalanceExcelContentToStatic 将平衡表动态表的内容转换为静态表的格式
+func TransferBalanceExcelContentToStatic(excelDetail *excelModel.ExcelInfo, lang string) (newContent string, err error) {
+	var mixedTableReq request.MixedTableReq
+	err = json.Unmarshal([]byte(excelDetail.Content), &mixedTableReq)
 	if err != nil {
-		errMsg = "获取ETA表格失败"
+		err = errors.New("表格json转结构体失败,Err:" + err.Error())
 		return
 	}
 
-	// todo 操作权限校验
-	{
-		// 数据权限
-		/*haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(oldExcelInfo.ExcelInfoId, oldExcelInfo.ExcelClassifyId, oldExcelInfo.IsJoinPermission, sysUser.AdminId)
+	cellRelationConf := mixedTableReq.CellRelation
+	//config := mixedTableReq.Data
+	// 单元格关系配置x信息
+	cellRelationConfMap := make(map[string]request.CellRelationConf)
+	cellRelationConfList := make([]request.CellRelationConf, 0)
+	cellRelationConfNewList := make([]request.CellRelationConf, 0)
+	if cellRelationConf != `` {
+		err = json.Unmarshal([]byte(cellRelationConf), &cellRelationConfList)
 		if err != nil {
-			errMsg = "获取ETA表格权限失败"
-			err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
 			return
 		}
 
-		button := GetExcelInfoOpButton(sysUser, oldExcelInfo.SysUserId, oldExcelInfo.Source, haveOperaAuth)
-		if !button.CopyButton {
-			errMsg = "无操作权限"
-			err = errors.New(errMsg)
-			isSendEmail = false
-			return
-		}*/
-	}
-
-	// 检验分类下是否存在该表格名称
-	{
-		var condition string
-		var pars []interface{}
-		condition += " AND rel_excel_info_id=? "
-		pars = append(pars, oldExcelInfoId)
-
-		condition += " AND version_name=? "
-		pars = append(pars, versionName)
-
-		count, tmpErr := excelModel.GetExcelInfoCountByCondition(condition, pars)
-		if tmpErr != nil {
-			errMsg = "判断表格名称是否存在失败"
-			err = tmpErr
-			return
-		}
-		if count > 0 {
-			errMsg = "表格名称已存在,请重新填写表格名称"
-			err = errors.New(errMsg)
-			isSendEmail = false
-			return
+		for _, v := range cellRelationConfList {
+			if v.Type == request.EdbDT || v.Type == request.InsertDataDT || v.Type == request.PopInsertDataDT || v.Type == request.InsertEdbCalculateDataDT || v.Type == request.DateCalculateDataDT {
+				cellRelationConfNewList = append(cellRelationConfNewList, v)
+			}
 		}
 	}
 
-	// 表格信息
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	excelInfo = &excelModel.ExcelInfo{
-		//ExcelInfoId:     0,
-		ExcelName:          oldExcelInfo.ExcelName + "(" + versionName + ")",
-		Source:             oldExcelInfo.Source,
-		ExcelType:          oldExcelInfo.ExcelType,
-		UniqueCode:         utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
-		ExcelClassifyId:    oldExcelInfo.ExcelClassifyId,
-		SysUserId:          sysUser.AdminId,
-		SysUserRealName:    sysUser.RealName,
-		Content:            oldExcelInfo.Content,
-		ExcelImage:         oldExcelInfo.ExcelImage,
-		FileUrl:            oldExcelInfo.FileUrl,
-		RelExcelInfoId:     oldExcelInfoId,
-		VersionName:        versionName,
-		UpdateUserId:       sysUser.AdminId,
-		UpdateUserRealName: sysUser.AdminName,
-		BalanceType:        1,
-		Sort:               0,
-		IsDelete:           0,
-		ModifyTime:         time.Now(),
-		CreateTime:         time.Now(),
+	cellRelationConfByte, err := json.Marshal(cellRelationConfNewList)
+	if err != nil {
+		err = fmt.Errorf("cellRelationConf json转结构体失败,Err:%s", err.Error())
+		return
 	}
+	cellRelationConf = string(cellRelationConfByte)
 
-	// 获取excel与指标的关系表
-	list, tmpErr := excelModel.GetAllExcelEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
+	newData, tmpErr, tmpErrMsg := GetMixedTableCellData(mixedTableReq)
 	if tmpErr != nil {
-		errMsg = "获取失败"
-		err = tmpErr
+		err = errors.New(tmpErrMsg + "获取最新的数据失败 ,Err:" + tmpErr.Error())
 		return
 	}
-	for k, v := range list {
-		v.ExcelEdbMappingId = 0
-		v.ExcelInfoId = 0
-		list[k] = v
+	for r, row := range newData {
+		for c, cell := range row {
+			// todo 系统日期类型,原先是不可编辑,转成静态表之后是否变成可编辑
+			cell.EdbInfoId = 0
+			if cell.DataType != request.FormulateCalculateDataDT { //除了公式计算,其他类型都转成自定义类型
+				cell.DataType = request.CustomTextDT //除了计算公式的关联关系被保留,其余绑定关系都删除
+				if _, ok := cellRelationConfMap[cell.Uid]; ok {
+					delete(cellRelationConfMap, cell.Uid)
+				}
+			}
+			if cell.DataTime != "" {
+				cell.DataTimeType = request.CustomDateT
+			}
+			cell.Value = cell.ShowValue
+			row[c] = cell
+		}
+		newData[r] = row
 	}
-	var childExcel *excelModel.ExcelInfo
-	err = excelModel.AddExcelInfo(excelInfo, list, childExcel)
+	var newMixedTableReq request.MixedTableReq
+	newMixedTableReq.CellRelation = cellRelationConf
+	newMixedTableReq.Data = newData
+	newMixedTableByte, err := json.Marshal(newMixedTableReq)
 	if err != nil {
-		errMsg = "保存失败"
+		err = fmt.Errorf("newData json转结构体失败,Err:%s", err.Error())
 		return
 	}
-	if parentId == 0 {
-		//查询动态表所有的子表,并复制为静态表
-
-	} else if parentId > 0 {
-		// 如果复制的是动态表的子表,则同步复制关联的图表
-
-	}
+	newContent = string(newMixedTableByte)
 	return
 }