Browse Source

feat:新增跨品种分析的添加、编辑接口

Roc 1 year ago
parent
commit
9de32fa880

+ 335 - 4
controllers/data_manage/cross_variety/chart_info.go

@@ -12,6 +12,7 @@ import (
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
 	"strings"
+	"time"
 )
 
 // ChartInfoController
@@ -21,14 +22,14 @@ type ChartInfoController struct {
 }
 
 // List
-// @Title 相关性图表列表接口
-// @Description 相关性图表列表接口
+// @Title 跨品种分析图表列表接口
+// @Description 跨品种分析图表列表接口
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   ChartClassifyId   query   int  true       "分类id"
 // @Param   Keyword   query   string  true       "搜索关键词"
 // @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
-// @Param   Source   query   int  true       "图表类型,3:相关性,4:滚动相关性"
+// @Param   Source   query   int  true       "图表类型,10:跨品种分析
 // @Success 200 {object} data_manage.ChartListResp
 // @router /chart_info/list [get]
 func (c *ChartInfoController) List() {
@@ -238,6 +239,11 @@ func (c *ChartInfoController) Preview() {
 		br.IsSendEmail = false
 		return
 	}
+	if req.CalculateUnit == `` {
+		br.Msg = "请设置时间频度"
+		br.IsSendEmail = false
+		return
+	}
 
 	// 品种配置
 	varietyListList := len(req.VarietyList)
@@ -261,7 +267,7 @@ func (c *ChartInfoController) Preview() {
 	}
 
 	chartInfo := new(data_manage.ChartInfoView)
-	chartInfo.ChartType = 9
+	chartInfo.ChartType = utils.CHART_SOURCE_CROSS_HEDGING
 
 	// 获取图表x轴y轴
 	_, dataResp, err, errMsg, isSendEmail := cross_variety.GetChartData(0, req)
@@ -279,3 +285,328 @@ func (c *ChartInfoController) Preview() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// Add
+// @Title 新增图表接口
+// @Description 新增图表接口
+// @Param	request	body request.AddChartInfoReq true "type json string"
+// @Success 200 {object} data_manage.AddChartInfoResp
+// @router /chart_info/add [post]
+func (c *ChartInfoController) Add() {
+	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
+	}
+
+	cacheKey := "CACHE_CHART_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
+		return
+	}
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+	}()
+
+	var req request.AddChartReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 添加图表
+	chartInfo, err, errMsg, isSendEmail := cross_variety.AddChartInfo(req, utils.CHART_SOURCE_CROSS_HEDGING, sysUser)
+	if err != nil {
+		br.Msg = "保存失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartInfoId = chartInfo.ChartInfoId
+		chartLog.ChartName = req.ChartName
+		chartLog.ChartClassifyId = chartInfo.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartInfo.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(c.Ctx.Input.RequestBody)
+		chartLog.Status = "新增跨品种分析图表"
+		chartLog.Method = c.Ctx.Input.URI()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	resp := new(data_manage.AddChartInfoResp)
+	resp.ChartInfoId = chartInfo.ChartInfoId
+	resp.UniqueCode = chartInfo.UniqueCode
+	resp.ChartType = chartInfo.ChartType
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+}
+
+// Edit
+// @Title 编辑图表接口
+// @Description 编辑图表接口
+// @Param	request	body request.EditChartInfoReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /chart_info/edit [post]
+func (c *ChartInfoController) Edit() {
+	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.EditChartReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	chartItem, err, errMsg, isSendEmail := cross_variety.EditChartInfo(req, sysUser)
+	if err != nil {
+		br.Msg = "保存失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	resp := new(data_manage.AddChartInfoResp)
+	resp.ChartInfoId = chartItem.ChartInfoId
+	resp.UniqueCode = chartItem.UniqueCode
+	//resp.ChartType = req.ChartType
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(c.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑跨品种分析图表"
+		chartLog.Method = c.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+}
+
+//
+//// Detail
+//// @Title 获取图表详情
+//// @Description 获取图表详情接口
+//// @Param   ChartInfoId   query   int  true       "图表id"
+//// @Param   DateType   query   int  true       "日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"
+//// @Param   StartDate   query   string  true       "自定义开始日期"
+//// @Param   EndDate   query   string  true       "自定义结束日期"
+//// @Param   Calendar   query   string  true       "公历/农历"
+//// @Param   SeasonStartDate   query   string  true       "季节性图开始日期"
+//// @Param   SeasonEndDate   query   string  true       "季节性图结束日期"
+//// @Param   EdbInfoId   query   string  true       "指标ID,多个用英文逗号隔开"
+//// @Param   ChartType   query   int  true       "生成样式:1:曲线图,2:季节性图"
+//// @Success 200 {object} data_manage.ChartInfoDetailResp
+//// @router /chart_info/detail [get]
+//func (c *ChartInfoController) Detail() {
+//	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
+//	}
+//	chartInfoId, _ := c.GetInt("ChartInfoId")
+//	if chartInfoId <= 0 {
+//		br.Msg = "参数有误"
+//		return
+//	}
+//
+//	var err error
+//	chartInfo := new(data_manage.ChartInfoView)
+//	chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId)
+//	if err != nil {
+//		if err.Error() == utils.ErrNoRow() {
+//			br.Msg = "图被删除,请刷新页面"
+//			br.ErrMsg = "图被删除,请刷新页面,Err:" + err.Error()
+//			return
+//		}
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	// 相关性图表信息
+//	correlationChart := new(data_manage.ChartInfoCorrelation)
+//	if e := correlationChart.GetItemById(chartInfoId); e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取图表相关性信息失败, Err: " + e.Error()
+//		return
+//	}
+//
+//	// 获取指标信息
+//	edbInfoMappingA, e := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
+//	if e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取相关性图表, A指标mapping信息失败, Err:" + e.Error()
+//		return
+//	}
+//	edbInfoMappingB, e := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
+//	if e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取相关性图表, B指标mapping信息失败, Err:" + e.Error()
+//		return
+//	}
+//
+//
+//
+//	// 获取图表x轴y轴
+//	_, dataResp, err, errMsg, isSendEmail := cross_variety.GetChartData(0, req)
+//
+//	var dataResp interface{} // 绘图数据返回(目前是滚动相关性的图)
+//	var xEdbIdValue []int
+//	var yDataList []data_manage.YData
+//	switch chartInfo.Source {
+//	case utils.CHART_SOURCE_CORRELATION: // 相关性图
+//		moveUnitDays, ok := utils.FrequencyDaysMap[correlationChart.CalculateUnit]
+//		if !ok {
+//			br.Msg = "错误的分析周期"
+//			br.IsSendEmail = false
+//			return
+//		}
+//		startDate := time.Now().AddDate(0, 0, -correlationChart.CalculateValue*moveUnitDays).Format(utils.FormatDate)
+//		endDate := time.Now().Format(utils.FormatDate)
+//
+//		xEdbIdValue, yDataList, e = correlationServ.GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, startDate, endDate)
+//		if e != nil {
+//			br.Msg = "获取失败"
+//			br.ErrMsg = "获取相关性图表, 图表计算值失败, Err:" + e.Error()
+//			return
+//		}
+//	case utils.CHART_SOURCE_ROLLING_CORRELATION: // 滚动相关性图
+//		startDate, endDate := utils.GetDateByDateType(correlationChart.DateType, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
+//		dataResp, e = correlationServ.GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.CalculateValue, correlationChart.CalculateUnit, startDate, endDate, chartInfo.ChartName, chartInfo.ChartNameEn)
+//		if e != nil {
+//			br.Msg = "获取失败"
+//			br.ErrMsg = "获取滚动相关性图表, 图表计算值失败, Err:" + e.Error()
+//			return
+//		}
+//	}
+//
+//	// 完善指标信息
+//	edbList, e := correlationServ.GetChartEdbInfoFormat(chartInfo.ChartInfoId, edbInfoMappingA, edbInfoMappingB)
+//	if e != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取相关性图表, 完善指标信息失败, Err:" + e.Error()
+//		return
+//	}
+//	correlationInfo := new(data_manage.CorrelationInfo)
+//	correlationInfo.LeadValue = correlationChart.LeadValue
+//	correlationInfo.LeadUnit = correlationChart.LeadUnit
+//	correlationInfo.CalculateValue = correlationChart.CalculateValue
+//	correlationInfo.CalculateUnit = correlationChart.CalculateUnit
+//	correlationInfo.StartDate = correlationChart.StartDate.Format(utils.FormatDate)
+//	correlationInfo.EndDate = correlationChart.EndDate.Format(utils.FormatDate)
+//	correlationInfo.LeadValue = correlationChart.LeadValue
+//	correlationInfo.EdbInfoIdFirst = correlationChart.EdbInfoIdFirst
+//	correlationInfo.EdbInfoIdSecond = correlationChart.EdbInfoIdSecond
+//
+//	// 判断是否加入我的图库
+//	if chartInfoId > 0 && chartInfo != nil {
+//		{
+//			var myChartCondition string
+//			var myChartPars []interface{}
+//			myChartCondition += ` AND a.admin_id=? `
+//			myChartPars = append(myChartPars, sysUser.AdminId)
+//			myChartCondition += ` AND a.chart_info_id=? `
+//			myChartPars = append(myChartPars, chartInfo.ChartInfoId)
+//
+//			myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
+//			if err != nil && err.Error() != utils.ErrNoRow() {
+//				br.Msg = "获取失败"
+//				br.ErrMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+//				return
+//			}
+//			if myChartList != nil && len(myChartList) > 0 {
+//				chartInfo.IsAdd = true
+//				chartInfo.MyChartId = myChartList[0].MyChartId
+//				chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+//			}
+//		}
+//	}
+//
+//	//图表操作权限
+//	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+//	//判断是否需要展示英文标识
+//	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
+//	chartInfo.UnitEn = edbInfoMappingA.UnitEn
+//
+//	isSaveAs := true
+//	if chartInfo.Source == utils.CHART_SOURCE_ROLLING_CORRELATION {
+//		isSaveAs = false
+//	}
+//	// 另存为
+//	chartInfo.Button = data_manage.ChartViewButton{
+//		IsEdit:    chartInfo.IsEdit,
+//		IsEnChart: chartInfo.IsEnChart,
+//		IsAdd:     chartInfo.IsAdd,
+//		IsCopy:    isSaveAs,
+//		IsSetName: chartInfo.IsSetName,
+//	}
+//
+//	resp := new(data_manage.ChartInfoDetailResp)
+//	resp.ChartInfo = chartInfo
+//	resp.EdbInfoList = edbList
+//	resp.XEdbIdValue = xEdbIdValue
+//	resp.YDataList = yDataList
+//	resp.CorrelationChartInfo = correlationInfo
+//	resp.DataResp = dataResp
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}

+ 10 - 1
controllers/data_manage/cross_variety/tag.go

@@ -338,8 +338,17 @@ func (c *TagController) SaveVarietyEdb() {
 		return
 	}
 
+	// 过滤未配置的品种
+	varietyEdbList := make([]request.VarietyEdbReq, 0)
+	for _, v := range req.VarietyEdb {
+		if v.EdbInfoId <= 0 {
+			continue
+		}
+		varietyEdbList = append(varietyEdbList, v)
+	}
+
 	// 保存配置
-	err = cross_variety.SaveVarietyEdb(req.ChartTagId, req.VarietyEdb, c.SysUser.AdminId, c.SysUser.RealName)
+	err = cross_variety.SaveVarietyEdb(req.ChartTagId, varietyEdbList, c.SysUser.AdminId, c.SysUser.RealName)
 	if err != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "保存失败,ERR:" + err.Error()

+ 15 - 0
models/data_manage/chart_classify.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
@@ -294,3 +295,17 @@ func GetAllChartClassifyItemsBySource(source int) (items []*ChartClassifyItems,
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 }
+
+// GetCrossVarietyChartClassifyBySysUserId
+// @Description: 根据创建人获取跨品种分析的分类
+// @author: Roc
+// @datetime 2023-11-24 14:05:43
+// @param sysUserId int
+// @return item *ChartClassify
+// @return err error
+func GetCrossVarietyChartClassifyBySysUserId(sysUserId int) (item *ChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_classify WHERE source = ? AND sys_user_id=?`
+	err = o.Raw(sql, utils.CHART_SOURCE_CROSS_HEDGING, sysUserId).QueryRow(&item)
+	return
+}

+ 178 - 0
models/data_manage/cross_variety/chart_info_cross_variety.go

@@ -0,0 +1,178 @@
+package cross_variety
+
+import (
+	"eta/eta_api/models/data_manage"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// ChartInfoCrossVariety
+// @Description: 跨品种分析配置表
+type ChartInfoCrossVariety struct {
+	Id             int       `orm:"column(id);pk"`
+	ChartInfoId    int       `description:"图表id"`
+	ChartXTagId    int       `description:"X轴的标签ID"`
+	ChartYTagId    int       `description:"X轴的标签ID"`
+	CalculateValue int       `description:"计算窗口"`
+	CalculateUnit  string    `description:"计算频度"`
+	ModifyTime     time.Time `description:"修改时间"`
+	CreateTime     time.Time `description:"创建时间"`
+}
+
+// GetChartInfoCrossVarietyByChartInfoId
+// @Description: 根据图表id获取跨品种分析配置信息
+// @author: Roc
+// @datetime 2023-11-24 14:34:50
+// @param id int
+// @return item *ChartInfoCrossVariety
+// @return err error
+func GetChartInfoCrossVarietyByChartInfoId(id int) (item *ChartInfoCrossVariety, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_info_cross_variety WHERE chart_info_id = ?`
+	err = o.Raw(sql, id).QueryRow(&item)
+
+	return
+}
+
+// CreateChart
+// @Description: 新增跨品种图表
+// @author: Roc
+// @datetime 2023-11-24 14:27:31
+// @param chartInfo *data_manage.ChartInfo
+// @param classify *data_manage.ChartClassify
+// @param chartVarietyMappingList []*ChartVarietyMapping
+// @param chartInfoCrossVariety *ChartInfoCrossVariety
+// @return chartInfoId int
+// @return err error
+func CreateChart(chartInfo *data_manage.ChartInfo, classify *data_manage.ChartClassify, chartVarietyMappingList []*ChartVarietyMapping, chartInfoCrossVariety *ChartInfoCrossVariety) (chartInfoId int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+		} else {
+			_ = tx.Commit()
+		}
+	}()
+
+	// 判断是否分类已存在,不存在的话,先添加分类
+	if classify.ChartClassifyId <= 0 {
+		newId, tmpErr := tx.Insert(classify)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		classify.ChartClassifyId = int(newId)
+	}
+
+	// 新增图表信息
+	chartInfo.ChartClassifyId = classify.ChartClassifyId
+	newId, err := tx.Insert(chartInfo)
+	if err != nil {
+		return
+	}
+	// 品种列表
+	chartInfo.ChartInfoId = int(newId)
+	chartInfoId = int(newId)
+
+	if len(chartVarietyMappingList) > 0 {
+		for i := range chartVarietyMappingList {
+			chartVarietyMappingList[i].ChartInfoId = chartInfoId
+		}
+		_, err = tx.InsertMulti(len(chartVarietyMappingList), chartVarietyMappingList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 图表配置
+	chartInfoCrossVariety.ChartInfoId = chartInfoId
+	if _, err = tx.Insert(chartInfoCrossVariety); err != nil {
+		return
+	}
+
+	return
+}
+
+// EditChart 修改相关性图表的 图表与指标 的关系
+func EditChart(chartInfo *data_manage.ChartInfo, chartVarietyMappingList []*ChartVarietyMapping, chartInfoCrossVariety *ChartInfoCrossVariety, chartUpdateCols, chartInfoCrossVarietyUpdateCols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 更新图表信息
+	_, err = to.Update(chartInfo, chartUpdateCols...)
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+
+	// 查找现有的品种列表
+	currVarietyMappingList := make([]*ChartVarietyMapping, 0)
+	sql := `SELECT * FROM chart_variety_mapping WHERE chart_info_id = ? `
+	_, err = o.Raw(sql, chartInfo.ChartInfoId).QueryRows(&currVarietyMappingList)
+	if err != nil {
+		return
+	}
+
+	currVarietyMap := make(map[int]*ChartVarietyMapping)
+	for _, v := range currVarietyMappingList {
+		currVarietyMap[v.ChartVarietyId] = v
+	}
+
+	// 待添加的品种列表
+	addVarietyMappingList := make([]*ChartVarietyMapping, 0)
+
+	for i := range chartVarietyMappingList {
+		_, ok := currVarietyMap[i]
+		if !ok {
+			// 如果不存在,那么就添加
+			chartVarietyMappingList[i].ChartInfoId = chartInfo.ChartInfoId
+			addVarietyMappingList = append(addVarietyMappingList, chartVarietyMappingList[i])
+		} else {
+			// 如果存在那么就移除
+			delete(currVarietyMap, i)
+		}
+	}
+
+	// 添加品种
+	if len(addVarietyMappingList) > 0 {
+		_, err = to.InsertMulti(len(addVarietyMappingList), addVarietyMappingList)
+		if err != nil {
+			return
+		}
+	}
+
+	// 删除不存在的品种
+	if len(currVarietyMap) > 0 {
+		idStrList := make([]string, 0)
+		for id, _ := range currVarietyMap {
+			idStrList = append(idStrList, fmt.Sprint(id))
+		}
+		removeIdStr := strings.Join(idStrList, `,`)
+		sql = fmt.Sprintf(` DELETE FROM chart_variety_mapping WHERE id in (%s) `, removeIdStr)
+		_, err = o.Raw(sql).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	// 跨品种分析图表配置
+	_, err = to.Update(chartInfoCrossVariety, chartInfoCrossVarietyUpdateCols...)
+
+	return
+}

+ 13 - 0
models/data_manage/cross_variety/chart_variety_mapping.go

@@ -0,0 +1,13 @@
+package cross_variety
+
+import "time"
+
+// ChartVarietyMapping
+// @Description: 图表与品种的关系表
+type ChartVarietyMapping struct {
+	Id             int       `orm:"column(id);pk"`
+	ChartInfoId    int       `description:"图表id"`
+	ChartVarietyId int       `description:"品种id"`
+	ModifyTime     time.Time `description:"修改时间"`
+	CreateTime     time.Time `description:"创建时间"`
+}

+ 31 - 0
models/data_manage/cross_variety/request/chart.go

@@ -17,3 +17,34 @@ type ChartConfigDate struct {
 	DateType int `description:"日期类型,,1:最新日期;2:N天前"`
 	Num      int
 }
+
+// AddChartReq
+// @Description: 添加图表的请求
+type AddChartReq struct {
+	ChartName      string            `description:"图表名称"`
+	LeftMin        string            `description:"图表左侧最小值"`
+	LeftMax        string            `description:"图表左侧最大值"`
+	ChartImage     string            `description:"图表截图,复制的时候才用到" json:"-"`
+	TagX           int               `description:"X轴的标签ID"`
+	TagY           int               `description:"Y轴的标签ID"`
+	CalculateValue int               `description:"计算窗口"`
+	CalculateUnit  string            `description:"计算频度"`
+	DateConfigList []ChartConfigDate `description:"日期配置列表"`
+	VarietyList    []int
+}
+
+// EditChartReq
+// @Description: 编辑图表的请求
+type EditChartReq struct {
+	ChartInfoId    int               `description:"图表id"`
+	ChartName      string            `description:"图表名称"`
+	LeftMin        string            `description:"图表左侧最小值"`
+	LeftMax        string            `description:"图表左侧最大值"`
+	ChartImage     string            `description:"图表截图,复制的时候才用到" json:"-"`
+	TagX           int               `description:"X轴的标签ID"`
+	TagY           int               `description:"Y轴的标签ID"`
+	CalculateValue int               `description:"计算窗口"`
+	CalculateUnit  string            `description:"计算频度"`
+	DateConfigList []ChartConfigDate `description:"日期配置列表"`
+	VarietyList    []int
+}

+ 5 - 3
models/db.go

@@ -464,8 +464,10 @@ func initSmartReport() {
 // initCrossVariety 跨品种分析
 func initCrossVariety() {
 	orm.RegisterModel(
-		new(cross_variety.ChartVariety),    // 品种表
-		new(cross_variety.ChartTag),        // 标签表
-		new(cross_variety.ChartTagVariety), // 标签、品种、指标关系表
+		new(cross_variety.ChartVariety),          // 品种表
+		new(cross_variety.ChartTag),              // 标签表
+		new(cross_variety.ChartTagVariety),       // 标签、品种、指标关系表
+		new(cross_variety.ChartVarietyMapping),   // 图表与品种的关系表
+		new(cross_variety.ChartInfoCrossVariety), // 跨品种分析配置表
 	)
 }

+ 18 - 0
routers/commentsRouter.go

@@ -178,6 +178,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/chart_info/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/chart_info/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"],
         beego.ControllerComments{
             Method: "List",

+ 376 - 0
services/data/cross_variety/chart.go

@@ -5,10 +5,13 @@ import (
 	"eta/eta_api/models/data_manage"
 	cross_varietyModel "eta/eta_api/models/data_manage/cross_variety"
 	"eta/eta_api/models/data_manage/cross_variety/request"
+	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -397,3 +400,376 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*da
 
 	return
 }
+
+// AddChartInfo 添加图表
+func AddChartInfo(req request.AddChartReq, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartName == "" {
+		errMsg = "请填写图表名称!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.TagX <= 0 {
+		errMsg = "请选择X轴坐标的标签!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.TagY <= 0 {
+		errMsg = "请选择Y轴坐标的标签!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.CalculateValue <= 0 {
+		errMsg = "请设置时间长度!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.CalculateUnit == `` {
+		errMsg = "请设置时间频度!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	// 品种配置
+	if len(req.VarietyList) < 0 {
+		errMsg = "请选择品种!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	// 日期配置
+	dateConfigList := len(req.DateConfigList)
+	if dateConfigList < 0 {
+		errMsg = "请选择日期!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if dateConfigList > 5 {
+		errMsg = "日期数量已达上限!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	chartClassify, err := data_manage.GetCrossVarietyChartClassifyBySysUserId(sysUser.AdminId)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			errMsg = "获取分类信息失败"
+			err = errors.New("获取分类信息失败,Err:" + err.Error())
+			return
+		}
+
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		chartClassify = &data_manage.ChartClassify{
+			ChartClassifyId:   0,
+			ChartClassifyName: sysUser.RealName,
+			ParentId:          0,
+			HasData:           0,
+			CreateTime:        time.Now(),
+			ModifyTime:        time.Now(),
+			SysUserId:         sysUser.AdminId,
+			SysUserRealName:   sysUser.RealName,
+			Level:             1,
+			UniqueCode:        utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+			Sort:              0,
+			Source:            source,
+		}
+	}
+
+	var chartInfoId int
+	// 判断图表是否存在
+	var condition string
+	var pars []interface{}
+	condition += " AND chart_name=? AND source = ? "
+	pars = append(pars, req.ChartName, source)
+	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断图表名称是否存在失败"
+		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "图表已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	chartInfo = new(data_manage.ChartInfo)
+	chartInfo.ChartName = req.ChartName
+	//chartInfo.EdbInfoIds = edbInfoIdStr
+	//chartInfo.ChartClassifyId = req.ChartClassifyId
+	chartInfo.SysUserId = sysUser.AdminId
+	chartInfo.SysUserRealName = sysUser.RealName
+	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)
+	chartInfo.ChartType = 9 // 相关性图
+	chartInfo.Calendar = "公历"
+	chartInfo.DateType = 6
+	//chartInfo.StartDate = req.StartDate
+	//chartInfo.EndDate = req.EndDate
+	//chartInfo.SeasonStartDate = req.StartDate
+	//chartInfo.SeasonEndDate = req.EndDate
+	chartInfo.LeftMin = req.LeftMin
+	chartInfo.LeftMax = req.LeftMax
+	//chartInfo.RightMin = req.RightMin
+	//chartInfo.RightMax = req.RightMax
+	//chartInfo.Disabled = disableVal
+	chartInfo.Source = source
+
+	// 图表品种
+	chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)
+	for _, varietyId := range req.VarietyList {
+		chartVarietyMappingList = append(chartVarietyMappingList, &cross_varietyModel.ChartVarietyMapping{
+			Id:             0,
+			ChartInfoId:    0,
+			ChartVarietyId: varietyId,
+			ModifyTime:     time.Now(),
+			CreateTime:     time.Now(),
+		})
+	}
+
+	// 图表配置
+	chartInfoCrossVariety := &cross_varietyModel.ChartInfoCrossVariety{
+		Id:             0,
+		ChartInfoId:    0,
+		ChartXTagId:    req.TagX,
+		ChartYTagId:    req.TagY,
+		CalculateValue: req.CalculateValue,
+		CalculateUnit:  req.CalculateUnit,
+		ModifyTime:     time.Now(),
+		CreateTime:     time.Now(),
+	}
+
+	// 新增图表和指标mapping
+	chartInfoId, e := cross_varietyModel.CreateChart(chartInfo, chartClassify, chartVarietyMappingList, chartInfoCrossVariety)
+	if e != nil {
+		errMsg = "操作失败"
+		err = errors.New("新增相关性图表失败, Err: " + e.Error())
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartInfoId)
+
+	return
+}
+
+// EditChartInfo 编辑图表
+func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "图表已被删除,请刷新页面"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		errMsg = "获取图表信息失败"
+		err = errors.New("获取图表信息失败,Err:" + err.Error())
+		return
+	}
+
+	if chartItem.Source != utils.CHART_SOURCE_CROSS_HEDGING {
+		errMsg = "该图不是跨品种分析图表!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartName == "" {
+		errMsg = "请填写图表名称!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.TagX <= 0 {
+		errMsg = "请选择X轴坐标的标签!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.TagY <= 0 {
+		errMsg = "请选择Y轴坐标的标签!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.CalculateValue <= 0 {
+		errMsg = "请设置时间长度!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.CalculateUnit == `` {
+		errMsg = "请设置时间频度!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	// 品种配置
+	if len(req.VarietyList) < 0 {
+		errMsg = "请选择品种!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	// 日期配置
+	dateConfigList := len(req.DateConfigList)
+	if dateConfigList < 0 {
+		errMsg = "请选择日期!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if dateConfigList > 5 {
+		errMsg = "日期数量已达上限!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	// 图表操作权限
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	if !ok {
+		errMsg = "没有该图表的操作权限"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	//判断图表是否存在
+	var condition string
+	var pars []interface{}
+	condition += " AND chart_info_id <> ? "
+	pars = append(pars, req.ChartInfoId)
+	condition += " AND chart_name=? AND source = ? "
+	pars = append(pars, req.ChartName, chartItem.Source)
+	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断图表名称是否存在失败"
+		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+		return
+	}
+	if count > 0 {
+		errMsg = "图表已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	chartItem.ChartName = req.ChartName
+	chartItem.ModifyTime = time.Now()
+	chartUpdateCols := []string{"ChartName", "ModifyTime"}
+
+	// 跨品种分析配置
+	chartInfoCrossVariety, err := cross_varietyModel.GetChartInfoCrossVarietyByChartInfoId(chartItem.ChartInfoId)
+	if err != nil {
+		return
+	}
+	chartInfoCrossVariety.ChartXTagId = req.TagX
+	chartInfoCrossVariety.ChartYTagId = req.TagY
+	chartInfoCrossVariety.CalculateValue = req.CalculateValue
+	chartInfoCrossVariety.CalculateUnit = req.CalculateUnit
+	chartInfoCrossVariety.ModifyTime = time.Now()
+	chartInfoCrossVarietyUpdateCols := []string{"ChartXTagId", "ChartYTagId", "CalculateValue", "CalculateUnit", "ModifyTime"}
+
+	// 图表品种
+	chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)
+	for _, varietyId := range req.VarietyList {
+		chartVarietyMappingList = append(chartVarietyMappingList, &cross_varietyModel.ChartVarietyMapping{
+			Id:             0,
+			ChartInfoId:    0,
+			ChartVarietyId: varietyId,
+			ModifyTime:     time.Now(),
+			CreateTime:     time.Now(),
+		})
+	}
+
+	err = cross_varietyModel.EditChart(chartItem, chartVarietyMappingList, chartInfoCrossVariety,
+		chartUpdateCols, chartInfoCrossVarietyUpdateCols)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+
+	resp := new(data_manage.AddChartInfoResp)
+	resp.ChartInfoId = chartItem.ChartInfoId
+	resp.UniqueCode = chartItem.UniqueCode
+	//resp.ChartType = req.ChartType
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	return
+}
+
+// CopyChartInfo 复制图表
+//func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+//	configSource := 2
+//	isSendEmail = true
+//	// 获取相关性图的配置
+//	multipleGraphConfigChartMapping, err := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(configId, configSource)
+//	if err != nil {
+//		return
+//	}
+//	multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(configId)
+//	if err != nil {
+//		return
+//	}
+//	multipleGraphConfig.MultipleGraphConfigId = 0
+//	err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
+//	if err != nil {
+//		return
+//	}
+//
+//	// 添加图
+//	addChartReq := data_manage.AddChartInfoReq{
+//		ChartClassifyId:      classifyId,
+//		ChartName:            chartName,
+//		ChartType:            utils.CHART_TYPE_CURVE,
+//		Calendar:             "公历",
+//		CorrelationChartInfo: correlationChartInfoReq,
+//	}
+//	chartSource := utils.CHART_SOURCE_CORRELATION // 默认是相关性图
+//	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser)
+//	if err != nil {
+//		return
+//	}
+//
+//	// 添加关系
+//	multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
+//		//Id:                    0,
+//		MultipleGraphConfigId: multipleGraphConfig.MultipleGraphConfigId,
+//		ChartInfoId:           chartInfo.ChartInfoId,
+//		Source:                configSource,
+//		ModifyTime:            time.Now(),
+//		CreateTime:            time.Now(),
+//	}
+//	err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
+//	if err != nil {
+//		return
+//	}
+//
+//	//添加es数据
+//	go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
+//
+//	return
+//}